2012-06-01 2 views
3

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

public class MyClass 
{ 
    public String text = "original"; 
    public MyClass(String text) 
    { 
     this.text = text; 
    } 
} 

Затем я создал следующие 2 сценария:

1.

String object1 = new String("original"); 
String object2 = new String("original"); 
object2 = object1; 
object2 = "changed"; 
System.out.println(object1); 
System.out.println(object2); 

Результат:

original 
changed 

2.

MyClass object1 = new MyClass("object1"); 
MyClass object2 = new MyClass("object2"); 
object2 = object1; 
object2.text = "changed"; 
System.out.println(object1.text); 
System.out.println(object2.text); 

Результат:

changed 
changed 

Теперь почему текстовое поле совместно, как статическое поле?

+2

@DyapaSrikanth: Если вы собираетесь дать ответ, пожалуйста, сделайте это * в * ответ - но в идеале сделать это в полном английском языке, а не текст-говорить. –

ответ

7

Теперь почему текстовое поле делится как статическое поле?

Посмотрите на этой линии:

object2 = object1; 

Вот установив значение переменной object2 быть таким же, как значение переменной object1. Эти значения переменных - это ссылки - объекты не сами.

Итак, после этой строки обе переменные имеют значения, относящиеся к одному и тому же объекту. Если вы измените объект через одну переменную, вы все равно увидите это изменение с помощью другой переменной. Чтобы выразить это в реальных условиях: предположим, у вас есть два листа бумаги, каждый с вашим домашним адресом, и дайте их двум разным людям. Первый идет и красит вашу переднюю дверь красным, затем второй идет навестить ваш дом - они все равно будут видеть красный фронт-ду.

Это очень важно выделить три концепции:

  • объектов
  • Переменные
  • Ссылки

Значение переменной (или любое другое выражение, на самом деле) является всегда либо примитивное значение (int, char и т. д.), либо ссылку. Это never целый объект.

Изменение значения одной переменной никогда изменяет значение другой переменной, так что здесь:

String object1 = new String("original"); 
String object2 = new String("original"); 
object2 = object1; 
object2 = "changed"; 

... мы изменяем значение object2 раз, чтобы иметь такое же значение, как object1 , а затем иметь другое значение, ссылаясь на объект String с текстом «изменено». Это никогда не изменяет значение object1.

Помогло ли это? Если нет, пожалуйста, спросите о очень конкретных случаях - проще всего выделить несколько ситуаций отдельно, а не обобщать.

1

объект2 = объект1; после этого объект2 ссылается на тот же объект, что объект1 ссылается.

объект2.text = "changed"; здесь значение текст становится изменен. Теперь как оба object1 и object2 ссылаются на один и тот же объект, поэтому выход такой же.

4

наглядного представления объяснить такое поведение

Шаг 1.

MyClass object1 = new MyClass("object1"); 
MyClass object2 = new MyClass("object2"); 

Шаг 2.

object2 = object1; 

Step3.

object2.text = "changed"; 

enter image description here

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