热门问题
时间线
聊天
视角
實例變數
来自维基百科,自由的百科全书
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