黑马程序员技术交流社区

标题: 关于public的问题 [打印本页]

作者: 黑马华    时间: 2013-5-3 20:21
标题: 关于public的问题
本帖最后由 黑马华 于 2013-5-3 22:46 编辑

在一个java源文件当中可以有多个类,但是为什么只能有一个public类呢?而当这个类被public修饰,为什么源文件名必须要与这个类名相同呢?
作者: 一直在路上    时间: 2013-5-3 20:29
楼主这个问题问的好高深啊……
作者: 爪哇攻城狮    时间: 2013-5-3 20:45
一个java源文件中可以不用public。但是如果有的话只能有一个public修饰,可以这样理解,public相当于一个公开的接口或是入口,当出现两个public的时候,JVM就不知道选择哪个了,就会报错。。

总之:一个Java源文件中最多只能有一个public类,当有一个public类时,源文件名必
须与之一致,否则无法编译,如果源文件中没有一个public类,则文件名与类中没有一致性要求。
至于main()不是必须要放在public类中才能运行程序。
作者: 殇_心。    时间: 2013-5-3 20:46
太高深了。这个问题你得问sun公司。
jvm虚拟机只认同这个。类名public了。文件名也得public。

作者: 陈国斌    时间: 2013-5-3 20:55
确实太高深了,等高人出现
作者: 刘胜寒    时间: 2013-5-3 20:59
问题太高深...
作者: 小黑黑    时间: 2013-5-3 22:02
本帖最后由 小黑黑 于 2013-5-3 22:03 编辑

其实这个问题已经有人问过的哦,这是我以前整理的答案,希望对楼主有帮助的哦,嘿嘿{:soso_e121:}
以下是我的个人愚见,希望有帮助哦:
首先说明结论:一个编译单元(个人理解为执行main函数所调用到的所有文件)中只能有一个public类,且这个类的文件名必须要和其类名相同,包括大小写也必须一样。
1、一个编译单元只能有一个public类的原因:
第一、public的意思是所有类都能访问,包括包以外的类。public是作为这个编译单元的公开接口存在的。
第二、java程序的入口是main方法,所以被定为public的这个类一定是main方法的类,且这个类的名称要和文件名一直,因为虚拟机是要开始找main方法这个入口的。
第三、你可以根据需要,添加任意辅助功能的public权限的类,但是如果这个编译单元(注意是编译单元)里面有两个或以上public类的话,那么编译器就会报错。
建议:
第一、不要在一个源文件中写多个类。在标准的java代码编写时,无论代码量是多少,最好一个源文件只有一个类或接口(即使是接口也要如此),因为java是面向对象的语言,每个类都是抽象的结果,所以每个类要单独写在一个源文件里。
第二、只要要有一个是public类,虽然可以在编译单元中没有public类,即没有公开的接口,可在同一个包中访问,但是这样就将这个包都封闭了,是没意义的。如果没public,就可以随意给文件起名,可以不和类名相同。
2、被public修饰的类与文件名必须同名的原因:
第一、java是被编译执行的,它在运行时并不是将你写的所有类都先加载一遍的,而是当遇到import或使用到了其他类的时候,才会去在文件目录中找相应的class文件的。
第二、对于一个public类。上面也说了,是可以被项目中的任何一个类引用的,只需通过import导入即可。既然是作为虚拟机入口的main函数要用public修饰而成为一个公共接口,那么将类名和文件名一一对应就可以方便虚拟机在相应的路径(包名)中找到相关的信息;但是你如果不这么做,虚拟机很难去找,开销也会跟着增大的。

简单总结:
public作为一个公共接口(此接口非interface这个接口),修饰作为虚拟机入口的main函数,就是为了方便虚拟机找到相应的类,从而节省开销。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2