第13讲 | 谈谈接口和抽象类有什么区别?
杨晓峰
该思维导图由 AI 生成,仅供参考
Java 是非常典型的面向对象语言,曾经有一段时间,程序员整天把面向对象、设计模式挂在嘴边。虽然如今大家对这方面已经不再那么狂热,但是不可否认,掌握面向对象设计原则和技巧,是保证高质量代码的基础之一。
面向对象提供的基本机制,对于提高开发、沟通等各方面效率至关重要。考察面向对象也是面试中的常见一环,下面我来聊聊面向对象设计基础。
今天我要问你的问题是,谈谈接口和抽象类有什么区别?
典型回答
接口和抽象类是 Java 面向对象设计的两个基础机制。
接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到 API 定义和实现分离的目的。接口,不能实例化;不能包含任何非常量成员,任何 field 都是隐含着 public static final 的意义;同时,没有非静态方法实现,也就是说要么是抽象方法,要么是静态方法。Java 标准类库中,定义了非常多的接口,比如 java.util.List。
抽象类是不能实例化的类,用 abstract 关键字修饰 class,其目的主要是代码重用。除了不能实例化,形式上和一般的 Java 类并没有太大区别,可以有一个或者多个抽象方法,也可以没有抽象方法。抽象类大多用于抽取相关 Java 类的共用方法实现或者是共同成员变量,然后通过继承的方式达到代码复用的目的。Java 标准库中,比如 collection 框架,很多通用部分就被抽取成为抽象类,例如 java.util.AbstractList。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
Java面向对象设计的基础机制包括接口和抽象类。接口是对行为的抽象,包含抽象方法的集合,而抽象类则是不能被实例化的类,用于代码重用。在Java中,类实现接口使用implements关键词,继承抽象类则使用extends关键词。除了介绍基础知识外,文章还扩展了接口和抽象类的实践应用,以及Java语言的演进,包括函数式编程的支持和接口的方法实现。此外,文章还涉及了面向对象设计的基本要素:封装、继承、多态,以及S.O.L.I.D原则。最后,通过一个面向对象设计原则的实际案例,展示了如何改进代码实现。整体而言,本文全面梳理了Java面向对象技术,对读者有很大帮助。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 核心技术面试精讲》,新⼈⾸单¥59
《Java 核心技术面试精讲》,新⼈⾸单¥59
立即购买
登录 后留言
全部留言(58)
- 最新
- 精选
- Woongclass SlumDogVIPServiceProvider和RealVIPServiceProvider缺少implememts.
作者回复: 汗,手敲搞出这种低级错误,非常感谢指出
2018-06-0227 - 小文同学hi,老师早上好。我是一家游戏公司的程序员,由于项目非常紧,所以很多技术写的代码,都非常乱。 我们的战斗系统中,之前的开发模式是在战斗逻辑里面嵌入并修改一些代码,以达到新技能的开发。这就是典型的以修改来达到需求。通过重构之后,技能的逻辑通过扩展的方式开发出来,可以通过继承技能的抽象类,来完成技能的开发。现在我们这部分的模块从最难处理变成最容易开发的了。
作者回复: 听说过电信代码里有26个if-else……然后还有俩是重复的,少的时候无所谓,多了就是坑
2018-06-02217 - bamboo老师最后举的例子应该就是把简单工厂模式修改为工厂方法模式。原来的违反了开闭选择,工厂方法模式刚好弥补了这个问题,倒是相应的系统中的类个数也成对的增加。设计模式没有最优的,只是特定场景下我们选择相对优良的模式来优化我们的逻辑。不知道是否正确,望老师指点迷津,谢谢老师。🙂
作者回复: 嗯,也要避免过度设计,这个只是举例
2018-06-029 - 卡斯瓦德其实interface的deault可以通过结合抽象父类来实现吧,抽象父类实现接口方法,但是因为抽象所以不能实例化,而其子类拥有重写权,可以做到defualt的效果
作者回复: 不错,只是: 抽象类不能多继承; default method不会打破现有代码兼容性,lambda需要靠它来无缝增强collection之类API
2018-07-1427 - 夏洛克的救赎但是,list 实际会被推断为“ArrayList < String >” ArrayList<String> list = new ArrayList<String>(); 不是很理解
作者回复: 一般我们会写成: list<String> list=new ArrayList……; 里氏代换,可以参考oo基础那章
2018-06-173 - Yao问个问题,jdk8 default 是否应该使用???
作者回复: 看你的需求啊,比如代码需不需要兼容老的jdk版本;有没有需要用的逻辑
2018-06-122 - lorancechenvip的例子里面,T extend User这里,直接用User也一样吧
作者回复: 是的,说明一下
2018-06-092 - 小情绪杨老师,对于开头的:接口中没有非静态方法实现,也就是说要么是抽象方法,要么是静态方法。这句话我有疑问,java.util.List中default 方法不就是非静态方法的实现吗?还是我理解有误?
作者回复: 前面就是个举例的回答,用来后面分析的,新版Java不准确了
2018-06-032 - 张希功(pokercc)"void serviceVIP(T extend User user>) " 这是java新出的写法吗?我用java8这样写,编译不通过呢
作者回复: 本来是个示意的伪代码...为了尽量精简的说明结构设计,不是为了语法
2018-06-03 - 公号-技术夜未眠接口vs抽象类vs类 1 支持多重继承:接口支持;抽象类不支持;类不支持; 2 支持抽象函数:接口语义上支持;抽象类支持;类不支持; 3 允许函数实现:接口不允许;抽象类支持;类允许; 4 允许实例化:接口不允许;抽象类不允许;类允许; 5 允许部分函数实现:接口不允许;抽象类允许;类不允许。 6 定义的内容:接口中只能包括public函数以及public static final常量;抽象类与类均无任何限制。 7 使用时机:当想要支持多重继承,或是为了定义一种类型请使用接口;当打算提供带有部分实现的“模板”类,而将一些功能需要延迟实现请使用抽象类;当你打算提供完整的具体实现请使用类。 在实际项目开发过程,一方面是业务需求频繁,需要满足开闭原则,也就是小到一个模块,大到一个架构都需要有好的可扩展性;另外一方面软件往往是团队协同开发的过程;由于团队成员水平参差不齐,这方面的坑不少。可以通过前期做好设计评审、code review等手段去提升代码质量。2018-06-024132
收起评论