成员内部类可以继承其他的类,也可以被其它类继承,本文主要说明其它类继承成员内部类的问题。
本文要点如下:
1).成员内部类的子类可以是内部类,也可以不是内部类;
2).当成员内部类的子类不是内部类或子类虽是内部类但与其父类不在同一个外部类时,子类的构造方法第一句要显式添加如下的语句:
外部类对象引用.super(参数);
这里的外部类指父类所在的外部类;
3).编译器默认给成员内部类的构造方法传入一个参数,该参数是内部类所依附的外部类对象的引用;
注:本文涉及到的类都是非静态类。
内部类代码:
public class TestC {
public class TestE{}
}
本质就是:内部类创建实例的时候需要外部类的一个实例指针。
编译器编译时,是把外部类与成员内部类编译成两个独立的文件的;
但会给成员内部类默认添加一个类型为外部类对象引用的成员变量,并为构造方法默认传入一个类型为外部类对象引用的参数,并以该参数值来初始化该成员变量;
所以平时我们直接创建内部类实例的代码:
public static void main(String[] args) {
TestC testC = new TestC();
TestC.TestE testE = testC.new TestE();
}
如果我们想用一个外部类继承内部类:
public class TestD extends TestC.TestE {
public TestD(TestC testC){
testC.super();
}
}
1).子类不是内部类,所以编译器不会在其构造方法中传入其外部类的对象引用。
2).子类的构造方法也显式的添加了per.super();语句,原因同上。
2.子类和父类都是外部类,且子类是内部类且与父类位于不同的外部类:
public class TestC {
public class TestE{
}
}
public class TestF {
public class TestG extends TestC.TestE{
public TestG(TestC testC){
testC.super();
}
}
}
public class JavaTest {
public static void main(String[] args) {
TestC testC = new TestC();
TestF testF = new TestF();
TestF.TestG testG = testF.new TestG(testC);
}
}
与第一种情况不同的是,子类InnerClassChildDM中显式添加了per.super();
这是因为,子类与父类处于不同的外部类,编译时,子类的构造方法默认传入的是DustMan类的对象引用,而不是Person类的对象引用;
如果要调用父类的构造方法的话,必须要给它传入一个其外部类Person的对象引用;
所以这时,子类的构造方法显式传入一个Person类对象引用per,并通过per.super();的方式把per传给父类的构造方法并调用之。
成员内部类的非静态子类可以是与其位于同一个外部类的子类,也可以是位于不同外部类的子类,还可以是一般类。
后两种情况,必须在子类的构造方法中显式添加 父类的外部类的对象.super(参数); 这样一条语句,以保证为父类传入其外部类的对象引用,继而保证能调用父类的构造方法。
感觉写的好的文章: