黑马程序员技术交流社区

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

作者: 任雷彬    时间: 2012-11-1 22:17
标题: public类的问题

package packb;

public class DemoB
{
        protected /*保护*/ void method()
        {
        System.out.println("demob method run");
        }
}
public class DemoC
{
        public void  show()
        {
                System.out.println("democ meothod run");
        }
}
如上所示代码,在一个包中为什么不能出现两个以上的public类,虽然知道是因为
java文件名必须与public类名相同,但还是有些疑惑,在虚拟机编译运行中,它是什么
样的运行机制,究竟在内存中会怎么样?

作者: 焦晨光    时间: 2012-11-1 22:32
ok 楼主既然知道java源文件名必须与类名相同
那么 与java源文件名相同的 类 有几个
因为 java虚拟机在编译一个类的时候 要找一个入口 当然要找java源文件中的主类,即public类
如果源文件中有两个public类,java虚拟机应该把哪个类当做主类来使用?主类里面要定义main方法
main方法是程序的入口,程序中出现了两个主类,必然可以存在两个main方法,java虚拟机不知道到底使用哪个入口
jvm会疯掉的。。。
个人理解,可能有误~~希望能帮到楼主{:soso_e116:}

作者: 奋斗的青春    时间: 2012-11-1 22:33
简单的说,是由JAVA机制决定的,这是硬性规定,不遵守就会出错。比如C#里就可以在一个源文件里有多个public类,也可以只有一个,这是看各个不同语言所定的规则了。

细究的话,只能说JAVA这个样规定有什么好处呢?
简单地说来,是为了更好地组织代码。

再追究,为什么这样能更好地组织代码呢?这得从JAVA类的访问机制说起了。

JAVA中可以让用户(当你编译好类之后,所有使用这些类的其它类,因为在不同的包中)访问的类只能是public,没有加public 的只有包的访问权限,用户无法访问,这样的类是作为辅助public类的作用出现的,如果不在public类中出现过,那么可以说这些类是没用的。

所以,JAVA就规定一个源文件只能有一个public类,而且文件名必须与它相同,这样一个文件形成了一个功能单元,而不会存在一个文件有很多功能单元这样的混乱局面,这样管理起代码来就有条理多了。

个人理解,希望对你有帮助,如果对访问机制不是很清楚,建意看JAVA方面的基础书.

作者: 林志进    时间: 2012-11-1 22:34
1、每个编译单元(文件)只能有一个public   类。这么做的意思是,每个编 译单元只能有一个公开的接口,而这个接口就由其public   类来表示。
你可以根据需要,往这个文件里面添加任意多个提供辅助功能的package   权限的类。但是如果这个编译单元里面有两个或两个以上的public   类的话,编译器就会报错。
2.   public   类的名字必须和这个编译单元的文件名完全相同,包括大小写。如果你不遵守,编译器又要报错 了。
3.   编译单元里面可以没有public   类,虽然这种情况不常见,但却是可以 的。这时,你就能随意为文件起名字了。
作者: slience    时间: 2012-11-1 22:50
如果源文件有多个公共类,编译器就找不到应该执行的main方法了
作者: 梁胜海    时间: 2012-11-1 23:58
我把大家的总结一下,楼主以后记住,如果一个java源文件中定义了多个类,那么这些类中最多只能有一个类是public的,换句话说,定义的多个类可以都不是public的。只要你记住这句话,以后你就不会出错。




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