黑马程序员技术交流社区

标题: 多态 [打印本页]

作者: 黑马-刘浩    时间: 2012-9-21 00:28
标题: 多态
多态中可以用向上转型来调用方法,但真么情况下要用强转型呢???这有什么区别??
作者: 张 涛    时间: 2012-9-21 01:20
向上转型,子类转为父类,比如:父类animal,子类dog继承animal。
使用多态定义是这样:Animal an = new Dog();父类引用指向子类对象,这就是向上转型,new出的是子类dog对象,赋给了animal对象,子类转为父类。向上转型是安全的,可以说狗是动物。使用向上转型是为了引入多态,下次不生成狗了,要生成猫,只需改an = new Cat()即可。

向下转型,父类转为子类,比如Dog d = (Dog)an;把父类对象an,转化为dog对象d;父类转化为子类,这样是为了引用子类中新的方法。向下转型是不安全的,因为不能说动物是一只狗。

为了避免向下转型的不安全,java中的许多方法都引入了泛型。

楼主有兴趣可以学学。
作者: 陈振兴    时间: 2012-9-21 01:30
本帖最后由 陈振兴 于 2012-9-21 01:31 编辑

用我的话就是用到什么子类的方法然后就强转为子类对象,然后就可以操作本类中的方法。
我的笔记:
对于对象的调用只能限于编译时类型的方法,如调用运行时类型方法报错。
在上面的例子中:Animal a=new Dog();对象a的编译时类型为Animal,运行时类型为dog。
注意:编译时类型一定要为运行时类型的父类(或者同类型)。
对于语句:Dog d=(Dog)a。将d强制声明为a类型,此时d为Dog(),此时d就可以调用运行时类型。注意:a和d指向同一对象。
程序的运行时,动态类型判定。运行时调用运行时类型,即它调用覆盖后的方法。

        动态绑定:
        在编译时期:参阅引用型变量所属类中是否有调用方法。如果有,编译通过,不过没有编译失败。
        在运行时:参阅对象所属的类中是否有调用方法。
        成员函数在多态调用时,编译看左边(主观认为),运行看右边(客观存在)。
        静态绑定:静态成员函数特点,无论编译和运行,都参考左边。

        主观认为(编译时类型) Animal ai = new Bird();客观存在(运行时类型)
        对象名instance of 类名(接口名)
所以我就总结了一句自己的理解,好好理解吧(这可是我读了好几本书才把这个给搞定的啊)!
作者: 翁鹏    时间: 2012-9-21 07:30
多态中  只要两个类存在“是”关系,就可以用超类引用指向子类对象。这就是说超类可以多态的调用子类,众多子类可以响应同一方法调用,但具体怎么响应可能不同。而且这方法必须子类和超类共有,而不能掉用子类中特有的方法。Person p1 = new Student(); Person p2 = new techer(); 这样是允许的。
所以说当你要调用子类的特有方法时是不允许的, 所以这个时候就需要向下转型。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2