3.4面向对象的编程
一.一些基本概念
1.静态成员和实例成员
2.接口:
接口是用来确定ADT规约的,所以接口中只能有供用户使用的方法,不能存在构造函数
(1)接口之间可以继承和扩展
(2)一个类可以实现多个接口
(3)一个接口可以有多个实现类
*另外要注意,接口的返回值也是虚拟的,不能存在具体实现,此处有考点:改接口的代码
3.继承和重写:
(1)严格继承:
所有的子类只能添加新的方法,不能对原有父类的方法进行重写
(注意:final类型的不能被继承和重写)
(2)重写:
就是对父类的方法进行改进,但是注意重写不能改变方法的本意
在实际执行的时候,到底执行子类的方法还是父类的方法要看数据的类型,执行相同类型的那个方法
(3)子类和父类的方法分:
这里直接举一个例子:那种多数子类中都需要用到的方法就直接放在父类中就好了
4.多态:
多态的分类:
(1)特殊多态(重载–overloading):
就是用一个方法名实现不同的方法
要求:参数类型必须是不同的,其他的都随意
*重载(overloading)和重写(overriding)是不一样的:
重写必须保证:
a.修改后必须有比父类还强的实现
b.参数类型和返回值都不能改变
考点:判断overloading和overriding是否合法
(注意:interface类型不能被实例化)
(2)参数化多态(泛型):
在运行过程中,根据不同的实现,给类赋不同的值(用< >表示)
(3)子类型:
表示有层次的类型网络(也就是子类和父类的关系)
3.5ADT和OOP中的等价性
一.等价性
等价关系:自反性,传递性,对称性
二.immutable类型的对象判断等价性
1.从AF的角度:
if f(a) = f(b) 则a和b等价(AF映射到相同的结果)
2.用obsrevation判定(方法返回的结果)
在用户的角度,对两个对象调用任何相同的操作,都会得到相同的结果,则可认为两个对象等价
考点:两种方法可能会出现不同的判断结果
3.== 和 equals()方法
(1)双等号:
利用等价性,如果两个引用指向同一个对象才判定为相等
*非常严格的判定,基本只用于基本数据类型
(2)object类中为我们提供了equals()方法
我们可以通过重写(overriding)equals()方法实现我们自主判定等价性
(3)判断equals()方法是否合理的一些条件:
a.是否满足等价关系
b.除非对象被修改,否则多次调用equals()方法应该为同样的结果(不能一天一个样)
c.“相等”的对象,hashcode()的值必须一样
d.不能和“空”判定相等
(4)hashcode()
注意:
a.所有对象可以使用同一hash值,但是会影响效率
b.等价的对象必须有相同的hash值
c.重写equals()方法的时候也要保证hashcode()的值必须一样
三.mutable类型的对象判断等价性
因为mutable的可变性,我们一般都用行为等价性判断(也就是类似于双等号)
反之,判断immutable的时候我们偏向于观察等价性(也就是重写overriding)
*clone()方法:
x.clone() != x;
x.clone().getclass() == getclass();
x.clone().equals(x);