面向对象(一)
·对一个类不重写,它的equals()方法是如何比较的
比较的是对象的地址
·解释 hashcode()和equals()方法有什么联系
(自己的理解,不知道正确与否!)
相同的对象必须有相等的哈希码
两个对象的hashcode相同,这两个对象不一定相同
例如:一个 数组中 有两个 1
第一个 1 存放时,会有一个哈希码
第二个 1存放时,因为与之前的对象相同,所以使用同一个哈希码,不再存放。
虽然这两个哈希码是一样的,但表示的并不是同一个对象
·解释Java中的概念,什么是构造函数?什么是构造函数重载?什么是复制构造函数?
当对象被创建时,构造函数会被调用,如果没有手动添加构造函数,则编译器会为这个类创建一个默认的构造函数
构造函数重载与方法重载类似,一个类可以有多个构造函数,但必须保证其参数唯一。
复制构造函数,不同于c++,自己不写构造函数的情况下,java不会 创建磨人的复制构造函数
·说明java中方法覆盖(Overriding)和方法重载(Overloading)是什么意思?
方法覆盖:是指子类对父类方法的重新定义,必须有相同的方法名,参数类型,返回类型
方法重载:一个类中,可以有两个或多个相同方法名的方法,但是参数不同。
·说明query接口的list方法和iterate方法有什么区别(不懂!!!)
①list()方法无法利用一级缓存和二级缓存(对缓存只写不读),它只能在开启查询缓存的前提下使用查询缓存;iterate()方法可以充分利用缓存,如果目标数据只读或者读取频繁,使用iterate()方法可以减少性能开销。
② list()方法不会引起N+1查询问题,而iterate()方法可能引起N+1查询问题
·面向对象的“六原则一法则”
- 单一职责原则:一个类只做他该做的事情 “高内聚”
- 开闭原则:软件实体应当对扩展开放,对修改关闭(),即:在添加新的功能时,只需要添加派生类,并不需要在源代码进行修改,做到能够添加派生类,就要实现有抽象类或者接口,否则无法添加派生类,还有一个封装可变性(封装可变性不是很懂!!!)
- 依赖倒转原则:在声明方法类型,参数类型,返回值类型时,尽量使用抽象类型,而不是具体类型,因为抽象类型可以被任意子类型代替。
- 里式原则:子类比父类的东西更加的完全,父类有的东西,子类一定有,子类有的东西,父类不一定有。
- 接口隔离原则:意思为 一个接口表示一个功能,专一性强,例如:唱跳rap为三个项目,一个借口对应一个项目,即三个接口,一个接口为唱,一个接口为跳,一个接口为rap,并不是一个借口包括唱跳rap,因为在引用接口时,并不是每个人都会唱跳rap,所以一个接口对应一个项目的话,更方便人们来使用
- 合成聚合复用原则:(没弄明白!!!)
- 迪米特法则:简而言之,一个对象和其他对象有尽可能少的联系,比如电脑的cpu,内存,硬盘,显卡,等等设备并不是直接联系来使电脑运作,而是通过调停者来使之间进行联系,电脑的调停者为主板。
·说明如何通过反射获取和设置对象私有字段的值?
可以通过类对象的getDeclaredField()方法字段(Field)对象,然后再通过字段对象的setAccessible(true)将其设置为可以访问,接下来就可以通过get/set方法来获取/设置字段的值了。下面的代码实现了一个反射的工具类,其中的两个静态方法分别用于获取和设置私有字段的值,字段可以是基本类型也可以是对象类型且支持多级对象操作
import java.lang.reflect.Method;
class MethodInvokeTest {
public static void main(String[] args) throws Exception {
String str = "hello";
Method m = str.getClass().getMethod("toUpperCase");
System.out.println(m.invoke(str)); // HELLO
}
}
· 说明重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
- 重载是在一个类中,可以两个或者多个重名的方法,但是各个方法的参数列表(参数类型不同,或个数不同,或两者都不同)并不同。
- 重写,是子类对父类的方法进行重新定义,有相同的方法名和相同的参数列表。
- 重载对返回类型没有特殊要求
·请判断,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,该说法是否正确,为什么?
不对,equals 返回值为true时,他们的hashcode一定相等,但是他们hashcode相等,他们却比一定相同。
·请说明内部类可以引用他包含类的成员吗,如果可以,有没有什么限制吗?(没搞懂!!!)
一个内部类对象可以访问创建它的外部类对象的内容,内部类如果不是static的,那么它可以访问创建它的外部类对象的所有属性内部类如果是sattic的,即为nested class,那么它只可以访问创建它的外部类对象的所有static属性一般普通类只有public或package的访问修饰,而内部类可以实现static,protected,private等访问修饰。当从外部类继承的时候,内部类是不会被覆盖的,它们是完全独立的实体,每个都在自己的命名空间内,如果从内部类中明确地继承,就可以覆盖原来内部类的方法。
·说明JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
java中是通过面向对象的方法进行异常处理,各个不同的异常进行分类。
当一个方法出现异常,则抛出一个异常对象,该对象包含异常信息,调用这个的对象的方法可以捕获到这个异常并进行处理。
java处理异常的5个关键字:try,catch,throw,throws和finally
一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。用try来指定一块预防所有”异常”的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的”异常”的类型。throw语句用来明确地抛出一个”异常”。throws用来标明一个成员函数可能抛出的各种”异常”。Finally为确保一段代码不管发生什么”异常”都被执行一段代码。可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try语句,”异常“的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种”异常”进行处理,堆栈就会展开,直到遇到有处理这种”异常”的try语句。
·请说明Java的接口和C++的虚类的相同和不同处。
java不支持多继承,支持单继承,然而无法满足一个类或对象要使用多个类或对象中的属性或方法
所以出现了接口,一个类支持实现多个接口,使用更加灵活,接口里面的属性在默认状态下面都是public static,方法默认为public。
·请判断当一个对象被当作参数传递给一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
值传递,java编程语言只有值传递参数,当一个对象实例被当做参数传递到方法中时,参数的值就是该对象的引用,对象的内容可以在被调用的方法中改变,但是对象的引用不变。
·请你说说Static Nested Class 和 Inner Class的不同
Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。Static-Nested Class 的成员, 既可以定义为静态的(static), 也可以定义为动态的(instance).Nested Class的静态成员(Method)只能对Outer Class的静态成员(static memebr)进行操作(ACCESS), 而不能Access Outer Class的动态成员(instance member).而 Nested Class的动态成员(instance method) 却可以 Access Outer Class的所有成员, 这个概念很重要, 许多人对这个概念模糊. 有一个普通的原则, 因为静态方法(static method) 总是跟 CLASS 相关联(bind CLASS), 而动态方法( (instance method) 总是跟 instance object 相关联, 所以,静态方法(static method)永远不可以Access跟 object 相关的动态成员(instance member),反过来就可以, 一个CLASS的 instance object 可以 Access 这个 Class 的任何成员, 包括静态成员(static member).