0

메서드 매개 변수의 참조/값에 의한 Java의 통과에 대해 다소 혼란 스럽습니다.메서드 매개 변수로 전달하여 개체 복사

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

와 다른 클래스에 : 나는이 같은 복사 방법 내로 OuterObject를 전달하면

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

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

:

가 나는 OuterObject 클래스의 생성자가

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

여러분도 알다시피와 함께 OuterObject을 만듭니다.을 매개 변수로 사용합니다. 지금 나는 알고 싶다 :

할 일을 내가, return 문에서 을 두 개의 새로운 객체를 얻거나 단지 기존의 InnerObject에 새로운 OuterObject 복사 할 수 있지만 동일한 참조입니까? Object가 일치하는 생성자를 가지고 있지 않기 때문에 모든

답변

2

변수 또는 매개 변수에 개체를 저장하면 항상 참조가 저장됩니다. 개체가 복사되지 않습니다. int 또는 boolean과 같은 기본 형식 만 복사됩니다.

개체의 복사본을 만들려면 java.lang.Cloneable 인터페이스와 Clone 메서드 또는 복사본 생성자를 사용하여 개체 복제를 조사해야합니다. 당신이 선택한 것은 선호도의 문제입니다. 나는 대체로 복사 생성자가 무슨 일이 일어나고 있는지 명확하게 보여주기 때문에 복사 생성자를 찾습니다. 적어도 나에게는.

또한 당신의 라인 return new Object(o.getInnerObject());은 컴파일되지 않습니다. 하지만 여기에 Object 대신 OuterObject을 쓰고 싶습니다.

+0

죄송합니다. 죄송합니다. 제가 대답했습니다. – MidgarZolom

2

첫째, new Object(o.getInnerObject())는 컴파일되지 않습니다.

당신이 new OuterObject (o.getInnerObject());로 대체 가정, OuterObject의 새 인스턴스가 OuterObject의 생성자는 전달 된 InnerObject 인스턴스의 복사본을 생성하지 않기 때문에 o이 포함되어 있다는 InnerObject의 동일한 인스턴스를 포함 할 것이다. 당신이 new 키워드로 만든로

+0

나는 getter가 내 대답을 변경하지 않는 @MidgarZolom 인 – MidgarZolom

+0

을 추가했습니다. getter가 this.io의 복사본을 반환 했더니 응답이 변경되었을 것입니다. – Eran

2

당신은 많은 개체를 얻을.

0

귀하의 코드는이 라인의 오류를 컴파일 한 : 새로운 객체를 반환 (o.getInnerObject()); o는 Object.So의 인스턴스이므로 getInnerObject()와 같은 메서드를 사용할 수 없습니다. 또한 Object에는 Object (InnerObject)와 같은 생성자가 없습니다. 그래서, 우리는 지금 귀하의 질문에 대답 할 수

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

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

을 변경합니다. 'new'는 항상 힙 메모리에 새로운 객체를 생성하지만, 두 개의 outerObject는 동일한 innerObject 참조를가집니다.

+0

예 시간 압박감에 조금 빠졌습니다. 여기에 타이핑 할 때 약간의 실수가있었습니다. 모두 수정했으면 좋겠지 만 제 질문의 본질은 분명해야하며 이미 대답되어 있습니다. – MidgarZolom

관련 문제