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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭娇珍 中级黑马   /  2013-1-3 00:38  /  1706 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如果p是父类Parent的对象,而c是子类Child的对象,则语句c = p是正确的吗?

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 呵呵 ,

查看全部评分

6 个回复

倒序浏览
本帖最后由 sun~~ 于 2013-1-4 19:46 编辑

不可以!
回复 使用道具 举报
不可以,会抛出classCastException类型转换异常。
这涉及到了向上转型和向下转型。
当一个父类引用指向子类对象的时候,子类对象向上转型成了父类类型。向上转型是自动转换的。这就是继承间的多态体现。
当子类引用指向父类对象时,就是向下转型,需要强制转换。

举例:
  1. class Person
  2. {
  3.         public String toString()
  4.         {
  5.                 return "person";
  6.         }
  7. }
  8. class Child extends Person
  9. {
  10.         public String toString()
  11.         {
  12.                 return "child";
  13.         }
  14. }

  15. public class MyTest
  16. {
  17.         public static void main(String[] args)
  18.         {
  19.                 Person p=new Person();
  20.                 Child c=new Child();
  21.                 //向上转型,自动转型
  22.                 p=c;
  23.                 //向下转型,强制转换。在这里判断如果p是Child类型就可以转换
  24.                 if(p instanceof Child)
  25.                 {
  26.                         c=(Child)p;
  27.                         System.out.println("p是Child类型");
  28.                 }
  29.                 else
  30.                         System.out.println("p不是Child类型");
  31.                 System.out.println(p);
  32.                 //System.out.println(c);
  33.         }
  34. }
复制代码
希望你能明白

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
不可以的。 在java里,向上转型是自动进行的,但是向下转型却不是,需要我们自己定义强制进行
c=(Parent)p;进行强制转化,也就是向下转型

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
本帖最后由 刘文超 于 2013-1-3 10:49 编辑

楼上的回答已经很精彩了,
对于父类对象想转换为子类,必须强制准换才行,不能使默认的。
但这个例子主要不是多态,多态是向上转型的。
下边我给lz介绍一下多态吧:
把不同的子类(child1和child2)对象都当作父类(parent)来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
因此,程序就具备了通用性和可扩展性,正是面向对象的核心所在。
多态的3个条件
1、要有继承关系,正如:class Child extends Parent;
2、要有方法的重写:我们想要用多态实现什么功能,就要将这个功能的方法从父类重写,用来之后的动态绑定;
3、父类引用指向子类对象原则。
下边我给楼主一个小例子,以示多态的条件,及优点。
大家都知道ArrayList和LinkedList都实现了List接口,这可以说是一种继承关系。
ArrayList是顺序存储,查询方便,增删繁琐;
LinkedList是链式存储,查询繁琐 但增删容易;
我们定义集合的时候如果用了多态,就可以根据我们后来的情况选择来决定到底用哪个集合了、
代码:
  1. package org.qyx.online;

  2. import java.util.*;

  3. public class TestCastDown {
  4.         public static void main(String[] args) {
  5.                 List list=new ArrayList();
  6.                 /*
  7.                  *     只把上面这句改为
  8. new LinkedList() 就可以了,其他什么都不用动,岂不快哉!--------可扩展
  9.                         用父类引用指向子类对象的好处就是:
  10.                         我们的list虽然是ArrayList,但只能执行List接口里边实现来的东西,约束它不能整出自己的东西,
  11.                         不然换成LinkedList可能就不好使了--------通用
  12.                 */
  13.                 list.add("l1");
  14.                 list.add("l2");
  15.                 list.add("l3");
  16.                 list.add("l4");
  17.         }
  18. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
{:soso_e189:}明白了
thank you
回复 使用道具 举报
错误!错误!  
父类引用可以指向子类对象
父类引用也可以接受子类对象
而且我认为多态中还有容易出问题的地方是  (当然初学者)
在多态中成员函数的特点
  在编译时期:参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有编译报错
  在运行时期:参阅对象所属的类中是否有调用的方法
  简单的总结就是:成员函数在多态的调用时,编译看左边有木有,运行看右边有木有
在多态中,成员变量的特点:
  无论编译和运行,都参考左边 即引用类型所属的类
在多态中,静态成员函数的特点
     静态函数在继承中没有覆盖的情况
  无论编译和运行,都参考左边

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 补足你的技术分。

查看全部评分

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