Страница 1 из 1

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

Добавлено: 13 мар 2008, 20:10
Гусар в отставке
Почему объекты класса 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? То есть иными словами, получается, что строка символов совсем не объект.

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

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

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

PPS Если действительно хочется научить студентов OOP, а не просто Java, советую посмотреть на язык Scala, кторый компилится в ту же JVM, зато более выразителен и гибок.

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

Добавлено: 13 мар 2008, 22:23
Гусар в отставке
Thanks. It helps. "Mutable" - I have never heard of it.

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

Добавлено: 14 мар 2008, 12:18
sz
Ключевое слово: Immutable Pattern.
Гуглить по нему. Там все объяснят.