1. 程式人生 > >成員變數、類變數(靜態變數)、區域性變數的區別

成員變數、類變數(靜態變數)、區域性變數的區別

變數名首寫字母使用小寫,如果由多個單片語成,從第2個單詞開始的其他單詞的首寫字母使用大寫。

如果區域性變數的名字和成員變數的名字相同, 要想在該方法中使用成員變數,必須使用關鍵字this

  1. class People {  
  2.     String name = "類體重定義的name";         //類中的成員變數並賦值
  3.     People(){  
  4.     }  
  5.     publicvoid speak() {  
  6.         String name = "類體方法中定義的name";       //在方法speak中定義和成員變數名字相同的name並賦值
  7.         System.out.println(name);  
  8.         System.out.println(this.name);      //通過this來訪問類中的成員變數
  9.     }  
  10. }  
  11. publicclass TestThis {                              //原始檔中只能有一個類是public類,並且原始檔的名字必須與這個類的名字完全相同,如
  12.                                                          //果沒有public類,那麼原始檔的名字只要和某個類的名字相同就可以了。
  13.     publicstaticvoid main(String[] args) {         
  14.         People myPeople = new People();  
  15.         myPeople.speak();  
  16.     }  
  17. }  
輸出結果:

成員變數和區域性變數的區別

       成員變數:

          1、成員變數定義在類中,在整個類中都可以被訪問。

          2、成員變數隨著物件的建立而建立,隨著物件的消失而消失,存在於物件所在的堆記憶體中。

          3、成員變數有預設初始化值。

      區域性變數:

          1、區域性變數只定義在區域性範圍內,如:函式內,語句內等,只在所屬的區域有效。

          2、區域性變數存在於棧記憶體中,作用的範圍結束,變數空間會自動釋放。

          3、區域性變數沒有預設初始化值 

      在使用變數時需要遵循的原則為:就近原則

      首先在區域性範圍找,有就使用;接著在成員位置找。


成員變數和類變數的區別

由static修飾的變數稱為靜態變數,其實質上就是一個全域性變數。如果某個內容是被所有物件所共享,那麼該內容就應該用靜態修飾;沒有被靜態修飾的內容,其實是屬於物件的特殊描述。

不同的物件的例項變數將被分配不同的記憶體空間, 如果類中的成員變數有類變數,那麼所有物件的這個類變數都分配給相同的一處記憶體,改變其中一個物件的這個類變數會影響其他物件的這個類變數,也就是說物件共享類變數。

  1. class MyAdd {  
  2.     int count = 0;          //成員變數計數器
  3.     staticint sum = 0;     //靜態變數計數器
  4.     String name;  
  5.     MyAdd(String name){  
  6.         this.name = name;  
  7.     }  
  8.     publicvoid myAddMethod() {    
  9.         count++;  
  10.         System.out.println(name+"呼叫成員變數後的值:"+count);  
  11.     }  
  12.     publicvoid staticAddMethod() {    
  13.         sum++;  
  14.         System.out.println(name+"呼叫類後變數的值:"+sum);  
  15.     }  
  16. }  
  17. publicclass TestThis {  
  18.     publicstaticvoid main(String[] args) {  
  19.         MyAdd add1 = new MyAdd("add1");  
  20.         MyAdd add2 = new MyAdd("add2");  
  21.         add1.myAddMethod();  
  22.         add2.myAddMethod();  
  23.         add1.myAddMethod();  
  24.         add1.staticAddMethod();  
  25.         add2.staticAddMethod();  
  26.         add1.staticAddMethod();  
  27.     }  
  28. }  

輸出結果:


成員變數和類變數的區別:

   1、兩個變數的生命週期不同

      成員變數隨著物件的建立而存在,隨著物件的回收而釋放。

      靜態變數隨著類的載入而存在,隨著類的消失而消失。

   2、呼叫方式不同

      成員變數只能被物件呼叫。

      靜態變數可以被物件呼叫,還可以被類名呼叫。

   3、別名不同

      成員變數也稱為例項變數。

      靜態變數也稱為類變數。

   4、資料儲存位置不同

      成員變數儲存在堆記憶體的物件中,所以也叫物件的特有資料。

      靜態變數資料儲存在方法區(共享資料區)的靜態區,所以也叫物件的共享資料。


static:★★★ 關鍵字,是一個修飾符,用於修飾成員(成員變數和成員函式)。

   特點:

   1、想要實現物件中的共性資料的物件共享。可以將這個資料進行靜態修飾。

   2、被靜態修飾的成員,可以直接被類名所呼叫。也就是說,靜態的成員多了一種呼叫方式。類名.靜態方式。

    3、靜態隨著類的載入而載入。而且優先於物件存在。

弊端:

   1、有些資料是物件特有的資料,是不可以被靜態修飾的。因為那樣的話,特有資料會變成物件的共享資料。這樣對事物的描述就出了問題。所以,在定義靜態時,必須要明確,這個資料是否是被物件所共享的。

   2、靜態方法只能訪問靜態成員,不可以訪問非靜態成員。

      因為靜態方法載入時,優先於物件存在,所以沒有辦法訪問物件中的成員。

   3、靜態方法中不能使用this,super關鍵字。

      因為this代表物件,而靜態在時,有可能沒有物件,所以this無法使用。

什麼時候定義靜態成員呢?或者說:定義成員時,到底需不需要被靜態修飾呢?

