黑马程序员技术交流社区

标题: 为什么一个java源文件中只能有一个public类? [打印本页]

作者: 李杰    时间: 2012-9-16 17:59
标题: 为什么一个java源文件中只能有一个public类?
真心求解
!!!:)
作者: 田旭阳    时间: 2012-9-16 18:01
每个编译单元(文件)只能有一个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的内部体系结构设计造成,这是一个规

范,没有为什么。

作者: 李健_8    时间: 2012-9-17 23:06
在一个源文件.JAVA文件中可以有很多类,只有一个PUBLIC类其他的都不能是.   
在PUBLIC类中找程序的入口   main函数  你想想如果很多PUBLIC   类,那程序从何运行呢?
作者: 刘进朝    时间: 2012-9-18 16:40
JAVA是面向对象的语言,每个类都是抽象的结果,所以每个类都要单独写在一个源文件里.
最好不要在一个.java的源文件里写很多的类.

希望对你有帮助。
作者: 孙岳    时间: 2012-9-18 17:25
首先,一个java源文件里面最多只能有一个public类,而且必须是main方法所在的和文件名同名的类;没有public类也可以,只要main方法所在的类名和文件名相同即可。但是不允许有多个public类。
main方法只是源程序编译时的入口,实际上它并不属于这个类;编译完成,java的字节码文件是以类为单位存在的,一个.class文件就是一个类,一个源文件有多少个类就编译成多少个.class字节码文件。而且这里要注意,类的功能范畴尽可能单一,千万不要过于臃肿。
public是一个权限修饰符,而且是最开放的权限。封装性是面向对象的一个基础特性,如果封装性差,面向对象就失去了一大半的意义,尽可能减少public出现的次数就是为了良好的封装性。而且,如果随便使用public类的话,不同包中的类很容易发生重名现象,但是,如果不是public类型的,不同包中的类即使重名也没关系。
面向对象编程过程中,一定要尽可能的把访问权限降低,也就是尽可能高度封装,如果不开放权限就无法完成功能的情况才给其权限,其实就是给外界提供一个使用方法就好了,尽可能少用public,除非不得不用。
作者: 李健_8    时间: 2012-9-18 21:43
火火 发表于 2012-9-17 23:06
在一个源文件.JAVA文件中可以有很多类,只有一个PUBLIC类其他的都不能是.   
在PUBLIC类中找程序的入口   ma ...

改名通道在哪里   我也想改啊
作者: 黑马杨晨    时间: 2012-9-18 21:57
java程序是从一个public类的main函数开始执行的,(其实是main线程),就像C程序是从main()函数开始执行一样。     只能有一个public类是为了给类装载器提供方便。     一个public   类只能定义在以它的类名为文件名的文件中。

每个编译单元(文件)都只有一个public   类。因为每个编译单元都只能有一个公共接口,用public类来表现。该接口可以按照要求包含众多的支持包访问权限的类。如果有一个以上的public   类,编译器就会报错。  并且public类的名称必须与文件名相同(严格区分大小写)。  当然一个编译单元内也可以没有public类。

在一个源文件.JAVA文件中可以有很多类,只有一个public类其他的都不能是.   
在PUBLIC类中找程序的入口   main函数  你想想如果很多public类,那程序从何运行呢?




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