成員變數就是在類中宣告的變數,也稱為例項變數,它們儲存在堆記憶體當中,可以被類的所有方法訪問。
區域性變數就是在方法、建構函式或程式碼塊中定義的變數,只能在其所屬的作用域內使用,它們儲存在棧記憶體中,當其所屬的方法執行完畢後就會被銷燬。
1.成員變數
成員變數分為靜態變數和例項變數兩種。
類變數是所有物件共有,其中一個物件將它值改變,其他物件得到的就是改變後的結果;而例項變數則為物件私有,某一個物件將其值改變,不影響其他物件。
靜態變數(類變數)
靜態變數是被 static 修飾的,它從該類的準備階段就存在了,直到系統銷燬這個類,靜態變數的作用域與這個類的生存範圍相同;
static String name; //靜態變數
訪問方法:
類.靜態變數:
Student.name="張三"; System.out.println(Student.name);//輸出:張三
例項.靜態變數(不推薦):
Student s1=new Student(); Student s2=new Student(); //一般不推薦這樣引用靜態成員變數: 可以在類的多個方法中共享資料,提高程式碼的靈活性和複用性。 物件的狀態可以透過成員變數來描述和記錄。 區域性變數: 節省記憶體空間,避免長時間佔用記憶體。 提供了臨時儲存資料的功能,方便控制程式流程。變數 s1.name="amber"; s2.name="doris"; System.out.println(s1.name);//輸出的是doris,因為兩個例項指向的是同一個靜態變數
例項變數
例項變數沒有 static 修飾,它從該類的例項被建立時就存在,直到系統銷燬這個例項,例項變數的作用域與對應例項的生存範圍相同
int age;//例項變數
訪問方法:
例項.例項變數:
Student s1=new Student(); Student s2=new Student(); s1.age=15; s2.age=18; System.out.println(s1.age); //輸出:15 System.out.println(s2.age); //輸出:18
2.區域性變數
區域性變數僅作用在區域性區域中,從定義開始到大括號或者 return 結束,生命週期短。區域性變數可以先定義再初始化,也可以定義的同時初始化,區域性變數沒有預設初始值,必須要初始化值後才能使用。
錯誤示例:
public void test(){ int height;//區域性變數 System.out.println(height);//報錯,此時height變數並沒有初始化 }
修改後程式碼:
public void test(){ int height=185;//區域性變數 System.out.println(height);//height有初始值,故輸出185 }
成員變數和區域性變數的位置對比
public class Student { static String name; //類變數 int age; //例項變數 public void test(){ int height; //成員變數 height=180; System.out.println(height); } }
3.成員變數和區域性變數區別大總結
區別 | 成員變數 | 區域性變數 |
---|---|---|
作用域 | 整個類 | 在其所屬的方法、建構函式或程式碼塊內 |
儲存位置 | 堆記憶體 | 棧記憶體 |
生命週期 | 與物件相同,當物件被銷燬時纔會釋放 | 僅限於其所屬方法、建構函式或程式碼塊的執行期間 |
類中宣告的位置 | 類中方法外 | 通常在方法中 |
預設值 | 有預設初始值(如 int 型別為 0) | 沒有預設初始值,必須初始化後才能使用 |
4.兩者使用的注意事項
成員變數的注意事項
應該根據需求選擇合適的訪問修飾符(如 private、protected、public)來控制其可見性。
需要考慮執行緒安全問題,可以使用 synchronized 關鍵字或其他同步機制進行保護。
區域性變數的注意事項
在使用前必須顯式初始化,否則會編譯錯誤。
不同的方法中可以使用相同名稱的區域性變數,但不會產生衝突,因為它們具有不同的作用域。
成員變數可以在類的多個方法中共享資料,提高程式碼的靈活性和複用性,物件的狀態可以透過成員變數來描述和記錄。區域性變數節省記憶體空間,避免長時間佔用記憶體,提供了臨時儲存資料的功能,方便控制程式流程。二者都是 Java 中常用的變數型別,合理使用它們可以更好地管理我們的資料和程式流程。