第七章 OOP
1.基本概念:对象,类,方法
(1)对象(状态和行为的复合体)
状态:fields
行为:method
(2)类:一组对象(抽象)
(3)类方法 类成员变量(staic)
(4)实例方法 实例成员变量
2.接口和枚举
(1)接口中只有方法的定义,没有实现
(2)接口之间可以继承和扩展
(3)一个类可实现多个接口
(4)一个接口可以有多种实现类
(5)接口:确定ADT规约 类:实现ADT
(6)接口里面没有构造函数,client需要知道该接口某个具体实现类的名字
(7)java8开始,通过在接口内写static函数,构造函数,避免表示泄露
(8)default方法:在接口中统一实现某些功能,避免重复
3.封装和信息隐藏
(1)通过接口实现信息隐藏
客户端仅使用接口中定义的方法
(2)public,protected,default,private
Public:所有
Protected:当前类,子孙类
Default:当前类,同一包的子孙类
Private:当前类
4.继承和重写
(1)子类继承父类的属性和方法
(2)严格继承:子类只能添加新方法,无法重写超类中的方法
父类中方法前加final 子类无法重写
(3)类前final 不能派生子类
(4)覆盖、重写
重写:完全同样的signature
实际执行时用哪种方法,在运行时决定
子类中调用父类中的方法:super(父类),this(自己)
@Override会检查签名是否一致
子类的可见性不能比父类的窄
5.抽象类
抽象方法:只有定义没有实现 abstract
抽象类:抽象类不能实例化
继承某个抽象类的子类在实例化时,所有父类中的抽象方法必须已经实现
具体类->抽象类->接口
一个类可以实现多个接口,一个类只能继承一个父类
通过继承实现抽象类,通过实现 实现接口
6.多态、子类型、重载
(1)特殊多态 重载:一个方法可以有多个同名的实现
重载:多个方法具有同样的名字,但有不同的参数列表或返回值类型
静态类型检查 编译时明确使用哪种方法
重写方法在运行阶段动态检查
(2)类型多态:一个类型名字可以代表多个类型(泛型编程)L
参数多态性是指方法针对多种类型时具有同样的行为,此时可使用统一的类型变量表达多种类型。在运行时根据指定类型确定具体类型,编译为.class文件时擦除
泛型类:在类后<>写入泛型
泛型接口:在接口名字后<>写入泛型,可以有泛型的实现类和非泛型的实现类
(3)子类型多态、包含多态:一个变量名字可以代表多个类的实例
7.Object类
所有方法的父类
equals,toString,hashCode
第八讲 ADT和OOP中的等价性
1.等价性的判断
(1)基于AF定义ADT的等价操作
(2)站在外部观察者的角度:对两个对象调用任何相同的操作,结果都相同,则认为这两个对象是等价的。
2.==vs equals();
对基本数据类型 用==判定相等
对对象类型 使用equals()
Object.equals()使用==实现判断
3.实现equals()
在Object中缺省equals()在判断引用等价性,往往需要重写
If(!(o instance of xxx)
Return false;
Instanceof 判断某个对象是不是特定类型,动态类型检查
4.Object中equals()的契约
除非对象被修改了,否则多次调用equals应该是相同的结果。
相等的对象,其hashCode结果必须是一致的
自反、对称、传递
等价的对象必须有相同的hashCode,重写equals的同时要重写hashCode()
5.可变类型的等价
观察等价性和行为等价性
可变类型的改变会改变hashCode
对可变类型来说,实现行为等价性,无需重写equals