重载与重写


记住重载是同一个类中的行为,重写是父子类继承中的行为。他们都是多态的表现形式。其实说白了多台就是为了最大限度的兼容和少写代码。试想我写一个方法就可以传递100中不同的类型的参数,是不是就可以少些99个方法么。

重载

重载指的是在同一个类中,方法同名但参数不同,这个参数的不同足以另Jvm虚拟机根据参数的个数或参数的类型来区分究竟该调用哪个方法,在调用的时候Jvm总是倾向于调用方法更明确的那个
如下

public class Son {
  public String print(Object o) {
    return "111";
  }

  public String print(String o) {
    return o;
  }

  public static void main(String[] args) {
    new Son().print("12345");
    new Son().print(args);
  }

}

注意下面两个方法是不能共存的,因为在调用的时候没有办法区分

public String print(Object o) {
    return "111";
  }

public <T> T print(T o) {
  return o;
}

理由是泛型的类型擦除

public <T> T print(T o) {
  return o;
}

这个方法和

public Object  print(o o) {
  return o;
}

方法无异

重写

重写就是重新一份,这个新写的一份是有条件的

  1. 方法名必须一模一样
  2. 方法签名必须一模一样,无论参数的个数还是类型
  3. 方法的返回值必须是父类方法的同类型或子类
  4. 方法限定条件不能比父类更严格,如果父类方法是public 那子类重写方法必须是public.如果父类方法是protected 那子类可以是就不可以小于protected的限定也就是不能是default和private的。这样做的目的其实还是为了在调用的时候知道该掉用那个方法。如果违背了这个条件,比如在弗雷中可以调用但是实际类型是子类,会导致抛出异常的,因为子类方法无法调用。这也违背了设计原则中的里氏代换原则

评论