java多态的转型

这两天一直在看别人争论关于多态的向上转型和向下转型,然后就根据自己的理解谢了这篇帖子,请高手指正一下,不胜感激
//父类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、付费专栏及课程。

余额充值