热门问题
时间线
聊天
视角

实例变量

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

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