Java方法重载与方法重写的区别
方法重载
在同一个类中一组方法名相同但是参数列表不同的方法,称为重载的方法,参数列表不同指的是参数的个数不同或参数的类型不同或对应的位置上参数的类型不同。
使用重载的情境
当一个方法需要根据不同的情境输入不同类型的参数时,不需要再额外定义一个具有相同功能的方法。例如我们要使两个数相加,可以定义一个add(int a, int b)方法,此时由于这个方法不能传入double等其他类型的数据,我们可以使用方法重载,即add(double a,double b)等,方法的重载可以让调用者不需要记住一堆方法名, 只需要记住一个方法名就够了。
public class Calculator {
public int add(int a , int b){
return a+b;
}
public double add(double a , int b){
return a+b;
}
public double add( int a ,double b){
return a+b;
}
private void add(){
System.out.println(1+2);
}
}//以上都是方法重载
方法重载的条件
- 必须在同一个类中, 也就是说add(int a,int b)与add(double a, double b)等重载的方法必须在同一个类中
- 方法名一样
- 参数的个数,或者参数的类型,或者不同类型的参数位置不一样,即参数列表必须有区别
- 与返回值,访问修饰符无关 ,也就是说如果参数列表一样,返回值和访问修饰符不一样,这不是方法的重载。例如 public viod add(int a, int b)与public int add(int a, int b)就不是方法的重载。
jdk 不允许同时存在两个相同的方法, 是否是相同方法, jdk如何判断?
- 看方法名是否一样, 如果不一样, 肯定不是相同的方法
- 如果一样, 再判断参数列表是否一样, 如果参数个数一样,并且对应位置的参数数据类型一样, 这就是相同方法, 如果参数列表不一样, 这就是方法重载,
方法重写
子类继承了父类,那么子类的对象理应可以使用父类中的非private方法,如果子类想实现与父类不一样的效果怎么办呢?此时子类可以重写父类中的方法,当子类的对象再调用这个方法时,就不再是执行父类中写的那个了,而是执行在子类中重写的那个方法,**即保持方法的定义不变,但方法内部实现与父类中的不同,**很好理解:如果子类重写了父类中的方法,调用的就是子类中的实现,否则就调用父类中的方法
重写规则/特征
1:)子类重写父类或父辈类中的方法,父类方法的参数列表必须完全与被子类重写的方法的参数列表相同
2:)父类的返回类型必须与被子类重写的方法返回类型相同,
3:) Java中规定,被子类重写的方法不能拥有比父类方法更加严格的访问权限
如果子类对象不仅想调用自己重写的方法又想调用父类的那个被重写的方法怎么办?——使用super.方法()
public void showInfo(){
super.showInfo();//调用父类那个被重写的方法
System.out.print("子类重写父类的方法")
}
重载与重写的区别
1:)重载写在同一个类中,且重载的方法参数列表不能相同;而重写是子类实例对父类的方法的再写,子类重写的方法的参数列表与父类中被重写的方法的参数列表必须严格一致
2:)重载与访问修饰符、返回值类型无关,也就是说,参数列表相同,访问修饰符或返回值类型不同,这不是方法的重载;而方法的重写返回值类型必须和被重写的方法的返回值类型相同,且访问级别不能比被重写的方法级别高。
相同的点:重载的各方法和重写的各方法方法名一样