Java之向上转型和向下转型

本文介绍了Java中的向上转型(将子类对象赋值给父类引用,自动安全)和向下转型(父类引用转为子类引用,需强制类型检查)的概念,以及两者之间的区别和注意事项,包括可能抛出的ClassCastException异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

常规声明对象赋值过程:

向上转型: 父类的引用指向子类对象 ,自动转化,安全。

向下转型: 子类引用指向父类(父类的引用给到子类对象),需要进行强制转化

疑问?


常规声明对象赋值过程:

Animal animal = new Animal() ;

向上转型: 父类的引用指向子类对象 ,自动转化,安全。

此时,将 = 号右边更换子类对象

Animal animal1 = new Dod() ;  Animal animal2 = new  Cat() ;

这种将子类对象赋值给父类的操作是先向上转型。也就是父类的引用指向子类对象。此时符合is a 原则。此时不会报错,会自动向上转型。实际上就是创建一个子类对象,将其当作父类对象来使用。把一个小对象转成大对象。

注意:

  • 上转型对象不可以访问子类新增的成员变量和子类自己新增的方法,因为这是子类独有的,而父类中没有;
  • 上转型对象可以访问子类继承的方法或者是子类重写的方法,这个时候当上转型对象去调用这个方法时,一定是调用了子类重写后的方法;
  • 不可以将父类创建的对象的引用赋值给子类声明的对象,也就是下面的这两句代码,这很明显和我们的上转型对象相反的,我们是将子类对象给到父类的引用,但这是将父类的引用给到子类的对象,完全就是颠倒黑白【就和猫是动物,动物却不是猫一个道理】

向下转型: 子类引用指向父类(父类的引用给到子类对象),需要进行强制转化

Animal animal1 = new Dod() ;

Animal animal2 = new  Cat() ;

Dog dog =  (Dog)animal1  ;  Cat cat = (Cat) animal2 ;

向下转型前提,得确定Animal是Dog的类型。否则会报  java.lang.ClassCastException 错误

所以括号进行强制转换指定类型。但为保证向下转型成功。通过进行instanceof 进行判断。

instanceOf的作用是测试它左边的对象是否是它右边类的实例,并返回 boolean类型的数据。

if(animal instanceof Dog){
    Dog dog =  (Dog)animal1  ;  
}

if(animal instanceof Cat){
    Cat cat = (Cat) animal2 ;
}
疑问?

向下转型之前必须向上转型嘛?

在Java中,向下转型(downcasting)是指将一个父类引用变量转换为子类引用变量。在向下转型之前,必须进行向上转型(upcasting)。

向上转型是指将一个子类对象转换为父类引用变量。这样做不会丢失对象的任何信息,只是扩展了对象的类型。向上转型是安全的,因为子类是父类的特殊形式,所以子类对象可以被当作父类对象来处理。

向下转型是将已经进行过向上转型的对象再次进行类型转换,将其转换为子类引用变量。在进行向下转型时,必须保证父类引用变量实际上指向了一个子类对象,否则会导致ClassCastException异常。

class Animal {  
    public void makeSound() {  
        System.out.println("The animal makes a sound");  
    }  
}  
  
class Dog extends Animal {  
    public void makeSound() {  
        System.out.println("The dog barks");  
    }  
}  
  
public class Main {  
    public static void main(String[] args) {  
        Animal animal = new Animal(); // 向上转型  
        Dog dog = (Dog) animal; // 尝试向下转型,抛出ClassCastException异常  
    }  
}

在上面的代码中,我们首先创建了一个Animal对象,并将其向上转型为父类引用变量。然后,我们尝试将该引用变量向下转型为Dog对象,但由于该引用变量实际上并没有指向一个Dog对象,因此会导致ClassCastException异常。所以应该在向下转型之前进行向上转型:

Animal animal = new Dog(); // 向上转型

 如有错误,请大哥指导
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

if else

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值