1. 程式人生 > >Java筆記:成員變數,區域性變數,類變數,例項變數以及注意事項

Java筆記:成員變數,區域性變數,類變數,例項變數以及注意事項

區域性變數:方法中定義的變數。

成員變數(類似C中的全域性變數):成員變數定義在方法體和語句塊之外。成員變數就概括描述了類中的變數,不區分static。是以下變數的統稱。

類變數(靜態變數):獨立於方法之外的變數,屬於類本身。需要static修飾,事實上,類變數就是以static修飾的獨立於方法之外的成員變數。

類變數必須在方法、構造方法和語句塊之外。
無論一個類建立了多少個物件,類只擁有類變數的一份拷貝。
例項變數(非靜態變數):獨立於方法之外的變數,依賴例項存在。不需要static修飾,事實上,例項變數就是沒有static修飾的獨立於方法之外的成員變數。

例項變數宣告在一個類中,但在方法、構造方法和語句塊之外。
當一個物件被例項化之後,每個例項變數的值就跟著確定。
例項變數在物件建立的時候建立,在物件被銷燬的時候銷燬。
例項變數的值應該至少被一個方法、構造方法或者語句塊引用,使得外部能夠通過這些方式獲取例項變數資訊。
例項變數可以宣告在使用前或者使用後。
例項變數對於類中的方法、構造方法或者語句塊是可見的。一般情況下應該把例項變數設為私有。通過使用訪問修飾符可以使例項變數對子類可見。
例項變數具有預設值。數值型變數的預設值是0,布林型變數的預設值是false,引用型別變數的預設值是null。變數的值可以在宣告時指定,也可以在構造方法中指定。

Example(from CoreJava):

假定公司需要給每一個僱員賦予唯一的標識碼。

分析:每一個僱員物件都有一個自己的id域,但這個類的所有例項將共享一個nextld 域。換句話說,如果有 1000 個Employee類的物件,則有 1000 個例項域 id。但是,只有一個靜態域 nextld。即使沒有一個僱員物件,靜態域 nextld 也存在。它屬於類,而不屬於任何獨立的物件。

程式碼如下(以員工jack作為第一名員工簡單示例):

複製程式碼
1 public class Employee {
2
3 public static int nextId=1;
4 public int id;
5 public void setId(){  //該方法意味著下面new的物件jack的id域(例項域)被設定為靜態域nextld當前的值(1),並且靜態域nextld的值加1
6 id=nextId;
7 nextId++;
8 }
9
10 public void method(){ //定義一個用於輸出標識碼的非靜態方法
11 System.out.println(id);
12 }
13
14 public static void main(String[] args){
15 Employee jack=new Employee(); //new一個叫jack的員工
16 jack.setId(); //呼叫setId方法為jack分配一個標識碼
17 jack.method(); //呼叫method方法輸出jack的標識碼
18 }
19
20 }
複製程式碼

注:無法在靜態變數中引用非靜態成員(非靜態變數,非靜態方法),因為非靜態的變數是依賴於物件存在的,物件必須例項化之後,它的變數才會在記憶體中存在。

  解決方案:一、將變數變為靜態變數,在變數型別前增加static。

       二、先例項化一個物件,然後使用 物件名.變數名 來引用即可。

程式碼如下:

複製程式碼
1 //以下為第二種方法,第一種方法只需在第四行public和String之間增加static即可(name即變為靜態變數)
2 public class Test {
3
4 public String name; //name為非靜態變數
5
6 public static void main(String[] args){
7 Test learner=new Test(); //在主方法(為靜態方法)中要呼叫非靜態變數name,需要先例項化一個物件learner
8 learner.name="西柚冬瓜"; //然後採用 物件名.變數名 方式來在主方法中引用非靜態變數name
9 System.out.println(learner.name);
10 }
11 歡迎工作一到五年的Java工程師朋友們加入Java群: 891219277
群內提供免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、Spring原始碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!

12 }
複製程式碼