黑马程序员技术交流社区

标题: 书上一道类型转换疑问 [打印本页]

作者: 肖晓峰    时间: 2012-11-17 02:29
标题: 书上一道类型转换疑问
本帖最后由 肖晓峰 于 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类型才能调用


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

我很困惑

作者: 张学永    时间: 2012-11-17 07:29
你的答案是正确的,如果furit 调用makeApple方法的话,必须向下转型。
如                 Furit furit = new Delicious();
                ((Apple) furit).makeApple();
这样就可以调用了,多态中,子类调用方法的话,编译器会去看父类有没有相应的方法。而Furit没有该方法,会编译失败。
书上说可以,可能说的比较含糊吧,它的意思可能是(向下转型后)可以调用,只不过没那么做吧。
作者: 陈龙    时间: 2012-11-17 08:22
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

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

作者: 肖晓峰    时间: 2012-11-17 13:32
《JAVA语言程序设计基础篇第八版》  机械工业出版的那种




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