3.16 接口、抽象类、具体类
- 对象:拥有状态(字段)和行为(方法)。
- 接口:一种用于设计和表达ADT的语言机制,方法的列表。
(1)一个接口可以扩展其他接口
(2)一个类可以实现多个接口,一个接口也可以有多个实现
(3)接口中不能包含构造函数,必须调用实现类的构造函数 - 抽象类:至少包含一个抽象方法的类
- 具体类:不包含抽象方法的类
3.17 继承、override
- 继承(extends):用于代码重用,超类的方法在子类中隐式可用
- 扩展(implements):用于多态,子类可代替父类
- 重写:为父类中已经提供的方法提供具体实施
3.18 多态、overload
-
多态:指为不同类型的实体提供一个接口,或者使 用一个符号来表示多个不同的类型。
三种多态: 1. 方法重载:一个函数可以 有多个同名的实现 2. 泛型编程:一个类型名字可 以代表多个类型 3. 子类型: 一个变量名字可以代表多个类的实例
-
重载:保有相同方法名,可以有不同参数,方法的重载可以在此类也可以在子类
3.19 泛型
数据类型和函数根据待指定的类型编写,在需要时作为参数提供的特定类型实例化。
- 四种使用方式:泛型类声明、泛型接口声明、泛型方法声明、泛型构造函数
- 泛型类:声明了一个或多个类型变量的类,类型变量用<>括起
- 通配符:通常用 * 或 ? 表示,如List<?> 或 List<? extends Animal>
(1)ArrayList 是List 的子类型
(2)List 不是List 的子类型
(3)List 是List<? extends Object> 的子类型
(4) List 是List<? super String> 的子类型
3.20 等价性equals()和==
- 判断等价的三种方式:抽象函数、等价类、外部观察角度(对两个对象的任何同一操作都会得到相同的结果)。
- equals()和==
https://www.cnblogs.com/smyhvae/p/3929585.html
(1)== :比较地址空间,判断引用是否相等。
基本数据类型,用==,独立空间存储,且不支持equals()
(2)equals():两个对象内部是否相等
3.21 hashCode()
- hashCode约定:
(1)只要比较操作用到的信息没有被修改,那么对这同一个对象调用多次,hashCode()方法必须始终返回相同整数。但不要求程序的多次执行时相同。
(2)如果equals比较相等,则要求hashcode相等;如果equals不等,则hashcode是否相等均可,但最好不等(提升性能)。 - 重写规则
(1) 两个对象equals操作相等,则hashcode必须相等。因此,重写equals时,必须重写hashCode。
(2) 能够提升性能(避免了调用不必要的equals操作)。
(3) 构造hashcode时考虑对象的所有字段,以避免不相等对象产生相同hashcode。
(4) 除非对象可变,否则hashcode不能修改。 - 方法
(1)最简单方法:让所有对象的hashCode为同一常量,符合contract,但降低了hashTable效率
(2)通过equals计算中用到的所有字段的hashCode组合出新的hashCode。
(3)使用程序方法Objects.hash():此方法可以根据多个字段生成hashcode
3.22 可变对象的观察等价性、行为等价性
- 观察等价:在不改变对象状态的情况下(不使用mutator),无法区分对象。
- 行为等价:改变一个对象而不改变另外一个时,仍然无法区分对象,判断引用。
观察等价有潜在危险,可变对象作为集合元素的时候,对象值的变化会对相等比较产生影响。