A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马超(Andy) 中级黑马   /  2014-7-28 00:23  /  2504 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1.在一个java源文件当中可以有多个类,但是为什么只能有一个public类呢?
2.为什么public修饰的类名必须要和java源文件名相同呢?
3.若一个java源文件内包含N个类,且你n个类都不是public类,且Java源文件名和其他类名也不一样,此时为什么编译不报错?
例如:class A
{
    public static void main(String[] args)
    {
        System.out.println("Hello World!");
    }
}

class B
{
    B()
    {
        System.out.println("B");
    }
}

class C
{
    C()
    {
        System.out.println("C");
    }
}

源文件名为D.java

6 个回复

倒序浏览
文件中可以没有public类,加修饰只是权限问题。
你写的代码三个类在同一个文件中,不存在访问权限问题。
回复 使用道具 举报
这里有一些老外的讨论
http://programmers.stackexchange.com/questions/130398/why-does-a-java-source-file-bear-the-name-of-the-public-class-it-contains

从中可以看到,其实Java在设计之初并没有一个源文件只能有一个public类的限制,这个限制是后来不断改进的过程中加上的。我在Java语言规范中也没有找到对此限制的说明。这个问题的答案恐怕只能去问Java语言的设计者们了。不过我认同上面那个链接中回答的逻辑:public的类是访问权限最大,也最常被访问的类,加快这些类的搜索是非常必要的。如果允许一个源文件中有多个public类,而且文件名还是任意的,那么编译器去寻找某个public类就要遍历所有源文件,如果你的项目很大,上百个源文件,那么编译时仅仅是寻找类就很花时间。
回复 使用道具 举报 1 0
一个Java源文件中最多只能有一个public类,当有一个public类时,源文件名必须与之一致,否则无法编译,如果源文件中没有一个public类,则文件名与类中没有一致性要求。
至于main()不是必须要放在public类中才能运行程序。并且public类的名称必须与文件名相同(严格区分大小写)。  当然一个编译单元内也可以没有public类。

据说这是java的设计和jvm的内部体系结构设计造成,这是一个规范,没有为什么。
回复 使用道具 举报
这个是硬性规定吧没有为什么吧。
回复 使用道具 举报
fantacyleo 发表于 2014-7-28 00:40
这里有一些老外的讨论
http://programmers.stackexchange.com/questions/130398/why-does-a-java-source-fi ...

咕~~(╯﹏╰)b
懂了,懂了   3Q3Q
回复 使用道具 举报
韩天雷 发表于 2014-7-28 00:46
一个Java源文件中最多只能有一个public类,当有一个public类时,源文件名必须与之一致,否则无法编译,如果 ...

懂了懂了~ 3Q3Q
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马