53.方法重写深入
方法重写规则
- 方法名相同
- 参数列表相同
- 返回值类型相同或者是其子类
子类方法返回值类型可以是父类返回值类型的子类,也是方法重写
- 访问权限不能严于父类
子类重写方法不可以比父类方法访问权限小。但是可以扩大方法的访问权限
子类方法只要访问权限不严于父类,就构成了方法重写
- 父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法
(父类的静态方法不能重写为非静态方法,父类的非静态方法也不能被重写为静态方法)
- 子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法(注:静态方法中无法使用super)
子类可以定义和父类返回值一样的静态方法(非重写)
在静态方法中不能使用super
- 父类的私有方法不能被子类覆盖
子类无法重写父类的private方法(非重写)
- 不能抛出比父类方法更多的异常
重载:
同一个类中过的同名不同参的方法构成方法重载(方法中参数不同)
//父类Father类
public class Father {
void m1(){
System.out.println("父类的m1方法");
}
//方法返回值类型可以是自定义的数据类型
public Father m2(){
System.out.println("父类的m2方法");
return new Father();
}
public static void m3(){
System.out.println("父类的静态方法m3");
}
private void m4(){
System.out.println("父类的私有方法m4");
}
}
//子类Son类
public class Son extends Father{
//同一个类中过的同名不同参的方法构成方法重载
//子类重写方法不可以比父类方法访问权限小。但是可以扩大方法的访问权限
//子类方法只要访问权限不严于父类,就构成了方法重写
public void m1(){
System.out.println("子类重写后的m1方法");
}
//方法m1重载(参数不同)
public String m1(int num1){
return "test";
}
//子类方法返回值类型可以是父类返回值类型的子类,也是方法重写
public Son m2(){
System.out.println("子类重写父类后的m2方法");
return new Son();
}
/*//父类的静态方法不能重写为非静态方法,父类的非静态方法也不能被重写为静态方法
public void m3(){
System.out.println("子类的非静态方法m3");
}*/
//子类可以定义和父类返回值一样的静态方法(非重写)
public static void m3(){
/*//在静态方法中不能使用super
super.m3();*/
Father.m3();
System.out.println("子类的静态方法m3");
}
//子类无法重写父类的private方法(非重写)
public void m4(){
System.out.println("子类的私有方法m4");
}
public static void main(String[] args) {
Son son=new Son();
son.m1();
son.m2();
}
}