java内部类问题

直接看贴图,这个地方为啥要这样写?Thinking in Java上面的一段代码,212页。
图片描述

阅读 2.1k
1 个回答

Java 的内部类有 static 和非 static 之分。如果是非 static 的,它与外部内的实例绑定。

如果把 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;
        }
    }
}

这里 WithInner.Inner 有一个 getValue() 方法,它实际是返回的 WithInner 实例的 value。那么 InheritInner 构造的时候谨必须指定 WithInner 对象,这样才知道当前 InheritInner 是从哪个 WithInner 实例的 Inner 继承的,当然调用父类构造的时候也就需要指定是其父类来自哪个 WithInner 对象。

如果再把 InheritInner 改一下

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());
    }

你猜会输出什么?

当然是 14,传入的 wi 没用到。

也许你想把 wi.super()wi2.super() 都调用了会怎么样……对不起,在调用第2个 .super() 的时候,会出现编译错误,因为 .super() 必须是构造函数中的第 1 句。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题