Hypernyms 和 Hyponyms
我们可以说:
- “狗”是“贵宾犬”的 hypernym(上位词)
- “哈士奇“是”狗“的 hyponyms(下位词)
这样的层级关系也适用于 Java:
- 如果 SLList 是 List61B 的下位词(hyponyms),那么 SLList 类是 List61B 类的 子类(subclass) ,而 List61B 类是 SLList 类的 超类(superclass) 。

并且,子类和超类必须形成一种 “is-a“关系,而不是"has-a“关系:
- a poodle “is-a” dog
- a dog “is-a” canine
Interface inheritance 和 Implements inheritance
- Interface inheritance:告诉子类应该能够做什么
- 子类 继承 所有方法签名,但 不包含 实现
- 在子类中使用
@Override标签
- Implements inheritance:告诉子类它们应该做什么
- 子类 继承 所有方法签名,并 包含 实现
- 在超类中使用
default关键字- 如果子类不想用超类定义的这个方法,则只需要在具体子类中定义相同名字的方法,再使用
@Override标签
- 如果子类不想用超类定义的这个方法,则只需要在具体子类中定义相同名字的方法,再使用
例如下面某个接口:
1 | public interface Deque<T> { |
isEmpty方法属于 implements inheritance,也就是在接口定义时就写好了这个方法具体的实现。- 其他的都属于 interface inheritance,需要分别在被它继承的类中编写具体的实现。
具体操作:如何完成这种层次结构
1. 定义接口
新的 List61B 就是 Java 所称的 接口(Interface)
1 | public interface List61B<Item> { |
在里面不需要写具体实现,只需要写方法的声明(这被称作 interface inheritance)
2. 让子类实现接口
使用 implements 关键字来让具体的类和接口建立关系
1 | public class SLList<Item> implements List61B<Item> |
implements List61B<Item> 本质上是一种承诺,表示“我保证将拥有并定义 List61B 接口中指定的所有属性和行为"
3. 实现接口方法
在子类中实现所需函数时,在方法签名顶部包含 @Override 标签
@Override 标签对于 interface inheritance 来说加与不加都没有任何影响,但出于各种保护性以及可读性考虑建议添加
1 |
|
4. Declaration 和 instantiation
1 | List61B<String> list = new SLList<>(); |