Java - 静态初始化

时间:2012-01-31 17:48:07

标签: java static static-initialization compile-time-constant

我写了一段代码:

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);
}
}

输出是:

得到z
儿童建设者
儿童建设者
得到你 得到x
z的值为0
儿童建设者
main中z的值为0

有人可以解释一下为什么z的值是0而不是10?

编辑: - 谢谢大家,我得到了第一个问题的答案。我仍然有一个疑问,据我所知,静态块是在加载类之后以及在实例化类的第一个对象之前执行的。那么SOP(" z的值是" + z)应该在SOP之前执行(" Child构造函数")!是啊?

6 个答案:

答案 0 :(得分:7)

看看getY():

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

前三行无关紧要 - 它们不会更改实例中y的值,这是返回的内容。

你在坦率的意大利面条代码中创建了大量无意义的对象,在初始化你正在构造实例的同一个类时被调用。我建议你尝试让你的代码 lot 比这更简单。应该尽可能避免使用静态初始化器,更不用说那些遍布房屋的人不做任何有用的工作。

答案 1 :(得分:5)

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

因为在getY()方法中你正在构造一个新的CHild对象,你正在为变量y的那个实例赋值10,当你返回y时,它将是当前的实例变量y。 我希望它能解释一下。

答案 5 :(得分: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