0

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

У меня есть конструктор в качестве OuterObject класса:

private InnerObject io; 
public OuterObject(InnerObject io){ 
    this.io = io; 
} 

public InnerObject getInnerObject(){ 
    return this.io; 
} 

Если я передать OuterObject в метод копирования, как это:

InnerObject io = new InnerObject(); 
OuterObject o = new OuterObject(io);  
anotherClass.getCopyOf(o); 

и в другом классе:

public static OuterObject getCopyOf(InnerObject o){ 
    return new OuterObject(o.getInnerObject()); 
} 

Как вы можете видеть, я создаю OuterObject с помощью InnerObject в качестве параметра. Теперь я хотел бы знать:

Могу ли я получить два новых объектов от оператора возврата, или это только новая OuterObject копия, но та же ссылка на существующий InnerObject?

ответ

2

Если вы храните объекты в переменных или параметрах, вы всегда сохраняете ссылку. Объект никогда не копируется. Скопированы только примитивные типы, такие как int или boolean.

Если вы хотите создать копии объектов, вы должны изучить клонирование объектов, используя интерфейс java.lang.Cloneable и метод Clone или конструктор копирования. Вы выбираете только вопрос предпочтения. Я обычно переписываю конструкторы копирования, поскольку они более четко показывают, что происходит. По крайней мере для меня.

Также ваша линия return new Object(o.getInnerObject()); не компилируется. Но я думаю, вы хотели написать OuterObject вместо Object здесь.

+0

извините да, я исправил его – MidgarZolom

2

Прежде всего, new Object(o.getInnerObject()) не компилируется, так как Object не имеет соответствующего конструктора.

Предполагая, что вы заменить его new OuterObject (o.getInnerObject());, новый экземпляр OuterObject будет содержать тот же экземпляр InnerObject что o содержит, так как конструктор OuterObject не создает копию InnerObject экземпляра, переданного ей.

+0

Я добавил получателя – MidgarZolom

+0

@MidgarZolom геттер не изменил моего ответа (если бы геттер вернул копию this.io, ответ изменился). – Eran

2

Вы получаете столько же объектов, сколько создали с помощью ключевого слова new.

0

В коде содержатся ошибки в этой строке: return new Object (o.getInnerObject()); o является экземпляром Object.So, он не может иметь такой метод, как getInnerObject(); Кроме того, у Object нет конструктора типа Object (InnerObject). Таким образом, измените

public static Object getCopyOf(Object o){ 
 
    return new Object(o.getInnerObject()); 
 
}

в

public static OuterObject getCopyOf(Object o){ 
 
    return new OuterObject(((OuterObject)o).getInnerObject()); 
 
}

Мы можем ответить на ваш вопрос сейчас. «new» всегда будет создавать новый объект в кучевой памяти, но два объекта externalObject имеют одну и ту же внутреннюю ссылку на объект.

+0

да, я немного под давлением времени, я сделал некоторые ошибки при вводе здесь, я надеюсь, что я исправил их всех, но суть моего вопроса должна быть ясной и уже ответила – MidgarZolom

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