Java常见面试知识点汇总

Posted DreamMakers

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java常见面试知识点汇总相关的知识,希望对你有一定的参考价值。

提问:聊聊对Java异常体系的理解?

Throwable是所有异常的父类,它有两个直接子类Error和Exception。

(1)Error表示编译时和系统错误,通常这些问题不能预期和恢复,比如硬件故障、JVM崩溃、内存不足等。常见的错误有虚拟机错误VirtualMachineError(如编码常见的OutOfMemoryError、StackOverflowError)、链接错误LinkageError(如NoClassDefFoundError)。

(2)Exception称为异常,Exception类是所有异常的根类。异常又分为检查异常(checked exception)和运行时异常(runtime exception)。

检查异常(checked exception)在程序中能预期,并要尝试修复,如FileNotFoundException。我们必须捕获此类异常,并为用户提供有用信息和合适日志来进行调试。常见的检查异常有:IOException、SQLException;

RuntimeException是所有运行时异常的父类。

运行时异常(Runtime Exception)源于糟糕的编程。比如我们检索数组元素之前必须确认数组的长度,否则就可能会抛出ArrayIndexOutOfBoundException运行时异常。

常见的运行时异常有:NPE(NullPointException)、IndexOutOfBoundsException、ClassCastException、IllegalArgumentException等。

具体如下图所示:

提问:throw和throws的区别?

throws:用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理。

throw:代码中抛出的一个具体的异常类型,是在方法体内部使用或者代码块内使用。

提问:final、finally和finalize的区别?

(1) final是Java中的一个关键字,用于修饰类、方法、变量(包括成员变量和局部变量)

(1.1)修饰类时表示该类不可被继承,final修饰的类中的所有方法都会隐式的定义为final方法;

(1.2)修改方法时表示该方法不可被重写;

若父类中final方法的访问权限为private,将导致子类中不能直接继承该方法,因此,此时可以在子类中定义相同方法名的函数,此时不会与重写final的矛盾,而是在子类中重新地定义了新方法。

(1.3)使用final修饰变量时,标识这是个常量,在初始化之后不允许修改。

根据变量定义是类变量还是实例变量,初始化的位置有所区别。如果是类变量,则初始化位置可以是定义变量的地方或者是类的静态代码块;如果是实例变量,则初始化位置可以是定义变量的地方或者是构造方法中;

(2)finally是异常处理的一部分,一般和try或者try/catch语句一起使用,用于在执行最后做一些业务逻辑处理后者资源清理工作,即使执行过程出现异常也会照样执行。

需要注意的是,如果在try或者catch语句中直接调用System.exit()方法退出了程序,那么finally也不会执行!!!

(3)**finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。这个方法在对象被回收的时候被调用。**其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定,一般情况下我们又不会用new以外的方式去创建对象),所以一般是不需要程序员去实现finalize的。

一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,所以有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用finalize(),产生问题。 所以,推荐不要使用finalize()方法。

关于finalize()方法的具体细节原理,会在后面介绍Java中的几种引用及其工作原理细节的时候再具体说明,可以关注公众号关注后续文章

提问:创建对象有哪些方法?不同方法之间有什么区别?

大体来说,可以有四种创建对象的方式。

(1)是通过new关键字创建对象;

(2)是通过反射,调用newInstance()方法来创建对象(包含两种,使用Class类的newInstance方法或使用Constructor类的newInstance方法)

(3)是通过clone()方法来创建对象;

(4)是通过反序列化来创建对象;

区别:前两种会调用构造函数,后两者不会调用构造函数。

除了使用new关键字之外的其他方法全部都是转变为invokevirtual(创建对象的直接方法),使用new的方式转变为两个调用,new和invokespecial(构造函数调用)。

提问:谈谈对clone()方法的理解?

clone()方法Object类中定义的方法,而所有的Java类都继承自Object类,所以所有的Java类可以理解都具有clone()方法,从而实现对自身的克隆行为。

clone方法是浅拷贝。new操作符的本意是分配内存。

程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象创建完毕,可以把他的引用(地址)发布到外部,在外部就可以使用这个引用操纵这个对象。

clone在第一步是和new相似的, 都是分配内存,调用clone方法时,分配的内存和源对象(即调用clone方法的对象)相同,然后再使用原对象中对应的各个域,填充新对象的域, 填充完成之后,clone方法返回,一个新的相同的对象被创建,同样可以把这个新对象的引用发布到外部。

所以,如果对象中的是引用类型,那么克隆出来的对象和原始对象会指向同一个对象,如果对对象进行了修改,那么之前的对象也会受到影响。此时,需要编码者自己在clone()方法中自己根据原有对象中的实例引用变量构造出克隆对象中相应的实例引用变量。

备注说明

如果想第一时间获取最新最全的面试知识和面试技巧,欢迎扫码关注微信公众号(IT面试直通车),关于互联网编程与面试,这里一定有你想要的。

目前公众号处于初期内容整理建设阶段,计划半年时间将所有相关知识点都整理汇总,添加关注后可以跟随公众号一起逐渐成长,如对相关问题有疑问,可回复进行探讨,谢谢。

前文回顾

Java常见面试知识点汇总(1)

Java常见面试知识点汇总(2)

Java常见面试知识点汇总(3)

以上是关于Java常见面试知识点汇总的主要内容,如果未能解决你的问题,请参考以下文章

Java常见面试知识点汇总

Java常见面试知识点汇总

Java常见面试知识点汇总

Java常见面试知识点汇总

Java常见面试知识点汇总

Java常见面试知识点汇总