Инициализация переменных экземпляра Java методом
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()
. Итак, идет ли компиляция по строкам сверху вниз? Почему это работает? Почему значение x
0, а не 29?
Ответы (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:233 плюса
@Maloubobola предоставила правильный ответ, но так как вы, кажется, еще не до конца поняли, позвольте мне остановиться подробнее.
Когда Test создается, он запускает инициализацию переменной (x = giveH (), h = 29) один раз. Ваше недоразумение может заключаться в том, что переменная x всегда определяется методом giveH (), тогда как она определяет свое значение только при инициализации x.
Вот почему порядок утверждений здесь имеет решающее значение; x инициализируется до h, и поэтому h равно 0, когда giveH () вызывается при инициализации x.
Автор: Jochem Kleine Размещён: 12.11.2015 11:062 плюса
Это плохая практика использовать метод в инициализаторе поля. Вы можете исправить это, сделав ч финал. Затем он будет инициализирован при загрузке класса.
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:580 плюса
После объявления все элементы массива сохраняют свои значения по умолчанию. Элементы в массиве, которые хранят объекты, по умолчанию имеют значение null. Элементы массива, в которых хранятся примитивные типы данных, хранятся: 0 для целочисленных типов (byte, short, int, long); 0,0 для десятичных типов (float и double); false для логического значения; \ u0000 для данных char
Actauls значения придут только тогда, когда мы дадим их инициализировать
Автор: abhishek Размещён: 18.02.2018 10:14Вопросы из категории :
- java В чем разница между int и Integer в Java и C #?
- java Как я могу определить IP моего маршрутизатора / шлюза в Java?
- java Каков наилучший способ проверки XML-файла по сравнению с XSD-файлом?
- java Как округлить результат целочисленного деления?
- java Преобразование списка <Integer> в список <String>
- compilation Можно ли скомпилировать и выполнить новый код во время выполнения в .NET?
- compilation Eclipse - Компиляция и выполнение программы
- compilation Должен ли я поместить много функций в один файл? Или, более или менее, одна функция на файл?
- compilation Компиляция / выполнение исходного файла C # в командной строке
- compilation Почему компиляции занимают так много времени?
- initialization Are delphi variables initialized with a value by default?
- initialization How to initialize private static members in C++?
- initialization Как инициализировать все элементы массива одним и тем же значением?
- initialization Почему мы не можем инициализировать элементы внутри структуры?
- initialization Python - создать список с начальной емкостью
- instance-variables Как получить переменные экземпляра в Python?
- instance-variables Когда устанавливаются переменные экземпляра Ruby?
- instance-variables Переменная экземпляра: self vs @
- instance-variables Должен ли я создавать экземпляры переменных экземпляра при объявлении или в конструкторе?
- instance-variables Как работают сервлеты? Инстанциация, сессии, общие переменные и многопоточность