2014-12-05 2 views
4

Мне нужна небольшая помощь в java. Я просто новичок в java. Но я полагал, что мой фонд был довольно солидным.Что происходит, когда 2 объекта равны друг другу

Я создал простое java-приложение, когда у меня возникла небольшая проблема с двумя объектами ArrayList. Позволяет называть их list1 и list2. Если бы я должен был сделать list1 равным list2 list1 = list2; и добавить элемент в список2 list2.add(obj), этот элемент также будет добавлен в список1.

Я сделал свое исследование и выяснил, что должен сделать это вместо list1 = new ArrayList(list2); Я не знал, что объекты java работают как указатели. Я думал, что только значения передаются, когда 2 объекта равны. Я даже создал простое тестовое приложение, которое может устанавливать и получать несколько объектов. Опять же, я сравнил оба объекта. Изменение элемента 1 объекта, похоже, влияет и на другой объект. Я не знаю, как я должен искать это в Google. Вот почему я кормлю вас всей историей. Я получаю только документы, связанные с программированием c. Я чувствую, что мой фонд просто разбит на куски. Я просто знаю, как работает =. Пробовал делать

int num1 = 666; 
    int num2 = num1; 
    num1 = 42; 

Это не влияет на num2. Однако

Object obj1 = new Object(); 
    Object obj2 = obj1; 
    obj1.changeSomeElement(); 

Это влияет на obj2.
Теперь я смущен тем, как работает = в java. Кто-то, пожалуйста, поделитесь некоторыми полезными документами, чтобы я мог их прочитать. Благодаря!

+0

NOP. Это аргументы. Im запутался о том, как значение объекта в java передается другому объекту. – user859385

+0

простые типы не являются ссылками, только значение копируется '=' – rzysia

+2

. Посмотрите http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value – starf

ответ

3
int num1 = 666; 
int num2 = num1; 
num1 = 42; 

Это работает, потому что ИНТ примитивного типа данных

Object obj1 = new Object(); 
Object obj2 = obj1; 
obj1.changeSomeElement(); 

Это не работает, потому что объект является ссылочным типом данных

obj1 держит ссылку на созданный объект, и вы просто передают ту же ссылку из obj1 в obj2

То есть, оба obj1 & obj2 относятся к тому же объекту

внесены изменения в тот же объект, используете ли вы obj1 или obj2 :)

Primtive vs Reference Data Types

Очень хорошее объяснение примитивно против типов данных ссылочных, а также их последствия

+0

Эта статья, которую вы делили на Primitive vs Reference Data Types, была очень полезна. Спасибо! Мой фундамент вернулся к одной части. XD – user859385

+0

Я рад слышать это :) – Gosu

2

В переменных Java есть ссылки на объекты. Поэтому, когда вы говорите:

Object obj2 = obj1; 

obj2 сохраняет ту же ссылку, что и obj1. Вот почему, если вы изменяете объект, на который ссылается obj1, вы также редактируете объект, на который ссылается obj2 (это тот же объект, на который ссылаются две переменные).

+0

Integer объект? если это то, почему целое число не переопределяется? – user859385

+0

Не путайте int с Integer. int не являются объектами, они являются примитивными типами и не хранятся в качестве ссылок. Объекты типа Integer являются inmutable (например, String). Вы не можете изменить объект этих типов.И, конечно, объекты Integer хранятся в переменных, таких как ссылки. –

+2

@ user859385 'Integer' - это тип объекта. Это класс-оболочка для примитивного типа 'int'. – Tom

0

В вашем первом случае вы изменили num1, назначив его еще раз. Во второй раз вы вызывали метод на свой объект.

Теперь более точный ответ: когда вы назначаете объект (= является вашим оператором присваивания), то, что вы делаете, по существу говорит «это указывает на этот объект в памяти».

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

Примитивные типы (булевы, int, long, double, float, char, byte) неизменяемы: вы не можете их изменить, вы должны назначить их заново. Поэтому то, что вы на самом деле делаете, это изменение одной из ваших ссылок, не касаясь другой.

0

Не panic :) Ваша путаница создается тем, как Java хранит значения в памяти.

Может быть, эта книга может помочь вам: http://pkris001.freeshell.org/OCA.pdf Ваша проблема descriped на странице 83 (PDF-страницы 116)

Короче говоря: Java отличается хранящих объектов и примитивных значений типа данных.

Память, выделенная для вашей программы, разделена на две части. HEAP-память и STACK-память.

Только HEAP-память хранит конкретные объекты, а это не что иное.

new MyClassX(); // this object exists in the HEAP 

STACK-memory используется для хранения ссылок на эти созданные объекты.

MyClassX refVar = new MyClassX(); // refVar holds one reference to the memory-address of the new MyClassX object. 

Для примитивного типа данных это немного отличается. примитивные типы данных (булевы, байты, короткие, int, long, char, float, double, ...) хранятся непосредственно в разделе STACK-memory.

int primVal = 1; // primVal stores the concrete value not a reference of 1; 

Так что случилось, когда вы копируете ...

primitve:

типы данных
int primValOne = 1; // primVal stores the concrete value 1; 

int primValTwo = primValOne; // primValTwo is a primitive datatype so it stores the concrete value 1, NOT a reference of primValOne 

объектов:

MyClassX refValOne = new MyClassX(); // refValOne stores a reference to a HEAP-memory position 

MYClassX refValTwo = refValOne; // refValTwo stores the same reference like refValOne now 
Смежные вопросы