接口和父类
在lec8刚开始josh又给我们表演了一个“黑魔法” interface,他刚开始将Alist中所有代码都抄过去让我一度认为interface就是继承中的父类
但是跟gpt交谈interface(接口)和superclass(父类)的区别后我理解了这两个为什么完全是俩东西
接口
接口实际上定义了一组方法的规范 接口中定义了一堆方法,等着我们在 implementing class(实现类)中去override这些方法。
接口继承和实现继承
在接口中我们通过override实现方法叫做接口继承
在接口中利用default关键字来写方法的实现代码,此方法可以被子类继承和重写
下面代码中的print就是一个实现继承:
public interface List61B<Item> {
public void addFirst(Item x);
public void addLast(Item y);
public Item getFirst();
public Item getLast();
public Item removeLast();
public Item get(int i);
public void insert(Item x, int position);
public int size();
default public void print() {
for (int i = 0; i < size(); i += 1) {
System.out.print(get(i) + " ");
}
System.out.println();
}
}
父类
父类与接口不同,父类中可以存储一些属性,而且他里面存储了子类中共性的方法和方法实现的代码。在子类继承父类之后会自动继承其所有的方法,和其初始的属性。
在父类中我们一般用
protected 关键字
去定义父类的属性,这样在父类的属性外部就只能被其子类访问
子类可以对父类的static方法进行overload但不能override:父类中定义的static方法在子类中被继承,可以随时调用,但是不能被重写
但是其可以被重载
例
public class Foo {
public static void bar(int i) {
System.out.println("Foo's bar(int i) is called.");
}
public class FooSub extends Foo {
public static void bar(double d) {
System.out.println("FooSub's bar(double d) is called.");
}
FooSub.bar(1); // 输出:Foo's bar(int i) is called.
FooSub.bar(1.0); // 输出:FooSub's bar(double d) is called.
override overload
override(重写)
指子类重写父类中的方法,具有相同的方法签名(名称和参数类型),以改变方法的实现逻辑。
在继承关系中,子类可以重写父类的方法,以便根据自身的需求提供不同的实现。
重写方法一般使用 @Override
注解来明确其为重写方法,不写不会报错,写上只是为了规范代码和减少拼写错误。
overload(重载)
在同一个类中定义多个具有相同名称但参数类型不同的方法。
这些方法具有相同的名称,但具有不同的 参数类型、 参数数量 或参数顺序。
通过重载方法我们可以便捷的将处理类似问题但具有不同传入参数方法归在一起,方便调用。
方法的签名(signature)
在编程中,方法的签名(signature)指的是方法的唯一标识。它由方法的名称和参数类型组成,用于区分不同的方法。
方法的名称: 方法在代码中的标识符,用于唯一地标识该方法。
参数类型: 方法接受的输入参数的数据类型,包括参数的个数和参数的顺序。
特别注意: 方法的返回值并不属于签名的一部分
思考题
这里第一条不难理解
第二条:因为animal中的sniff被dog重写了,而传入参数是dog所以调用dog中的sniff
第三条:重写后直接调用,跟SLList中的print道理一致
第四条:这是方法的重载,(又有一部分多态的知识,等着再研究)