1.接口内部的类:接口不能实例化,内部接口就需要定义成静态的。内部类接口不管有没有声明static,都是静态的。类里面包含两部分:一部分是固定的,另一部分是可变的,而这个可变的部分就变成了接口。
class B3 { interface A { String a(); } } public class Test19 { public static void main(String[] args) { B3.A a1 = new B3.A() { @Override public String a() { return "a()"; } }; System.out.println(a1.a()); } }
2.从多层嵌套类中访问外部类的成员:一个内部类被嵌套多少层并不重要,它能透明的访问所有它所嵌入的外部类的所有成员。如果有多个外部类具有同名同参的方法,则会调用最里层的方法,如果想调用上一层方法则必须要指定他的类名.this.方法名。".new"语法可以不必在调用构造器是限定类名。
class A { private void a() { } class B { private void b() { } public class C { void c() { b(); a(); } } } } public class Test20 { public static void main(String[] args) { A a1 = new A(); A.B ab = a1.new B(); A.B.C abc = ab.new C(); abc.c(); } }
3.为什么需要内部类:内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外部类的对象。每个内部类都可以独立于实现进行继承,因此外部类是否已经继承了实现并不重要。 内部类的特性:内部类可以有多个实例,每个实例都有自己的状态信息,并且独立于其外部类对象的信息;在单个外部类中,可以让多个内部类以不同的方式实现相同的接口,或从相同的类继承;创建内部类对象的时刻并不依赖于外围类对象的创建。
interface A4 { } interface B4 { } class C4 implements A4, B4 { } class D4 implements A4 { B4 b4() { return new B4() { }; } } public class Test21 { static void testA(A4 a) { } static void testB(B4 b) { } public static void main(String[] args) { C4 c = new C4(); D4 d = new D4(); testA(c); testA(d); testB(c); testB(d.b4()); } }