这几天,参加java工程师的笔试面试,多次被问到有关abstract与interface的区别,经上网查询,得到相关区别将近七个,为了更好的理解,现就解析下关于七个区别的由来:
区别一:抽象类可以有构造方法,而interface没有,但两者都不能自身实例化。(由于抽象类可以被其它类继承,故可以有构造方法)
区别二:抽象类中可以有普通成员变量,接口中没有普通成员变量(接口是比抽象类更为抽象的级别,旨在提供一个统一的行为,因此要是存在普通成员变量的话,则可以通过接口的实现类可以修改变量,这样就像抽象类一样了,不符合接口的规范)
区别三:一个类可以实现多个接口,但只能继承一个抽象类(点继承与面继承)
区别四:抽象类里面有普通方法和抽象方法,而接口中只有抽象方法(抽象类集合了类和抽象的概念,而接口就纯抽象)
区别五:抽象类中可以有静态方法,而接口中不能有静态方法(接口的所有方法都是抽象的,而抽象方法是没有static,有static的方法是不能override的,所以这样定义接口才有意义。)
区别六: 抽象类中的抽象方法的访问类型可以是public,protected,但接口中的抽象方法只能是public 类型的,并且默认即为public abstract类型,抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final 类型,并且默认即为public static final 类型(抽象类相对于特定情况下的抽象,因此可以根据情况制定方法,静态成员变量的访问类型,但由于是为继承做服务,因此绝对不能是private,这样没有意义,而接口则是相对于程序全局来使用的,方法只能是public,至于static final 则是由于接口不能被实例化(static),并且由于接口中的方法都是抽象的,无法通过行为来影响属性字段,因此(final))