文章目录
一、含义
含义:指对象的多种形态。
对象多种形态:1、引用的多态。2、方法的多态。
1.1 引用的多态
1.1.1 父类的引用指向父类的对象
语法:父类名 对象名 = new 父类名();
Animal obj1 = new Animal();
1.1.2 父类的引用指向子类的对象
语法:父类名 对象名 = new 子类名();
Animal obj2 = new Dog();
项目 | 含义 |
---|---|
含义 | 同一个接口,使用不同的实例,进而执行不同的操作 |
优点 | 灵活、简化、接口性,可替换、扩充性,消除类型间的耦合关系 |
必要条件 | 继承、重写、父类引用指向子类对象。 |
1.2 方法的多态
1.1.1 本类对象调用本类方法
语法:本类对象名.本类独有方法();
// watchDoor方法是狗类独有的方法。
obj2.watchDoor();
1.1.2 子类对象调用父类重写的方法或继承的方法
// 狗类重写eat方法。
obj2.eat();
// 猫类为重写eat方法。只是继承了动物类。
Cat obj3 = new Cat();
obj3.eat();
1.1.3 方法多态调用步骤
(1)查看是否有继承关系。无,则无多态特性。
(2)查看父类是否有该方法。无,则直接调用子类该方法。
(3)查看子类是否重写该方法。无,则直接继承调用父类该方法。
(4)调用子类重写后的该方法。
1.3 多态的实现方式
1.3.1 方式一——重写
1.3.2 方式二——接口
1.3.3 方式三——抽象类和抽象方法。
1.4 实参
实参类型 | 示例 |
---|---|
基本数据类型 | cat.eat(“苹果”); |
引用数据类型 | num.findMax(arr1); |
实例对象 | eat(new Cat()); |
1.5 引用数据类型转换——父子间
1.5.1 非强制转换
别名:向上类型转换、隐式类型转换或自动类型转换。
使用条件:小类型转换到大类型。即子转父。
Dog dog = new Dog();
Animal animal = dog; // 自动类型提升,即向上类型转换。狗dog转为动物dog
1.5.2 强制转换
别名:向下类型转换或强制类型转换。
使用条件:大类型转换到小类型。即父转子
Animal animal = new Animal();
Dog dog = (Dog)animal; // 强制转换,即向下类型转换。动物animal转为狗animal。
//Cat cat = (Cat)animal; // 出错。原因,此时animal已经强制转换为狗类了,与猫类没有继承关系。
// 解决出错方法。使用instanceof运算符。
if(animal instanceof Cat){
Cat cat = (Cat)animal;
}else{
System.out.println("他们没有继承关系!无法进行转换!");
}
二、实例
动物:猫、狗。
主函数入口类:
public class MainEntrance{
public static void main(String[] args){
/* 类方法调用:实例对象作为实参。
* 等价于:
* Cat a = new Cat();
* show(a);
* 或者
* Animal b = new Cat(); // 多态方式。
*/
show(new Cat());
show(new Dog());
Animal a = new Cat();
a.eat();
Cat c = (Cat)a;
c.work();
}
public static void show(Animal a){ // 多态方式。父类引用,指向子类。
a.eat(); // 多态方式调用方法:先看父有无后调子方法。
if(a instanceof Cat){ // 判断实例对象的类型。此时只知道a是动物。
Cat c = (Cat)a; // 强制转换
c.work();
}else if(a instanceof Dog){
Dog c = (Dog)a;
c.work();
}
}
}
}
动物类:
public class Animal{
public void eat(){
System.out.println("都需要食物补充营养!");
}
}
猫类:
public class Cat extends Animal{
public void eat(){
System.out.println("喜欢吃鱼");
}
public void work(){
System.out.println("任务是抓老鼠!");
}
}
狗类:
public Dog extends Animal{
public void eat(){
System.out.println("喜欢吃骨头!");
}
public void work(){
System.out.println("任务是看家护院!");
}
}