class Test {
static int x = 11;
private int y = 33;
public void method(int x) {
Test t = new Test();
this.x = 22;
y = 44;
System.out.println(Test.x);
System.out.println(t.x);
System.out.println(t.y);
System.out.println(y);
}
public static void main(String args[]) {
Test t = new Test();
t.method(5);
}
}
此处代码正常,它提供的输出如下:22 22 33 44
但我不明白:
为什么Test.x
不是11
并提供如下输出:11 22 33 44
为什么t.y
和y
不是44和44,并提供如下输出:11 22 44 44
为什么在此代码中未执行t.method(5)
?
答案 0 :(得分:0)
1)x
是静态的,只有一个。因此Test.x
和this.x
是相同的变种。
2)y
不是静态的,所以是单独的变种。
3)method()
已执行。否则你将得不到输出。
t
的Test实例而让自己感到困惑。我会重命名一个。
答案 1 :(得分:0)
静态字段和实例字段之间的区别在于静态字段不依赖于实例。
看这里:
static int x = 11;
private int y = 33;
静态字段x
对于Test
的每个实例都是相同的,而y
的字段将是特定于实例的。这就是你看到这些结果的原因。
答案 2 :(得分:0)
首先,您需要了解static
关键字的作用,这是一个很好的问题:What does the 'static' keyword do in a class?
现在您知道static
使变量成为Class的成员而不是实例的成员,您将知道如果类的实例修改该类的静态字段,则另一个实例将看到修改价值,我们可以回答你的问题:
- 为什么
醇>Test.x
不是11
并提供如下输出:11 22 33 44
Test.x
引用此变量:static int x = 11;
,您在此处将其值修改为22
:
this.x = 22;
在这种情况下,您有一个本地变量,您将其作为参数int x
接收。使用this
关键字时,您正在访问此类的实例,因为它是一个静态变量,但您无法访问它。
因此,当您致电this.x = 22
时,就像说Test.x = 22
。
- 为什么
醇>t.y
和y
不是44
和44
,并提供如下输出:11 22 44 44
由于y
不是静态的,所以它具有自己的价值。当您致电new Test();
时,变量t
会创建一个新实例,其中有一个名为y
的变量已初始化为33
,因此:
private int y = 33;
因此,当您致电t.y
时,它会打印上述结果,因为它是一个不同的实例。
当您打印y
时,您现在正在调用程序中正在使用的变量y
(并且它与上面的实例不同),并且在打印之前将其值更改为44
。
这就是为什么第一个this.y
打印33
和y
打印44
- 为什么在此代码中未执行
醇>t.method(5)
?
它确实被执行了,或者你根本看不到任何输出,但是你没有得到5
因为你永远不会使用本地变量在参数int x
中。你可以试着写
System.out.println(x);
所以你得到了那个价值。