热门问题
时间线
聊天
视角

实例变数

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

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