繁体   English   中英

Java内部和嵌套类

[英]Java inner and nested classes

我已经开始准备自己参加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吗? 内部接口默认是静态的? 我正试图建立一些联系,以使它们更清晰。

来自Oracle的Java教程

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

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

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

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

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

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

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

因为它们都是static场。

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

接口主体中的每个字段声明都是隐式的publicstaticfinal


内部接口默认是静态的?

是。

8.1.3内部类和封闭实例

成员接口(第8.5节)是隐式static因此它们从不被视为内部类。

你是对的。 嵌套接口的关键字static是不必要和冗余的。 嵌套接口始终是静态的。

从逻辑的角度来看,接口定义绑定到外部类的特定实例也没有意义。

暂无
暂无

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

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