- 如果要从外部类的成员方法之外访问内部类,需要用outer.inner的方式引用。
- 内部类引用自己的方式是this,引用外部类的方式是outer.this。
- 内部类可以引用外部类的成员,要引用其他外部对象的时候,此对象必须是final的。
- 可以用.new来让某个外部类对象去创建其内部类对象。如:Outer.Inner inner = outer.new Inner();,不能跳过外部类对象直接创建内部类对象。
- 匿名内部类:
public class A {
private class AA { }
public AA getAA() {
// 创建一个匿名内部类,此类继承AA
return new AA() {
private int ii = 0;
};
}
}
- 匿名内部类想要有构造函数的话,可以把代码放在构造代码块。
- 内部类(Inner Class):在方法作用域或类作用域中的类,可以定义在任何作用域中。若为匿名的,则为匿名内部类。
- 嵌套类(Nested Class):即static的内部类,嵌套类不能访问外围类的对象。
- 内部类与嵌套类的区别:内部类的保留了外围类的引用,可以访问外围类的对象。嵌套类则相反。
- 嵌套类不保留外围类的引用,所以不能用outer.inner的方式引用,也不能用使用.new的方式创建。
- 在接口中的类也是嵌套类,尽管没有static修饰(自动static)。
- java不能多重继承,只能单继承,但是可以其他要继承的类作为Java的内部类来间接实现。
- 继承别的外围类的内部类:
class WithInner {
class Inner {}
}
// 继承外围类的内部类
public class InheritInner extends WithInner.Inner {
InheritInner(WithInner wi) {
wi.super();
}
}
- 局部内部类(方法内)与匿名内部类的区别是:
- 局部内部类有名字能创建多个对象。
- 局部内部类有名字能有多个构造器。
- 匿名内部类只能用构造代码块来构造。
public class A {
Counter getCounter(final String name) {
// 局部内部类可以使用构造器来构造
class LocalCounter implements Counter {
private LocalCounter() {
System.out.print("LocalCounter()");
}
}
return new LocalCounter();
}
Counter getCounter2(final String name) {
// 匿名内部类只能用构造代码块构造
return new Counter() {
{
System.out.print("Counter()");
}
};
}
}
网友评论