黑马程序员技术交流社区

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

作者: Ake丶    时间: 2016-6-25 00:18
标题: 关于继承问题
本帖最后由 Ake丶 于 2016-6-25 13:29 编辑

class Test {
     public static void main(String[] args) {
         dog d = new dog("旺财");
         System.out.println(d.getName());
          //dog类继承了父类的getName()方法,但是他没有name成员变量,getName()方法里的this.name,这个this不应该是“旺财”这个对象吗?这个对象存在堆中并没有name成员变量啊?
     }
}
class animal {
     private String name;
     public animal() {
     }
     public animal(String name) {
          this.name=name;
     }
     public void setName(String name) {
           this.name=name;
     }
     public String getName() {
           return this.name;
     }
}
class dog extends animal {
     public dog() {
     }
     public dog(String name) {
           super(name);
     }
}

作者: LoveGG    时间: 2016-6-25 00:18
/dog类继承了父类的getName()方法,但是他没有name成员变量,getName()方法里的this.name,这个this不应该是“旺财”这个对象吗?这个对象存在堆中并没有name成员变量啊?
分析回答:
  1.dog继承了父类,可以拥有父类的全部成员变量和方法,private修饰符表示只能在该类中被该类访问,并不是不能被继承,(只有final修饰的类不可被继承),所以dog有name的成员变量的;加上private修饰表示不能d.name这样去用,但是可以d.getName()得到名字,
2.this是代表d这个对象,这个对象的是Dog的实例,这个对象的名字属性是“旺财”,而不是说这个对象是旺财,
3.在堆内存中有这个成员变量,这个成员变量是一个引用变量,因为是name是字符串,不懂看内存图D:\内存图

内存图.png (119.53 KB, 下载次数: 29)

内存图.png

作者: Ake丶    时间: 2016-6-25 13:25
本帖最后由 Ake丶 于 2016-6-25 23:21 编辑

通过this.getClass()知道了 调用getName()方法的是dog对象,对于对象没有name属性的问题:我觉得可能this.name是因为在父类的类中,所以能获取的到父类的成员变量吧。
作者: 天之骄子no1    时间: 2016-6-25 23:13
写的挺好的了
作者: 冒泡儿    时间: 2016-6-26 00:41
this是谁调用就代表谁,name是父类的成员变量,getName调用的是父类Animal的getName()方法。继承是先在本类中找是否有成员变量或者成员方法,如果本类没有,就会调用父类的成员变量或成员方法。。。不知道这么说对不对
作者: LoveGG    时间: 2016-6-26 00:53
LoveGG 发表于 2016-6-26 00:51
/dog类继承了父类的getName()方法,但是他没有name成员变量,getName()方法里的this.name,这个this不应该 ...

第一次回答问题,给个面子,不要吝啬,我真的需要!
作者: Ake丶    时间: 2016-6-26 11:36
本帖最后由 Ake丶 于 2016-6-26 11:57 编辑
LoveGG 发表于 2016-6-26 00:53
第一次回答问题,给个面子,不要吝啬,我真的需要!

嗯,非常感谢这么用心地回答。

作者: nblity007    时间: 2016-6-29 17:17
涨姿势ing
作者: demon凯    时间: 2016-6-30 23:44
学习了一波




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