Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Философия JAVA. Есть вопрос. / 12 сообщений из 12, страница 1 из 1
23.10.2004, 14:57
    #32751542
v@d
v@d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Философия JAVA. Есть вопрос.
Доброго времени суток, All
Наконец приступил к изучение Java по учебнику Философия JAVA , в примере Bath (6-я глава)
Код: plaintext
1.
2.
3.
class Soap {
  private String s;
  Soap() {
    System.out.println("Soap()");
String s = new String("Constructed");
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
}
  public String toString() { return s; }
}
public class Bath {
  private String
  s1 = new String("Happy"),
  s2 = "Happy", 
  s3, s4;
  Soap castille;
  int i;
  float toy;
  Bath() {
    System.out.println("Inside Bath()");
    s3 = new String("Joy");
    i =  47 ;
    toy =  3 .14f;
Soap castille = new Soap();
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  }
  void print() {
  if (s4 == null) 
    s4 = new String("Joy");
    System.out.println("s1 = " + s1);
    System.out.println("s2 = " + s2);
    System.out.println("s3 = " + s3);
    System.out.println("s4 = " + s4);
    System.out.println("i = " + i);
    System.out.println("toy = " + toy);
    System.out.println("castille = " + castille);
  }
  public static void main(String[] args) {
    Bath b = new Bath();
    b.print();
  }
} 
допустил ошибку и написал вместо s = new String("Constructed"); написал String s = new String("Constructed"); и вместо  castille = new Soap(); я написал Soap castille = new Soap();
В результате, при выводе результатов получилось: castille = null; Кто нибудь может прокомментировать, в чем проблемма? Почему строку нужно обязательно объявлять как
s = new String("Constructed"), а не String s = new String("Constructed"), и почему нельзя инициализировать объект, как Soap castille = new Soap();
Спасибо.
-----------------
Denisov Alexander
...
Рейтинг: 0 / 0
23.10.2004, 15:31
    #32751556
Alex.Czech
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Философия JAVA. Есть вопрос.
Я каэша в Джаве ни бум-бум (честно говоря вообще не понял как меня сюда занесло, промахнулся разделом что ли), но по аналогии с другими языками могу сказать, что ты когда пишешь String s = new String("Contructed"), то ты объявляешь локальную переменную в методе и ее инициализируешь, а когда пишешь просто s = new String("Contructed"), то это ты в поле объекта, коее 3-мя строчками выше объявлено значение заносишь. Соответственно в первом случае по выходе из метода все проходит как белых яблонь дым, а во втором в поле объекта остается значение

Сорри если что не так заранее
...
Рейтинг: 0 / 0
23.10.2004, 15:59
    #32751576
v@d
v@d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Философия JAVA. Есть вопрос.
ок, пасибо...может быть...
-----------------
Denisov Alexander
...
Рейтинг: 0 / 0
23.10.2004, 16:05
    #32751581
Nightwish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Философия JAVA. Есть вопрос.
s = new String("Constructed"); - Присвоение
String s = new String("Constructed"); - Описание с присвоением.
Если описуеш "ближе" с себе, то перекрываеш тех кто "дальше"
...
Рейтинг: 0 / 0
23.10.2004, 16:13
    #32751588
v@d
v@d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Философия JAVA. Есть вопрос.
to Nightwish> Вопрос несколько в другом был, почему объект castille не создался при такой конструкции:
Soap castille = new Soap();
-----------------
Denisov Alexander
...
Рейтинг: 0 / 0
23.10.2004, 22:19
    #32751674
Alex.Czech
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Философия JAVA. Есть вопрос.
Он создался... только потом вышел из области видимости (не знаю что с ними в Джаве при этом происходит, разрушаются вестимо) - это ж ты локальную переменную объявил и присвоил

Надо было написать просто
castille = new Soap();
...
Рейтинг: 0 / 0
23.10.2004, 23:28
    #32751699
ponomarevvb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Философия JAVA. Есть вопрос.
Дело в том, что когда в конструкторе Bath() Вы написали
Soap castille = new Soap();
то имели дело не с полем castille, а с локальной переменной castille, которая к указанному полю никакого отношения не имеет.
А т.к. Java гарантирует инициализацию всех ссылок по умолчанию значением null, то поле castille, будучи не проинициализированным в конструкторе, и получило значение null.
...
Рейтинг: 0 / 0
24.10.2004, 00:27
    #32751710
