2014-03-07 3 views
0

는 잘 모르겠지만, 내가 할 경우 :가변 변수의 속성은 여러 변수 참조간에 어떻게 공유됩니까? 이 날, 또는 어떤 경우에는 내가 알았어 야하는 경우

Object a = 1; 
Object b = a; 
b = 2; 

를 A는 B와 같은 값이다. 이것은 정상적인 행동입니까? 변수를 복사하려고했기 때문에 참조하지 않았습니다.

center = new Point(0.0f,1.0f,1.0f); 
returnPoint = center; 
... 
returnPoint.x = 1.0f; 
//For some reason, above modifies center as well as return 
+3

두 가지 예가 완전히 동일하지 않습니다. 첫 번째 코드를 테스트 해 보셨습니까? 나는 그것이 'a'를 바꿀 것이라고 생각하지 않는다. –

+0

나는 이러한 모든 출력 줄을 returnPoint의 값을 검사하는 코드 아래에 놓았지만 중심을 수정할 때까지는 변경하지 않았다. – DuskFall

+0

자바가 값을 기준으로 참조를 전달한다. 그것은 그것이 일하기로되어 있었다. –

답변

3

당신은 이런 식으로 뭔가를 시도 할 수 있습니다 :

center = new Point(0.0f,1.0f,1.0f); 
returnPoint = center.clone(); 
... 
returnPoint.x = 1.0f; 

가 클론 방법은 같은 값으로 다른 인스턴스를 생성합니다

내가 묻는 이유는 내가이 같은 일부 코드가 있습니다.

+0

흠 ... 그래, 고마워. – DuskFall

+0

너무 열거 형으로 작동합니까? 마찬가지로, 나는 그들도 복제해야합니까? – DuskFall

+0

자바 열거 형을 복제 할 수 없습니다. 설계 상으로는 JVM에서 열거 형의 각 값의 인스턴스가 하나만 있어야합니다. – andreban

2

"returnPoint = center"에서는 가운데를 복사하지 않으므로 참조하십시오. 따라서 returnPoint를 수정할 때 센터를 수정해야합니다.

0

Java에서 원시가 아닌 데이터 유형의 두 변수가있는 경우 다른 값과 같게 설정해도 복제본이 제공되지 않습니다. 첫 번째 변수를 명시 적으로 복제해야합니다.

2

는 그런 다음이 b = 2 이렇게함으로써

호 (B)와 같은 값, 당신은 b = new Integer(2);을한다. 따라서 ab은 더 이상 동일하지 않습니다.

두 번째 예에서와 같이 정상적으로 나타납니다. returnPoint이고, 참조 번호center입니다. returnPoint의 내용을 수정하면 정확히 동일한 개체를 "참조"하므로 center의 내용을 수정합니다. center 사본을 만들어야합니다.

.clone() 이외의 다른 해결책은 복사 생성자를 만드는 것입니다 (즉, 또 다른 Point을 인수로 사용하는 것입니다).

0

값을 저장하려면 3 개의 부동 변수가 있어야하며 내부에 값을 저장해야합니다. 그러나 "Float"이 아닌 "float"을 사용하는 것을 잊지 마십시오.

2

귀하의 예를

Object a = 1; 
Object b = a; 
b = 2; 

가 다른 코드와 같은 문제를 설명하지 않습니다. 위의 예는 a = new Integer(1)이고 b = new Integer(2)이됩니다. 정수 인스턴스는 변경 불가능하며, Point에 대해 보유하지 않는 것을 유의하십시오.

class MutableInteger { 
    public int value; 
} 
이제

우리가 첫 번째 예제 코드의 Point - 관련 코드의 문제를 다시이 클래스를 사용하자 :

MutableInteger mi = new MutableInteger(); 
mi.value = 1; 
Object a = mi; 
Object b = a; 
mi.value = 2; 

무엇이 잘못되었는지 이해를 들어, 변경 가능한 정수 클래스를 고려

ab 모두가 MutableInteger의 동일한 인스턴스를 가리키게됩니다.후자의 인스턴스 값을 변경 했으므로 b의 변경은 a이 참조하는 값에 영향을줍니다. 그러나 a의 과제는 변경되지 않습니다!

문제를 피하려면 Point 인스턴스를 공유하면 안됩니다. 동일한 좌표를 나타내는 새로운 점을 만들기 위해

returnPoint = new Point(center); 

을 사용하십시오. center 지점의 표현을 변경하지 않고 복사 된 점을 변형 할 수 있습니다.