Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > инициализация свойств класса null'ем


Автор: priam220 21.6.2010, 22:41
в коде встречаются два способа объявления ссылок на свойства класса:

с инициализацией:
StringBuffer st = null;
без инициализации:
StringBuffer st;

Всегда пользовался первым способом, но выяснилось, что java сама инициализирует указатели null'em:
Код
public class StartPoint {

    public String global;
    
    public static void main(String[] args) {
    
    StartPoint sp = new StartPoint();    
    
    System.out.print(sp.global);

    }
}

вывод:
null


как правильно и почему? smile 

Автор: aleksandy 22.6.2010, 05:51
http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.12.5
Цитата

Every variable in a program must have a value before its value is used:
    * Each class variable, instance variable, or array component is initialized with a default value when it is created (§15.9, §15.10):
          o For type byte, the default value is zero, that is, the value of (byte)0.
          o For type short, the default value is zero, that is, the value of (short)0.
          o For type int, the default value is zero, that is, 0.
          o For type long, the default value is zero, that is, 0L.
          o For type float, the default value is positive zero, that is, 0.0f.
          o For type double, the default value is positive zero, that is, 0.0d.
          o For type char, the default value is the null character, that is, '\u0000'.
          o For type boolean, the default value is false.
          o For all reference types (§4.3), the default value is null. 

Автор: batigoal 22.6.2010, 10:48
И тем не менее, иногда нужно явно объявлять "= null". 

Например, вот такой код приведет к ошибке компиляции:

Код

    String str;
        try {
            str = "abc";
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        System.out.println(str == null);
    }

Код

variable str might not have been initialized

Автор: priam220 22.6.2010, 11:07
batigoal, вот твой пример:

public class Exmpl
{
  String sb;

  public void run()
  {
    try
    {
      sb = "abc";
    }
    catch( Exception ex )
    {
      ex.printStackTrace();
    }
    System.out.println( sb == null );
  }
}


Вывод: false

Речь идет о свойствах класса, а не о локальных переменных, на не определенность которых ругается сам компилятор. 

Автор: priam220 22.6.2010, 11:50
Похоже, свойства класса в java инициализировать null'em не надо. Во всяком случае я не нашел ни одного случая, где бы это было необходимо. 

Автор: EnJ 22.6.2010, 12:51
При создании экземпляра класса вызывается конструктор по умолчанию(если даже явно не определить ни одного), который инициализирует переменные опять же по умолчанию  smile Вот он тебе ошибку компиляции не выдает.
Ты прав, что не надо их инициализировать, жаба за тебя это сделает, но не стоит так сильно полагаться на машину, ведь всякое бывает. По моему мнению, надо обязательно объявлять переменные, а не надеяться, что это за тебя кто-то другой сделает.

Автор: Dummy 22.6.2010, 14:07
Цитата(EnJ @  22.6.2010,  12:51 Найти цитируемый пост)
Ты прав, что не надо их инициализировать, жаба за тебя это сделает, но не стоит так сильно полагаться на машину, ведь всякое бывает. По моему мнению, надо обязательно объявлять переменные, а не надеяться, что это за тебя кто-то другой сделает. 

Не согласен. Java-разработчик прикладного уровня должен принимать специфицированное поведение JVM в качестве аксиомы, иначе он вообще не может быть ни в чём уверен. Где тогда гарантия, что JVM не интерпретирует строчку "int i = 5;" как инструкцию к форматированию диска?

Автор: batigoal 22.6.2010, 15:53
Цитата(priam220 @  22.6.2010,  12:07 Найти цитируемый пост)
Речь идет о свойствах класса, а не о локальных переменных

Да, это я упустил из виду.

Автор: priam220 22.6.2010, 22:12
Dummy
полностью согласен с тобой.  Всем большое спасибо!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)