面线对象编程04. 抽象类和接口
抽象类和接口
抽象类
- abstract修饰符可以用过来修饰方法也可以修饰类,如果修饰方法则该方法为抽象方法;如果修饰类则该类为抽象类。
- 抽象类中可以有普通方法,但是有抽象方法的类一定要声明为抽象类。
- 抽象类不能用new关键字创建对象,它是用来让子类继承的。
- 抽象方法只有方法的声明而没有方法的实现,它是让子类去实现的。
- 子类继承抽象类,必须要实现抽象类没有实现的所有抽象方法,否则该子类也要声明为抽象类。
- 抽象类存在的意义:提高开发效率
下面来看一个抽象类的实例:
abstract class AbstractClass {//abstract抽象类 //抽象方法只有方法名字没有方法的实现,连方法体都没有! public abstract void doSomething(); } class AbstractSon1 extends AbstractClass{ //对于抽象类的所有方法,继承了它的子类都必须要实现它的方法,除非该子类也是个抽象类 @Override public void doSomething() { System.out.println( "AbstractSon1实现了父抽象类的方法"); } } //该子类也是个抽象类就不用实现其抽象父类的方法 abstract class AbstractSon2 extends AbstractClass { } /** * @ClassName Application * @Description TODO * @Author ${17368877923} **/ public class Application{ public static void main(String[] args) { new AbstractSon1().doSomething(); } } 输出结果: AbstractSon1实现了父抽象类的方法
接口
- 普通类:只有具体实现
- 抽象类:具体实现和规范(抽象方法)都有
- 接口:只有规范!自己无法写方法 把约束和实现分离:面向接口编程~
- 声明类的关键字是
class
,声明接口的关键字是interface
- 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是。。则必须能。。”的思想。
- 接口的本质是契约,制定好大家都遵守。
- Object Oriented的精髓是对对象的抽象,最能体现这一点的就是interface. 为什么我们讨论设计模式都只针对具备了抽象能力的语言(c++、java等)去讨论,就是因为设计模式所研究的实际上就是如何合理地去抽象。
下面来看接口多继承的实例:
/** * @author 15065170282 */ public interface UserService { //Interface体现了抽象的思维 ~java //interface都需要有一个实现类 //接口中定义的常量前面都默认有public static final修饰符 int AGE = 99;//常量全大写 void add(); void delete(); void update(); void query(); } interface TimeService { void timer(); } //实现类末尾用Impl结尾 //接口实现了多继承 class ServiceImpl implements UserService,TimeService{//类ServiceImpl继承了两个接口 public static void main(String[] args) { //UserService接口中的方法 new ServiceImpl().add(); new ServiceImpl().delete(); new ServiceImpl().update(); new ServiceImpl().query(); //TimeService接口中的方法 new ServiceImpl().timer(); } @Override public void add() { System.out.println("UserService接口中的add方法执行"); } @Override public void delete() { System.out.println("UserService接口中的delete方法执行"); } @Override public void update() { System.out.println("UserService接口中的update方法执行"); } @Override public void query() { System.out.println("UserService接口中的query方法执行"); } @Override//TimeService接口中的方法 public void timer() { System.out.println("TimeService接口中的timer方法执行"); } } 输出结果: UserService接口中的add方法执行 UserService接口中的delete方法执行 UserService接口中的update方法执行 UserService接口中的query方法执行 TimeService接口中的timer方法执行
接口小结
- 接口是一种约束,规定了一些规则让实现编程人员遵守;
- 接口定义的方法前默认加了
public abstract
关键字; - 接口定义的属性(常量)前默认加了
static final
关键字,常量名字母全大写; - 接口不能被实例化
- 接口中没有构造方法
- 每个接口必须有对应的实现类,实现类用
implements
关键字来实现接口,该实现类可以实现多个接口 - 接口实现类的类名结尾为
Impl
,且实现类中必须要重写接口中的所有方法