子类的属性隐藏(field hidden)
子父类中能否拥有同名的属性呢?
如果可以,请尝试
- 创建子类对象,使用对象名点的形式访问同名变量,结果是什么?
- 创建子类对象,在子类中,编写方法,返回该属性
- 用子类对象调用该方法,返回的结果是?
- 方法的就近原则
- 创建子类对象,在父类中,编写方法,返回该属性
- 用子类对象调用该方法,返回的结果是?
- 方法的就近原则
- 最终我们发现,子类可以访问到父类的成员变量
- 但是由于编译器检索机制的限制,好像父类的属性被隐藏了一样
- 称之为子类的属性隐藏
如果我就想在子类方法中,访问父类的同名成员变量,怎么办?
- super关键字
对象名点成员变量名的,编译器检索机制
- 先从子类中找---->子类中找不到再去父类中找----->再找不到就报错
- 但是一般来说,我们都是通过方法访问成员变量
注意事项
- 静态成员变量也可以被继承,但是静态成员变量会被覆盖,而不是隐藏
子类的方法覆盖(override)
子父类中能否拥有同名的方法呢?
如果可以,请尝试
- 在父子类中声明两个个一模一样的方法,但是方法体输出不同
- 创建子类对象,直接调用该方法,结果是什么呢?
- 再在父子类中定义两个方法,分别在方法体中调用自身方法名一样的方法
- 创建子类对象,分别调用两个方法,结果是什么呢?
- 我们发现无论怎么操作,都只能访问子类中的同名方法,这就是方法的覆盖
如果想在子类的方法中,访问父类方法,应该怎么办?
- super关键字
对象名点方法访问的方式,编译器的检索机制
- 先从子类中找---->子类中找不到再去父类中找----->再找不到就报错
什么时候使用方法的覆盖?
- 当我们需要在子类中,修改父类方法的实现的时候
- 使用方法的覆盖时,添加@Override注解来标记
- 例如:比如对于动物的叫,人类的吃
方法覆盖的注意事项
- 父类中私有方法不能被重写
- 子类重写父类方法时,访问权限不能更低
- 静态方法在使用现象上,很像是被重写了,但实际上静态方法不能被重写
继承练习: 猫狗案例
猫狗都有品种(breed),名字,年龄的属性
行为上都有吃,叫的方法
但是猫可以抓老鼠,狗可以看门
- 重写 VS 重载
| 重载(overload) | 重写(override) | |
|---|---|---|
| 发生的类不同 | 发生在同类中 | 发生在子父类之间 |
| 方法名 | 必须相同 | 必须相同 |
| 参数列表 | 必须不同 | 必须相同 |
| 权限修饰符 | 不影响 | 重写的方法访问权限必须大于等于原方法 |
| 异常 | 不影响 | 重写的方法不能抛出更多的异常 |
| 返回值类型 | 不影响 | 重写的方法的返回值类型必须和原方法兼容 |
- 被static、final、private修饰的父类方法无法被重写
Java子类属性隐藏与方法覆盖详解
本文围绕Java中子类的属性隐藏和方法覆盖展开。介绍了子类与父类同名属性和方法的访问情况,指出属性隐藏因编译器检索机制,可通过super关键字访问父类同名成员变量;方法覆盖时,无论如何操作通常只能访问子类同名方法,也可用super访问父类方法,还提及使用场景和注意事项。
872

被折叠的 条评论
为什么被折叠?



