Java里局部變量和成員變量的隱式初始化

注:本文是對另一篇文檔( https://blog.csdn.net/duke_ding2/article/details/142365872 )的補充。

文章目錄

  • 環境
  • 初始化
    • 局部變量(棧)
    • 成員變量(堆)
    • 其它
      • 數組
  • 分析
    • 安全性
    • 性能
    • 成員變量 VS. 局部變量
  • 總結

環境

  • Windows 11 專業版
  • Java 21

初始化

局部變量(棧)

局部變量不會自動初始化,所以必須要先賦值,再使用。

    public static void main(String[] args) {int n1 = 0;int n2;System.out.println("n1: " + n1);System.out.println("n2: " + n2); // 編譯錯誤:變量沒有初始化boolean b1 = false;boolean b2;System.out.println("b1: " + b1);System.out.println("b2: " + b2); // 編譯錯誤:變量沒有初始化Object o1 = null;Object o2;System.out.println("o1: " + o1);System.out.println("o2: " + o2); // 編譯錯誤:變量沒有初始化}

注意:在Java 21之前(比如Java 17),對于引用類型的局部變量(比如上例中的 o2 ),是會自動初始化為null的。Java 21引入了更加嚴格的限制,所有局部變量都必須先賦值,再使用

成員變量(堆)

成員變量會自動初始化為 0falsenull 等。

public class Test1212_31 {private int n1;private boolean b1;private Object o1;public static void main(String[] args) {var obj = new Test1212_31();System.out.println(obj.n1);System.out.println(obj.b1);System.out.println(obj.o1);}
}

輸出結果如下:

0
false
null

其它

數組

在Java里,數組是對象,所以,創建數組后,數組里的元素可以隱式的初始化( 0falsenull 等)。

數組對象是在堆上創建的,可以把數組里的元素想象成類似數組對象的成員變量。

(注意:Java的數組是定長的,一旦創建了數組對象,其長度就不能變化了。當然,對于多維數組,只有最高維是不能變化的。)

    public static void main(String[] args) {int[] arr1 = new int[3];for (int n : arr1)System.out.println(n);boolean[] arr2 = new boolean[3];for(boolean b : arr2)System.out.println(b);Object[] arr3 = new Object[3];for (Object o : arr3)System.out.println(o);}

輸出結果如下:

0
0
0
false
false
false
null
null
null

分析

局部變量不會自動初始化,成員變量會自動初始化。為什么要如此設計呢?

安全性

“先賦值,再使用”是一個通用的法則,通常我們也是這么做的,很少出現不賦值就使用的情況。

如果不清楚語言特性,那么“先賦值,再使用”顯然是一個good practice。如果不賦值就使用,那么假如沒有隱式初始化,則可能會出現無法預料的結果(因為變量的值無法預料)。通過強制程序員初始化變量,Java編譯器可以在編譯階段就發現這些問題,提高代碼的質量和安全性。

性能

我們知道,局部變量是在棧(stack)里的,其特點是生命周期較短,而調用較頻繁,比如:

    public void foo(int arg1) {int n1;n1 = arg1 * 2;......}

foo() 方法可能會被頻繁調用,如果 n1 隱式初始化為 0 ,顯然在頻繁調用 foo() 方法時,其開銷會更大(而且一般也沒有必要)。

再看另外一個例子:

    public void bar() {for (int i = 0; i < 100; i++) {int temp;temp = i * 2;......}}

temp 變量是在循環內部定義的,和上一個例子類似,在循環次數很多時,隱式初始化的開銷會更大(而且一般也沒有必要)。

成員變量 VS. 局部變量

我們知道,對象是在堆(heap)上創建,所以,對象的成員變量也是在堆上的。對象的特點(相對于局部變量)是:

  • 數量較少
  • 生命周期較長

可能是為了幫助程序員確保對象的一致性和完整性,編譯器對成員變量進行了隱式初始化。由于數量相對比較少,隱式初始化的開銷也不算特別大。

如果沒有隱式初始化,程序員很可能需要在對象的構造方法里對成員變量做初始化。隱式初始化使得代碼更加簡潔,程序員可以集中精力在更重要的事情上面。

總結

  • 局部變量(在棧上創建)沒有隱式初始化,必須先賦值,再使用
  • 成員變量(在堆上創建)會隱式初始化( 0falsenull 等),可以直接使用

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

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

相關文章

孚盟云 MailAjax.ashx SQL注入漏洞復現

0x01 產品簡介 上海孚盟軟件有限公司是一家外貿SaaS服務提供商,也是專業的外貿行業解決方案專業提供商。 全新的孚盟云產品,讓用戶可以用云模式實現信息化管理,讓用戶的異地辦公更加流暢,大大降低中小企業在信息化上成本,用最小的投入享受大型企業級別的信息化服務,主要…

“切片賦值”創建列表批量操作“新”方法(Python)

[start:end]切片賦值&#xff0c;擴展了list批量增減元素的操作能力。 (筆記模板由python腳本于2024年12月06日 15:07:56創建&#xff0c;本篇筆記適合研python基礎的coder翻閱) 【學習的細節是歡悅的歷程】 Python 官網&#xff1a;https://www.python.org/ Free&#xff1a;…

LabVIEW實現GPS通信

目錄 1、GPS通信原理 2、硬件環境部署 3、程序架構 4、前面板設計 5、程序框圖設計 6、測試驗證 本專欄以LabVIEW為開發平臺,講解物聯網通信組網原理與開發方法,覆蓋RS232、TCP、MQTT、藍牙、Wi-Fi、NB-IoT等協議。 結合實際案例,展示如何利用LabVIEW和常用模塊實現物聯網系…

Java簡介:打開通往變成世界的大門

Java是什么&#xff1f;為什么它是全球開發者廣泛使用的語言&#xff1f;本篇文章介紹Java的特點、應用場景以及“寫一次&#xff0c;隨處運行”的核心特性&#xff0c;讓零基礎的你建立對Java語言的初步認知。 注&#xff1a;此文章可以僅作了解&#xff0c;不影響之后的學習。…

Unraid實現相冊同步與展示的方案探討

背景&#xff1a;Unraid作為一個NAS系統&#xff0c;能夠實現基本的NAS文件管理功能&#xff0c;但是不提供額外的功能如影音、同步、辦公、和內網穿透等&#xff0c;這些在其他的NAS產品如群暉、綠聯、威聯通等都是提供支持的。然而unraid也有其他方案&#xff0c;即通過特別方…

常見的網絡攻擊手段

IP 欺騙 IP 是什么? 在網絡中&#xff0c;所有的設備都會分配一個地址。這個地址就仿佛小藍的家地址「多少號多少室」&#xff0c;這個號就是分配給整個子網的&#xff0c;「室」對應的號碼即分配給子網中計算機的&#xff0c;這就是網絡中的地址。「號」對應的號碼為網絡號…

積分形式的輻射傳輸方程

The Equation of Transfer in Integral Form Let L L L be the streaming-collision operator, and S S S is scattering operator, we have L I Ω ? ? I ( r , Ω ) σ ( r , Ω ) I ( r , Ω ) LI\Omega\cdot\nabla I(r,\Omega)\sigma(r,\Omega)I(r,\Omega) LIΩ??…

JS中reduce方法

JavaScript 中的 reduce 方法是一個非常強大的數組方法&#xff0c;它允許你對數組中的所有元素執行一個“reducer”函數&#xff0c;從而將數組“減少”到一個單一的值。以下是 reduce 方法的詳細介紹&#xff1a; 語法 array.reduce(function(accumulator, currentValue, c…

印閃網絡:阿里云數據庫MongoDB版助力金融科技出海企業降本增效

客戶背景 上海印閃網絡科技有限公司&#xff0c;于2017年1月成立&#xff0c;投資方包括紅杉資本等多家國際知名風投公司。公司業務聚焦東南亞普惠金融&#xff0c;常年穩居行業頭部。創始團隊來自騰訊&#xff0c;中國團隊主要由運營、風控及產研人員組成&#xff0c;核心成員…

【后端面試總結】HTTPS工作原理詳解

引言 在現代網絡通信中&#xff0c;數據的安全性至關重要。HTTP&#xff08;Hypertext Transfer Protocol&#xff09;作為互聯網上傳輸數據的協議&#xff0c;雖然應用廣泛&#xff0c;但其數據以明文形式傳輸&#xff0c;存在被竊取和篡改的風險。為此&#xff0c;HTTPS&…

51c嵌入式~單片機~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、不同的電平信號的MCU怎么通信&#xff1f; 下面這個“電平轉換”電路&#xff0c;理解后令人心情愉快。電路設計其實也可以很有趣。 先說一說這個電路的用途&#xff1a;當兩個MCU在不同的工作電壓下工作&a…

Java 基礎知識——part 1

1.目前Java平臺有三種版本&#xff1a; Java SE&#xff1a;用于開發桌面應用程序 Java EE&#xff1a;用于編寫企業級應用程序 Java ME&#xff1a;用于開發設備應用程序 2.Applet可嵌入Web文檔的一種小型程序&#xff0c;因網絡傳輸速度關系都很短小 3.Appilication&…

【云計算】虛擬化技術

目錄 1. 虛擬化技術在云計算中的那些地方發揮了關鍵作用&#xff1f; 2. 比較VMare&#xff0c;Xen等虛擬化產品的關鍵技術&#xff0c;以及對云計算技術提供的支持&#xff1f; 3. 服務器虛擬化&#xff0c;存儲虛擬化和網絡虛擬化都有哪些實現方式&#xff1f; 4. 討論桌面…

力扣題目 - 2931.購買物品的最大開銷

題目 還需要你前往力扣官網查看詳細的題目要求 地址 思路 這邊需要你去力扣官網詳細查看題目看了題目提供的示例 已經有了解法, 先把values轉成1維數組,排序之后進行累加即可 代碼 var maxSpending function (values) {let list values.flat();list.sort((a, b) > a - …

嵌入式驅動開發詳解6(RTC)

文章目錄 前言RTC簡介RTC驅動分析RTC驅動框架RTC驅動實現 RTC應用后續 前言 實時時鐘是很常用的一個外設&#xff0c;通過實時時鐘我們就可以知道年、月、日和時間等信息。 因此在需要記錄時間的場合就需要實時時鐘&#xff0c;可以使用專用的實時時鐘芯片來完成此功能&#x…

單片機:實現跑馬燈(附帶源碼)

單片機實現跑馬燈 跑馬燈&#xff08;也稱作流水燈&#xff09;是一種常見的電子效果&#xff0c;通過依次點亮和熄滅多個LED燈&#xff0c;模擬出一個燈光流動的效果。跑馬燈常見于裝飾性電子產品中&#xff0c;也是一種展示單片機控制多路輸出的基礎應用。 在本項目中&…

力扣題目 - 935. 騎士撥號器

題目 還需要你前往力扣官網查看詳細的題目要求 地址 1.象棋騎士有一個獨特的移動方式&#xff0c;它可以垂直移動兩個方格&#xff0c;水平移動一個方格&#xff0c;或者水平移動兩個方格&#xff0c;垂直移動一個方格(兩者都形成一個 L 的形狀)。2.象棋騎士可能的移動方式如下…

傳輸層7——TCP擁塞控制(重點!!!)

目錄 一、認識擁塞控制 1、什么叫做擁塞&#xff1f; 2、擁塞的特點 3、流量控制 VS 擁塞控制 二、TCP如何防止擁塞&#xff1f; 1、慢開始 2、擁塞避免 3、3重復確認 和 快重傳算法 4、快恢復算法 5、總結 三、主動隊列管理AQM 1、技術背景 2、AQM思 想和實現策略…

PostgreSQL/PostGIS中提升空間查詢(分析)性能(效率)的一些方法

目錄 1. 使用適當的索引 1.1 索引類型 1.2 分析查詢計劃 1.3 覆蓋索引 1.4 復合索引 1.5 維護索引 1.6 刪除不必要的索引 1.7 使用適當的數據類型 2. 建立分區表 2.1 分區表的基本概念 2.2 創建分區表的步驟 2.3 空間數據的分區 2.4 分區表優點 3. 簡化幾何形狀 …

輪播(css+js)

目錄 1.實現效果 2.基礎代碼演示 2.1js代碼 2.1css樣式 2.3實現效果 3.實現點擊切換 3.1給button添加點擊事件 3.2效果圖如下 3.3發現問題 3.3.1不循環 3.3.2循環 1.實現效果 2.基礎代碼演示 2.1js代碼 <div class"out-box"><div class"tes…