重写与重载、throw与throws、接口与抽象类的区别
重写与重载的区别
重载(Overload)
Java中允许同一个类文件中出现多个方法名相同,但是参数列表不同的方法,这种现象称为重载。
要求两个方法名称必须相同,但是参数列表不能相同
是一个类中多态性的一种表现(调用方法时通过传递不同参数个数和参数类型来决定具体使用哪个方法的多态性)。
目的:让方法在接收不同参数实现不同功能
重载是一个类中多态性的表现,在编译时起作用(静态多态性,譬如实现静态绑定)
重写(Override)
发生在继承过程中,子类对父类方法实现进行重新定义
重写时,要求方法名相同,参数列表相同
重写时,可以缩小返回类型的范围,不能扩大返回类型范围
子类在重写父类的方法时,不能减低方法的访问权限,但是可以扩大
父类中由private或final修饰的方法不能被子类重写
重写方法时,抛出异常可以是父类方法抛出异常的全集、子集、空集。
即不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常
重写是父类与子类之间多态性的表现,在运行时起作用(动态多态性,譬如实现动态绑定)
throw与throws的区别
throw
声明位置:方法名之后
public void test1() throws NullPointExeption{
}
作用:表示有可能抛出异常
携带异常:throws后面可以携带多个异常类型
调用:当一个方法被throws修饰时,调用方法时必须考虑异常捕捉问题
throws
声明位置:方法执行体中
public void test1(){
throw new RuntimrException();
}
作用:throw是一个命令,执行时抛出一个指定异常对象
携带数据:一个throw一次只能携带一个异常对象
调用:当一个方法内部存在throw时,调用方法不用考虑异常问题
接口与抽象类的区别
接口
1)是一种特殊类文件
2)作用:减低耦合度
3)使用规则:
接口中属性,默认都是静态常量属性;
接口中方法都是抽象,如果需要定义具体方法实现,此时方法需要使用default修饰;
接口中方法访问权限不能是private;
接口与接口之间可以实现多继承,但是接口之间不能相互实现
接口中存在构造方法
抽象类
1)抽象类由abstract修饰
2)作用:减低接口实现类与接口之间实现的难度。
【*****】即(抽象类在实现接口时,可以不对接口中的方法进行重写
但是抽象类没有重写的方法(接口中),在抽象类的子类中必须重写)
3)使用规则:
抽象类可以声明抽象方法,也可以生产具体方法;
抽象类声明抽象方法必须有子类进行重写;
抽象类实现接口时,不需要对接口方法进行重写;
抽象类可以有构造方法,但是不能使用。【why?】