重载是在同一个类中对已有方法的再次编程,它的目的是在使用时能适应更多情况。
这里拿构造函数举例理解:
public class IdCard {
public String name;
public int age;
public String sex;
public String address;
//一个形参
public IdCard(String name){
this.name = name;
age = 0;
sex = null;
address = null;
}
//两个形参
public IdCard(String name, int age){
this.name = name;
this.age = age;
sex = null;
address = null;
}
//三个形参
public IdCard(String name, int age, String sex){
this.name = name;
this.age = age;
this.sex = sex;
this.address = null;
}
//四个形参
public IdCard(String name, int age, String sex, String address){
this.name = name;
this.age = age;
this.sex = sex;
this.address = address;
}
}
可以看到代码中同名构造函数有四个(其实系统还默认添加了一个无参构造函数),区别在于每一个构造函数中的形参数量不同,这种做法就是重载(Overload),这让这个类的使用者在使用的时候更加自由,不必局限于有限的信息,而且不用更换函数名。
public class Main {
public static void main(String[] args) {
IdCard a = new IdCard("孙行者");
IdCard b = new IdCard("者行孙",500);
IdCard c = new IdCard("行者孙",500,"无");
IdCard d = new IdCard("孙悟空", 500,"无", "花果山水帘洞");
}
}
重载的规则:
- 被重载的方法必须改变参数列表(参数个数或类型不一样);
- 被重载的方法可以改变返回类型;
- 被重载的方法可以改变访问修饰符;
- 被重载的方法可以声明新的或更广的检查异常;
- 方法能够在同一个类中或者在一个子类中被重载。
- 无法以返回值类型作为重载函数的区分标准。
重写的发生前提是两个类发生了 “继承(extends)” 关系,就是要至少有一个类还有一个继承该类的子类,而且要重写的方法(或字段)在父类中已经存在了(重写,重写,顾名思义就是将已经存在的方法重写一遍),重写(Override)这个操作很好的体现了Java化繁为简的特性,对于有一些具有普遍性的方法,可以先在父类中写出这个方法的雏形,然后根据这个父类的子类们可能各不相同的具体需要,在子类中将这个原始的方法进行拓展甚至完全的重新实现。
//这是一个 “人类” 父类类
public class Person {
public String name;
public int age;
public void behavior(){
System.out.println("吃饭,睡觉,打豆豆。");
}
}
这是一个父类,他里面的成员变量是一个人类的基本信息,方法behavior() 中呈现的也是一个人类的基本行为,这些东西是所有人类都具备的,最原始的。
下面看几个该父类的子类:
//这是一个 “医生” 子类,继承自 “人类” 类
public class Doctor extends Person{
public void Behavior(){
//super + " . " 可以调用父类的方法
super.behavior();
System.out.println("治病救人为本职");
}
}
可以看到,这个类中对父类的 behavior() 方法进行了重写,他在原来人类原始能力的基础上(),加入了作为医生的能力。
重载的规则:
- 参数列表与被重写方法的参数列表必须完全相同。
- 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。
- 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。
- 声明为 final 的方法不能被重写。
- 声明为 static 的方法不能被重写,但是能够被再次声明。
- 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法。
- 子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。
- 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
- 构造方法不能被重写。
以上就是我对重写(Override)和重载(Overload)的简单理解,如果各位看官发现有错误的地方,希望能告诉我。