黑马程序员技术交流社区

标题: 多态的弊端 [打印本页]

作者: 朱烈葵    时间: 2012-9-11 18:17
标题: 多态的弊端
多态的弊端是父类不能预先使用子类的方法,何解?
作者: 尤圣回    时间: 2012-9-11 18:21
加载是先加载父类在加载之类   父类当然不能预先使用子类的方法 因为还没被初始化
作者: 田旭阳    时间: 2012-9-11 18:31
java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。

什么叫父类引用指向子类对象,且听我慢慢道来.

从2个名词开始说起:向上转型(upcasting) 、向下转型(downcasting).

举个例子:有2个类,Father是父类,Son类继承自Father。

Father f1 = new Son(); // 这就叫 upcasting (向上转型)

// 现在f1引用指向一个Son对象

Son s1 = (Son)f1; // 这就叫 downcasting (向下转型)

// 现在f1还是指向Son对象

第2个例子:

Father f2 = new Father();

Son s2 = (Son)f2; // 出错,子类引用不能指向父类对象

你或许会问,第1个例子中:Son s1 = (Son)f1;问什么 是正确的呢。

很简单因为f1指向一个子类对象,Father f1 = new Son(); 子类s1引用当然可以指向子类对象了。

而f2 被传给了一个Father对象,Father f2 = new Father();子类s1引用不能指向父类对象。

总结:

1。父类引用指向子类对象,而子类引用不能指向父类对象。

2。把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转换。

如:Father f1 = new Son();

3。把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转换。

如:f1 就是一个指向子类对象的父类引用。把f1赋给子类引用s1即 Son s1 = (Son)f1;

其中f1前面的(Son)必须加上,进行强制转换。

作者: 杨震    时间: 2012-9-11 18:42
本帖最后由 杨震 于 2012-9-11 18:53 编辑

什么是多态,就是父类变量引用子类对象

由于你调用方法的时候,只能基于变量调用,由于变量是父类型的,也就是说只能调用父类所拥有的方法,尽管引用的是个子类对象(对父类进行了扩展),但是其中扩展的特定方法不能调用,因为方法调用是基于变量类型的,而不是基于引用的对象类型的,你变量是父类型的调用的方法也必须是父类里面有的,这样子类的特定方法就得不到调用
如果List list = new ArrayList();
当父list.方法的时候,这个方法只能是List接口里面有的,没有的就不能用,这样的话在ArrayList里面扩展但是List接口里面没有的方法就得不到调用了.
如果想调用子类特定方法,只能将list定义成ArrayList类型的,即ArrayList list = new ArrayList,但这就不是多态了,因为多态是父类引用子类对象.

作者: 朱烈葵    时间: 2012-9-11 18:48
田旭阳 发表于 2012-9-11 18:31
java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。

什么叫父类引用指向子类对象,且听 ...

谢谢你的回答,好像有点明白了,自个琢磨下
作者: 朱烈葵    时间: 2012-9-11 18:50
杨震 发表于 2012-9-11 18:42
什么是多态,就是父类变量引用子类对象

由于你调用方法的时候,只能基于父类变量调用,也就是说只能调用父 ...

哦 明白了,谢谢了!
作者: 朱烈葵    时间: 2012-9-11 18:50
问题已解决!
作者: 朱烈葵    时间: 2012-9-11 18:51
尤圣回 发表于 2012-9-11 18:21
加载是先加载父类在加载之类   父类当然不能预先使用子类的方法 因为还没被初始化 ...

懂了 懂了 三克油




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