public class c
{
    c()
   {
     System.out.println("c:No public");
   }
}class C
{
  C()
   {
     System.out.println("C:No public");
   }
}class BBB
{
}
大家编译下看。
调换c 和 C的位置。
反正只编出前者来。

解决方案 »

  1.   

    javac 1.6.0_07
    -rw-r--r-- 2008-12-09 02:39 BBB.class
    -rw-r--r-- 2008-12-09 02:39 c.class
    -rw-r--r-- 340 2008-12-09 02:39 C.class没有问题, 都生成了啊
      

  2.   

    你是在Windows上编的吧?
    windows文件名不区分大小写,c.class和C.class被认为是同名的文件,你不可能创建两个的。
    要么改名,要么去Unix-like平台上写这样的代码。
      

  3.   

    4L只是给你展示下在UNIX下编译的结果......
      

  4.   

    正解,因为Java编译器默认的优先级是先编译大写的然后是小写的,所以只能有两个。例如我把你的稍作修改:
    public class c{
      public static void main(String[] args){
    System.out.println("cc:No public");
    }}class C{
    public static void main(String[] args){
    System.out.println("CC:No public");
    }
    }class BBB
    {
    }
    这样你可以运行java C却不能运行java c,原因就在这。
      

  5.   

    纠正一下,我上面说的有点问题,Java是从上往下编译的,采用覆盖的方式。你可以这么证明:用我上面的程序java将会生成2个class文件。一个是c.class,一个是BBB.class,你可以把c.class改为C.class还是可以运行的,这说明它不区分大小写;你要是把它删了还是会生成c.class文件,你要是把class C放在class c的前面,将会编译成C.class文件,但是这时候只有java C可以运行,这说明java编译器是从上往下编译的,采用覆盖的方式。
      

  6.   


    在windows环境下,编译出前者后,若出现同名类,已经编译好的类不会被覆盖
      

  7.   

    如果的确有两个大小写不同的类,那就无法访问到其中一个。
    那十分头疼
    这是JAVA设计时没有想到的吗????
    哈大家都快成Gasling了。
      

  8.   

    这不是java的问题,编译器是区分大小写的。操作系统不区分,java也没办法。
      

  9.   

    我已经理解了!!
    windows操作系统里cmd 下:
    md f 之后建立了一个文件名为f的文件夹
    md F 就会出错:同名文件夹已经存在。
    同理 javac c.java 里的三个类。
    先到先得命名权。实际上是生成三个字节码文件。
    但操作系统只给了两个,后边那个不符合操作系统的规定,被强行逐出!!!我的理解对不对,等高手确认!!
      

  10.   


    Windows平台下,文件系统不区别大小写导致的。。
      

  11.   

    cmd 中编译的class文件时,不区分大小写,总是后一个覆盖前一个
      

  12.   

    不是被强行逐出,是被后面一个 C.class 给覆盖掉了。另外,楼主的这种类命名方式也是极其不规范的!
      

  13.   


    貌似不是后一个被覆盖啊,电脑上自测的结果是:如果已经产生一个class,那么以后若有相同名称的,只是大小写不同的新class,将无法生成