(1)方法的重写:
在Java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征样的一种,继承了父类所有的方法和变量。子类可以定义新的特征,当子类需要修改父类的一些方法进行扩展,增大功能,程序设计者常常把这操作方法称为重写,也叫称为覆写或覆盖。注意:方法的重写是指子类中的方法与父类中继承的方法有完全相同的返回值类型、方法名、参数个数以及参数类型。
举例:
//父类
public class Rewrite1 {
public void info() {
System.out.println("输出父类:我来自重庆");
}
}
//子类
public class Rewrite2 extends Rewrite1 {
public void info() {
System.out.println("输出子类:我来自北京");
}
}
//测试类
public class RewriteTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Rewrite2 s = new Rewrite2();
s.info();
}
}
输出结果: 输出子类:我来自北京
分析:在子类中,由于将输出语句改变,覆盖了父类的同名方法,在测试类运行时,是直接执行的子类中的重写的方法。
问题:如果我们想调用父类中的方法可以吗?可以的,用super关键字即可。例如:我们将子类代码块加上一条super.info()语句,从子类调用父类未被重写的方法,如下:
//子类
public class Rewrite2 extends Rewrite1 {
public void info() {
super.info();
System.out.println("输出子类:我来自北京");
}
}
修改后的输出结果如下
输出父类:我来自重庆
输出子类:我来自北京
方法重写的规则:
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。 即外壳不变,核心重写!
重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常IOException,但是在重写这个方法的时候不能抛出Exception异常,因为Exception是IOException的父类,只能抛出IOException的子类异常。
1)参数列表必须完全与被重写方法的相同;
2)返回类型必须完全与被重写方法的返回类型相同;(备注:这条信息是标准的重写方法的规则,但是在java 1.5 版本之前返回类 型必须一样,1.5(包含)j 版本之后ava放宽了限制,返回类型必须小于或者等于父类方法的返回类型 )。才有了
子类返回类型小于等于父类方法返回类型。在java里面这个怎么样都是正确的,请小伙伴谨记。
3)访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法 就不能声明为protected。
4)父类的成员方法只能被它的子类重写。
5)声明为final的方法不能被重写。
6)声明为static的方法不能被重写,但是能够被再次声明。
7)子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
8)子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法。
9)重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者 比被重写方法声明的更广泛的强制性异常,反之则可以。
10)构造方法不能被重写。
11)如果不能继承一个方法,则不能重写这个方法。
举个例子:问下面代码块编译能否通过?
//父类
public class Rewrite1{
public void info() throws NullPointerException{
System.out.println("输出父类:我来自重庆");
}
}
//子类
public class Rewrite2 extends Rewrite1 {
public void info() throws Exception {
System.out.println("输出子类:我来自北京");
}
}
答案:不能,因为NullPointerException异常是Exception异常的子类,违法了重修的规则。
(2)方法的重载:
所谓方法重载是指在一个类中,多个方法的方法名相同,但是参数列表不同。参数列表不同指的是参数个数、参数类型或者参数的顺序不同。方法的重载在实际应用中也会经常用到。不仅是一般的方法,构造方法也可以重载。下面通过一个实例来分析。
举例:
public class Overload {
public static void main(String[] args) {
stuinfo("张先生");
stuinfo("张先生",99);
}
public static void stuinfo(String name){
System.out.println("姓名:"+name);
}
public static void stuinfo(String name,int age){
System.out.println("姓名:"+name+"->年龄:"+age);
}
}
输出结果:
姓名:张先生
姓名:张先生->年龄:99
(3)方法重写与方法重载的区别
区别点 | 重载 | 重写(覆写) |
英文 | Overloading | Overiding |
定义 | 方法名称相同,参数的类型或个数不同 | 方法名称、参数类型、返回值类型全部相同 |
对权限没有要求 | 被重写的方法不能拥有更严格的权限 | |
范围 | 发生在一个类中 | 发生在继承类中 |