【问题标题】:Omitting access specifier in java在java中省略访问说明符
【发布时间】:2014-01-20 10:39:12
【问题描述】:

我知道在 java 文件中声明的public 类的名称必须与其文件名相同。但我想知道这怎么没有给我一个编译错误,而是它运行成功。

class Foo //<-- this can be any name...
{
    public static void main(String[] args)
    {
        System.out.println("Hello World!");
    }
}

我知道默认访问权限是package private。对于上述程序,类名和文件名不必相同。它正在正确执行,而不是编译器错误。 任何人都可以发光吗?谢谢。

编辑:

现在我明白了!但另一个问题打动了我。当同一个文件中有两个这样的类时会发生什么?

好吧,我以为会从实现了main 方法的类中生成一个.class 文件。没有任何编译错误,但令我惊讶的是,也没有生成任何.class 文件。为什么会这样?

【问题讨论】:

  • 在一个 java 文件中保留两个具有公共访问说明符的类。一个有主,一个没有主。您将收到警告或错误。
  • @Rahul:我看不出这与问题有什么关系。

标签: java class access-specifier


【解决方案1】:

是的,这绝对没问题。即使对于公共类,这也是编译器特定的可选限制。

来自section 7.6 of the JLS

当且仅当包存储在文件系统中(第 7.2 节)时,如果在由如果满足以下任一条件,则类型名称加上扩展名(例如 .java 或 .jav):

  • 该类型被声明该类型的包的其他编译单元中的代码引用。

  • 该类型被声明为公共的(因此可以从其他包中的代码访问)。

请注意第二个要点 - 当您的课程不公开时,此限制不适用。

编辑:从更新的问题...

当同一个文件中有两个这样的类时会发生什么?

类文件是根据类名生成的。 main 方法的存在与此完全无关,原始源文件名也是如此。如果编译成功,肯定应该生成一个类文件。如果没有重现问题的示例代码,我们无法判断到底发生了什么。

【讨论】:

  • @nitish712:查看我的编辑,但请尽量在每个帖子中保留一个问题。这是危险地转向“我一直在想我想问的其他事情......”的领域。
  • 我的错。类文件已生成。
【解决方案2】:

你的观察是正确的。如果类不是公共的,则类的名称不需要与文件名匹配。当您的文件中没有公共类时,您可以随意命名文件。

如果你说有一个源文件 Test003.java 并且你在其中定义
AAA和BBB两个非公开课,没有编译
错误并生成两个类文件:AAA.classBBB.class

所以一切都很好。

01/20/2014  06:27 AM               238 AAA.class
01/20/2014  06:27 AM               238 BBB.class

【讨论】:

  • @nitish712 整个事情与主要方法的存在/不存在无关。我会检查你更新的问题。
猜你喜欢
  • 2011-01-31
  • 2016-01-15
  • 2016-05-23
  • 2018-06-22
  • 2015-09-14
  • 2012-04-09
  • 2016-08-11
  • 1970-01-01
  • 2013-12-14
相关资源
最近更新 更多