Hypernyms 和 Hyponyms

我们可以说:

  • “狗”是“贵宾犬”的 hypernym(上位词)
  • “哈士奇“是”狗“的 hyponyms(下位词)

这样的层级关系也适用于 Java:

  • 如果 SLList 是 List61B 的下位词(hyponyms),那么 SLList 类是 List61B 类的 子类(subclass) ,而 List61B 类是 SLList 类的 超类(superclass) 。
    Pasted image 20260318210848

并且,子类和超类必须形成一种 “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
2
3
4
5
6
7
8
9
10
11
12
13
public interface Deque<T> {  
void addFirst(T item);
void addLast(T item);
int size();
void printDeque();
T removeFirst();
T removeLast();
T get(int index);

default boolean isEmpty() {
return size() == 0;
}
}
  • isEmpty 方法属于 implements inheritance,也就是在接口定义时就写好了这个方法具体的实现。
  • 其他的都属于 interface inheritance,需要分别在被它继承的类中编写具体的实现。

具体操作:如何完成这种层次结构

1. 定义接口

新的 List61B 就是 Java 所称的 接口(Interface)

1
2
3
4
5
public interface List61B<Item> {
void addFirst(Item x);
Item get(int i);
int size();
}

在里面不需要写具体实现,只需要写方法的声明(这被称作 interface inheritance)

2. 让子类实现接口

使用 implements 关键字来让具体的类和接口建立关系

1
2
public class SLList<Item> implements List61B<Item>
public class AList<Item> implements List61B<Item>

implements List61B<Item> 本质上是一种承诺,表示“我保证将拥有并定义 List61B 接口中指定的所有属性和行为"

3. 实现接口方法

在子类中实现所需函数时,在方法签名顶部包含 @Override 标签

@Override 标签对于 interface inheritance 来说加与不加都没有任何影响,但出于各种保护性以及可读性考虑建议添加

1
2
3
4
@Override
public void addFirst(Item x) {
// ...
}

4. Declaration 和 instantiation

1
List61B<String> list = new SLList<>();