Java 核心技术面试精讲
杨晓峰
前 Oracle 首席工程师
125942 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
Java 核心技术面试精讲
15
15
1.0x
00:00/00:00
登录|注册

第13讲 | 谈谈接口和抽象类有什么区别?

依赖反转
接口分离
里氏替换
开关原则
单一职责
可以有一个或多个抽象方法
用于代码重用
不能实例化
不能包含非静态方法实现
不能包含非常量成员
不能实例化
对行为的抽象
S.O.L.I.D原则
多态
继承
封装
Java 8后接口的方法实现
Java 8的函数式编程支持
接口的不同实践
特定场景下的抽象类和接口的使用
Java相比其他面向对象语言的区别
抽象类
接口
代码改进示例
OOP原则实践中的取舍
面向对象编程的基本设计原则
基本要素
实践和语言变化
Java语言特性演进
妥善地使用接口和抽象类
Java的基本元素的语法
继承abstract class使用extends关键词
Java类实现interface使用implements关键词
区别
与朋友讨论
遵循开关原则的代码
产品代码的设计原则违反
思考题
面向对象设计在面试题目中的分析
面向对象设计
知识扩展
高频考点
抽象类和接口
一课一练
Java面向对象技术

该思维导图由 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
立即购买
登录 后留言

全部留言(58)

  • 最新
  • 精选
  • Woong
    class SlumDogVIPServiceProvider和RealVIPServiceProvider缺少implememts.

    作者回复: 汗,手敲搞出这种低级错误,非常感谢指出

    2018-06-02
    27
  • 小文同学
    hi,老师早上好。我是一家游戏公司的程序员,由于项目非常紧,所以很多技术写的代码,都非常乱。 我们的战斗系统中,之前的开发模式是在战斗逻辑里面嵌入并修改一些代码,以达到新技能的开发。这就是典型的以修改来达到需求。通过重构之后,技能的逻辑通过扩展的方式开发出来,可以通过继承技能的抽象类,来完成技能的开发。现在我们这部分的模块从最难处理变成最容易开发的了。

    作者回复: 听说过电信代码里有26个if-else……然后还有俩是重复的,少的时候无所谓,多了就是坑

    2018-06-02
    2
    17
  • bamboo
    老师最后举的例子应该就是把简单工厂模式修改为工厂方法模式。原来的违反了开闭选择,工厂方法模式刚好弥补了这个问题,倒是相应的系统中的类个数也成对的增加。设计模式没有最优的,只是特定场景下我们选择相对优良的模式来优化我们的逻辑。不知道是否正确,望老师指点迷津,谢谢老师。🙂

    作者回复: 嗯,也要避免过度设计,这个只是举例

    2018-06-02
    9
  • 卡斯瓦德
    其实interface的deault可以通过结合抽象父类来实现吧,抽象父类实现接口方法,但是因为抽象所以不能实例化,而其子类拥有重写权,可以做到defualt的效果

    作者回复: 不错,只是: 抽象类不能多继承; default method不会打破现有代码兼容性,lambda需要靠它来无缝增强collection之类API

    2018-07-14
    2
    7
  • 夏洛克的救赎
    但是,list 实际会被推断为“ArrayList < String >” ArrayList<String> list = new ArrayList<String>(); 不是很理解

    作者回复: 一般我们会写成: list<String> list=new ArrayList……; 里氏代换,可以参考oo基础那章

    2018-06-17
    3
  • Yao
    问个问题,jdk8 default 是否应该使用???

    作者回复: 看你的需求啊,比如代码需不需要兼容老的jdk版本;有没有需要用的逻辑

    2018-06-12
    2
  • lorancechen
    vip的例子里面,T extend User这里,直接用User也一样吧

    作者回复: 是的,说明一下

    2018-06-09
    2
  • 小情绪
    杨老师,对于开头的:接口中没有非静态方法实现,也就是说要么是抽象方法,要么是静态方法。这句话我有疑问,java.util.List中default 方法不就是非静态方法的实现吗?还是我理解有误?

    作者回复: 前面就是个举例的回答,用来后面分析的,新版Java不准确了

    2018-06-03
    2
  • 张希功(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-02
    4
    132
收起评论
显示
设置
留言
58
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部