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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 箫庐 黑马帝   /  2011-12-9 16:19  /  3773 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 箫庐 于 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();  //报错,晕了;

        }
}

8 个回复

倒序浏览
子类调用爷爷类...
比如子类 父类 爷爷类中都有eat()函数
子类中写 super.eat();
父类中写 super.eat();
就可以实现了
你可以写代码试试
回复 使用道具 举报
本帖最后由 hello西卡够 于 2011-12-9 16:59 编辑

楼主贴的代码有问题,work(new Person());不行,
然后我觉得楼主说的情况应该具体情况具体分析的好,一般都不会干这样的事儿吧,类之间相互关系调用太复杂了应该不受推崇把,如果有,到时直接new一个爷爷;或者在爸爸的方法中super()一下爷爷,到时再super()爸爸就ok了,,,呵呵,个人观点,可以试一试
回复 使用道具 举报
你的void code(){
                 System.out.println("程序员编程");        
                super.sleep();                        
方法在父类中都没有,怎么覆盖````{:soso_e143:}
回复 使用道具 举报
  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 16:49
子类调用爷爷类...
比如子类 父类 爷爷类中都有eat()函数
子类中写 super.eat();

写了.如上.不行啊~~
回复 使用道具 举报
箫庐 黑马帝 2011-12-9 17:12:46
7#
hello西卡够 发表于 2011-12-9 16:55
楼主贴的代码有问题,work(new Person());不行,
然后我觉得楼主说的情况应该具体情况具体分析的好,一般都 ...

嗯.你真细心哈.是老师调试用的.我注释了……
回复 使用道具 举报
箫庐 黑马帝 2011-12-9 17:15:34
8#
孤独的人 发表于 2011-12-9 17:02
你的void code(){
                 System.out.println("程序员编程");        
                super.sl ...

嘿嘿,就是老师讲的啊……怎么没有覆盖呢?
回复 使用道具 举报
赵燕燕 黑马帝 2011-12-9 18:03:47
9#
static void work(Coder c)//Coder c=new Person();这是把父类对象赋给了子类变量,相当于Cat cat=new Animal();这个动物就一定是猫吗?很显然错误。
        {
                c.code();
        }
        想要传入new Person();只能这样写
        static void work(Person p)
        {
                p.sleep();//这里只能调用要传入的对象的公有方法,即继承关系中的最高父类
        }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马