前言

通过以下代码可以得知创建了两对象。不同对象的访问成员变量时,它们的值不会互相干预。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class TransferProperty {
int i = 47; // 定义成员变量

public void call() { // 定义成员方法
System.out.println("调用call()方法");
for (i = 0; i < 3; i++) {
System.out.print(i + " ");
if (i == 2) {
System.out.println("\n");
}
}
}

public TransferProperty() { // 定义构造方法
}

public static void main(String[] args) {
TransferProperty t1 = new TransferProperty(); // 创建一个对象
TransferProperty t2 = new TransferProperty(); // 创建另一个对象
t2.i = 60; // 将类成员变量赋值为60
// 使用第一个对象调用类成员变量
System.out.println("第一个实例对象调用变量i的结果:" + t1.i++);
t1.call(); // 使用第一个对象调用类成员方法
// 使用第二个对象调用类成员变量
System.out.println("第二个实例对象调用变量i的结果:" + t2.i);
t2.call(); // 使用第二个对象调用类成员方法
}
}
输出
1
2
3
4
5
6
7
第一个实例对象调用变量i的结果:47
调用call()方法
0 1 2

第二个实例对象调用变量i的结果:60
调用call()方法
0 1 2

问题

如果将i成员变量+上static,变成静态变量。这样i的值就会被这两个对象同时干预。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class AccessProperty {
static int i = 47; // 定义静态成员变量

public void call() { // 定义成员方法
System.out.println("调用call()方法");
for (i = 0; i < 3; i++) {
System.out.print(i + " ");
if (i == 2) {
System.out.println("\n");
}
}
}

public AccessProperty() { // 定义构造方法
}

public static void main(String[] args) { // 定义主方法
AccessProperty t1 = new AccessProperty(); // 创建一个对象
AccessProperty t2 = new AccessProperty(); // 创建另一个对象
t2.i = 60; // 将类成员变量赋值为60
// 使用第一个对象调用类成员变量
System.out.println("第一个实例对象调用变量i的结果:" + t1.i++);
t1.call(); // 使用第一个对象调用类成员方法
// 使用第二个对象调用类成员变量
System.out.println("第二个实例对象调用变量i的结果:" + t2.i);
t2.call(); // 使用第二个对象调用类成员方法
}
}
输出
1
2
3
4
5
6
7
第一个实例对象调用变量i的结果:60
调用call()方法
0 1 2

第二个实例对象调用变量i的结果:3
调用call()方法
0 1 2

说明

关于内存的分配

  • 而这有什么根本原因呢?。

    可以知道,
    当对象被实例化之后,每个实例变量(成员变量)就被确定,可以又很多个副本。
    但是,静态变量是存储在静态存储区,无论创建了多少个对象,静态变量只有一份拷贝。

区分实例变量和静态变量

通过static,因为他们都在类中,方法外。