方法的重载overload
方法的重载是指一个类中可以定义有相同的名字,但参数不同的多个方法。调用时,会根据不同的参数表选择对应的方法。
相同
同一个类
同一个方法名
public class Test {
public void Hello() {
System.out.println("Hello");
}
public void Hello(String str){//方法名相同,参数不同,一个有参一个无参
System.out.println("Hello "+str);
}
public static void main(String[] args) {
Test t = new Test();
t.Hello();//输出结果为Hello
t.Hello("world");//输出结果为Hello World
}
}
不同
参数列表不同(类型,个数,顺序不同)
返回值不同,不构成方法的重载
形参的名称不同,不构成方法的重载
public class Test {
public void Hello() {}
public String Hello(){
//返回值不同不构成方法的重载,此时会报错Duplicate method Hello() in type Test
return "World";
}
public void Hello(int a) {}
public void Hello(int b) {}//形参的名称不同,不构成方法的重载,此时会报错
}
与普通方法一样,构造方法也可以重载,只要参数不同就行。
public class Test {
public Test() {
super();
}
public Test(int a) {
super();
}
}
方法的重写override
在Java面向对象的三大特性继承关系中,子类会自动继承父类中公共的方法,有时在子类中需要对继承的方法进行一些修改,即对父类方法进行重写。例如下面代码:
class Animal{
void eat(){ //定义动物吃东西的方法
System.out.println("动物在吃东西");
}
}
class Tiger extends Animal { //子类继承父类
void eat() { //重写了父类继承来的方法
System.out.println("老虎吃肉");
}
}
public class Hello {
public static void main(String[] args) {
Tiger tiger = new Tiger();
tiger.eat();
}
}
重写规则
重写规则之一:由于多态的原因,重写方法不能比被重写方法限制有更严格的访问级别。(但是可以更广泛,比如父类方法是包访问权限,子类的重写方法是public访问权限。
将继承的父类方法默认的default改为private就会报错:无法降低从父类继承来的方法的可见度。例:
class Tiger extends Animal { //子类继承父类
//报错:Cannot reduce the visibility of the inherited method from Animal
private void eat() { //重写了从父类继承来的方法
System.out.println("老虎吃肉");
}
}
重写规则之二:方法名称,返回类型和参数列表必须与被重写方法的相同。注意:如果子类方法的参数列表与父类方法对应的参数列表不同,那是重载,不是重写。
重写规则之三:重写方法不能抛出新的异常或者比被重写方法声明的检查异常更广的检查异常。但是可以抛出更少,更有限或者不抛出异常。
重写规则之四:不能重写被标识为final的方法。
重写规则之五:如果一个方法不能被继承,则不能重写它。(重写的目的是为了子类扩展父类的功能,没有关系的类重写不叫重写,叫重新(全新)实现了)
方法的重载与重写的区别
1、范围区别:重载 在相同的类范围内内执行。 重写发生在两类具有继承(继承)的关系。
2、参数区别:重载参数必须不同。 重写参数必须相同。
3、多态性区别:重载 静态多态,调用的函数在编译时被选中。 重写是运行时多态性的。
4、返回类型区别:重载对返回值没有要求,可以相同,也可以不同。重写必须是相同的或者协变的。(在Java5.0之前,当重写一个方法时,参数和返回类型都必须完全匹配。在Java5.0中,它引入了一个名为协变量返回类型的新工具。可以重写具有相同签名的方法,但返回的对象的子类。也就是说,子类中的方法可以返回一个对象,该对象的类型是该方法返回的类型的子类,在超类中具有相同的签名。)