java物件構造過程

2021-08-04 02:23:49 字數 1256 閱讀 3796

今天碰到了個構造器的問題,在此謹記。如下所示,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 類中有乙個將時間變成...