Java基础—Day12
1.面向对象复习
1.1 对象和类
类:编写代码的基本单元,对应的是一个模块,只要按照它的语法去设计这样的一个模块,从现实中具体的实体(对象)抽象出来。抽象出来静态特征和动态特征【属性和方法】
对象:现实中的一个个真实存在。比如XXX地方的张三,这个人是存在。
根据实际场景去提取属性和方法。
1.2 封装
你可以随意操作属性,比如上面买投影仪,人家还要倒贴钱给你,肯定是不靠谱的。所以为了不让你随意修改属性!所以要赢藏起来。用paivate修饰,又要获取和修改属性值,通过getXxx和setXxx方法。可以在setXxx中加入必要的逻辑判断。
好处:不允许直接操作属性,安全
1.3 包
使用层面:用它来管理你的源码。还可以起到权限控制
命名规范:小写(一般都是使用字母)、域名导致
引入其他包中的类:import、同名的多个,通过全类名引入
1.4 继承
好处:抽取共性【属性、方法】 --》父类--》类的设计
建立关系:extends
特点:
- 单根,一个亲爹
- 多层,家族树
- 先父后子
方法重写:没有强制性,方法体可能也已知
前提:继承、实现(接口)
特点:方法名一样,参数列表相同,访问修饰符不能严于父类,返回值相同或者子类类型,异常相关
抽象:
①抽象方法:只能定义方法签名 修饰符 返回值类型 名称(形参列表)
方法:简单的说方法就是完成特定功能的代码块
很多代码,实现某个功能,我们为了让调用者调用方法,重复调用,将其用黑盒子抱起来,对外提供的这个功能,我们就称为方法。开发人员,你就是这个方法的设计者。
豆浆机:
方法:榨汁【怎么转、转多长时间】,水【自来水、污水】、豆子---》 未知量---》 形参列表---》形参如何定义---》语法
是否有返回值:如何自己喝,高根棍子---》 不需要返回值---》这个执行完的结果,不需要给别人使用
有返回值:搞个杯子借助---》变量,留着自己喝(sout),也可以给别人喝(赋给了一个变量或者表达式,直接sout)
②抽象类:语法有要求,必须在抽象类中 abstrac
特点:本质还是一个类,用于继承(共性) ---》类的设计
有哪些成员:普通类有什么,它就可以有什么,甚至更多。
目前讲了几个成员:
- 成员变量
- 方法:普通方法、构造方法
- 代码块:普通代码块、静态代码块 ---》执行顺序
模板方法设计模式:基本代码要会写
1.5 Object
toString():直接打印对象名,实际就是调用to String,所以重写之后,再去调用toString,多余
equals:比较的是啥,可以根据实际需要去重写 equals vs ==
hashCode:一般跟equals一起重写,一般可以快捷键直接生成
1.6 关键字
final:使用层面比较简单,如何选用也不难
- 类:最终类,不允许被继承,一般封装在一个工具集,一般不轻易给别人修改,比如JDK
- 方法:不允许被重写
- 变量:即常量,基本类型 如果是引用类型的话,它的地址值不能修改,但是不影响使用自己内部的元素【方法、属性】
static:
- 成员变量:类变量,一般使用类名调用,即使能用对象调用,也不建议【有可能会破坏这个值】,一般会结合final去定义,只能通过类名调用。共享数据
- 方法:一般在工具类中去定义
- 代码块:做一些初始化操作
- 修饰类:内部类
1.7 多态
多态:父类引用指向子类对象。 父类 变量名 = new 子类()
好处:扩展性、维护性
向上转型:
向下转型:
- 为什么:多态弊端的存在,导致子类不能调用自己特有的方法,此时若需要调用子类方法,得把皮拔掉,还原本质---》子类对象自身
- 如何用:大类型---》小类型---》语法层面 子类 aa ==(子类)父类引用
-
注意点:判断类型是否兼容 a instanceof B,a这个对象是B这个类的实例吗?
应用场景:
- 作为形参定义:调用方法传递的实参是:子类对象
- 作为返回值:统一用父类接受
- 作为成员变量:就不关心子类是谁了---》涉及到类与类之家的关系【继承、组合、聚合、实现】
2. 接口
2.1 为什么要使用接口
2.2 什么是接口
需求:防盗门TheftDoor,本质上是门,锁只是它的一个扩展功能。
2.3 接口的特点
1. 接口是否支持多继承 interface C extends B,A
2. 方法
-
抽象方法: 默认会给我们加 public abstract ,所以我们就没有必要再写了, JDK7 之前
-
default 修饰的方法:好处,可以扩展接口的功能,同时又不强制实现类必须实现方法JDK8开始支持
-
private 修饰的方法: JDK9 开始支持的方法,没什么鸟用, JDK9 和 JDK10 ,就是一个鸡肋;JDK8和JDK11用的比较多
-
可以使用 static 修饰方法,可以将接口看成是一个工具类
3.变量
为全局变量,默认会给我们加上 public static final
2.4 接口的应用场景
- 作为功能的扩展,即在接口中定义方法。跟类的关系: has a 的关系,一般是我们用的比较多的。
- 接口也是一种约定/规范,典型 Serializable , Cloneable ,该接口就是一个空接口,作用就是能够实现对象的序列化(将对象保存到文件中)和反序列化(从文件中将对象读取出来)。比如哪一天你也能写一个JDK,你可以自己定义规范。
2.5 接口 vs 抽象类
抽象类仍然是一个类,在创建新类时只能继承它一个。而创建的过程可以实现多个接口。
有一条实际经验:尽可能地抽象。因此,更倾向使用接口而不是抽象类。只有必要时才使用抽象类。除非必须使用,否则不要用接口和抽象类。大多数时候,普通类已经做得更好,如果不行的话,再移动到接口或抽象类中。
3.原型模式
浅克隆:clone的一模一样,若抄袭者修改了内容,被抄袭者 的作业也被改了,【一个类中关联了
另一个引用类型,修改的是引用类型的某个属性值】----因为,clone过来的那个引用类型的地址值
是一样的。实现Cloneable接口并重写clone接口只能进行浅克隆
深克隆:clone过来的内容一样,但是两者隶属于不同的对象,各自修改内容,互不影响
4. 作业
需求说明:原始的手机,可以发短信,通电话。随着发展,手机增加了功能:音频、视频播放、拍照、 上网。使用接口实现手机功能。
测试及结果:
2.