记住重载是同一个类中的行为,重写是父子类继承中的行为。他们都是多态的表现形式。其实说白了多台就是为了最大限度的兼容和少写代码。试想我写一个方法就可以传递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;
}
方法无异
重写
重写就是重新一份,这个新写的一份是有条件的
- 方法名必须一模一样
- 方法签名必须一模一样,无论参数的个数还是类型
- 方法的返回值必须是父类方法的同类型或子类
- 方法限定条件不能比父类更严格,如果父类方法是public 那子类重写方法必须是public.如果父类方法是protected 那子类可以是就不可以小于protected的限定也就是不能是default和private的。这样做的目的其实还是为了在调用的时候知道该掉用那个方法。如果违背了这个条件,比如在弗雷中可以调用但是实际类型是子类,会导致抛出异常的,因为子类方法无法调用。这也违背了设计原则中的里氏代换原则