天天看點

Java基礎——成員變量、局部變量和靜态變量的差別

成員變量

       我們來研究一個事物:

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

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

       而在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即是局部變量。

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

  2. ......

  3. }

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

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來修飾,即為靜态變量。(還要注意它與靜态方法的緊密聯系,這裡且不細述了

參考:https://blog.csdn.net/Noreaday/article/details/79711004

繼續閱讀