抽象类
- 如果一个类含有抽象方法,那么这个类是抽象类。
- 抽象类用
abstract
修饰。 - 抽象类可以没有抽象方法。
- 抽象方法必须被
public
或protected
修饰。如果被private
修饰,则方法不能被子类继承。默认情况下为public
。 - 如果一个类继承了抽象类,那么需要实现抽象类中的所有抽象方法。如果没有实现所有抽象方法,那么该子类也被定义为抽象类。
- 因为含有抽象方法,没有具体实现的方法,所以抽象类不能实例化对象。
接口
- 接口中的所有方法必须都是抽象方法。(Java8 可以有默认方法实现)
- 接口用
interface
修饰。 - 接口中的变量被隐式指定为
public static final
变量,并且也只能被public static final
修饰,如果被private
、protected
修饰会报编译错误。 - 接口中的方法被隐式指定为
public abstract
方法,并且也只能被public abstract
修饰。如果被private
、protected
、final
、static
等修饰会报编译错误。
接口与抽象类的区别
- 抽象类被继承,且只能单继承;接口被实现,可以实现多个接口。
- 抽象类中,可以有自己的变量,也可以有非抽象的方法;接口中的变量必须是
public static final
修饰,所有成员方法必须都是抽象的。(Java8 可以有默认方法实现) - 继承抽象类的类,抽象方法可以不实现,但该子类也必须是抽象的;实现接口的类,必须实现接口中的所有方法。(Java8 可以有默认方法实现)
- 抽象类中可以有非抽象方法;接口可以继承接口,且不需要实现接口中的方法;
- 接口中的变量只能被
public static final
修饰,且必须要有初值,所以实现类中不能重新定义,也不能改变其值。 - 接口中的方法必须是
public abstract
修饰,也只能被public abstract
修饰。接口不允许有static
方法,但抽象类允许有static
方法。
来源:oschina
链接:https://my.oschina.net/Oaki/blog/3164972