Java向上转型与向下转型

本文详细介绍了Java中的向上转型和向下转型概念及其应用场景,包括为何进行转型、转型操作的优缺点,并通过示例展示了不安全和错误的转型可能导致的运行时错误。同时,解释了instanceof运算符的作用,用于判断对象是否为特定类的实例。
摘要由CSDN通过智能技术生成


一、向上转型

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值