소프트웨어 - java... parameter



Java에서 연산자 오버로딩 (4)

Java에서 연산자 오버로딩이 없다는 것은 완전히 사실이 아닙니다. 사용자 지정 연산자 오버로드가 없습니다. 예를 들어 + 연산자를 추가하면 + 가 추가되고 String 이 추가됩니다. 이것은 언어에 의해 정의되며 개발자가 수정할 수 없습니다.

귀하의 예는 어디서나 연산자 오버로딩을 사용하지 않습니다. == 참조 형에 대해서 항상 같은 일을합니다 : 왼쪽과 오른쪽이 똑같은 객체를 참조 할 때 true 반환 합니다 .

이 경우 s1s2 는 동일한 객체를 참조하고 i1i2 는 동일한 객체를 참조합니다.

  • s1s2 는 문자열 리터럴이 인턴되기 때문에 동일한 인턴 된 String 참조합니다.
  • 자동 복싱은 일반 숫자 값에 대해 고정 된 Integer 개체 풀을 다시 사용하기 때문에 i1i2 는 동일한 캐시 된 Integer 참조합니다.

https://src-bin.com

java에 대한 지식이 있으면 Java 언어로 연산자 오버로딩이 없다는 것을 알고 있습니다. 그렇다면 왜이 코드가 'true'를 두 번 인쇄합니까?

    String s1 = "abc";
    String s2 = "abc";
    System.out.println(s1==s2);

    Integer i1 = 1;
    Integer i2 = 1;
    System.out.println(i1==i2);

Answer #1

귀하의 코드는 연산자 오버로딩과 관련이있는 것처럼 보이지만, 그렇지 않습니다.

문자열 "=="연산자는 Integer "=="연산자로 "겹쳐진"것처럼 보입니다. @Sanjay T. Sharma가 이전의 대답에서 언급했듯이, Java에서는 "참조"유형과 "=="다른 연산자를 처리하는 "프리미티브"유형이 있습니다.

Java의 문자열은 "참조"유형이며 정수는 "원시"유형입니다. 다른 언어로 포인터와 객체를 사용한다면 Java에서 문자열 변수는 실제로 객체에 대한 포인터이고 "=="연산자는 다른 동작을한다는 것을 알 수 있습니다.



Answer #3

참조 유형에 대해 == 는 참조를 비교합니다. == 원시 타입은 값을 비교합니다. 첫 번째 예제의 경우 두 개의 객체 참조가 문자열 풀이라는 개념으로 인해 동일하게 나타납니다. 그러므로 두 truetrue 입니다. 다른 코드 스 니펫을 사용해보세요.

String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));

당신이 이미 시험해 보았을 것입니다; false 그리고 나서 true 출력 true . 그 이유는 정확히 동일한 내용을 가진 문자열 객체가 문자열 풀에 이미 존재하더라도 new 키워드를 사용하면 완전히 새로운 문자열이 생성되기 때문입니다. 이 경우 s1 은 내용이 "abc"인 문자열 (문자열 풀의 문자열)을 가리키고 s2 이제 완전히 새로운 문자열 객체 (다시 "abc"라는 내용)를 가리 킵니다. 따라서 첫 번째 print 문에서 false 됩니다.

두 번째 print 문에서 우리가 수행하는 작업은 참조가 아닌 String 객체의 내용을 비교하는 것입니다.이 내용은 실제로 인쇄되어야합니다.

이것은 Java 언어의 초보자가 가장 자주 범하는 실수 중 하나입니다. 그들은 참조 비교를 실제로 수행 할 때 논리 비교를 위해 == 를 사용합니다. 문자열 풀링에 대한 자세한 내용은 여기에있는 답변 중 하나에 게시 된 링크를 참조하십시오. 관련 지음에서, String 클래스는 Object 클래스의 equals 메소드를 "오버라이드 (override)"하여 논리적 비교를 제공합니다. 작성한 클래스가 equals 메소드의 논리적 구현을 ​​제공하지 않으면 equals 를 호출하는지 또는 == 연산자를 사용하는지 상관하지 않습니다. 결과는 참조 비교가 동일하게됩니다.

평등에 대한 자세한 내용은 Brian의 기사를 참조하십시오. 훌륭한 읽기 .





java