@@ -24,7 +24,7 @@ Java抽象类是一种使用 abstract 关键字修饰的特殊类,它不能被
2424
2525示例:
2626
27- ``` jaav
27+ ``` java
2828public abstract void show();
2929```
3030
@@ -599,7 +599,7 @@ public class MultiTool implements Printer, Logger, Debugger {
599599```
600600
601601``` java [测试代码]
602- public class Main {
602+ public class TestMain {
603603 public static void main (String [] args ) {
604604 MultiTool tool = new MultiTool ();
605605 tool. test();
@@ -647,7 +647,7 @@ public class C extends D implements A {
647647```
648648
649649``` java [测试代码]
650- public class Test {
650+ public class TestMain {
651651 public static void main (String [] args ) {
652652 C c = new C ();
653653 c. methodA();
@@ -708,7 +708,7 @@ public class Duck implements Amphibious {
708708}
709709
710710// 测试类
711- public class Main {
711+ public class TestMain {
712712 public static void main (String [] args ) {
713713 Duck duck = new Duck ();
714714 duck. fly(); // 输出: 鸭子在飞翔
@@ -742,6 +742,211 @@ Java多态是指同一个方法在不同对象上可以有不同的行为,即
742742变量名. 方法名();
743743```
744744
745+ > 父类类型:指的是子类继承的父类类型,或者实现的父接口类型。
746+
747+ 示例:
748+
749+ ``` java
750+ Animal animal = new Cat ();
751+ animal. run();
752+ ```
753+
754+ 当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,执行的是子类重写后的方法。
755+
756+ 示例:
757+
758+ ::: code-group
759+ ``` java [定义父类]
760+ // 抽象类
761+ public abstract class Animal {
762+ public abstract void eat ();
763+ }
764+ ```
765+
766+ ``` java [定义子类]
767+ public class Cat extends Animal {
768+
769+ @Override
770+ public void eat () {
771+ System . out. println(" 吃鱼" );
772+ }
773+ }
774+ ```
775+
776+ ``` java [定义子类]
777+ public class Dog extends Animal {
778+
779+ @Override
780+ public void eat () {
781+ System . out. println(" 吃骨头" );
782+ }
783+ }
784+ ```
785+
786+ ``` java [测试类]
787+ public class TestMain {
788+ public static void main (String [] args ) {
789+ // 多态的形式创建对象
790+ Animal a1 = new Cat ();
791+ // 调用的是 Cat 的 eat() 方法
792+ a1. eat(); // 输出:吃鱼
793+
794+ // 多态的形式创建对象
795+ Animal a2 = new Dog ();
796+ // 调用的是 Dog 的 eat() 方法
797+ a2. eat(); // 输出:吃骨头
798+ }
799+ }
800+ ```
801+ :::
802+
803+ ### 多态的好处
804+
805+ 实际开发的过程中,父类类型作为方法形式参数,传递子类对象给方法,进行方法的调用,更能体现出多态的扩展性与便利。
806+
807+ 示例:
808+
809+ ::: code-group
810+ ``` java [定义父类]
811+ public abstract class Animal {
812+ // 抽象方法
813+ public abstract void eat ();
814+ }
815+ ```
816+
817+ ``` java [定义子类]
818+ public class Cat extends Animal {
819+
820+ // 重写父类的抽象方法
821+ @Override
822+ public void eat () {
823+ System . out. println(" 吃鱼" );
824+ }
825+ }
826+ ```
827+
828+ ``` java [定义子类]
829+ public class Dog extends Animal {
830+
831+ // 重写父类的抽象方法
832+ @Override
833+ public void eat () {
834+ System . out. println(" 吃骨头" );
835+ }
836+ }
837+ ```
838+
839+ ``` java [测试类]
840+ public class TestMain {
841+ public static void main (String [] args ) {
842+ // 创建对象
843+ Cat cat = new Cat ();
844+ Dog dog = new Dog ();
845+
846+ // 调用showCatEat
847+ showCatEat(cat);
848+ // 调用showDogEat
849+ showDogEat(dog);
850+
851+ /**
852+ * 以上两个方法,均可以被showAnimalEat(Animal a)方法所替代
853+ * 而且执行效果一致
854+ */
855+ showAnimalEat(cat);
856+ showAnimalEat(dog);
857+ }
858+
859+ public static void showCatEat (Cat c ) {
860+ c. eat();
861+ }
862+
863+ public static void showDogEat (Dog d ) {
864+ d. eat();
865+ }
866+
867+ public static void showAnimalEat (Animal a ) {
868+ a. eat();
869+ }
870+ }
871+ ```
872+ :::
873+
874+ 示例说明:
875+
876+ - 由于多态特性的支持 ` showAnimalEat() ` 方法的Animal类型,是 ` Cat ` 和 ` Dog ` 的父类类型,父类类型接收子类对象,当然可以把 ` Cat ` 对象和 ` Dog ` 对象,传递给方法。
877+ - 当 ` eat() ` 方法执行时,多态规定,执行的是子类重写的方法,那么效果自然与 ` showCatEat() ` 、` showDogEat() ` 方法一致,所以 ` showAnimalEat() ` 完全可以替代以上两方法。
878+ - 不仅仅是替代,在扩展性方面,无论之后再多的子类出现,我们都不需要编写 ` showXxxEat() ` 方法了,直接使用 ` showAnimalEat() ` 都可以完成。
879+
880+ ### 多态的两种形式
881+
882+ | 形式 | 说明 | 示例 |
883+ | :-- | :-- | :-- |
884+ | 编译时多态(静态多态) | 方法重载(Overloading) | ` add(int a, int b) ` 和 ` add(double a, double b) ` |
885+ | 运行时多态(动态多态) | 方法重写(Overriding) + 继承 + 向上转型 | 父类引用调用子类重写的方法 |
886+
887+ > Java 中真正意义的多态指的是运行时多态(基于方法重写)。
888+
889+ ### 运行时多态的三个必要条件
890+
891+ 要实现运行时多态,必须同时满足以下三个条件:
892+
893+ 1 . 继承关系:子类继承父类(或者实现接口)
894+ 2 . 方法重写:子类重写父类的方法(@Override )
895+ 3 . 向上转型:父类引用指向子类对象
896+
897+ 示例:
898+
899+ ``` java
900+ class Animal {
901+ public void makeSound () {
902+ System . out. println(" 动物叫声" );
903+ }
904+ }
905+
906+ class Dog extends Animal {
907+ @Override
908+ public void makeSound () {
909+ System . out. println(" 汪汪!" );
910+ }
911+ }
912+
913+ class Cat extends Animal {
914+ @Override
915+ public void makeSound () {
916+ System . out. println(" 喵喵!" );
917+ }
918+ }
919+
920+ // 使用多态
921+ public class Test {
922+ public static void main (String [] args ) {
923+ Animal a1 = new Dog (); // 向上转型
924+ Animal a2 = new Cat ();
925+
926+ a1. makeSound(); // 输出:汪汪!
927+ a2. makeSound(); // 输出:喵喵!
928+ }
929+ }
930+ ```
931+
932+ ### 向上转型
933+
934+ 向上转型:多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。
935+
936+ 当父类引用指向一个子类对象时,便是向上转型。
937+
938+ 语法格式:
939+
940+ ``` java
941+ 父类类型 变量名 = new 子类类型();
942+ ```
943+
944+ 示例:
945+
946+ ``` java
947+ Animal animal = new Cat ();
948+ ```
949+
745950::: tip 提示
746951文档正在更新中...
747952:::
0 commit comments