一、概念
由子类转型成父类,在继承图上是向上移动的,一般称为向上转型
上一篇文章的代码就是向上转型
Animal a1 = new Dog();
Animal a1 = new (Animal)Dog(); //实际上就是强转,但是一般不需要写出来
向上转型是从一个较专用类型向通用类型转换,所以总是安全的(体现在运行过程,编译报错),也就是说,子类是父类的超集
向上转型过程中,类接口中唯一可能发生的事情是丢失方法,而不是获取方法
class Dog extends Animal{
public void eat(){
System.out.println("狗啃骨头");
}
public void sleep(){
System.out.println("狗睡觉");
}
}
//主函数
Animal a1 = new Dog();
Dog dog = new Dog();
a1.eat();
//a1.sleep(); //丢失方法,报错
dog.sleep(); //只能在new一个对象,实现
/*
狗啃骨头
狗睡觉
*/
与之相反的操作是向下转型,不安全(可能需要instanceof操作符协助)
instanceof操作符
返回值指出对象是否是特定类或者是它的子类的一个实例
//向下转型,需要instanceof操作符协助
if(a1 instanceof Cat){
Cat cat = (Cat)a1;
}
if(a2 instanceof Cat){
Cat cat = (Cat)a2;
cat.eat();
}
二、完整代码
//需要存在继承或实现(接口)关系
abstract class Animal{
public String name;
public abstract void eat();
}
class Dog extends Animal{
public void eat(){
System.out.println("狗啃骨头");
}
public void sleep(){
System.out.println("狗睡觉");
}
}
//同样的方法调用而执行不同操作、运行不同代码(重写)
class Cat extends Animal{
public void eat(){
System.out.println("猫吃鱼");
}
}
public class Test {
public static void main(String[] args) {
//在运行时父类或者接口的引用变量可以引用其子类的对象
Animal a1 = new Dog();
Animal a2 = new Cat();
Dog dog = new Dog();
a1.eat();
//a1.sleep();
dog.sleep();
a2.eat();
//向下转型,需要instanceof操作符协助
if(a1 instanceof Cat){
Cat cat = (Cat)a1;
}
if(a2 instanceof Cat){
Cat cat = (Cat)a2;
cat.eat();
}
}
}
/*
狗啃骨头
狗睡觉
猫吃鱼
猫吃鱼
*/