2011-10-03 41 views
5

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

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

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

但我是什么错误,如果我从上面的代码中删除了“公共”访问修饰符,该代码仍然编译。我只是不明白。删除它,代码如下:

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

在上面的代码,因为我删除了“公共”访问修饰符,我班有违约或包专用通道,即它不能从外界访问,只能从包装内购买。

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

感谢您回答我的问题!

问候, 匿名

+0

*“java源文件必须至少有一个公共类”*呃不,不需要任何东西。(http://stackoverflow.com/q/7791487/1134080) – ADTC

回答

1

您可以将文件中的非公共类,它是不是一个错误,但功能。

你的问题是在包装层面,而不是编译。因为你可以编译与非公共类这个文件,但你不能从外部调用它,所以它不工作作为应用基础类

像这样:

// [+] 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 
+0

谢谢,但我的观点是不添加私人数据类型或任何东西。我的问题是,上面的代码是如何编译和/或工作的,因为我有一个.java文件,但没有任何公共类。其中唯一的类是一个包私人类,而不是公共类。 – anon1981

+0

问题在哪里?您可以在同一个包中创建另一个类(具有相同的效果)并使用该包专用类。 –

+0

同样,我的问题是不要在文件中添加任何新类。我只关心包私人访问。 – anon1981

6

Java源文件必须至少有一个公共类,该文件应该叫做class-name.java

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

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

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

+0

谢谢!那么你是说,谁调用main()从某种包装上下文中调用它?也就是说,调用main()的调用者(可能是JVM)与我的HelloWorld类在同一个包中? 只是困惑!所以谢谢你抽空回答我的问题。 – anon1981

+0

另外,您可以在java文件中定义多个非公共类。 –

+0

所以现在我的问题是:HelloWorld是默认类中的包私有类,对吗?所以它应该可以从默认包中访问,但不能从默认包之外访问,对吗? 因此,进一步推断,当main()被调用时,它必须从默认包中的*调用,对吗?或者,调用main()的人与HelloWorld类在同一个包中。对 ? – anon1981

-1

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

网站Javabeginner.com有关于此主题的文章 - 您应该熟悉Java中的访问修饰符,无论是从本网站还是其他网站。

1

主要方法就像任何其他方法一样。唯一的区别是它可以通过java命令从命令行调用可能。即使主方法在命令行中不可见,该类仍然可以像其他任何Java类一样使用,并且您的主方法可能由同一个包中的另一个类调用。所以我觉得它编译。

在Java中,主要功能在任何意义上都不是特殊的。只是存在一个终端命令,能够调用静态方法称为主...

+1

现在,HelloWorld类具有包 - 私有可访问性。因此,现在调用main(JVM?)的人也必须在同一个包中,对吗? – anon1981

+0

我直接从java类调用,然后是。然而,反思的规则稍有不同。通过反射,可以调用任何非私有方法。 JVM使用反射来调用你的主要方法。 –

1

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

类似于“void main(){/ ... /}”的代码将被这些编译器正确编译,尽管它不符合标准兼容代码。简单地说,编译器将“void”与“int”进行交换。

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

问候, xong

+0

看来我错了。 =) – xong

1

有一个非公共类的有效用途。因此编译器在尝试编译文件时不会出错。