1. 多态
1.1. 问题的引入
多态:就是同一个事物具有多种不同的表示方式;
狗;旺财;哈士奇;……
在现实生活中,我们一般更倾向于使用表示范围更广的概念描述这个具体的事物;
衣服:棉衣;羽绒服;毛衣……
水果:苹果、桔子、梨子、香蕉……
1.1. java中的多态
1.1.1. 多态的写法
Java中,多态指的是:父类型引用指向子类对象;
(接口类型引用指向实现类对象)
1.1.1. 多态的使用前提
因为多态中的不同类型之间必须有是的关系,所以Java中要能够使用多态,类与类之间必须由继承关系;(或者是接口的实现关系)
1.1.1. 多态的好处
生活中使用多态,可以指代更广泛的范围;
在Java中,使用多态,也可以使变量的表示范围更广泛,可以提高代码的复用性和程序的扩展性(降低耦合性);
需求:描述并测试猫和狗的行为;
猫具有吃、叫和抓老鼠的功能;
狗具有吃、叫和看家的功能;
过去的做法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | public class Demo2 { public static void main(String[] args) { //创建一只猫 Cat c = new Cat(); //调用函数测试猫的行为 test(c); //创建一条狗 Dog d = new Dog(); //调用函数测试狗的行为 test(d); } private static void test(Dog d) { //测试狗的吃的行为 d.eat(); //测试狗叫的行为 d.say(); //测试狗看家的行为 d.lookHome(); } private static void test(Cat c) { //测试猫吃的行为 c.eat(); //测试猫叫的行为 c.say(); //测试猫抓老鼠的行为 c.catchMouse(); } } /* 需求:描述并测试猫和狗的行为; 猫具有吃、叫和抓老鼠的功能; 狗具有吃、叫和看家的功能; */ //定义一个类表示狗 class Dog{ //吃 public void eat() { System.out.println( "吃骨头" ); } //叫 public void say() { System.out.println( "汪汪……" ); } //看家 public void lookHome() { System.out.println( "看家" ); } } //定义一个类表示猫 class Cat{ //吃 public void eat() { System.out.println( "吃小鱼" ); } //叫 public void say() { System.out.println( "喵喵……" ); } //抓老鼠 public void catchMouse() { System.out.println( "抓老鼠" ); } } |
问题:
首先,猫和狗之间存在相同功能;
其次:测试的功能函数,一个函数只能测试一种动物,而且每个测试函数的具体实现基本类似;那么每添加一个新的动物,就必须新写一个测试函数,挺麻烦;
解决办法:使用继承和多态技术:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | public class Demo2 { public static void main(String[] args) { //创建一只猫 Animal c = new Cat(); //调用函数测试猫的行为 test(c); //创建一条狗 Dog d = new Dog(); //调用函数测试狗的行为 test(d); } private static void test(Animal c) { //测试动物吃的行为 c.eat(); //测试动物叫的行为 c.say(); //测试动物抓老鼠的行为 // c.catchMouse(); } } /* 需求:描述并测试猫和狗的行为; 猫具有吃、叫和抓老鼠的功能; 狗具有吃、叫和看家的功能; */ //为了提高代码的复用性,可以定义一个猫和狗的共同的父类动物类,然后让猫和狗继承动物类 abstract class Animal{ public abstract void eat(); public abstract void say(); } //定义一个类表示狗 class Dog extends Animal{ //吃 public void eat() { System.out.println( "吃骨头" ); } //叫 public void say() { System.out.println( "汪汪……" ); } //看家 public void lookHome() { System.out.println( "看家" ); } } //定义一个类表示猫 class Cat extends Animal{ //吃 public void eat() { System.out.println( "吃小鱼" ); } //叫 public void say() { System.out.println( "喵喵……" ); } //抓老鼠 public void catchMouse() { System.out.println( "抓老鼠" ); } } |
JavaJava基础01