面向对象1.一个类没有被重写,它的equals()方法是如何比较和比较对象的地址的2.hashCode()和equals有什么联系Java对象方法和hashCode方法的eqauls()方法是这样指定的:相等(相同)的对象必须具有相等的哈希码(或哈希码)。如果两个对象的hashCode相等,则它们不一定相同。3、Query接口的list方法和iterate方法有什么区别?list()方法不能使用一级缓存和二级缓存(只写缓存不能读),只能在启用查询缓存的前提下使用查询缓存;iterate()方法可以充分利用缓存。如果目标数据是只读或频繁读取,使用iterate()方法来降低性能开销。list()方法不会出现N+1查询问题,而iterate()方法可能会出现N+1查询问题4、面向对象“六原则一规则”单一职责原则:一个类只做它应该做的事做。(单一职责原则想表达的是“高内聚”,写代码的终极原则只有“高内聚,低耦合”六个字,所谓高内聚就是一个代码模块只完成一个功能。在对象,如果只允许一个类做它应该做的事情,不涉及与其无关的区域,就是高内聚的原则。这个类只有单一职责。另一个就是模块化。好自行车就是组装车子,从减震器,刹车到传动,所有零件都可以拆装。好的乒乓球拍不是成品球拍,底板和胶皮都要自己拆装。好软件系统,其中的每个功能模块也应该方便地被其他系统使用,从而达到软件重用的目的。)开闭原则:软件实体应该对扩展开放,对修改封闭。(在理想状态下,当我们需要给一个软件系统增加新的功能时,只需要从原来的系统中派生出一些新的类,而不需要修改原来的任何一行代码。要实现打开和关闭,有两个Key要点:①抽象是关键,如果一个系统中没有抽象类或接口系统,就不会有扩展点;②可变性的封装,将系统中的各种可变因素封装成一个继承结构。如果多个可变因素混合在一起,系统会变得复杂和混乱。如果你不知道如何封装可变性,可以参考书中桥接模式的章节《设计模式精解》。)依赖倒置原则:面向接口编程。(这个原则简单明了具体:在声明方法的参数类型、方法的返回类型、变量的引用类型时,尽量使用抽象类型,而不是具体类型,因为可以定义抽象类型通过其任何子类型进行替换,请参考下面的里氏替换原则。)里氏替换原则:子类型可以随时用于替换超类型。(Liskov替换原则的描述,BarbaraLiskov女士的描述比这个复杂很多,但是简单的说,可以使用父类型的地方,就必须使用子类型。Liskov替换原则可以检查继承关系是否是合理的,如果一个继承关系违反里氏代换原则,那么这个继承关系一定是错误的,需要重构代码。比如让猫继承狗,或者狗继承猫,或者让正方形继承矩形,都是错误的继承relationships,因为很容易发现违反里氏代换原则的场景,需要注意的是,子类必须增加父类的能力,而不是减少父类的能力,因为子类比父类拥有更多的能力,能力加多当然,把对象当作能力少的对象来用是没有问题的。)接口隔离原则:接口要小而专,不能大而全。(臃肿的界面是对界面的一种污染,既然界面代表了一种能力,那么一个界面就应该只描述一种能力,界面也应该是高度内聚的,比如琴棋书法设计四个界面绘画,而不是应该设计成一个界面四个方法,因为如果设计成一个界面四个方法,那么这个界面就不好用了,毕竟四个精通的人还是少数音乐,棋牌,书画,如果设计成四个接口,为几个项目实现多个接口,那么每个接口被重用的可能性就很大。Java中的接口代表了能力,约定,角色。接口能否被正确使用必须取决于编程水平的一个重要标志。)合成聚合重用原则:优先使用聚合或合成关系来重用代码。(通过继承来重用代码是面向对象编程中最被滥用的事情,因为所有的教科书无一例外地提倡继承,误导初学者。类之间简单的分为三种关系,Is-A关系,Has-A关系,Use-一种关系,分别代表继承、关联和依赖。其中,关联关系根据关联的强弱可以进一步分为关联、聚合和组合,但说白了就是Has-A关系。组合、聚合和重用原则表达了Has-A关系优先于Is-A关系。关系重用代码,为什么?百度一万个理由。需要说明的是,即使在JavaAPI中,也有很多滥用继承的例子。比如Properties类继承了Hashtable类,Stack类继承了Vector类。类,这些继承显然是错误的,更好的做法是在Properties类中放置一个Hashtable类型的成员,并将其key和value设置为字符串来存储数据,而Stack类的设计也应该在Stack类中放其中的一个Vector对象用于存储数据。切记:任何时候都不要继承工具类,工具是可以拥有和使用的,不是继承的。)迪米特定律:迪米特定律也叫最少知识原则。一个对象应该尽可能少地了解其他对象。无论系统多么复杂,它都能为用户提供一个简单的门面。JavaWeb开发中作为前端控制器的Servlet或者Filter不就是一个门面吗?浏览器对服务器的运行一无所知,但是通过前端控制器可以根据你的请求得到相应的服务。中介者模式也可以用一个简单的例子来说明,比如一台电脑,CPU,内存,硬盘,显卡,声卡等设备需要相互配合才能很好的工作,但是如果这些东西直接连在一起,计算机系统的布线会极其复杂。在这种情况下,主板作为一个中介者出现,连接各种设备,而不是在各个设备之间直接交换数据,从而降低了系统的耦合度和复杂度。5.如何通过反射获取和设置对象私有字段的值可以通过类对象的getDeclaredField()方法获取Field对象,然后通过字段对象的setAccessible(true)设置为可访问,然后就可以通过get/set方法获取/设置字段的值了。6.内部类可以引用它包含的类的成员吗?内部类对象可以访问创建它的外部类对象的内容。如果内部类不是静态的,它可以访问创建它的外部类对象的所有属性;内部类如果是静态的,就是嵌套类,那么它只能访问创建它的外部类对象的所有静态属性;一般普通类只有public或package访问修饰,而内部类可以实现static、protected、private等访问修饰。当继承外部类时,内部类不会被覆盖。它们是完全独立的实体,每个实体都在自己的命名空间中。如果显式继承自内部类,则可以重写原来的内部类。方法。7、异常处理Java通过面向对象的方法来处理异常,对各种异常进行分类,并提供良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其他子类的实例。当方法发生异常时,抛出一个异常对象,异常对象包含异常信息,调用这个对象的方法可以捕获异常并进行处理。Java的异常处理是通过五个关键字实现的:try、catch、throw、throws、finally。一般情况下,try是用来执行一个程序的。如果发生异常,系统将抛出(throws)异常。这时候,你可以通过它的类型来捕获(catch)它,或者最终(finally)让默认的处理器来处理。使用try指定阻止所有“异常”的程序。在try程序之后,应立即包含一个catch子句以指定要捕获的“异常”类型。throw语句用于显式抛出“异常”。throws用于表示成员函数可能抛出的各种“异常”。最后就是保证无论发生什么“异常”,都执行一段代码。可以在成员函数调用外写一个try语句,在这个成员函数内部再写一个try语句来保护其他代码。每当遇到try语句时,将“异常”帧放入堆栈,直到所有try语句执行完毕。如果下一级的try语句没有处理某个“异常”,栈就会扩展,直到遇到处理这个“异常”的try语句。8、StaticNestedClass和InnerClass的区别StaticNestedClass是声明为static(静态)的内部类,不依赖于外部类实例就可以实例化。通常,在实例化外部类之后,需要实例化内部类。Static-NestedClass的成员可以定义为static(静态)或dynamic(实例)。NestedClass的静态成员(Method)只能操作(ACCESS)OuterClass的静态成员(staticmemebr),不能访问OuterClass的动态成员(instancemember);而NestedClass的动态成员(实例方法)是访问OuterClass的所有成员,这个概念很重要,很多人对这个概念比较模糊。有一个共同的原则,因为静态方法(staticmethod)总是关联CLASS(bindCLASS),而动态方法((instancemethod)总是关联一个实例对象,所以静态方法(staticmethod)永远不能访问与一个对象相关的动态成员(实例成员),反之亦然,一个CLASS实例对象可以访问这个Class的任何成员,包括静态成员。9.Comparable和Comparator接口的作用及其区别Java提供了Comparable接口只包含一个compareTo()方法,这个方法可以对两个对象进行排序,具体来说,它返回负数、0、正数,分别表示输入对象小于、等于、大于已有对象。Java提供一个Comparator接口,包含compare()和equals()两个方法,compare()方法用于给两个输入参数排序,返回负数,0,正数表示第一个参数小于,等于,或大于第二个参数。equals()方法需要一个对象作为参数,用于判断输入参数是否等于比较器。只有当输入参数也是一个比较器,并且输入参数与当前比较器的排序结果相同时,该方法才返回true。10、如何通过反射创建对象方法一:通过类对象调用newInstance()方法,例如:String.class.newInstance()方法二:通过getConstructor()或getDeclaredConstructor获取构造函数(Constructor)对象类对象的()方法并调用其newInstance()方法创建对象,例如:String.class.getConstructor(String.class).newInstance("Hello");11.extendsandsuperGenericqualifier在泛型下界<?superApple>UpperBound和LowerBound特点上界列表只能获取,不能添加(准确的说不能添加除null以外的对象,包括Object)下界列表只能添加,不能获取java.util.ArrayList;导入java.util.List;classFruit{}classAppleextendsFruit{}classJonathanextendsApple{}classOrangeextendsFruit{}publicclassCovariantArrays{publicstaticvoidmain(String[]args){//上限列表flistTop=newArrayList
