2013-09-07 5 views
-5
String str=new String("JAVA"); 
System.out.println("value of str before "+str); //JAVA 
String str2=null; 
str=str2; 
System.out.println("value of str"+str); //null 
System.out.println("value of str2"+str2);//null 

str="Prog"; 
System.out.println("value of str"+str); //prog 
System.out.println("value of str2"+str2);//null 

Ques 1 Если строка неизменна, почему значение str меняется?Ссылки и объекты Java String

Student stu= new Student(123);   
System.out.println("value of stu before "+stu); //some address is printed 
Student stu2=null; 
stu=stu2; 
System.out.println("value of stu"+stu); //null 
System.out.println("value of stu2"+stu2);//null 
Student stu3=new Student(456); 
stu=stu3; 
System.out.println("value of stu"+stu); //some new address 
System.out.println("value of stu2"+stu2);//null 

Ques 2.String и объекта ведут себя же образом .Затем, почему строка неизменна и объект изменяемым. Где разница

+0

Этот код Безразлично не имеет смысла и даже не будет компилироваться. – chrylis

+0

Объекты Java String являются «неизменными» - они не могут быть изменены. Тип объекта неизменен, если его класс не содержит методов (или общедоступных полей), позволяющих его изменять. –

+0

И как указано, ваш код выше не будет компилироваться, потому что javac не позволяет использовать локальную переменную, которая не была инициализирована. –

ответ

1

при создании объекта как new Student(123) или new String("JAVA") требуется пространство в куче. str, str2, stu, stu2 - ссылки, они могут содержать ссылку того же типа Объекта.

Такая же память выделяется сейчас или отличается?

Different, как String и Student не тот же класс, объект будет принимать различные места в куче.

если stu изменения будут stu2 изменить ??

Да, поскольку они оба ссылаются на один и тот же объект.

Почему объект является изменяемым, а строка неизменна?

можно лучше пройти через это SO question - Immutable class?

+0

Я отредактировал вопрос. Не могли бы вы объяснить, пожалуйста, – JavaProgrammer

0

String s никогда не может измениться, период; это основная характеристика языка.

Если, однако, str и str2 были различны, что было изменчиво, то str = str2 бы просто установить str, чтобы указать на тот же объект str2 делает, и, следовательно, изменения в str2 бы изменения в str. Обратите внимание, что в вашем конкретном случае str2 неинициализирован, поэтому ваш код не будет компилироваться.

0

Java не разрешает String s, который является лишь частью языка. Также в вашем коде str2 никогда не инициализируется.

-1

Обе строки будут использовать одну и ту же память. Однако, когда вы меняете str, str2 не изменится и наоборот. Это связано с тем, что строки в Java хранятся в пуле строк. Примите во внимание следующий код:

String str1 = "hello"; 
String str2 = "hello"; 

Оба этих строк хотел бы указать на то же место в памяти в строке пула. Когда вы «создаете» строку, она проверяет, существует ли строка в пуле строк, и если да, то указывает на эту строку. Это имеет много последствий. Например, рассмотрим:

String str1 = "hello"; 
String str2 = "hello"; 
str2 = str2 + " world"; 

В этом случае, «привет» будет добавлен в строку пула и str1 бы указать на него. str2 проверит, что «привет» существует, посмотрите, что он делает, а затем укажите на него. Последняя строка создаст целую новую строку «hello world» в пуле строк, а затем str2 укажет на нее.

+0

О, пожалуйста! Не путайте вещи с интернированными струнами! Давайте помогите парню понять разницу между «ссылкой» и «объектом» в первую очередь. –

+0

Он спросил, почему строки неизменны и что это значит. Я объяснил эту часть, и все же вы меня пометили? Особенно, когда я, очевидно, новичок в ответе на этом сайте? Способ поощрения людей к участию. – BR410bury

+0

Ну что ж, черт меня поразил. –

0

Mutable vs immutable - Строка неизменна, вы не можете изменить ее после строительства. Как, почему, есть несколько преимуществ для неизменного класса, как вы бы следовать здесь:

Difference between Mutable objects and Immutable objects

Большинство вопросов со ссылкой Java является resovled в этом посте: Is Java "pass-by-reference" or "pass-by-value"?

+0

Я отредактировал вопрос. Не могли бы вы теперь объяснить, – JavaProgrammer

+0

Q1 - значение, которое str указывает на, не изменяется, вместо этого выбирается точка str str. После назначения str = str2 str указывает на null («нигде»). Q2 - то же самое по всему, вы не меняете никакого объекта, ссылаясь на указатель, указывающий на него, на другой объект. Оба изменяемого и неизменяемого объекта могут быть назначены и привязаны к другому объекту. Попробуйте представить себе следующий пример: вы можете назвать свой стол стулом, он не изменит его характер. Если вы хотите изменить таблицу, сломайте одну из ее ног. Немой пример, но он может дать вам некоторую интуицию. – serj

Смежные вопросы