抽象类和接口的异同
抽象类
使用abstract关键字声明
抽象方法不能是private
抽象类不能直接实例化,其实例可以使用子类向上转型的方式获得
子类如果没有重写全部抽象方法则仍是抽象类
子类只能extends一个类
接口
抽象方法的集合,以interface关键字声明,
子类可以使用implements继承多个接口
子类(非抽象类)必须重写接口中的全部抽象方法
接口不能直接实例化,其实例可以使用子类向上转型的方式获得
方法默认是public,变量默认public static final,重写时的访问权限不能低于接口定义的访问控制权限
相同点
用于其他类继承和实现,都不能被实例化
都包含抽象方法差异点
抽象类可以包含普通方法,接口不能
抽象类可以定义普通成员变量,也可以定义常量。接口只能定义常量,不能定义普通成员变量
抽象类可以包含构造方法,以便子类调用完成初始化工作,接口不能
抽象类可以包含初始化块,接口不能
一个类可以实现多个接口,但只能继承一个抽象类
重载与重写
重载
函数名相同,参数个数或类型不同(与返回值无关)
重写
覆盖父类中的同名方法,指参数列表和返回值均相同
子类重写的方法不能比在父类中有更严格的访问控制权限
父类中方法的访问控制权限是private,则在子类中并不是重写,而不是一个新方法
子类中重写的方法抛出的异常只能是父类方法的异常的本身或子集