Java内部和嵌套类

Mik*_*ike 11 java class

我已经开始准备自己参加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;
    }
}
Run Code Online (Sandbox Code Playgroud)

你能告诉我,为什么我们可以访问Outer1.InnerInterface.x,并Outer2.NestedInterface.x以同样的方式?内部接口默认是静态的?我正试图建立一些联系,以使它们更清晰.

Jos*_*ica 11

来自Oracle的Java教程:

嵌套类是其封闭类的成员.非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有.静态嵌套类无权访问封闭类的其他成员.作为OuterClass的成员,可以将嵌套类声明为private,public,protected或package private.(回想一下,外部类只能声明为public或package private.)

接口无法实例化.因此,它们只有静态才有意义.将嵌套接口声明为静态是多余的.

此外,练习使用令人困惑的接口名称.
这两个InnerClass和NestedClass嵌套类.但只是InnerClass一个内部类,因为"内部类"意味着"非静态嵌套类".
类似地,人们可能期望InnerInterface是"内部接口",意思是"非静态嵌套接口"; 但这样的事情不存在.这两个InnerInterface和NestedInterface嵌套接口,其中没有一个是内部接口.


rge*_*man 7

是的,嵌套接口是隐式的static. JLS第8.5.1节规定:

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

正因为如此,您可以访问x通过嵌套的接口以同样的方式,通过外部类Outer1和Outer2-两个嵌套的接口,InnerInterface并且NestedInterface是static.