java学习8:多态

多态,发生在具有继承关系的类之间。

如:class fu{} class zi1 extendsa{}  class zi2 extend a{}

可以看到,fu是父类,zi1和zi2是子类,但zi1和zi2没有继承关系。

我们在建立对象的时候,可以这么写:

fu a=new zi1();

新来的引用a的数据类型是fu,但指向的对象是一个zi1.这个时候会发生什么呢?

首先要开始编译。比如我调用一个fu里面有的函数,编译器一看fu里面有,就会让你通过。接着来运行,别忘了a指向的是zi1的对象,最后函数会使用zi1的函数,如果没有重写那效果当然一样,重写了那就不一样了。假如我用a调用zi1特有的函数,那就调用不了了,编译通不过,因为编译器觉得fu没这个函数,就不让你用。这就是子类变父类,叫向上转型。

那我就是想用怎么办?也行,让父类变成子类就行了。向下转型,要强制类型转换:

zi1 c=(zi1) a这样我就把a变成了zi1类型的,我可以用c调用zi1的方法。

如果我这样会怎么样:zi2 c=(zi2) a.

编译器看一下,好像没关系的样子。因为zi2 和 fu有继承关系,可以转换,编译能通过。但是别忘了a指向zi1的对象,你现在类型是zi2,运行就出大问题。zi1和zi2又没有继承关系,你凭什么用zi2的引用调用zi1的函数?所以运行期会出问题。

那我要怎样避免这种问题呢?使用instanceof运算符:

if(a instanceof zi2){

        zi2 c=(zi2) a;

}

如果a指向的对象是zi2类型的,那就返回true,if就可以运行,这就防止了出现问题。

如果还有其他类的话你可以在else if,总之一般就是要转换成这个引用指向的那个对象的类型。

那么,这个多态有什么用呢?想象一下,我设置了一个主类pet;cat,dog,mouse都是pet的子类,我现在有一个feed方法,需要拿cat,dog,mouse的对象(准确来讲是对象的引用)做输入参数并引用其中的函数,而这些函数是大家所共有的。如果我不用pet,我就要写三个feed方法,分别对应三种输入的情况。假如我拿pet作为输入的形参,pet生为三个类的父类,可以产生多态的效果(pet a=cat b什么的)那么我就可以在方法体力肆无忌惮地写a.方法名,反正这些方法pet也有(千万别弄成了子类独有的那些方法)如果在各自的类里这个方法有所不同,由于重写机制也完全不用担心,这样我就可以随意地增加我的宠物类,只要是pet的子类,加再多我的pet类都不需要修改,受其影响的类(在复杂的软件开发中这会非常多)也不用修改,扩展性大大增强。

多态没学完,p154.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值