例如,我有一个名为“A.java”的文件名。这是它的结构:
public class A{
}
private class B{
// no error
}
public class C{
//error : must declare at different file
}
我认为这是Java规则。但是,我真的想知道:为什么java需要这样做。
谢谢:)
答案 0 :(得分:3)
您可以在JLS的7.6节中找到:
当包存储在文件系统(第7.2.1节)中时,主机系统 可以选择强制执行编译时错误的限制 如果在由该类型组成的名称下的文件中找不到类型 name加上一个扩展名(例如.java或.jav) 以下是真的:
该类型由其他编译单元中的代码引用 声明类型的包。该类型被声明为public (因此可以从其他包中的代码访问)。 这种限制意味着每个最多必须有一个这样的类型 编译单位。这种限制使编译器易于使用 Java编程语言或Java虚拟实现 机器在包中找到一个命名类;例如, 公共类型wet.sprocket.Toad的源代码可以在一个 文件Toad.java在目录wet / sprocket中,并对应 对象代码可以在文件Toad.class中找到 。目录
答案 1 :(得分:1)
每个.java文件只能有一个公共类,因为公共类必须与源文件具有相同的名称。
从您的示例中:如果您有文件" A.java",则只有A类可以公开。
答案 2 :(得分:1)
答案 3 :(得分:0)
好吧,
你不能拥有一个名为'A.java'的文件,因为你打算将公共类命名为'ClassA',那么文件名必须是ClassA.java。现在,据我所知,这种限制背后的想法只是组织起来。所以你可以拥有每个阶级的物质起源。
如果没有这个限制,你可以拥有一个来自'无处'的'ClassC',并且跟踪源代码可能非常困难。
问候
答案 4 :(得分:0)
public class A{
}
private class B{
// no error
}
这甚至不起作用(see Java Language Specification):
如果顶级类型声明包含,则为编译时错误 以下访问修饰符中的任何一个:protected,private或 静态
您确定没有将类B
声明为内部类吗?
将顶级类声明为private
并不明智,因为private将成员的可见性限制为封闭的顶级类/接口。如果您的类是顶级类(无论是否在其自己的文件中),您至少需要包级别可见性(根本不需要修饰符)。