为何需要内部类:
java中不能多继承。(虽然接口可以多继承),但是抽象类,具体类类还是无法多继承的。内部类类似于组合方式解决这个。
但是通过使用内部类可以实现。
成员内部类(和方法同级别) | 内部类可以访问外部类的所有方法和属性(内部类对象会秘密的捕获一个外围类的引用由编译器完成),外部类的非静态方法使用内部类和普通类一样,一般会有指向内部类的引用,其他方法需要用outclass.innerclass 来指明使用 | 外部的方法可以直接new inner();(main方法是游离于类之外的。) | 内部类中生成外部类的对象的引用, outclassname.this;外部内的对象可以用outclassobject.new innerclassname(); 创建内部对象。 |
---|---|---|---|
局部内部类(在方法内部的类) | 和普通类没有什么区别,但是作用域只在局部作用域可用,多为辅助类,当前用一下而已 | ||
匿名内部类 | 匿名内部类是不能加访问修饰符的。要注意的是,new 匿名类,这个类是要先定义的 new classname(){},实际上创建的是继承类, | 当所在的方法的形参需要被内部类里面使用时,该形参必须为final。 | |
嵌套类 | 内部类和外围类之间没有联系,可以多层嵌套,拥有所有外围类的权限 | 创建内部类不需要外围类对象 |
成员内部类:
内部类可以访问外部内的
匿名内部类:return new Contents(){插入类的定义};
这个插入的类一定继承(或者实现)Contents.
public class Parcel7 {
public Contents contents() {
return new Contents() { // Insert a class definition
private int i = 11;
public int value() { return i; }
}; // }表示匿名内部类结束,;表示这个语句的结束
}
public static void main(String[] args) {
Parcel7 p = new Parcel7();
Contents c = p.contents();
}
} ///:~
public class Parcel7b {
class MyContents implements Contents {
private int i = 11;
public int value() { return i; }
}
public Contents contents() { return new MyContents(); }
public static void main(String[] args) {
Parcel7b p = new Parcel7b();
Contents c = p.contents();
}
} ///:~