Java方重载和重写

  • 1 重载
  • 2 重写
  • 2.1 方法重写的规则
  • 2.2 super关键字
  • 3 重写VS重载
  • 4 参考


1 重载

如果有两个方法的方法名相同,但参数不一致,那么可以说一个方法是另一个方法的重载。其中,数列表不同包括:

  1. 参数个数不同
  2. 参数类型不同
  3. 顺序不同(意义不大)

但要注意方法的名称一定要相同,且与方法的返回值类型和方法的修饰符(staticfinal)无关,即使带有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重载

关于重载和重写,你应该知道以下几点:

  1. 重载是一个编译期概念、重写是一个运行期间概念。
  2. 重载遵循所谓“编译期绑定”,即在编译时根据参数变量的类型判断应该调用哪个 方法。
  3. 重写遵循所谓“运行期绑定”,即在运行的时候,根据引用变量所指向的实际对象的类型来调用方法。
  4. 因为在编译期已经确定调用哪个方法,所以重载并不是多态。而重写是多态。重载只是一种语言特性,是一种语法规则,与多态无关,与面向对象也无关。(注:严格来说, 重载是编译时多态,即静态多态。但是,Java 中提到的多态,在不特别说明的情况下都指动态多态)。