方法覆盖深化和super关键字 2021-07-20java学习日记

7.20号学习日志

java基础p461 - p476
关键词:方法覆盖 super关键字

方法覆盖的深化

1.方法覆盖只是针对于:“实例方法”,静态方法覆盖没有意义

原因:
(1)方法覆盖要和多态机制联合起来才有意义。
(2)子类业务需求的时候,子类完全可以定义一个全新的方法
(3)静态方法存在方法覆盖吗?

静态方法无法联合多态
例:
Animal a = new Cat();dome方法有两个,Animal一个Cat一个。此时调用a.dosome,运行的还是Animal.dosome.
静态方法和对象无关。所以不探讨静态方法覆盖,没有意义。
静态方法还是用类名调用,用对象调用会使程序员产生困惑。

总结两句:
私有不能覆盖, 静态不谈覆盖

2.在方法覆盖中,方法的返回值类型

方法覆盖的条件:
(1)发生的两个类中有继承关系
(2)父类中的方法和子类重写之后的方法:
有相同的方法名,相同的参数列表,相同的返回值类型
细节:对于基本数据类型来说,返回值类型只能一样
引用数据类型中,重写的话返回值类型变小的话可以,但是无什么意义。
(3)权限只能更高,不能更低
(4)抛出的异常只能更少,不能更多

super关键字

super和this 对比学习
this:
this能出现在实例方法和构造方法中。
this的语法是:this. 、this()
this不能使用在静态方法中
this.大部分时候是可以省略的。
this. 在区分局部变量和实例变量的时候不能省略
例:
public void setName(String name){
this.name = name;
}
this()只能出现在构造方法的第一行,通过当前的构造方法去调用本类中的其他构造方法 目的:代码复用

super:
super能出现在实例方法和构造方法中。
super的语法是:super. 、super()
super不能使用在静态方法中
super.大部分时候是可以省略的。
super()只能出现在构造方法的第一行,通过当前的构造方法去调用父类中的其他构造方法 目的:代码复用 创建子类型对象的时候,先初始化父类型特征
当子类中构造方法第一行什么都没有的时候,没有写super的时候,默认有一行super()

重要结论:
当一个构造方法第一行:既没有this()又没有super()的话,默认会有一个super();表示通过子类的构造方法调用父类的无参数方法,所以所欲必须保证父类的无参数构造方法是存在的。如果有一个
super(123)那就不会有super() (super必须在构造方法第一行)
this()也一样,因此不能和super共存,只能出现在构造方法第一行。
无论如何,父类的构造方法一定会执行。如果我们没手动写extends ,默认继承Object的构造方法

在恰当时间使用:super(实际参数作用):初始化当前对象的父类型特征super关键字代表的就是“当前对象”的那部分父类型特征
可调用父类的构造方法如果不写,便默认会有super(),可以调用父类的无参构造。
银行+信誉类程序,内存图
在这里插入图片描述

子类中加一个String name 就会输出如图代码,如果子类中没有String name 那么将会输出三个张三
在这里插入图片描述

内存图:
在这里插入图片描述

如果父类和子类中,有同名的属性,并且希望在子类中访问父类的特征,那么必须加上super.如果省略的话,默认那就是this.
单独输出this是可以的,但是单独输出super是不允许的,super不是引用,不保存内存地址,也指向任何对象,super只是代表当前对象内部的那一块父类型的特征
总结:
super.属性名 【访问父类的属性】
super.方法名(实参)【访问父类的方法】
super(实参)【调用父类的构造方法】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值