遵守合约:覆盖的规则
视频锁定
{$ currentTime | date:'mm:ss' $}
{$ timeLeft | date:'mm:ss' $}
当你要覆盖父类的方法时,你就得同意要履约。比如,这个合约表示“我没有参数且返回布尔值”。因此,你所覆盖的方法就必须没有参数且返回布尔值。
方法就是合约的标志。
如果多态运行无误的话,Toaster版覆盖Applicance的方法就会在运行期运行。记住编译器会寻找引用类型来决定你是否可以调用该引用的特定方法,但在执行期,Java虚拟机寻找的并不是引用所指的类型,而是在堆上的对象,因此若编译器已经同意这个调用,则唯一能够通过的方法是覆盖的方法也有相同的参数和返回类型。不然的话,就算Toaster有个取用int版本的turnOn(),还是会以Appliance引用来调用没有参数的版本,到底运行期会调用哪个版本?答案是Appliance的那一个版本,换句话说,在Toaster中的turnOn(int level)这个方法并没有覆盖掉Appliance的版本!
参数必须要一样,且返回类型必须要兼容
父类的合约定义出其他的程序代码要如何来使用方法,不管父类使用了哪种参数,覆盖此方法的子类也一定要使用相同的参数。而不论父类声明的返回类型是什么,子类必须要声明返回—样的类型或该类型的子类。要记得子类对象得保证能够执行父类的一切。
不能降低方法的存取权限
这代表存取权必须相同,或者更为开放。举例来说,你不能覆盖掉一个公有的方法并将它标记为私有。这会让它以为在编译期通过的是个公有,然后突然在执行期才被Java虚拟机阻止存取。
在线练习
{$ activeFileHint $}