Java方重载和重写
- 1 重载
- 2 重写
- 2.1 方法重写的规则
- 2.2 super关键字
- 3 重写VS重载
- 4 参考
1 重载
如果有两个方法的方法名相同,但参数不一致,那么可以说一个方法是另一个方法的重载。其中,数列表不同包括:
- 参数个数不同
- 参数类型不同
- 顺序不同(意义不大)
但要注意方法的名称一定要相同,且与方法的返回值类型和方法的修饰符(static
、final
)无关,即使带有static
或者final
修饰符的方法也可以进行重载
public static final boolean isEqual(int x, int y) {
return x == y;
}
public static boolean isEqual(double x, double y) {
return (Math.abs(x - y)) < 0.0000001;
}
2 重写
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。
2.1 方法重写的规则
- 参数列表必须相同。
- 返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。
- 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。
- 不能比被重写方法声明的更广泛的强制性异常。
- 父类中被声明为 final 的方法不能被重写。
- 父类中被声明为 static 的方法不能被重写,但是能够被再次声明。
- 如果未继承一个类,则不能重写该类的方法。由于
private
的方法无法被子类继承,所以子类也就无法重写父类被声明为private
的方法。 - 构造方法不能被重写。
2.2 super关键字
如果在子类重写父类方法的过程中,需要主动调用父类被重写的方法,则可以使用super.method()
的方法。
class Animal{
public void move(){
System.out.println("动物可以移动");
}
}
class Dog extends Animal{
public void move(){
super.move(); // 应用super类的方法
System.out.println("狗可以跑和走");
}
}
public class TestDog{
public static void main(String args[]){
Animal b = new Dog(); // Dog 对象
b.move(); //执行 Dog类的方法
}
}
3 重写VS重载
关于重载和重写,你应该知道以下几点:
- 重载是一个编译期概念、重写是一个运行期间概念。
- 重载遵循所谓“编译期绑定”,即在编译时根据参数变量的类型判断应该调用哪个 方法。
- 重写遵循所谓“运行期绑定”,即在运行的时候,根据引用变量所指向的实际对象的类型来调用方法。
- 因为在编译期已经确定调用哪个方法,所以重载并不是多态。而重写是多态。重载只是一种语言特性,是一种语法规则,与多态无关,与面向对象也无关。(注:严格来说, 重载是编译时多态,即静态多态。但是,Java 中提到的多态,在不特别说明的情况下都指动态多态)。