抽象类与抽象方法
抽象方法和抽象类必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法。
抽象类与抽象方法的规则如下:
- 抽象类不能被实例化,只能当做父类被其他子类继承,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。即使抽象类里不包含抽象方法,这个抽象类也不能创建实例
- 抽象方法不能有方法体
- 抽象类的构造器不能用于创建实例,主要用于被其子类调用
- 含有抽象方法的类只能被定义抽象类
- 当使用abstract修饰类时,表明这个类只能被继承;当使用abstract修饰方法时,表明这个方法必须由子类提供实现(重写)。而final修饰的类不能被继承,final修饰的方法不能被重写,因此final和abstract不能同时使用。
抽象类的作用
抽象类主要用于模板模式中:编写一个抽象父类,父类提供多个子类的通用方法,并把一个或多个方法留给子类实现,这就是一种模板模式。
模板模式在面向对象软件设计中很常见,原理简单,下面是它的一些简单规则:
- 抽象父类可以只定义需要的某些方法,把不能实现的部分抽象成抽象方法,留给其子类去实现。
- 父类中可能包含需要调用其他系列方法的方法,这些被调用的方法既可以由父类实现,也可以由其子类实现。父类里提供的方法只是定义了一个通用算法,其实现也许并不完全由自身实现,而必须依赖其子类的辅助。
接口
接口是从多个相似类中抽象出来的规范,接口不提供任何实现。接口体现的是规范与实现分离的设计哲学。接口定义的是多个类的公共行为规范。对接口有以下规定:
- 接口中的普通方法都是使用public abstract修饰的,并且方法不能有方法体;但类方法、默认方法都必须有方法体。
- 接口中的变量都是public访问权限,定义接口成员时,可以省略访问权限控制符,如果指定权限,只能是public。
抽象类和接口的区别
(1)抽象类中可以构造方法 ,接口没有构造函数
(2)类可以实现很多个接口,但是只能继承一个抽象类
(3)接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。(Java8 接口可以有实例方法 需要关键字default)
(4)Java接口中声明的变量默认是public static final(必须赋初始值)。抽象类可以包含非final的变量。
(5)Java接口中的成员函数默认是public abstract的。抽象类的成员函数可以是private,protected或者是public。
(6)接口可继承接口,不能继承类(抽象类和普通类) 抽象类可继承接口也可继承具体类(继承接口时可只实现部分方法)