JAVA接口与抽象类辨析
抽象类
- 抽象类不能被实例化,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可。
- 抽象方法必须由子类来进行重写。
- 只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包含有其他方法。
- 抽象类中可以包含具体的(非抽象)方法,当然也可以不包含抽象方法。
- 子类中的抽象方法不能与父类的抽象方法同名。抽象方法可以继承抽象方法
- abstract不能与final并列修饰同一个类。
- abstract不能与private、static、final或native并列修饰同一个方法。即abstract只能用public与protected来修饰
- 抽象方法指的是没有大括号以及其中包含的内容的方法。
接口
- 接口是一种比抽象类更加抽象的“类”,不过它并不是类,因为它也不能实例化。
- 实现类指的是implement该接口的类
- 实现该接口的实现类必须实现该接口的所有方法
- 实现类表示着“interface只是它的外貌,但是现在需要声明它是如何工作的”
- 接口只能用public来修饰,在未标明的时候也为public,若表明为其他的访问权限则会编译出错
- 接口方式中,它仅能够有静态、不能修改的成员数据(但是我们一般是不会在接口中使用成员数据),同时它所有的方法都必须是没有实现的,需注意此处的方法虽然形似抽象方法,但是这并不需要abstract来修饰,这与抽象类中的抽象方法有所不同。在某种程度上来说,接口是抽象类的特殊化。
抽象类与接口
区别:一个类只能存在一个父类,但是可以存在多个接口;抽象类表示的是"is-a"关系,接口表示的是"like-a"关系;抽象类是对类抽象,而接口是对行为的抽象;抽象类是自底向上抽象而来的,接口是自顶向下设计出来的(比如对于猫狗这些动物们来说,他们都是动物,因此他们的抽象类就是动物。他们的抽象类是因为在设计中需要他们的存在才被抽象出来的,是因为有猫和狗才有了动物这一抽象类。而对于他们的接口而言,我们知道有猫和狗之前,我们就已知有跑,跳,飞这些行为的存在了,在设计这些行为(接口)的时候,我们根本不知道会有什么样的类来怎样具体的实现这些方法)。
共性:抽象类和接口都不能被实例化,抽象类只能在继承它的类中被实例化,接口只能在它的实现类中被实例化d
实例
参考reference里的代码
Reference