java中的向上和向下转型_java中多态的向上和向下转型

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

[size=12px][size=18px] 这两天一直在看别人争论关于多态的向上转型和向下转型,然后就根据自己的理解谢了这篇帖子,请高手指正一下,不胜感激

//父类Pet

1. class Pet{

2. public void toHospital(){

3. system.out.println("宠物看病!");

}

}

//Dog子类继承父类Pet

public class Dog extends Pet {

public void toHospital(){

System.out.println("gg看病!");

}

public void mm(){

System.out.println("这不是真的!");

}

}

//Bird子类继承父类Pet

public class Bird extends Pet {

public void toHospital(){

System.out.println("小鸟看病!");

}

public void yy(){

System.out.println("小鸟非得高");

}

}

//yu子类继承父类Pet

public class yu extends Pet {

public void ys(){

System.out.println("我是一只会飞的鱼");

}

}

// 调用代码

10. public class Test{

11. public static void main(String [] args){

12. Pet pet = new Dog();

13. pet.toHospital();

14 pet =new Bird();

15 pet.toHospital();

16 pet =new yu();

17 pet.toHospital();

}

}

运行时的输出结果是:

gg看病!

小鸟看病!

宠物看病!

以以上代码为例:

1, 首先运行代码时,执行12行代码的时候,会在堆中开辟出一块空间,用来存放子类对象即new Dog();在栈中开辟出一块空间存放父类的引用即 Pet pet,将父类引用指向子类Dog的对象;即把存放对象的地址放入到栈中开辟的为父类命名的空间pet中

2.在执行第13行代码的时候,其实总的也是运行Dog类的对象,但是要求是Pet 即父类类型的,Dog对象中Pet类型的是toHospital()而不是 mm(),这就是向上转换的一个规则:通过父类引用变量无法调用子类特有的方法。而此时父类的 toHospital()的方法已经被重写了,所有输出狗狗看病。

3.如果继承之后没有被重写,如yu类第17行输出的就是宠物看病

向下转换其实也是一个类型和地址的变换:

如果调用代码如下:

public class test {

public static void main(String [] args){

Pet pet = new Dog();

17. if(pet instanceof Dog){

18. Dog dog= (Dog) pet;

19. dog.mm();

}else if(pet instanceof Bird){

Bird bird=(Bird) pet;

bird.yy();

}

}

}

输出的结果是

这不是真的

1.在运行到18行的时候,先在栈中再开辟一个新的空间,作为子类引用空间,此时栈中存放的数据是随机的,然后再把在栈中开辟的父类空间中的数据复制到Dog的栈空间中,这样子类引用就指向了堆中的子类对象。

2.19行执行的时候,只能执行Dog类中特有的方法,因为在18行就指明了存放的是Dog类型的,而不是Pet类型的,所有不能调用.toHospital()方法

有什么不对的大家指正一下,这个只是个人的理解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值