JAVA的转型与动态绑定

6 篇文章 0 订阅

上转型与下转型

想要理解java中的转型只需要记住一句话:
父类引用指向子类对象
这句话是什么意思呢?

Father f1 = new Son();   // 这就叫 upcasting (向上转型)
// 现在 f1 引用指向一个Son对象

Son s1 = (Son)f1;   // 这就叫 downcasting (向下转型)
// 现在f1 还是指向 Son对象

但是以下代码就会出错:

Father f1 = new Father();
Son s1 = (Son)f1;//ERROR!!

因为f1是父类的引用,指向了父类对象,父类对象不能够指向子类引用。

上转型的特点

  1. 上转型对象不能操作子类新增加的成员变量,不能使用子类新增的方法。即为较子类B失去一些属性和功能,这些属性和功能是新增的。
  2. 上转型对象可以操作子类继承或隐藏的成员变量,也可以使用子类继承的或重写的方法。即为上转型对象可以操纵父类原有的属性和功能,无论这些方法是否被重写
  3. 上转型对象调用方法时,就是调用子类继承和重写过的方法。而不会是新增的方法,也不是父类原有的方法。
  4. 可以将对象的上转型对象再强制转换到一个子类对象**(下转型)**,强制转换过的对象具有子类所有属性和功能。

上转型的优点

public static void dosleep(Human h) {
	//这里的Human h是传入父类,如果传入子类可以将其上转型为父类
    h.sleep();
}

这里以父类为参数,调用有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。不然的话,如果 dosleep 以子类对象为参数,则有多少个子类就需要写多少个函数。这也体现了 JAVA 的抽象编程思想。

动态绑定

概念
方法可以在沿着继承链的多个类中实现,子类可以重写父类的方法。JVM决定运行时调用哪个方法。这就是动态绑定。
原理
假设,对象o是类C1的实例,其中C1是C2的子类,C2是C3的子类,那么o也是C2,C3的实例。如果对象o调用一个方法p,JVM会依次在类C1,C2,C3中查找方法p的实现**(首先看参数类型,找到最合适的参数类型。再在参数类型符合的类方法中按照C1,C2,C3的顺序来查找p)**,直到找到为止。

这也是java中多态的一种体现形式

class 人{
  吃饭();
}

class 程序员 extends 人{
  吃饭();
  编码();
}

另外有个函数:

void doSomething(人){
   一个人.编码();//这里就会编译出错,因为编译器只知道参数类型是人,而人的通用行为里只有吃饭,没有编码
   一个人.吃饭();//这里没有编译错,因为编译器知道人有吃饭的行为。具体的行为是程序员吃饭还是工人吃饭,就看传的是什么人了,靠运行时函数的晚绑定实现。
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值