Java 方法重载和方法重写的区别
一.方法重载
A.重载的规则
1.方法重载:存在同一个类中,允许存在过个同名的方法,只要他们的参数列表不同即可,与修饰符和返回值类型无关
2.参数列表 :个数不同,数据类型不同,顺序不同
3.重载⽅法调⽤:JVM通过⽅法的参数列表,调⽤不同的⽅法
4.方法能够在同一个类中或者在一个子类中被重载
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));
}
}
二.方法重写
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
A.重写规则
1.如果不继承该类,则不能重写该类的方法,即重写方法在父子类中。
2.参数列表必须相同
3.返回值类型与被重写方法的返回值类型可以不同,但是必须是父类返回值的派生类(Java 7 及更高版本可以不同)
4.子类的访问权限不能比父类中被重写的方法权限更低。例如:如果父类的一个方法被声明为public 那么子类就不能声明为protected
5.父类的成员方法只能被子类重写
6.声明为final的方法不能被重写
7.声明为static 的方法不能被重写,但是可以被再次声明
8.子类和父类在同一个包中,那么子类可以重写父类中所有的方法,除了声明为private,final的方法
9.子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。
10.构造方法不能被重写
B.Super关键字的使用
当需要在子类中调用父类的被重写的方法时,要使用super关键字
class Animal{ public void move(){
System.out.println("动物可以移动");
}
}
class Cat extends Animal{
Public void move(){
super.move();//应用super类的方法
System.out.println("猫可以跑和走");
}
}
public class TestDog{
public static void main(String args[]){
Animal b=new Dog();
b.move();//执行Dog类的方法
}
}
/*运行结果
动物可以移动
狗可以跑和走*/
三.重写和重载的区别
区别点 | 重载方法 | 重写方法 |
---|---|---|
参数列表 | 必须修改 | 不可修该 |
返回类型 | 可以修改 | 返回值类型与被重写方法的返回值类型可以不同,但是必须是父类方法返回值的派生类(Java 7及以后可以修改) |
访问权限 | 可以修改 | 子类方法的权限必须大于等于被重写方法的权限 |
异常 | 可以修改 | 可以减少或者删除 ,一定不能抛出新的异常或者更广的异常 |
四.总结
方法的重写(overriding)和重载(overloading)是java 多态性的不同表现,重写是父类与子类之间的一种多态的一种表现,重载可以理解成多态的具体表现新式
1.方法重载是一个类中定义多个重名的方法,但是他们的参数的数量不同或是数量相同而类型和次序不同
2.方法重写是子类存在的方法与父类的方法名字相同,而且参数类型和个数相同,返回值也一样的方法。
3.重载是一个类的多态表现,重写是子类与父类的的一种多态的表现