我是一个Java新手,在学习<Thinking in Java>之内部类的时候,碰到这么一个例程:
class WithInner{
class Inner{
}
}class InheritInner extends WithInner.Inner{
public InheritInner(WithInner wi){
wi.super();
}
public static void main(String[] args){
WithInner wi=new WithInner();
InheritInner ii=new InheritInner(wi);
}
}
里面的wi.super();到底是什么意思呢?我在其他贴里面也看见关于内部类的问题,但是对这个问题我感觉还是没得到自己想要的答案,请各位前辈不吝赐教。

解决方案 »

  1.   

    倒,怪不得人说 Thinking in Java 很烂,这样的代码都能写出来。
      

  2.   

    代码并没抄错啊,我记得 TIJ 上也是这么写(2年前看的)。内部类 如果不是 static class Inner 的话,
    初始化它需要一个 “包含 Inner的 WithInner 类” 的实例,
    Inner 与 WithInner 中时要保持一个关联才行
    (隐含引用关系 WithInner <-->Inner ),InheritInner 扩展了 WithInner.Inner 类, 这个InheritInner
    要初始化的话也要先调用父类的构造函数,那它能直接 super() 么?
    不能! 因为以前 
    WithInner wi = new WithInner();
    With.Inner inner = wi.new WithInner.Inner();
    这里提供了一个 wi 的引用才能构造一个 WithInner.Inner 实例。那现在 InheritInner 要初始化必须先初始化父类的状态,
    那是不是也要“为 WithInner.Inner 的构造函数提供一个 WithInner 句柄呢?"
    这个句柄怎么给呢? public InheritInner(WithInner wi){
      wi.super(); 
      // 这个能我是这样理解的: wi 是一个 WithInner 的句柄,但是他代表着一个 
      // WithInner <--> WithInner.Inner 隐含的句柄,用它就能初始化 WithInner.Inner.
      // wi.super() 代表着初始化 wi 相关联的 WithInner.Inner 这个父类。
    }
      

  3.   

    说thinking in java烂的人,最好就不要再学java了,这里wi.super()是继承WithInner的构造方法,然而WithInner调用的是JDK默认的构造方法,其实应该是这样,WithInner又继承Object类,所以调用的是Object类的默认构造方法。
      

  4.   

    对比: 
    WithInner wi = new WithInner();
    WithInner.Inner inner = wi.new WithInner.Inner();public InheritInner(WithInner wi){
       wi.super(); // 这跟 wi.new Inner() 不是一个模子里倒出来的?
      // 因为这里要先初始化父类(也就是 WithInner.Inner )的状态。
    }
      

  5.   

    humanity 说的很是;
    同时,个人觉得tij对于这些细节讲述的很细,唯一的遗憾就是我们在开发中往往不会使用这些。
      

  6.   

    一个概念要理解:
    子类的构造函数先必须调用父类的构造函数而内部类特殊性在于其构造函数要一个外部类的实例才能调用两个合在一起就是wi.super();
      

  7.   

    谢谢各位的解答,原理 humanity 和 interpb 说清楚了,我也明白了,那这个wi.super()我倒是可以这么理解了,它只是一个特定的语法,而这个语法要表答的意思就是这个原理了。