Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> инициализация свойств класса null'ем, инициализация объектов класса 
V
    Опции темы
priam220
Дата 21.6.2010, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: 7
Всего: 8



в коде встречаются два способа объявления ссылок на свойства класса:

с инициализацией:
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 
PM MAIL   Вверх
aleksandy
Дата 22.6.2010, 05:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 260
Регистрация: 17.12.2006

Репутация: 4
Всего: 5



Спецификация Java
Цитата

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. 


Это сообщение отредактировал(а) aleksandy - 22.6.2010, 05:52
PM   Вверх
batigoal
Дата 22.6.2010, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



И тем не менее, иногда нужно явно объявлять "= null". 

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

Код

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

Код

variable str might not have been initialized



--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
priam220
Дата 22.6.2010, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: 7
Всего: 8



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:35
PM MAIL   Вверх
priam220
Дата 22.6.2010, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: 7
Всего: 8



Похоже, свойства класса в java инициализировать null'em не надо. Во всяком случае я не нашел ни одного случая, где бы это было необходимо. 
PM MAIL   Вверх
EnJ
Дата 22.6.2010, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 4.1.2010
Где: Харьков

Репутация: нет
Всего: нет



При создании экземпляра класса вызывается конструктор по умолчанию(если даже явно не определить ни одного), который инициализирует переменные опять же по умолчанию  smile Вот он тебе ошибку компиляции не выдает.
Ты прав, что не надо их инициализировать, жаба за тебя это сделает, но не стоит так сильно полагаться на машину, ведь всякое бывает. По моему мнению, надо обязательно объявлять переменные, а не надеяться, что это за тебя кто-то другой сделает.
PM MAIL ICQ   Вверх
Dummy
Дата 22.6.2010, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 9
Всего: 19



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

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

PM MAIL   Вверх
batigoal
Дата 22.6.2010, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



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

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


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
priam220
Дата 22.6.2010, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: 7
Всего: 8



Dummy
полностью согласен с тобой.  Всем большое спасибо!  smile 

Это сообщение отредактировал(а) priam220 - 22.6.2010, 22:29
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0955 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.