重载(overload)
重载是在一个类里面,方法名字相同,而内容参数不同,返回类型可以相同也可以不同,其中最常用的是构造器重载。
重载规则
(1)被重载的方法必须改变参数列表(参数个数或类型或顺序不一样);(2)被重载的方法可以改变返回类型;(3)被重载的方法可以改变访问修饰符;(4)被重载的方法可以声明新的或更广的检查异常;(5)方法能够在同一个类中或者在一个子类中被重载。(6)无法以返回值类型作为重载函数的区分标准。
其中需要注意的一点是:在Java中,同名同参数但不同类型返回值的方法不是重载,编译不能通过。
代码示例
public class Overloading {
public int test(){
System.out.println("test1");
return 1;
}
public void test(int a){
System.out.println("test2");
}
//以下两个参数类型顺序不同
public String test(int a,String s){
System.out.println("test3");
return "returntest3";
}
public String test(String s,int a){
System.out.println("test4");
return "returntest4";
}
public static void main(String[] args){
Overloading o = new Overloading();
System.out.println(o.test());
o.test(1);
System.out.println(o.test(1,"test3"));
System.out.println(o.test("test4",1));
}
}
运行结果
test1
1
test2
1
test2
test3
returntest3
test4
returntest4
returntest3
test4
returntest4
覆盖(override)
覆盖(override)是子类对父类中参数相同、返回类型相同的同名方法进行定义,返回值和形参不能改变,即外壳不变,核心要重写。
覆盖的好处是子类可以根据需要,定义特定于自己的行为。
方法覆盖的规则:
(1)参数列表必须完全与被覆盖方法的相同;
(2)返回类型必须完全与被覆盖方法的返回类型相同;
(3)访问权限不能比父类中被覆盖的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。
(4)父类的成员方法只能被它的子类覆盖。
(5)声明为final的方法不能被覆盖。
(6)声明为static的方法不能被覆盖,但是能够被再次声明。
(7)子类和父类在同一个包中,那么子类可以覆盖父类所有方法,除了声明为private和final的方法。
(8)子类和父类不在同一个包中,那么子类只能够覆盖父类的声明为public和protected的非final方法。
(9)覆盖的方法能够抛出任何非强制异常,无论被覆盖的方法是否抛出异常。但是,覆盖的方法不能抛出新的强制性异常,或者比被覆盖方法声明的更广泛的强制性异常,反之则可以。
(10)构造方法不能被重写。
(11)如果不能继承一个方法,则不能重写这个方法。
代码示例
class Parent {
public int getscore(){
return 3;
}
public String getCountryName(){
return "China";
}
}
class Son extends Parent{
public int getCore(){
return 4;
}
}
public class RunSon{
public static void main(String args[]){
Son s=new Son();
System.out.println(s.getCore());
System.out.println(s.getCountryName());
}
}
运行结果
4
China
重载和覆盖的区别
区别点 | 重载 | 覆盖 |
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可以修改 | 一定不能修改 |
异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
访问 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |