다형성이란 무엇인가요?
다형성은 두 가지 유형으로 나뉩니다.
(1) 컴파일 타임 다형성(디자인 타임 다형성): 메소드 오버로딩.
(2) 런타임 다형성: JAVA 런타임 시스템은 메서드를 호출하는 인스턴스 유형에 따라 호출할 메서드를 결정하는데, 이를 런타임 다형성이라고 합니다. (우리는 일반적으로 런타임 다형성에 대해 많이 이야기하므로 다형성은 주로 런타임 다형성을 나타냅니다.)
런타임 다형성이 존재하려면 세 가지 필수 조건이 있습니다.
1. 상속이 있어야 합니다. 인터페이스);
2. 다시 작성해야 합니다.
3. 상위 클래스 참조는 하위 클래스 객체를 가리킵니다.
------------------------------- ------ ----------
자세한 설명 :
런타임 다형성에 대한 설명: a. 런타임 다형성은 프로그램에서 정의된 참조 변수가 가리키는 특정 유형을 의미하며 b. 참조 변수를 통해 실행되는 메소드 호출은 프로그래밍할 때 결정되지 않습니다. 프로그램이 실행 중입니다. 이 기간 동안 참조 변수가 어떤 클래스의 인스턴스 개체를 가리키는지 결정됩니다. 이는 프로그램 실행 중에 결정되어야 하는 클래스입니다. .
1 . 프로그램에 정의된 참조 변수가 가리키는 특정 유형(즉, 참조 변수가 어떤 클래스 인스턴스 객체를 가리키는지)이 확실하지 않습니다.
예:
운전자 클래스의 운전 방법(Vehicle 클래스 차량) {}
•oneDriver.drive( new car() )
•oneDriver.drive( newbus() )
차량 변수는 어떤 하위 클래스 인스턴스가 사용되는지 결정할 수 없습니다.
1. 참조 변수를 통해 발행된 메소드 호출은 프로그래밍 중에 결정되지 않습니다(참조 변수에 의해 발행된 메소드 호출은 어떤 클래스에서 구현된 메소드입니다).
예: 요리사, 정원사, 이발사의 Cut 메소드는 .persion.cut()을 호출합니다.
----------------- - ------------------------------------------------- - ----------
다형성의 이점:
1. 다형성을 통해 기존 코드를 대체할 수 있습니다. 예를 들어 다형성은 Circle 클래스에 적용되지만 토러스와 같은 다른 원형 형상에도 적용됩니다.
2. 확장성. 다형성은 코드를 확장 가능하게 만듭니다. 새 하위 클래스를 추가해도 다형성, 상속, 기존 클래스의 다른 기능의 작동에는 영향을 미치지 않습니다. 실제로 다형성 함수를 얻으려면 새 하위 클래스를 추가하는 것이 더 쉽습니다. 예를 들어 원뿔, 반원뿔, 반구의 다형성을 구현한 후 구 클래스의 다형성을 추가하는 것은 쉽습니다.
3. 인터페이스 능력. 다형성은 메소드 시그니처를 통해 하위 클래스에 공통 인터페이스를 제공하는 상위 클래스와 이를 완료하거나 재정의하는 하위 클래스에 의해 달성됩니다. 그림 8.3과 같습니다. 그림의 슈퍼 클래스 Shape는 다형성을 구현하는 두 가지 인터페이스 메서드인 ComputeArea() 및 ComputeVolume()을 지정합니다. Circle 및 Sphere와 같은 하위 클래스는 다형성을 달성하기 위해 이러한 두 가지 인터페이스 메서드를 개선하거나 재정의합니다.
4. 유연성. 애플리케이션에서 유연하고 다양한 작업을 구현하고 사용 효율성을 향상시킵니다.
5. 단순함. 다형성은 응용 프로그램 소프트웨어의 코드 작성 및 수정 프로세스를 단순화합니다. 이 기능은 많은 수의 개체에 대한 계산 및 작업을 처리할 때 특히 두드러지고 중요합니다.
실용적 적용:
구성 파일 사용과 결합하여 Spring 프레임워크에 접속하고 리플렉션을 사용하고 클래스를 동적으로 호출하고 소스 코드를 수정하지 않고 새 클래스를 직접 추가하고 구성 파일을 수정합니다. 필요 없음 서버를 다시 시작하면 프로그램을 확장할 수 있습니다.
------------------------------- ------ ----------
요약:
상위 클래스 유형의 참조를 사용하여 하위 클래스의 객체를 가리킵니다. 참조는 마스터 클래스에 정의된 메서드와 변수를 호출합니다. 상위 클래스가 하위 클래스에서 재정의된 후 이 메소드가 호출되면 하위 클래스의 메소드가 호출됩니다.
상위 클래스 참조에 의해 호출되는 메소드의 매개변수 목록이 있는 경우 주의하세요. 정의되지 않은 경우 상위 클래스의 상위 클래스를 호출하여 이를 찾습니다. 아직 찾지 못한 경우 매개변수 목록의 매개변수 유형으로 강제로 up-type 변환합니다. 구체적인 우선순위는 다음과 같습니다. :
this.show(O), super.show(O), this.show((슈퍼)O), super.show((슈퍼)O).
------------------------------- ------ ----------
클래식 작문 테스트 질문(혼합 오버로딩 및 재작성):
(1) 관련 클래스
class A { public String show(D obj)...{ return ("A and D"); } public String show(A obj)...{ return ("A and A"); } } class B extends A{ public String show(B obj)...{ return ("B and B"); } public String show(A obj)...{ return ("B and A"); } } class C extends B...{} class D extends B...{}
(2) 질문: 다음 출력 결과는 무엇입니까?
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new 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)); 7
System.out.println(b.show(c)); 8
System.out.println(b.show(d)); 9
(三)答案
① A와 A
② A와 A
③ A와 A
④ B와 A
⑤ B와 A
6 A 및 D
7 B 및 B
8 B 및 B
⑨ D
(4)분析
① ② ③比较好理解,一般不会回顾一下多态性。
运行时多态性是면对对象程序设计代码중고용의 일个Java는 더 많은 성능을 제공하는 강력한 방법입니다.而不是는 编译期调사용중입니다.载方法적 机现.
방식의 重写Overriding과 重载Overloading은 Java가 더 선호하는 것과 동일하지 않습니다. 오버로딩은 중대형 방식입니다.这个방법법 ,将调而言,对它而言,父类中 는 "屏蔽"了 과 같은 방식으로 설정합니다 .或有不同的参数类型,则称为方法的载(오버로딩)。Overloaded 方法是可以改变返回值的类型但同时参数列表也得不同.
当超类对象引用变weight引用子类对象时, 被引用对象的类型而不是引用变weight的类型决决了调用谁的成员象法, 但是这个被调调是에서 超须是에서 超类中定义过的也就是说被子类覆盖적방법입니다.超类转换成子类的话,就可以调用子类中新添加而超类没유적방법了。)
!实际上这里涉及方法调用优先问题,优先级由高到低依次为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。让我们来看看它是怎么工작품입니다.
比如4,a2.show(b),a2是一个引用变weight,类型为A,则this为a2,b是B一个实例,于是它到类아리면타 show(B obj)방법,没有找到,于是到A의 super(超类)找,而A没有超类,因此转到第三优先级this.show((super)O),this仍然是a2,这里O为B,(super)O即(super)B即A,因此它到类A里面找show(A obj)적 방법, 类A有这个방법, 但是由于a2引用 是类B 个对象,B覆盖了A의 show(A obj)방법, 因此最终锁정到类B의 show(A obj), 输为"B and A".
또 다른 예는 ⑧, b.show(c), b는 B 유형의 참조 변수이고, 다음은 b이고, c는 C의 인스턴스이므로 show(C obj를 찾기 위해 클래스 B로 이동합니다. ) 메서드가 있지만 Found가 없으면 B의 슈퍼 클래스 A로 이동하여 A에 그런 것이 없으므로 세 번째 우선순위 수준인 this.show((super)O)로 이동합니다. b, O는 C, (super)O는 ( super)C는 B이므로 B에서 show(B obj) 메소드를 찾아서 찾습니다. b는 클래스 B의 객체를 참조하므로 직접 잠깁니다. 클래스 B의 show(B obj)이고 출력은 "B and B"입니다.
위의 방법을 따르면 다른 결과도 정확하게 얻을 수 있습니다.
질문은 계속됩니다. 이제 위의 분석 과정이 파란색 글꼴로 표시된 문장의 의미를 어떻게 반영하는지 살펴보겠습니다. 즉, 슈퍼클래스 객체 참조 변수가 서브클래스 객체를 참조하는 경우 참조 변수의 유형이 아닌 참조된 객체의 유형에 따라 호출되는 멤버 메서드가 결정되지만 호출되는 메서드는 슈퍼클래스에서 정의되어야 합니다. , 하위 클래스에 의해 재정의되는 메서드입니다. a2.show(b)를 예로 들어보겠습니다.
a2는 참조변수 A타입으로 B의 객체를 참조하므로 이 문장은 어떤 메소드를 호출할지 B가 결정한다는 뜻이다. 따라서 B의 show(B obj)를 호출하여 "B 및 B"를 출력해야 합니다. 그런데 왜 이전 분석에서 얻은 결과와 일치하지 않습니까? ! 문제는 파란색 글꼴의 후반부를 무시해서는 안 된다는 것입니다. 특히 다음과 같이 명시되어 있습니다. 호출된 메서드는 슈퍼 클래스에 정의되어야 합니다. 즉, 하위 클래스에 의해 재정의되는 메서드입니다. B의 show(B obj)가 슈퍼클래스 A에 정의되어 있습니까? 아니요! 커버된다는 것은 말할 것도 없습니다. 사실 이 문장에는 메시지가 숨겨져 있습니다. 메시지는 여전히 메서드 호출의 우선순위에 따라 결정됩니다. 클래스 A에서 show(A obj)를 찾습니다. 하위 클래스 B가 show(A obj) 메서드를 재정의하지 않으면 A의 show(A obj)를 호출합니다(B는 A를 상속하지만 이 메서드는 재정의되지 않음). 어떤 의미에서는 B가 여전히 호출할 메서드를 결정하지만 해당 메서드는 A에서 구현됩니다. 이제 하위 클래스 B가 show(A obj)를 재정의하므로 최종적으로 B의 show(A obj)에 고정됩니다. 그 말이 의미하는 바가 바로 이것이다.
얕은 것부터 깊은 것까지 소개된 더 많은 JAVA 다형성 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!