抽象类和接口的区别

抽象类
  • 抽象类:包含抽象方法的类叫做抽象类。
  • 抽象类不能实例化:由于为抽象类创建对象是不安全的(没有实际意义的),所以我们会从编译器那里得到一条出错信息。
  • 如果从一个抽象类继承,并想创建该新类的对象,那么就必须为基类中的所有抽象方法提供方法定义。(可以选择不做,那么导出的类也是抽象类,且编译器将会强制我们用 abstract 关键字来限定这个类)
  • 抽象类可以是类的抽象性明确起来;抽象类还是很有用的重构工具,以为它们使得我们可以很容易地将公共方法沿着继承层次结构向上移动。
接口
  • 通用接口建立起一种基本形式,以此表示所有导出类的共同部分。
  • 接口只提供了形式,而未提供任何具体实现。(“所有实现了该特定接口的类看起来都像这样”,接口被用来建立类与类之间的协议)
  • 接口能够多重继承。(使用接口的核心原因:为了能够向上转型为多个基类型(以及由此而带来的灵活性))
  • 接口可以包含域,但是这些域隐式地是static和final的。
  • 在接口中的每一个方法都只是一个声明,这是编译器所允许的在接口中唯一存在的事物
  • 可以在接口中显示地将方法声明为public的,但即使你不这么做,它们也是public的。当要实现一个接口时,在接口中被定义的方法必须被定义为是public的。
  • 使用接口的核心原因:为了能够向上转型为多个基类型(以及由此而带来的灵活性)。
  • 适配接口。允许一个接口具有多个不同的实现。可以在任何现有类上添加新的接口,所以这意味着让方法接受接口类型,是一种让任何类都可以对该方法进行适配的方式。
  • 嵌套接口:接口可以嵌套在类或其他接口中。(接口嵌套在其他接口中)嵌套在另一个接口中的接口自动就是public的(所有的接口元素都必须是public的),而不能声明为private的。当实现某个接口时,并不需要实现嵌套在其内部的任何接口。(接口嵌套在类中)而且,private接口不能在定义它的类之外被实现。
  • 接口与工厂模式。
  • 接口在Java8中+关键字default后可以实现 默认方法实现。Java9中允许private方法实现(为默认方法服务)。
区别
从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
  • 接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
  • 类可以实现很多个接口,但是只能继承一个抽象类
  • 抽象类可以在不提供接口方法实现的情况下实现接口。
  • Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
  • Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
  • 类可以不实现抽象类和接口声明的所有方法,但是类必须得声明成是抽象的。
  • 接口是绝对抽象的,不可以被实例化,抽象类也不可以被实例化。
我们应该使用接口还是抽象类?
  • 如果要创建不带任何方法定义和成员变量的基类,那么就应该选择接口而不是 抽象类。事实上,如果知道某事物应该成为一个基类,那么第一选择应该是使 它成为一个接口。
  • 恰当的原则应该是优先选择类而不是接口。从类开始,如果接口的必需性变得 非常明确,那么就进行重构。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值