java基础-抽象类和接口

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_18242391/article/details/81475802

定义


接口在面向对象编程中占着很重要的地位,它是对于一种事物行为的抽象提取,内部只需要持有接口的引用,外部可以根据具体事物做不同的扩展,而不修改内部的引用逻辑,它的主要作用是在框架中实现不同对象的相互引用解耦,而不是持有具体类的引用。在百度中对接口的定义:对接口泛指实体把自己提供给外界的一种抽象化物(可以为另一实体),用以由内部操作分离出外部沟通方法,使其能被内部修改而不影响外界其他实体与其交互的方式。

定义一个接口的格式如下:

[public] interface InterfaceName {

}

接口变量会被隐式的指定为public static final,如果用public修饰会报编译错误,而方法会被隐式指定为public abstarct,用其他修饰符修饰就会报错。接口的方法不能有具体的实现,它是一种极度抽象的类型,比抽象类更加抽象,一般不会在接口中定义变量。

类实现接口使用implements

class ClassName implements Interface1,Interface2,[....]{
}

一个类可以实现多个接口,且必须实现里面的所有方法

抽象类 同样在面向对象编程中占有一定的地位,它可以对于某一种事物的抽象能力提取,同时可以在抽象类中实现公有的行为,也可以对接口做一定的适配,减少具体实现类要重写所有方法的问题,起到一个适配器的作用,同时在编程中担任一个基类 的作用,对于公有行为的提取。百度中对抽象类 的定义如下:抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。

抽象方法定义格式:

[public] abstract class ClassName {
    abstract void fun();
}

抽象类定义格式:

[public] abstract class ClassName {
    abstract void fun();
}

由于抽象类含有无具体的实现方法,所以抽象类不能用来创建对象,抽象类也可以无抽象方法,只要类是抽象的。

和普通类的区别:

1 .抽象方法必须是public或者protected,缺省为public,为private则子类无法实现抽象类方法
2 .抽象类不能用来创建对象
3 .一个类继承抽象类,必须实现里面的所有抽象方法。

异同


1.同


  • 1 .不能实例化;
  • 2 .包含未实现的方法声明;
  • 3 .派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员)。

2.异


语法层面:

  • 1 .类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承,从抽象类派生的类仍可实现接口,从而得出接口是用来解决多重继承问题的。
  • 2 .抽象类当中可以存在非抽象的方法,可接口不能,且它里面的方法只是一个声明必须用public来修饰没有具体实现的方法。
  • 3 .抽象类中的成员变量可以被不同的修饰符来修饰,可接口中的成员变量默认的都是静态常量(static final)。
  • 4 .抽象类是对象的抽象,然而接口是一种行为规范。
  • 5 .接口不能包含构造器,抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。

设计层面:

1 .抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。
2 .设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。

使用场景


1 . 由于抽象类中不一定都是抽象方法,也可以有具体的方法,所以可以把公有的方法提升到抽象类中,然后具体的方法留给子类实现(模板设计模式) ,可以更好的实现代码的复用,典型的BaseActivityBaseFragment
2 . 抽象类表示的是这个对象是什么,而接口表示的是这个对象能干什么 ,面向对象的编程语言中,一个类只能继承一个类(抽象类),但是可以实现多个接口。当你关注一个事物的时候,用抽象类;当你关注一个操作的时候,用接口。

3 .另一个重要的概念就是多态多态通过分离做什么和怎么做,从另一个角度将接口和实现分离出来。多态不但能够改善代码的组织结果和可读性,还能创建可扩展的程序—-即无论在项目最初创建时还是在需要添加新功能时都可以“生长”的程序。由于接口更关注于动作的实现,多态主要是分离“做什么”和“怎么做”,所以接口的另一个重要的应用就是多态的实现(当然抽象类也可以实现多态,但是接口更加合适)。

抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口,在设计阶段会降低难度的。

参考

1.深入理解Java的接口和抽象类
2.抽象类和接口的区别与应用场景

猜你喜欢

转载自blog.csdn.net/qq_18242391/article/details/81475802