H5W3
当前位置:H5W3 > 其他技术问题 > 正文

java内部类问题

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

回答:

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 句。

本文地址:H5W3 » java内部类问题

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址