1.1 多态:可以理解为某一类事物存在的多种体现形态。
人:男人,女人
动物:猫,狗。
猫 x = new 猫();
动物 x = new 猫();
1,体现
父类的引用指向了自己的子类对象。
父类的引用也可以接收自己的子类对象。
2,前提
必须是类与类之间有关系。要么继承,要么实现。
通常还有一个前提:存在覆盖。
3,好处
多态的出现大大的提高程序的扩展性。
4,弊端:
提高了扩展性,但是只能使用父类的引用访问父类中的成员。
示例1:
1 /* 2 动物, 3 猫,狗。 4 */ 5 6 abstract class Animal 7 { 8 abstract void eat(); 9 10 } 11 12 class Cat extends Animal 13 { 14 public void eat() 15 { 16 System.out.println("吃鱼"); 17 } 18 public void catchMouse() 19 { 20 System.out.println("抓老鼠"); 21 } 22 } 23 24 25 class Dog extends Animal 26 { 27 public void eat() 28 { 29 System.out.println("吃骨头"); 30 } 31 public void kanJia() 32 { 33 System.out.println("看家"); 34 } 35 } 36 37 38 class Pig extends Animal 39 { 40 public void eat() 41 { 42 System.out.println("饲料"); 43 } 44 public void gongDi() 45 { 46 System.out.println("拱地"); 47 } 48 } 49 50 51 class DuoTaiDemo 52 { 53 public static void main(String[] args) 54 { 55 //Cat c = new Cat(); 56 //c.eat(); 57 58 //Dog d = new Dog(); 59 //d.eat(); 60 //Cat c = new Cat(); 61 /* 62 Cat c1 = new Cat(); 63 function(c1); 64 65 function(new Dog()); 66 function(new Pig()); 67 */ 68 69 //Animal c = new Cat(); 70 //c.eat(); 71 72 73 function(new Cat()); 74 function(new Dog()); 75 function(new Pig()); 76 77 78 79 } 80 public static void function(Animal a)//Animal a = new Cat(); 81 { 82 a.eat(); 83 //a.catchMouse(); 84 } 85 86 }
1.2 如何使用子类特有方法呢?
向上转型或者向下转型(示例2)
示例2:
1 class Cat extends Animal 2 { 3 public void eat() 4 { 5 System.out.println("吃鱼"); 6 } 7 public void catchMouse() 8 { 9 System.out.println("抓老鼠"); 10 } 11 } 12 13 14 class Dog extends Animal 15 { 16 public void eat() 17 { 18 System.out.println("吃骨头"); 19 } 20 public void kanJia() 21 { 22 System.out.println("看家"); 23 } 24 } 25 26 27 class Pig extends Animal 28 { 29 public void eat() 30 { 31 System.out.println("饲料"); 32 } 33 public void gongDi() 34 { 35 System.out.println("拱地"); 36 } 37 } 38 39 40 class DuoTaiDemo2 41 { 42 public static void main(String[] args) 43 { 44 //Animal a = new Cat();//类型提升。 向上转型。 45 //a.eat(); 46 47 //如果想要调用猫的特有方法时,如何操作? 48 //强制将父类的引用。转成子类类型。向下转型。 49 ///Cat c = (Cat)a; 50 //c.catchMouse(); 51 //千万不要出现这样的操作,就是将父类对象转成子类类型。 52 //我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。 53 //多态自始至终都是子类对象在做着变化。 54 //Animal a = new Animal(); 55 //Cat c = (Cat)a; 56 57 58 59 function(new Dog()); 60 function(new Cat()); 61 62 63 } 64 public static void function(Animal a)//Animal a = new Cat(); 65 { 66 a.eat(); 67 /* 68 if(a instanceof Animal) 69 { 70 System.out.println("haha"); 71 } 72 else 73 */ 74 if(a instanceof Cat) 75 { 76 Cat c = (Cat)a; 77 c.catchMouse(); 78 } 79 else if(a instanceof Dog) 80 { 81 Dog c = (Dog)a; 82 c.kanJia(); 83 } 84 85 } 86 87 } 88
PS:
instanceof : 用于判断对象的类型。 对象 intanceof 类型(类类型 接口类型)
1.3 多态在成员变量和成员函数中的特点:
在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
在多态中,静态成员函数的特点:
无论编译和运行,都参考做左边。
示例3
1 class Fu 2 { 3 static int num = 5; 4 void method1() 5 { 6 System.out.println("fu method_1"); 7 } 8 void method2() 9 { 10 System.out.println("fu method_2"); 11 } 12 static void method4() 13 { 14 System.out.println("fu method_4"); 15 } 16 } 17 18 19 class Zi extends Fu 20 { 21 static int num = 8; 22 void method1() 23 { 24 System.out.println("zi method_1"); 25 } 26 void method3() 27 { 28 System.out.println("zi method_3"); 29 } 30 31 static void method4() 32 { 33 System.out.println("zi method_4"); 34 } 35 } 36 class DuoTaiDemo4 37 { 38 public static void main(String[] args) 39 { 40 //Fu f = new Zi(); 41 //System.out.println(f.num); 42 //Zi z = new Zi(); 43 //System.out.println(z.num); 44 45 //f.method1(); 46 //f.method2(); 47 //f.method3(); 48 49 Fu f = new Zi(); 50 System.out.println(f.num); 51 f.method4(); 52 53 Zi z = new Zi(); 54 z.method4(); 55 } 56 }
时间: 2024-12-28 15:14:38