设为首页 加入收藏

TOP

Java内部类总结(四)
2015-07-16 12:55:23 来源: 作者: 【 】 浏览:3
Tags:Java 部类 总结
g2 {
? ? ? public class Yolk extends Egg2.Yolk {
? ? ? ? ? ? ? public Yolk() {
? ? ? ? ? ? ? ? ? ? System.out.println("BigEgg2.Yolk()");
? ? ? ? ? ? ? }
?
? ? ? ? ? ? ? public void f() {
? ? ? ? ? ? ? ? ? ? System.out.println("BigEgg2.Yolk.f()");
? ? ? ? ? ? ? }
? ? ? }
?
? ? ? public BigEgg2() {
? ? ? ? ? ? ? insertYolk(new Yolk());
? ? ? }
?
? ? ? public static void main(String[] args) {
? ? ? ? ? ? ? Egg2 e2 = new BigEgg2();
? ? ? ? ? ? ? e2.g();
? ? ? }
}
?
输出结果为:
Egg2.Yolk()
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
BigEgg2.Yolk.f()
?
现在BigEgg2.Yolk 通过extends Egg2.Yolk 明确地继承了此内部类,并且重载了其中的方法。Egg2 的insertYolk()方法使得BigEgg2 将它自己的Yolk 对象向上转型,然后传递给引用y。所以当g()调用y.f()时,重载后的新版的f()被执行。第二次调用Egg2.Yolk()是BigEgg2.Yolk 的构造器调用了其基类的构造器。可以看到在调用g()的时候,新版的f()被调用了。
?
?
?
?
?
?
?
?
内部类的继承问题(thinking in java 3th p294)
因为内部类的构造器要用到其外围类对象的引用,所以在你继承一个内部类的时候,事情变得有点复杂。问题在于,那个“秘密的”外围类对象的引用必须被初始化,而在被继承的类中并不存在要联接的缺省对象。要解决这个问题,需使用专门的语法来明确说清它们之间的关联:
class WithInner {
? ? ? ? class Inner {
? ? ? ? ? ? ? ? Inner(){
? ? ? ? ? ? ? ? ? ? ? ? System.out.println("this is a constructor in WithInner.Inner");
? ? ? ? ? ? ? ? };
? ? ? ? }
}
?
public class InheritInner extends WithInner.Inner {
? ? ? ? // ! InheritInner() {} // Won't compile
? ? ? ? InheritInner(WithInner wi) {
? ? ? ? ? ? ? ? wi.super();
? ? ? ? ? ? ? ? System.out.println("this is a constructor in InheritInner");
? ? ? ? }
?
? ? ? ? public static void main(String[] args) {
? ? ? ? ? ? ? ? WithInner wi = new WithInner();
? ? ? ? ? ? ? ? InheritInner ii = new InheritInner(wi);
? ? ? ? }
}
?
输出结果为:
this is a constructor in WithInner.Inner
this is a constructor in InheritInner
?
可以看到,InheritInner 只继承自内部类,而不是外围类。但是当要生成一个构造器时,缺省的构造器并不算好,而且你不能只是传递一个指向外围类对象的引用。此外,你必须在构造器内使用如下语法:
enclosingClassReference.super();
这样才提供了必要的引用,然后程序才能编译通过。


首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇深入理解和探究Java类加载机制 下一篇关于Java内部类的“内部”

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: