重载(Overload)和重写(Overwrite)区别

1. 类维度

重载(Overload)重写(Overwrite)
类中的一组方法子类重写父类的方法

2. 方法签名维度

public static String test(Integer name, String age) throws IOException { }


2.1 访问修饰符

重载(Overload)重写(Overwrite)
没有要求子类权限修饰符 >= 父类 (eg:public > protected
重写父类方法时,为什么子类的权限修饰符必须 >= 父类?
/**
* 假设A,B,C三个类都不在相同的包下,并且假设以下编辑器不会报错
*/
public class A{
    public void fun() {}
}

public class C extends A{
    @Override
    protected void fun() {}//假设这里编译可以通过
   }
   
public class Prac{
    public static void main(String[] args){
	A a = new C();
	a.fun();
	//因为a为A类型,所以可以调用fun(),但是在运行时a是调用C的fun(),
	//又因为C中fun()为protcted修饰,A和C又不在同一个包下,所以C中fun()只能由其子类调用,
	//所以a.fun()会出现问题
    }
}

参考:
java中子类再重写父类方法时,为什么子类的权限修饰符必须大于或者等于父类权限修饰符?


2.2 特征修饰符

重载(Overload)重写(Overwrite)
没有要求父类方法是static时,子类不存在重写
父类方法是final时,子类不能重写
父类方法是abstract时,子类必须重写(如果子类是抽象类可以不必重写)

2.3 返回值

重载(Overload)重写(Overwrite)
没有要求子类返回值 <= 父类
eg:Person < Animal
重写父类方法时,为什么子类返回值要 <= 父类?

这里涉及到了向上转型,子类重写了父类的方法,有时候就需要用父类对象引用来调用子类重写的方法

  • 如果子类返回值<=父类时,可以直接向上转型;
  • 如果子类返回值 > 父类时,不能直接向上转型,需要强制类型转换,可是代码里没有强制转换, 所以会报错;

参考:
如何理解“子类重写父类方法时,返回值若为类类型,则必须与父类返回值类型相同或为其子类”

2.4 名字

重载(Overload)重写(Overwrite)
必须一致必须一致

2.5 参数

重载(Overload)重写(Overwrite)
参数必须不一致(体现在:类型 个数 顺序)必须一致

2.6 异常

重载(Overload)重写(Overwrite)
没有要求父类方法抛出运行时异常,子类可以不理会
父类方法抛出编译时异常, 子类抛出异常的类型 <= 父类
eg:FileNotFoundException < IOException
重写父类方法时,使用throws 抛出异常,为什么子类要 <= 父类?
class A{
	public void method1() throws IOException {
	}
}

class B extends A{
	public void method1() throws FileNotFoundException{
	}
}

public class TestThrowsException {
	public static void main(String[] args) {
		A a = new B();
		try {
			//1.编译的时候,认为异常类型是A类的method1抛出的
			a.method1();
			
			//2.catch到的只能是A类的method1抛出的IoException.
			//但运行时实际抛过来的是B类method1方法throws的FileNotFoundException;
			
			//FileNotFoundException → IoException需要强制转换,可是代码里没有强制转换,所以会报错
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

参考:
java 重写或者覆父类方法的使用throws 抛出异常,为什么要小于父类父类

3. 方法体维度

重载(Overload)重写(Overwrite)
子类和父类不一致,一致的话还要重载干啥子类和父类不一致,一致的话还要重载干啥

梗概

                           方法重写overwrite                  方法重载overload
1.类            产生两个继承关系的类,子类重写父类的方法         一个类中的一组方法

2.权限修饰符     子类 >= 父类 (public > protected)             没有要求

3.特征修饰符     final static abstract                        没有要求
                父类方法是final 子类不能重写
			    父类方法是static 子类不存在重写
				父类方法是abstract 子类必须重写(如果子类是抽象类,可以不重写)

4.返回值         子类 <= 父类   Person < Animal                没有要求

5.名字           子类与父类必须一致                             名字必须一致

6.参数           子类与父类一致                                 每个方法的参数必须不一致(类型 个数 顺序)

7.异常          运行时异常  编译时异常                          没有要求
                父类方法抛出运行时异常,子类可以不理会
				父类方法抛出编译时异常,子类抛出异常的类型 <= 父类

8.方法体     子类和父类不一致                                  通常不一致
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值