热门问题
时间线
聊天
视角

實例變量

来自维基百科,自由的百科全书

Remove ads

以類別為基礎物件導向程式設計裏,實例變量('instance variable)是定義在類別裏的變量成員變量),類別裏每一個初始化的物件都有一個此變量的實例,且各物件的實例變量是互相獨立的[1][2]。實例變量類似類變量[3],但實例變量不是靜態變量。在C++或Java語言中,實例變量是在類別中宣告,但是是在構造器方法以外的區域定義。實例變量是在物件初始化時就創建,類別中的所有構造器、方法或塊都可以存取實例變量。也可以對實例變量加上存取修飾詞英語Access modifiers

實例變量不是類變量[4],不過兩者有相似之處。兩者都是類別的屬性(或性質、區段、資料元素)。同一類別不同物件的實例變量可能有不同的值,但同一個類別的類變量只會有一個,不同物件的類變量會共用。。「類別」和「實例」的差異也可以用在方法(成員函數)上,類別可以有實例方法(instance method),也可以有類別方法。

實例變量會儲存在記憶體中,生命周期和其所屬物件的生命周期相同[5]

實例變量是物件的屬性。所有物件都會依其定義,有其自身的實例變量。物件可以更改其實例變量,不會影響其他物件的實例變量。一個物件可以同時有實例變量和類變量。

物件的所有方法都可以使用實例變量,只有類別方法例外。若符合其存取權限,也可以直接設置實例變量[6]

Remove ads

範例

C++

struct Request {

    static int count1; // 變數名稱不重要
    int number;

    Request() {
        number = count1; // 修改實例變數 this->number
        ++count1; // 修改類別變數 Request::count1
    }

};

int Request::count1 = 0;

在上述C++的範例中,實例變量Request::number類變量 Request::count1的複本,每一個實例創建時,都會給予一個count1的數值,之後再進行遞增。因為number是實例變量,每一個物件都有自己的數值。而物件 Request::count1只有一個,每一個物件都共有同一個值。

Java

//Example.java

class Example {
    public int x = 0;
    
    public void setX(int newValue) {
        this.x = newValue;
    }
}

//Main.java

class Main {
    public static void main(String[] args) {
        Example example1 = new Example();
        Example example2 = new Example();
        
        //可以設定x的值,因為此變數為公開變數
        example1.x = 10;
        
        assert example1.x == 10;
        assert example2.x ==  0;
        
        //因為setX是實例方法,也可以存取該變數
        example2.setX(-10);
        
        assert example1.x ==  10;
        assert example2.x == -10;
    }
}

在此Java範例中,可以看到如何只修改一個實例變量,其餘的實例變量不受影響。

Python

class Dog:
    def __init__(self, breed):
        self.breed = breed #類別變數

# dog_1是一個物件
# 也是Dog類別中的一個的實例
dog_1 = Dog("Border Collie")

在上述Python程式中,實例變量是在引數傳入實例時創建的,標示其品種資訊。

參考資料

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads