[英]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.x
和Outer2.NestedInterface.x
吗? 内部接口默认是静态的? 我正试图建立一些联系,以使它们更清晰。
来自Oracle的Java教程 :
嵌套类是其封闭类的成员。 非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有。 静态嵌套类无权访问封闭类的其他成员。 作为OuterClass的成员,可以将嵌套类声明为private,public,protected或package private。 (回想一下,外部类只能声明为public或package private。)
接口无法实例化。 因此,它们只有静态才有意义。 将嵌套接口声明为静态是多余的。
此外,练习使用令人困惑的接口名称。
InnerClass
和NestedClass
都是嵌套类。 但是只有InnerClass
是一个内部类,因为“内部类”意味着“非静态嵌套类”。
类似地,人们可能期望InnerInterface
是一个“内部接口”,意思是“非静态嵌套接口”; 但这样的事情不存在。 InnerInterface
和NestedInterface
都是嵌套接口,它们都不是内部接口。
是的,嵌套接口是隐式static
。 JLS第8.5.1节规定:
成员接口是隐式
static
(第9.1.1节)。 允许声明成员接口冗余地指定static
修饰符。
因此,您可以通过外部类Outer1
和Outer2
以相同的方式通过嵌套接口访问x
- 嵌套接口, InnerInterface
和NestedInterface
都是static
。
你能告诉我为什么我们能以同样的方式访问
Outer1.InnerInterface.x
和Outer2.NestedInterface.x
吗?
因为它们都是static
场。
从Java语言规范 ,第9章接口,点9.3字段(常量)声明:
接口主体中的每个字段声明都是隐式的
public
,static
和final
。
内部接口默认是静态的?
是。
成员接口(第8.5节)是隐式
static
因此它们从不被视为内部类。
你是对的。 嵌套接口的关键字static
是不必要和冗余的。 嵌套接口始终是静态的。
从逻辑的角度来看,接口定义绑定到外部类的特定实例也没有意义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.