阿⾥java设计模式⾯试题汇总(附答案),看看你都掌握了吗1.接⼝是什么?为什么要使⽤接⼝⽽不是直接使⽤具体类?
接⼝⽤于定义 API。它定义了类必须得遵循的规则。同时,它提供了⼀种抽象,因为客户端只使⽤接⼝,这样可以有多重实现,如 List 接⼝,你可以使⽤可随机访问的 ArrayList,也可以使⽤⽅便插⼊和删除的 LinkedList。接⼝中不允许写代码,以此来保证抽象,但是 Java 8 中你可以在接⼝声明静态的默认⽅法,这种⽅法是具体的。
2.java中,抽象类与接⼝之间有什么区别?
1.⼀个类可以实现多个接⼝ ,但却只能继承最多⼀个抽象类。
2.抽象类可以包含具体的⽅法 , 接⼝的所有⽅法都是抽象的。
3.抽象类可以声明和使⽤字段 ,接⼝则不能,但接⼝可以创建静态的final常量。
4.接⼝的⽅法都是public的,抽象类的⽅法可以是public,protected,private或者默认的package;
5.抽象类可以定义构造函数,接⼝却不能。
3.除了单例模式,你在⽣产环境中还⽤过什么设计模式?
这需要根据你的经验来回答。⼀般情况下,你可以说依赖注⼊,⼯⼚模式,装饰模式或者观察者模式,随意选择你使⽤过的⼀种即可。不过你要准备回答接下的基于你选择的模式的问题。
4.什么是⾥⽒替换原则?
1、开闭原则(Open Close Principle)
开闭原则就是说对扩展开放,对修改关闭。在程序需要进⾏拓展的时候,不能去修改原有的代码,实现⼀个热插拔的效果。所以⼀句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使⽤接⼝和抽象类,后⾯的具体设计中我们会提到这点。
2、⾥⽒代换原则(Liskov Substitution Principle)
⾥⽒代换原则(Liskov Substitution Principle LSP)⾯向对象设计的基本原则之⼀。 ⾥⽒代换原则中说,任何基类可以出现的地⽅,⼦类⼀定可以出现。 LSP是继承复⽤的基⽯,只有当衍⽣类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复⽤,⽽衍⽣类也能够在基类的基础上增加新的⾏为。⾥⽒代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。⽽基类与⼦类的继承关系就是抽象化的具体实现,所以⾥⽒代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科
3、依赖倒转原则(Dependence Inversion Principle)
这个是开闭原则的基础,具体内容:真对接⼝编程,依赖于抽象⽽不依赖于具体。
4、接⼝隔离原则(Interface Segregation Principle)
这个原则的意思是:使⽤多个隔离的接⼝,⽐使⽤单个接⼝要好。还是⼀个降低类之间的耦合度的意思,从这⼉我们看出,其实设计模式就是⼀个软件的设计思想,从⼤型软件架构出发,为了升级和维护⽅便。所以上⽂中多次出现:降低依赖,降低耦合。
5、迪⽶特法则(最少知道原则)(Demeter Principle)
为什么叫最少知道原则,就是说:⼀个实体应当尽量少的与其他实体之间发⽣相互作⽤,使得系统功能模块相对独⽴。
6、合成复⽤原则(Composite Reuse Principle)
原则是尽量使⽤合成/聚合的⽅式,⽽不是使⽤继承
5.什么情况下会违反迪⽶特法则?为什么会有这个问题?
迪⽶特法则建议“只和朋友说话,不要陌⽣⼈说话”,以此来减少类之间的耦合。
6.适配器模式是什么?什么时候使⽤?
适配器模式(Adapter Pattern)是作为两个不兼容的接⼝之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独⽴接⼝的功能。适配器模式提供对接⼝的转换。如果你的客户端使⽤某些接⼝,但是你有另外⼀些接⼝,你就可以写⼀个适配去来连接这些接⼝。
7.适配器模式与装饰器模式有什么区别?
虽然适配器模式和装饰器模式的结构类似,但是每种模式的出现意图不同。适配器模式被⽤于桥接两个接⼝,⽽装饰模式的⽬的是在不修改类的情况下给类增加新的功能。
装饰者模式:动态地将责任附加到对象上,若要扩展功能,装饰者模提供了⽐继承更有弹性的替代⽅案。
通俗的解释:装饰模式就是给⼀个对象增加⼀些新的功能,⽽且是动态的,要求装饰对象和被装饰对象实现同⼀个接⼝,装饰对象持有被装饰对象的实例。
适配器模式:将⼀个类的接⼝,转换成客户期望的另⼀个接⼝。适配器让原本接⼝不兼容的类可以合作⽆间。
适配器模式有三种:类的适配器模式、对象的适配器模式、接⼝的适配器模式。
通俗的说法:适配器模式将某个类的接⼝转换成客户端期望的另⼀个接⼝表⽰,⽬的是消除由于接⼝不匹配所造成的类的兼容性问题。
举例如下:
1、适配器模式
//file 为已定义好的⽂件流
FileInputStream fileInput = new FileInputStream(file);
InputStreamReader inputStreamReader = new InputStreamReader(fileInput);
以上就是适配器模式的体现,FileInputStream是字节流,⽽并没有字符流读取字符的⼀些api,因此通过InputStreamReader将其转为Reader⼦类,因此有了可以操作⽂本的⽂件⽅法。
2、装饰者模式
BufferedReader bufferedReader=new BufferedReader(inputStreamReader);构造了缓冲字符流,将
FileInputStream字节流包装为BufferedReader过程就是装饰的过程,刚开始的字节流FileInputStream只有read⼀个字节的⽅法,包装为inputStreamReader后,就有了读取⼀个字符的功能,在包装为BufferedReader后,就拥有了read⼀⾏字符的功能。
8.适配器模式和代理模式之间有什么不同?
这个问题与前⾯的类似,适配器模式和代理模式的区别在于他们的意图不同。由于适配器模式和代理模式都是封装真正执⾏动作的类,因此结构是⼀致的,但是适配器模式⽤于接⼝之间的转换,⽽代理模式则是增加⼀个额外的中间层,以便⽀持分配、控制或智能访问。
9.什么是模板⽅法模式?
模板⽅法提供算法的框架,你可以⾃⼰去配置或定义步骤。例如,你可以将排序算法看做是⼀个模板。它定义了排序的步骤,但是具体的⽐较,可以使⽤ Comparable 或者其语⾔中类似东西,具体策略由你去配置。列出算法概要的⽅法就是众所周知的模板⽅法。
10.什么时候使⽤访问者模式?
访问者模式⽤于解决在类的继承层次上增加操作,但是不直接与之关联。这种模式采⽤双派发的形式来增加中间层。
11.什么时候使⽤组合模式?
组合模式使⽤树结构来展⽰部分与整体继承关系。它允许客户端采⽤统⼀的形式来对待单个对象和对象容器。当你想要展⽰对象这种部分与整体的继承关系时采⽤组合模式。
12.继承和组合之间有什么不同?
虽然两种都可以实现代码复⽤,但是组合⽐继承共灵活,因为组合允许你在运⾏时选择不同的实现。⽤组合实现的代码也⽐继承测试起来更加简单。
13.描述Java中的重载与重写?什么时候⽤重载,什么时候⽤重写?
重载和重写都允许你⽤相同的名称来实现不同的功能,但是重载是编译时活动,⽽重写是运⾏时活动。你可以在同⼀个类中重载⽅法,但是只能在⼦类中重写⽅法。重写必须要有继承。
对有经验的Java设计师来说,这是⼀个相当简单的问题。如果你看到⼀个类的不同实现有着不同的⽅式来做同⼀件事,那么就应该⽤重写(overriding),⽽重载(overloading)是⽤不同的输⼊做同⼀件事。在Java中,重载的⽅法签名不同,⽽重写并不是。
14.Java中,嵌套公共静态类与顶级类有什么不同?
类的内部可以有多个嵌套公共静态类,但是⼀个 Java 源⽂件只能有⼀个顶级公共类,并且顶级公共类的名称与源⽂件名称必须⼀致。
15.OOP中的组合、聚合和关联有什么区别?
如果两个对象彼此有关系,就说他们是彼此相关联的。组合和聚合是⾯向对象中的两种形式的关联。组合是⼀种⽐聚合更强⼒的关联。组合中,⼀个对象是另⼀个的拥有者,⽽聚合则是指⼀个对象使⽤另⼀个对象。如果对象 A 是由对象 B 组合的,则 A 不存在的话,B⼀定不存在,但是如果 A 对象聚合了⼀个对象 B,则即使 A 不存在了,B 也可以单独存在。
16.给我⼀个符合开闭原则的设计模式的例⼦?
开闭原则要求你的代码对扩展开放,对修改关闭。这个意思就是说,如果你想增加⼀个新的功能,你可以很容易的在不改变已测试过的代码的前提下增加新的代码。有好⼏个设计模式是基于开闭原则的,如策略模式,如果你需要⼀个新的策略,只需要实现接⼝,增加配置,不需要改变核⼼逻辑。⼀个正在⼯作的例⼦是 Collections.sort() ⽅法,这就是基于策略模式,遵循开闭原则的,你不需为新的对象修改 sort()⽅法,你需要做的仅仅是实现你⾃⼰的 Comparator 接⼝。
17.使⽤⼯⼚模式最主要的好处是什么?你在哪⾥使⽤?
⼯⼚模式的最⼤好处是增加了创建对象时的封装层次。如果 你使⽤⼯⼚来创建对象,之后你可以使⽤更⾼级和更⾼性能的实现来替换原始的产品实现或类,这不需要在调⽤层做任何修改。可以看我的⽂章⼯⼚模式得更详细的解释和和了解更多的好处。
18.⼯⼚模式与抽象⼯⼚模式的区别?
⾸先来看看这两者的定义区别:
⼯⼚模式:定义⼀个⽤于创建对象的借⼝,让⼦类决定实例化哪⼀个类
抽象⼯⼚模式:为创建⼀组相关或相互依赖的对象提供⼀个接⼝,⽽且⽆需指定他们的具体类
个⼈觉得这个区别在于产品,如果产品单⼀,最合适⽤⼯⼚模式,但是如果有多个业务品种、业务分类时,通过抽象⼯⼚模式产⽣需要的对象是⼀种⾮常好的解决⽅式。再通俗深化理解下:⼯⼚模式针对的是⼀个产品等级结构 ,抽象⼯⼚模式针对的是⾯向多个产品等级结构的。
再来看看⼯⼚⽅法模式与抽象⼯⼚模式对⽐:
⼯⼚⽅法模式
抽象⼯⼚模式
针对的是⼀个产品等级结构
针对的是⾯向多个产品等级结构
⼀个抽象产品类
多个抽象产品类
可以派⽣出多个具体产品类
每个抽象产品类可以派⽣出多个具体产品类
⼀个抽象⼯⼚类,可以派⽣出多个具体⼯⼚类
⼀个抽象⼯⼚类,可以派⽣出多个具体⼯⼚类
每个具体⼯⼚类只能创建⼀个具体产品类的实例
每个具体⼯⼚类可以创建多个具体产品类的实例
18.什么时候使⽤享元模式?
享元模式通过共享对象来避免创建太多的对象。为了使⽤享元模式,你需要确保你的对象是不可变的,这样你才能安全的共享。JDK 中String 池、Integer 池以及 Long 池都是很好的使⽤了享元模式的例⼦。
19 什么是设计模式?你是否在你的代码⾥⾯使⽤过任何设计模式?
设计模式是世界上各种各样程序员⽤来解决特定设计问题的尝试和测试的⽅法。设计模式是代码可⽤性的延伸。
20 你可以说出⼏个在JDK库中使⽤的设计模式吗?
装饰器设计模式(Decorator design pattern)被⽤于多个Java IO类中。单例模式(Singleton pattern)⽤于Runtime,Calendar和其他的⼀些类中。⼯⼚模式(Factory pattern)被⽤于各种不可变的类如Boolean,像Boolean.valueOf,观察者模式(Observer pattern)被⽤于Swing和很多的事件监听中。
21.Java中什么是单例设计模式?⽤Java写出线程安全的单例
单例对象(Singleton)是⼀种常⽤的设计模式。在Java应⽤中,单例对象能保证在⼀个JVM中,该对象只有⼀个实例存在。这样的模式有⼏个好处:
1、某些类创建⽐较频繁,对于⼀些⼤型的对象,这是⼀笔很⼤的系统开销。
2、省去了new操作符,降低了系统内存的使⽤频率,减轻GC压⼒。
3、有些类如交易所的核⼼交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(⽐如⼀个军队出现了多个司令
员同时指挥,肯定会乱成⼀团),所以只有使⽤单例模式,才能保证核⼼交易服务器独⽴控制整个流程。
单例模式重点在于在整个系统上共享⼀些创建时较耗资源的对象。整个应⽤中只维护⼀个特定类实例,它被所有组件共同使⽤。
Java.lang.Runtime是单例模式的经典例⼦。你可以在我的⽂章Java单例模式的10个问题看到更多的问题和讨论。从Java 5开始你可以使⽤枚举(enum)来实现线程安全的单例。
java重写和重载的区别22在Java中,什么叫观察者设计模式(observer design pattern)?
观察者模式是基于对象的状态变化和观察者的通讯,以便他们作出相应的操作。简单的例⼦就是⼀个天⽓系统,当天⽓变化时必须在展⽰给公众的视图中进⾏反映。这个视图对象是⼀个主体,⽽不同的视图是观察者。可以在这篇⽂章中看到Java观察者模式的完整例⼦。
23什么是责任链设计模式?
责任链模式(Chain of Responsibility Pattern)为请求创建了⼀个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进⾏解耦。这种类型的设计模式属于⾏为型模式。在这种模式中,通常每个接收者都包含对另⼀个接收者的引⽤。如果⼀个对象不能处理该请求,那么它会把相同的请求传给下⼀个接收者,依此类推。
⼩编是⼀名多年的Java程序员,最近在⼯作也总结了⼀些⼤⼚爱问的⾯试题,现在免费送给⼤家,有需要的⼩伙伴可以加Q809389099免费获取
加Q809389099免费获取
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论