具体问题及源代码参见我的blog:http://blog.sina.com.cn/u/3ca49af3010007jw
我初步怀疑是jdk的bug,不知我的判断正不正确?

解决方案 »

  1.   

    我也有此问题,环境变量都设好了,还可通过javac classname.java,但就是不能通过java  classname.这是什么原因啊,请朋友解答啊
      

  2.   

    你的脚本里面都把Bar.class文件都删除了,JVM当然找不到类啊
      

  3.   

    引用killhuore:
    你的脚本里面都把Bar.class文件都删除了,JVM当然找不到类啊请killhuore看清楚了,为什么"java -cp . Foo2"时没这个错误呢,这才是问题关键所在.
    请大家再仔细看看:
    http://blog.sina.com.cn/u/3ca49af3010007jw
      

  4.   

    这个问题跟java的变量(基本变量和对象)存储方式有关,Foo用到的是String(对象),是一个对象;Foo2用到的是int(基本变量),他们在内存的存放方式不一样,所以编译过程也就不一样。
      

  5.   

    给你用
    javap -verbose  Foo
    javap -verbose  Foo2
    得到的结果,很明显就能看出来原因了:
    1,Foo
    .....
    {
    public Foo();
      Code:
       Stack=1, Locals=1, Args_size=1
       0: aload_0
       1: invokespecial #1; //Method java/lang/Object."<init>":()V
       4: return
      LineNumberTable: 
       line 13: 0public void test(java.lang.Object);
      Code:
       Stack=2, Locals=4, Args_size=2
       0: ldc #2; //String a
       2: astore_2
       3: aload_2
       4: ldc #2; //String a
       6: invokevirtual #3; //Method java/lang/String.equals:(Ljava/lang/Object;)Z
       9: ifeq 20
       12: aload_1
    **************注意点1******************
       13: checkcast #4; //class Bar
       16: astore_3
       17: goto 38
       20: aload_2
       21: ldc #5; //String b
       23: invokevirtual #3; //Method java/lang/String.equals:(Ljava/lang/Object;)Z
       26: ifeq 35
    **************注意点2******************
       29: ldc #6; //String 
       31: astore_3
       32: goto 38
    **************注意点3******************
       35: ldc #6; //String 
       37: astore_3
       38: return
      LineNumberTable: 
       line 15: 0
       line 16: 3
       line 17: 12
       line 18: 17
       line 19: 29
       line 20: 32
       line 21: 35
       line 23: 38public static void main(java.lang.String[]);
      Code:
       Stack=2, Locals=1, Args_size=1
       0: getstatic #7; //Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc #8; //String ok...
       5: invokevirtual #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
      LineNumberTable: 
       line 26: 0
       line 27: 8}
      

  6.   

    2,Foo2
    ..........
    {
    public Foo2();
      Code:
       Stack=1, Locals=1, Args_size=1
       0: aload_0
       1: invokespecial #1; //Method java/lang/Object."<init>":()V
       4: return
      LineNumberTable: 
       line 13: 0public void test(java.lang.Object);
      Code:
       Stack=2, Locals=4, Args_size=2
       0: ldc #2; //String a
       2: astore_2
       3: aload_2
       4: ldc #2; //String a
       6: invokevirtual #3; //Method java/lang/String.equals:(Ljava/lang/Object;)Z
       9: ifeq 20
       12: aload_1
    **************注意点1******************
       13: checkcast #4; //class Bar
       16: astore_3
       17: goto 36
       20: aload_2
       21: ldc #5; //String b
       23: invokevirtual #3; //Method java/lang/String.equals:(Ljava/lang/Object;)Z
       26: ifeq 34
    **************注意点2******************
       29: iconst_0
       30: istore_3
       31: goto 36
    **************注意点3******************
       34: iconst_0
       35: istore_3
       36: return
      LineNumberTable: 
       line 15: 0
       line 16: 3
       line 17: 12
       line 18: 17
       line 19: 29
       line 20: 31
       line 21: 34
       line 23: 36public static void main(java.lang.String[]);
      Code:
       Stack=2, Locals=1, Args_size=1
       0: getstatic #6; //Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc #7; //String ok...
       5: invokevirtual #8; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
      LineNumberTable: 
       line 26: 0
       line 27: 8}