Java SE 是什么,包括哪些内容(二十)?
本文内容参考自Java8标准
再次感谢Java编程思想对本文的启发!
在前面的博文中谈到,如果不是static修饰的内部类,那么必须先创建外部类的对象,才能创建内部类的对象,所以我们知道,内部类的构造器必须连接到指向其外部类对象的引用,所以,如果你需要继承内部类,事情会变得有点复杂。
主要的问题在于,那个指向外部类的对象的引用必须被初始化,否则你无法创建内部类对象,也就无法创建继承自内部类的子类的对象(因为在内部类的子类中不再存在可连接的默认的对象,也就是说,内部类的子类不会自动持有一个指向这个内部类的外部类的对象的引用)。
要解决内部类的继承问题,必须使用特殊的语法来明确说清它们之间的关联。
代码示例:
// 内部类的继承
//类WithInner
class WithInner{
//内部类Inner
class Inner{}
}
//类InheritInner继承内部类Inner(注意,Inner的表示必须为WithInner.Inner)
public class InheritInner extends WithInner.Inner{
//在这里必须这么写,默认的构造器没用.
//构造器中传入一个所继承的内部类的外部类对象.
InheritInner(WithInner wi){
//必须这么写,固定句式(wi.super())。
wi.super();
}
//程序执行入口main方法
public static void main(String[] args){
//创建所继承的内部类的外部类对象.
WithInner wi = new WithInner();
//将这个外部类的对象作为实际参数传入,创建内部类的子类对象
InheritInner ii = new InheritInner(wi);
}
}
如果不使用固定句式,则会报错:
必须要显式地传入外部类的对象。
在上面的代码示例中可以看到,类InheritInner只继承自内部类,而不是外部类,但是当要生成一个构造方法时,默认的构造方法没用,你必须要传递一个外部类的对象(而不仅仅是一个指向外部类对象的引用,或者说,必须传递一个关联了实际外部类对象的引用)。
此外,必须在内部类的子类构造方法中使用如下语法:
enclosingClassReference.super();
这样才提供了必要的引用,这样程序才能通过编译。
PS:无论在何种情况下,要创建与内部类相关的内容都必须持有一个外部类对象的引用。
PS:时间有限,有关Java SE的内容会持续更新!今天就先写这么多,如果有疑问或者有兴趣,可以加QQ:2649160693,并注明CSDN,我会就博文中有疑义的问题做出解答。同时希望博文中不正确的地方各位加以指正。