黑马程序员技术交流社区

标题: 子类如果调用爷爷类中的覆盖方法: [打印本页]

作者: 箫庐    时间: 2011-12-9 16:19
标题: 子类如果调用爷爷类中的覆盖方法:
本帖最后由 箫庐 于 2011-12-9 17:11 编辑

调用本类中的对象,可以用this.    调用父类的覆盖函数,用super.   但是
如果爷爷类,父类,子类中都存在覆盖函数,用super.super.  无法调用爷爷类中的覆盖函数  又另外在父类中的覆盖方法前加super.  也不能实现.

请问是什么原因如何实现调用爷爷类中的方法?

例:

class  Text
{
        public static void main(String[] args)

        {

                System.out.println("Hello Java基础班20111130!!!");

                work(new Teacher());
                work(new Coder());
               // work(new Person());   //报错,在Person中找不到code()方法;
   
        }
        static void work(Coder c){
                c.code();
        }
}

class Person {
               
        void sleep(){
                System.out.println("睡觉");
        }
}

class Coder extends Person {      
      
                              
        public void sleep(){                                       
                System.out.println("就睡2个小时");
        }
      
        void code(){
                System.out.println("程序员编程");      
                super.sleep();                        // 调用父类被覆盖的方法  
        }
}

class Teacher extends Coder {
        public void sleep(){
                System.out.println("睡16个小时");      
        }      
      
        void code(){
                System.out.println("老师编程");
                super.sleep();    //调用的是其父类Coder中的方法;不是爷爷类;怎么调用爷爷类呢?
                super.super.sleep();  //报错,晕了;

        }
}
作者: 杨强    时间: 2011-12-9 16:49
子类调用爷爷类...
比如子类 父类 爷爷类中都有eat()函数
子类中写 super.eat();
父类中写 super.eat();
就可以实现了
你可以写代码试试
作者: 小春同学    时间: 2011-12-9 16:55
本帖最后由 hello西卡够 于 2011-12-9 16:59 编辑

楼主贴的代码有问题,work(new Person());不行,
然后我觉得楼主说的情况应该具体情况具体分析的好,一般都不会干这样的事儿吧,类之间相互关系调用太复杂了应该不受推崇把,如果有,到时直接new一个爷爷;或者在爸爸的方法中super()一下爷爷,到时再super()爸爸就ok了,,,呵呵,个人观点,可以试一试
作者: 刘博    时间: 2011-12-9 17:02
你的void code(){
                 System.out.println("程序员编程");        
                super.sleep();                        
方法在父类中都没有,怎么覆盖````{:soso_e143:}
作者: 唐秀启    时间: 2011-12-9 17:11
  1. class OverrideDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.        Teacher t = new Teacher();
  6.            t.code();
  7.     }        
  8. }

  9. class Person
  10. {
  11.         void sleep()
  12.         {
  13.         System.out.println("睡觉");
  14.     }
  15. }

  16. class Coder extends Person
  17. {
  18.         public void sleep()
  19.         {                                       
  20.         System.out.println("就睡2个小时");
  21.     }
  22.     void code()
  23.         {
  24.         System.out.println("程序员编程");        
  25.         super.sleep();                 
  26.      }
  27. }

  28. class Teacher extends Coder
  29. {
  30.         public void sleep()
  31.         {
  32.          System.out.println("睡16个小时");        
  33.     }        
  34.         
  35.     void code()
  36.         {
  37.          System.out.println("老师编程");
  38.           super.sleep();
  39.      }
  40. }
复制代码
因为当你class Coder已经将class Person 覆盖掉 当你在class Teacher中调用超类的sleep方法  只能输出的是父类的sleep方法的内容,因为class Person被覆盖,Teacher无法直接调用 Person类中的 sleep
作者: 箫庐    时间: 2011-12-9 17:11
杨强 发表于 2011-12-9 16:49
子类调用爷爷类...
比如子类 父类 爷爷类中都有eat()函数
子类中写 super.eat();

写了.如上.不行啊~~
作者: 箫庐    时间: 2011-12-9 17:12
hello西卡够 发表于 2011-12-9 16:55
楼主贴的代码有问题,work(new Person());不行,
然后我觉得楼主说的情况应该具体情况具体分析的好,一般都 ...

嗯.你真细心哈.是老师调试用的.我注释了……
作者: 箫庐    时间: 2011-12-9 17:15
孤独的人 发表于 2011-12-9 17:02
你的void code(){
                 System.out.println("程序员编程");        
                super.sl ...

嘿嘿,就是老师讲的啊……怎么没有覆盖呢?
作者: 赵燕燕    时间: 2011-12-9 18:03
static void work(Coder c)//Coder c=new Person();这是把父类对象赋给了子类变量,相当于Cat cat=new Animal();这个动物就一定是猫吗?很显然错误。
        {
                c.code();
        }
        想要传入new Person();只能这样写
        static void work(Person p)
        {
                p.sleep();//这里只能调用要传入的对象的公有方法,即继承关系中的最高父类
        }




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