浅谈为什么一个java源文件中只能有一个public类?
声明,本篇文章为转载
转载
http://blog.csdn.net/bareheadzzq/article/details/6562211
最近在一个java文件中实现了几个类,其中一个声明为public类型,但编译器报错;后来将public去掉,也即文件中没有一个public类,程序正常运行,有些困惑,最后通过本文章找到答案,为以后方便查找,转载,感谢作者。
结论:
一个Java源文件中最多只能有一个public类,当有一个public类时,源文件名必
须与之一致,否则无法编译,如果源文件中没有一个public类,则文件名与类中没有一致性要求。
至于main()不是必须要放在public类中才能运行程序。
转载内容:
闲着没事,在网上看到一个帖子在问为什么一个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的内部体系结构设计造成,这是一个规
范,没有为什么。
浅谈为什么一个java源文件中只能有一个public类?的更多相关文章
- 为什么一个java源文件中只能有一个public类
问题:一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 答案:可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致.一个文件 ...
- 第7章 一个java源文件中只能有一个public类
一个Java源文件中最多只能有一个public类, 1)当有一个public类时,源文件名必须与之一致,否则无法编译, 2)如果源文件中没有一个public类,则文件名与类中没有一致性要求. 至于ma ...
- 一个.java源文件中可以有多个类吗?(内部类除外)有什么条件?
一个.java源文件中可以有多个类吗?(内部类除外)有什么条件?带着这个疑惑,动手建几个测试类, 揭开心中的疑惑.以下是解开疑惑过程: package test;/** * 一个.java源文件中可以 ...
- 一个.java文件内只能写一个class吗
先给结论:当然不是!! 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致.一个文件中可以不含public类,如果只有一个非public类,此时可以跟文件名不同. 为 ...
- 一个java源文件中为什么只能有一个public类。
我们都遇到过一个源文件中有多个java类,但当第一个类使用public修饰时,如果下面还有类使用public修饰,会报错.也就是是说一个java源文件最多只能有一个public类. 当有一个publi ...
- 一个".java"源文件中是否可以包括多个类(不包括内部类)
开通好几个月博客了,但是一直没有时间写,这一段时间准备开始复习了,以后准备好好写博客了,会从基础的内容开始. 一个".java"源文件中可以定义多个类,但最多只能定义一个publi ...
- java---面试题---.java"源文件中可以包括多个类(不是内部类)
答题时,先答是什么,再答有什么作用和要注意什么 一个".java"源文件中可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致,main方法只能写在 ...
- Java.基础 -------- 一个Java源文件中可以有很多类,但只能有一个类是public的
一个Java源文件中可以有很多类,但只能有一个类是public的 Java程序是从一个public类main函数开始执行的,只能有一个public是为了给类装载器提供方便,一个publi ...
- 1.一个.java源文件中是否可以包括多个类?2...
1.一个“.java”源文件中是否可以包括多个类(不是内部类)?有什么限制? 答:可以有多个类,但只能有一个public类,并且public的类名必须与文件名相一致. 2.java有没有goto? 答 ...
随机推荐
- 【CF888G】Xor-MST Trie树(模拟最小生成树)
[CF888G]Xor-MST 题意:给你一张n个点的完全图,每个点有一个权值ai,i到j的边权使ai^aj,求这张图的最小生成树. n<=200000,ai<2^30 题解:学到了求最小 ...
- python计算均值方差
用Python求均值与方差,可以自己写,也可以借助于numpy,不过到底哪个快一点呢? 我做了个实验,首先生成9百万个样本: nlist=range(0,9000000) nlist=[float(i ...
- 51单片机之IIC通信原理及软件仿真
关于IIC我觉这个博客里面说的已经够清楚了 如下图所示的写操作的时序图: 其实像这种通信协议的要求是很精确的,一点点不对都可能导致在实际工程中无法读取数据.我就是被一个应答位耽误了好久,还好最后被我发 ...
- quartz 任务时间调度入门使用
这一小节主要是针对cronschedule用法进行讨论,首先讲一下cronschedule基础知识点: 一个cronschedule至少有6个字符(或者7个字符),空格作为间隔,比如 0 * * * ...
- jQuery的下面是动态表格动态表单中的HTML代码
动态表格动态表单中的Jquery代码 <script type="text/javascript" src="/include/jquery/jquery-1.1. ...
- POJ-放苹果(DP)
放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 29074 Accepted: 18376 Description 把M个 ...
- hdu1540 Tunnel Warfare【线段树】
During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast a ...
- 【源码】rm zip 删除文件夹中大量的小文件 百万 扫描文件时间
rm 删除文件夹中大量的小文件 百万 迟迟未删除 在扫描文件? rm删除命令源码分析 - ty_laurel的博客 - CSDN博客 https://blog.csdn.net/ty_laurel/ ...
- sass和css的calc运算
1.sass不识别不同单位之间的计算,而calc则没问题. width: #{1rem - 2px}; /*出错*/ width: calc(1rem - 2px); 通常情况定制css样式,我不需要 ...
- sql优化实例(用左连接)
改为 也就是说用左连接代替where条件,这样的话效率会提高很多.