黑马程序员技术交流社区

标题: 脑子大了,这到底是为什么 [打印本页]

作者: lovetonia    时间: 2015-11-26 01:48
标题: 脑子大了,这到底是为什么
本帖最后由 lovetonia 于 2015-11-26 02:23 编辑

子类Student重写了Person的getName方法
但是编译时却无法调用?
这段代码是学习泛型时出错的,把重写的getName删掉就没事了 为什么

接着说

下面这个方法printLi本来泛型<>中写的Student,没有错误,但是改成? super Student之后
编译时就发生了错误





作者: 洋葱头头    时间: 2015-11-26 08:31
name是父类的私有的啊 你调自己方法是没有的 所以报错
第二个问题同第一个  没有name这个属性
作者: hbcoding    时间: 2015-11-26 22:21
第一个问题,name是父类中私有的成员,子类不可以用的;
第二个问题,? super Student是指Student以及其父类,其中包括Object,而Object中是没有getName()方法的。
作者: 1018chenhaiyang    时间: 2015-11-26 22:28
第一个,子类不能使用父类的私有成员
第二个,需要强行转型吧
作者: lovetonia    时间: 2015-11-27 02:20
hbcoding 发表于 2015-11-26 22:21
第一个问题,name是父类中私有的成员,子类不可以用的;
第二个问题,? super Student是指Student以及其父 ...

谢谢,第二个稍微有点明白了。第一个还是不太懂,子类的对象也有name的啊,子类的方法还不能调用自己的name吗??那构造函数里的语句有卵用
作者: hbcoding    时间: 2015-11-27 09:11
lovetonia 发表于 2015-11-27 02:20
谢谢,第二个稍微有点明白了。第一个还是不太懂,子类的对象也有name的啊,子类的方法还不能调用自己的na ...

子类构造函数里的name只是形参,它只是和父类中的成员变量name名称一样而已,两者并不是一回事。你完全可以把子类构造函数中的参数换成其他的,这样可以避免混淆。
作者: TG·小强    时间: 2015-11-27 13:42
楼上正解,形参name的作用域只在Student构造函数内,超出了Student()。对于getName()根本不知道有这个个东东,除非你在getName中也定义个Name。

作者: wqd123    时间: 2015-11-27 21:58
我只懂敲代码,这些理论的东西我头大
作者: lovetonia    时间: 2015-11-28 06:50
hbcoding 发表于 2015-11-27 09:11
子类构造函数里的name只是形参,它只是和父类中的成员变量name名称一样而已,两者并不是一回事。你完全可 ...

那我来个new Student("somename"),如果说子类不继承父类的私有变量,如果说这Student对象没有name在这个变量,我的"somename"被谁接收了?super(name)里不是this.name吗,这个this难道还是Person?
也就是说这个"somename"最后还是给了父类?我new的Student还是建立了Person对象?如果说内存里Student对象只是把“sommename”最终传向了父类,那我new这个对象的意义何在。抱歉有点牛角尖,不过真的疑惑,私有变量都不继承,那子类继承的方法里带父类定义的私有变量就没事呢?
作者: hbcoding    时间: 2015-11-28 10:59
lovetonia 发表于 2015-11-28 06:50
那我来个new Student("somename"),如果说子类不继承父类的私有变量,如果说这Student对象没有name在这个 ...

呃,问题好多,我该怎么回答呢?首先,Student确实没有name这个变量,super(name)里的name并不是成员变量,而是你构造器里的形式参数。因为子类的构造器调用了父类构造器,所以创建子类对象相当于给父类的成员变量name赋值,父类中提供了访问该变量的公共方法,子类继承了该方法。其他类在通过子类对象调用这个方法时,返回的还是父类name的值,因为最初创建子类对象的时候就是给父类的name赋值。
      感觉说的有点乱,有什么不懂的再问,大家一起研究




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