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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 大头喝果啤 中级黑马   /  2014-7-9 17:13  /  7030 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Parent{
  2.         private String name = "Mike";
  3.         Parent(){}
  4.         Parent(String name){
  5.                 this.name = name;
  6.         }
  7.         public String getName(){
  8.                 return this.name;
  9.         }
  10. }
  11. class Child extends Parent{
  12.         private String name;
  13.         Child(){}
  14.         Child(String name){
  15.                 this.name = name;
  16.         }
  17. }
  18. class Demo{
  19.         public static void main(String[] args){
  20.                 Child  ch = new Child("Lily");
  21.                 System.out.println(ch.getName());
  22.         }
  23. }
复制代码
上面这段代码输出是Mike,但是我创建的是子类对象,子类对象继承了父类的getName()方法,返回值应该我觉得应该是子类的name才对啊,为什么返回的是父类的name呢?

14 个回复

倒序浏览
子类的getname()方法有个super. 也就说是子类本身没有这个方法,它是在调用父类的方法.调用getname()的时候,这个方法是属于父类的,所以this.name中this代表的是父类.
回复 使用道具 举报
我是菜鸟。。。帮忙顶。。
回复 使用道具 举报
你的代码从设计上就有歧义,你的Child继承了Parent类,但你在Child子类中,又定义了一个私有属性name. 事实上这个时候,Child的实例对象里面将会出现两个同名的name属性。你可以在输出语句那一栏中断调试,会看到ch这个对象里面有两个name.
所以才会出现输出了Mike. 我调试了会,并没有看出电脑是如何选择输出哪个name变量的。
但是你这两个类从写法上就不符合逻辑。你子类重新写name想必是因为无法使用this.name吧。那么你父类既然把name定义为私有,就应该给他提供get和set函数访问。或者你想子类访问name变量,就把name设置为protected。子类就可以访问了
回复 使用道具 举报
本帖最后由 PowerLion 于 2014-7-9 18:12 编辑

应该这样写

  1. class Parent{
  2.     protected String _name = "Mike";
  3.     Parent(){}
  4.     Parent(String name){
  5.             this._name = name;
  6.     }
  7.     public String getName(){
  8.             return this._name;
  9.     }
  10.     public void setName(String name){
  11.             this._name = name;
  12.     }
  13. }
  14. class Child extends Parent{
  15.    
  16.     Child(){}
  17.     Child(String name){
  18.             this._name = name;
  19.     }
  20.    

  21. }
  22. class Test{
  23.     public static void main(String[] args){
  24.             Child  ch = new Child("Lily");
  25.             System.out.println(ch.getName());
  26.     }
  27. }
复制代码
回复 使用道具 举报
dispensable 来自手机 中级黑马 2014-7-9 19:48:07
地板
PowerLion 发表于 2014-7-9 18:08
你的代码从设计上就有歧义,你的Child继承了Parent类,但你在Child子类中,又定义了一个私有属性name. 事实 ...

他只是问为什么是这个结果……没问应该怎样………其实这个问题有人问过,也有人回答过楼下我发连接
回复 使用道具 举报
dispensable 来自手机 中级黑马 2014-7-9 19:49:12
7#
楼主请看这里:http://bbs.itheima.com/forum.php?mod=viewthread&tid=38773&extra=&page=1&mobile=yes   因为我是手机看的贴,你的浏览器估计会转到手机版界面,不要在意这种细节
回复 使用道具 举报
因为楼主这里虽然创建的是子类对象,但是因为程序中默认有super()所以会优先创建父类对象,而又由于父类中的同名变量name是私有的,故内存中会有父类子类两个name变量(实际上他们是用super.name和name标示的),而在楼主第8行代码中,this.name这个变量指向的是父类的name("Mike"),子类确实继承了父类的getName()方法,但是this.name这里继承下来的是一个变量,而不是一段代码算法逻辑,所以这里的this.name并不是动态指定的,故它表示的还是父类中的那个值为"Mike"的name变量。
回复 使用道具 举报 1 0
1. 继承不是把父类中的东西都在子类中复制了一份
2. 成员变量没有重写,
回复 使用道具 举报
你子类的lily的name 私有了,在父类中又怎么能访问到,所以只能访问mike的name了
回复 使用道具 举报
EarlyHeart 发表于 2014-7-9 20:40
因为楼主这里虽然创建的是子类对象,但是因为程序中默认有super()所以会优先创建父类对象,而又由于父类中 ...

明白了,多谢
回复 使用道具 举报
dispensable 发表于 2014-7-9 19:48
他只是问为什么是这个结果……没问应该怎样………其实这个问题有人问过,也有人回答过楼下我发连接 ...

一语中的,哈哈。我现在也明白了。
回复 使用道具 举报

为什么这样可以可以解释一下吗  拜托啦
回复 使用道具 举报
越看越看不懂
回复 使用道具 举报
222222222222222222222
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马