下面这个程序运行的结果让人不理解。
运行结果为:
Parent is creating..//不理解
Son is eat: 0//不理解
Son is creating..
Son is eat: 1
主要是前2句不理解。请高手详细说明之。谢谢
- Java code
/** *Parent.java */public class Parent { private int eatID=0; public Parent(){ System.out.println("Parent is creating.."); eat(); } public void eat(){ System.out.println("Parent is eat: "+eatID); }}
- Java code
/** *Son.java */public class Son extends Parent { private int eatID=1; public Son(){ System.out.println("Son is creating.."); eat(); } public void eat(){ System.out.println("Son is eat: "+eatID); } @SuppressWarnings(value={"unused"}) public static void main(String[] args){ Parent p=new Son(); }}
------解决方案--------------------
- Java code
Classfile /Son.classLast modified 2011-6-26; size 373 bytesMD5 checksum f425bcb4f6d0dbd5e8450c356525a0ebCompiled from "Son.java"public class Son extends Parent SourceFile: "Son.java" minor version: 0 major version: 50 flags: ACC_PUBLIC, ACC_SUPER Constant pool:const #1 = Method #6.#18; // Parent."<init>":()Vconst #2 = Field #4.#19; // Son.eatID:Iconst #3 = Method #4.#20; // Son.eat:()Vconst #4 = class #21; // Sonconst #5 = Method #4.#18; // Son."<init>":()Vconst #6 = class #22; // Parentconst #7 = Asciz eatID;const #8 = Asciz I;const #9 = Asciz <init>;const #10 = Asciz ()V;const #11 = Asciz Code;const #12 = Asciz LineNumberTable;const #13 = Asciz eat;const #14 = Asciz main;const #15 = Asciz ([Ljava/lang/String;)V;const #16 = Asciz SourceFile;const #17 = Asciz Son.java;const #18 = NameAndType #9:#10; // "<init>":()Vconst #19 = NameAndType #7:#8; // eatID:Iconst #20 = NameAndType #13:#10; // eat:()Vconst #21 = Asciz Son;const #22 = Asciz Parent;{public Son(); flags: ACC_PUBLIC Code: Stack=2, Locals=1, Args_size=1 0: aload_0 1: invokespecial #1; //Method Parent."<init>":()V 4: aload_0 5: iconst_1 6: putfield #2; //Field eatID:I 9: aload_0 10: invokevirtual #3; //Method eat:()V 13: return LineNumberTable: line 3: 0 line 2: 4 line 5: 9 line 6: 13public void eat(); flags: ACC_PUBLIC Code: Stack=1, Locals=2, Args_size=1 0: aload_0 1: getfield #2; //Field eatID:I 4: istore_1 5: return LineNumberTable: line 9: 0 line 10: 5public static void main(java.lang.String[]); flags: ACC_PUBLIC, ACC_STATIC Code: Stack=2, Locals=2, Args_size=1 0: new #4; //class Son 3: dup 4: invokespecial #5; //Method "<init>":()V 7: astore_1 8: return LineNumberTable: line 13: 0 line 14: 8}Classfile /Parent.classLast modified 2011-6-26; size 298 bytesMD5 checksum 3a9133d4b82f26cac2da21e973f55e2eCompiled from "Son.java"class Parent extends java.lang.Object SourceFile: "Son.java" minor version: 0 major version: 50 flags: ACC_SUPER Constant pool:const #1 = Method #5.#15; // java/lang/Object."<init>":()Vconst #2 = Field #4.#16; // Parent.eatID:Iconst #3 = Method #4.#17; // Parent.eat:()Vconst #4 = class #18; // Parentconst #5 = class #19; // java/lang/Objectconst #6 = Asciz eatID;const #7 = Asciz I;const #8 = Asciz <init>;const #9 = Asciz ()V;const #10 = Asciz Code;const #11 = Asciz LineNumberTable;const #12 = Asciz eat;const #13 = Asciz SourceFile;const #14 = Asciz Son.java;const #15 = NameAndType #8:#9; // "<init>":()Vconst #16 = NameAndType #6:#7; // eatID:Iconst #17 = NameAndType #12:#9; // eat:()Vconst #18 = Asciz Parent;const #19 = Asciz java/lang/Object;{public Parent(); flags: ACC_PUBLIC Code: Stack=2, Locals=1, Args_size=1 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: aload_0 5: iconst_0 6: putfield #2; //Field eatID:I 9: aload_0 10: invokevirtual #3; //Method eat:()V 13: return LineNumberTable: line 20: 0 line 19: 4 line 22: 9 line 23: 13public void eat(); flags: ACC_PUBLIC Code: Stack=1, Locals=2, Args_size=1 0: aload_0 1: getfield #2; //Field eatID:I 4: istore_1 5: return LineNumberTable: line 26: 0 line 27: 5}