물체 지향의 세 가지 주요 특징은 캡슐화, 상속 및 다형성입니다. 특정한 관점에서, 캡슐화 및 상속은 거의 다형성을 위해 준비된다. 이것이 우리의 마지막 개념이자 가장 중요한 지식 요점입니다.
1. 정의 :
다형성 : 다른 유형의 객체가 동일한 메시지에 응답 할 수 있도록합니다. 즉, 동일한 메시지는 전송 된 다른 개체에 따라 다양한 다른 행동을 채택 할 수 있습니다. (메시지 보내는 것은 함수 호출입니다)
2. 다형성을 구현하는 기술을 : 동적 바인딩이라고하며, 이는 실행 중 실제 유형의 실제 유형을 판단하고 실제 유형에 따라 해당 방법을 호출하는 것을 나타냅니다.
3. 기능 : 유형 간의 결합 관계를 제거합니다.
4. 실제로, 다형성의 수많은 예가있다. 예를 들어, AS3 도움말 문서가 현재 Flash 인터페이스에서 팝업 된 경우 F1 키를 누릅니다. 도움말이라는 단어가 현재 단어 아래에 팝업되면; Windows 도움말이 현재 Windows에 팝업되면 Windows 도움말 및 지원이 나타납니다. 동일한 이벤트는 다른 객체에서 발생하며 다른 결과를 생성합니다.
5. 아래는 다형성 존재에 필요한 세 가지 조건이며, 꿈을 꾸었을 때 모든 사람이 암기해야합니다!
다형성에 필요한 세 가지 조건
1. 상속이 있어야합니다.
2. 다시 쓰여야합니다.
3. 부모 클래스 참조는 아동 클래스 객체를 가리 킵니다.
6. 다형성의 이점 :
1) 대체 가능성 : 다형성은 기존 코드에 대해 상호 교환 성을 가지고 있습니다. 예를 들어, 다형성은 Circle Circle 클래스에서 작동하며 원과 같은 다른 원형 형상에서도 작동합니다.
2) 확장 성 : 다형성은 코드에 확장 가능합니다. 새로운 서브 클래스를 추가해도 기존 클래스의 다형성, 상속 및 기타 특성의 작동 및 작동에 영향을 미치지 않습니다. 실제로 새로운 서브 클래스를 추가하여 다형성 기능을 얻는 것이 더 쉽습니다. 예를 들어, 원뿔, 세미콘 및 반구의 다형성을 실현하기 위해 구체의 다형성을 추가하기가 쉽습니다.
3) 인터페이스 가능성 : 다형성은 방법 시그니처를 통해 슈퍼 클래스에 의해 달성되며, 서브 클래스에 공통 인터페이스를 제공하며, 서브 클래스는이를 개선하거나 덮어 쓰음으로써 구현된다. 그림 8.3에서 볼 수 있듯이. 그림에서, 슈퍼 클래스 모양은 다형성, computearea () 및 computeVolume ()을 구현하는 두 가지 인터페이스 방법을 지정합니다. 원 및 구체와 같은 서브 클래스는 다형성을 달성하기 위해이 두 인터페이스 방법을 개선 또는 무시합니다.
4) 유연성 : 응용 프로그램에서 유연하고 다양한 작업을 반영하고 사용 효율성을 향상시킵니다.
5) 단순성 : 다형성은 응용 프로그램 소프트웨어의 코드 쓰기 및 수정 프로세스를 단순화합니다. 특히 많은 객체의 운영 및 작업을 처리 할 때이 기능은 특히 두드러지고 중요합니다.
고양이와 개 사례 코드
클래스 동물 {public void eat () {system.out.println ( "eat");} public void sleep () {system.out.println ( "sleep");}} 클래스 개 확장 동물 {public void eat () {system.out.println ( "Dog Eat Meat"); 동물 확장 {public void eat () {system.out.println ( "고양이 먹는 물고기");} public void sleep () {System.out.println ( "고양이 자도에 배 {System.out.println ( "돼지 옆에서 잠을 자고");}}} // 동물 작전을위한 도구 클래스 클래스 동물성 동물성 {private Qualittool () {}/* // CAT의 기능 공개 정적 무효 usecat (cat c) {c.eat (); c.sleep (); } // Dog의 기능 호출 public static void usedog (dog d) {d.eat (); d.sleep (); } // 돼지의 기능 호출 public static void usepig (pig p) {p.eat (); p.sleep (); } */public static void useanimal (동물 a) {a.eat (); a.sleep ();} // 동물에 대한 모든 가능성} class duotaidemo2 {public static void main (string [] args) {// 나는 고양이를 좋아하므로 고양이 C = New Cat (); cat (); cat (); c2.eat (); c2.sleep (); // 나는 특히 고양이를 좋아하고 다른 고양이 c3 = new cat (); c3.eat (); c3.sleep (); // ... system.out.println ( "---------------------" 이 방법을 부르면 그 방법이 매우 비슷하다고 생각하지 않습니까? 객체 이름이 다르다는 것입니다. // 우리는 메소드를 개선하기 위해 메소드를 사용할 계획입니다. // 버전을 개선하기 위해 메소드 호출 방법 // usecat (c); // usecat (c2); // usecat (c3); // animaltool.usecat (c); // emitedtool.usecat (c2); // emitertool.usecat (c2); // emitedtool.usecat ( C3); AnimalTool.useanimal (C2); AnimalTool.useanimal (C2); AnimalTool.useanimal (C3); System.out.println ( "------------------------"); // i 개가 Dog D = New Dog (); Dog D2 = New Dog (); Dog D3 = New dog (); // animaltool.usedog (d); // animaltool.usedog (d2); // emugletool.usedog (d3); AnimalTool.useanimal (d); animaltool.useanimal (d2); AnimalTool.useanimal ( d2);AnimalTool.useAnimal(d3);System.out.println("-------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Pig();//AnimalTool.usePig(p);//AnimalTool.usePig(p2);//AnimalTool.usePig(p3);AnimalTool.useAnimal(p2);AnimalTool.useAnimal(p2);AnimalTool.useAnimal(p3);System.out.println("-------------------------------");//I like pet wolf, tiger, // 해당 클래스를 정의하고, 해당 메소드를 상속하고, 도구 클래스에 메소드 호출을 추가해야합니다. // 도구 클래스는 매번 변경되지 않습니다 public void usecat (cat c) {c.sleep ();7. Java의 다형성 구현 방법 : 인터페이스 구현, 메소드 재 작성을위한 상위 클래스를 상속 받고 동일한 클래스에서 과부하 메소드.
8. Java의 다형성 분류 :
Java에서 다형성은 대략 다음과 같은 상황으로 나눌 수 있습니다.
1) 사람은 부모 수업이고 학생은 어린이 수업입니다. 그런 다음 : personp = newstudent ();
2) 안정성은 인터페이스이고 새는 인터페이스를 구현하는 클래스입니다.
3) 안정성은 추상적 인 클래스이며, 새는 안정성을 상속하는 클래스입니다.
다형성이있을 때, P는 부모 클래스에 대한 참조로 선언한다고 진술해야하지만 실제로는 아동 계급에 대한 참조입니다. 그러나 그는 부모 클래스에서만 방법을 호출 할 수 있습니다. 서브 클래스의 메소드가 상위 클래스 메소드를 재정의하면 상위 클래스 메소드 (가상 메소드 호출)가 호출됩니다. 인터페이스 다형성에 대해서도 마찬가지입니다. 어쩌면 F가 자신의 방법을 호출하고 싶을 때 실수하지 않을까요? 실제로 인터페이스를 구현하는 서브 클래스가 인터페이스에서 메소드를 확실히 구현하기 때문에 이것은 메소드 범위이기도 하므로이 경우 조류의 메소드가 호출됩니다. 그러나 Bird에 인터페이스에 정의되지 않은 메소드가 있으면 F를 호출 할 수 없습니다.
9. 연산자의 입장 :
Java 언어의 다형성 메커니즘은 참조 변수의 선언 유형이 실제 참조 객체의 유형과 일치하지 않습니다. 가상 메소드 호출 규칙과 결합하여 동일한 유형으로 선언 된 두 참조 변수는 동일한 메소드를 호출 할 때 다른 동작을 가질 수 있다고 결론 지을 수 있습니다. 운영자 인스턴스가 여기에 소개됩니다.
따라서 personp = newstudent ()를 선언하면; P를 학생으로 변환 할 수 있습니까? 물론, 그것은 할 수 있지만, 그것은 강요 당해야합니다 (아들은 아버지가되기를 원하고 직접 올 것이지만 아버지가 아들이되기를 원한다면 강제로 될 것입니다).
일반적으로 캐스팅시 인스턴스가 추가됩니다.
if (pinstanceofStudent) {학생 = (학생) p;}
다형성은 전체 Java 학습을 통해 실행됩니다. 예를 들어, 예외를 처리 할 때 Catch 문을 작성할 때, 우리는 서브 클래스 예외가 전면에 작성되어야하고 부모 클래스 예외는 뒷면에 작성되어야한다고 규정합니다. 왜? 그 이유는 다형성입니다. 우리의 캐치 명령문 형식 : catch (Exception). 예외가 생성되면 Java 프로그램은 예외 객체를 자동으로 생성합니다. 아동 클래스 예외가 먼저 생성되고 부모 클래스 예외가 앞에 기록되면,이 캐치 문은 다형성에 따라 확실히 실행되며 캐치 문을 실행 한 후에도 점프됩니다.
10. 예 :
나는 Java의 다형성을 잘 이해하지 못하지만 다음 예는 다음을 이해하게합니다.
클래스 A {public String show (d obj) .. {return ( "a and d");} public String show (a obj) .. b {} class e {public static void main (string [] args) {a a1 = new a (); a a2 = new b (); b b = new b (); c c = new c (); d d = new d (); system.out.println (a1.show (b)); // ①system.out.println (a1.show (c)); // ②system.out.println (a1.show (d)); //outsystem.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 and a and a a a and a ③ a and d ④ b 및 a ⑤ b 및 a ⑥ a and d ⑦ b and b ⑧ b and b a a and d
**** 좋은 사람의 대답이 있습니다 ****
이 문제에는 두 가지 핵심 사항이 있습니다.
하나는 서브 클래스와 부모 클래스의 관계이고 다른 하나는 과부하 된 메소드를 호출하는 문제입니다.
서브 클래스 객체는 부모 객체로 직접 사용할 수 있지만 그렇지 않으면 할 수는 없습니다. 예를 들어, 사람들은 부모 수업이고 학생들은 사람들의 서브 클래스이므로 학생 대상은 인간 대상의 속성을 가져야하지만 인간의 대상은 반드시 학생 대상의 특성을 가질 수는 없습니다. 따라서 학생 대상은 인간 대상으로 사용될 수 있지만 인간의 대상은 학생 대상으로 사용할 수 없습니다. 서브 클래스 객체를 부모 객체로 사용하는 경우 서브 클래스 객체는 모든 서브 클래스 특성을 잃고 부모 클래스와 동일한 이름의 속성 및 메소드 만 유지합니다 (동일한 이름 메소드는 동일한 함수 이름 일뿐 만 아니라 매개 변수 유형도 동일해야합니다. 그렇지 않으면 유지되지 않음).
오버로드 된 메소드가 클래스에서 정의되면 시스템은 메소드를 호출 할 때 매개 변수 유형에 따라 적절한 메소드를 자동으로 선택하고 호출합니다.
1) a1.Shows (b), A에는 클래스 B 매개 변수를 포함하는 메소드가 없지만 클래스 A 매개 변수를 포함하는 메소드는 서브 클래스 객체의 상위 클래스를 사용할 수 있다는 원칙에 따라 호출되므로 메소드가 호출됩니다.
publicStringshow(Aobj)...{return("AandA");}
2) a1.show (c), 클래스 C는 클래스 B의 서브 클래스이고 클래스 B는 클래스 A의 서브 클래스이므로 클래스 C 객체는 클래스 A 객체로 사용할 수 있습니다. 결과는 위와 동일합니다.
3) a1.show (d), 매개 변수 유형에 따라 메소드를 직접 호출
publicStringshow(Dobj)...{
return("AandD");}
4) a2. 쇼우 (b), a2는 원래 B 객체 였지만 클래스 A 변수에 할당되었으므로 A2는 부모 클래스 A와 동일한 이름의 속성과 메소드 만 유지됩니다. A2. Show (B)는 학부모 클래스와 동일한 이름과 동일한 이름으로 클래스 B의 예약 메소드를 호출합니다.
public String show(A obj)...{
return ("B and A");
}
5) a2.show (c), 클래스 B의 예약 방법은 클래스 C 매개 변수 방법이 없지만 C를 포함하는 부모 클래스 B의 매개 변수 방법이 있으므로
public String show(A obj)...{
return ("B and A");
}
이 설명이 더 합리적이라고 생각합니다. A2는 원래 클래스 B의 대상이지만 값은 클래스 A에 할당되었고 C는 B의 서브 클래스이고 B는 A의 서브 클래스이므로 A2는 클래스 B의 속성과 메소드를 A와 동일한 이름으로 유지합니다.
6) a2.show (d), 호출은 클래스 a입니다
public String show(D obj)...{
return ("A and D");
}
7) B.Show (b), 전화하십시오
public String show(B obj)...{
return ("B and B");
}
8) B.show (c), 클래스 B에는 C 매개 변수가있는 메소드가 없지만 B 매개 변수가있는 메소드가 있으므로 메소드가 호출됩니다.
public String show(B obj)...{
return ("B and B");
}
9) B.Show (d), 설명은 8과 동일합니다
요약
위는이 기사의 Java 다형성 요약의 전체 내용이며 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 언제든지 메시지를 남겨 주시고 귀중한 의견을 기대하십시오!