個(gè)人網(wǎng)站開發(fā)視頻系統(tǒng)優(yōu)化大師
如果你現(xiàn)在需要準(zhǔn)備面試,可以關(guān)注我的公眾號(hào):”Tom聊架構(gòu)“,回復(fù)暗號(hào):”578“,領(lǐng)取一份我整理的50W字面試寶典,可以幫助你提高80%的面試通過率,價(jià)值很高!!
- 語法形式:從語法形式上看,成員變量是屬于類的,而局部變量是在代碼塊或方法中定義的變量或是方法的參數(shù);成員變量可以被
public
,private
,static
等修飾符所修飾,而局部變量不能被訪問控制修飾符及static
所修飾;但是,成員變量和局部變量都能被final
所修飾。 - 存儲(chǔ)方式:從變量在內(nèi)存中的存儲(chǔ)方式來看,如果成員變量是使用
static
修飾的,那么這個(gè)成員變量是屬于類的,如果沒有使用static
修飾,這個(gè)成員變量是屬于實(shí)例的。而對(duì)象存在于堆內(nèi)存,局部變量則存在于棧內(nèi)存。 - 生存時(shí)間:從變量在內(nèi)存中的生存時(shí)間上看,成員變量是對(duì)象的一部分,它隨著對(duì)象的創(chuàng)建而存在,而局部變量隨著方法的調(diào)用而自動(dòng)生成,隨著方法的調(diào)用結(jié)束而消亡。
- 默認(rèn)值:從變量是否有默認(rèn)值來看,成員變量如果沒有被賦初始值,則會(huì)自動(dòng)以類型的默認(rèn)值而賦值(一種情況例外:被
final
修飾的成員變量也必須顯式地賦值),而局部變量則不會(huì)自動(dòng)賦值。
為什么成員變量有默認(rèn)值?
-
先不考慮變量類型,如果沒有默認(rèn)值會(huì)怎樣?變量存儲(chǔ)的是內(nèi)存地址對(duì)應(yīng)的任意隨機(jī)值,程序讀取該值運(yùn)行會(huì)出現(xiàn)意外。
-
默認(rèn)值有兩種設(shè)置方式:手動(dòng)和自動(dòng),根據(jù)第一點(diǎn),沒有手動(dòng)賦值一定要自動(dòng)賦值。成員變量在運(yùn)行時(shí)可借助反射等方法手動(dòng)賦值,而局部變量不行。
-
對(duì)于編譯器(javac)來說,局部變量沒賦值很好判斷,可以直接報(bào)錯(cuò)。而成員變量可能是運(yùn)行時(shí)賦值,無法判斷,誤報(bào)“沒默認(rèn)值”又會(huì)影響用戶體驗(yàn),所以采用自動(dòng)賦默認(rèn)值。
成員變量與局部變量代碼示例:
public class VariableExample {// 成員變量private String name;private int age;// 方法中的局部變量public void method() {int num1 = 10; // 棧中分配的局部變量String str = "Hello, world!"; // 棧中分配的局部變量System.out.println(num1);System.out.println(str);}// 帶參數(shù)的方法中的局部變量public void method2(int num2) {int sum = num2 + 10; // 棧中分配的局部變量System.out.println(sum);}// 構(gòu)造方法中的局部變量public VariableExample(String name, int age) {this.name = name; // 對(duì)成員變量進(jìn)行賦值this.age = age; // 對(duì)成員變量進(jìn)行賦值int num3 = 20; // 棧中分配的局部變量String str2 = "Hello, " + this.name + "!"; // 棧中分配的局部變量System.out.println(num3);System.out.println(str2);}
}