2016-03-04 103 views
-4

我有点麻烦了解下面的代码的输出。有人可以解释确切的步骤,以便我可以更好地了解发生了什么?有人可以请解释输出java

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 
+4

你有没有试过走通路你自己呢?如果是这样,哪个确切的部分是你感到困惑? – resueman

+1

你可以请[编辑]你的问题,并修复你的代码的indetion?这是非常难以阅读。 – 2016-03-04 14:47:39

回答

1
  1. 创建F1,身份识别码= 0,因为ID = 0
  2. 在构造函数中,我们用1
  3. 递增ID
  4. 创建F2,myId = 1,因为我们只是增加了id。
  5. 在构造函数中,我们再次将id加1。
  6. 打印MYID的从F1的值仍为0
  7. 打印MYID从F2这仍然是1。
  8. 打印ID是静态的,因此实例之间共享的值的值。它是2在最后一个增量之后。

我假设你发现静态部分容易混淆,在这种情况下这个变量被有效地保留一次。使用10个Foo实例时,仍然只有1个“静态”ID(每次创建Foo的新实例时都会增加)。

0

Class Foo有一个名为id private static int id的静态字段,每当该类的一个实例调用public int getMyId(){....}这个示例时,它就会增加,在这个示例中,您曾经看到它想要区分object('instance')和class所以当你有2个对象foo1和foo2并且它们都调用公共方法getMyId时,静态变量会被独立于对象调用foo1或foo2而递增,另一方面,这两个对象foo1和foo2都可以看到id变量id是一个非静态的字段,因此它是对象的“属性”,因此对象foo1的id对对象foo2不可见,反之亦然。

所以上课的时候第一次创建静态字段“身份证”得到的值0

则呼叫foo1.getMyId进行实地身份识别码具有存储在ID的值是0,那么增加的ID,这样的ID现在已经价值1

通话foo2.getMyId()将会把价值ID至极是在身份识别码1,增加ID现在ID具有值2的返回值身份识别码

呼叫ID为喜欢称之为Foo.id所以会给你的身份证号码是2