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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李挺 中级黑马   /  2013-1-31 20:45  /  1736 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李挺 于 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

评分

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

查看全部评分

7 个回复

倒序浏览
我也是新手,也刚看到这的内容 。。。。 你这问题我没太看懂
但我觉得  你的子类AdvStudent 的方法已经覆盖了父类Student 的方法 而且你建立的也是子类的对象啊  当然打印的是:
adv study
zhanzheshui

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

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

不知道我说的对不对。。。。。

评分

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

查看全部评分

回复 使用道具 举报
你创建的是子类的对象

因此子类覆盖了父类的方法...所以创建对象调用的时候会直接使用子类的方法
回复 使用道具 举报
DoStudent.dosome(new AdvStudent());你调用了DoStudent类的dosome方法,该方法接受的参数是Student类变量,而这个变量指向的又是Student子类的对象。dosome方法调用的实际上是子类的内容。所以打印的内容是子类的而不是父类。

回复 使用道具 举报
   你的子类覆写了父类的2个方法
     public void study()
        {
                System.out.println("adv study");
        }
        public void sleep()
        {
                System.out.println("zhanzheshui");
        }
当然调用子类的方法了
回复 使用道具 举报
之类覆盖了父类的方法,就是这么简单
回复 使用道具 举报
2 3 4 5 楼说的有理
回复 使用道具 举报
本帖最后由 王昕 于 2013-2-1 21:51 编辑

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

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

你可以试试在子类AdvStudent中增加一个父类Student没有的方法,比如eat(),建立一个子类AdvStudent的对象,然后赋值给父类类型的引用,再用父类类型的引用调用这个方法,就会发现没法调用。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马