Java内部类和嵌套类

11

我已经开始为OCJP7考试做准备了,我发现这一章似乎非常复杂。

假设我有以下代码:

class Outer1{
    interface InnerInterface{
        String x = "test";
    }
    class InnerClass{
        String x = "test";
    }
}
class Outer2{
    static interface NestedInterface{
        String x = "test";
    }
    static class NestedClass{
        String x = "test";
    }
}
class Main{
    public static void main(String [] args){
        String s1 = Outer1.InnerInterface.x;
        String s2 = new Outer1().new InnerClass().x;
        String s3 = Outer2.NestedInterface.x;
        String s4 = new Outer2.NestedClass().x;
    }
}

你能告诉我为什么我们可以以相同的方式访问 Outer1.InnerInterface.xOuter2.NestedInterface.x 吗?内部接口默认是静态的吗?我正在尝试建立一些联系来使它们更清晰。


可能是为什么在Java中使用静态内部接口?的重复问题。 - Sam Redway
4个回答

11

来自Oracle的Java教程:

嵌套类是其封闭类的成员。非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有。静态嵌套类无法访问封闭类的其他成员。作为OuterClass的成员,嵌套类可以声明为私有、公共、受保护或包私有。(回想一下,外部类只能声明为公共或包私有。)

接口不能被实例化。因此,它们只有作为静态时才有意义。将嵌套接口声明为静态是多余的。

此外,该练习使用了令人困惑的接口名称。
InnerClassNestedClass都是嵌套类。但只有InnerClass是内部类,因为“内部类”意味着“非静态嵌套类”。
同样地,人们可能期望InnerInterface是一个“内部接口”,意思是“非静态嵌套接口”;但这样的东西不存在。 InnerInterfaceNestedInterface都是嵌套接口,它们都不是内部接口。


不确定为什么您从Java教程中引用了此部分,因为它涉及类而非接口。该练习的命名不仅令人困惑,而且是错误的,因为不存在所谓的Inner Interface。唯一存在的嵌套接口类型是成员接口。https://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html - Erwin Bolwidt
问题的标题是“Java内部和嵌套类”。代码中提到了接口和类。我认为这个问题涉及到嵌套/内部类和嵌套/内部接口。以及它们之间的区别。除了一般情况下类和接口之间的区别之外,内部类确实存在而内部接口不存在,正如您在评论中所说,我在我的答案中也是这样表述的。 - Anonymous Coward

7

是的,嵌套接口是隐式静态的。JLS第8.5.1节指出:

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

因此,您可以通过嵌套接口以与外部类Outer1Outer2相同的方式访问x - 两个嵌套接口InnerInterfaceNestedInterface都是static的。


3

你能告诉我为什么我们可以以相同的方式访问Outer1.InnerInterface.xOuter2.NestedInterface.x吗?

因为它们都是static字段。

根据Java语言规范第9章接口的9.3字段(常量)声明:

接口体中的每个字段声明都被隐式声明为publicstaticfinal


内部接口默认是静态的吗?

是的。

来自8.1.3 Inner Classes and Enclosing Instances

成员接口(§8.5)默认为static,因此它们从不被视为内部类。


是的,我知道接口中的字段是静态的,但我不知道在类中声明的接口也是静态的。我已经完成了这一章,但没有找到答案...谢谢。 - Mike

1
你是正确的。嵌套接口的关键字static是不必要且冗余的。嵌套接口始终是静态的。
从逻辑上讲,接口定义绑定到外部类的特定实例也没有意义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接