深入理解Java對象實例生成的例子
class A { public int Avar; public A() { System.out.println("AAA"); doSomething(); } public void doSomething() { Avar = 1111; System.out.println("A.doSomething()"); } } public class B extends A { public int Bvar = 2222; public B() { System.out.println("BBB"); doSomething(); System.out.println("Avar=" + Avar); } public void doSomething() { System.out.println("Bvar=" + Bvar); } public static void main(String[] args) { new B(); } }講解: 順序是這樣得,首先生成B就得先生成A(沒有父,哪來子) 所以調用A的構造器,輸出AAA, 然后調用方法dosomething,!!! 注意:A的該方法被B覆蓋, 而你生成的是B的對象, 所以它調用B的方法, 由于BVAR目前沒有給定值, 所以自動初始化為0, 然后生成B對象, 先初始化變量BVAR, 然后調用構造器輸出BBB, 然后調用方法, 這時BVAR已初始化, 所以輸出BVAR=2222, 而對象A中變量AVAR由于沒有調用對象A的方法dosomething, 所以其值為0,則輸出0 全部輸出就如下: |
????? |
|
AAA
Bvar=0
BBB
Bvar=2222
Avar=0
注意:初始化順序,當繼承時,先生成超類對象,生成對象時,先生成靜態變量,然后是一般變量,然后調用構造器!當所以超類對象生成后,生成本對象,順序一樣! 當方法被覆蓋時,調用目前對象的方法!這得注意。
下面這個題目你能選對答案嗎?:
What will happen when you attempt to compile and run the following code? class Base { int i = 99; public void amethod() { System.out.println("Base.amethod()"); } Base() { amethod(); } } public class Derived extends Base { int i = -1; public static void main(String argv[]) { Base b = new Derived(); System.out.println(b.i); b.amethod(); } public void amethod() { System.out.println("Derived.amethod()"); } } A. Derived.amethod() -1 Derived.amethod() B. Derived.amethod() 99 Derived.amethod() C. 99 Derived.amethod() D. Compile time error
posted on 2006-04-26 15:53 都市淘沙者 閱讀(250) 評論(1) 編輯 收藏 所屬分類: Java Basic/Lucene/開源資料