向上转型与向下转型

目录

一、向上转型

1.1 三种形式

1.1.1 直接赋值

1.1.2 方法传参 

1.1.3 方法返回值

二、向下转型


在面向对象编程中,转型是将一个对象的引用从一个类型转换为另一个类型的过程。向上转型向下转型是对象类型转换的两种常见操作。这两种类型转换与继承多态紧密相关,尤其是在父类和子类之间的关系中经常使用。


一、向上转型

向上转型是指将子类对象转换为父类类型的引用。这种转换是自动进行的,且非常安全。

1.1 三种形式

1.1.1 直接赋值

Animal animal = new Dog(12,"小明");  

1.1.2 方法传参 

public class TestAnimal {

    public static void eat(Animal animal){    //形参为父类型引用,可以接收任意子类的对象
        animal.eat();
    }
    public static void main(String[] args) {
        Dog dog = new Dog(18,"小明");
        eat(dog);
    }
}

1.1.3 方法返回值

public static Animal eat(){     
        Dog dog = new Dog(18,"小明");
        return dog;         //作返回值:返回任意子类对象
}
  • 让代码实现更简单灵活,实现多态的基础。
  • 不能调用到子类特有的方法。 
class Animal{
    public void eat(){
        System.out.println("正在吃饭");
    }
}
class Dog extends Animal{
    public void eat(){
        System.out.println("正在吃狗粮");
    }
    public void bark(){
        System.out.println("正在汪汪叫");
    }

}
public class TestAnimal {
    public static void main(String[] args) {
        Animal animal = new Dog();//向上转型,自动完成
        animal.eat();             //输出正在吃狗粮,(动态绑定,调用子类的重写方法)
        //animal.bark();          编译错误,父类类型中没有bark()方法
    }
}

在这个例子中,Dog对象被自动转型为Animal类型,虽然引用类型是Animal,但调用的eat方法是Dog类的实现(因为动态绑定的缘故)。然而,父类Animal没有bark方法,因此我们无法调用animal.bark(),即使实际对象是Dog。

是自动、安全的,常用于处理多态性。在向上转型后,只能访问父类的成员方法和变量,但调用的是子类的重写方法。


二、向下转型

向下转型是指一个子类对象经过向上转型之后,再将父类引用重新转换为子类类型。这种转换并不是自动的,需要显式的强制类型转换。向下转型可能不安全,因为父类引用可能并不真正指向对应的子类对象,所以需要在运行时确保引用的实际对象是可以被安全转型的。

class Animal{
    public void eat(){
        System.out.println("正在吃饭");
    }
}
class Dog extends Animal{
    public void eat(){
        System.out.println("正在吃狗粮");
    }
    public void bark(){
        System.out.println("正在汪汪叫");
    }

}
public class TestAnimal {
    public static void main(String[] args) {
        Animal animal = new Dog();//向上转型,自动完成
        animal.eat();             //输出正在吃狗粮,(动态绑定,调用子类的重写方法)
        //animal.bark();          编译错误,父类类型中没有bark()方法
        if(animal instanceof Dog){
            Dog dog = (Dog) animal;
            dog.bark();
        }
        //Animal otheranimal = new Animal();
        //Dog dog2 = (Dog) otheranimal; 运行时会抛出 ClassCastException
    }
}

在这个例子中,我们首先进行了向上转型,将Dog对象作为Animal类型引用。之后使用instanceof关键字检查animal引用是否指向Dog对象,然后通过强制类型转换将其向下转型为Dog,以便调用bark()方法。如果animal实际上是一个Animal对象而不是Dog对象,那么向下转型将会导致ClassCastException异常。

是显式且不完全安全的,需要确保引用实际指向的是正确的子类对象。

 


完 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值