热门问题
时间线
聊天
视角

實例變數

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

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