黑马程序员技术交流社区

标题: 关于多态和继承的一个疑问。 [打印本页]

作者: 李挺    时间: 2013-1-31 20:45
标题: 关于多态和继承的一个疑问。
本帖最后由 李挺 于 2013-2-1 09:38 编辑
  1. class Student
  2. {
  3.         public void study()
  4.         {
  5.                 System.out.println("study");
  6.         }
  7.         public void sleep()
  8.         {
  9.                 System.out.println("tangzheshui");
  10.         }
  11. }

  12. class AdvStudent extends Student
  13. {
  14.         public void study()
  15.         {
  16.                 System.out.println("adv study");
  17.         }
  18.         public void sleep()
  19.         {
  20.                 System.out.println("zhanzheshui");
  21.         }
  22. }
  23. class DoStudent
  24. {
  25.         public static void dosome(Student stu)
  26.         {
  27.                 stu.study();
  28.                 stu.sleep();
  29.         }
  30. }

  31. class  Demo2
  32. {
  33.         public static void main(String[] args)
  34.         {
  35.                 DoStudent.dosome(new AdvStudent());
  36.         }
  37. }
复制代码
我定义对象new AdvStudent() 应该是父类型Student,
为什么打印的是子类型的
adv study
zhanzheshui
而不是父类型的
study
tangzheshui
作者: Gaara    时间: 2013-1-31 21:46
我也是新手,也刚看到这的内容 。。。。 你这问题我没太看懂
但我觉得  你的子类AdvStudent 的方法已经覆盖了父类Student 的方法 而且你建立的也是子类的对象啊  当然打印的是:
adv study
zhanzheshui

如果你想打印:
study
tangzheshui
只要把对象改了就行了啊

DoStudent.dosome(new AdvStudent());//改成:DoStudent.dosome(new Student());

不知道我说的对不对。。。。。
作者: 林其荣    时间: 2013-1-31 22:12
你创建的是子类的对象

因此子类覆盖了父类的方法...所以创建对象调用的时候会直接使用子类的方法
作者: 李阳    时间: 2013-1-31 23:05
DoStudent.dosome(new AdvStudent());你调用了DoStudent类的dosome方法,该方法接受的参数是Student类变量,而这个变量指向的又是Student子类的对象。dosome方法调用的实际上是子类的内容。所以打印的内容是子类的而不是父类。


作者: 铿锵科技    时间: 2013-2-1 00:33
   你的子类覆写了父类的2个方法
     public void study()
        {
                System.out.println("adv study");
        }
        public void sleep()
        {
                System.out.println("zhanzheshui");
        }
当然调用子类的方法了

作者: 王小丑    时间: 2013-2-1 20:39
之类覆盖了父类的方法,就是这么简单
作者: 刘凯    时间: 2013-2-1 20:58
2 3 4 5 楼说的有理
作者: 王昕    时间: 2013-2-1 21:46
本帖最后由 王昕 于 2013-2-1 21:51 编辑

父类类型的引用变量可以指向它的子类类型的对象,这就是多态。你创建的是一个AdvStudent类型的对象,如果让Student类型的引用指向它的话,对象的类型也并没有变。你调用方法的时候,调用的就是AdvStudent这个对象的方法。

但是前提是你的父类Student必须有这个方法,不然的话引用变量调用方法的时候,编译器关心的是这个引用的类型的类里面有没有定义这样的方法,没有的话即使对象AdvStudent的类增加了这个方法,你通过父类类型的引用也是没法调用的。比如你试试删除父类的study(),让你的父类中没有study()这个方法,只有sleep(),study()是子类中新增的方法,就没法调用,虽然对象AdvStudent是会study的。

你可以试试在子类AdvStudent中增加一个父类Student没有的方法,比如eat(),建立一个子类AdvStudent的对象,然后赋值给父类类型的引用,再用父类类型的引用调用这个方法,就会发现没法调用。




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