Java基础-抽象类和接口

抽象类和接口也是 Java 面试中常考的,下面就来总结一下抽象类和接口的相关知识。

抽象类是类,Java 中类是单继承的,抽象类是从其他子类中抽象出来的类模板,包含这些子类共有的成员(属性和方法),子类在抽象类的基础上进行修改。和普通类一样,抽象类中也有属性和方法,但是在类名上却多了一个 abstract 关键字和可以有普通类没有的抽象方法,并且抽象类不能实例化,其他的和普通类没什么不同。抽象方法是一个被 abstract 关键字修饰的方法,不能在抽象类中实现,抽象类中只是个方法声明,要在子类中实现,不管方法体内是否真的有内容。

接口不是类,也不能被实例化,java 中接口之间是也单继承的(子接口),类和接口之间不是继承而是实现,一个类可以实现多个接口。接口中也有属性和方法,但是却比普通类多了很多的限制。接口中的属性和方法都是默认是被 public 关键字修饰的,不管你写不写。并且属性默认还被 static 和 final 关键词修饰,也即是属性是一个静态常量,属性可以通过接口名称直接使用。接口中的方法在 Java8 之前只能声明不能实现,这样的话,在接口方法中添加一个方法,就需要在其所有实现类中就实现该方法,不管在方法体中是否有内容,而在 Java 8 之后,接口可以添加默认方法了,默认方法被 default 关键字修饰,这种方法可以直接在接口中实现,其实现类可以直接使用该方法(不用声明)或者根据需要重写这个默认方法。

总结一波,抽象类和接口的异同点:

相同点:

  • 抽象类和接口都不能被实例化,但是可以作为引用类型引用子类对象和实现类对象。
  • 子类继承抽象类,实现类实现接口,子接口继承父接口,子类必须实现抽象类中所有的抽象方法,实现类必须实现接口中所有的非默认方法,而子接口不是必要的。

不同点:

  • 抽象类是类,接口是接口,类可以继承抽象类,也可以实现接口,但是接口只能继承接口,不能继承类。
  • 抽象类中的成员(属性和方法)可以是被 private、默认(default)、protected、public 关键字修饰,但接口中的成员只能被 public 关键字修饰,并且属性还要被 static 和 final 关键字修饰。
  • 抽象类虽然也不能实例化,但是却可以有构造方法,供子类使用,而接口则没有,并且抽象类中可以有静态代码块,接口也没有。

从设计的角度上来看,抽象类提供的是一种 IS-A 的关系,满足里氏替换原则,即子类对象必须能够替换父类对象中的所有内容。而接口提供的是一种 HAS-A 的关系,是一个 “赋能” 者,能够让其他类以最小的代价拥有某种方法。比如现实生活中,商家使用支付宝微信收款,支付宝微信就可以看做是 “接口“,有了这些接口,商家就有了线上收款的能力。

抽象类和接口在一定程度上都实现了代码的重用,但在很多情况下,接口要优于抽象类,接口没有抽象类严格的层次要求,在面向对象设计中,善用接口可以降低代码的耦合性。在软件设计中,也提倡多用接口少用继承,对应的也有策略设计模式和面向接口编程思想。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏web前端教室

常用技巧之JS判断数组中某元素出现次数

现在前端开发经常需要从api中获取返回的数组, 也许是array,也许是json, 不管是什么,都需要对返回的数据进行再处理, 其中一个重要且经常用到的操作, ...

5518
来自专栏Python小屋

Python求解进制问题(阿里巴巴2015笔试题)

问题描述:用十进制计算30的阶乘,然后把结果转换成三进制表示,那么该进制表示的结果末尾会有多少个连续0? 解析:作为笔试题的话,要想按照题意先把阶乘结果计算出来...

3697
来自专栏PHP在线

正则表达式详解

点号(.)是元字符,匹配除换行符以外的任意字符。 星号(*)是元字符,代表数量。 点号星号连在一起就是匹配任意数量的不包括换行符的字符。 \s匹配任意空白字符。...

2975
来自专栏deepcc

Js apply() call()使用详解

3586
来自专栏GreenLeaves

JavaScript之apply()和call()的区别

我 在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示 例,总算是看...

2207
来自专栏老九学堂

一分钟掌握C语言结构体常见方法

把结构体名称去掉,这样更简洁,不过也不能定义其他同结构体变量了——至少我现在没掌握这种方法。

1332
来自专栏编程

Python那些事——Python之函数式编程!

函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有...

1987
来自专栏较真的前端

前端面试题“七连击”(一)

2037
来自专栏java学习

面试题18(覆盖(重写)与重载的关系是什么?)

覆盖(重写)与重载的关系是什么? A) 覆盖(重写)只有出现在父类与子类之间,而重载可以出现在同一个类中 B)覆盖(重写)方法可以有不同的方法名,而重载方法必须...

2948
来自专栏积累沉淀

Java设计模式(五)----原型模式

原型模式(Prototype) 一、概述 二、结构 三、浅度克隆和深度克隆  浅度克隆  深度克隆 一、概述  定义:原型模式属...

1989

扫码关注云+社区

领取腾讯云代金券