繁体   English   中英

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

[英]Can an interface nested inside a class be non-static?

我正在在线阅读有关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/

是的,您的“总之”永远是正确的。 直接从语言规范中引用:

成员接口是隐式静态的(第9.1.1节)。 允许成员接口的声明多余地指定static修饰符。

其中在不久之前定义 “成员接口”:

成员接口是一个接口,其声明直接包含在另一个类或接口声明的主体中(第8.1.6节,第9.1.4节)。

非静态内部类仅仅是语法糖。 非静态内部类与标准“外部”类完全相同,但有一个例外:它具有外部类类型的不可见字段,并声明为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

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

可能被实例化,接口不能被实例化。

含义:当您有一个内部类时 ,您可能想要或不希望使用“外部”对象创建该内部类的实例。

假设您有:

class X {
  ... class Y { 

那么someInstanceOfX.new Y()new XY()可能都有意义。

但是,当您有一个内部接口时,该接口的唯一用途是与其他implements CD类一起使用。 没有任何有意义的方法来访问CD ,这表明D不应该是静态的。

就像您的第二个链接说的那样:

由于无法实例化接口,因此仅当内部接口为静态接口时才有意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM