java源文件中只能有一个public类
2016-03-09 11:43
746 查看
闲着没事,在网上看到一个帖子在问为什么一个java源文件中只能有一个public类?
网上有人这么回答:http://topic.csdn.net/t/20060528/22/4784755.html
、每个编译单元(文件)只能有一个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 Test2
main method
注:编译不会出错,注意是运行的Test2 因为没有Test3.class文件生成。如果运行Test3则报错
找不到该类
C:/javatest>java Test3
Exception in thread "main" java.lang.NoClassDefFoundError: Test3
Caused 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.java
Test7.java:8: 类 Test6 是公共的,应在名为 Test6.java 的文件中声明
public class Test6
^1 错误
这里说明了文件名必须与public类的类名一致,(如果文件中有public类)
这里可以看出如果有多个public类,那么文件名应该是哪个public类的呢?显然一个java源文件
只能有一个public类。
所以总结如下:一个Java源文件中最多只能有一个public类,当有一个public类时,源文件名必
须与之一致,否则无法编译,如果源文件中没有一个public类,则文件名与类中没有一致性要求。
至于main()不是必须要放在public类中才能运行程序。
以上是通过实验得出的结论,个人认为到这里已经可以了,如果一定要追问到底,可能要问问java
平台的设计者了。或许,人家会说:这是java的设计和jvm的内部体系结构设计造成,这是一个规
范,没有为什么。
网上有人这么回答:http://topic.csdn.net/t/20060528/22/4784755.html
、每个编译单元(文件)只能有一个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 Test2
main method
注:编译不会出错,注意是运行的Test2 因为没有Test3.class文件生成。如果运行Test3则报错
找不到该类
C:/javatest>java Test3
Exception in thread "main" java.lang.NoClassDefFoundError: Test3
Caused 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.java
Test7.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中给集合快速取值最大值和最小值
- maven+springMVC+mybatis+junit+tiles eclipse详细搭建过程
- Java 字符编码
- 如何在eclipse配置PyDev
- 【SSH (二)】struts2处理.do请求
- eclipse远程debug Java程序
- Java IO——DataOutputStream & DataInputStream
- 【持久化框架】SpringMVC+Spring4+Mybatis3集成,开发简单Web项目
- Java线程池
- kettle中调用java类
- Struts 2 学习笔记(二)
- Myeclipse中jsp页面链接css文件不生效问题
- 生产环境下JAVA进程高CPU占用故障排查
- Spring的定时器设置
- JDK7 新特性
- Spring事务配置的五种方式
- 为什么Java中的密码优先使用 char[] 而不是String?
- 大话 CGLIB 和 JDK 生成动态代理类的那点事
- java