Экземпляры класса Java String являются константами - PullRequest
0 голосов
/ 01 ноября 2011

это, вероятно, простой вопрос, но не для меня на данном этапе.

Я читал, что (я цитирую) "Все экземпляры класса String являются константами, то есть они не могут быть изменены после того, как они были созданы. Но строки можно заменить ".

Это сбивает с толку.Что означает, что строковая переменная не может быть изменена, но может быть изменена строка?

Может кто-нибудь дать мне пример кода, где мы попытаемся изменить переменную, но потерпим неудачу?

Приветствия за помощь.

Ответы [ 4 ]

3 голосов
/ 01 ноября 2011

Когда вы пишете:

String myString = "Hi!";

Вы делаете две вещи.Первый определяет ссылку с именем myString , второй создает объект String.Этот строковый объект содержит «Привет!», И нет способа изменить это.Другими словами, не существует set метода для изменения строки:

myString.set("another content");

Однако вы можете создать новый объект и изменить ссылку myString, чтобы указать на нее.Важно знать, что myString не является самим объектом String, а просто ссылкой на него.

myString = "New content";

Когда вы это делаете, старая строка не указываетсялюбая переменная уже не является кандидатом на сборку мусора.Также любая другая операция над строкой, такая как подстрока, верхний регистр и т. Д., Создаст новый объект String.

Когда объект, который нельзя изменить после создания, называется Immutable .В Java строки не только неизменяемы, но и окончательны, так что вы не можете создать подкласс String для изменения его поведения.

2 голосов
/ 01 ноября 2011

Строки не являются константами, они неизменяемы , что совсем другое. Это означает, что вы не можете изменить содержимое строкового объекта, но вы можете создать новый на основе первого, например,

String hw = "hello world";
hw.ToUpperCase();

Последний не меняет исходную строку hw, но создает новую строку со всеми символами в верхнем регистре.

1 голос
/ 01 ноября 2011

Что означает, что строковая переменная не может быть изменена, но может быть изменена строка?

На самом деле текст, который вы цитировали, означает полную противоположность этому.

Строковая переменная может быть назначена (т.е. заменена).Пример:

String s = "first";
s = "second";

Это заменяет ссылку «первый» ссылкой на «второй».

Я не могу дать вам законный пример изменения содержимого / состоянияa String, потому что вы не можете это сделать *.

* На самом деле, вы можете сделать это, нарушив инкапсуляцию объекта String с помощью отражения.Но это действительно очень плохая идея.

0 голосов
/ 01 ноября 2011

Ответ на вопрос таков: в Java строковый литерал является неизменяемым объектом .

Как уже было сказано другими программистами, вы можете изменить ссылку, да, но вы никогда не можете изменить неизменяемый объект (это гарантированно невозможно изменить).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...