黑马程序员技术交流社区

标题: 继承问题 [打印本页]

作者: 黑马张扬    时间: 2012-6-6 16:46
标题: 继承问题
  1. class  Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 MiniDog mini = new MiniDog();
  6.         mini.call();
  7.         }
  8. }

  9. class Dog
  10. {
  11.         private String getName(){
  12.         return "Dog";
  13.     }
  14.    
  15.     public String cry(){
  16.         return "wang-wang";
  17.     }
  18.    
  19.     public void call(){
  20.         System.out.println("I'm " + getName() + " " + cry());
  21.     }
  22. }

  23. class MiniDog extends Dog
  24. {
  25.     private String getName()
  26.         {
  27.         return "Mini";
  28.     }
  29.    
  30.     public String cry()
  31.         {
  32.         return "WOO";
  33.     }
  34. }
复制代码
结果:I'm Dog WOO 杂不是:I'm Mini WOO

作者: 王渠    时间: 2012-6-6 16:50
本帖最后由 王渠 于 2012-6-6 16:52 编辑
  1. class  Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 MiniDog mini = new MiniDog();
  6.         mini.call();
  7.         }
  8. }

  9. class Dog
  10. {
  11.         private String getName(){
  12.         return "Dog";
  13.     }
  14.    
  15.     public String cry(){
  16.         return "wang-wang";
  17.     }
  18.    
  19.     public void call(){    //这个方法在父类中才有,所以调用的时候用的是父类,此时this指向的是父类,所以getName和cry用的也是父类的
  20.         System.out.println("I'm " + getName() + " " + cry());
  21.     }
  22. }

  23. class MiniDog extends Dog
  24. {
  25.     private String getName()
  26.         {
  27.         return "Mini";
  28.     }
  29.    
  30.     public String cry()
  31.         {
  32.         return "WOO";
  33.     }
  34. }
复制代码

作者: 黑马张扬    时间: 2012-6-6 16:57
王渠 发表于 2012-6-6 16:50

我没有用多态呀 应该继承下来了 我调用的应该是我子类自己的call方法呀 只是这个方法在子类中是隐藏的
作者: 王渠    时间: 2012-6-6 16:59
黑马张扬 发表于 2012-6-6 16:57
我没有用多态呀 应该继承下来了 我调用的应该是我子类自己的call方法呀 只是这个方法在子类中是隐藏的 ...

不是多态的问题,是继承的问题,因为你建立的mini对象中没有call()这个方法,但是父类中有,所以去父类找了,找到后this指向就改变了
作者: 黑马张扬    时间: 2012-6-6 17:04
王渠 发表于 2012-6-6 16:59
不是多态的问题,是继承的问题,因为你建立的mini对象中没有call()这个方法,但是父类中有,所以去父类找 ...

我继承了 我的子类里就有call方法  不用去父类找  用的就是我子类的call方法 只是这个call方法是隐藏的
作者: 唐辉辉    时间: 2012-6-6 17:04
王渠 发表于 2012-6-6 16:59
不是多态的问题,是继承的问题,因为你建立的mini对象中没有call()这个方法,但是父类中有,所以去父类找 ...


请问 :  你说this指向变成父类的了,为什么cry()还是执行的子类的?
作者: 伊文龙    时间: 2012-6-6 17:33
  1. package cn.ywl.staticdemo;

  2. public class  ExtendsDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 MiniDog mini = new MiniDog();
  7.         mini.call();
  8.         }
  9. }

  10. class Dog
  11. {
  12.         private String getName(){
  13.         return "Dog";
  14.     }
  15.    
  16.     public String cry(){
  17.         return "wang-wang";
  18.     }
  19.    
  20.     public void call(){
  21.         System.out.println("I'm " + getName() + " " + cry());
  22.     }
  23. }

  24. class MiniDog extends Dog
  25. {
  26.     private String getName()
  27.     {
  28.         return "Mini";
  29.     }
  30.    
  31.     public String cry()
  32.         {
  33.         return "WOO";
  34.     }
  35.    
  36.     [color=Red]public void call(){
  37.         System.out.println("I'm " + getName() + " " + cry());
  38.     }[/color]}
复制代码
结果:I'm Mini WOO

被private、final关键字修饰的方法不会被重写,你的getName()方法是被重新定义了
如果调用的方法“在子类中没被重写” 那么调用的一定是父类中的方法。
call()方法没有被子类重写,所以会调用父类的getName();

如果调用的方法“在子类中被重写” 那么调用一定是子类中的方法。
所以会调用子类的cry()方法。


回答完毕,over。
作者: 伊文龙    时间: 2012-6-6 17:36

第一行红字下面那一句应该改成这样说才合理
call()、getName()方法都没有被子类重写,所以会调用父类的call()、getName();


作者: 王超    时间: 2012-6-6 17:47
当把Dog类的getName()方法的权限修饰符改成public的时候,打印的就是I'm mini Woo
这样等于子类已经覆盖了父类的方法
private 的权限在本类中,调用getName()方法时只能调用Dog本身类的方法
作者: 吴小铁你好    时间: 2012-6-6 18:02
  1. package zhangxiao;

  2. class  Demo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 MiniDog mini = new MiniDog();
  7.         mini.call();
  8.         }
  9. }

  10. class Dog
  11. {
  12.         public String getName(){
  13.         return "Dog";
  14.     }
  15.    
  16.     public String cry(){
  17.         return "wang-wang";
  18.     }
  19.    
  20.     public void call(){
  21.         System.out.println("I'm " + getName() + " " + cry());
  22.     }
  23. }

  24. class MiniDog extends Dog
  25. {
  26.     public  String getName()
  27.         {
  28.         return "Mini";
  29.     }
  30.    
  31.     public String cry()
  32.         {
  33.         return "WOO";
  34.     }
  35. }



复制代码
结果为:I'm Mini WOO
这是应为,你定义的父类getName方法时是private的,私有方法可以被继承但子类无法访问父类的私有方法和属性。




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