今天看《java編程思想》抽象類那節的時候,做了一個練習題3(p171頁),發現了一個很有意思的東西,一個繼承了抽象類的普通類的執行順序是怎樣的呢?
package JavaChoiceQuestion; /** * @Auther: 李景然 * @Date: 2018/4/13 19:45 * @Description: */
//抽象類
public abstract class AbstractClass { public static void main(String[] args){ NotAbstractClass n=new NotAbstractClass(); n.print(); } public abstract void print(); public AbstractClass(){ print(); } } //實現抽象類的普通類
class NotAbstractClass extends AbstractClass { private int num=1; public NotAbstractClass(){ ... } public void print(){ System.out.println(num); } }
執行的結果是:
0
1
分析:
main函數執行的時候
先執行main函數中的第一句:NotAbstractClass n=new NotAbstractClass();輸出的是0.
這一句的執行順序如下:
1、先進入到NotAbstractClass的構造函數,然后先去執行其父類的構造函數,父類的構造函數執行print()方法,但是子類實現了這個方法,所以會去執行System.out.println(num);這時的num還未進行賦值,所以此時num是默認值0.
2、執行完父類的構造函數,會去執行子類的成員變量的初始化,這時會執行private int num=1;此時num被賦值為1,
3、最后,執行子類構造函數中的代碼...
然后main函數執行第二句:n.print();,輸出是1.
總結,一個繼承了抽象類的普通類的執行順序是:父類的構造函數---子類成員變量的初始化---子類的構造函數