A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 朱烈葵 中级黑马   /  2012-9-11 18:17  /  1410 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多态的弊端是父类不能预先使用子类的方法,何解?

7 个回复

倒序浏览
加载是先加载父类在加载之类   父类当然不能预先使用子类的方法 因为还没被初始化
回复 使用道具 举报
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:53 编辑

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

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

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
田旭阳 发表于 2012-9-11 18:31
java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。

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

谢谢你的回答,好像有点明白了,自个琢磨下
回复 使用道具 举报
杨震 发表于 2012-9-11 18:42
什么是多态,就是父类变量引用子类对象

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

哦 明白了,谢谢了!
回复 使用道具 举报
问题已解决!
回复 使用道具 举报
尤圣回 发表于 2012-9-11 18:21
加载是先加载父类在加载之类   父类当然不能预先使用子类的方法 因为还没被初始化 ...

懂了 懂了 三克油
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马