接上一篇:https://blog.csdn.net/green703338130/article/details/81028819
对象的向上转型
对象的向上转型,就是多态的写法。
格式:
父类名称 对象名 = new 子类对象名称(); Animal animal = new Cat();
含义:
右侧创建一个子类对象,把它当做父类来看。
注意事项:
向上转型一定是安全的,从小范围转换成为大范围。
类似于:double num = 100;int --> double,自动类型转换。
抽象类
public abstract class Animal {
public abstract void eat();
}
子类
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
主方法
public class Demo01Main {
public static void main(String[] args) {
//对象的向上转型,就是:父类对象引用指向子类对象。
Animal animal = new Cat();
animal.eat();
}
}
对象向下转型
向上转型的弊端
虽然向上转型是安全的,但是对象一旦向下转型,那么就无法调用子类原本的特有的方法,为此这里引入向下转型转型来还原。
格式:
子类名称 对象名 = (子类名称) 父类对象;
含义:将父类对象(还原)成为本来的子类对象。
Animal animal = new Cat(); //本来就是猫,向上转型成为动物。
Cat cat = (Cat)animal; //本来就是猫,已经被转型为动物。还原回来成为本来的猫。
注意事项:
- 必须保证对象本来创建的时候,就是猫,才能向下转型成为猫。
- 如果对象创建的时候本来不是猫。现在非要向下转型成为猫,就会报错。
Animal.java
public abstract class Animal {
public abstract void eat();
}
Cat.java
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void catMouse() {
System.out.println("猫抓老鼠");
}
}
Dog.java
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
public void watchHouse() {
System.out.println("狗看家");
}
}
主方法Demo01Main.java
public class Demo01Main {
public static void main(String[] args) {
//对象的向上转型,就是:父类对象引用指向子类对象。
Animal animal1 = new Cat();//本来创建的时候是一只猫
animal1.eat();
// animal1.catMouse();//错误,父类无法访问子类方法
//向下转型,进行还原动作
Cat cat = (Cat) animal1;
cat.catMouse();
System.out.println("----------我是分割线--------");
/*
下面是错误的向下转型
本来new的时候是一只猫,然后向下转型成为狗
*/
Animal animal2 = new Cat();//原本是一只猫
Dog dog = (Dog) animal2;//编译不会报错,但是运行的时候报错:java.lang.ClassCastException,类转换异常。
}
}
instanceof在向下转型中的应用
在向下转型时,不知道父类引用的是什么类型的子类,就会发生错误,这时可以使用instanceof来解决这个问题。
格式:
对象 instaceof 类名称
这将会返回一个boolean值结果,也就是判断前面的对象能不能当做后面类型的实例。
public class Demo01Instanceof {
public static void main(String[] args) {
Animal animal = new Cat();
animal.eat();
//如果希望调用子类的特有方法,需要向下转型。
//判断父类引用animal是不是Dog
if(animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.watchHouse();
}
//判断父类引用animal是不是Cat
if(animal instanceof Cat) {
Cat cat = (Cat)animal;
cat.catMouse();
}
}
}