Почему объекты класса 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? То есть иными словами, получается, что строка символов совсем не объект.
Вопрос знатокам Java 1.6х
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
- Гусар в отставке
- Графоман
- Сообщения: 5476
- Зарегистрирован: 12 мар 2008, 19:09
- Откуда: RU -> UA ->CA -> US -> CA -> RU
- Marmot
- Графоман
- Сообщения: 39351
- Зарегистрирован: 17 фев 2003, 17:58
- Откуда: Caulfeild
- Контактная информация:
Re: Вопрос знатокам Java 1.6х
Потому что оператор "=" и метод setText(String) это не одно и тоже.
Если бы класс String был mutable и имел метод, нaпример setValue(char[]) и этот метод был бы использован вместо "=", то все было бы точно так же.
Однако класс String immutable и такое на самом деле невозможно.
PS Непонятно причем тут 1.6, так было всегда
PPS Если действительно хочется научить студентов OOP, а не просто Java, советую посмотреть на язык Scala, кторый компилится в ту же JVM, зато более выразителен и гибок.
Если бы класс 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х
Ключевое слово: Immutable Pattern.
Гуглить по нему. Там все объяснят.
Гуглить по нему. Там все объяснят.