面向对象基础-继承05(子类的属性隐藏、方法覆盖)

Java子类属性隐藏与方法覆盖详解
本文围绕Java中子类的属性隐藏和方法覆盖展开。介绍了子类与父类同名属性和方法的访问情况,指出属性隐藏因编译器检索机制,可通过super关键字访问父类同名成员变量;方法覆盖时,无论如何操作通常只能访问子类同名方法,也可用super访问父类方法,还提及使用场景和注意事项。

子类的属性隐藏(field hidden)

子父类中能否拥有同名的属性呢?

如果可以,请尝试

  • 创建子类对象,使用对象名点的形式访问同名变量,结果是什么?
  • 创建子类对象,在子类中,编写方法,返回该属性
    • 用子类对象调用该方法,返回的结果是?
    • 方法的就近原则
  • 创建子类对象,在父类中,编写方法,返回该属性
    • 用子类对象调用该方法,返回的结果是?
    • 方法的就近原则
  • 最终我们发现,子类可以访问到父类的成员变量
    • 但是由于编译器检索机制的限制,好像父类的属性被隐藏了一样
    • 称之为子类的属性隐藏

如果我就想在子类方法中,访问父类的同名成员变量,怎么办?

  • super关键字

对象名点成员变量名的,编译器检索机制

  • 先从子类中找---->子类中找不到再去父类中找----->再找不到就报错
  • 但是一般来说,我们都是通过方法访问成员变量

注意事项

  • 静态成员变量也可以被继承,但是静态成员变量会被覆盖,而不是隐藏

子类的方法覆盖(override)

子父类中能否拥有同名的方法呢?

如果可以,请尝试

  • 在父子类中声明两个个一模一样的方法,但是方法体输出不同
    • 创建子类对象,直接调用该方法,结果是什么呢?
  • 再在父子类中定义两个方法,分别在方法体中调用自身方法名一样的方法
    • 创建子类对象,分别调用两个方法,结果是什么呢?
  • 我们发现无论怎么操作,都只能访问子类中的同名方法,这就是方法的覆盖

如果想在子类的方法中,访问父类方法,应该怎么办?

  • super关键字

对象名点方法访问的方式,编译器的检索机制

  • 先从子类中找---->子类中找不到再去父类中找----->再找不到就报错

什么时候使用方法的覆盖?

  • 当我们需要在子类中,修改父类方法的实现的时候
  • 使用方法的覆盖时,添加@Override注解来标记
  • 例如:比如对于动物的叫,人类的吃

方法覆盖的注意事项

  • 父类中私有方法不能被重写
  • 子类重写父类方法时,访问权限不能更低
  • 静态方法在使用现象上,很像是被重写了,但实际上静态方法不能被重写

继承练习: 猫狗案例

猫狗都有品种(breed),名字,年龄的属性

行为上都有吃,叫的方法

但是猫可以抓老鼠,狗可以看门

  • 重写 VS 重载
重载(overload)重写(override)
发生的类不同发生在同类中发生在子父类之间
方法名必须相同必须相同
参数列表必须不同必须相同
权限修饰符不影响重写的方法访问权限必须大于等于原方法
异常不影响重写的方法不能抛出更多的异常
返回值类型不影响重写的方法的返回值类型必须和原方法兼容
  • 被static、final、private修饰的父类方法无法被重写
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值