正文之前
日子好生无聊, 妹子也不找我. 看小说感觉太堕落了. 但是还不想开始看数据挖掘和机器学习, 所以还是看会 Java, 然后整会 Python 吧
正文
第一点: 内部类的定义
如下图所见, 把一个类的定义放在另一个类的定义中, 这就是内部类, 相当于是 Swift 和 Python 中的闭包概念.
我是淫荡的分割线!~ mmp 这话从哪儿学来的来着?
第二点: 内部类的使用
1, 一般情况下, 为安全起见. 我们都会在外部类内部定义一个返回内部类对象的方法, 这样既起到了保护作用, 又可以顺利地返回一个内部类对象.
import java.util. * ;
public class TestDog {
class Dog {
Dog() {
setAge(2);
setSex("Male");
}
Dog(int a, String s) {
setAge(a);
setSex(s);
}
private int age;
private String sex;
public void setAge(int a) {
age = a;
}
public void setSex(String s) {
sex = s;
}
public void show() {
System.out.println("The" + sex + "Dog is" + age + "years old;");
}
}
public Dog setDog() {
return new Dog();
}
public static void main(String[] args) {
TestDog t = new TestDog();
// t.setSex("Female");
// t.setAge(3);
TestDog.Dog dog = t.setDog();
dog.show();
}
}
2, 如果要独立于外部类而使用内部类的话, 需要将其定义为静态的类型, 否则会报错:
/Users/zhangzhaobo/program/java/TestDog.java:32: 错误: 无法从静态上下文中引用非静态 变量 this
TestDog dog1=new Dog();
^
1 个错误
[Finished in 1.2s with exit code 1]
[shell_cmd: javac "/Users/zhangzhaobo/program/java/TestDog.java" && java "TestDog"]
[dir: /Users/zhangzhaobo/program/java]
[path: /Library/Frameworks/Python.framework/Versions/3.5/bin:/usr/local/mysql/bin/:"./Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/bin"]
如果定义为静态的, 那就可以引用, 引用方式如图:
import java.util. * ;
public class TestDog {
public static class Dog {
Dog() {
setAge(2);
setSex("Male");
}
Dog(int a, String s) {
setAge(a);
setSex(s);
}
private int age;
private String sex;
public void setAge(int a) {
age = a;
}
public void setSex(String s) {
sex = s;
}
public void show() {
System.out.println("The" + sex + "Dog is" + age + "years old;");
}
}
public static void main(String[] args) {
TestDog.Dog dog = new TestDog.Dog();
dog.show();
}
}
The Result: The Male Dog is 2 years old; [Finished in 1.4s]
3, 在后面居然还有另外一种搞法. 使用. new 来创建新的内部类对象. 不过图中也说了, 必须是基于外部类的对象来创建内部类的对象. 否则就只能用静态内部类
import java.util. * ;
public class TestDog {
public class Dog {
Dog() {
setAge(2);
setSex("Male");
}
Dog(int a, String s) {
setAge(a);
setSex(s);
}
private int age;
private String sex;
public void setAge(int a) {
age = a;
}
public void setSex(String s) {
sex = s;
}
public void show() {
System.out.println("The" + sex + "Dog is" + age + "years old;");
}
}
public Dog setDog() {
return new Dog();
}
public static void main(String[] args) {
TestDog t = new TestDog();
// t.setSex("Female");
// t.setAge(3);
TestDog.Dog dog = t.new Dog();
// TestDog.Dog dog=t.setDog();
dog.show();
}
}
The Result: The Male Dog is 2 years old; [Finished in 1.6s]
我是淫荡的分割线!~ mmp 这话从哪儿学来的来着?
第三点: 内部类连接外部类
在我们定义外部类对象的时候, 就已经默认定义了一个内部类的对象. 当我们需要用内部类对象的时候直接从外部类的对象引用即可. 当然就像你应该看到的, 在内部类是非静态类的时候才能这么干. 具体的原因请看上面的图中解释.
第四点: 匿名内部类
我个人是感觉这玩意没啥用的, 所以不多讲了, 有高见的麻烦评论, 我觉得我可能与这玩意无缘了.
效果近似与下面的:
第五点: 终于感觉有用了
没错呀, 直接用来做测试接口. 在一个类里面嵌套一个内部类, 内部类可以定义 main 函数, 测试的时候直接拿来用就 ok. 不需要再在真正的 main 中来回跳. 而且内部类可以无限制访问外部类的内容, 更加有利于发现错漏. 当然, 跟实际使用还是有点差别的. 比如. this 比如访问控制等. 不过那都不是事!
来自官方解释的用处:
实现类似多个父类的多重继承
正文之后
溜了溜了!! 妹子突然打电话给我了. 我得好好把握....mmp 今天吓一跳!!
来源: http://www.jianshu.com/p/5e47605b057e