如果我没有猜错的话,你用的是windows。

解决方案 »

  1.   

    编译与运行是不一样,编译是找匹配的相关文件名;
    运行则是调用与文件名相同的类,注意大小写是敏感的!
    Hello.class与HELLO.class是两个完全不同的类。
      

  2.   

    同意二楼的意见,WINDOWS 的文件名系统不区分大小写!!
      

  3.   

    情况2:
    文件名:D:\HELLO.java
              ^^^^^
      

  4.   

    三楼说的是正确的,这是java的游戏规则。
      

  5.   

    情况2的java源文件名错了,应该是HELLO.java,因为是HELLO是public类,必须放在文件名和类名完全一致(包括大小写)的源文件中。javac编译的时候文件名不区分大小写,但java执行时是区分大小写的,因为执行的是Java的类,而类名在Java中是区分大小写的。我把情况2中的文件名改过来后再javac,3种情况都能编译成功。不过我发现一个需要注意的地方就是javac中只是Java源文件的文件名不区分大小写,但是.java后缀区分大小写,而且是只能为.java,使用.JAVA等其他扩展名都编译出错。
      

  6.   

    看了楼上各位的解释,还有不明白:
    情况2:
    文件名:D:\Hello.java
    public class HELLO {
        public static void main(String[] args) {
    System.out.println("Hello,world!");
    }
    }
    D:\>javac Hello.java  --错误
    D:\>javac HELLO.java  --正确  大家看这里,这里为什么可以通过??请解释
    D:\>javac HeLLo.java  --错误
    D:\>javac HELLO.java  --正确  大家看这里,这里为什么可以通过??请解释
      

  7.   

    to JeromeLiu(烛光) 
    因为public class HELLO {
     这里是大写的。
      

  8.   

    楼主的意思已明白,public HELLO类保存在Hello.java内,而javac HELLO.java未报错,且生成HELLO.class。
    此问题无需深究,按规范定义类名,保证public类名与所属文件名大小写相同,也许其他操作系统下如上编译通不过,也许下一个版本会排除此现象。
      

  9.   

    文件名必须要类名要一样
    如要文件是Hello
    类名要为 class Hello如要文件是HELLO
    类名要为 class HELLO
      

  10.   

    其实一开始就说了编译找文件(不分大小写),运行找类(分大小写),其实我们为什么样乱写,文件和类名必须一样,这是java语法中最基本的要求(虽然在windows下有些情况可以,但不要忘了java写的东西是要跨平台的。
      

  11.   

    我只是在说明有这种现象,就是public HELLO类保存在Hello.java内,而javac HELLO.java未报错,且生成HELLO.class这样的现象怎么解释,也许下个版本会通不过。
      

  12.   

    如果你的HELLO类加了public 修饰,那么文件名必须和这个类名相同,也就是要d:\HELLO.java
      

  13.   

    一个JAVA程序,只能有一个public,如果那个类用了public,那么类名和文件名必须一样.
      

  14.   

    pchobby(你爱我像谁):
    如果你的HELLO类加了public 修饰,那么文件名必须和这个类名相同,也就是要d:\HELLO.javaplayboylee(老婆说我是最棒的) :
    一个JAVA程序,只能有一个public,如果那个类用了public,那么类名和文件名必须一样.-----------------------
    不一定的,上面语句说了,你们没有仔细看回复:
    public HELLO类保存在Hello.java内,而javac HELLO.java未报错,且生成HELLO.class
    这样的现象怎么解释
      

  15.   

    javac 编译时对大小写不敏感的(windows 下)Hello和HELLO是一样的
    但因为你的类是public HELLO,而文件名是hello.java
    那么编译器执行javac Hello.java时发现文件名不是HELLO.JAVA 所以报错
    执行javac HELLO.java时则可以顺利通过,因为类名和文件名一样(Hello==HELLO)
      

  16.   

    to JeromeLiu(烛光):
    javac是不区分大小写的,这个命令只是寻找相应的文件名,你的文件名可以是Hello.javac、HELLO.java、也可以是HeLLo.java。但是在编译过程中,最终能通过的是:文件名与类名一致的那个文件。其实在命令javac *.java中,这个*应该是你的类名,而不应该是你的文件名。如果用JBuilder、Eclipse或者JCreator写的,就不会有这样的问题,因为在编译时,如果类名和文件名不一致,是不能通过编译的。
    我想你是用notepad写的吧?完成后可以存为任何名字,但在编译时却不一定通过。编译通过后生成的class文件同样是根据类名来生成。由于你的类名是HELLO,所以生成的是HELLO.CLASS。
      

  17.   

    情况2:
    文件名:D:\Hello.java
    public class HELLO {
        public static void main(String[] args) {
    System.out.println("Hello,world!");
    }
    }
    这个类的名字应该是HELLO而不是Hello,你应该把public class HELLO改成public class Hello
      

  18.   

    其实在命令javac *.java中,这个*应该是你的类名,而不应该是你的文件名。
    --
    这里前提应该是:文件中有public类。
    那么*是你的文件中的public的类名。
      

  19.   

    对啊,要知道Windows系统是不区分大小写的。
      

  20.   

    这种错误是不应该出现的,java 的规则就是这样的