有人可以解释输出java

时间:2016-03-04 14:39:01

标签: java jgrasp

我在理解以下代码的输出方面遇到了一些麻烦。有人可以解释确切的步骤,以便我能更好地了解发生了什么吗?

public class Foo {
    private static int id = 0 ;
    private int myId ;

    public Foo() {
        myId = id ;
        ++id ;
    }

    public int getMyId() {
        return myId ;
    }

    public static void main(String[] args) {
        Foo f1 = new Foo();
        Foo f2 = new Foo();
        System.out.println(f1.getMyId());
        System.out.println(f2.getMyId());
        System.out.println(id); 
    }
}

你能解释为什么输出等于:

 0
 1
 2

2 个答案:

答案 0 :(得分:1)

  1. 创建F1,myId = 0因为id = 0。
  2. 在构造函数中,我们将id递增1。
  3. 创建F2,myId = 1,因为我们只增加了id。
  4. 在构造函数中,我们再次将id递增1。
  5. 从F1打印myId的值,该值仍为0.
  6. 从F2打印myId的值,该值仍为1.
  7. 打印id的值,该值是静态的,因此在实例之间共享..在最后一次增量之后它是2。
  8. 我假设您发现静态部分令人困惑,在这种情况下,此变量实际上保留了一次。使用10个Foo实例时,仍然只有1个“静态”id(每次创建Foo的新实例时都会增加)。

答案 1 :(得分:0)

Class Foo有一个名为id private static int id的静态字段,每当该类的一个实例调用public int getMyId(){....}这个例子,你会看到它想要区分对象时,它会增加(' instance')和类所以当你有2个对象foo1和foo2并且它们都调用公共方法getMyId时,静态变量会增加,而不管对象调用它是foo1还是foo2和id变量对于那些对象foo1和foo2都是可见的另一方面,id是一个非静态的字段,因此它是" property"对象foo1的id对象foo2不可见,反之亦然。

因此,当第一次创建类时,静态字段“id”#39;得到价值0

然后调用foo1.getMyId使字段myId具有存储在id中的值,该值为0然后递增id,因此id现在具有值1

调用foo2.getMyId()将id中的值设为myId中的1,增量id现在id为值2返回值myId

调用id就像调用Foo.id一样,它会给你id值为2