С чем инициализируются поля объекта Java?

Это null для Object ввести?

class C {
    int i;
    String s;
    public C() {}
}

Будет s будьте всегда null?

Что относительно простых типов как int? Каково это будет? Нуль или произвольное значение?

Что относительно локальных переменных в методах?

public void meth() {
    int i;
}

Из чего unitialized значение i?


Доверие таким значениям по умолчанию, однако, обычно считают плохим стилем программирования.

Хорошо, что Вы предлагаете, чтобы мы сделали?

class A {
    String s = "";
    int i = 0;
}

ИЛИ:

class A {
    String s;
    int i;
    public A() {
        // default constructor
        s = "";
        i = 0;
    }
}

Который лучше и почему?

9
задан Oleksandr Pyrohov 20 September 2018 в 11:34
поделиться

5 ответов

From suns java tutorial

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

Следующая таблица суммирует значения по умолчанию для вышеуказанных данных типы.

Data Type   Default Value (for fields)
byte                    0 
short                   0   
int                     0 
long                    0L 
float                   0.0f 
double                  0.0d 
char                    '\u0000' 
boolean                 false
String (or any object)  null 

Локальные переменные слегка другой; компилятор никогда не назначает значение по умолчанию для неинициализированного локальная переменная. Если ты не можешь инициализировать вашу локальную переменную, где он объявлен, обязательно назначьте его значение, прежде чем вы попытаетесь его использовать. Доступ к неинициализированному локальному переменная приведет к времени компиляции ошибка.

29
ответ дан 4 December 2019 в 06:22
поделиться

Для переменных-членов: Значение по умолчанию для String - null. Значение по умолчанию для примитивов - 0 (или 0,0 для значений с плавающей запятой).

Для локальных переменных: Вы должны явно инициализировать локальную переменную перед ее использованием.

Что касается второй части вашего вопроса: Вы всегда можете указать String s = ""; в определении переменной-члене или s = ""; в конструкторе. Тогда вы знаете, что у него будет ненулевое значение. (Кроме того, в вашем сеттере вам нужно убедиться, что кто-то не пытается вернуть его в значение null.)

4
ответ дан 4 December 2019 в 06:22
поделиться

Поля: Объекты по умолчанию равны нулю; короткие, длинные и короткие по 0; Строки к нулю; логическое значение ложно. Здесь все .

Компилятор заставит вас самостоятельно инициализировать переменные, объявленные в методах, ​​локальные переменные .

3
ответ дан 4 December 2019 в 06:22
поделиться

Примитивные поля инициализируются значением 0 / false . Объекты инициализируются значением null . Но, честно говоря, вы могли попробовать это ..

2
ответ дан 4 December 2019 в 06:22
поделиться

As for the setter-method question: The whole point of setters is that they can check if the object passed conforms to the requirements of the class. e.g.

public void setS(String s) {
  if (s == null)
     throw new IllegalArgumentException("S must not be null");
  this.s = s;
}

Or, with Google Collections/Google Guava:

public void setS(String s) {
  this.s = Preconditions.checkNotNull(s, "S must not be null");
}

Of course, you can define arbitrary constraints, e.g.:

/**
 * Sets the foo. Legal foo strings must have a length of exactly 3 characters.
 */
public void setFoo(String foo) {
  if (foo == null)
     throw new IllegalArgumentException("Foo must not be null");
  if (foo.length() != 3)
     throw new IllegalArgumentException("Foo must have exactly 3 characters");
  ...

Of course in such a case you should always state the correct range of values for your properties in the JavaDoc of the setter and/or of the class.

1
ответ дан 4 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: