CS61B - Lec 8 - Interface inheritance

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(重载),直接调用相应函数即可。这种方法的缺点在于:

  1. 麻烦
  2. 如果longest有错就得改一大堆
  3. 再想加其他数据类型,还得再重写方法

综上,目前为解决此类问题,推出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形参不同。

@Override
	public 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(重点)

看了两遍终于理解了。

  1. 每个变量声明时会分配static type,不变
  2. 每个变量初始化时会分配dynamic type,会随指针位置变化
  3. 以上前提是dynamic type必须是static的子类
  • It1未重新初始化时
    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)中的方法。

发布了20 篇原创文章 · 获赞 0 · 访问量 170

猜你喜欢

转载自blog.csdn.net/fourier_transformer/article/details/105170835