一個繼承了抽象類的普通類的執行順序


今天看《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.

總結,一個繼承了抽象類的普通類的執行順序是:父類的構造函數---子類成員變量的初始化---子類的構造函數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM