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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


  1. package test;
  2. public class Test1
  3. {
  4.         public static void main(String [] args)
  5.         {
  6.                 Dog dog=new Dog("黑子");
  7.                 dog.shout();
  8.                 dog.sleep();
  9.                 System.out.println(dog.sleepTime);
  10.                
  11.                 Cat cat=new Cat("花花");
  12.                 cat.shout();
  13.                 cat.sleep();//为什么这里显示的是【小猫-花花一般是白天-->睡觉】 怎么做可以显示【小猫-花花晚上-->睡觉】
  14.                             //子类Cat从Animal中继承了sleep方法,但是子类对象调用sleep方法的时候,为什么不能显示已被子类覆盖之后的值呢?
  15.                 System.out.println(cat.sleepTime);//这里显示“白天”,说明子类中的sleepTime的值覆盖了父类中的sleepTime
  16.                                
  17.                
  18.         }
  19. }


  20. /**
  21. *
  22. * Named接口说明实现该接口的类是可命名的,必须实现其中的方法public String getName(),通过该方法返回实现该接口的类的名字。
  23. *
  24. */
  25. interface Named
  26. {
  27.         public String getName();
  28. }


  29. abstract class Animal implements Named
  30. {               
  31.         public   String sleepTime="一般是白天";//定义静态变量 即动物的睡觉时间,在子类中可以被覆盖。
  32.         abstract void shout();
  33.         public  void sleep()
  34.         {
  35.                 System.out.println(getName()+sleepTime+"-->睡觉");
  36.         }
  37.         public String getName()
  38.         {
  39.                 return "动物";
  40.         }
  41. }

  42. class Dog extends Animal
  43. {
  44.         private String name;
  45.         public  String sleepTime="白天";
  46.        
  47.         Dog(String name)
  48.         {
  49.                 this.name=name;
  50.         }
  51.        
  52.         public void shout()
  53.         {
  54.                 System.out.println(getName()+":汪汪~~~");
  55.         }       
  56.        
  57.         public String getName()
  58.         {
  59.                 return ("小狗-"+name);
  60.         }
  61.        
  62. }


  63. class Cat extends Animal
  64. {
  65.         private String name;
  66.         public  String sleepTime="晚上";
  67.         Cat(String name)
  68.         {
  69.                 this.name=name;
  70.         }
  71.        
  72.         public void shout()
  73.         {
  74.                 System.out.println(getName()+":喵喵~~~");
  75.         }
  76.        
  77.         public String getName()
  78.         {
  79.                 return ("小猫-"+name);
  80.         }
  81.        
  82. }

复制代码

点评

如果问题未解决,请继续追问回复者,如果问题已经解决,请将分类改为“已解决”,谢谢  发表于 2013-3-21 19:29

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

9 个回复

倒序浏览
cat.sleep();//为什么这里显示的是【小猫-花花一般是白天-->睡觉】 怎么做可以显示【小猫-花花晚上-->睡觉】

15.                            //子类Cat从Animal中继承了sleep方法,但是子类对象调用sleep方法的时候,为什么不能显示已被子类覆盖之后的值呢?

16.                System.out.println(cat.sleepTime);//这里显示“白天”,说明子类中的sleepTime的值覆盖了父类中的sleepTime
1.你说怎样可以让他晚上睡觉,你可以在方法中定义一个参数
  1. public  void sleep(String sleepTime)

  2. 39.        {

  3. 40.                System.out.println(getName()+sleepTime+"-->睡觉");

  4. 41.        }
复制代码
然后再猫调用这个方法是,把sleepTime传进去就好了

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
1、子类Cat中的sleepTime的值没有覆盖了父类中的sleepTime,因为变量不存在覆盖。
2、子类Cat中没有定义sleep方法覆盖父类中的sleep方法,只是继承了父类的sleep方法,所以还是白天睡觉,如果要显示晚上睡觉,就要在子类Cat中定义sleep方法覆盖父类中的sleep方法。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
子类的属性可以复写父类中的属性,但是你调用的是父类的sleep()方法,父类中的会直接使用本类中的sleepTime,而不会去用子类的,因为你有两个子类继承了父类,你写一个调用sleeptime他怎么知道去调用哪个子类的,这不符合逻辑,所以java就只能让父类调用父类自己方法。如果想要使用子类中复写的属性,那么要在子类中复写掉父类的sleep()方法,在子类中调用子类的属性就可以了。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
父类中已经定义过sleepTime这个属性,所以不必在子类中重新定义,直接赋值就可以了。
  1. class Cat extends Animal
  2. {
  3.         private String name;
  4.        // public  String sleepTime="晚上";
  5.         Cat(String name)
  6.         {
  7.                 this.name=name;
  8.                 this.sleepTime="晚上";     //在构造函数中直接赋值就可以,因为子类已经继承了父类的属性。
  9.         }
  10.         
  11.         public void shout()
  12.         {
  13.                 System.out.println(getName()+":喵喵~~~");
  14.         }
  15.         
  16.         public String getName()
  17.         {
  18.                 return ("小猫-"+name);
  19.         }
  20.         
  21. }
复制代码
回复 使用道具 举报
这时您想要的程序结果把?
/*
* 小狗-黑子:汪汪~~~
* 小狗-黑子白天-->睡觉
* 白天
* 小猫-花花:喵喵~~~
* 小猫-花花晚上-->睡觉
* 晚上
*/

/*我所提供的修改方法如下*/

//把animal父类的方法抽象
        abstract public void sleep();
//分别在猫狗类中实现这个方法,这样才可以调用子类的sleepTime属性,
        @Override
        public void sleep() {
                        System.out.println(getName() + sleepTime + "-->睡觉");
        }

        @Override
        public void sleep() {
                        System.out.println(getName() + sleepTime + "-->睡觉");
        }

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
我手心里的宝 发表于 2013-3-21 09:54
cat.sleep();//为什么这里显示的是【小猫-花花一般是白天-->睡觉】 怎么做可以显示【小猫-花花晚上-->睡觉 ...

我感觉你的实现方法不是我想要的,总不能我每次调用cat.sleep()的时候都要手动往里面传参数吧,那要是我往里面传入其他字符的话,岂不是也会显示出来,显然不是我要的结果,不过还是谢谢!
回复 使用道具 举报
blackcaismine 发表于 2013-3-21 10:14
子类的属性可以复写父类中的属性,但是你调用的是父类的sleep()方法,父类中的会直接使用本类中的sleepTime ...

首先,我是在子类中调用的父类的方法,为什么就不能访问子类中的变量呢?
另外你说的实现方法我也知道,但是我想的是如果不复写父类的方法的前提下,怎么可以实现想要的结果。
回复 使用道具 举报
blackcaismine 发表于 2013-3-21 10:14
子类的属性可以复写父类中的属性,但是你调用的是父类的sleep()方法,父类中的会直接使用本类中的sleepTime ...

首先,我是在子类中调用的父类的方法,为什么就不能访问子类中的变量呢?
另外你说的实现方法我也知道,但是我想的是如果不复写父类的方法的前提下,怎么可以实现想要的结果。
回复 使用道具 举报
张亚青 发表于 2013-3-21 10:53
首先,我是在子类中调用的父类的方法,为什么就不能访问子类中的变量呢?
另外你说的实现方法我也知道, ...

只能在子类中复写父类方法才能达到你的要求,你说子类调用父类方法引用自己属性,java并不支持这样。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马