Java:为什么单独的类必须是私有的

时间:2012-03-26 16:27:41

标签: java oop

例如,我有一个名为“A.java”的文件名。这是它的结构:

public class A{
}

private class B{
   // no error
}
public class C{
   //error : must declare at different file
}

我认为这是Java规则。但是,我真的想知道:为什么java需要这样做。

谢谢:)

5 个答案:

答案 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)

它在Java Language Specification

中定义

答案 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将成员的可见性限制为封闭的顶级类/接口。如果您的类是顶级类(无论是否在其自己的文件中),您至少需要包级别可见性(根本不需要修饰符)。