一、方法重写(Override)
在Java中如何来定义重写:Java程序中类的继承特性可以产生一个子类,子类继承父类就拥有了父类的非私有的属性(方法和变量),在子类中可以增加自己的属性(方法和变量),同时也可以对父类中的方法进行扩展,以增强自己的功能,这样就称之为重写,也称为复写或者覆盖。所谓方法重写就是子类的方法和父类中继承下来的方法具有完全相同的方法名、返回值类型、方法的参数个数以及参数类型,这样才能被称为方法重写。
代码体现:
// 这是父类的定义 public class Person { public void eat() { System.out.println("=====这是父类Person的eat方法======="); } } // 这是子类的定义 public class Student extends Person { @Override public void eat() { System.out.println("===这是子类Student的eat方法==="); } // main方法测试 public static void main(String[] args) { Student student = new Student(); student.eat(); //输出:===这是子类Student的eat方法=== } }
子类重写父类的方法后,在实例化子类的时候则调用的是子类中的方法,父类的方法就如同被覆盖了一样。如果在子类中需要调用父类的方法,则在子类方法中使用super关键字调用父类的方法,格式:super.父类中的方法名(参数列表)。
重写规则:
在进行方法重写的时候需要遵循以下规则才能实现方法重写:
(一)子类方法的参数列表必须和父类中被重写的方法的参数列表相同(参数个数和参数类型),否则只能实现方法的重载。
(二)子类方法的返回值类型必须和父类中被重写的方法返回值类型相同,否则只能实现方法重载。
(三)在Java规定,子类方法的访问权限不能比父类中被重写的方法的访问权限更小,必须大于或等于父类的访问权限。
(四)在重写的过程中,如果父类中被重写的方法抛出异常,则子类中的方法也要抛出异常。但是抛出的异常也有一定的约束--->子类不能抛出比父类更多的异常,只能抛出比父类更小的异常,或者不抛出异常。例如:父类方法抛出Exception,那么子类就只能抛出IOException或者抛出比Exception小的异常或者不抛出异常。
二、方法重载(Overload)
在Java中如何定义重载:在Java中通过在类中写多个方法,这类方法的方法名相同,方法的参数列表不同(参数的个数和参数类型的不同)来事现方法的重载。所谓方法重载就是:在一个类中,有一系列的方法具有方法名相同,但参数列表不同,这类方法的现就是方法重载。注意构造方法也可以重载。
代码体现:
// 这是父类的定义 public class Person { /* * protected void eat() throws Exception{ * System.out.println("=====这是父类Person的eat方法======="); } */ public Person() { System.out.println("这是无参构造方法"); } public Person(String name) { System.out.println("这是有一个参数的构造方法参数name=" + name); } void print() { System.out.println("====无参print方法===="); } void print(String str) { System.out.println("====有一个参数的print方法===="); } void print(String str, int a) { System.out.println("====有两个参数的print方法===="); } }
在对象调用这些方法的时候,Java VM会根据不同的参数列表来执行不同的方法体,这就是多态的一种体现。
重载规则:
在进行方法重载的时候需要遵循以下的规则:
(一)再使用方法重载的时候,必须通过方法中不同的参数列表来实现方法的重载。如:方法的参数个数不同或者方法的参数类型不同。
(二)不能通过访问权限,返回值类型和抛出的异常来实现重载
(三)方法的异常类型和抛出异常的数目不会影响方法的重载,也就是说重载的方法中允许抛出不同的异常
(四)可以有不同的返回值类型,只要方法的参数列表不同即可
(五)可以有不同的访问修饰符
三、重写与重载的区别
区别点 |
重载 |
重写(覆写) |
英文 |
Overloading |
Overiding |
定义 |
方法名称相同,参数的类型或个数不同 |
方法名称、参数类型、返回值类型全部相同 |
对权限没有要求 |
被重写的方法不能拥有更严格的权限 |
|
范围 |
发生在一个类中 |
发生在继承类中 |
注意:构造方法不能被继承,因此不能被重写,在子类中只能通过super关键字调用父类的构造方法;但是可以被重载。