方法重写
在讲java 继承的时候也讲到过方法重写,在这主要进行重写与重载的区别。
子类可以定义新的特征,当子类需要修改父类的一些方法进行扩展,增大功能,程序设计者常常把这样的一种操作方法称为重写,也叫称为覆写或覆盖。
在Java中覆盖继承父类的方法就是通过方法的重写来实现的。所谓方法的重写是指子类中的方法与父类中继承的方法有完全相同的返回值类型、方法名、参数个数以及参数类型。
这样,就可以实现对父类方法的覆盖。如果子类将父类中的方法重写了,调用的时候肯定是调用被重写过的方法,那么如果现在一定要调用父类中的方法该怎么办呢?
此时,通过使用super关键就可以实现这个功能,super关键字可以从子类访问父类中的内容,如果要访问被重写过的方法,使用“super.方法名(参数列表)”的形式调用。(super关键字在java继承的文章中有讲 http://47.98.172.209:8860/index.php/archives/47/)
重写规则
- 父类方法的参数列表必须完全与被子类重写的方法的参数列表相同,否则不能称其为重写而是重载。
- 父类的返回类型必须与被子类重写的方法返回类型相同,否则不能称其为重写而是重载。
- 被子类重写的方法不能拥有比父类方法更加严格的访问权限
- 在继承过程中如果父类当中的方法抛出异常,那么在子类中重写父类的该方法时,也要抛出异常,而且抛出的异常不能多于父类中抛出的异常(可以等于父类中抛出的异常)。
重写的案例:
class Person {
public String name = "Person";
public void eat(String food) {
System.out.println("吃"+food);
}
}
class Student extends Person {
// 重写父类的name变量
public String name;
// 子类构造方法
Student() {
this.name = "Student";
}
// 重写父类的eat()方法 *返回值类型、方法名、参数列表的完全相同
@Override
public void eat(String food) {
System.out.println("学生吃"+food);
}
}
public class Test {
public static void main(String[] args) {
Student student = new Student();
System.out.println(student.name); // Student
student.eat("水果"); // 学生吃东西!
}
}
方法重载
方法重载是让类以统一的方式处理不同类型数据的一种手段。调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法,这就是多态性。
所谓方法重载是指在一个类中,多个方法的方法名相同,但是参数列表不同。参数列表不同指的是参数个数、参数类型或者参数的顺序不同。
方法的重载在实际应用中也会经常用到。不仅是一般的方法,构造方法也可以重载。
重载是指我们可以定义一些名称相同的方法,通过定义不同的参数来区分这些方法,然后再调用时,Java虚拟机就会根据不同的参数列表来选择合适的方法执行。也就是说,当一个重载方法被调用时,Java用参数的类型或个数来决定实际调用的重载方法。因此,每个重载方法的参数的类型或个数必须是不同。
虽然每个重载方法可以有不同的返回类型,但返回类型并不足以区分所使用的是哪个方法。
使用重载要注意以下的几点:
- 在使用重载时只能通过不同的参数列表,必须具有不同的参数列表。
- 不能通过访问权限、返回类型、抛出的异常进行重载。
- 方法的异常类型和数目不会对重载造成影响。
- 可以有不同的返回类型,只要参数列表不同就可以了。
- 可以有不同的访问修饰符。
- 可以抛出不同的异常。
重写规则
- 被重载的方法必须改变参数列表;
- 被重载的方法可以改变返回类型;
- 被重载的方法可以改变访问修饰符;
- 被重载的方法可以声明新的或更广的检查异常;
- 方法能够在同一个类中或者在一个子类中被重载。
案例
package com.test;
class Person {
String name;
String sex;
int age;
public Person(){
System.out.println("hello");
}
// 对构造方法进行重载
public Person(String name,int age){
this.name = name;
this.age = age;
}
public void getAge(){
System.out.println(this.age);
}
// 对getAge()方法进行重载 同时修改访问权限为private,也改变了返回值类型为int
private int getAge(int n){
return age+n;
}
}
public class Test {
public static void main(String[] args) {
Person person = new Person();
}
}