자바 다형성
다형성에는 두 가지 유형이 있습니다.
(1) 컴파일 타임 다형성 (설계 시간 다형성) : 메소드 과부하.
(2) 런타임 다형성 : Java 런타임 시스템은 런타임 다형성이라고하는 방법을 호출하는 인스턴스 유형을 기반으로 호출 할 방법을 결정합니다. (우리가 일반적으로 말하는 것은 런타임 다형성이므로 다형성은 주로 런타임 다형성을 나타냅니다)
런타임에 다형성의 존재에 필요한 세 가지 조건 :
1. 상속이 있어야합니다 (인터페이스의 구현 포함).
2. 다시 쓰여야합니다.
3. 부모 클래스 참조는 아동 클래스 객체를 가리 킵니다.
다형성의 이점 :
1. 대체 가능성. 다형성은 기존 코드와 상호 교환 가능합니다. 예를 들어, 다형성은 Circle Circle 클래스에서 작동하며 원과 같은 다른 원형 형상에서도 작동합니다.
2. 확장 성. 다형성은 코드로 확장 가능합니다. 새로운 서브 클래스를 추가해도 기존 클래스의 다형성, 상속 및 기타 특성의 작동 및 작동에 영향을 미치지 않습니다. 실제로 새로운 서브 클래스를 추가하여 다형성 기능을 얻는 것이 더 쉽습니다. 예를 들어, 원뿔, 세미콘 및 반구의 다형성을 실현하기 위해 구체의 다형성을 추가하기가 쉽습니다.
3. 인터페이스 가능성. 다형성은 방법 시그니처를 통해 슈퍼 클래스에 의해 달성되며, 서브 클래스에 대한 공통 인터페이스를 제공하고 서브 클래스는 서브 클래스에 의해 구현되어이를 개선 또는 덮어 쓰는 서브 클래스에 의해 구현된다. 그림 8.3에서 볼 수 있듯이. 그림에서, 슈퍼 클래스 모양은 다형성, computearea () 및 computeVolume ()을 구현하는 두 가지 인터페이스 방법을 지정합니다. 원 및 구체와 같은 서브 클래스는 다형성을 달성하기 위해이 두 인터페이스 방법을 개선 또는 무시합니다.
4. 유연성. 응용 프로그램에서 유연하고 다양한 작업을 반영하고 사용 효율성을 향상시킵니다.
5. 단순성. 다형성은 응용 프로그램 소프트웨어의 코드 쓰기 및 수정 프로세스를 단순화합니다. 특히 많은 객체의 작업 및 작업을 처리 할 때이 기능은 특히 두드러지고 중요합니다.
참고 : 우선 순위는 높음에서 낮은 것입니다 : this.show (o), super.show (o), this.show (super) o), super.show ((Super) o).
관련 인터뷰 질문 :
클래스 A {public String show (d obj) .. {return ( "a and d"); } public string show (a obj) .. {return ( "a and a"); }} 클래스 B는 A {public String show (b obj)를 확장합니다. {return ( "b and b"); } public String show (A obj) .. {return ( "b and a"); }} class c가 b ... {} 클래스 d가 b ... {} 확장됩니다.(2) 질문 : 다음 출력 결과는 무엇입니까?
A a1 = 새로운 a ();
a2 = 새로운 b ();
B B = 새로운 B ();
C C = 새로운 C ();
d d = 새로운 d ();
System.out.println (a1.show (b)); ①
System.out.println (a1.show (c)); ②
System.out.println (a1.show (d)); ③
System.out.println (a2.show (b)); ④
System.out.println (a2.show (c)); ⑤
System.out.println (a2.show (d)); ⑥
System.out.println (B.show (b)); ⑦
System.out.println (B.show (c)); ⑧
System.out.println (B.show (d)); ⑨
(iii) 답변
① a와 a
② a와 a
③ a와 d
b and a
b and a
⑥ a와 d
⑦ b와 b
⑧ b와 b
⑨ a와 d
분석 :
이런 종류의 질문을 할 때는 항상 우선 순위 순서를 사용해야합니다.
질문 1 :
A1은 클래스 A의 인스턴스화 된 객체이므로 A를 가리키 다음 (B)를 찾습니다. 방법이 없기 때문에 Super.show (b)로 이동합니다. 그러나 클래스 A에는 슈퍼 클래스가 없으므로이 점으로 이동합니다 (Super B). B의 슈퍼 클래스는 A이므로 this.show (a)와 같습니다. 그런 다음이 메소드는 클래스 A에서 발견되므로 A와 A는 출력됩니다.
질문 2 :
마찬가지로, A1은 클래스 A의 인스턴스화 된 객체이므로 A를 가리키 다음 this.show (c) 클래스 A를 검색합니다. 그러한 방법이 없기 때문에 Super.show (c)로 이동합니다. 클래스 A의 슈퍼 클래스에서 이것을 찾기 때문에 A에는 슈퍼 클래스가 없으므로 this.show (Super C)로 이동합니다. C의 슈퍼 클래스는 B이므로 클래스 A의 Show (B) 메소드를 찾았지만 찾지 못했습니다. 그런 다음 B는 A 인 슈퍼 클래스도 가지고 있으므로 이것을 찾고 있습니다. (a)를 찾았으므로 A와 A를 출력합니다.
질문 3 :
마찬가지로, A1은 클래스 A의 인스턴스화 된 객체이므로 A를 가리킨 다음 이것을 찾습니다. Show (d) 클래스 A에서 메소드가 발견되므로 A와 D가 출력됩니다.
질문 4 :
A2는 클래스 B의 기준 객체이며, 유형 A가 있는데 클래스 A를 가리킨 다음 클래스 A에서 (B) 메소드를 찾을 수는 없지만 Super.show (B)에 도달합니다. 클래스 A에는 슈퍼 클래스가 없으므로이 도착 (Super B). B의 슈퍼 클래스는 A, 즉 Super B = A 이므로이 방법을 실행하십시오. 쇼 (a), 메소드 A에서 쇼 (a)를 찾아서 찾아보십시오. 그러나 A2는 클래스 B의 기준 객체이기 때문에 클래스 B는 (a) 클래스 A, 즉 클래스 B의 쇼 (a) 메소드의 최종 실행, 즉 출력 B 및 A;
질문 5 :
A2는 클래스 B의 기준 객체이며, 이는 A 클래스 A를 가리킨 다음 클래스 A에서 (C) 메소드를 찾았지만 찾을 수 없었기 때문에 Super.show (C) 메소드를 찾지 못했습니다. 클래스 A에는 슈퍼 클래스가 없으므로 B이므로 B이므로 클래스 A에서 발견되지만 찾을 수는 없습니다. B는 또한 슈퍼 클래스, 즉 A, A, 따라서 클래스 A에서 쇼 (a) 메소드를 계속 찾고 있지만 A2는 클래스 B의 기준 객체이기 때문에 클래스 B는 (a) 클래스 A 방법을 다루기 때문에 최종적으로 실행됩니다. 쇼 (a) 클래스 B의 방법, 즉 B 및 A의 출력;
질문 6 :
A2는 클래스 B의 참조 객체이며, 유형 A가 있는데 클래스 A를 가리킨 다음 클래스 A에서 (D) 메소드를 찾아 찾았습니다. 그러나 A2는 클래스 B의 기준 객체이므로 클래스 B에서 발견되므로 클래스 B에 재정의 쇼 (D) 메소드가 있는지 여부가 발견되므로 실행됩니다. 따라서 클래스 A의 쇼 (d) 메소드, 즉 출력 A 및 D;
질문 7 :
B는 클래스 B의 인스턴스화 된 대상이다. 총리는 이것을 실행한다. 쇼 (b), (b) 클래스 B의 쇼 방법을 찾고, 그것을 찾아, b와 b를 직접 출력한다.
질문 8 :
B는 클래스 B의 인스턴스형 대상입니다. 총리는이를 실행하고, (c)를 실행하고 클래스 B에서 쇼 (c) 방법을 찾지만, super.show (c)로 갈 때 B의 슈퍼 클래스는 A이기 때문에 A 클래스 A의 쇼 (C) 방법을 찾을 때 (C)를 찾을 때 (C)를 찾을 때, C는 슈퍼 클래스를 찾을 수 있습니다. show (b) f 클래스 B에서 f 메소드를 찾으십시오. 나는 그것을 발견합니다. 그래서 클래스 B에서 쇼를 실행할 때, 나는 B와 B를 출력합니다.
질문 9 :
B는 클래스 B의 인스턴스화 된 대상입니다. 총리는 이것을 실행합니다. 쇼우 (d), 클래스 B에서 쇼 (d) 방법을 찾지만 찾을 수 없으므로 super.show (d)로갔습니다. B의 슈퍼 클래스는 클래스 A이므로 클래스 A의 쇼 (d) 메소드를 찾아서 A와 D를 찾았습니다.
이것은 인터넷에서 질문을 읽은 후 요약 한 방법입니다. 나는 그것이 모든 사람에게 도움이되기를 바랍니다.
읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!