Инициализация переменных экземпляра Java методом

java compilation initialization instance-variables

2024 просмотра

6 ответа

Я немного запутался в следующем фрагменте кода:

public class Test{

  int x = giveH();
  int h = 29;

  public int giveH(){
     return h;
  }

  public static void main(String args[])
  {
      Test t = new Test();
      System.out.print(t.x + " ");
      System.out.print(t.h);          
  }
}

Вывод здесь такой 0 29, но я подумал, что это должно быть ошибкой компилятора, потому что переменная h не должна быть инициализирована, когда дело доходит до метода giveH(). Итак, идет ли компиляция по строкам сверху вниз? Почему это работает? Почему значение x0, а не 29?

Автор: bucky Источник Размещён: 12.11.2019 10:02

Ответы (6)


21 плюса

Решение

Значением по умолчанию intявляется 0(см. Здесь ). Поскольку вы инициализируете xраньше h, giveHвернет значение по умолчанию для int (например, 0).

Если вы измените порядок, как это

int h = 29;
int x = giveH();

выход будет

29 29
Автор: ThomasThiebaud Размещён: 12.11.2015 10:26

4 плюса

Компиляция в Java не нуждается в объявлении метода перед его использованием. Учебник Java переходит в немного более подробно об инициализации.

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

Кроме того, инициализация переменных для переменных экземпляра в Java перемещается в начало конструктора. Вы можете подумать, что строки выше разделены на две части, с объявлением для x и h выше, и присваиванием внутри конструктора.

Порядок объявления имеет значение в этом случае. Когда переменная x инициализируется, h имеет значение по умолчанию 0, поэтому метод giveH () вернет это значение по умолчанию. После этого переменной h присваивается значение 29.

Вы также можете посмотреть разделы Спецификации языка Java по Инициализации поля и прямым ссылкам во время Инициализации поля .

Автор: Scott M. Размещён: 12.11.2015 10:23

3 плюса

@Maloubobola предоставила правильный ответ, но так как вы, кажется, еще не до конца поняли, позвольте мне остановиться подробнее.

Когда Test создается, он запускает инициализацию переменной (x = giveH (), h = 29) один раз. Ваше недоразумение может заключаться в том, что переменная x всегда определяется методом giveH (), тогда как она определяет свое значение только при инициализации x.

Вот почему порядок утверждений здесь имеет решающее значение; x инициализируется до h, и поэтому h равно 0, когда giveH () вызывается при инициализации x.

Автор: Jochem Kleine Размещён: 12.11.2015 11:06

2 плюса

Это плохая практика использовать метод в инициализаторе поля. Вы можете исправить это, сделав ч финал. Затем он будет инициализирован при загрузке класса.

import java.util.ArrayList;

public class Test {
    int x = giveH();
    final int h=29;

    final public int giveH(){
        return h;
    }

    public static void main(String args[]) {
        Test t = new Test();
        System.out.print(t.x + " ");
        System.out.print(t.h);          
    }
}
Автор: user2872645 Размещён: 12.11.2015 02:34

1 плюс

Если мы не инициализируем значение для нестатических переменных, таких как x, в этой программе JVM предоставит нулевое значение по умолчанию для нестатических переменных уровня класса.

Автор: Preethi Размещён: 12.11.2015 11:58

0 плюса

После объявления все элементы массива сохраняют свои значения по умолчанию. Элементы в массиве, которые хранят объекты, по умолчанию имеют значение null. Элементы массива, в которых хранятся примитивные типы данных, хранятся: 0 для целочисленных типов (byte, short, int, long); 0,0 для десятичных типов (float и double); false для логического значения; \ u0000 для данных char

Actauls значения придут только тогда, когда мы дадим их инициализировать

Автор: abhishek Размещён: 18.02.2018 10:14
Вопросы из категории :
32x32