cs61b2018sp WEEK4.1 继承和实现

2022-03-21  本文已影响0人  且乐一杯酒

2022.3.22

WEEK4.1 继承和实现

一、内容

1.重载(overload)

两个方法名字一样,但参数不同


2.父类(Hypernyms——上位词)、子类(Hyponyms——下位词)

is a原则,子类是一种父类


3.接口(Interface)

接口使用可以用有(has a)关系来判断是否使用,比如猫有爪子,就可以实现这个接口
1.注意接口里的方法不能用private修饰,因为接口规定了实现它的类应该实现什么方法,所以方法都应该为可见的。
2.接口里的方法没有函数体,即没有具体实现,而是由实现它的类来编写

那怎么实现呢?

implements关键字
注:接口名后面的<>是泛型,别忘了

4.重写(overriding)

子类和父类有同一个方法名、参数(或者说签名——signatures相同:方法签名 == 方法的名称加参数类型),就为重写


在重写的方法前面加上@Override标签,起到提醒的作用,如果实际上没有成功重写,就不会编译并且抛出错误信息

5.接口继承(Interface Inheritance)

子类必须重写所继承的接口里的所有方法。
定义的一个参数为父类的方法,在使用时可以传子类进去,因为子类是一种(is a)父类

6.实现继承(Implementation Inheritance)

在接口的方法中,我们在前面加上default,就可以给这个方法写函数体,我们可以使用这个接口的其他方法写在这个default函数中。
而在子类中,我们没有重写这个方法,但这个方法也可以被我们使用,相当于进入到了接口去使用这个方法!


7.静态类型和动态类型(Static Type and Dynamic Type)

如下例子,LivingThing为静态类型,声明之后就不会变了,其占用64bit;
而第二行new的Fox为动态类型


如下的第一行把lt1指向的Fox动态类型地址给了a1;第二行把a1指向的动态类型Fox给了有静态类型Fox的h1;
第三行lt1新指向了动态类型Squid

当然,静态类型有如下第一行的别称,动态类型有如下第二行的别称

如果一个动态类型中有一个方法重写了一个静态类型的方法,在使用时会优先使用动态类型中的方法,称为动态方法选择

我们观察如下练习,前三个都好说,都是动态选择,但第四个呢?看起来Dog中有重写的方法



然而用的是接口中的方法



原因很简单,因为Dog中的flatter方法中参数和Animal中的参数不同,这不是重写!而是重载!
上一篇 下一篇

猜你喜欢

热点阅读