Java中的重写覆盖问题

1. 首先,重写等于覆盖,常发生于父类与子类之间的变量和方法之间。

2. 重写,在运行期间采用多态的形式。

3. 重写的方法不能比被重写的方法有跟高的访问权限和更多的异常。

4.成员变量的重写与方法的重写是不同。觉得这里可以用C++的语言进行解释:父类的成员变量被继承后并重写,其依然存在与子类之中,而子类重写的变量也是存在的,只是他们各自相对与类首地址的偏移量不同。这个偏移量在每个类中都是一样,可以存在类中。

以上A,B类为例,子类B中的成员变量安排依次是Str=father,size= 20,Str=Son,size=10.这样可以保证子类向上转换时信息不丢失。其实并不算是重写,而是变量的堆叠。但是方法的重写机制感觉有点不同,内存中找到方法的实际是按照其入口地址进行对应的,例如,A类中getStr方法有一个入口地址A-addr, B类方法getStr也有一个入口地址B-addr,这个入口地址存在与具体实例化的对象中。

5. 按照以上方式去理解的话,下面的代码就较为容易的知道运行结果了。

前两个自不必多说,说说最后两个输出。aa.getStr()方法的入口地址存在与new B()的新对象内,这个方法入口地址是永远不变的,自然就是B类中的getStr()方法,也就是所谓重写的方法。而aa.size的值,按照上面的说法,是以类的偏移地址寻找,类是A类,size自其首地址会偏移Str="Father"这么多个字节(具体多少字节也不知道,感觉应该是指针4个字节的样子,暂时就这么记吧),按照这个偏移量后,自然找到size=20这个值。

6.个人感觉所谓的重写,并不是擦除后重写,其实就是按照各自的偏移或者入口地址的不同变化,来达到寻找不同成员变量或者函数的目的。可以简单记为,变量的重写看引用,函数的重写看对象。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java重写(override)和重载(overload)都是实现多态性的方式,但是它们的作用和实现方式有所不同。 重写指的是子重新定义了父的方法,并且在子对象调用该方法时,会执行子重新定义的方法。子重新定义的方法必须和父的方法有相同的方法名、参数列表和返回型,且访问权限不能低于父的方法。重写可以发生在继承关系的任何两个之间。 重载指的是在一个定义了多个同名的方法,但是这些方法的参数列表不同(参数的数量、型或顺序不同)。在调用这些方法时,编译器会根据传递给方法的参数的数量和型,选择匹配的方法进行调用。重载不考虑继承关系,只考虑同一个方法的多态性。 因此,重写和重载的区别在于: 1. 重写是子对父方法的覆盖,具有相同的方法名、参数列表和返回型;重载是在同一个定义了多个同名的方法,但是参数列表不同。 2. 重写是实现继承多态性,重载是同一个方法的多态性。 3. 重写必须满足方法名、参数列表和返回型相同,访问权限不能低于父的方法;重载必须满足方法名相同,但是参数列表必须不同。 总之,重写和重载是Java常用的实现多态性的方式,它们的作用和实现方式有所不同,需要根据具体的应用场景进行选择和使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值