重载和重写在平日里开发其实经常用到,但是他们的名字实在是太像了,所以在面试中问道经常会蒙圈,这里做个总结
这里有个表格可以很清晰的说出他们的区别是什么
| 重写(Overriding) | 重载(Overloading) |
类的数量 | 父子类、接口与实现类 | 本类 |
方法名称 | 一致 | 一致 |
参数列表 | 一定不能修改 | 必须修改 |
返回类型 | 一定不能修改 | 可以修改 |
异常 | 可以减少或删除,但不能扩展 | 可以修改 |
重载(Overloading)
重载发生在本类,方法名必须一致,参数列表必须修改,返回值和异常可以修改
重载(Overload):首先是位于一个类之中,具有相同的方法名,但是方法的参数不同,返回值类型可以相同也可以不同。
(1):方法名必须相同
(2):方法的参数列表一定不一样。
(3):访问修饰符和返回值类型可以相同也可以不同。
其实简单而言:重载就是对于不同的情况写不同的方法。 比如,同一个类中,写不同的构造函数用于初始化不同的参数。
public class Demo {
public void test(){
System.out.println("参数"+null);
}
//参数数目不同
public void test(Integer n){
System.out.println("参数"+n.getClass().getName());
}
//参数类型不同
public void test(String string){
System.out.println("参数"+string.getClass().getName());
}
public void test(Integer n ,String string){
System.out.println("参数"+n.getClass().getName()+","+string.getClass().getName());
}
//参数顺序不同
public void test(String string,Integer n){
System.out.println("参数"+string.getClass().getName()+","+n.getClass().getName());
}
public static void main(String[] args) {
Demo demo = new Demo();
demo.test();
demo.test(1);
demo.test("string");
demo.test(1,"string");
demo.test("string",1);
}
}
重写(Overriding)
重写发生在父类子类之间,比如所有类都是继承与Object类的,Object类中本身就有equals,hashcode,toString方法等.在任意子类中定义了重名和同样的参数列表,但是实现了不同的逻辑,这个就叫做重写.
重写(override):一般都是表示子类和父类之间的关系,其主要的特征是:方法名相同,参数相同,但是具体的实现不同。
重写的特征:
(1):方法名必须相同,返回值类型必须相同
(2):参数列表必须相同
(3):访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。
(4):子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
(5):构造方法不能被重写,
简单而言:就是具体的实现类对于父类的该方法实现不满意,需要自己在写一个满足于自己要求的方法。
public class Demo1 extends Demo{
@Override
//方法签名完全一致
public void test() {
System.out.println("我是重写后的子类方法");
}
public static void main(String[] args) {
Demo test = new Demo();
test.test();
test = new Demo1();
test.test();
}
}
总结
重载和重写我们在日常开发中经常用到,但是面试官一旦问起来,会突然搞不清楚它们之间的区别在哪,属于八股文知识点。简单来说,重载发生在一个类中,相同的方法名,不同的参数列表,返回值可相同也可不同。重写发生在父子类之间,参数列表,返回值必须一致,并且子类的实现方法的访问权限不能比父类中被重写的方法的访问权限更低。