2014-05-21 2 views
1

안녕 나는 수정과 같음의 차이를 (이해)와 '=='그러나이 코드는 정말 혼란 오전 :Java -이 두 객체는 ​​어떻게 서로 동일 할 수 있습니까?

public class MyTest { 
    public static void main(String[] args) { 
     Integer w = new Integer(1); 
     Integer x = 1; 
     double z = x; 
     System.out.println(z == w); 
    } 
} 

사용하는 경우 두 개체가 메모리에 정수 객체와 같은 참조를 가질 수있는 방법 '=='? 이걸 이해할 수 없어요. 읽어 주셔서 감사합니다!

답변

16

== 연산자를 사용하여 프리미티브와 래퍼를 비교하면 래퍼 값은 박스가 해제되고 프리미티브 값과 비교됩니다.

15.21.1 JLS 15.21.1에서. 동등 연산자의 피연산자는 숫자 형식의 모두 또는 한 숫자 형이고 다른 하나는 가변 경우 ==와! =

은 (§5.1.8) 에 숫자 타입, 이진 숫자 프로모션이 수치 평등 연산자 피연산자에서 수행됨 (§5.6.2).

+1

감사합니다. 시험 준비를 위해이 같은 까다로운 질문이있었습니다. – Gabriel

+0

Abimaran을 쓰는 것은 사실이 아닙니다. –

+0

@MironBalcerzak, 그럼 뭐가 맞습니까? JLS에 연결할 수 있습니까? –

0

double은 원시 타입이기 때문에 참조가 아닙니다. 대신 값입니다. Double이 (가) 참조되었습니다. z이 -typed doublew입니다

당신이 z == w 쓰기

Integer -typed이며, 런타임은 확실히 뭔가를 비교할 수있다. 그리고 분명히 같은 종류의 것들을 비교해야합니다. double 값과 Integer 참조를 비교하지 않습니다. 대신 Integer을 언 박싱하고 언 박싱 한 후 얻은 int 값을 double 값과 비교합니다. 둘 다 1이면 부울 연산자는 true을 반환합니다.

0

여기에 객체는 비교되지 않지만 primitive 유형은 Integer에 대해 feature 언 박싱 유형과 비교됩니다.

관련 문제