java多态向上、向下转型问题

来源:互联网 发布:js二维数组的遍历 编辑:程序博客网 时间:2024/05/16 13:45

向上转型
 假定父类为动物,子类为狗,父类有一个方法发声(),狗继承并覆盖了一个发声方法。
          在子类重写该方法  则:动物 a=new 狗();//这就为向上转型a.发声();
 在调用 a.发声();时调用的是狗的发声()也可调动物类其他方法 但不能调用狗类方法
 向上转型都会成功,是安全的。 就像说狗是动物没问题。
向下转型
 若修改为动物 a=new 狗();
 狗b=(狗)a;//这里向下转型
 这时b可调用动物类未被重写的方法和狗类所有方法(包括重写动物类的方法)
 动物 a=new 动物();
 a.发声();//调动物类方法
 狗 b=(狗)a;//这也是向下转型 但下面通过b若调用 动物 或 狗类中任意方法都报异常 
 也就是说向下转型可能会出错 不能说动物是狗

实例:

dog是animal的子类,animal里只有一个“吃”的方法,dog类里有“吃”和“叫”两个方法。当向上转型时,
Animal a = new Cat();  
问题1:这个过程叫做父类引用指向子类对象?为什么不叫做子类引用指向父类对象呢?

答:引用a的类型是Animal,是Cat的父类。所以是“父类引用指向子类对象”。如果是“子类引用指
向父类对象”,那应该写成 Cat a = new Animal();但这显然是不和逻辑的。
问题2:子类继承父类可以使子类的功能更强大。而向上转型后,父类也只能调用父类已经有的方法,
而不能调用子类新增加的功能啊,多态还有什么用呢?这一点也好理解,子类知道哪个是他的父类,
但父类不会知道哪个类是他的子类,所以不能调用父类中没有的方法。
对于我上面的问题,可不可以这么来解释:因为子类可以重写父类中的方法,向上转型时,父类可以
调用子类中重写过的方法,这样 间接的也扩充了父类的功能。我这么理解对吗?
答:“向上转型后,父类也只能调用父类已经有的方法”。但是子类如果覆盖了父类的方法,那么即

时候,使得你也不必关系具体的实现细节,只要知道“这个类型中的某个方法能帮我完成工作”就可以了。

问题3:向下转型就是Animal a = new Cat(); Cat c = (Cat) a;     可不可以理解为:父类的对

象强制转换成子类的类型(Cat型),然后赋给子类的对象,完成向下转型。这样的话子类对象(c)既可

以调用"吃"的功能,又能调用“叫”的功能。这样也扩充了父类的功能。

答:向下转型,是“引用的类型”的变化,不是对象实例类型的变化。new什么,就是什么。不会因为

向上或者向下转型而改变自己的类型。

问题4:向下转型时,子类对象c调用的方法是父类的还是子类的呢??
答:不管向上还是向下转型,调用的都是实际类型中的那个方法。比如,Animal a = new Cat(); a.

叫()。那这个叫就是Cat类型实例中的“叫”方法。
使向上转型,方法的行为也表现为覆盖后的行为。这

也是多态的一种体现。向上转型更多的用来体现一种编程上的“约定”。所有继承某个类或者实现某个

接口的类,一定包含某个方法,这样在调用的

0 0
原创粉丝点击