v@d
v@d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Философия JAVA. Есть вопрос.
to ponomarevvb> Пасибо, теперь понятно....просто пока как-то не привычно :)...
-----------------
Denisov Alexander
...
Рейтинг: 0 / 0
25.10.2004, 12:48
    #32752550
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Философия JAVA. Есть вопрос.
ponomarevvb
А т.к. Java гарантирует инициализацию всех ссылок по умолчанию значением null, то поле castille, будучи не проинициализированным в конструкторе, и получило значение null.

У меня тогда вопрос, а почему нижеследующий код вызывает ошибку компиляции?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class Test {

  public static void main(String args[]) {
    getValue();
  }

  private static Integer getValue() {
    Integer value;
    try {
      value = new Integer(1);
    } catch (Exception e) {
    }
    return value;
  }
}
Код: plaintext
1.
Error:  variable value might not have been initialized

По идее, если value инициализируется как null то почему все-таки, при наличии обработки Exception'а, требуется этой переменной явно присвоить значение?
...
Рейтинг: 0 / 0
25.10.2004, 12:58
    #32752577
51-й тынц Консалтинг Груп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Философия JAVA. Есть вопрос.
Denis PopovУ меня тогда вопрос, а почему нижеследующий код вызывает ошибку компиляции?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class Test {

  public static void main(String args[]) {
    getValue();
  }

  private static Integer getValue() {
    Integer value;
    try {
      value = new Integer(1);
    } catch (Exception e) {
    }
    return value;
  }
}
Код: plaintext
1.
Error:  variable value might not have been initialized

По идее, если value инициализируется как null то почему все-таки, при наличии обработки Exception'а, требуется этой переменной явно присвоить значение?

Локальные переменные не инициализируются null по умолчанию. Это (инициализация null (или 0, false для int, boolean) правило справедливо только для членов класса.

Правильно писать:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
...
  private static Integer getValue() {
    Integer value = null;
    try {
      value = new Integer(1);
    } catch (Exception e) {
    }
    return value;
  }
...

или

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
...
  private static Integer getValue() {
    Integer value;
    try {
      value = new Integer(1);
    } catch (Exception e) {
      value = null;
    }
    return value;
  }
...
...
Рейтинг: 0 / 0
25.10.2004, 13:00
    #32752580
zalexaka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Философия JAVA. Есть вопрос.
Denis Popov ponomarevvb
А т.к. Java гарантирует инициализацию всех ссылок по умолчанию значением null, то поле castille, будучи не проинициализированным в конструкторе, и получило значение null.

У меня тогда вопрос, а почему нижеследующий код вызывает ошибку компиляции?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class Test {

  public static void main(String args[]) {
    getValue();
  }

  private static Integer getValue() {
    Integer value;
    try {
      value = new Integer(1);
    } catch (Exception e) {
    }
    return value;
  }
}
Код: plaintext
1.
Error:  variable value might not have been initialized

По идее, если value инициализируется как null то почему все-таки, при наличии обработки Exception'а, требуется этой переменной явно присвоить значение?
гарантирует инициализацию только полей объектов видимо :)
...
Рейтинг: 0 / 0
26.10.2004, 15:02
    #32755090
ponomarevvb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Философия JAVA. Есть вопрос.
Цитирую по книге "Философия Java":
Java иногда нарушает своё обещание соответствующим образом инициализировать переменные перед их использованием. В случае с переменными, определёнными локально в методе, эта гарантия сводится к форме сообщения об ошибке:
Код: plaintext
1.
2.
3.
4.
void f() {
    int i;
    i++; // Ошибка - i не была проинициализирована
}
Здесь вы получите сообщение об ошибке, утверждающее, что переменная i не была правильно проинициализирована. Конечно, компилятор мог бы присваивать таким переменным значения по умолчанию, но данная ситуация больше похожа на ошибку программиста, и подобный подход скрыл бы её.
...
Простейшие типы данных, описаные как поля класса, гарантированно получают начальное значение (в т.ч. ссылки на объекты инициализируются значением null - ponomarevvb).
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Философия JAVA. Есть вопрос. / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]