热门问题
时间线
聊天
视角
實例變量
来自维基百科,自由的百科全书
Remove ads
在以類別為基礎、物件導向程式設計裏,實例變量('instance variable)是定義在類別裏的變量(成員變量),類別裏每一個初始化的物件都有一個此變量的實例,且各物件的實例變量是互相獨立的[1][2]。實例變量類似類變量[3],但實例變量不是靜態變量。在C++或Java語言中,實例變量是在類別中宣告,但是是在構造器、方法、塊以外的區域定義。實例變量是在物件初始化時就創建,類別中的所有構造器、方法或塊都可以存取實例變量。也可以對實例變量加上存取修飾詞。
實例變量不是類變量[4],不過兩者有相似之處。兩者都是類別的屬性(或性質、區段、資料元素)。同一類別不同物件的實例變量可能有不同的值,但同一個類別的類變量只會有一個,不同物件的類變量會共用。。「類別」和「實例」的差異也可以用在方法(成員函數)上,類別可以有實例方法(instance method),也可以有類別方法。
實例變量會儲存在記憶體中,生命周期和其所屬物件的生命周期相同[5]。
實例變量是物件的屬性。所有物件都會依其定義,有其自身的實例變量。物件可以更改其實例變量,不會影響其他物件的實例變量。一個物件可以同時有實例變量和類變量。
物件的所有方法都可以使用實例變量,只有類別方法例外。若符合其存取權限,也可以直接設置實例變量[6]。
Remove ads
範例
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只有一個,每一個物件都共有同一個值。
//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範例中,可以看到如何只修改一個實例變量,其餘的實例變量不受影響。
class Dog:
def __init__(self, breed):
self.breed = breed #類別變數
# dog_1是一個物件
# 也是Dog類別中的一個的實例
dog_1 = Dog("Border Collie")
在上述Python程式中,實例變量是在引數傳入實例時創建的,標示其品種資訊。
參考資料
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads