Java值傳遞和構造函數

一.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參數傳遞的唯一方式,核心是“傳遞副本,不直接操作原變量”。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89967.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89967.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89967.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

電商項目_秒殺_架構及核心

秒殺架構設計先看下普通web項目架構&#xff1a; &#xff08;Nginx : 反向代理、負載均衡&#xff0c;一般是運維部分做生產搭建的時候配置好&#xff09;秒殺架構設計&#xff1a;和普通架構區別&#xff1a;原先由Web 服務或Nginx服務提供的靜態資源放到了CDNNginx的職責放?…

4x4矩陣教程

4x4矩陣教程 1. 簡介 四維矩陣是計算機圖形學和3D變換中的重要工具&#xff0c;用于表示三維空間中的仿射變換。本教程將介紹如何使用C實現四維矩陣的基本運算和變換。 2. 代碼實現 2.1 頭文件 (matrix4x4.h) #ifndef MATRIX4X4_H #define MATRIX4X4_H#include <array> #…

Oracle 數據庫共享池與大池調優指南

在 Oracle 數據庫的內存管理中&#xff0c;共享池&#xff08;Shared Pool&#xff09;和大池&#xff08;Large Pool&#xff09;是 SGA&#xff08;系統全局區&#xff09;中負責緩存與資源分配的核心組件。合理配置和調優這兩個池&#xff0c;能顯著提升數據庫性能 —— 尤其…

C# Lambdab表達式 Var 類

Lambdab 是用于創建一個方法的表達式Func<參數1類型, 參數2類型, 返回值類型> fnName >(參數1 參數2) {方法代碼體}Func<int, int, bool> fnName (int a, int b) > {return a > b; };//調用時和普通方法一致 Console.WriteLine(fnName(10,20)); // false…

【Python】常見模塊及其用法

文章目錄1. 什么是模塊和包&#xff1f;2. 常見的模塊及其用法2.1 time概覽2.1.1 時間獲取方法2.1.2 時間格式化與解析2.1.3 程序計時與延遲2.1.4 時間轉換2.2 random概覽2.2.1 基本隨機數2.2.2 隨機整數2.2.3 序列操作2.2.4 概率分布2.2.5 隨機種子2.2.6 狀態管理2.3 os概覽2.…

洛谷 P3478 [POI 2008] STA-Station

【題目鏈接】 洛谷 P3478 [POI 2008] STA-Station 【題目考點】 1. 樹形動規&#xff1a;換根動規 換根動規&#xff0c;又名二次掃描法&#xff0c;一般是給一顆不定根樹&#xff0c;通過兩次掃描來求解。 我們可以先任選一個根結點root&#xff0c;通過樹形動規的思想計算…

【爬蟲】03 - 爬蟲的基本數據存儲

爬蟲03 - 爬蟲的數據存儲 文章目錄爬蟲03 - 爬蟲的數據存儲一&#xff1a;CSV數據存儲1&#xff1a;基本介紹2&#xff1a;基本使用3&#xff1a;高級使用4&#xff1a;使用示例二&#xff1a;JSON數據存儲1&#xff1a;基礎json讀寫2&#xff1a;字符串和對象的轉換3&#xff…

深入分析計算機網絡數據鏈路層和網絡層面試題

計算機網絡體系結構1. 請簡述 OSI 七層模型和 TCP/IP 四層模型&#xff0c;并比較它們的異同。OSI 七層模型&#xff1a;應用層&#xff1a;直接為用戶的應用進程提供服務&#xff0c;如 HTTP&#xff08;超文本傳輸協議&#xff0c;用于 Web 瀏覽器與服務器通信&#xff09;、…

云服務器新裝的mysql8,無法通過遠程連接,然后本地pymysql也連不上

阿里云服務器&#xff0c;用apt-get新裝的mysql-server&#xff0c;竟然無法通過遠程連接到&#xff0c;竟然是這個原因。不是防火墻&#xff0c;iptables早就關了。也不是安全組&#xff0c;不是人為限制訪問的話&#xff0c;根本沒必要弄安全組 排查過程 netstat -antop|grep…

質量即服務:從測試策略到平臺運營的全鏈路作戰手冊

