黑马程序员技术交流社区
标题:
多态问题
[打印本页]
作者:
高志鹏
时间:
2012-12-3 21:15
标题:
多态问题
本帖最后由 高志鹏 于 2012-12-4 12:27 编辑
abstract class Animal{
abstract void eat();
}
class Cat extends Animal{
void eat(){
s.o.p("fish")
}
void catchMouse(){
s.o.p("do catch")
}
}<div class="blockcode"><blockquote>
复制代码
class Demo{
public static void main(String[] args){
Animal a = new cat();
//当需要调用到猫中的特有功能捉老鼠时,需要向下转型,
Cat c = (Cat)a;
c.catchMouse
Student s = new BaseStudent();
//此处运行结果是“坐着睡”,在调用到basestudent的特有功能sleep的时候,为什么没有进行转型,反而能够得到的却是子类的特有功能呢?
s.sleep;
}
}
abstract class Student{
public abstract void study();
public void sleep(){
s.o.p("躺着睡");
}
}
class BaseStudent extends Student{
public void study(){
s.o.p("base study");
}
public void sleep(){
s.o.p("坐着睡");
}
}
复制代码
不明的地方在代码中红字的标示。
作者:
张其辉
时间:
2012-12-3 21:38
因为sleep()这个成员函数不是静态方法,
所以:在编译时,参考引用类型变量所属类中是否具有调用的函数,有,运行,没有,编译失败。
在运行时,参考的是对象所属类中是否具有调用的函数,往父类里找,运行父类的。
你的代码中,因为子类和父类中都有sleep()方法,所以编译通过,最后运行的就是实例对象中的sleep()方法,结果:“坐着睡”
作者:
怪盗急得
时间:
2012-12-3 21:49
本帖最后由 陈德基 于 2012-12-3 21:51 编辑
你自己已经定义好了的,猫抓老鼠是猫的特殊方法,动物没有,当然要强转才能调用猫的方法,不然动物里没有抓老鼠的方法。基础班学生和学生这两个类中都定义了睡觉方法,基础班的学生继承并覆写了学生类的睡觉方法,自然直接调用基础班的学生睡觉方法不用强转。
你要看的就是,左边的类中有没有描述你要调用的内容,如果没有而子类有的话,就需要强转。如果父类和子类都有你想要调用的内容,那么最终调用的会是子类的内容,父类的内容被覆写。多态主要看的还是你使用的引用变量的类型是什么类型。引用变量的类型要看变量左边的类来决定的。
作者:
黑马刘向阳
时间:
2012-12-3 22:01
Student s = new BaseStudent();
s.sleep();
这是java的一个机制,多态是对于成员函数而言的,
对于非静态函数,
编译时,检查左边的类有没有被调用的方法;
运行时,由于子类对父类方法进行了覆盖,所以会调用子类的方法,这就是动态绑定。
对于静态函数,都属于静态绑定,因为静态是类的。
成员变量都是静态绑定。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2