为什么java的文件名必须和公共类名相同?

解决方案 »

  1.   

    可能是java的包物理存储(文件目录的形式) 要做到实现跨包之类的技术 就要类定义为public 吧.瞎猜的.
      

  2.   

    首先一个java文件里可以建立很多个类,但是一个类文件里包含的N个类只能有一个属性为public
    也就是说只能有一个public class 假设文件名不和公共类同名那一个JAVA文件就可以有很多名字了!
      

  3.   

    这个问题提得很好。以下是个人理解。首先Java是被解释执行的。它在运行时并不是将所有的class文件全都放到内存中。而是在遇到import的时候才去相应的文件目录找相应的class文件。对于一个public类,它是可以被项目中任何一个类所引用的,只需在使用它前import一下它所对应的class文件即可。将类名与文件名一一对应就可以方便虚拟机
    在相应的路径(包名)中找到相应的类的信息。如果不这么做的话,就很难去找,而且开销也会很大。一下是我写的一个比较“恶心”的程序来说明这个问题,大家在使用前先要将自己JDK的bin目录设置到环境变量path中去:
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.FileNotFoundException;
    public class Test
    {
    public static void main(String[] args) {

    Object b = null;

    try {
    b = Class.forName("Hello").newInstance();
    }
    catch(InstantiationException e) {

    }
    catch(IllegalAccessException e) {

    }
    catch(ClassNotFoundException e) {

    try {
    FileOutputStream file = new FileOutputStream("Hello.java");
    String s = "public class Hello {\r\n\t\r\n\tpublic Hello() {\r\n\t\tSyst"
    + "em.out.println(\"Hello, world!\");\r\n\t}\r\n}\r\n";
    file.write(s.getBytes());

    Process p = Runtime.getRuntime().exec("javac Hello.java");
    System.out.println("The return value is: " + p.waitFor());

    b = Class.forName("Hello").newInstance();
    }
    catch(FileNotFoundException ee) {

    }
    catch(IOException ee) {

    }
    catch(InterruptedException ee) {

    }
    catch(InstantiationException ee) {

    }
    catch(IllegalAccessException ee) {

    }
    catch(ClassNotFoundException ee) {

    }
    }
    }
    }
    上面这段程序的意思是在创建一个名为"Hello"的类的对象时由于在当前目录找不到Hello.class,因此产生ClassNotFoundException异常。
    然后在异常中生成一个Hello.java文件,然后用javac编译它,产生一个Hello.class文件,随后再执行创建一个名位"Hello"类的对象时就成功了。
      

  4.   

    应该是为了匹配jvm编译后产生的.class文件 因为java的广告语 一次编译到处运行
      

  5.   

    这样杜绝出现同包同名称的公共类
    而且 一目了然考虑 从 SAVE。JAVA文件中 编译出一个 READ。CLASS
      

  6.   

      还没研究过这样的问题 
     `````` 应该是SUN公司规定好的吧``