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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zclove898 高级黑马   /  2011-12-9 00:45  /  2678 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 zclove898 于 2011-12-9 22:26 编辑

   刚刚看完转型,子类自动提升为父类还可以理解,但把父类在转换回来是就有些迷糊了,看了好几遍,越看越迷糊,希望帮忙指点一下。

6 个回复

倒序浏览
多态调用非静态成员时,是以左边(父类)为准的,如果父类里没有,则编译是不通过的.  所以如果调用的是子类而父类里没有的成员方法时,必须向下转型为子类后,才能调用的到.  我理解是这样

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
本帖最后由 benbenqi 于 2011-12-9 08:59 编辑
  1. abstract class Animal
  2. {
  3.         abstract void eat();
  4. }
  5. class Cat extends Animal
  6. {
  7.         public void eat()
  8.         {
  9.                 System.out.println("吃鱼");
  10.         }
  11.         public void catchMouse()
  12.         {
  13.                 System.out.println("抓老鼠");
  14.         }
  15. }

  16. class  FuZiDemo
  17. {
  18.         public static void main(String[] args)
  19.         {
  20.                 Animal a = new Cat();//类型提升,向上转型。
  21.                 a.eat();
  22.                 Cat c = (Cat)a;//强制将父类的引用转成子类类型。向下转型。
  23.                 c.catchMouse();
  24.         }
  25. }
复制代码
你要明白为什么要向下转型呢?
因为你要调用子类(猫)的特有方法(即catchMouse();),然而父类又没有子类的特有方法(即catchMouse();),所以没法直接调用。如果想要调用,只要强制将父类的引用对象强制转成子类类型。
只要明白了“为什么”你也就明白了。。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
本帖最后由 hello西卡够 于 2011-12-9 15:37 编辑

举例:Person类、Student类,Student类继承Person类,分两种情况:
一(这个不能有)、
Person p = new Person();          //会报ClassCastException,类型转换异常,
Student s = (Student)p;            
二(这个可以有)、
Person p = new Student();       //正确通过,因为p在最创建的时候就是创建的一个Student对象的引用,然后上传父类对象p是成功的,
Student s =(Student) p;           //但它里面实际上还是子类对象的信息,再强制转换成子类自然也行,

//再举个:苹果继承水果,水果创建的对象怎么可能传给苹果,万一是香蕉呢?你能说香蕉是苹果吗?是吧?
      //: 苹果创建的对象可以传给水果,然后苹果说:“我是水果!”然后水果(那个苹果)出去玩了一圈回来,说:“我要变,我变成苹果!”这是可以的,是吧?
       这不OU了吗?ok不?ok了哈!呵呵{:soso_e128:} 学老毕的

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
在实际编程中往往使用多态,使同一个方法有不同的表现形式。但是,有时要使用到子类特有的方法,这事时就需要向下转型。例如:Set接口继承了Collection接口,当我们:
Set s=new TreeSet()时,可以用s.add(Object o)方法向s里面添加元素。但是,当我们想取得s中的最末一个元素时,就要用到 TreeSet中定义的特有的方法s.last(),此时就需要转型。
回复 使用道具 举报
刚刚学了继承:

子类可以作为父类使用;因为父类有的属性,子类都有.所以没有问题;

父类不能作为子类使用,因为子类有的属性父类可能没有,报错!

所以,强制转换类型也只能是: 子类作为父类使用的情况,当子类作为父类使用时,把一个子类当做父类来用的时候,不能调用子类特有方法。这时候要调用子类中特有的方法,又不想new ,则可以使用强制转换回子类;

当然,父类不能作为子类使用,所以不能把父类强制转换为子类;为了避免这种情况发生,最好使用:instanceof判断一下类型是否匹配。

哈哈,谢谢你的问题,及时复习了一遍……
回复 使用道具 举报
赵燕燕 黑马帝 2011-12-9 18:02:50
7#
class Person
{
        public void eat() { }
}
clss Student extends Person
{
        public void study(){ }
}

        Person p=new Student();
        p.study();//编译失败。因为 多态中,非静态方法 编译时看左边,运行看右边。而左边Person类中是没有study(子类特有方法)方法的,所以会找不到方法而失败。要想使用子类特有方法,就需进行向下转型。
        Student s=(Student)p;
        s.study();
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马