目录
前言
继续复习软件构造
一、OOP的相关知识
接口:java中一类特定方法的总称。接口可以被多个类实现,一个接口也可以有多个实现类。接口中没有构造器、fields以及方法的实体。
接口中的方法:只有public、abstract、default、static、strictfp是允许的,private方法是不被允许的:
通过default关键字定义接口中方法,在接口中统一实现某些功能,无需在各个类中重复实现它。
关键字的作用域
- private:只能在声明的类中使用
- protected:可以在声明类中的子类或者同一个包的其他类中使用
- public:可以在任何地方被引用
某个类的构造器中的成员变量初始化如果想继承父类,必须最先声明!
抽象方法:只有方法的声明,没有方法的具体实现,被关键字abstract修饰
抽象类:含有至少一个抽象方法的类叫做抽象类
接口(新定义):所有的方法都是抽象方法的抽象类
接口和抽象类的区别:
多态的三种形式:
- 特殊多态:功能重载
- 参数化多态:泛型化编程
- 子类型多态
signature:函数签名,包含函数的返回值、名称和参数类型列表,用来确定一个函数(方法)的
泛型:允许多种不同的属性的实例化
<?super A>:下限通配符
<? extends A> 上限通配符
子类型:B是A的子类型当且仅当B的规约不弱于A的规约
若对每个类型S的对象o1,都存在一个类型T的对象o2,使得在所有针对T编写的程序P中 ,用o1替换o2后,程序P行为功能不变,则S是T的子类型。
instanceof:Operator判断这个object是否是给定的类,左边是对象,右边是类
二、关于不可变类型和可变类型的等价性
关系等价性:
x.equals(x) //自反
x.equals(y) <--> y.equals(x) //对称
x.equals(y),y.equals(z) -->x.equals(z) //对称
Imutable的等价性:
- 通过抽象函数AF的值来判断,a和b相等当且仅当a和b在函数f的作用下有相同的值
- a和b相等当且仅当经过相同的操作后a和b仍然相等
不可变类型需要重写equals/hashcode方法(必须同时继承)
对于基本数据类型判定相等: “==”
对于对象类型判断相等: equals()
注:如果对两个对象判定相等使用了“==”,这里判断的是两个对象的引用地址是否相同
contains方法的原型为:contains(Object o)
mutable的等价性:
- 观察等价性:在不改变状态的情况下,两个mutable对象是否看起来相等。如Collections、Date
- 行为等价性:调用对象的任何方法是否展示出一致的结果。如StringBuilder
注:有些情况下,观察等价性可能会导致bug,甚至破坏RI
可变类型通常不需要重写equals/hashcode方法
x.clone()!=x 、x.clone.getclass() == x.getclass()、x.clone().equals(x)
两个equal方法判断相等的对象hashcode值一定相同,反之未必
对于任意的非空对象x,x.equals(null)会返回false
Interger x = new Interger(3);
Interger x = new Interger(3);
x==y //false
x.equals(y) //true
(int)x == (int) y //true
Interger x = 3;
Interger y = 3;
x==y //true
x.equals(y) //true
总结
本次简要复习了OOP以及相等行为的有关知识