Java系列课程第九天(覆写、final、多态 )

Day09 覆写、final、多态

1. 面向对象
1.1 覆写
1.1.1 是什么
覆写就是子类和父类有个一样(方法名,参数列表,返回值都一样)的成员方法
覆写特指成员方法,只有成员方法可以覆写

1.1.2 应用场景
什么时候需要覆写:
如果父类方法不能满足子类需求的时候,需要对方法进行覆写

覆写条件
1必须是有继承关系
2方法名,参数列表,返回值必须相同
3不能拥有更低访问权限
4不能有更宽泛的异常

继承最基本的作用:代码重用
继承最重要的功能:方法覆写

覆写目的:
1满足当前需求
2错误越来越少
3使用范围越来越广
4功能越来越强
在这里插入图片描述
1.2 Final
1.2.1 是什么
final是修饰符,表示最终的,不能更改的

1.2.2 能干什么
final 修饰的类不能被继承
final 修饰的成员方法不能被覆写
final修饰的变量没有默认值,必须显示赋值,并且整个生命周期中值不可更改
常量一般写为:public static final,常量命名建议全部大写

1.2.2.1 修饰类
在这里插入图片描述final 修饰的类不能被继承
在这里插入图片描述
1.2.2.2 修饰方法
final 修饰的成员方法不能被覆写
在这里插入图片描述
1.2.2.3 修饰变量
final修饰的变量没有默认值,必须显示赋值,并且整个生命周期中值不可更改
在这里插入图片描述
1.2.3 易错点
在这里插入图片描述
1.3 多态
1.3.1 软件设计六大原则
在这里插入图片描述
1.六大原则-单一职责原则

原则思想:一个方法只负责一件事情。描述:单一职责原则很简单,一个方法 一个类只负责一个职责,各个职责的程序改动,不影响其它程序。 这是常识,几乎所有程序员都会遵循这个原则。优点:降低类和类的耦合,提高可读性,增加可维护性和可拓展性,降低可变性的风险。

2.六大原则-里氏替换原则

原则思想:使用的基类可以在任何地方使用继承的子类,完美的替换基类。描述:子类可以扩展父类的功能,但不能改变父类原有的功能。子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法,子类中可以增加自己特有的方法。优点:增加程序的健壮性,即使增加了子类,原有的子类还可以继续运行,互不影响。3.六大原则-依赖倒置原则

3.原则思想:高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象,抽象不应该依赖于具体实现,具体实现应该依赖于抽象。描述:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。优点:可以减少需求变化带来的工作量,做并行开发更加友好。

4.六大原则-接口隔离原则

原则思想:类和类之间应该建立在最小接口的上。描述:类A通过接口依赖B,类C通过接口依赖D,如果接口类A和类B不是最小的接口,则依赖的类B和类D必须要实现他们不需要的方法。优点:提高程序的灵活度,提高内聚,减少对外交互,使得最小的接口做最多的事情。5.六大原则-迪米特法则

5.原则思想:一个对象应当对其他对象有尽可能少地了解,简称类间解耦描述:一个类尽量减少自己对其他对象的依赖,原则是低耦合,高内聚,只有使各个模块之间的耦合尽量的低,才能提高代码的复用率。优点:低耦合,高内聚。6.六大原则-开放封闭原则

6.原则思想:尽量通过扩展软件实体来解决需求变化,而不是通过修改已有的代码来完成变化描述:一个软件产品在生命周期内,都会发生变化,既然变化是一个既定的事实,我们就应该在设计的时候尽量适应这些变化,以提高项目的稳定性和灵活性。优点:单一原则告诉我们,每个类都有自己负责的职责,里氏替换原则不能破坏继承关系的体系。

1.3.2 是什么
多态就是父类引用指向子类对象
什么是多态:父类引用指向子类对象
父类引用:使用父类类型创建的引用类型变量
指向:通过这个引用类型变量,可以找到哪个对象
子类对象:创建的子类对象校类变量=new子类();

java中提供了两种多态机制
1编译时多态
编译时多态是静态的,主要指方法重载,根据不同参数列表来区分不同的方法,编译之后也会形成不同的两个方法运行时调用该方法的时候,就算多态了,因为调用的是两个方法
2运行时多态
运行时多态是动态的,主要是动态绑定来实现的主要靠子类实现的父类的方法来完成,这就是多态性

1.3.3 多态的几种形式
多态的几种形式
1直接变量发生多态
父类变量=new子类()
2实参/形参
方法声明的时候,参数列表用父类声明,而调用方法的时候传递子类对象
public static void m1(Sup s){}
m1(new Sub());
3返回值
返回值类型写的是父类,而具体返回的时候却返回子类对象
public Sup m10{
return new Sub();
多态缺点:丢失子类特有的属性

在这里插入图片描述
1.3.4 多态属性调用
使用多态进行属性调用:
1父类没有,报错,而且是编译时报错
2父类有,子类没有,执行父类
3父类有,子类也有,除了成员方法执行子类,其他都执行父类

1.3.5 Instanceof
多态又叫向上转型,子类到父类是自动转换
父类到子类,是强制转换,又叫向下转型(必须先发生向上转型,再发生向下转型)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1.3.6 隐秘多态
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1.4 Object
1.4.1 是什么
Object是java提供的根类,所有类都要直接或者间接继承Object
意味着 Object中的方法,是所有类都有的
Object在java.lang.Object 所以 使用不需要导包
在这里插入图片描述
getClass : 获取运行时类,反射机制讲解
Clone : 克隆对象,废弃
Notify,notifyAll,wait : 让线程进入等待,和唤醒线程,多线程讲解

toString,finalize,equals,hashCode(散列表讲解)

1.4.2 Equals
Equals:设计目的是比较两个对象是否相等
:基本类型比较值,引用类型比较地址,我们比较引用类型的时候不会比较地址,因为不同对象的地址一定是不同的,除非你就想比较地址(没有任何价值)
两个对象进行比较的时候,肯定是用有价值的属性进行比较,所以不会使用
,而是使用equals,而默认的Object中的equals方法,比较内存地址
public boolean equals(Object obj){return this==obj;}
因为默认不知道比较什么属性,所以默认比较内存地址,根据自己的需求进行方法重写即可
在这里插入图片描述
1.4.3 Finalize
JVM四大特性:
跨平台,面向对象,多线程,自动垃圾回收机制
当没有更多引用指向该对象的时候,此时该对象被视为垃圾数据
Object中的finalize方法,是当对象被回收之前,自动调用该方法
1finalize方法所有对象都有
2finalize方法不需要程序员调用,由系统自动调用
3就算程序员对finalize方法进行调用,也只是单纯的方法调用而已,并没有垃圾回收功能
4因为finalize方法并不会垃圾回收,而且被回收之前,自动执行一次而已
5结合finalize方法的执行特征,可以在对象销毁之前,做一些关闭资源等销毁操作

1.4.4 HashCode
hashCode:设计目的,是为了给每个对象生成一个唯一的标识符
同一个对象,生成多次,一定是相同的值,但是不同的对象生成多次,也有可能生成相同的值,哈希冲突
hashCode方法是根据hash算法得到的哈希值
hash算法:是一种安全的加密算法,把不定长的值,转换为定长的值,并不能保证其唯一性
算法:
直接寻址法,数字分析法,平方取中法,折叠法,随机数法除留余数法
在这里插入图片描述
1.4.5 toString
toString设计目的:返回该对象的字符串形式
Object中的toString方法默认返回内存地址
当我们输出一个引用类型对象的时候会自动调用该对象的toString方法public String toString){
return getClass).getName)+"@"+Integer.toHexString(hashCode());
}
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值