简单理解抽象类、接口

时间:2020-8-2 作者:admin


抽象类

特点:

  1. 抽象类中可以构造方法,构造函数可以是私有的;
  2. 抽象类中可以存在普通属性,方法,静态属性和方法;
  3. 如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法;
  4. 抽象类中的抽象方法,需要有子类全部实现,如果子类不实现,则子类也需要定义为抽象的;
  5. 抽象类不能被实例化,抽象类和抽象方法必须被abstract修饰;
  6. 抽象方法可以重载,抽象方法之间可以重载,抽象方法也可以和实体方法重载;
  7. 抽象类不可以是最终类,因为抽象类必须被子类继承,然后子类中重写其中的抽象方法,但是最终类不能被继承。

关键字使用注意:

抽象类中的抽象方法(其前有abstract修饰)不能用private、final、static、synchronized、native访问修饰符修饰。 可以是default,要求抽象类和子类必须同包。

关于各JDK版本的抽象类

  • JDK 1.8以前,抽象类的方法默认访问权限为protected
  • JDK 1.8时,抽象类的方法默认访问权限变为default

接口

接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的,
接口中定义的方法都是抽象方法(jdk1.7及其以前)。用interface关键字来声明一个接口。用implements让类和接口之间产生联系,这种联系称之为实现。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final
,不管你写不写,都会默认是这样,可以全不写但是不能错写

特点:

  • 接口中没有构造方法,也不能实例化接口的对象(所以接口不能继承类);
  • 接口可以实现多继承,即一个类可以实现多个接口;
  • 接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法则实现类定义为抽象类;
  • 接口可以继承接口,用extends;
  • public static final 修饰属性时,即为常量,必须赋值

关于各JDK版本的接口 :

  • JDK 1.8以前,接口中只包含抽象方法,使用public abstract 修饰。
  • JDK 1.8时,接口中的方法可以是public的,也可以是default、static的。使用default修饰,在接口的实现类中,可以直接调用该方法,也可以重写该方法。 使用static修饰,通过接口直接调用。
  • JDK 1.9时,接口中的方法可以是private的 ,供接口内的默认方法和静态方法调用。

接口和抽象类的区别:

从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。二者在应用方面也有一定的区别,接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用。

另外,接口和抽象类在方法上有区别:

  1. 抽象类可以有构造方法,接口中不能有构造方法。
  2. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
  3. 抽象类中可以有普通成员变量,接口中没有普通成员变量
  4. 抽象类中的抽象方法的访问类型可以是public,protected和默认类型
  5. 抽象类中可以包含静态方法,接口中不能包含静态方法
  6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型
  7. 一个类可以实现多个接口,但只能继承一个抽象类。

看完上面最基础层面的抽象类和接口比较,相信你对接口、抽象类有了比较全面的了解,接下来可以往更加全面去认识接口和抽象类,体会它们在实际开发中的作用。
这里推荐一篇非常棒的博文:接口和抽象类的区别

我特别喜欢这里面的一段话:

如果单从具体代码来看,对这两个概念很容易模糊,甚至觉得接口就是多余的,因为单从具体功能来看,除多重继承外(C#,Java中),抽象类似乎完全能取代接口。但是,难道接口的存在是为了实现多重继承?

当然不是。我认为,抽象类和接口的区别在于使用动机。使用抽象类是为了代码的复用,而使用接口的动机是为了实现多态性。所以,如果你在为某个地方该使用接口还是抽象类而犹豫不决时,那么可以想想你的动机是什么。

还有一个对于初学者来说需要掌握的思想:面向接口编程。在实际开发中,面向接口的例子就非常多。比如:

在spring的事务管理中需要注入数据源 dataSoure,由源码可知,底层set()方法参数为 DataSource 接口,故数据连接池只要实现 DataSource 接口即可(如DruidDataSource、BDCP等)。

这里推荐一篇帮助理解面向接口编程思想的博文:面向接口编程的一个例子

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。