场景:
在学习Java的过程中,理解向上转型(Upcasting)和向下转型(Downcasting)对于掌握面向对象编程中的多态性至关重要。本文将通过简单的例子来阐述这两个概念的作用和意义。
什么是向上转型和向下转型
对象向上转型
父类对象可以调用子类重写父类的方法,这样当需要新添功能时,只需要新增一个子类,在子类中对父类的功能进行扩展,而不用更改父类的代码,保证了程序的安全性。
对象向下转型
向下转型是为了重新获得因为向上转型而丢失的子类特性。
向上转型:
首先定义一个父类对象Animal
Animal 中有shout方法和eat方法
class Animal{
void shout() {
System.out.println("动物的叫声");
}
void eat(){
System.out.println("动物吃饭");
}
}
然后定义子类对象Cat
Cat中有shout方法和play方法
class Cat extends Animal{
public void shout(){
System.out.println("猫的叫声:喵喵喵!");
}
public void play(){
System.out.println("猫猫玩球");
}
}
最后定义一个Test类,实现向上转型
public class Test {
public static void main(String[] args){
Cat cat=new Cat();
Animal an=cat;//向上转型
an.shout();//子类中被重写的方法
an.eat();//父类中本来就有的方法
}
}
向上转型是把子类对象赋值给父类类型。
在代码中,将子类对象cat赋值给父类对象an 实现向上转型,此时an是Animal类型的对象,但是实际上指向了Cat类型的变量;
an可以调用自己本身类Animal 的所有方法和与子类中共有的方法,或者说在子类中被重写的方法。
缺点,an虽然指向了Cat类,但是丢失了Play方法,比如这样子,代码会报错
public class Test {
public static void main(String[] args){
Cat cat=new Cat();
Animal an=cat;//向上转型
an.play();//报错!!!
}
}
原因:向上转型后,an只有父类的方法+子类中重写的父类方法,在这个例子中an的方法只有猫叫shout(来自子类重写)和动物吃饭eat(来自父类)。
向下转型:
向下转型前必须要有向上转型!
public class Test {
public static void main(String[] args){
Animal an=new Cat();//向上转型
Cat cat2=(Cat)an;//向下转型
cat2.play();
cat2.eat();
cat2.shout();
}
}
将已经向上转型的an强制转换为Cat类型并赋给cat2,此时cat2可以调用父类Animal中的全部方法(不包括被重写的方法)和子类Cat中的全部方法。
总结:
向上转型后能够调用的方法:
- 父类中的全部方法(不包括被子类重写的)
- 子类中重写的方法
向下转型后能够调用的方法:
- 父类中的全部方法(不包括被子类重写的)
- 子类中的全部方法
向上转型的基本格式有两种:
子类类型 子类对象a = 子类实例;
父类类型 父类对象b = 子类对象a;
父类类型 父类对象b = 子类实例;
向下转型的基本格式:
子类类型 子类对象a = 子类实例;
父类类型 父类对象A = 子类对象a; //向上转型
子类类型 子类对象b = (子类)父类对象A;
标签:Java,对象,子类,三分钟,转型,Cat,Animal,父类 From: https://blog.csdn.net/2301_81012597/article/details/144165736父类类型 父类对象A = 子类实例; //向上转型
子类类型 子类对象b = (子类)父类对象A;