重载(overload):对于类的方法,方法名相同,参数列表不同的方法之间构成了重载关系。
参数列表:参数的类型、参数的个数、参数的顺序。
子类从父类继承来的方法也可以发生重载。
如果多个方法有相同的名字、不同的参数,便产生了重载。编译器必须挑选出具体执行哪个方法,通过各个方法给出的参数类型与特定的方法调用所使用的值类型进行匹配来挑选出相应的方法。
如果找不到匹配的参数,或者有多个可能的匹配,就会产生编译时错误。
重载关系只能发生在同一个类中吗?不是的。
这时候你要深刻理解继承,要知道一个子类所拥有的成员除了自己显式写出来的以外,还有父类遗传下来的。所以子类中的某个方法和父类中继承下来的方法也可以发生重载的关系。
看方法之间是否是重载关系,不用管方法的修饰符和返回类型以及抛出的异常,只看方法名和参数列表。而且要记住,构造器也可以重载。
package OverloadAndOverride; public class Dog { Dog() { } void bark() { System.out.println("no barking!"); this.bark("123", 123.2 ); } void bark(String m, double l) { System.out.println("a barking dog."); this.bark(5, "china"); } void bark(int a, String n) { System.out.println("a cute cat."); } public static void main(String[] args) { Dog dog = new Dog(); dog.bark(); dog.bark(5, "123"); dog.bark("123", 1); } }
输出结果:
no barking! a barking dog. a cute cat. a cute cat. a barking dog. a cute cat.
再看一个重载的例子
package OverloadAndOverride; public class OverrideTest { void max(int a, int b) { System.out.println(a > b ? a:b); } void max(short a, short b) { System.out.println(a > b ? a:b); } void max(float a, float b) { System.out.println(a > b ? a:b); } public static void main(String[] args) { OverrideTest test = new OverrideTest(); //调用int的 int a1 = 1; int a2 = 2; test.max(a1, a2); //调用double的 float a3 = 1; float a4 = 2; test.max(a3, a4); //调用short的 short a5 = 1; short a6 = 2; test.max(a5, a6); } }
输出结果:
2 2.0 2
覆盖(override):当父类中的某些方法不能满足需要的时候,子类改写父类的方法,当父类中的方法被覆盖之后,除非使用super关键字,否则无法再调用父类的方法。
覆盖的条件:
1、“三同一不低”:方法名称、参数列表、返回类型相同,子类的访问修饰符的权限不能比父类低;
2、子类方法不能比父类抛出更多的异常。即子类所抛出的异常必须和父类方法所抛出的异常一致,或子类中不抛出异常;
3、被覆盖的方法不能是final类型的,因为final类型的方法无法被子类覆盖;
4、被覆盖的方法不能是private类型的,否则在子类中只是定义类一个新的方法,并没有对其进行覆盖;
5、被覆盖的方法不能是static类型的,如果父类的方法为static类型的,而子类的方法不是static类型的,那么两个方法除了这一点外其他都满足覆盖条件,那么会发生编译错误。反之亦然,即使父类和子类中的方法都是static类型的,并且满足覆盖条件,但是仍然不会发生覆盖,因为static是在编译的时候将静态方法和类的引用类型进行匹配。