Java - статическая инициализация - PullRequest
1 голос
/ 31 января 2012

Я написал кусок кода:

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
Детский конструктор
Детский конструктор
получить у
получить х
Значение z равно 0
Детский конструктор
значение z в main равно 0

Может кто-нибудь объяснить, почему значение z равно 0, а не 10?

РЕДАКТИРОВАТЬ: - Спасибо всем, я получил ответ на свой первый вопрос. У меня все еще есть сомнения, насколько я знаю, статические блоки выполняются после загрузки класса и до того, как будет создан первый объект класса. Что ж, тогда SOP («Значение z равно» + z) должно быть выполнено до SOP («Дочерний конструктор»)! Не так ли?

Ответы [ 6 ]

7 голосов
/ 31 января 2012

Посмотрите на getY ():

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

Первые три строки не имеют значения - они не изменяют значение y в этом экземпляре, что и даетвозвращено.

Вы создаете очень много бессмысленных объектов в откровенно спагетти-коде, вызываемом при инициализации того же класса, для которого вы создаете экземпляры.Я предлагаю вам попытаться сделать ваш код на лот проще, чем этот.По возможности следует избегать статических инициализаторов, не говоря уже о тех, которые обходят дома, чтобы не делать никакой полезной работы.

5 голосов
/ 31 января 2012

потому что getY() устанавливает ch.y в 10, но возвращает значение this.y.

2 голосов
/ 31 января 2012

В getY () вы возвращали неинициализированную переменную y вместо экземпляра Child ch.

2 голосов
/ 31 января 2012

В GetY вы возвращаете this.y, который никогда не устанавливается.

1 голос
/ 31 января 2012

Это потому, что внутри метода getY () вы создаете новый объект CHild и назначаете 10 этому экземпляру переменной y, а когда вы возвращаете y, это будет текущая переменная экземпляра y.Я надеюсь, что это объясняет.

0 голосов
/ 01 февраля 2012

Во второй точке, статические поля и статические блоки инициализируются / выполняются в текстовом порядке.

Например:

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

Вывод этого будет -

s1 в блоке 1:

s1 в блоке 2: s1

...