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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 肖晓峰 中级黑马   /  2012-11-17 02:29  /  1233 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 肖晓峰 于 2012-11-17 13:49 编辑

class Furit{

}

class Apple extends Furit{

        void makeApple(){

        }

}

class Delicious extends Apple{

}


定义一个类型变量 :

Furit furit = new Delicious();

问 furit 可以调用makeApple方法吗?

我的答案是 不可以 因为父类虽然引用的是子类实例,但是父类本类中没有该方法 直接调用编译器会出现编译错误。
需要进行显示向下转换成Apple类型或者Delicious类型才能调用


但是书上的答案是 可以 但是没有解释。

我很困惑

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
你的答案是正确的,如果furit 调用makeApple方法的话,必须向下转型。
如                 Furit furit = new Delicious();
                ((Apple) furit).makeApple();
这样就可以调用了,多态中,子类调用方法的话,编译器会去看父类有没有相应的方法。而Furit没有该方法,会编译失败。
书上说可以,可能说的比较含糊吧,它的意思可能是(向下转型后)可以调用,只不过没那么做吧。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
class Fruit{}

class Apple extends Fruit
{
     void makeApple()
    {
       System.out.println("in apple");
    }
}

class Delicious extends Apple
{

}

public class Test1{
     public static void main(String args[]){
          Fruit fruit = new Delicious();
          fruit.makeApple();
    }
}

运行会出项错误:The method makeApple() is undefined for the type Fruit

class Delicious extends Apple
{

}

public class Test1{
     public static void main(String args[]){
          Fruit fruit = new Delicious();
          ((Apple)fruit).makeApple();   
    }
}

如果改成((Apple)fruit).makeApple(); 则可以顺利运行,打印出in apple

所以书上的说法可能有误,这本书叫什么名字?

评分

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

查看全部评分

回复 使用道具 举报
《JAVA语言程序设计基础篇第八版》  机械工业出版的那种
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马