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中的参数不同,这不是重写!而是重载!







网友评论