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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈行 高级黑马   /  2013-4-27 22:45  /  1938 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class ren//父类
  2. {
  3. public int a;

  4. }
  5. class zhongguoren:ren//继承父类
  6. {
  7. public int c;
  8. }
  9. zhongguoren zren = new zhongguoren();//实例化一个zhongguoren类对象
  10. ren haoren =zren;//把对象付给ren类的变量
复制代码
上面把zhongguoren类的对象付给了ren类的变量  但是zren可以访问字段a和c  haoren只能访问a  为什么?  我知道子类继承父类,但是“ren haoren =zren;//把对象付给ren类的变量”这句话的意思不是说haoren这个变量的对象是new zhongguoren()吗,应该haoren也能访问这2个字段啊!!!求一个解释

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

12 个回复

倒序浏览
这里面有一个偏移量的概念。
简单点说就是父类访问子类中父类原先没有的变量,
无法访问成功,
相当于子类中父类原先没有的变量做了一定的修饰,
父类无法访问到。:)
回复 使用道具 举报
本帖最后由 尹丽峰 于 2013-4-27 22:56 编辑

{:soso_e114:}haoren只能访问父类的变量a
回复 使用道具 举报
陈晖 发表于 2013-4-27 22:51
这里面有一个偏移量的概念。
简单点说就是父类访问子类中父类原先没有的变量,
无法访问成功,

这些话好绕口啊,能不能通俗一点呢?3q
回复 使用道具 举报
淡.。 发表于 2013-4-27 22:54
这些话好绕口啊,能不能通俗一点呢?3q

通俗点就是子类中定义父类没有的字段,
做了一定的“修饰”,
就算将子类的实例赋值给父类,
父类也没法访问到。
:)
回复 使用道具 举报
{:soso_e160:}关注
回复 使用道具 举报
陈行 高级黑马 2013-4-27 22:58:09
7#
陈晖 发表于 2013-4-27 22:56
通俗点就是子类中定义父类没有的字段,
做了一定的“修饰”,
就算将子类的实例赋值给父类,

我就死记把 不能打破沙锅问到底
回复 使用道具 举报
陈行 高级黑马 2013-4-27 23:05:54
8#
陈晖 发表于 2013-4-27 22:56
通俗点就是子类中定义父类没有的字段,
做了一定的“修饰”,
就算将子类的实例赋值给父类,

还想请问一下 ren haoren=new zhongguoren()和ren haoren=new ren()
有什么区别呢? 不都是只能访问父类的字段吗?
回复 使用道具 举报
阿彪 初级黑马 2013-4-27 23:13:57
9#
06.class zhongguoren:ren//继承父类   这个方式继承没见过。。。求解释。。??
回复 使用道具 举报
这里发生了向上转型,将子类对象强制转换成父类对象,那么通过父类定义的对象虽然用子类实例化了,但所能访问到的范围仅限于父类,就是说向上转型,访问范围仅限于父类了。这是多态的一种体现,如一个方法的入参为一个类对象,那么它的子类对象均可以传入,但在方法里面只能访问父类定义的属性和方法了。

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
其实我觉得可以这样理解,我们可以把(ren)这个类当作是一个标签,ren haoren =zren  这句话就相当于在给某种人或者说某类人贴标签,你可以把ren这个标签往任何类型的人(比如中国人,美国人,英国人等等)上面贴,所以ren haoren =zren 的意思是把人这个标签贴在中国人身上,但是人这个标签并不具有中国人的一些特有的特点(相当于中国人这个类内部定义的一些自己的方法或者字段,属性等等),所以haoren这个ren类的变量是无法访问中国人这个类特有的一些方法的!  如果你真要访问可以这样做
zhongguoren  newZren = haoren as zhongguoren;这句话的意思是明确的告诉你,这个被贴了标签的人是一个中国人(是以上面的ren haoren =zren为基础的)  所以可以这样访问: newZren.c=10;   

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
HM朱百青 发表于 2013-4-27 23:21
其实我觉得可以这样理解,我们可以把(ren)这个类当作是一个标签,ren haoren =zren  这句话就相当于在给 ...

恩恩。你说的话很易懂,明白了。3q
回复 使用道具 举报
淡.。 发表于 2013-4-27 23:05
还想请问一下 ren haoren=new zhongguoren()和ren haoren=new ren()
有什么区别呢? 不都是只能访问 ...

前面是将子类new的实例赋值给父类,后面是父类new的实例赋给父类。
虽然现在都只是能访问父类的字段,
但让前面的强制转换成子类,子类就可以访问父类没有子类有的字段了。
:)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马