重载(Overload)
重载发生在本类,方法名相同,参数列表不同,与返回值无关,只和方法名,参数列表,参数的类型有关.
比如说,一个Person类.如果不写构造方法的话,在测试类中默认调用的就是无参的构造方法,是系统默认的.
如果写了有参的构造方法Person(String name,int age){this.name=name;this.age=age}就必须手动写一个默认的无参的构造方法.因为写了有参,默认的无参的系统就不提供了.Person()和Person(String name,int age)就构成了方法的重载.
再比如写一个普通的方法,两数相加的方法.
public static void plus(int a,int b){
System.out.println(a+b);
}
public static int plus(int a,doule b){
return a+b;
}
public String plus(String a,String b,int c,double d){
String str = a+b+c+d;
return str;
}
public class Test{
public static void main(String[] args){
Test t = new Test();
plus(2,3)//输出5
System.out.println(t.plus(2,3.0))//输出的就是5.0
System.out.println(t.plus("2","3",4,5.0)//输出的就是2345.0
}
}
上面几种虽然返回值类型不同,但依然构成方法的重载.Java虚拟机JVM会根据参数的不同自动选择加载重载过后的哪种方法.
加入Person类中只有三个参数,name,age,gender的构造方法,和一个无参的构造函数,但你new对象时传递了两个参数,就会报错,提示该构造方法不存在.
重写(Override)
重写发生在父类子类之间,比如所有类都是继承与Object类的,Object类中本身就有equals,hashcode,toString方法等.在任意子类中定义了重名和同样的参数列表就构成方法重写.
public class Father{
public void method(){
System.out.println("我是父类定义的方法")
}
}
class Son extend Father{
@Override
public void method(){
System.out.println("我重写了父类定义的方法")
}
}
重写这种情况大多发生在子类继承父类,而又不想完全调用父类的方法,就可以重写父类定义过的方法,参数列表和名字必须一样.返回值类型不能i父类更宽泛,抛异常不能比父类更窄.
重写更多的发生在实现接口,继承抽象类中的抽象方法中.因为接口或者抽样方法中定义的方法大多都只有一个方法名,加上返回值类型或者参数列表,没有具体的方法体去实现.接口或者说抽样方法,更多的是一种规范.这样就规定了子类如果要继承或者实现他,就必须要重写其中的方法.