一、多态概述
1.多态是继封装、继承之后,面对对象的第三大特性
2.多态在实际中的意义:
● 在现实生活中尝尝会出现不同的形态体现,例如张三是一名学生,而学生又是人的一种分类,所以说张三既是学生也是人,张三就体现除了两种形态
● Java作为面对对象的语言,就可以去表现这样的情况,一种事物多种形态的体现
3.多态的条件
● 必须要在继承体系下
● 子类必须要重写父类中的方法
● 通过父类的引用调用重写的方法
4.多态的定义与使用格式
定义格式:父类类型 变量名=new 子类类型();
5.多态的理解
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作。
二、instanceof关键字
作用:用来判断某个对象是否属于某种数据类型。
● 注意:返回类型为布尔类型
使用案例:
Father f1=new Daughter();
Father f2=new Son();
if(f1 instanceof Daughter){
System.out.println("f1是Daughter的类型");
}
else{
System.out.println("f1是Son的类型");
}
if(f2 instanceof Son){
System.out.println("f2是Daughter的类型");
}
else{
System.out.println("f2是Son的类型");
}
输出:f1是Daughter的类型
f2是Son的类型
三、多态的转型
多态的转型分为向上转型和向下转型两种
向上转型:多态本身就是向上转型过的过程
使用格式:父类类型 变量名=new 子类类型();
适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。
向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型
使用格式:子类类型 变量名=(子类类型) 父类类型的变量;
适用场景:当要使用子类特有功能时。
四、多态案例
(理解多态,可以认真琢磨一下博主下面的案例)
public class Test {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 对象调用 show 方法
show(new Dog()); // 以 Dog 对象调用 show 方法
Animal a = new Cat(); // 向上转型
a.eat(); // 调用的是 Cat 的 eat
Cat c = (Cat)a; // 向下转型 这里属于向下转型,因为父类没有work这个方法
c.work(); // 调用的是 Cat 的 work
}
public static void show(Animal a) {
a.eat();
// 类型判断
if (a instanceof Cat) { // 猫做的事情
Cat c = (Cat)a;
c.work();
} else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog)a;
c.work();
}
}
}
//这是一个抽象类,如果不懂,后面的博客我会介绍什么是抽象类
//这里简单说明一下:抽象类也是类,只不过抽象类里面的方法可以没有具体的实现,可由子类去实现
abstract class Animal {
abstract void eat();
}
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼摆摆");
}
public void work() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
public void work() {
System.out.println("看家");
}
}