**多态,**字面意思就是多种状态
在java中,多态是指同一个方法的调用,由于对象的不同,可能会有不同的结果
这句话的意思用白话表示就是:一千个读者一千个哈姆雷特 ,一件事的做法有千万种(因人而异)
举个例子
现实生活中每个人都需要休息,但休息的方式可能都不一样,尽管都叫休息,但是我更偏向于睡觉,我朋友的休息,更多的是打游戏,我同学们的休息可能就是真的在刷一天的抖音,所以这就是多态
多态要点:
-
多态是方法的多态,不是属性的多态(多态与属性无关)。
-
多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象。
-
父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。
便于理解:
首先多态是需要继承,方法重写 父类引用子类对象调用子类重写的方法来支持的,下面代码会演示
拿生活中每天都需要重复的吃饭来举例子:
不管哪个国家的人,只要是人,都继承了统一的父类 - 人类
(继承)
不管是那种人就都需要吃饭,中国人-筷子 ,欧美- 刀叉 印度- 手
(重写父类方法)
3.人 = 印度人 → 用手吃饭
人 = 中国人 → 用筷子吃饭
父类引用子类对象调用子类重写方法 (构成多态)
这里没有歧视啊,各国饮食习惯不同,所以用来举例子 可以看到不同的对象被父类引用后,产生的效果也是不同,所以这里就形成了多态
代码演示:
class Animal {
public void shout() {
System.out.println("叫了一声!");
}
}
class Dog extends Animal {
public void shout() {
System.out.println("旺旺旺!");
}
public void seeDoor() {
System.out.println("看门中....");
}
}
class Cat extends Animal {
public void shout() {
System.out.println("喵喵喵喵!");
}
}
public class TestPolym {
public static void main(String[] args) {
Animal a1 = new Cat(); // 向上可以自动转型 父类引用指向子类对象
//传的具体是哪一个类就调用哪一个类的方法。大大提高了程序的可扩展性。
animalCry(a1);
Animal a2 = new Dog();
animalCry(a2);//a2为编译类型,Dog对象才是运行时类型。
//编写程序时,如果想调用运行时类型的方法,只能进行强制类型转换。
// 否则通不过编译器的检查。
Dog dog = (Dog)a2;//向下需要强制类型转换
dog.seeDoor();
}
// 有了多态,只需要让增加的这个类继承Animal类就可以了。
static void animalCry(Animal a) {
a.shout();
}
/* 如果没有多态,我们这里需要写很多重载的方法。
* 每增加一种动物,就需要重载一种动物的喊叫方法。非常麻烦。
static void animalCry(Dog d) {
d.shout();
}
static void animalCry(Cat c) {
c.shout();
}*/
}
解说代码视频](https://www.bilibili.com/video/av94014618/)
总结:多态的好处就是节省代码让代码更加灵活
不论增加多少子类,都没有问题,如果没有多态就会有大量的重载,具体的看代码注解就好