志在指尖
用双手敲打未来

Java设计模式相关面试

Java规划办法相关面试
1.接口是什么?为什么要运用接口而不是直接运用具体类?
接口用于界说API。它界说了类有必要得遵从的规矩。一起,它供给了一种笼统,由于客户端只运用接口,这样能够有多重完成,如List接口,你能够运用可随机拜访的ArrayList,也能够运用便利刺进和删去的LinkedList。接口中不答应写代码,以此来确保笼统,可是Java8中你能够在接口声明静态的默许办法,这种办法是具体的。
2.java中,笼统类与接口之间有什么差异?1.一个类能够完成多个接口,但却只能承继最多一个笼统类。
2.笼统类能够包括具体的办法,接口的一切办法都是笼统的。
3.笼统类能够声明和运用字段,接口则不能,但接口能够创立静态的final常量。
4.接口的办法都是public的,笼统类的办法能够是public,protected,private或许默许的package;
5.笼统类能够界说结构函数,接口却不能。
3.除了单例办法,你在出产环境中还用过什么规划办法?这需求根据你的经验来答复。一般状况下,你能够说依靠注入,工厂办法,装修办法或许观察者办法,随意挑选你运用过的一种即可。不过你要预备答复接下的根据你挑选的办法的问题。
4.什么事里氏替换准则?
1、开闭准则(OpenClosePrinciple)
开闭准则便是说对扩展敞开,对修正封闭。在程序需求进行拓展的时分,不能去修正原有的代码,完成一个热插拔的作用。所以一句话概括便是:为了使程序的扩展性好,易于保护和晋级。想要达到这样的作用,咱们需求运用接口和笼统类,后面的具体规划中咱们会提到这点。
2、里氏代换准则(LiskovSubstitutionPrinciple)
里氏代换准则(LiskovSubstitutionPrincipleLSP)面向目标规划的基本准则之一。里氏代换准则中说,任何基类能够呈现的当地,子类必定能够呈现。LSP是承继复用的基石,只需当衍生类能够替换掉基类,软件单位的功用不受到影响时,基类才干真正被复用,而衍生类也能够在基类的基础上添加新的行为。里氏代换准则是对“开-闭”准则的弥补。完成“开-闭”准则的关键过程便是笼统化。而基类与子类的承继联系便是笼统化的具体完成,所以里氏代换准则是对完成笼统化的具体过程的标准。——FromBaidu百科
3、依靠倒转准则(DependenceInversionPrinciple)
这个是开闭准则的基础,具体内容:真对接口编程,依靠于笼统而不依靠于具体。
4、接口阻隔准则(InterfaceSegregationPrinciple)
这个准则的意思是:运用多个阻隔的接口,比运用单个接口要好。仍是一个下降类之间的耦合度的意思,从这儿咱们看出,其实规划办法便是一个软件的规划思维,从大型软件架构出发,为了晋级和保护便利。所以上文中屡次呈现:下降依靠,下降耦合。
5、迪米特规律(最少知道准则)(DemeterPrinciple)
为什么叫最少知道准则,便是说:一个实体应当尽量少的与其他实体之间发作相互作用,使得体系功用模块相对独立。
6、组成复用准则(CompositeReusePrinciple)
准则是尽量运用组成/聚合的办法,而不是运用承继
5.什么状况下会违反迪米特规律?为什么会有这个问题?迪米特规律建议“只和朋友说话,不要陌生人说话”,以此来削减类之间的耦合。
6.适配器办法是什么?什么时分运用?适配器办法(AdapterPattern)是作为两个不兼容的接口之间的桥梁。这种类型的规划办法归于结构型办法,它结合了两个独立接口的功用。适配器办法供给对接口的转化。假如你的客户端运用某些接口,可是你有别的一些接口,你就能够写一个适配去来衔接这些接口。
7.适配器办法与装修器办法有什么差异?尽管适配器办法和装修器办法的结构相似,可是每种办法的呈现目的不同。适配器办法被用于桥接两个接口,而装修办法的目的是在不修正类的状况下给类添加新的功用。
装修者办法:动态地将职责附加到目标上,若要扩展功用,装修者模供给了比承继更有弹性的替代方案。通俗的解说:装修办法便是给一个目标添加一些新的功用,而且是动态的,要求装修目标和被装修目标完成同一个接口,装修目标持有被装修目标的实例。
适配器办法:将一个类的接口,转化成客户期望的另一个接口。适配器让原本接口不兼容的类能够合作无间。适配器办法有三种:类的适配器办法、目标的适配器办法、接口的适配器办法。通俗的说法:适配器办法将某个类的接口转化成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。
举例如下:
1、适配器办法//file为已界说好的文件流FileInputStreamfileInput=newFileInputStream(file);InputStreamReaderinputStreamReader=newInputStreamReader(fileInput);
以上便是适配器办法的体现,FileInputStream是字节省,而并没有字符流读取字符的一些api,因而经过InputStreamReader将其转为Reader子类,因而有了能够操作文本的文件办法。2、装修者办法
BufferedReaderbufferedReader=newBufferedReader(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库中运用的规划办法吗?
装修器规划办法(Decoratordesignpattern)被用于多个JavaIO类中。单例办法(Singletonpattern)用于Runtime,Calendar和其他的一些类中。工厂办法(Factorypattern)被用于各种不行变的类如Boolean,像Boolean.valueOf,观察者办法(Observerpattern)被用于Swing和很多的事情监听中。
21.Java中什么事单例规划办法?用Java写出线程安全的单例
单例目标(Singleton)是一种常用的规划办法。在Java运用中,单例目标能确保在一个JVM中,该目标只需一个实例存在。这样的办法有几个好处:
1、某些类创立比较频繁,关于一些大型的目标,这是一笔很大的体系开支。
2、省去了new操作符,下降了体系内存的运用频率,减轻GC压力。
3、有些类如交易所的中心交易引擎,控制着交易流程,假如该类能够创立多个的话,体系彻底乱了。(比方一个军队呈现了多个司令员一起指挥,肯定会乱成一团),所以只需运用单例办法,才干确保中心交易服务器独立控制整个流程。
单例办法重点在于在整个体系上同享一些创立时较耗资源的目标。整个运用中只保护一个特定类实例,它被一切组件一起运用。Java.lang.Runtime是单例办法的经典比如。你能够在我的文章Java单例办法的10个问题看到更多的问题和评论。从Java5开始你能够运用枚举(enum)来完成线程安全的单例。
22在Java中,什么叫观察者规划办法(observerdesignpattern)?
观察者办法是根据目标的状况变化和观察者的通讯,以便他们作出相应的操作。简略的比如便是一个气候体系,当气候变化时有必要在展现给大众的视图中进行反映。这个视图目标是一个主体,而不同的视图是观察者。能够在这篇文章中看到Java观察者办法的完好比如。
23什么是职责链规划办法?
职责链办法(ChainofResponsibilityPattern)为恳求创立了一个接收者目标的链。这种办法给予恳求的类型,对恳求的发送者和接收者进行解耦。这种类型的规划办法归于行为型办法。在这种办法中,通常每个接收者都包括对另一个接收者的引证。假如一个目标不能处理该恳求,那么它会把相同的恳求传给下一个接收者,依此类推。
Java高档面试规划办法
1.举出一个比如,在这种状况你会更倾向于运用笼统类,而不是接口?
这是很常用但又是很难答复的规划面试问题。接口和笼统类都遵从”面向接口而不是完成编码”规划准则,它能够添加代码的灵活性,能够习惯不断变化的需求。下面有几个点能够协助你答复这个问题:
在一些对时刻要求比较高的运用中,倾向于运用笼统类,它会比接口稍快一点。假按期望把一系列行为都标准在类承继层次内,而且能够更好地在同一个当地进行编码,那么笼统类是一个更好的挑选。有时,接口和笼统类能够一起运用,接口中界说函数,而在笼统类中界说默许的完成。。
2.规划一个贩卖机,能够接收不同的货币,出售不同的产品?
这是一个敞开规划问题,你能够作为操练,测验着写出规划文档、代码和JUnit测验而不是仅仅处理这个问题,看看它花了你多少时刻得到处理方案和得到需求的原形。理想状况下,这个问题应该能够在3个小时内处理,至少应该得到一个能够运转的版别。
3.你有一个Smartphone类,能够派生如IPhone、AndroidPhone、WindowsMobilePhone类它还能够是一些有着品牌的手机名称,你会怎样规划这个类体系呢。
这是别的一个规划办法操练,你能够运用你的面向目标规划技巧来得到一个规划,这个规划需求满足灵活能够支撑未来产品的扩展,满足安稳能够支撑在现有模型进行修正。
5.规划一个ATM机?
咱们一切人都运用ATM(自动柜员机)。想想你会怎样规划一个ATM?就规划金融体系来说,有必要知道它们应该在任何状况下都能够按期作业。不管是断电仍是其他状况,ATM应该坚持正确的状况(业务),想想加锁(locking)、业务(transaction)、过错条件(errorcondition)、边界条件(boundarycondition)等等。尽管你不能想到具体的规划,但假如你能够指出非功用性需求,提出一些问题,想到关于边界条件,这些都会是很好的一步。
6.你正在写一些类供给商场数据,你知道你能够不守时切换不同的厂商如Reuters、wombat或许直接的批发商,你会如何规划你的商场数据体系。
这是一个非常风趣的规划面试问题,而且真的在一家大的投资银行问到过,假如你是用Java编码的话这是一个适当往常的场景。最主要的一点是你要有一个MarketData接口,它会有调用端需求的办法如:getBid()、getPrice()、getLevel()等等,而MarketData应该由一个MarketDataProvider经过依靠注入(dependencyinjection)组成。因而,当你修正你的MarketData供给器(MarketDataProvider)时,调用端不会受影响,由于它们是经过MarketData接口或类的办法来拜访的。
7.在Java中,为什么不答应从静态办法中拜访非静态变量?
你在Java中不能从静态上下文拜访非静态数据仅仅由于非静态变量是跟具体的目标实例相关的,而静态的却没有和任何实例相关。你能够看我的文章为什么在静态上下文中不能拜访非静态变量查看具体的评论。
8.在Java中规划一个并发规矩的pipeline?
并发编程或并发规划这些天很火,它能够充分利用现在不断提升的高档处理器的处理才能,而Java成为一个多线程言语也从这种状况获益良多。规划一个并发体系需求记住的最关键的点是线程安全,不行变性,本地变量和防止运用static或许类变量(instancevariables)。你只需求想着每一类都能够一起被多个线程一起履行,所以最好的做法便是每一个线程都处理自己的数据,不跟其他数据交互,而且运转时只需求最小的同步确保。这个问题能够涉及到从开始的评论到完好的类和接口编码,但只需你记住并发中最重要的点和问题如,竞赛条件(racecondition)、死锁(deadlock)、内存交互问题(memoryinterference)、原子性、ThreadLocal变量等,你都能够答复它。

未经允许不得转载:IT技术网站 » Java设计模式相关面试
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载