内部类的继承:
class Outer {
privateinta;
public Outer(int a) {
this.a = a;
}
class Inner {//内部类
public Inner() {
}
publicvoid print() {
System.out.println("a=" + a);
}
}
//内部继承
class InnerSub extends Inner {
}
}
publicclass Testman extends Outer.Inner {
// public Testman(){}//编译错误 java虚拟机无法决定让Testman实例引用哪个Outer实例。
// 通过传递Outer实例的引用然后在构造方法中调用super语句来建立外部类和内部类之间的关联关系
public Testman(Outer o) {
o.super();
}
publicstaticvoid main(String[] args) {
Outer o1 = new Outer(1);
Outer o2 = new Outer(2);
// in变量引用的inner实例会自动引用o1变量引用的实例。
Outer.Inner in = o1.new Inner();
in.print();
Testman t1 = new Testman(o1);
t1.print();// print 1
Testman t2 = new Testman(o2);
t2.print(); // print 2
}
}
在直接构造实例内部类的实例的时候 java虚拟机会自动使用内部类实例引用它的外部内实例。
子类和父类中的内部类同名的问题:
内部类并不存在覆盖的概念,假如子类和父类中存在同名的内部类,那么这个内部类也会分别在不同的名字空间中,因此不会发生冲突。Outers.Inner 和SubOuter.Inner类是独立的两个类。不存在覆盖关系。Java编译器不会检查子类中的Inner类是否缩小了父类中的Inner类的访问权限。
class Outers {
Inner in;
public Outers() {
in = new Inner();// 构造内部类实例
}
publicclass Inner { // public访问级别
public Inner() {
System.out.println("inner of Outer");
}
}
}
publicclass SubOuter extends Outers {
class Inner {
public Inner() {
System.out.println("inner of SubOuter");
}
}
publicstaticvoid main(String[] args) {
//执行 new SubOuter()会调用父类的构造方法
SubOuter.Inner subOuter= new SubOuter().new Inner();
Outers.Inner outer = new Outers().new Inner();
}
}