成員分兩種:

   1、成員變數。(資料共享時靜態化)

      該成員變數的資料是否是所有物件都一樣:

      如果是,那麼該變數需要被靜態修飾,因為是共享的資料。 

      如果不是,那麼就說這是物件的特有資料,要儲存到物件中。 

   2、成員函式。(方法中沒有呼叫特有資料時就定義成靜態)

      如果判斷成員函式是否需要被靜態修飾呢?

      只要參考,該函式內是否訪問了物件中的特有資料:

      如果有訪問特有資料,那方法不能被靜態修飾。

      如果沒有訪問過特有資料,那麼這個方法需要被靜態修飾。

成員變數和靜態變數的區別:

   1、成員變數所屬於物件。所以也稱為例項變數。

      靜態變數所屬於類。所以也稱為類變數。

   2、成員變數存在於堆記憶體中。

      靜態變數存在於方法區中。

   3、成員變數隨著物件建立而存在。隨著物件被回收而消失。

      靜態變數隨著類的載入而存在。隨著類的消失而消失。

   4、成員變數只能被物件所呼叫 。

      靜態變數可以被物件呼叫,也可以被類名呼叫。

   所以,成員變數可以稱為物件的特有資料,靜態變數稱為物件的共享資料。

成員變數:包括例項變數和類變數,用static修飾的是類變數,不用static修飾的是例項變數,所有類的成員變數可以通過this來引用。 區域性變數:包括形參,方法區域性變數,程式碼塊區域性變數,存在於方法的引數列表和方法定義中以及程式碼塊中。 1.成員變數可以被public,protect,private,static等修飾符修飾,而區域性變數不能被控制修飾符及 static修飾;兩者都可以定義成final型。 2.成員變數儲存在堆,區域性變數儲存在棧。區域性變數的作用域僅限於定義它的方法,在該方法的外部無法訪問它。成員變數的作用域在整個類內部都是可見的,所有成員方法都可以使用它。如果訪問許可權允許,還可以在類的外部使用成員變數。 3.區域性變數的生存週期與方法的執行期相同。當方法執行到定義區域性變數的語句時,區域性變數被建立;執行到它所在的作用域的最後一條語句時,區域性變數被銷燬。類的成員變數,如果是例項成員變數,它和物件的生存期相同。而靜態成員變數的生存期是整個程式執行期。 4.成員變數在累載入或例項被建立時,系統自動分配記憶體空間,並在分配空間後自動為成員變數指定初始化值,初始化值為預設值,基本型別的預設值為0,複合型別的預設值為null。(被final修飾且沒有static的必須顯式賦值),區域性變數在定義後必須經過顯式初始化後才能使用,系統不會為區域性變數執行初始化。 5.區域性變數可以和成員變數 同名,且在使用時,區域性變數具有更高的優先順序,直接使用同名訪問,訪問的是區域性變數,如需要訪問成員變數可以用this.變數名訪問

先看下面兩段程式:

程式一:
public class Variable
{
int i;
void test()
{
   int j=8;
   if(j==i)
    System.out.println("相等");
   else
    System.out.println("不相等");
}
public static void main(String[] args)
{
   Variable v=new Variable();
   v.test();
}
}

程式二:
public class Variable
{
   void test()
{
   int i;
   int j=8;
   if(j==i)
    System.out.println("相等");
   else
    System.out.println("不相等");
}
public static void main(String[] args)
{
   Variable v=new Variable();
   v.test();
}
}

----------------------------------------------------------------------------------------------------------

第一個程式很正常,編譯時不會出錯。第二個程式編譯時會提示如下錯誤:

D:\Program\java\test>javac Variable.java
Variable.java:9: 可能尚未初始化變數 i
                if(j==i)
                      ^
1 錯誤

之所以會出現這樣的錯誤是因為:成員變數有預設值,(被final修飾且沒有static的必須顯式賦值),區域性變數不會自動賦值

===========================================================

類體分為兩部分。變數定義部分所定義的變數被稱為類的成員變數,在方法體中定義的變數和方法的引數都被稱為區域性變數

java中成員變數和區域性變數的區別

1.成員變數可以被public,protect,private,static等修飾符修飾,而區域性變數不能被控制修飾符及static修飾;兩者都可以定義成final型 2.成員變數儲存在堆,區域性變數儲存在棧 3.存在時間不同 4.成員變數有預設值,(被final修飾且沒有static的必須顯式賦值),區域性變數不會自動賦值
-------------------------------------------------------------------------------------------------------------
顧名思意了
什麼是區域性,方法內部,塊內部都是區域性,執行指令退出那個區域性,區域性變數自動清除

比如方法中,不用說
塊中
{
  int i=0; //這是一個區域性變數,它的作用範圍就在其中 
}

成員變數就會涉及到誰的成員,類的成員?例項的成員?

class A{
int i=0; //例項的成員
static j=1;//類的成員
}

static 的差別,是否依賴於例項而存在
----------------------------------------------------------------------------------------------------------

成員變數:作為類的成員而存在,直接存在於類中。

區域性變數:作為方法或語句塊的成員而存在,存在於方法的引數列表和方法定義中。

區域性變數在使用前必須被程式設計師主動的初始化,和此形成對比,系統中的成員變數則會被系統提供一個預設的初始值。所以在語法上,類的成員變數能夠定義後直接使用,而區域性變數在定義後先要賦初值,然後才能使用。

所有類的成員變數可以通過this來引用。成員變數又分成倆中型別:例項變數和靜態變數。靜態變數在定義時要使用static關鍵字。