JAVA基础——向上转型和向下转型

本文探讨JAVA中的向上转型和向下转型。向上转型是指子类转换为父类,是多态实现的关键,允许调用父类方法。向下转型则是父类转换为子类,需要强制转换,并依赖于`instanceof`关键字来判断对象实际类型,以确保安全转换。只有当`instanceof`返回`true`时,才能进行向下转型并访问子类特有的方法。

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


Java中,存在向上转型和向下转型。

向上转型

子类转换为父类称为向上转型。
子类转换为父类属于小范围转换成大范围,属于自动类型转换。
例:

public class Test{
    public static void main(String[] args) {
        Animal cat = new Cat(); //Cat类转换为Animal类,向上转型	
        Animal dog = new Dog();  //Dog类转换为Animal类,向上转型
        cat.Method();
        dog.Method();
    }
}
class Animal{
    void Method(){
        System.out.println("animal");
    }
}
class Dog extends Animal{
    void Method(){
        System.out.println("dog");
    }
}
class Cat extends Animal{
    void Method(){
        System.out.println("cat");
    }
}

输出结果:
输出结果
可以看到,将子类Cat类和Dog向上转换成了Animal类,实现了多态。
向上转型是多态实现的重要步骤,只有类和类之间有继承关系才能向上转型。
当我们需要多个同父的对象调用某个方法时,通过向上转换后,则可以确定参数的统一.方便程序设计。
向上转型时,父类只能调用父类方法或者子类覆写后的方法,而子类中的单独方法则是无法调用的.
编译看左边,运行看右边。编译器只直到cat是Animal类,如果是Animal类中不存在的方法,编译器会报错。
如果想要调用子类中特有的方法,需要向下转型。

向下转型

父类转换成子类属于向下转型。
向下转型属于大类型转换成小类型,不能自动转换,需要强制转换。
例:

public class Test{
    public static void main(String[] args) {
       Animal animal = new Cat();
       Cat cat = (Cat)animal;   //将Animal类向下转型为Cat类,这是先创建对象后向下转型
       Dog dog = (Dog) new Dog();   //将Animal类向下转型为Dog类  ,直接向下转型。
        cat.Method2();
        dog.Method2();
    }
}
class Animal{
    void Method(){

        System.out.println("animal");
    }
}
class Dog extends Animal{
    void Method(){

        System.out.println("dog");
    }
    void Method2(){
        System.out.println("我是狗独有的" );
    }
}
class Cat extends Animal{
    void Method(){
        System.out.println("cat");
    }
    void Method2(){
        System.out.println("我是猫独有的");
    }
}

输出结果:
输出结果
通过强制的向下转型,可以调用子类中特有的方法。
强制类型转换必须保证是相同类型之间的转换,只有是Cat类才能转换为Cat类。有时候我们并不知道类名,所以这个时候就需要使用关键字instanceof。
instanceof是用来判断引用指向的对象类型。instanceof(a of A),返回值是boolean类型。如果a引用的对象类型是A类型,则返回true,如果不是,则返回false。
例:

public class Test{
    public static void main(String[] args) {
        Animal animal = new Cat();
        if(animal instanceof Cat){   //判断animal是否是Cat类型
            Cat cat = (Cat)animal;
            cat.Method2();
        }
        if(animal instanceof Dog){   //判断animal是否是Dog类型
            Dog dog = (Dog)animal;
            dog.Method2();
        }
    }
}
class Animal{
    void Method(){

        System.out.println("animal");
    }
}
class Dog extends Animal{
    void Method(){

        System.out.println("dog");
    }
    void Method2(){
        System.out.println("我是狗独有的" );
    }
}
class Cat extends Animal{
    void Method(){
        System.out.println("cat");
    }
    void Method2(){
        System.out.println("我是猫独有的");
    }
}

输出结果:
输出结果
我们发现,输出结果只有猫,没有狗,因为animal是Cat类型的不是Dog类型的。
我们在开发过程中有时根本不知道类名和类和类之间的关系,所以instanceof关键字十分重要,只有instanceof返回为true了,才能向下转型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CHB爱Study

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

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

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

打赏作者

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

抵扣说明:

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

余额充值