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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lovetonia 中级黑马   /  2015-11-26 01:48  /  634 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 lovetonia 于 2015-11-26 02:23 编辑

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

接着说

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




9 个回复

倒序浏览
name是父类的私有的啊 你调自己方法是没有的 所以报错
第二个问题同第一个  没有name这个属性
回复 使用道具 举报
第一个问题,name是父类中私有的成员,子类不可以用的;
第二个问题,? super Student是指Student以及其父类,其中包括Object,而Object中是没有getName()方法的。
回复 使用道具 举报
第一个,子类不能使用父类的私有成员
第二个,需要强行转型吧
回复 使用道具 举报
hbcoding 发表于 2015-11-26 22:21
第一个问题,name是父类中私有的成员,子类不可以用的;
第二个问题,? super Student是指Student以及其父 ...

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

子类构造函数里的name只是形参,它只是和父类中的成员变量name名称一样而已,两者并不是一回事。你完全可以把子类构造函数中的参数换成其他的,这样可以避免混淆。
回复 使用道具 举报
楼上正解,形参name的作用域只在Student构造函数内,超出了Student()。对于getName()根本不知道有这个个东东,除非你在getName中也定义个Name。
回复 使用道具 举报
wqd123 中级黑马 2015-11-27 21:58:36
8#
我只懂敲代码,这些理论的东西我头大
回复 使用道具 举报
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这个对象的意义何在。抱歉有点牛角尖,不过真的疑惑,私有变量都不继承,那子类继承的方法里带父类定义的私有变量就没事呢?
回复 使用道具 举报
lovetonia 发表于 2015-11-28 06:50
那我来个new Student("somename"),如果说子类不继承父类的私有变量,如果说这Student对象没有name在这个 ...

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