没有公共类的.java文件的Java编译

好的,所以java源文件必须至少有一个公共类,该文件应该被称为“class-name.java”。 很公平。

因此,如果我有一个类,那么以下将编译:

public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); // Display the string. } } 

但是,如果我从上面的代码中删除’public’访问修饰符,那么代码仍会编译。 我只是不明白。 删除它,代码如下:

 class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); // Display the string. } } 

在上面的代码中,由于我删除了“public”访问修饰符,因此我的类具有默认或包私有访问权限,即它不能从外部访问,只能从包中访问。

所以我的问题是,上面的代码是如何编译的? 在这种情况下,文件HelloWorld.java没有’public’HelloWorld类(只有一个包私有的HelloWorld.class),因此我的理解不应该编译。

感谢您回答我的问题!

问候,匿名

一个java源文件必须至少有一个公共类,该文件应该被称为class-name.java

不正确,顶级类不必声明为public。 JLS声明;

如果顶级类或接口类型未声明为public,则只能从声明它的包中访问它。

请参阅http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html#104285第6.6.1节。

您可以将非公共类放在文件中,这不是错误而是function。

你的问题是在包装层面,而不是编译。 因为您可以使用非公共类编译此文件,但您无法从外部调用它,因此它不能用作应用程序基类

喜欢这个:

 // [+] single file: SomeWrapper.java public class SomeWrapper { ArrayList<_privatedatatype> pdt; } // [-] single file: SomeWrapper.java // [+] single file: _PrivateDataType.java class _PrivateDataType { // members, functions, whatever goes here } // [-] single file: _PrivateDataType.java 

主要方法就像任何其他方法一样。 唯一的区别是它可以使用java命令从命令行调用。 即使从命令行看不到main方法,该类仍然可以像任何其他Java类一样使用,并且您的main方法可以由同一个包中的另一个类调用。 因此,我认为它编译。

在Java中,main函数在任何意义上都不是特殊的。 只有一个终端命令能够调用名为main的静态方法…

没什么好奇的。 我想这种行为类似于一些C / C ++ – 编译器。

像“void main(){/ /}”这样的代码将由这些编译器正确编译,尽管它不是符合标准的代码。 简单地说,编译器将“void”与“int”交换。

我认为类似的行为是由java编译器实现的。

问候,xong

非公开课有有效用法。 因此,当您尝试编译文件时,编译器不会出错。

如果未指定类(或其字段或方法)的访问修饰符,则会为其分配“默认”访问权限。 这意味着它只能从同一个包中访问(在本例中是默认包)。

Javabeginner.com网站上有一篇关于这个主题的文章 – 您应该熟悉Java中的访问修饰符,无论是来自本网站还是其他人。