浅谈为什么一个java源文件是什么中只能有一个public类

声明,本篇文章为转载
http://blog.csdn.net/bareheadzzq/article/details/6562211
最近在一个java文件中实现了几个类,其中一个声明为public类型,但编译器报错;后来将public去掉,也即文件中没有一个public类,程序正常运行,有些困惑,最后通过本文章找到答案,为以后方便查找,转载,感谢作者。
一个Java源文件中最多只能有一个public类,当有一个public类时,源文件名必
须与之一致,否则无法编译,如果源文件中没有一个public类,则文件名与类中没有一致性要求。至于main()不是必须要放在public类中才能运行程序。
转载内容:
闲着没事,在网上看到一个帖子在问为什么一个java源文件中只能有一个public类?网上有人这么回答:、每个编译单元(文件)只能有一个public类。这么做的意思是,每个编&译单元只能有一个公开的接口,而这个接口就由其public类来表示。
我想这或是从软件架构设计和安全性设计上得出的结论。或者说是java的设计者们从这方面的考虑。或许这真的是一个规范,但我没有找到相关资料
不晓得到底有没有这一说话。如果有请知道的同行给出资料来源?
实验如下:Test3.java源文件:&class Test1{int i = 1;
&class Test2{&int i = 2;&public static void main(String[] args)&{&&System.out.println("main method");&}}
C:/javatest&javac Test3.java
C:/javatest&java Test2main method
注:编译不会出错,注意是运行的Test2 因为没有Test3.class文件生成。如果运行Test3则报错
找不到该类C:/javatest&java Test3Exception in thread "main" java.lang.NoClassDefFoundError: Test3Caused by: java.lang.ClassNotFoundException: Test3&&&&&&& at java.net.URLClassLoader$1.run(Unknown Source)&&&&&&& at java.security.AccessController.doPrivileged(Native Method)&&&&&&& at java.net.URLClassLoader.findClass(Unknown Source)&&&&&&& at java.lang.ClassLoader.loadClass(Unknown Source)&&&&&&& at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)&&&&&&&&at java.lang.ClassLoader.loadClass(Unknown Source)Could not find the main class: Test3.& Program will exit.这个错误原因很简单:JVM中的类加载器找不到Test3.class
同时这里也说明了包含main()的类如果想运行则不一定要是public的。
《深入jvm第二版》中有这样一句话:java虚拟机实例通过调用某个类的main()来运行一个Java程序,而这个main()必须是public&static void 并接收一个字符串数组作为参数,任何拥有这样一个main()的类都可以作为java程
序的起点。并没有说拥有main()方法的类一定要是public类。
Test7.java源文件:&class Test5{int i = 1;
&public class Test6{&int i = 2;&public static void main(String[] args)&{&&System.out.println("main method");&}}
如果运行Test7.java 报错:C:/javatest&javac Test7.javaTest7.java:8: 类 Test6 是公共的,应在名为 Test6.java 的文件中声明&public class Test6&&&&&&& ^1 错误这里说明了文件名必须与public类的类名一致,(如果文件中有public类)
这里可以看出如果有多个public类,那么文件名应该是哪个public类的呢?显然一个java源文件
只能有一个public类。
所以总结如下:一个Java源文件中最多只能有一个public类,当有一个public类时,源文件名必
须与之一致,否则无法编译,如果源文件中没有一个public类,则文件名与类中没有一致性要求。至于main()不是必须要放在public类中才能运行程序。
以上是通过实验得出的结论,个人认为到这里已经可以了,如果一定要追问到底,可能要问问java
平台的设计者了。或许,人家会说:这是java的设计和jvm的内部体系结构设计造成,这是一个规
范,没有为什么。
阅读(...) 评论()java文件名为什么要与public声明的类名同名? - 简书
java文件名为什么要与public声明的类名同名?
以下观点是自己对同名原因的理解,希望行家不吝赐教!
在讨论这个问题之前,我想请大家思考一个问题。将声明的一个类用public修饰的意义在哪里?我相信很多朋友会想到访问、调用权限声明,public、private等是对其他类能否调用该类的明确界定,其作用是不言而喻的。那么这些与同名问题有什么关联呢?
未限定声明的类可在同一包中被调用,java程序编译时会将源文件生成以各自类命名的.class文件,因此在同一包中不能定义相同名称的类,否则会引发冲突,系统会报错。而声明为public的类可以被包外的类引用,只需要import 包名 文件名.java,就可以使用该类。这里我要指出:编译器在执行这条语句时会根据路径反向查找,而此时的文件名能帮助编译器快速定位所编译类的位置。想要快速实现这一过程,就需要遵循规则,而将声明的类与文件名同名,能很好地解决这一问题。同时,因为未限定声明的类不存在包外调用,所以其命名也能很随意,因为系统不需要花功夫查找它,只是在包内使用时进行遍历。
其实,我们可以把同名理解为规则,编译单元将public修饰符看做是一个java的公开接口,在对一个java程序编译前,会先检验该文件是否符合规范(规则是我只能接收一个或没有public修饰的类,其他的都不准通过!!!)当然,若编译器检查其符合规范且有public声明,为了提高效率,让编程员把该文件命名为与pubic 类同名的文件再好不过。参考:一个java文件可以有多个类,但只能有一个与java文件名同名的public类
我的图书馆
一个java文件可以有多个类,但只能有一个与java文件名同名的public类
package com.
public class A{
int i = 0;
String str = "b";
String str = "c";
} package com.
public class A{
int i = 0;
String str = "b";
String str = "c";
}编译后的class文件:1.在一个文件里定义了几个类的时候,:
public class A {}
class B {}
class C {}
public class A {}
class B {}
class C {}这样每个class会生成一个 .class文件 2.定义了内部类的时候,
public class A {
public class A {
}这会产生两个class文件,一个A.class,一个A$B.class 3.使用了匿名类的时候,
public class A {
void xxx() {
button.addActionLisener(new ActionListener() {...});
public class A {
void xxx() {
button.addActionLisener(new ActionListener() {...});
} 这也会产生多个class,一个A.class,一个A$1.class
TA的最新馆藏[转]&[转]&[转]&[转]&[转]&[转]&本帖子已过去太久远了,不再提供回复功能。java笔试题汇总-.java源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以有多个类,但只能有一个public类,并且public的类名必须与文件名一致...
下页更精彩:1
本文已影响人

我要回帖

更多关于 java源文件扩展名 的文章

 

随机推荐