如果把 class Inner {} 改成 static class Inner {},下面就只需要 super() 而不需要 wi.super() 了。
假设把 WithInner 改一下
class WithInner {
final int value;
public WithInner(int value) {
this.value = value;
}
public class Inner {
public int getValue() {
return value;
}
}
}
class InheritInner extends WithInner.Inner {
public InheritInner(WithInner wi, WithInner wi2) {
wi2.super();
}
}
调用的地方也改下
public static void main(String[] args) {
WithInner wi = new WithInner(12);
WithInner wi2 = new WithInner(14);
InheritInner ii = new InheritInner(wi, wi2);
System.out.println(ii.getValue());
}
Java 的内部类有 static 和非 static 之分。如果是非 static 的,它与外部内的实例绑定。
如果把
class Inner {}
改成static class Inner {}
,下面就只需要super()
而不需要wi.super()
了。假设把
WithInner
改一下这里
WithInner.Inner
有一个getValue()
方法,它实际是返回的WithInner
实例的value
。那么InheritInner
构造的时候谨必须指定WithInner
对象,这样才知道当前InheritInner
是从哪个WithInner
实例的Inner
继承的,当然调用父类构造的时候也就需要指定是其父类来自哪个WithInner
对象。如果再把
InheritInner
改一下调用的地方也改下
你猜会输出什么?
当然是
14
,传入的wi
没用到。也许你想把
wi.super()
和wi2.super()
都调用了会怎么样……对不起,在调用第2个.super()
的时候,会出现编译错误,因为.super()
必须是构造函数中的第 1 句。