1

我写了一段代码:

public class Child{
int y ;
private static final int z = getZ();

static {
    System.out.println("The value of z is "+z);
}

public int getX(){
    System.out.println("get x");
    return 10;
}

public int getY(){
    Child ch = new Child();
    System.out.println("get y");
    ch.y = getX();
    return y;
}

public static int getZ(){
    System.out.println("get z");
    return new Child().getY();
}

public Child(){
    System.out.println("Child constructor");
}


public static void main(String...args){
    Child ch = new Child();
    System.out.println("the value of z in main is "+z);
}
}

输出是:

get z
子构造函数
子构造函数
get y
得到 x
z 的值为 0
子构造函数
main 中 z 的值为 0

谁能解释一下为什么 z 的值为 0 而不是 10 ?

编辑:-谢谢大家,我得到了第一个问题的答案。我仍然有疑问,据我所知,静态块是在加载类之后和实例化类的第一个对象之前执行的。那么 SOP("The value of z is "+z) 应该在 SOP("Child constructor") 之前执行!不是吗?

4

6 回答 6

7

看看 getY():

public int getY(){
    Child ch = new Child();
    System.out.println("get y");
    ch.y = getX();
    return y;
}

前三行无关紧要——y这种情况下,它们不会更改 的值,这就是返回的值。

坦率地说,您正在用意大利面条代码创建大量无意义的对象,这些对象在初始化您正在构造实例的同一个类时被调用。我建议你尽量让你的代码这简单得多。一开始就应该避免使用静态初始化器,更不用说那些到处跑却没有做任何有用工作的初始化器。

于 2012-01-31T17:50:52.730 回答
5

因为getY()设置ch.y为 10,但返回 的值this.y

于 2012-01-31T17:52:21.070 回答
2

在 GetY 中,您返回 this.y ,它永远不会被设置。

于 2012-01-31T17:53:31.823 回答
2

在 getY() 上,您返回未初始化的 y 变量而不是 Child ch 实例。

于 2012-01-31T17:54:15.083 回答
1

这是因为在 getY() 方法中,您正在构造一个新的 CHild 对象,并且您将 10 分配给变量 y 的该实例,并且当您返回 y 时,它将成为当前实例变量 y。我希望它能解释。

于 2012-01-31T17:57:34.207 回答
0

第二点,静态字段和静态块按文本顺序初始化/执行。

例如:

public class StaticTest()
{
  static
  {
    System.out.println("s1 in block 1 :" + s1);
  }

  private static String s1 = "s1";

  static
  {
    System.out.println("s1 in block 2 : " + s1);
  }

  public static void main(String args[])
  {
    new StaticTest();
  }
}

这将是 -

块 1 中的 s1 :

块 2 中的 s1 : s1

于 2012-01-31T22:31:02.923 回答