【问题标题】:java: extends a inner classjava:扩展一个内部类
【发布时间】:2020-04-02 15:27:15
【问题描述】:

jdk 版本:1.8.0_241

有一个类扩展了一个内部类。代码如下:

class WithInner {
    class Inner {

    }
}

public class ExtendInnerClass extends WithInner.Inner {
    ExtendInnerClass(WithInner withInner) {
        withInner.super(); 
    }
}

要连接WithInner 类的对象和Inner 类的对象,我们必须使用super() 方法。 但是当我反编译类文件时,我发现了一些有趣的东西。

public class ExtendInnerClass extends Inner {
    ExtendInnerClass(WithInner withInner) {
        withInner.getClass();
        super(withInner);
    }
}

我发现编译器不仅使用 super() 方法,还使用 ​​withInner.getClass()

他为什么这样做?

【问题讨论】:

  • 确保类 WithInner 已加载?
  • 检查withInner 不是null。如果 withInnernull,则此语句将引发 NullPointerException。

标签: java inner-classes


【解决方案1】:

内部类对象通常需要持有对其外部类对象的引用。

在没有getClass()的情况下,内部类在外部类之前加载,不符合jvm的原理,所以在jvm中使用getclass()在内部类之前加载外部类。

【讨论】:

    猜你喜欢
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    相关资源
    最近更新 更多