今天碰到了個構造器的問題,在此謹記。如下所示,child類繼承自parent。那麼乙個child物件內部有哪些東西呢?首先他既然是繼承自parent,那麼他必然有parent內部的各個成員。然後他有自己的成員,比如y和member。
那麼這些成員是怎麼初始化的?
public
class
child
extends
parent
@override
protected
void
lala()
}
parent的**如下
public
class parent
}
執行日誌為
parent constructor
member
constructor
child
constructor
構造的時候首先會呼叫父類的構造器,構造父類的各個成員
然後初始化child類裡的像member一樣的成員,這些成員都是直接new的形式初始化的
執行child建構函式的剩餘部分,比如下邊的y。
所以看起來member的建構函式就插在super(x)的後面
我們再看看父類,父類在構造的過程中,呼叫了lala,而lala是多型的。所以在
public
class
child
extends
parent
@override
protected
void
lala()
}
parent的**如下
public
class parent
protected
void
lala()
}
這裡會發生crash,看的出來嗎
在parent構造的過程中,多型呼叫了子類的lala,子類的lala內有member.print();
,但是此時member沒有初始化(只有在父類構造完畢之後member才初始化),所以此時member為空,直接npe掛了。我遇到的bug比這個複雜很多,呼叫沒這麼明顯,所以查了好久才查清楚。
我當時就想,member怎麼可能為null,事實證明member的確有可能為空的,在執行lala的時候child根本就沒有構造完全
java 繼承體系物件的構造過程
先說一下普通物件的構造過程 比如下面 public class hello 1 初始化objec的靜態變數,然後呼叫objec的靜態初始化塊 2 初始化hello的靜態變數,然後呼叫hello的靜態初始化塊 3 初始化object的例項變數,和例項 4 呼叫object的無參建構函式 5 初始化he...
Java 子類構造物件
package day09 在子類構造物件時,發現,訪問子類建構函式時,父類也執行了。為什麼呢?原因是 在子類的建構函式中第一行有乙個預設的隱士語句。super 子類的例項化過程 子類中所有的建構函式預設都會訪問父類中的空引數的建構函式。為什麼子類例項化的時候要訪問父類中的建構函式呢?那是因為子類繼...
java物件的構造
要使用物件首先要構造乙個物件,使用構造器,構造器的名字應該與類的名字相同,並在構造器前面加上new 構造date 類的物件 new date 物件 同時初始化物件 初始化為時間 然後可以對物件使用方法 例如 輸出 system.out.println new date date 類中有乙個將時間變成...