目录
一、方法重写的概念
二、入门案例
三、使用细节
第一条
第二条
第三条
一、方法重写的概念
方法覆盖(重写)就是子类有一个方法,和父类的某个方法的名称、返回类型、参数一样,那么我们就说子类的这个方法覆盖了父类的方法
注释:包括直接继承和简介继承,如果C继承B,B继承A,在子类-C类中的某个方法和爷爷类-A类中的某个方法满足以上条件,也是方法重写
二、入门案例
父类
package com.hspedu.override_;
public class Animal {
public void cry() {
System.out.println("动物叫唤...");
}
}
子类
package com.hspedu.override_;
public class Dog extends Animal{
public void cry() {
System.out.println("小狗汪汪叫...");
}
}
分析:1.因为Dog是Animal的子类;
2.Dog的cry方法和Animal的cry方法定义一样(名称、返回类型、参数)
3.此时可以说Dog的cry方法,重写了Animal的cry方法
测试
package com.hspedu.override_;
public class Override01 {
public static void main(String[] args) {
//演示方法重写的情况
Dog dog = new Dog();
dog.cry();
}
}
根据继承查找原则,此时会调用子类Dog的cry()方法
如果注销了子类-Dog类的cry()方法,则会调用父类Animal的cry()方法
三、使用细节
第一条
子类中方法的形参列表、方法名称要和父类中方法的形参列表、方法名称完全一样
解释:上述案例中如果把Dog类的cry()方法的方法名改成cry2();或者把形参改成cry(String name)那么方法重写就不存在了
第二条
子类方法的返回类型要和父类方法的返回类型一样,或者是父类返回类型的子类
比如父类返回类型是 Obiect ,子类方法返回类型是String
父类:
package com.hspedu.override_;
public class Animal {
public void cry() {
System.out.println("动物叫唤...");
}
public Object m1(){
return null;
}
}
子类
package com.hspedu.override_;
public class Dog extends Animal{
public void cry() {
System.out.println("小狗汪汪叫...");
}
//String是Object的子类
public String m1() {
return null;
}
}
String是Object的子类,所以此时也构成重写
如果反过来,子类中的方法返回数据类型是Object,父类是String
父类
package com.hspedu.override_;
public class Animal {
public String m2() {
return null;
}
}
子类
package com.hspedu.override_;
public class Dog extends Animal{
public Object m2() {
return null;
}
}
此时IDEA会报错:'m2()' in 'com.hspedu.override_.Dog' clashes with 'm2()' in 'com.hspedu.override_.Animal'; attempting to use incompatible return type
即:子类的m2()和父类的m2()试图使用不兼容的数据类型
进一步举例说明
1)在Dog.java文件中创建类AAA和BBB,并让BBB继承AAA
2)在父类-Animal中创建方法m3(),返回数据类型是AAA
3)在子类Dog中也创建同名方法m3(),其返回数据类型只能是AAA或者BBB(因为BBB是AAA的子类),如果是其他返回数据类型,IDEA会把报错
子类
package com.hspedu.override_;
public class Dog extends Animal{
}
}
class AAA{
}
class BBB extends AAA{//AAA的子类
}
父类创建m3()方法
package com.hspedu.override_;
public class Animal {
public AAA m3() {
return null;
}
}
在子类中创建同名方法,其返回数据类型只能是AAA或者BBB
package com.hspedu.override_;
public class Dog extends Animal{
//此处的返回数据类型可以是AAA,或者BBB,构成重写
public BBB m3(){
return null;
}
}
class AAA{
}
class BBB extends AAA{//AAA的子类
}
package com.hspedu.override_;
public class Dog extends Animal{
//此处的返回数据类型可以是AAA,或者BBB,构成重写
public AAA m3(){
return null;
}
}
class AAA{
}
class BBB extends AAA{//AAA的子类
}
如果是其他返回数据类型则会报错
第三条
子类方法不能缩小父类方法的访问权限(只能相等或者扩大)
即子类的访问权限不能低于父类:
如果父类是public,子类不能是protected 、默认 、 private
父类
子类只能是public
attempting to assign weaker access privileges ('private'); 试图分配较弱的访问权限
如果父类是protected,子类不能是默认和 private
如果父类是默认,子类不能是 private
如果父类是private,那么子类四种都可以
四个访问修饰符的访问权限:public > protected > 默认 > private