Lec8 - Inheritance 1
- Lec8 - Inheritance 1
- Is an && Has an
- 步骤
- Overriding vs Overloading
- Interface inheritance
- Implementation inheritance
- Static and dynamic type(重点)
Lec8 - Inheritance 1
本章源于一个问题
public static String longest(SLList<String> list) {int maxDex = 0;for (int i = 0; i < list.size(); i += 1) {String longestString = list.get(maxDex);String thisString = list.get(i);if (thisString.length() > longestString.length()) {maxDex = i;}}return list.get(maxDex);}
在WordUtils类中建立longest方法,求list的最长字符串,主函数建立如下:
public static void main(String[] args) {SLList<String> a = new SLList<String>();a.addLast("egg");a.addLast("boyz");System.out.println(longest(a));}
然而,如果现在想换一种数据类型测试,比如AList,直接替换程序会报错,因为longest方法形参类型为SLList。
怎样解决呢?最初想到的应该是再建一个longest方法,形参变为AList。这种函数名相同而形参不同(类型或数量)的称为overload(重载),直接调用相应函数即可。这种方法的缺点在于:
- 麻烦
- 如果longest有错就得改一大堆
- 再想加其他数据类型,还得再重写方法
综上,目前为解决此类问题,推出inheritance(继承)。
Is an && Has an
首先搞清楚继承的定义。
A dog is an animal.
则dog继承于animal
A dog has a leg.
则不能说leg继承于dog
步骤
- Step 1
使用interface关键字,定义父类。
public interface List61B<Item> {public void addLast(Item x);public Item get(int i);public int size();
}
包括SLList, AList除了构造函数之外的所有public方法。此时List61B只作为interface即界面,表明继承类中可以实现的方法。
- Step 2
在继承类中利用implements关键字,表明继承关系
public class AList<Item> implements List61B<Item>public class SLList<Item> implements List61B<Item>
- Step 3
在longest方法中修改形参为父类
public static String longest(List61B<String> list)
此时可以在main方法中随意改变数据类型。
Overriding vs Overloading
如图,这两个概念的区别很简单,函数名两个都相同,override形参相同,overload形参不同。
@Overridepublic void addLast(Item x)
@Override,用来检查typo,有没有都行。
Interface inheritance
以上例子是一个interface inheritance,即父类中只有方法定义,子类中定义方法具体实现。
- Specifies what the subclass can do, but not know
- Subclasses must override all of these methods!
此种继承提供了generalizing code的解决方案。有了List61B中的方法,我们可以加入无数个子类数据类型。
上图答案选d。解释为:
父类定义可分配子类的地址空间。
Implementation inheritance
在父类中用default关键字定义默认方法,在子类中也可进行overload:
default public void print()
很简单
Static and dynamic type(重点)
看了两遍终于理解了。
- 每个变量声明时会分配static type,不变
- 每个变量初始化时会分配dynamic type,会随指针位置变化
- 以上前提是dynamic type必须是static的子类
- It1未重新初始化时
- It1重新初始化时
了解static and dynamic type的定义后,给出如下规律:
- 假设调用对象A的方法M,对象A中同时存在static type X(声明时所得)以及dynamic type Y(初始化时所得)。
如果Y中方法M骑(Override)了X中方法M,则调用Y中方法M。
形参d为Dog类属于Animal,哪种方法都可调用可忽略。主要看调用哪种方法。注意最后一行,flatter方法是overload而不是override,所以调用Animal中的方法。如果仅仅是overload,还是要调用compile-time type(static type)中的方法。