1.字段与静态方法
子类的字段与静态方法可以与父类同名,但上面不能够有@Override注解,也就是说它们不能被重写。
在同名的情况下,起到了“隐藏”的效果。
例如: Employee man = new Manager(); man.test();
实例化的这个对象中,声明的man变量是Employee类的,变量名存在栈中,而内存堆中为对象申请的空间却是按照Manager类来的,就是Employee类型的man变量的指针指向了一个Manager类的对象。如果对这个man调用方法,调用的是谁的?如果是非静态方法,编译时编译器以为是要调用Employee类的,可是实际运行时,解释器就从堆上开工了,实际上是从Manager类的那个对象上走的,所以调用的方法实际上是Manager类的方法。有这种结果关键在于man实际上指向了Manager类对象。现在用man来调用静态方法,实际上此时是Employee类在调用静态方法,Employee类本身肯定不会指向Manager类的对象,那么最终调用的是Employee类的方法。
由此,只能说形式上静态方法的却可以被重写,实际上达不到重写的效果。
2.代码示例
cpp中,拥有virtual关键字是多态的必要条件,而java中多态是主动的行为。
对成员变量的访问不是多态的!
对静态方法的访问不是多态的!
只有非private方法才能被重写,也即被覆盖。
重写时,返回值类型可以变吗?
可以,返回类型只要为原返回值类型的子类即可。
时间: 2024-10-31 10:51:54