什么一个Java源文件中只能有一个public类?

   

浅谈为什么一个java源文件中只能有一个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的内部体系结构设计造成,这是一个规

    范,没有为什么。

    • 0
      点赞
    • 1
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值