Java之成員變量、局部變量和靜態變量的區別

之前在剛開始學習Java的時候,就談了談Java基礎中的變量(見 http://www.linuxidc.com/Linux/2015-02/113862.htm),雖然知道這貨以後會經常用到,但沒想到了基本語法這裏,竟然有冒出來了成員變量、局部變量和靜態變量。變來變去太容易讓人搞暈了,挑揀出來梳理一下嘍!

要想區分這哥仨,首先,我們得知道它們分別是什麼。先從成員變量下刀。

成員變量

       我們來研究一個事物:

               屬性:外在特徵;例如人的身高,體重

               行爲:能夠做什麼;例如人有說話,打球等行爲。

       而在Java語言中,最基本的單位是類,類就是用來體現事物的。

       用類class來描述事物也是如此:

               屬性:對應類中的成員變量

               行爲:對應類中的成員函數

       定義類其實就是在定義類中的成員(成員變量和成員函數)

      拓展:類是一個抽象的概念,而對象就是類的具體的存在,體現。例如:生活中的汽車,可以看做一個類,我們稱之爲汽車類,每一臺車都有顏色和輪胎數(可以定義爲屬性,即成員變量),每一臺車都可以跑(即車的行爲,對應類總的成員函數),我們把汽車實例化一下,即會產生一個對象,比如奔馳、寶馬(BMW)。

Demo1:

public class Car {
        private String color; // 定義汽車顏色,全局變量
        private int numLuntai; // 定義汽車輪胎數,全局變量
 
        public Car(String color, int numLuntai){
                  super();
                  this.color = color;
                  this.numLuntai = numLuntai;
        }
        public void run() {
                  System.out.println(this.numLuntai+ "個輪子的" +this.color + "轎車在馬路上行駛着");
        }
}

 

public class ClassTest {
        public static void main(String[] args){
                  Car bmw = new Car("黑色", 4);      // 創建一個轎車對象,名字爲bmw
                  bmw.run();
        }
}

運行結果:

4個輪子的黑色轎車在馬路上行駛着

      其中color和numLuntai就稱爲Car 類的成員變量,這個屬性能夠用來描述一個類的屬性,否則,它就應該定義爲局部變量

      例如一個for循環中的i即是局部變量。

                  for(int i = 0; i < args.length; i++) {
                          ......
                  }

又例如寫在成員方法中變量是局部變量。

publicclass Car {
        private String color; // 定義汽車顏色,全局變量
        private int numLuntai; // 定義汽車輪胎數,全局變量
        public Car(String color, int numLuntai){
                  super();
                  this.color = color;
                  this.numLuntai = numLuntai;
        }
public void run() {
                  String carName=”寶馬牌”;    //這個就是局部變量
                  System.out.println(this.numLuntai+ "個輪子的" +this.color + carName+"轎車在馬路上行駛着");
        }
}
publicclass ClassTest {
        public static void main(String[] args){
                  Car bmw = new Car("黑色", 4);      // 創建一個轎車對象,名字爲bmw
                  bmw.run();
        }
}

結果:

4個輪子的黑色寶馬牌轎車在馬路上行駛着 

成員變量和局部變量的區別

       成員變量:

          ①成員變量定義在類中,在整個類中都可以被訪問。

          ②成員變量隨着對象的建立而建立,隨着對象的消失而消失,存在於對象所在的堆內存中。

          ③成員變量有默認初始化值。

      局部變量:

          ①局部變量只定義在局部範圍內,如:函數內,語句內等,只在所屬的區域有效。

          ②局部變量存在於棧內存中,作用的範圍結束,變量空間會自動釋放。

          ③局部變量沒有默認初始化值 

      在使用變量時需要遵循的原則爲:就近原則

      首先在局部範圍找,有就使用;接着在成員位置找。

靜態變量

      由static修飾的變量稱爲靜態變量,其實質上就是一個全局變量。如果某個內容是被所有對象所共享,那麼該內容就應該用靜態修飾;沒有被靜態修飾的內容,其實是屬於對象的特殊描述。

示例:

class Person{
      //成員變量,實例變量
      String name;
      //靜態變量,類變量
      //所有對象共享的屬性用static修飾
      static String country = "CN";
      public void show(){
            System. out.println(country + ":" + name);
            //等效語句:System.out.println(Person.country+ ":" + this.name);
      }
}
class StaticDemo{
      public static void main(String[]args){
            Personp = new Person();
            System. out.println(p.country);
            //可以用類名直接調用
            System. out.println(Person.country);
      }
}

結果:

CN

CN 

成員變量和靜態變量的區別

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

            成員變量隨着對象的創建而存在,隨着對象被回收而釋放。

            靜態變量隨着類的加載而存在,隨着類的消失而消失。

      2、調用方式不同

            成員變量只能被對象調用。

            靜態變量可以被對象調用,還可以被類名調用。

      3、別名不同

            成員變量也稱爲實例變量。

            靜態變量也稱爲類變量。

      4、數據存儲位置不同

            成員變量存儲在堆內存的對象中,所以也叫對象的特有數據。

            靜態變量數據存儲在方法區(共享數據區)的靜態區,所以也叫對象的共享數據。

列表對比:

       成員變量、局部變量、靜態變量的區別 

 

成員變量

局部變量

靜態變量

定義位置

 在類中,方法外

方法中,或者方法的形式參數

在類中,方法外

初始化值

有默認初始化值

,先定義,賦值後才能使用

有默認初始化值

調用方式

對象調用

---

對象調用,類名調用

存儲位置

堆中

棧中

方法區

生命週期

與對象共存亡

與方法共存亡

與類共存亡

別名

實例變量

---

類變量

 

小結:

        儘管三者的本質都是變量,可是使用時卻有相當大的區別,稍不留神就可能陷入陷阱。且先記住:在一個類中,如果一個變量能夠用來描述一個類的屬性,那就定義爲成員變量,否則,它就應該定義爲局部變量。而如果一個變量在全局中都能使用(某個內容是被所有對象所共享),那麼我們就可以把這個變量用static來修飾,即爲靜態變量。(還要注意它與靜態方法的緊密聯繫,這裏且不細述了)

發佈了38 篇原創文章 · 獲贊 16 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章