本文最后更新于 76 天前,其中的信息可能已经有所发展或是发生改变。
1. 方法多用
1. 方法重载overloading
返回sllist中列表中最长的字符串
default public void print() {
for (int i = 0; i < size(); i += 1) {
System.out.print(get(i) + " ");
}
System.out.println();
}
如果我们要让Alist也用这个方法,那我们将SLList <String> list改成AList<String> list即可。
但是:
- 他重复,破坏代码简洁性
- 维护更复杂
- 如果像适用更多类型,就得复制粘贴好几次。
2. 接口继承
因此我们引入了接口继承。关键字:implements
public class AList<Item> implements List61B<Item>{...}
AList 说“我保证我会拥有并定义 List61B 接口中所有指定的属性和行为”
简而言之,就是is-a,a是list61b的一部分,拥有这种关系的我们就可以使用list61b实现。
接口继承其实是蓝图,告诉你要实现的功能有啥,但是不告诉你怎么实现,只要列出来就好了
3. 覆盖overriding
在方法签名上方加上 @Override。
虽然不打上这个标记也能覆盖方法,但是这个标记能够在错误产生时让编译器在程序运行前停止并提示你修正错误。
5. 实现继承
如果要别人继承方法,在编写时需要使用default来指定:
default public void print() {
for (int i = 0; i < size(); i += 1) {
System.out.print(get(i) + " ");
}
System.out.println();
}
动态继承:
当 Java 运行一个被覆盖的方法时,它会在其动态类型中搜索合适的方法签名并执行它,但这对超载(overloaded)不适用。
有点绕哈,举个类型例子:
public static String longest(SLList<String> list)
String在这里是返回类型(return type),表示这个方法会返回一个String类型的值SLList<String>是参数类型(parameter type),表示这个方法接收一个参数,这个参数是SLList<String>类型的
而上边知识点里:
// 假设 Animal 是父类,Dog 是子类
Animal myPet = new Dog();
// 静态类型:Animal(编译时类型)
// 动态类型:Dog(运行时实际类型)
SLList
<String> list = new SLList<String>();
// 静态类型:SLList
<String>
// 动态类型:SLList
<String>(这里通常相同,除非有继承关系)
6. 类继承
关键字:extend