類的初始化學習

2021-06-26 13:30:08 字數 1691 閱讀 6760

1.類的成員變數會自動進行初始化:

基本型別:0

引用型別:null

2.區域性變數必須進行初始化!否則報錯!

3.對於類的成員變數初始化操作,比如

int a=9;

實際上進行的操作是:

int a=0;

a=9;

所以在賦值前先進行了初始化操作.

這樣可以確保任何成員變數都先執行了初始化工作

4.在類的內部,即使變數定義散布於方法定義間,他們仍然會在任何方法(包括構造器)被呼叫之前得到初始化,變數定義的先後順序決定了初始化的順序.eg:

class window

}class house

window w2=new window(2);

void f()

window w3=new window(3);

}public class money

}

output:

window:1

window:2

window:3

house()

f()window:5

在主函式中,house h=new house();

因此需要初始化house,當程式訪問house這一class的時候,則會先將成員變數中的變數按照定義順率進行初始化,然後再執行建構函式

所以初始化順序為

1.window w1=new window(1)

2.window w2=new window(2)

3.window w3=new window(3)

接下來是才可以訪問建構函式

4.system.out.println("house");

然後訪問h.f()方法,方法中的變數不會自動執行初始化

5.system.out.println("f()");

6.window w5=new window(5);

由於在初始化house這乙個類的時候就會將其成員變數進行初始化,所以以下**可以正常執行

class house

window w2=new window(2);

void f()

window w3=new window(3);

}

雖然w2.x所在的位置在window w2=new window(2)之後,但是由於提前進行了初始化操作,所以是不會報錯的.

那麼如果我們只是定義了物件而沒有new乙個引用呢?

比如:window w1;

那麼還會初始化w1嗎?

答案是會初始化

但是初始化的物件是null。這種初始化是編譯器進行的操作,並不會呼叫建構函式!

最後還有乙個關於staitc和非static的區別

eg:

class window 

}class house

}public class money

}

由於house類中有window類,所以當我們訪問house類的時候會對window類中的成員變數進行初始化

而又因為window類中有house類的成員變數,所以又會初始化house類中的成員變數,所以造成了迴圈,編譯器報錯

如何解決這個問題呢?

1.斷開二者的迴圈

2.將其中乙個成員變數設定為static型別,這樣就只進行初始化一次了!

類初始化學習筆記

例 person 人 就是類,王思聰就是這個 person 類的物件,他的身高 體重等就是物件的屬性。類名 物件名 new類名 先執行靜態 塊,且只執行一次。構造 塊每次呼叫構造方法都執行。class fu public fu public int test public static int me...

類的初始化

類的初始化通產有3種型別 使用初始化列表,在建構函式體中賦值,以及使用預設建構函式。先說前兩種 初始化列表與在建構函式體中賦值的區別在 呢?主要有兩點 第一,有的成員不能使用函式體中的 初始化。這其實就是初始化與賦值的區別 比如比如const 成員,引用型別,以及沒有定義預設建構函式的類,它們都必須...

類的初始化

類的初始化通產有3種型別 使用初始化列表,在建構函式體中賦值,以及使用預設建構函式。先說前兩種 初始化列表與在建構函式體中賦值的區別在 呢?主要有兩點 第一,有的成員不能使用函式體中的 初始化。這其實就是初始化與賦值的區別 比如比如const 成員,引用型別,以及沒有定義預設建構函式的類,它們都必須...