1. OOP面向对象编程
1.1接口,抽象类,具体类
抽象类:具有抽象方法的类;抽象类不能实例化。一个类至少包含一个抽象方法。
抽象接口:只含有抽象方法的抽象类。
具体类:ADT中的所有方法都必须实现。一个类可以实现多个接口。
接口中的属性默认是public static final的,不能具有构造方法,也要符合ADT中的条件。
接口中的构造函数可以通过static编写的工厂方法实现,用于在接口中直接创建一个示例。
在接口中添加方法可以用default方法实现。
总的来说,接口用于规定方法,而类用于实现方法。
//接口实例
interface CharSet{
public int add(char x);
public boolean find(char x);
}
//客户端代码
CharSet set =ArraySet();
set.add("a");
1.2 继承 override
public void A extends B{ //继承
......
}
Override的要求
在子类中如果想对父类的方法进行重写,有以下几个要求
重写的函数需要与被重写的函数有着同样的签名。
在执行的时候调用哪个方法,在运行的时候才会被决定。就是说如果调用父类中的方法就是调用父类,子类就是子类。
我们通过观察被冲写的父类型的函数体的特点可以作出以下总结:
如果父类型中的被重写函数体不为空,那就意味着对其大多数子类型来说,该方法是可以被直接复用的。
对某些子类型来说,有自己的特殊性,所以重写父类型中的函数,实现自己的特殊要求
如果父类型中的某个函数实现体为空,意味着其所有子类型都需要这个功能,但各有差异,没有共性,在每个子类中均需要重写。
子类对象 instanceof 可转换为父
1.3 重载 overload
重载(overload)机制使得同一个类中的多个方法可以有相同的名字,前提是它们
有长度不同的参数列表,或者对应不同的参数类型,起码,得让编译器在进行静态
检查的时候通过你调用时传入的参数判断实际上应该选择哪个方法。重载也可以发
生在父类与子类之间(子类重载父类的方法)。
func1
func
多态
特殊多态
一个方法可以有好几个同名的实现方式,在很多编程语言中,特殊多态被一种叫方法重载的形式支持。
参数化多态
代码的参数不被限制于特定的数据类型而进行的编程,也就是说一个类型名字可以代表多个类型。参数化多态更为熟知的叫法叫泛型编程。
子类型多态
一个变量的名字可以代表多个类的实例,继承 重写
1.4泛型
如果一个接口声明了一个或多个类型变量,那么它就是泛型的。
这些类型变量称为接口的类型参数。
它定义了一个或多个作为参数的类型变量。
通用接口声明定义了一组类型,每个类型参数部分的可能调用都有一个类型。
所有参数化类型在运行时共享相同的接口。
无任何继承关系(不可协变)
1.5 等价性与equals()
观察等价性:两个对象通过AF映射到相同的抽象值或两个
对象能做出效果相同的行为
行为等价性:调用对象的任何方法都展示出一致的结果,基本相当于= =。
可变类型倾向于看它严格的观察等价性,但是有些时候观察等价性会导致RI出现问题:
当可变类型放入set这种集合类中,当它变化时,hashcode随之改变,set直接就找不到了。
因此对于这种可变类型我们可能不要求重写equals()。
对于StringBuilder我们一般常看它的行为等价性。
1.6hashcode()
在重写equals()时,我们也要重写hashcode()。
由于java的规定,等价的两个对象必须要有相同的哈希值,同时尽可能使得不等价的对象的哈希值不同。哈希值是跟对象一一对应的。
hashCode()一般用在基于哈希表的集合类中(HashMap、HashSet)。查找一个对象时,
先通过hashCode直接找到对象对应的桶,再在桶里一个个用equals比较。
总之要根据对象的特性写出不同的hashcode()。