CS61B - Lec 8 - Interface inheritance

news/2024/10/19 23:25:05/

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

  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形参不同。

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

看了两遍终于理解了。

  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)中的方法。


http://www.ppmy.cn/news/239805.html

相关文章

026FLEX

flex布局 CSS3弹性盒子(Flexible Box或Flexbex)&#xff0c;是一种用于在页面上布置元素的布局模式&#xff0c;使得当页面布局必须适应不同的屏幕尺寸和不同的显示设备时&#xff0c;元素可预测地运行/列。对于许多应用程序&#xff0c;弹性盒子模型提供了对块模型的改进&…

LEXSTR

题目链接&#xff1a;http://www.spoj.com/problems/LEXSTR/ 题意是给一个字符串str&#xff0c;然后给出m个数对 i , j&#xff1b; 代表str[i] 和 str[j] 可以互相之间交换任意次 &#xff0c;然后问如何交换使得这个字符串的字典序最小&#xff0c;输出这个字典序最小的字符…

CS61B - Lec 21 - Binary Search Tree

Lec 21 - BST Binary Search Trees概念查找插入删除 从Lec20开始&#xff0c;就转战CS61B Spring 2019了&#xff0c;18后面全变成公开课了。 本章主要讲的是Binary Search Tree&#xff0c;是一种非常流行的数据结构&#xff0c;据说各大面试中都会出现。其中用到了超多的recu…

Lex正则表达式

字符 解释 . 匹配除换行符("/n")以外的任何单个字符 * 匹配前面表达式的零个或多个拷贝 [] 匹配括号中的任意的字符类 ^ 作为正则表达式的第一个字符匹配行的开头 $ 作为正则表达式的最后一个字符匹配行的结尾 {} …

lex yacc

http://www.linuxdiyf.com/viewarticle.php?id91568 作者&#xff1a;绚丽也尘埃 最近看《GCC-the-Complete-Reference-fly》才知道有lex和yacc这两个有趣的工具&#xff0c;并且fedora core 8也默认安装有这两个工具&#xff0c;所以趁此机会学习一下&#xff0c;以前学编译…

lex与yacc之lex符号表示例

在lex初探篇中&#xff0c;每次要定义新的单词&#xff0c;都需要重新编译&#xff0c;这是非常麻烦的。但是如果在词法分析程序运行时能够构建一个单词表&#xff0c;那么就可以在 添加新的单词时不用修改和重新编译lex程序。symboltable.l%{/** Word recognizer with a symbo…

linux下lex词法分析器,Lex词法分析器

LEX/FLEX词法分析器 CONTENTS: [TOC] 这篇文章的内容包括: lex语法格式 linux下flex的安装和使用 flex实例 flex源代码的编译和使用 Lex/Flex词法分析器 Lex是LEXical compiler的缩写,是Unix环境下非常著名的工具,主要功能是生成一个词法分析器(scanner)的C源码,描述规则采用…

flex RSL

RSL(Runtime shared libraries)即动态链接库&#xff0c;在程序运行时由FlashPlayer动态加载。静态链接库是SWC文件&#xff0c;通过编译器的library-path和include-libraries编译进应用程序。采用静态链接的应用程序SWF会产生比较大的文件以及更长的下载时间。使用RSL的应用程…