在以下代码中使用static

时间:2017-09-12 13:26:20

标签: java

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

但我不明白:

  1. 为什么Test.x不是11并提供如下输出:11 22 33 44

  2. 为什么t.yy不是44和44,并提供如下输出:11 22 44 44

  3. 为什么在此代码中未执行t.method(5)

3 个答案:

答案 0 :(得分:0)

1)x是静态的,只有一个。因此Test.xthis.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的成员而不是实例的成员,您将知道如果类的实例修改该类的静态字段,则另一个实例将看到修改价值,我们可以回答你的问题:

  
      
  1. 为什么Test.x不是11并提供如下输出:11 22 33 44
  2.   

Test.x引用此变量:static int x = 11;,您在此处将其值修改为22

this.x = 22;

在这种情况下,您有一个本地变量,您将其作为参数int x接收。使用this关键字时,您正在访问此类的实例,因为它是一个静态变量,但您无法访问它。

因此,当您致电this.x = 22时,就像说Test.x = 22

  
      
  1. 为什么t.yy不是4444,并提供如下输出:11 22 44 44
  2.   

由于y不是静态的,所以它具有自己的价值。当您致电new Test();时,变量t会创建一个新实例,其中有一个名为y的变量已初始化为33,因此:

private int y = 33;

因此,当您致电t.y时,它会打印上述结果,因为它是一个不同的实例。

当您打印y时,您现在正在调用程序中正在使用的变量y(并且它与上面的实例不同),并且在打印之前将其值更改为44

这就是为什么第一个this.y打印33y打印44

  
      
  1. 为什么在此代码中未执行t.method(5)
  2.   

它确实被执行了,或者你根本看不到任何输出,但是你没有得到5因为你永远不会使用本地变量在参数int x中。你可以试着写

System.out.println(x);

所以你得到了那个价值。