1、方法的重写(方法的覆盖)Overriding
定义:方法的重写是基于Java中的继承关系。当一个类继承另外一个类的时候,那么该类(子类/派生类)就拥有了其父类(基类)的成员方法和成员变量。在子类当中,可以创建属于自己独有的成员,如果创建了一个与父类中名称相同、参数列表相同的方法,只是方法体中的实现形式不相同,以实现与父类的功能不相同,这种方式就被称为方法的重写,也被称为方法的覆盖。
注意:如果新的方法覆盖父类中的方法,需要调用父类中的方法时,用super()关键字。该关键字的具体用法以后详细介绍。
重写必须遵循的规则:两同两小一大!
两同:参数列表与方法名相同。
两小:子类的返回值和子类的异常小于父类的返回值与父类产生的异常。
一大:子类的访问修饰符大于父类的访问修饰符。
代码演示:比如我们有一个类叫做Animals,Animals类中有一个叫做Call,然后我们继承Animals又生成了Cat类和Dog类,Cat和Dog也分别有自己特别的叫声。
打印结果:
2、方法的重载 Overloading
定义:方法的重载是指在一个类当中,有多个方法,而且这些方法的名字是相同的,但是参数列表和返回值是不相同,当重载的时候,方法名的名称是被共享的,但是参数类型和参数个数是不相同的,返回值类型可以相同也可以不相同。
注意:我们不能根据返回值的类型来判断方法是否重载。
方法的重载分为构造方法的重载和普通方法的重载。
举个现实生活中的实例。假如你是个木工,我要让你制作桌子(返回值)。然后,我给了你紫檀木,你就可以制作一张紫檀桌子;我给了你黄花梨,你可以做黄花梨的桌子。这些不同材质的木料,就是参数。返回的都是桌子,但是具体使用哪个函数,就根据传入的木料不同来决定的。所以,可以根据所传递进来的不同参数,决定具体调用哪个函数。
重载的规则:
1、参数列表不相同
2、方法的访问修饰符可以不相同
3、抛出的异常可以不相同
代码演示如下:用来比较两个数值的大小。
打印结果: 分析:在上述的代码当中,方法1和方法2只是参数列表不相同,故是方法的重载,而方法1和方法4的参数列表相同,但是返回值类型不同,故不是方法的重载,方法1(2)和方法3的参数列表不同,访问修饰符也不同,故构成方法的重载。因此,看是否是方法的重载,关键在于参数列表的相同与否!
总结:
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。
重写是外壳不变,核心变。也就是说方法名不变,参数不变,具体实现可以改变。一般是在父类中声明方法,在子类中重写。
重载是方法名不变,但参数一定要变。而且重载的方法一般都写在一个类中。用一张图来表示区别如下:
区别点 | 方法的重写 | 方法的重载 |
参数列表 | 一定不可以修改 | 必须修改 |
返回值类型 | 一定不可以修改 | 可以修改 |
异常 | 可以减少或者删除,但是不可以抛出新的异常或者更广的异常 | 可以修改 |
访问 | 一定不可以做更加严格的限制(可以降低限制) | 可以修改 |