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