继承的相关注意事项

一,继承的内存形态:

对于父类的成员,子类继承后,并非将父类中的成员复制一份放到子类的空间中。它仍然只在父类空间中只用一份。

那么子类如何访问继承的成员的呢?

二,关于子类访问继承的成员

子类对象.成员名:编译器会首先到子类空间中查找是否存在此成员,如果没有则在父类空间中查找,依次向上查找。注意向上查找的过程中,有可能存在某层子类中也定义了和该层上面的父类同名的成员,那么此时会发生父类成员被覆盖的现象,即没有访问到继承的根部父类成员而可能是某层新定义成员。

成员方法.成员变量:编译首先查找成员方法和上面一样。但是有可能发生覆盖现象。那么用到的是哪层的成员方法,那么用这个成员方法访问变量时,也只能查找访问该方法所属的类层(包括本层)以上类层中的成员变量。举例解释:现在有类

ABC,A继承于B,B继承于C,C中定义了两个非私有的成员变量Ca和Cb,以及一个非私有的方法f(),B中定义了非私有的成员变量Cb(和父类中的成员变量同名中,会发生覆盖)以及非私有方法df()。BC类中的两个方法都是访问Ca和Cb。那么在类A中调用f()和df()分别访问两个成员变量。则f方法访问的变量是类C中的两个成员变量。df方法访问的是类C中的Ca以及类B中的Cb。不是说,继承,子类会继承父类所有的非私有方法吗?不是应该继承到A的时候C中的Cb会被B中的Cb覆盖吗?为什么f方法访问的都还是是C中的成员变量呢?原因就在于,继承的成员不是重新复制一份放到子类中,用到的依旧是父类中的那一份。解析:C类中间存着Ca和Cb和f,B类空间中存着Cb和df。当A中调用df访问Ca和Cb,首先查到df在B类空间中,然后执行df方法,接着在B中查找两变量,发现B中有Cb,则访问B中Cb,然后查到C中才有Ca,则访问C中Ca。当A中调用f时,都是在A空间,则方法的都是A中成员。

总结:在最底层子类中访问父类的方法,那么在这个方法中访问的成员变量,是从继承的这个方法所属的这个类层以及往上找要访问的变量。因为各个类中成员都是存在各个类空间的。当这个方法访问变量,首先在所属类中查找。查找不到的话,就会根据存在该类空间中的一个指向父类的隐含变量super,往上层查找那个变量。


注意:要纠正上面一个说法错误:类中定义的方法与成员变量不是都存储在同一个类空间中的,实质上方法和静态成员都是存储在内存的方法区,这个区中的成员都是属于各个实例对象共享的,而类中的成员变量则存储在对象在堆中的一片空间中。只不过是,方法区中的静态成员有一个指向自己所属类的指针。而方法区中的实例成员方法,则在调用时,系统会向它传递一个隐形的参数指针this,用来指向定义的某类的对象。


三,关于继承中的属性隐含

当子类的成员变量和父类的成员变量同名时,父类的成员变量(属性)被隐藏。

当子类中的成员变量与父类成员变量同名时,父类成员变量被隐藏,一般此时使用的是子类的同名变量。

关于实例成员变量和静态成员都是编译多态性,在编译时期就确定了要调用哪个。

三,关于继承中的方法覆盖

当子类的成员方法和父类的成员方法同名时,父类的成员方法被覆盖。

关于实例成员方法和静态方法都是运行多态性,在运行时期根据对象的实际类型来决定调用哪个。

注意:

1,子父类方法的覆盖,访问权限可以变宽松。

2,子父类方法的覆盖,父类非final,子类final也可以。反之不可以。

另外,返回值数据类型不相同不允许覆盖;静态方法和实例方法之间不允许覆盖。别的没有例外情况。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值