文章目录
一、向上转型
1.1什么是向上转型?
把子类对象直接赋给父类引用叫向上转型(upcasting),向上转型不用强制转型。
也就是说,父类引用可以自动地包装子类对象。例如:Student类 继承了 Person 类
Person person = new Student();
1.2为什么要向上转型
优点:
-
我们不必知道正在处理的对象的确切类型,这一切都交给多态处理即可;
-
可以简化代码数量;
缺点:
- 不能使用子类中特有的类
二、向下转型
2.1什么是向下转型?
把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转型
2.2为什么要向下转型?
便于程序的扩展,可以调用更多子类的方法。
示例1:
interface Ihuman
{
void eat();
}
class Man implements Ihuman
{
public void eat()
{
System.out.println("man eat");
}
public void run()
{
System.out.println("man run");
}
}
public class test {
@Test
public void testOR()
{
Ihuman human = new Man(); //向上转型成接口
human.eat();
Man m = (Man)human; //向下转型成子类,调用子类方法
m.run();
//能不能直接向下转型?
Ihuman human = new human(); //不能,不能实例化接口,报错
Man m = (Man)human;
m.run();
}
}
运行结果
运行结果:
man eat
man run
示例2:
Animal animal = new Cat();
Cat cat2 = (Cat) animal;
cat2.sayAnimal();
cat2.sayCat();
为了安全,最好的向下转型方式为:
Animal animal = new Cat();
if(animal instanceof Cat){
Cat cat2 = (Cat) animal;
cat2.sayAnimal();
cat2.sayCat();
}
2.3不安全的向下转型:编译正常,运行报错
Cat cat = (Cat) new Animal();
cat.getHead();
cat.getEyes();
运行时报错如下:
父类对象不能转换为子类对象,需要现将子类对象向上转型为父类对象之后,再将父类对象向下转型为子类对象。
Exception in thread "main" java.lang.ClassCastException: com.etc.demo.Animal cannot be cast to com.etc.demo.Cat
2.4错误的向下转型:编译正常,运行报错
Animal animal = new Cat();
Dog dog = (Dog) animal;
dog.sayAnimal();
dog.sayDog();
运行时报错如下:
两个子类对象不能相互转换,猫不能变成狗。
Exception in thread "main" java.lang.ClassCastException: com.etc.demo.Cat cannot be cast to com.etc.demo.Dog
三、补充知识点(intanceof)
instanceof是Java的一个二元操作符(运算符),也是Java的保留关键字。它的作用是判断其左边对象是否为其右边类的实例,返回的是boolean类型的数据,用它来判断某个对象是否是某个Class类的实例。
用法:boolean result = object instanceof class