1、多态(动态绑定)
动态绑定是指在运⾏期间,判断所引⽤对象的实际类型,根据其实际的类型调⽤相应的⽅法,多态即:⼀个对象具有多种状态的⾏为。
1.1、多态的3个必要条件
要有继承
要有重写
父类的引用指向子类的对象
1.2、方法重写的案例回顾
动物类
public class Animal {
public void speek(){
System.out.println("动物都会叫");
}
}
狗类,继承自动物类
class Dog extends Animal {
/**
* 重写父类的speek方法
*/
@Override
public void speek() {
System.out.println("我是狗,旺旺旺...");
}
}
猫类,继承自动物类
class Cat extends Animal {
/**
* 重写父类的speek方法
*/
@Override
public void speek() {
System.out.println("我是猫,喵喵喵...");
}
}
1.3、完善案例实现多态性
public class Test {
public static void main(String[] args) {
Dog d = new Dog();
Cat c = new Cat();
Animal ani = null;
ani = d; //动物变成了狗
ani.speek(); //我是狗,旺旺旺...
ani = c; //动物变成了猫
ani.speek(); //我是猫,喵喵喵...
}
}
2、对象转型
2.1、向上转型
父类的引用指向子类的对象,称为向上转型
2.1.1、回顾多态的案例
public class Test {
public static void main(String[] args) {
Dog d = new Dog();
Cat c = new Cat();
Animal ani = null;
ani = d; //动物变成了狗
ani.speek(); //我是狗,旺旺旺...
ani = c; //动物变成了猫
ani.speek(); //我是猫,喵喵喵...
}
}
代码中将父类的引用指向了子类的对象,该写法是对象的向上转型;向上转型是自动的。
2.2、向下转型
2.2.1、回顾多态的案例,并修改main方法
public class Test2 {
public static void main(String[] args) {
Dog jinMao = new Dog();
Animal ani = jinMao;
Dog erHa = (Dog) ani; //向下转型
}
}
代码中将子类的引用指向了父类的对象,该写法是对象的向下转型;向下转型不是自动的,需要强制类型转换符进行转换。
向上转型和向下转型
转型条件:只有存在继承关系才可以转型
如何避免ClassCastException
使用instanceof运算符判断引用指向对象的类型后再向下转型
instanceof运算符特点
- instanceof用于检测引用指向的对象数据类型
- instanceof运算结果是true/false
- instanceof语法格式:引用 instanceof 数据类型
具体代码如下
public class Test {
public static void main(String[] args){
Animal animal = new Cat();
if(animal instanceof Dog) {
Dog dog = (Dog)animal;
dog.eat();
}
if (animal instanceof Cat) {
Cat cat = (Cat)animal;
cat.eat();
}
}
}
class Animal {
public void eat() {
System.out.print("动物能进食");
}
}
class Dog extends Animal{
public void eat() {
System.out.print("狗吃狗粮");
}
}
class Cat extends Animal {
System.out.print("狗吃狗粮");
}