多态、重写与隐藏

简介: 1.字段与静态方法 子类的字段与静态方法可以与父类同名,但上面不能够有@Override注解,也就是说它们不能被重写。 在同名的情况下,起到了“隐藏”的效果。 例如: Employee man = new Manager(); man.test(); 实例化的这个对象中,声明的man变量是Employee类的,变量名存在栈中,而内存堆中为对象申请的空间却是按照Manager类来的,

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方法才能被重写,也即被覆盖。

微笑重写时,返回值类型可以变吗?
可以,返回类型只要为原返回值类型的子类即可。

目录
相关文章
类的继承和重写方法
类的继承和重写方法
65 0
|
安全 程序员 编译器
【C++】继承(万字详解) —— 切片 | 隐藏 | 子类的默认成员函数 | 菱形继承(上)
【C++】继承(万字详解) —— 切片 | 隐藏 | 子类的默认成员函数 | 菱形继承(上)
200 0
【C++】继承(万字详解) —— 切片 | 隐藏 | 子类的默认成员函数 | 菱形继承(上)
|
存储 Java C++
【C++】继承(万字详解) —— 切片 | 隐藏 | 子类的默认成员函数 | 菱形继承(下)
【C++】继承(万字详解) —— 切片 | 隐藏 | 子类的默认成员函数 | 菱形继承(下)
125 0
【C++】继承(万字详解) —— 切片 | 隐藏 | 子类的默认成员函数 | 菱形继承(下)
|
开发者 Python
子类重写父类方法|学习笔记
快速学习子类重写父类方法,先来介绍子类重写父类方法。多态其实就是一种子类重写父类的方法。
|
存储 安全 Java
【C++】继承 —— 切片 | 隐藏 | 子类的默认成员函数 | 菱形继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段。它允许程序员在保持原有类(基类)特性的基础上进行扩展,增加功能,产生新的类,称派生类。
112 0
【C++】继承 —— 切片 | 隐藏 | 子类的默认成员函数 | 菱形继承
|
安全 Java Linux
【C++】多态 —— 条件 | 虚函数重写 | 抽象类 | 多态的原理
多态即多种形态。在Linux基础IO一文中@一切皆文件,咱们说过语言上的多态是漫长软件开发过程中探索出的实现“一切皆...”的高级版本。那现在就来了解多态的语法细节。
571 0
【C++】多态 —— 条件 | 虚函数重写 | 抽象类 | 多态的原理
|
编译器 C++
C++ Trick:小心,子类隐藏父类成员函数
学习面向对象的语言,了解继承是必不可少的。您可能觉得这太基础了,大家可都是老“996”了,还用介绍封装、继承、多态那老三样吗?
301 0
|
Java C++
【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )(一)
【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )(一)
2284 0