&#xff08;零&#xff09;為什么需要“質量即服務” 當業務方說“今晚一定要上線”&#xff0c; 當開發說“我只改了兩行代碼”&#xff0c; 當運維說“回滾窗口只有 5 分鐘”&#xff0c; 質量必須像水電一樣隨取隨用&#xff0c;而不是上線前的大壩泄洪。 這篇手冊提供一張…

Java -- 自定義異常--Wrapper類--String類

自定義異常&#xff1a;概念&#xff1a;當程序中出現了某些錯誤&#xff0c;但該錯誤信息并沒有在Throwable子類中描述處理&#xff0c;這個時候可以自己設計異常&#xff0c;用于描述該錯誤信息。步驟&#xff1a;1. 定義類&#xff1a;自定義異常類名&#xff08;程序員自己…

一文速通《線性方程組》

目錄 一、解題必記知識點 二、解題必備技巧 三、非齊次線性方程組求解 四、齊次線性方程組求解 ★五、解析題目信息&#xff0c;獲取暗含條件 一、解題必記知識點 (1) (2)基礎解系線性無關&#xff0c;基礎解系 解空間的一個基&#xff0c;基 一組線性無關的、能夠生…

【Django】DRF API版本和解析器

講解 Python3 下 Django REST Framework (DRF) API 版本控制解析器&#xff08;Parser&#xff09;一、DRF API 版本控制詳解 API 版本控制是構建健壯、可維護的 RESTful API 的關鍵&#xff0c;尤其在項目演進中需要兼容不同版本的客戶端請求。 1.1 API 版本控制的核心原理 AP…

Windows系統暫停更新工具

功能說明 暫停更新至2999年恢復系統更新徹底禁用更新&#xff08;不可逆&#xff09; 使用方法 下載解壓后雙擊運行 .bat 文件 輸入數字選擇功能&#xff1a; 輸入 1&#xff1a;暫停更新至2999年&#xff08;推薦&#xff09;輸入 2&#xff1a;恢復系統更新輸入 3&#xf…

git push新版問題解決

git 好像不能通過username:password的方式來git push了。但我的電腦依然彈出username和password的彈窗。轉戰ssh來git push。由于之前是用git clone克隆的&#xff0c;需要再轉換成ssh的url來git push。

PyCharm + AI 輔助編程

PyCharm AI&#xff1a;初學者友好的 2 個實用場景&#xff08;附操作步驟&#xff09; PyCharm 專業版&#xff08;或通過插件集成&#xff09;支持 AI 輔助編程&#xff08;如 JetBrains AI 或 GitHub Copilot&#xff09;&#xff0c;能根據代碼上下文自動生成代碼、解釋邏…

瘋狂星期四文案網第15天運營日記

網站運營第15天&#xff0c;點擊觀站&#xff1a; 瘋狂星期四 crazy-thursday.com 全網最全的瘋狂星期四文案網站 運營報告 昨日訪問量 昨天只有20來ip, 太慘了&#xff0c;感覺和最近沒有發新段子有關&#xff0c;也沒有發新的外鏈&#xff0c;不知道這周四會怎么樣 昨日搜…

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘Cython’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘Cython’問題 摘要 在使用 PyCharm 控制臺或命令行執行 pip install Cython 時&#xff0c;常會遇到 ModuleNotFoundError: No module named Cython 的報錯。本…

freertos任務調度關鍵函數理解 vTaskSwitchContext

void vTaskSwitchContext(void) {//my_printf( "uxSchedulerSuspended %d\n", uxSchedulerSuspended );/* 調度器處于掛起狀態 */if (uxSchedulerSuspended ! (UBaseType_t)pdFALSE) {/*** The scheduler is currently suspended - do not allow a context* switch.…

CPU 密集型 和 I/O 密集型 任務

文章目錄**CPU 密集型任務&#xff08;CPU-bound&#xff09;**定義&#xff1a;特點&#xff1a;常見場景&#xff1a;如何優化 CPU 密集型任務&#xff1a;**I/O 密集型任務&#xff08;I/O-bound&#xff09;**定義&#xff1a;特點&#xff1a;常見場景&#xff1a;如何優化…