天天看點

java繼承時,執行個體化子類,是否會預設調用父類構造方法

B繼承A

B x = new B();//會不會調用A的構造函數?

在 Java 中,無論是 explicit 還是 implicit 方式,都要求在子類的構造方法中調用其父類的構造方法。如果父類無構造方法(其實是一個預設無參的構造方法),那麼子類的構造方法中會自動進行調用;如果 父類有自己的構造方法(這時父類不會有預設無參的構造方法),那麼在子類的構造方法中,必須要調用父類的某個構造方法,而且必須是在構造方法的第一個語句 中進行調用。

        究其原因,想必是 Java 語言設計者,要求子類有責任保證它所繼承的父類盡快進入到一個穩定、完整的狀态中。試想,如果沒有這個限制,那麼子類的某個繼承自父類的方法可能會使用到父類中的一些變量,而這些變量并沒有進行初始化,進而産生一些難以預料的後果。

        也是以,當一個類的構造方法是 private 時,它是不可被 extends 的,因為子類構造方法難以調用到這個父類的構造方法。

會調用B的無參構造方法,需要強調的是構造方法是不能被繼承的,但可以用super通路。

一個類繼承一個父類時,當執行個體化子類的時候,子類的初始化順序是這樣的:

     1、如果子類中有字段,則先初始化子類的字段。      2、初始化基類,基類如果存在字段,則先初始化字段,再執行構造方法。      3、執行子類的構造方法。

說白了就是: 先子類字段初始化 然後父類字段初始化 再執行父類構造函數 最後執行子類構造函數

本文轉自農夫山泉别墅部落格園部落格,原文連結:http://www.cnblogs.com/yaowen/archive/2013/03/28/2987132.html,如需轉載請自行聯系原作者