2016-10-11 2 views
0

java의 == 연산자는 두 객체가 동일한 메모리 위치에 있는지 검사합니다. 복용량이 의미하는 경우 object1 != object2 다음 object1obejct2와 연결되어 있지 않습니다? 연결된 경우 즉, object1이 변경되면 obejct2도 변경됩니다.Java에서의 동일성

+0

객체 1과 2는 동일한 참조를 가리키는 자동차가, 나는 빨간색 car2 칠 경우, 어떤 색상 car1했다 ??? –

+2

첫 번째 문장에서 질문에 대답했다고 생각합니다. –

+0

두 주소가 동일한 개체를 가리키는 경우 하나의 개체 만 있습니다. –

답변

3

== 두 개의 참조이 동일한 지 확인합니다.

즉, 검사 결과가 true이면 이고 하나는입니다.

false를 반환하면 두 개의 개체가 있습니다.

물론 코드를 작성할 수있는 곳은 a! = b; 그러나 a.foo()는 b에 영향을줍니다.

처럼 :

class Bar { 
    private static int counter = 0; 
    void foo() { counter++ }; 
    int getCounter() { return counter; } 

당신이 지금 가지고있는 경우 : 본 뒤

Bar a = new Bar(); 
Bar b = new Bar(); 

A = B; 하지만 여전히, 당신이 할 때

System.out.println(b.getCounter()); 
a.foo(); 
System.out.println(b.getCounter()); 

는 0을 출력합니다 다음 1

그래서 본질적으로, 두 번째 질문에 대한 답은 다음과 같습니다! A = B는 하지는 "뭔가를하고 있다는 것을 의미 않습니다 A는 "B 아무것도하지 않는다"

그러나 레코드 - 마지막 문장 정적 좋은 OO 디자인의 이상으로 볼 수있는 이유가 있음;. 정확히 같은 "이상한"부작용

.

편집하면 "컨테이너 및 복제와 어떻게됩니까?" ! 당신은 같은 것을 가지고 물론

, 그런 다음

List<WhatEver> a = some list containing one object "X" 
List<WhatEver> b = a "clone" of a 

A = B를; 하지만 물론; b.get (0) ...에 영향을 미치는 a.get (0) .foo()를 호출 할 때 ... 내부적으로 같은 목록을 가리키고 있기 때문에 X

다음과 같이 표시됩니다.이 경우 a.equals (b)는 을 반환합니다.; 반면 a == b는 거짓입니다.

+0

예를 들어 다른 객체를 포함하는 객체를 복제합니까? 복제 된 개체 내부의 개체가 같은 위치를 가리 키지 않습니까? –

+0

@AlexanderSimko 얕은 복사본과 전체 복사본에는 차이가 있습니다. 복사 된 객체 내부의 얕은 복사 객체는 동일합니다. 딥 카피에서는 내부의 오브젝트도 복사됩니다. – puhlen

+0

내 대답이 업데이트되었습니다. 희망이 도움이됩니다. – GhostCat

3

두 개의 포인터가 같은지 확인합니다. 그들은 같은 대상을 가리킨다.

0

처음에 - 및 object2은 개체 자체가 아니며 개체가 null 인 경우를 제외하고 개체를 참조하는 변수입니다. 따라서 ==은 두 객체가 같은 메모리 위치에 있는지 확인하지 않지만 (두 가지 객체가 같은 객체를 참조하는지 여부를 확인합니다) 따라서 object1! = object2 인 경우 두 변수는 동일한 객체에 대한 참조를 포함하지 않습니다.당신은 이름과 나이 인간의 인스턴스를 만들 때, 등호를 오버라이드 (override) 할 경우에 나는 예제를 통해 쉽게 이해할 수있을 거라고 생각

0

가 가장 좋은 예 이럴이며, 방법은 동일 읽

  • John (John)이 John과 같은 경우 두 사람이 동일 함 (John의 클론)
  • 전달 된 객체가 사람이 아니라면 false를 반환하면 서로 다릅니다 (예 : 알고있는 개)
  • 다음 사람이 동일하면 필드별로 필드를 확인하십시오. 비록 다른 인간이라 할지라도 같은 나이의 다른 요한이 되십시오.

     public class Human { 
    
         private final String name; 
         private final int age; 
    
         public Human(String name, int age) { 
          this.name = name; 
          this.age = age; 
         } 
    
         public String getName() { 
          return this.name; 
         } 
    
         public int getAge() { 
          return this.age; 
         } 
    
         @Override 
         public boolean equals(Object o) { 
          if (this == o) { 
           return true; 
          } 
    
          if (!(o instanceof Human)) { 
           return false; 
          } 
    
          Human that = (Human) o; 
    
          if (this.age != that.age) return false; 
          return this.name != null ? this.name.equals(that.name) : that.name == null; 
    
         } 
    
         @Override 
         public int hashCode() { 
          int result = name != null ? name.hashCode() : 0; 
          result = 31 * result + age; 
          return result; 
         } 
        }