흔히 볼 수 있 는 자바 면접 문제 - 세 번 째 부분: 과부하 (overloading) 와 재 작성 (overriding)

4889 단어
ImportNew 주: 본 고 는 ImportNew 가 컴 파일 하여 정리 한 자바 면접 문제 시리즈 의 글 중 하나 입 니 다.너 는 여기에서 모든 자바 면접 시 리 즈 를 볼 수 있다.
이 글 에서 흔히 볼 수 있 는 면접 문 제 는 과부하 (overloading) 방법 과 재 작성 (overriding) 방법 에 관 한 것 이다.
Q. 다음 코드 세 션 의 출력 결 과 는 무엇 입 니까?
public class MethodOverrideVsOverload {
 
 public boolean equals( MethodOverrideVsOverload other ) {
     System.out.println("MethodOverrideVsOverload equals method reached" );
     return true;
   }
 
 public static void main(String[] args) {
  Object o1 = new MethodOverrideVsOverload();
  Object o2 = new MethodOverrideVsOverload();
 
  MethodOverrideVsOverload o3 = new MethodOverrideVsOverload();
  MethodOverrideVsOverload o4 = new MethodOverrideVsOverload();
 
  if(o1.equals(o2)){
   System.out.println("objects o1 and o2 are equal");
  }
 
  if(o3.equals(o4)){
   System.out.println("objects o3 and o4 are equal");
  }
 }
}

A. 출력 결 과 는:
MethodOverrideVsOverload equals method reached
objects o3 and o4 are equal
이 문 제 는 어떤 개념 을 고찰 하 였 습 니까?
자바 언어 에서 하나의 클래스 는 하나의 클래스 에서 만 계승 할 수 있 습 니 다 (즉, 단일 계승 구조). 계승 한 클래스 를 명시 적 으로 표시 하지 않 으 면 Object 대상 에서 자동 으로 계승 합 니 다.
대부분의 비 final 대상 클래스 방법 은 하위 클래스 에 다시 쓰기 (overridden): public boolean equals(Object obj); // make note of this method
public int hashCode();
public String toString();
재 업로드 방법 은 컴 파일 할 때 역할 을 합 니 다 (예 를 들 어 정적 바 인 딩). 재 작성 방법 은 실행 할 때 역할 을 합 니 다 (예 를 들 어 동적 바 인 딩).정적 바 인 딩 은 JVM 이 컴 파일 할 때 호출 하 는 클래스 나 방법 을 결정 하 는 것 을 의미 합 니 다.동적 바 인 딩 시 JVM 은 실행 할 때 호출 하 는 클래스 나 방법 을 결정 합 니 다.동적 바 인 딩 디자인 은 다 중 적 인 기초 이다.컴 파일 시 와 실행 시 에 대해 더 알 고 있 습 니 다. 하위 클래스 에서 부모 클래스 를 다시 쓰 는 대응 방법 은 다음 과 같은 규칙 을 따라 야 합 니 다. 매개 변수
가 변 하지 않 습 니 다.
반환 형식
가 변 하지 않 습 니 다. 협 변 반환 형식 이나 하위 형식 (covariant (subtype) returns 를 제외 합 니 다.
이상 하 다
하위 클래스 에 서 는 더 적은 이상 을 던 질 수 있 지만, 부모 클래스 에 정의 되 지 않 은 검사 이상 을 절대 던 져 서 는 안 됩 니 다.
접근 권한
부류 보다 대응 방법 이 더 느슨 하 다.
호출
실행 시 (즉 동적 바 인 딩) 대상 유형 에 따라 호출 의 구체 적 인 방법 을 결정 합 니 다.
이제 위의 코드 를 돌아 보 세 요. MethodOverrideVs Overload.  클래스 의 "equals (MethodOverrideVs Overload other)" 방법 은 Object 클래스 의 "Public boolean equals" 를 다시 쓰 지 않 았 습 니 다. 방법이것 은 매개 변수 규칙 을 어 겼 기 때 문 입 니 다. 그 중 하 나 는 MethodOverrideVs Overload 입 니 다. 유형, 다른 하 나 는 Object 유형 입 니 다.따라서 이 두 가지 방법 은 리 셋 관계 (컴 파일 할 때 발생) 이지 리 셋 관계 가 아니다.
따라서 o1. equals (o 2) 를 호출 할 때 object 류 의 Public boolean equals (Object obj) 방법 을 실제로 호출 했 습 니 다.이것 은 컴 파일 할 때 o1 과 o2 는 모두 Object 형식 이 고 Object 류 의 equals (...) 방법 은 메모리 주소 비교 (예 를 들 어,Object@235f56화해시키다Object@653af32) 네, 그래서 false 로 돌아 갑 니 다.
o 3. equals (o4) 를 호출 할 때 실제 MethodOverrideVs Overload 를 호출 했 습 니 다. 클래스 의 equals (MethodOverrideVs Overload other) 방법.컴 파일 할 때 o 3 과 o 4 는 모두 MethodOverrideVs Overload 형식 이기 때문에 이 같은 결 과 를 얻 었 다.
이제 질문 을 어떻게 할 까요?
Q. 위 에 있 는 문 제 는 어떻게 해결 하나 요?
A. 자바 5 에 좋 은 컴 파일 시 주석 (copile time annotations) @ override 를 포함 하여 부모 클래스 방법 을 정확하게 재 작성 할 수 있 도록 주 해 를 추가 하 였 습 니 다.위의 코드 에 주 해 를 추가 하면 JVM 은 컴 파일 오 류 를 던 집 니 다.
따라서 해결 방법 은 MethodOverrideVs Overload 를 주 는 것 이다.  클래스 의 boolean equals (MethodOverrideVsOverload other) 방법 으로 @ override 주 해 를 추가 합 니 다.이렇게 하면 컴 파일 할 때 오류 가 발생 할 수 있 습 니 다.그 다음 에 방법의 매개 변 수 를 수정 하여 MethodOverrideVs Overload 에서 Object 로 바 꿔 야 합 니 다. 구체 적 으로 다음 과 같 습 니 다.
public class MethodOverrideVsOverload {
 
 @Override
 public boolean equals( Object other ) {
     System.out.println("MethodOverrideVsOverload equals method reached" );
     return true;
 }
 
 public static void main(String[] args) {
  Object o1 = new MethodOverrideVsOverload(); //during compile time o1 is of type Object
                                              //during runtime o1 is of type MethodOverrideVsOverload
  Object o2 = new MethodOverrideVsOverload(); //during compile time o2 is of type Object
                                              //during runtime o2 is of type MethodOverrideVsOverload
 
  MethodOverrideVsOverload o3 = new MethodOverrideVsOverload(); //o3 is of type MethodOverrideVsOverload
                                                                // during both compile time and runtime
  MethodOverrideVsOverload o4 = new MethodOverrideVsOverload(); //o4 is of type MethodOverrideVsOverload
                                                                // during both compile time and runtime
 
  if(o1.equals(o2)){
   System.out.println("objects o1 and o2 are equal");
  }
 
  if(o3.equals(o4)){
   System.out.println("objects o3 and o4 are equal");
  }
 
 }
 
}

출력:
MethodOverrideVsOverload equals method reached
objects o1 and o2 are equal
MethodOverrideVsOverload equals method reached
objects o3 and o4 are equal
위의 코드 에서 실행 할 때 equals 방법 은 Object 의 해당 방법 을 정확하게 다시 썼 습 니 다.이것 은 비교적 헷 갈 리 기 쉬 운 문제 로 면접 을 볼 때 관련 개념 을 상세 하 게 설명 해 야 한다.

좋은 웹페이지 즐겨찾기