红魔咖啡馆

头发越掉越多,头发越掉越少

0%

【CS61B】Lec8-Interface & Inheritance

Interface & Inheritance

重载

Java允许多个方法拥有相同名称,只要他们的参数不同,这就是Java中的重载

重载的优缺点:

  • 代码基本一样
  • 对其余猎豹不适用,需要增加重载
  • 难维护

Hypernym and Hyponym

上位词与下位词

如Dog与poodle、malamute等狗的品种,前者为后者的上位词,后者为前者的下位词

Java中也有类似的概念,如我们可以把List作为SLList与ArrayList的上位词

在Java中表示这种属性:

  1. 给上位词定义一个引用属性
  2. 指定某些词为该上位词的下位词
  • 使用关键词interface来定义上位词
  • 使用关键词implements来定位下位词

接口内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package lec8;

public interface List61B<T> {
    public void addFirst(T x);

    public void addLast(T x);

    public T getFirst();

    public T getLast();

    public T get(int i);

    public T removeLast();

    public int size();
}

下位词部分修改:

1
2
3
4
public class ArrayList<T> implements List61B<T>
    ...
public class SLList<T> implements List61B<T>
    ...

这样在使用时我们只需要以该接口作为类型定义即可

重写

若你有一个子类实现接口,其方法与超类的签名相同,则可以在子类中重写来覆盖该方法

有相同名称而不同签名的方法叫做重写

在要重写的方法上面添加@override标签,当该方法不是一个重写方法时,该代码不会被编译

使用该标签的优点:

  • 主要优点:防止拼写错误,当标记了@override,但方法并没有被重写,就会爆CE
  • 提醒程序员方法来自于更高级的继承

Interface Inheritance

使用implements关键字来指定子类所具备的能力叫作接口继承

  • 接口:所有方法签名的列表
  • 继承:子类继承了来自超类的接口
  • 接口继承指定了子类可以做什么,而没有指定怎么做
  • 子类必须重写所有方法,否则会CE

Implementation Inheritance

接口继承只继承了签名,而没有继承实现

Java允许另一种继承:实现继承,使得子类可以继承签名与实现

使用default关键字来指定一个子类可以从接口继承的方法

1
2
3
4
5
6
7
// implementation inheritance
    default public void print(){
        for (int i = 0;i<size();i++){
            System.out.print(get(i)+" ");
        }
        System.out.println();
    }

(在接口文件中写默认的print方法,子类可以继承该方法)

1
2
3
4
5
6
7
8
9
// 重写接口中的print方法
   @Override
   public void print(){
       IntNode p = sentinel.next;
       while(p!=null){
           System.out.print(p.item+" ");
           p = p.next;
       }
   }

(针对特定子类,可以对default方法进行重写)

Abstract Data Type

抽象数据类型(ADT)仅由其操作定义,而不由其实现定义