我听说.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
感谢。
答案 0 :(得分:2)
Java文件只能包含一个顶级类,这意味着您可以 嵌套 类。您目前正在尝试创建两个顶级类。嵌套类看起来像,
public class MyClass {
public static void main(String args[]) {
}
private class C{}
}
名称为MyClass.C
(此处MyClass
为顶级类,C
为内部类)。对于顶级类,源文件名必须与顶级类的声明名称匹配。这与C语言不同,C语言不强制执行源文件的命名方案。
在@Erwin Bolwidt中指出comments,你可以(虽然这不是一个坏主意)
public class MyClass {
public static void main(String args[]) {
}
}
class C{}
但只有与MyClass
相同的包中的类才能访问它。
答案 1 :(得分:2)
同一.java文件中任何其他顶级类的可访问性必须是
private
还是protected
?
显然不是,因为您的问题编译错误已经告诉您private
对顶级课程无效。
Java语言规范7.6 Top Level Type Declarations回答了您的问题:
如果没有访问修饰符,则顶级类型具有包访问权限:只能在声明它的包的编译单元中访问它(§6.6.1)。可以声明类型
public
以从其他包中的代码授予对该类型的访问权。如果顶级类型声明包含以下任一访问修饰符,则为编译时错误:
protected
,private
或static
。
因此,对于顶级课程,private
和protected
都不是允许的。
规范继续说:
当且仅当包存储在文件系统(§7.2)中时,如果在a下的文件中找不到类型,主机系统可以选择强制执行编译时错误的限制。如果满足以下任一条件,则名称由类型名称加上扩展名(例如
.java
或.jav
)组成:
该类型由声明类型的包的其他编译单元中的代码引用。
该类型声明为
public
(因此可以从其他包中的代码访问)。此限制意味着每个编译单元最多只能有一个这样的类型。这种限制使Java编译器可以轻松地在包中找到命名类。在实践中,许多程序员选择将每个类或接口类型放在它自己的编译单元中,无论它是公共的还是由其他编译单元中的代码引用。
如您所见,public
顶级类的名称必须与源文件相同。当然,每个文件只能有一个public
顶级类。
任何非public
顶级类必须是通常所说的 package-private ,即它必须没有访问修饰符。
访问修饰符在Chapter 6. Names中定义:
如果没有访问修饰符,大多数声明都有包访问,允许访问包含其声明的包中的任何位置;其他可能性包括
public
,protected
和private
。
答案 2 :(得分:1)
内部类可以有任何访问修饰符,但外部类只能有public或default修饰符。
例如: - public class A
或class A
要了解有关Java中访问修饰符的更多信息,您可以查看此链接In Java, difference between default, public, protected, and private