一.Java值傳遞
?首先我們來看一串代碼:
輸出 10 20,而不是20 10 這是為什么呢?
有內存圖可以知道,這個change方法所改變的東西最終沒有寫回到main之中,且他傳的是具體的數據,所以還會輸出原數據,就相當于change是一塊獨立的空間方法,他怎么操作和main完全沒有關系。
?
再來看這一段代碼:
他會輸出{1,88,99,4,5}是改變之后的數據,這又是為什么,不是傳不到嗎?
?答案是否定的,數組在傳遞是永遠不會傳遞里面的數值,而是傳遞他數組的地址,這時候方法里拿到的是他的地址,方法直接對地址操作,結果回頭同步到原數組里。所以它可以傳輸
再來看下一段:
這個就和上一個同理,因為操作的是地址,所以方法操作會回顯
?那么,我們來改一下
輸出 張三 18,李四 20不變
有內存圖可知,change方法里依舊是自己在做交換,并沒有操作地址,沒有操作值里面的name,age字樣,所以輸出結果不變
在改變一下:
?輸出李四 18,張三 20
此時的change方法里有明顯的name字樣,說明操作的是地址,是值,會改變原有的數據
再來看最后一道題:
輸出null 42 42
首先他要輸出two.x的值,而byte x并沒有設置值,所以為null;
然后她以上一個創建的two為模板,只不過調用了一個fix創建了two2,此時two調用了fix方法將地址改為了tt,x的值改為了42,而two2也一樣,所以是42 42
二.java構造函數?
構造函數的定義
構造函數(Constructor)是Java類中一種特殊的方法,用于創建對象時初始化對象的成員變量。其特點如下:
- 方法名與類名完全相同,且沒有返回值(包括?void?也不能寫)。
- 不能被?static?、?final?、?abstract?等修飾符修飾。
構造函數的分類與基本使用
1.?默認構造函數
若類中未顯式定義構造函數,編譯器會自動生成一個無參數的默認構造函數,其作用是初始化對象但不做具體賦值。
例:
class Person {}?
// 編譯器自動生成默認構造函數:public Person() {
}
?
2.?自定義構造函數
可根據需求定義帶參數的構造函數,用于在創建對象時直接為成員變量賦值,避免創建后再手動設置。
例:
class Person {String name;int age;// 自定義帶參數的構造函數public Person(String n, int a) {name = n;age = a;}
}
// 使用:創建對象時直接賦值
Person p = new Person("張三", 20);?
應用場景
1.?對象初始化:創建對象時一次性完成成員變量的賦值,保證對象創建后處于有效狀態。
例:通過構造函數確保?Person?對象必須有?name?和?age?,避免出現未賦值的空對象。
2.?重載與靈活性:一個類可以定義多個參數不同的構造函數(重載),滿足不同創建需求。
例:
class Person {String name;int age;// 無參構造public Person() {}?// 帶一個參數public Person(String n) { name = n; }// 帶兩個參數public Person(String n, int a) { name = n; age = a; }
}
// 可根據需求選擇構造方式
Person p1 = new Person();?
Person p2 = new Person("李四");
?
3.?封裝與安全性:通過構造函數控制成員變量的初始化邏輯(如參數校驗),避免無效值。
例:
public Person(int age) {
if (age < 0) {
throw new IllegalArgumentException("年齡不能為負數");
}
this.age = age;
}
4.核心特點
- 名稱特殊:方法名必須與所在類的類名完全一致(包括大小寫)。
- 無返回值:不允許聲明返回類型,甚至不能寫?void?。
- 自動調用:創建對象時(使用?new?關鍵字)會自動調用,無需手動調用。
- 默認存在:若類中未顯式定義任何構造函數,編譯器會自動生成一個無參數的默認構造函數;一旦定義了自定義構造函數,默認構造函數就會失效(若需使用,需手動顯式定義)。
- 支持重載:一個類中可以有多個構造函數,只要參數列表(參數類型、數量、順序)不同,即構成重載,以適應不同的初始化需求。
- 作用單一:主要用于對象創建時的初始化操作(如給成員變量賦值、參數校驗等),不能像普通方法一樣被多次調用。
?
簡言之,構造函數是對象創建的“初始化工具”,通過它可以規范對象的創建過程,提高代碼的安全性和簡潔性。
總結:
Java構造函數
構造函數是類中用于初始化對象的特殊方法,核心特點和作用如下:
1.?定義特征
- 方法名與類名完全一致,無返回值(包括?void?)。
- 不能被?static?、?final?等修飾符修飾。
2.?核心作用
- 創建對象時自動調用,用于初始化成員變量(如?new Person("張三", 20)?)。
- 若未顯式定義,編譯器會生成無參默認構造函數;若自定義了構造函數,默認構造函數需手動添加。
3.?關鍵特性
- 支持重載(參數列表不同),滿足不同初始化需求。
- 僅在對象創建時執行一次,無法像普通方法那樣被多次調用。
Java值傳遞
Java中方法參數的傳遞方式只有“值傳遞”,即傳遞的是參數的副本,而非原變量本身:
1.?定義
- 當參數為基本類型(如?int?、?char?)時,傳遞的是具體數值的副本,修改形參不會影響實參。
例:
void change(int num) {num = 100;}?
int a = 10;change(a); // a仍為10(形參修改不影響實參)
?
- 當參數為引用類型(如對象、數組)時,傳遞的是對象地址的副本,通過副本修改對象內部屬性會影響原對象,但修改引用本身(如指向新對象)不會影響原引用。
例:
class Person {
int age;
}
void changeAge(Person p) {
p.age = 20;
} // 修改內部屬性,影響原對象
void changeRef(Person p) {
p = new Person();
} // 修改引用,不影響原對象
帶實際變量名的就會傳遞
2.?本質
- 無論參數類型如何,傳遞的都是“值的副本”:基本類型傳數值副本,引用類型傳地址副本。
總結
- 構造函數是對象初始化的“專屬工具”,確保對象創建時處于有效狀態;
- 值傳遞是Java參數傳遞的唯一方式,核心是“傳遞副本,不直接操作原變量”。