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