[英]What is the accessibility of any other top-level class in the same .java file?
我听说一个.java文件只能有一个公共顶级类。
同一.java文件中其他任何顶级类的可访问性是否必须是private
或protected
?
为什么
public class MyClass {
public static void main(String args[]) {
}
}
private class C{}
有错误
/MyClass.java:6: error: modifier private not allowed here
private class C{}
^
1 error
谢谢。
一个Java文件只能有一个顶级类,这意味着您可以嵌套类。 您当前正在尝试创建两个顶级类。 嵌套类看起来像
public class MyClass {
public static void main(String args[]) {
}
private class C{}
}
并具有名称MyClass.C
(此处MyClass
是顶级类,而C
是内部类)。 对于顶级类,源文件名必须与顶级类的声明名称匹配。 这与C语言(不强制执行源文件的命名方案)形成对比。
正如@Erwin Bolwidt在评论中指出的那样,您可以(尽管这是一个坏主意)
public class MyClass {
public static void main(String args[]) {
}
}
class C{}
但是只有与MyClass
相同的程序包中的类才能访问它。
同一.java文件中其他任何顶级类的可访问性是否必须是
private
或protected
?
显然不是,因为您的问题编译错误已经告诉您private
对于顶级类无效。
Java语言规范7.6顶级类型声明回答了您的问题:
在没有访问修饰符的情况下,顶级类型具有包访问权限:只能在声明该包的包的编译单元中对其进行访问(第6.6.1节 )。 可以将某个类型声明为
public
类型,以授予从其他包中的代码对该类型的访问权限。如果顶级类型声明包含以下任何一种访问修饰符,则是编译时错误:
protected
,private
或static
。
因此,顶级类甚至不允许 private
或protected
。
规范继续说:
当且仅当包存储在文件系统中(第7.2节 ),如果在文件中未找到由类型名组成的名称的类型,则主机系统可以选择强制执行限制,即它是编译时错误。如果满足以下任一条件,则加上扩展名(例如
.java
或.jav
):
该类型由声明该类型的包的其他编译单元中的代码引用。
该类型被声明为
public
(因此可以从其他包中的代码访问)。这种限制意味着每个编译单元最多只能有一个这样的类型。 此限制使Java编译器可以轻松地在包中查找命名的类。 实际上,许多程序员选择将每个类或接口类型放入其自己的编译单元中,无论该类或接口类型是公共的还是由其他编译单元中的代码引用的。
如您所见, public
顶级类的名称必须与源文件相同。 那么,每个文件当然只能有一个public
顶级类。
任何非public
顶级类都必须是通常称为package-private的类 ,即它必须没有访问修饰符。
在没有访问修饰符的情况下,大多数声明都具有包访问权限 ,从而允许访问包中包含其声明的任何位置; 其他可能性是
public
,protected
和private
。
内部类可以具有任何访问修饰符,但是外部类只能具有public或default修饰符。
例如:- public class A
class A
或class A
要了解有关Java中访问修饰符的更多信息,可以查看此链接。 在Java中,默认,公共,受保护和私有之间的区别
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.