结论:

一个Java源文件中最多只能有一个public类,当有一个public类时,源文件名必须与之一致,否则无法编译;

如果源文件中没有一个public类,则文件名与类中没有一致性要求;

至于main()不是必须要放在public类中才能运行程序。

实验如下:
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类。

通过上述实验,故能得出开始的结论!

参考:http://blog.csdn.net/bareheadzzq/article/details/6562211

最新文章

  1. VECTOR COMPUTATION
  2. js跳转到新页面传参以及接收参数的方法
  3. hdu 5748(求解最长上升子序列的两种O(nlogn)姿势)
  4. Android LogCat使用详解
  5. Opencv图像与矩阵的操作
  6. hasshmap输出value
  7. SGU 150.Mr. Beetle II
  8. win10+vs2010+cuda7.5安装及配置
  9. 使用 Swoole 来加速你的 Laravel 应用
  10. netcore程序部署到docker
  11. insmod 签名问题
  12. C++调用matlab函数
  13. Python记录2:数据类型
  14. (转)python类:magic魔术方法
  15. 【struts2】自定义更强大的logger拦截器
  16. Node和Electron开发入门(四):操作PC端文件系统
  17. RN的第一个API-----注册组件Appregistry
  18. 解析本内置Linux目录结构
  19. C++ 模板的编译 以及 类模板内部的实例化
  20. 时间操作(struct tm、time_t)求指定日期 前n天的日期

热门文章

  1. 【洛谷P1018】乘积最大 dp+高精度
  2. Python基础学习(五)
  3. 2156: 中南大学2018年ACM暑期集训前期训练题集(入门题) D: 机器人的指令
  4. 线程的加入.join()
  5. VS 2010解决方案添加头文件和动态库
  6. numpy之一些名称含义(持续更新)
  7. 算法入门及其C++实现
  8. Tony的口胡呼呼(。-ω-)zzz
  9. Python介绍以及安装
  10. Linux命令之grep