)V 4: return public static void main(java.lang.String[]); Code: 0: getstatic #16; //Field java/lang/System.out
java/io/PrintStream; 3: new #1; //class Test 6: dup 7: invokespecial #22; //Method "<init>"
)V 10: invokevirtual #23; //Method java/lang/Object.toString
)Ljava/lang/String; 13: invokevirtual #27; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 16: return }
从上面两段代码可以看出,Test已经从Object继承了,因此,可以断定Java是属性第1种情况,也就是说由编译器为没有父类的类指定了Object作为其默认父类。如果读者还不确定,可以直接打开Test.class,看看里面有没有Object,图1是Test.class的十六进制代码:
大家可以看到,Java编译器已经为Test指定了一个默认的Object类作为其父类。目前大多数基于虚拟器的语言都是采用的第1种方法来处理默认父类的,如下面的C#代码:
using System; namespace ConsoleApplication1 { class Test { static void Main(string[] args) { Console.WriteLine(new Test().ToString()); } } }
使用ildasm.exe将上面的代码反编译后,得到的MSIL代码如下:
.class private auto ansi beforefieldinit ConsoleApplication1.Test extends [mscorlib]System.Object { } // end of class ConsoleApplication1.Test
从上面的代码可以清楚地看到,Test类已经有一个system.Object作为父类了
-
| 欢迎光临 江西广告网 (http://bbs.jxadw.com/) | Powered by Discuz! X3.2 |