首先我们需要明确面向对象中的继承和实现这两种关系,继承(Extends)是子类与父类之间的一种联系,子类可以继承父类中的非私有方法,可以重写父类的抽象方法。实现(Implements)是接口与实现类之间的一种关系,实现类必须实现接口中的所有方法,接口中的方法不可以声明为私有方法。
接口与实现类之间还好理解,可能大家对于抽象类与普通父类,抽象方法与普通方法不太理解,下面就分别对抽象类与抽象方法、普通类与普通方法进行简单的对比。
首先我们要想用继承关系的话就要涉及到父类与子类,当子类继承父类时,就涉及到了父类是普通类还是抽象类,父类方法是普通方法还是抽象方法。
抽象方法与普通方法
抽象方法是被关键字abstract修饰的方法,父类的抽象方法必须被子类重写。未被abstract修饰的方法就是普通方法,父类的普通方法除了私有的之外都可以被子类继承。
抽象类与普通类
抽象类也是被abstract修饰的类,只有类中有抽象方法,这个类就必须被定义成抽象类,抽象类必须被继承,抽象方法必须被重写,非抽象方法可以不被重写。抽象类中的抽象方法被重写的过程就是我们面向对象中的多态实现。未被abstract修饰的类就是普通类,普通类可以被继承也可以不被继承,普通类一旦被继承就成为父类,父类的非私有方法就可以被子类继承。
抽象类与接口
通过以上的介绍我们就能看出来,在抽象类中只有抽象方法才必须被子类重写;而在接口中,实现类必须实现接口的所有方法。换句话说,当抽象类中所有的方法都是抽象方法的时候,接口与抽象类之间就可以互相替换。但是这样说是有些片面的,在java里面只能实现多继承,也就是说一个子类只能继承于唯一一个父类;而一个实现类可以实现多个接口,java里面正是使用接口来实现多继承的。因此在有多继承的情况下即使是抽象类中的方法全是抽象方法也不能替代接口的作用。