重载(overloading)与重写(overriding)

    重载方法在编译时起作用(例如,静态绑定),重写方法在运行时起作用(例如,动态绑定)。静态绑定意味着JVM在编译时决定调用的类或方法。而动态绑定时,JVM是在运行时决定调用的类或方法。动态绑定设计是多态的基础。

public class MethodOverrideVsOverload {
 
 public boolean equals( MethodOverrideVsOverload other ) {
     System.out.println("MethodOverrideVsOverload equals method reached" );
     return true;
   }
 
 public static void main(String[] args) {
  Object o1 = new MethodOverrideVsOverload();
  Object o2 = new MethodOverrideVsOverload();
 
  MethodOverrideVsOverload o3 = new MethodOverrideVsOverload();
  MethodOverrideVsOverload o4 = new MethodOverrideVsOverload();
 
  if(o1.equals(o2)){
   System.out.println("objects o1 and o2 are equal");
  }
 
  if(o3.equals(o4)){
   System.out.println("objects o3 and o4 are equal");
  }
 }
}

    上面这个代码为重载。

    子类中重写父类的对应方法必须遵循下面的规则:

参数

不可变(包括参数类型和个数)。

返回类型

不可变,除了协变返回类型或其子类型(covariant (subtype) returns)。

异常

子类中可以抛出更少的异常,但绝对不能抛出父类中没有定义的已检查异常。

访问权限

比父类中对应方法更宽松。

调用

运行时(也就是动态绑定),根据对象类型来决定调用的具体方法。

 

    在Java5中,新增了注解,其中包括很好用的编译时注解(compile time annotations)@override,来保证方法正确的重写了父类方法。如果在上面的代码中添加了注解,那么JVM会抛出一个编译错误。

你可能感兴趣的:(重载(overloading)与重写(overriding))