> 文章列表 > 面向对象编程(进阶)3:方法的重写

面向对象编程(进阶)3:方法的重写

面向对象编程(进阶)3:方法的重写

目录

3.1 方法重写举例

@Override使用说明:

3.2 方法重写的要求

3.3 小结:方法的重载与重写

(1)同一个类中

(2)父子类

3.4 练习


父类的所有方法子类都会继承,但是当某个方法被继承到子类之后,子类觉得父类原来的实现不适合于自己当前的类,该怎么办呢?子类可以对从父类中继承来的方法进行改造,我们称为方法的重写 (override、overwrite)。也称为方法的重置覆盖

在程序执行时,子类的方法将覆盖父类的方法。

3.1 方法重写举例

比如新的手机增加来电显示头像的功能,代码如下:

package com.atguigu.inherited.method;public class Phone {public void sendMessage(){System.out.println("发短信");}public void call(){System.out.println("打电话");}public void showNum(){System.out.println("来电显示号码");}
}
package com.atguigu.inherited.method;//SmartPhone:智能手机
public class SmartPhone extends Phone{//重写父类的来电显示功能的方法@Overridepublic void showNum(){//来电显示姓名和图片功能System.out.println("显示来电姓名");System.out.println("显示头像");}//重写父类的通话功能的方法@Overridepublic void call() {System.out.println("语音通话 或 视频通话");}
}
package com.atguigu.inherited.method;public class TestOverride {public static void main(String[] args) {// 创建子类对象SmartPhone sp = new SmartPhone();// 调用父类继承而来的方法sp.call();// 调用子类重写的方法sp.showNum();}
}

@Override使用说明:

写在方法上面,用来检测是不是满足重写方法的要求。这个注解就算不写,只要满足要求,也是正确的方法覆盖重写。建议保留,这样编译器可以帮助我们检查格式,另外也可以让阅读源代码的程序员清晰的知道这是一个重写的方法。

3.2 方法重写的要求

  1. 子类重写的方法必须和父类被重写的方法具有相同的方法名称参数列表

  2. 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型。(例如:Student < Person)。

注意:如果返回值类型是基本数据类型和void,那么必须是相同

  1. 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限。(public > protected > 缺省 > private)

注意:① 父类私有方法不能重写 ② 跨包的父类缺省的方法也不能重写

  1. 子类方法抛出的异常不能大于父类被重写方法的异常

此外,子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为static的(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法。

3.3 小结:方法的重载与重写

方法的重载:方法名相同,形参列表不同。不看返回值类型。

方法的重写:见上面。

(1)同一个类中

package com.atguigu.inherited.method;public class TestOverload {public int max(int a, int b){return a > b ? a : b;}public double max(double a, double b){return a > b ? a : b;}public int max(int a, int b,int c){return max(max(a,b),c);}
}

(2)父子类中

package com.atguigu.inherited.method;public class TestOverloadOverride {public static void main(String[] args) {Son s = new Son();s.method(1);//只有一个形式的method方法Daughter d = new Daughter();d.method(1);d.method(1,2);//有两个形式的method方法}
}class Father{public void method(int i){System.out.println("Father.method");}
}
class Son extends Father{public void method(int i){//重写System.out.println("Son.method");}
}
class Daughter extends Father{public void method(int i,int j){//重载System.out.println("Daughter.method");}
}

3.4 练习

**练习1:**如果现在父类的一个方法定义成private访问权限,在子类中将此方法声明为default访问权限,那么这样还叫重写吗? (NO)

**练习2:**修改继承内容的练习2中定义的类Kids,在Kids中重新定义employeed()方法,覆盖父类ManKind中定义的employeed()方法,输出“Kids should study and no job.”