嵌套在类中的接口可以是非静态的吗?


问题内容

我正在在线阅读有关Java中嵌套接口的一些文章[1] [2],我知道

interface A {
    ...
    interface B { // this is static by default
        ...
    }
}

但是我不确定

class C {
    ...
    interface D { // Is this static by default? Why?
        ...
    }
}

简而言之,“嵌套接口始终是静态的”是真的吗?

[1] https://beginnersbook.com/2016/03/nested-or-inner-interfaces-in-
java/

[2] https://www.programcreek.com/2013/08/inner-interface-in- Java
/


问题答案:

非静态内部类仅仅是语法糖。非静态内部类与标准“外部”类完全相同,但有一个例外:它具有一个外部类类型的不可见字段,该字段已声明final。内部类的所有构造函数都必须将要设置此字段的外部实例作为第一个参数..然后,遍历了所有语法糖袋以隐藏它们。

但这确实是这样,您可以使用javap进行确认。因此,鉴于:

public class Outer { public class Inner {} }

与:

public class Outer {}
class Desugared {
    private final Outer outer;
    public Desugared(Outer outer) { this.outer = outer; }
}

除了语法,这些内容相同:

Outer o = new Outer();
o.new Outer.Inner();

是相同的:

Outer o = new Outer();
new Desugared(o);

等。

事情是这样的:接口 没有field

鉴于他们没有, 他们不可能有这个隐藏的领域
。因此,它们不能是“非静态的”。因此,它们是隐式的“静态”(它们没有隐式可用的外部类实例),并且您不能更改它。