方法的重写或方法的覆盖(overriding)
- 子类根据需求从父类继承的方法进行重新编写
- 重写时,可以用super.方法的方式来保留父类的方法
- 构造方法不能被重写
方法重写规则
- 方法名相同,参数列表相同
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public class Father { public void method1(){ System.out.println("父类的method1方法"); } }
public class Son extends Father{ public void method1(){ System.out.println("子类的method1方法"); } public static void main(String[] args) { Son son = new Son(); son.method1(); } }
|
输出:子类的method1方法
- 返回值类型相同或者是其子类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public class Father { public Father method1(){ return new Father(); } }
public class Son extends Father{ public Son method1(){ System.out.println("子类重写后的method1方法"); return new Father(); } public static void main(String[] args) { Son son = new Son(); son.method1(); } }
|
输出:子类重写后的method1方法
- 访问权限不能严于父类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public class Father { void method1(){ System.out.println("父类的method1方法"); } }
public class Son extends Father{ public Son method1(){ System.out.println("子类重写后的method1方法"); } public static void main(String[] args) { Son son = new Son(); son.method1(); } }
|
输出:子类重写后的method1方法
- 父类的静态方法不能被子类覆盖为静态方法,父类的非静态方法不能被子类覆盖为静态方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class Father { public static void method1(){ System.out.println("父类的静态method1方法") } }
public class Son extends Father{ public void method1(){ System.out.println("子类重写后的非静态method1方法"); } public static void main(String[] args) { Son son = new Son(); son.method1(); } }
|
输出:报错
- 子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法(注:静态方法中无法使用super)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class Father { public static void method1(){ System.out.println("父类的静态method1方法"); } }
public class Son extends Father{ public static void method1(){ Father.method1(); System.out.println("子类重写后的静态method1方法"); } public static void main(String[] args) { Son son = new Son(); son.method1(); } }
|
输出:
父类的静态method1方法
子类重写后的静态method1方法
- 父类的私有方法不能被子类覆盖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public class Father { private void method1(){ System.out.println("父类的私有method1方法"); } }
public class Son extends Father{ public void method1(){ System.out.println("子类的私有method1方法"); } public static void main(String[] args) { Son son = new Son(); son.method1(); } }
|
输出:子类的私有method1方法
- 不能抛出比父类方法跟多的异常
重载和重写的区别
比较项 |
位置 |
方法名 |
参数表 |
返回值 |
访问修饰符 |
方法重写 |
子类 |
相同 |
相同 |
相同或是其子类 |
不能比父类更严格 |
方法重载 |
同类 |
相同 |
不相同 |
无关 |
无关 |
方法重载:同一个类中同名不同参跟访问修饰符以及返回值类型无关的叫重载
方法重写:在父子类中同名同参,返回值可以和父类返回值相同,可以是子类,访问修饰符只要不严于父类就行。