Вопрос знатокам Java 1.6х

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
Аватара пользователя
Гусар в отставке
Графоман
Сообщения: 5476
Зарегистрирован: 12 мар 2008, 19:09
Откуда: RU -> UA ->CA -> US -> CA -> RU

Вопрос знатокам Java 1.6х

Сообщение Гусар в отставке »

Почему объекты класса String ведут себя не совсем как reference variables?

Мне это интересно, чтобы лучше объяснять моим студентам звериную сущность ООП на Джаве.

Итак, пример.
Пусть, a1, и а2 - объекты некоторого класса.
Я делаю с ними следующее:

1. Инициализирую с индивидуальными параметрами типа String: "one" и "two". Если, скажем это класс JLabel, то эти значения - текстуальные надписи. Если это объекты класса String, то это содержимое строк.
2. Связываю два объекта присваиванием: а1 = а2;
3. Меняю техт в объекте а2; если это String, то пишу: а2 = "changed"; если это JLabel, то использую а2.setText("changed");

В результрате получаю, когда объекты а1 и а2 оба типа String, содержимое а1 остаётся неизменным ("one"). Если же оба объекта имеют тип JLabel, то изменение текста в а2 влечёт изменение текста в а1; т.е. а1.getText() возвращает "changed". Последнее я считаю правильным поведением объектa, который является reference variable.

В связи с этим возникает вопрос, почему объект типа String ведёт себя как primitive variable? То есть иными словами, получается, что строка символов совсем не объект.
Аватара пользователя
Marmot
Графоман
Сообщения: 39351
Зарегистрирован: 17 фев 2003, 17:58
Откуда: Caulfeild
Контактная информация:

Re: Вопрос знатокам Java 1.6х

Сообщение Marmot »

Потому что оператор "=" и метод setText(String) это не одно и тоже.
Если бы класс String был mutable и имел метод, нaпример setValue(char[]) и этот метод был бы использован вместо "=", то все было бы точно так же.
Однако класс String immutable и такое на самом деле невозможно.

PS Непонятно причем тут 1.6, так было всегда

PPS Если действительно хочется научить студентов OOP, а не просто Java, советую посмотреть на язык Scala, кторый компилится в ту же JVM, зато более выразителен и гибок.
Аватара пользователя
Гусар в отставке
Графоман
Сообщения: 5476
Зарегистрирован: 12 мар 2008, 19:09
Откуда: RU -> UA ->CA -> US -> CA -> RU

Re: Вопрос знатокам Java 1.6х

Сообщение Гусар в отставке »

Thanks. It helps. "Mutable" - I have never heard of it.
Аватара пользователя
sz
Маньяк
Сообщения: 1266
Зарегистрирован: 17 фев 2003, 19:34

Re: Вопрос знатокам Java 1.6х

Сообщение sz »

Ключевое слово: Immutable Pattern.
Гуглить по нему. Там все объяснят.
Ответить