12. ==和equals的区别?
equals和==最大的区别就是:equals是一个方法,==是一个运算符!
==:如果比较的对象是基本数据类型,则比较的是数值是否相等,如果比较的双方是引用数据类型,则比较的是引用对象的地址值是否相同。
equals():用来比较两个对象的内容是否相同,equals方法不能用于基本数据类型的变量,如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址。
13.静态变量和实例变量的区别是什么?
静态变量:被static修饰符修饰的变量就是静态变量,也称为类变量,它是属于类的,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个。静态变量可以实现让多个对象共享内存。
实例变量:实例变量必须依存于某一具体的实例,需要首先创建对象,然后通过对象才可以访问到它。
14.两个对象值相同(即x.equals(y) == true)是否可以有不同的hashCode?\
不可以。如果两个对象x和y满足x.equals(y) == true,他们的hashCode应当相同。
Java对于equals方法和hashCode方法是这样规定的:(1)如果两个对象相同(equals方法返回true),那么他们的hashCode值一定相同。(2)如果两个对象的hashCode相同,他们并不一定相同。当然了,我们可以违背以上两个原则,但是如果违背了这两个原则,我们就会发现,再使用容器的时候,相同的对象可以同时出现在Set集合中,对于使用哈希存储的系统,哈希碰撞的概率会大大提升。
关于equals方法,首先equals方法必须要满足自反性:x.equals(x) == true ;对称性:x.equals(y) == true ==> y.equals(x) == true;传递性:x.equals(y) == true && y.equals(z) == true ==> x.equals(z) == true;一致性:x和y如果没有做任何修改时,多次调用x.equals(y)应该得到相同的值。
实现高质量equals方法的诀窍有:
使用“==”操作符检查参数是否为这个对象的引用;
使用instanceof操作符检查参数是否为正确的类型;
对于类中的关键属性,检查参数传入对象的属性是否与之相匹配;
编写完equals方法后,检查是否满足对称性、一致性、传递性;
重写equals方法时,总是要重写hashCode;
不要将equals方法参数中Object对象替换成其他类型,在重写时不要忘记加上@Override注解。
15.是否可以继承String类?
不可以。String是final类,所以不可以继承。
16.Java中实现多态的机制是什么?
Java中实现多态的机制靠的是父类或者接口定义的引用变量可以指向子类或者具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体事例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。
17.Math.round(11.5)等于多少?Math.round(-11.5)等于多少?
Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11,四舍五入的原理是在参数上加0.5然后进行取整。
18.当一个对象被当做参数传递给一个方法后,此方法可以改变这个对象的属性,并且可返回变化后的结果,那么这里到底是值传递还是引用传递?
值传递。Java语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中的时候,参数的值就是该对象的引用,对象的属性可以在被调用的过程中修改,但对对象引用的改变是不会影响到调用者的。
19.throw和throws的区别?
throw:throw语句用在方法体内,表示抛出异常,有方法体内的语句处理;throw是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行throw一定是抛出了某种异常。
throws:throws语句是用在方法声明声明后面,表示如果抛出异常,交由该方法的调用者来进行异常的处理;throws主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型;throws表示出现异常的一种可能性,并不一定会发生这种异常。
20.final、finally、finalize的区别?
inal:用于声明属性、方法和类分别表示属性不可变、方法不可覆盖、被其修饰的累不可继承。
finally:异常处理语句结构中的一部分,表示总要执行!
finalize:Object类的一个方法,在垃圾回收器执行的时候会调用被回收对象的这个方法,也可以覆盖此方法提供垃圾收集时的其他资源回收,例如文件关闭等。该方法更像是一个对象生命周期的临终方法,当该方法被系统调用的时候,则代表该方法即将死亡。需要注意的是,我们主动上去调用该方法并不会导致该对象的死亡,这是一个被动的方法(其实就是回调方法),不需要我们自己调用。