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