伴随多态的可互换对象(thinking in java)

这个伴随多态的可互换对象我第一眼看上去就很迷惑(这到底是什么鬼?)
在说这个之前我们先来看一段代码(代码原型出自thinking in java):

package demo;

public class Shape {
    public void draw(){
        System.out.println("shape绘画");
    }
    public void wipe(){
        System.out.println("shape擦除");
    }
    public void dosomething(Shape shape){
        shape.draw();
        shape.wipe();
    }
}
package demo;

public class rectangle extends Shape {
    public void draw(){
        System.out.println("rectangle绘画");
    }
    public void wipe(){
        System.out.println("rectangle擦除");
    }


}
package demo;

public class TestShap {
    public static void main(String[] args) {
        rectangle rec=new rectangle();
        rec.dosomething(rec);   
    }
}

控制台输出:

rectangle绘画
rectangle擦除

如果我们仔细看会发现什么?
调用的是shape对象,为啥输出的是这个而不是

shape绘画
shape擦除

这时java多态的一个特性,把一个对象不当做它属的特定类型来看,而是把它看成一个基类的对象来看,使得我们写出不依赖特定类型的代码。
每一个继承基类shape的图形都可以执行draw和wipe方法,方法操作的都是泛化的图形,方法执行不会考虑它是什么图形。所以这样不用担心对象如何处理消息。
我们并不想知道方那一段代码被执行,绘图方法等同地应用于三角形,四边形,等对象,而且对象会已经自身的具体类型来执行恰当的代码。

这个涉及到了非面对对象程序的前期绑定意味着编译器在编译时候,调用一个函数将产生一个具体函数名字的调用,运行时候将这个调用解析到需要调用代码的绝对地址中。

所以面对对象语言采用了后期绑定:即编译器只保证代码的存在和对参数类型和返回值进行检查,但是并不知道具体的代码。(省略了后期绑定的原理,具体请见think in java p9)
所以上面的对象互换就是用到了这个原理。
写的比较随意,如有错误欢迎指正。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值