0.写在开头
最近在回顾Java类和对象相关的知识,发现在类变量的定义这里有的地方说法不一样,在此写一些自己的思考,如有不对欢迎指正。
在15版本的机器工业出版社Java语言程序设计这本书中提到,一个类的实例变量和静态变量称为类变量(class's variables)或数据域(data field)
。
另外一种说法是类变量特指静态变量,是一种用static关键字修饰的实例变量
。
最近的资源关于类变量的定义普遍以后者为多(可能之前的书都是老古董了?)
1. 类变量
类变量,也叫静态变量,是指在类中以static
关键字定义的变量。与实例变量不同,类变量属于类本身,而不是类的每个实例。换句话说,类变量在整个程序执行过程中只有一份拷贝,而且可以被该类的所有实例共享。
类变量的定义方式为:
public class MyClass {
public static int count; // 类变量
// ...
}
在上面的代码中,我们定义了一个名为 count 的类变量,它属于 MyClass 类本身,而不是 MyClass 的实例。因此,我们可以在不创建 MyClass 的实例的情况下访问 count 变量。
类变量可以通过类名直接访问,也可以通过实例名访问。以下是示例代码:
public class Main {
public static void main(String[] args) {
MyClass.count = 10; // 通过类名访问类变量
MyClass obj = new MyClass();
obj.count = 20; // 通过实例名访问类变量
System.out.println(MyClass.count); // 输出 20
System.out.println(obj.count); // 输出 20
}
}
在上面的示例代码中,我们通过类名和实例名分别访问了类变量 count
,并将其值设置为 10 和 20。最后,我们输出了count
的值,得到的结果都是 20,这是因为类变量被所有实例共享。
2. 实例变量
实例变量是指定义在类中,但不以static
关键字定义的变量。每个类实例都有自己独立的一份实例变量,它们的值也是相互独立的。
实例变量的定义方式如下:
public class MyClass {
public int count; // 实例变量
// ...
}
在上面的代码中,我们定义了一个名为 count
的实例变量,它属于 MyClass
的每个实例而不是 MyClass
类本身。
与类变量不同,实例变量必须通过实例名来访问,而不能通过类名来访问。以下是示例代码:
public class Main {
public static void main(String[] args) {
MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass();
obj1.count = 10; // 设置 obj1 的实例变量 count 的值为 10
obj2.count = 20; // 设置 obj2 的实例变量 count 的值为 20
System.out.println(obj1.count); // 输出 10
System.out.println(obj2.count); // 输出 20
}
}
在上面的示例代码中,我们分别创建了两个MyClass
类的实例 obj1
和 obj2
,并将它们的实例变量count
的值分别设置为10
和 20
。最后,我们通过实例名访问了count
变量,并输出了它们的值。
需要注意的是,实例变量的作用域是整个类,但它们的生命周期是随着对象的创建和销毁而动态改变的。因此,在不同的实例中,同名的实例变量可以具有不同的值。