1.finally语句块什么情况不会执行
四种情况:
(1)finally语句块第一行出现异常
(2)程序抛出异常(或者return)之前,调用system.exits(),退出程序
(3)程序抛出异常(或者return)之前,线程死亡
(4)程序抛出异常(或者return)之前,关闭CPU
2.java有了基本类型,为什么还要设计对应的引用类型
(1)可以使用为该引用类型而编写的方法
(2)Java集合(map、set、list)等所有集合只能存放引用类型数据,不能存放基本类型数据(容器中实际存放的是对象的引用)。
(3)引用类型对象存储在堆上,可以控制其生命周期;而基本类型存储在栈上,会随着代码块运行结束被回收。
(4)java泛型使用类型擦除法实现,基本类型无法实现泛型。
3.怎么理解多态(多态的好处)
是什么:多态是引用变量指向的实例对象在程序运行期才确定;
好处:1.提高的代码的可维护性(即可以通过改写父类属性与方法来改写子类共有属性与方法)
2.提高了代码的可扩展性(即子类方法可以被父类的引用变量调用)
怎么实现:继承父类、实现接口
4.什么是反射?
(1)反射是可以在运行时得到某个类的完整信息;
(2)获取类的信息首先要得到该类对应的Class对象,拿到Class对象的方式如下;
(3)拿到class对象后,就可以调用class对象的成员方法,得到类的信息,如 getMethod、getField,getConstructor,newInstance
(4)反射的原理:
(5)反射的应用:
5.自动拆装箱
什么时候发生、具体怎么实现
自动拆箱:当基础类型与引用类型进行 “==、+、-、×、÷” 运算时,会对引用类型进行自动拆箱;
具体实现,引用类型对象内部包含对应基本类型的成员变量,自动拆箱时返回该成员变量即可;
自动装箱:使用基础类型给引用类型变量赋值
具体实现:调用引用类型对应的静态方法valueOf,本质是在该方法内部调用构造函数创建对象。
6.java泛型相关问题
(1)是什么:泛型就是将类型参数化,在编译时才确定具体的参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
(2)为什么(好处):为了创建容器类,可以实现类型安全且消除了很多的强制类型转换;
(3)原理: 泛型只存在于编译阶段,不存在与运行阶段(编译后的class文件不存在泛型的概念)
编译时,使用Object代替泛型参数T,如果使用T extends XXX 或者 T super XXX,则使用XXX代替泛型参数T
7.序列化反序列化相关问题
(1)是什么:序列化是将对象转换为字节序列,以便在网络中传输或保存在本地;
反序列化是把字节序列转换为对象。(通过读取字节流中对象的属性,创建出一个有着同样属性的 对象)
(2)为什么:需要对内存中的对象进行持久化或者网络传输。序列化反序列化还可以用于深拷贝(因为序列化可以将整个对象层次写入字节流中)
(3)怎么实现:实现Serializable接口或者Externalizable接口。
(4)serialVersionUID:用来表明类不同版本之间的兼容性
理解:JVM会在序列化的时候,自动创建一个serialVersionUID字段,一起序列化成字节流,如果在类中显示指定了该字段并赋值,则序列化的值会用显示指定的;在反序列化的时候,JVM也会创建一个serialVersionUID(根据反序列化这边所在的程序,和字节流无关),如果反序列化这边的类同样指定了serialVersionUID字段,则JVM创建的serialVersionUID的值就是显示指定的。在反序列化的时候,JVM会比较创建的serialVersionUID值和字节流中的serialVersionUID值是否一致,一致则可以反序列化,不一致会异常。
如果不显示指定,则不能保证序列化和反序列化两边JVM创建的serialVersionUID值相等。
(5)对于不想序列化的字段,使用 transient 关键字修饰,该字段在被反序列化的时候,会被设置为零值。
(6)序列化和反序列化是针对对象的,静态字段不会被序列化(也不需要被序列化)
8.java异常相关问题
(1)是什么: Throwable派生出Error、Exception。Exception又分为运行时异常和非运行时异常。
error:程序无法处理的严重错误 ,不能通过 catch 来进行捕获,通常会导致程序终止。例如系统崩溃、内存不足;
exception:程序可以处理的异常,需要对其进行处理 ;
其中非运行时异常必须对其进行处理,运行时异常可以由程序员自己决定(因为运行时异常中有很多是代码本身写错了,需要的不是处理异常,而是修改代码,如空指针异常、数据访问越界异常)。
(2)java常见异常:
java.lang.InstantiationError:实例化错误。当一个应用试图通过new操作符构造一个抽象类或者接口时抛出该异常.
java.lang.OutOfMemoryError:内存不足错误。当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。
java.lang.StackOverflowError:堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出或者陷入死循环时抛出该错误。
java.lang.IndexOutOfBoundsException:索引越界异常。当访问某个序列的索引值小于0或大于等于序列大小时,抛出该异常。
java.lang.NullPointerException:空指针异常。
java.lang.ArithmeticException:算术条件异常。譬如:整数除零等。
9.java IO流相关问题
(1)IO流分类:
按流向:输入流、输出流
按操作的数据单元:字节流、字符流
按流的角色:节点流、处理流
(2)字节流和字符流区别