黑马程序员技术交流社区

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

作者: 陈行    时间: 2013-4-27 22:45
标题: 关于继承的问题
  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个字段啊!!!求一个解释


作者: 陈晖    时间: 2013-4-27 22:51
这里面有一个偏移量的概念。
简单点说就是父类访问子类中父类原先没有的变量,
无法访问成功,
相当于子类中父类原先没有的变量做了一定的修饰,
父类无法访问到。:)
作者: 尹丽峰    时间: 2013-4-27 22:51
本帖最后由 尹丽峰 于 2013-4-27 22:56 编辑

{:soso_e114:}haoren只能访问父类的变量a
作者: 陈行    时间: 2013-4-27 22:54
陈晖 发表于 2013-4-27 22:51
这里面有一个偏移量的概念。
简单点说就是父类访问子类中父类原先没有的变量,
无法访问成功,

这些话好绕口啊,能不能通俗一点呢?3q
作者: 陈晖    时间: 2013-4-27 22:56
淡.。 发表于 2013-4-27 22:54
这些话好绕口啊,能不能通俗一点呢?3q

通俗点就是子类中定义父类没有的字段,
做了一定的“修饰”,
就算将子类的实例赋值给父类,
父类也没法访问到。
:)
作者: Mycode    时间: 2013-4-27 22:57
{:soso_e160:}关注
作者: 陈行    时间: 2013-4-27 22:58
陈晖 发表于 2013-4-27 22:56
通俗点就是子类中定义父类没有的字段,
做了一定的“修饰”,
就算将子类的实例赋值给父类,

我就死记把 不能打破沙锅问到底
作者: 陈行    时间: 2013-4-27 23:05
陈晖 发表于 2013-4-27 22:56
通俗点就是子类中定义父类没有的字段,
做了一定的“修饰”,
就算将子类的实例赋值给父类,

还想请问一下 ren haoren=new zhongguoren()和ren haoren=new ren()
有什么区别呢? 不都是只能访问父类的字段吗?
作者: 阿彪    时间: 2013-4-27 23:13
06.class zhongguoren:ren//继承父类   这个方式继承没见过。。。求解释。。??
作者: kaka小明    时间: 2013-4-27 23:16
这里发生了向上转型,将子类对象强制转换成父类对象,那么通过父类定义的对象虽然用子类实例化了,但所能访问到的范围仅限于父类,就是说向上转型,访问范围仅限于父类了。这是多态的一种体现,如一个方法的入参为一个类对象,那么它的子类对象均可以传入,但在方法里面只能访问父类定义的属性和方法了。
作者: HM朱百青    时间: 2013-4-27 23:21
其实我觉得可以这样理解,我们可以把(ren)这个类当作是一个标签,ren haoren =zren  这句话就相当于在给某种人或者说某类人贴标签,你可以把ren这个标签往任何类型的人(比如中国人,美国人,英国人等等)上面贴,所以ren haoren =zren 的意思是把人这个标签贴在中国人身上,但是人这个标签并不具有中国人的一些特有的特点(相当于中国人这个类内部定义的一些自己的方法或者字段,属性等等),所以haoren这个ren类的变量是无法访问中国人这个类特有的一些方法的!  如果你真要访问可以这样做
zhongguoren  newZren = haoren as zhongguoren;这句话的意思是明确的告诉你,这个被贴了标签的人是一个中国人(是以上面的ren haoren =zren为基础的)  所以可以这样访问: newZren.c=10;   
作者: 陈行    时间: 2013-4-28 11:09
HM朱百青 发表于 2013-4-27 23:21
其实我觉得可以这样理解,我们可以把(ren)这个类当作是一个标签,ren haoren =zren  这句话就相当于在给 ...

恩恩。你说的话很易懂,明白了。3q
作者: 陈晖    时间: 2013-4-28 12:32
淡.。 发表于 2013-4-27 23:05
还想请问一下 ren haoren=new zhongguoren()和ren haoren=new ren()
有什么区别呢? 不都是只能访问 ...

前面是将子类new的实例赋值给父类,后面是父类new的实例赋给父类。
虽然现在都只是能访问父类的字段,
但让前面的强制转换成子类,子类就可以访问父类没有子类有的字段了。
:)




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