1.类初始化的顺序
- 父类的静态变量和静态代码块赋值(按照声明顺序)
- 自身的静态变量和静态代码块赋值(按照声明顺序)
- 父类的成员变量和块赋值(按照声明顺序)
- 父类构造器赋值:如果父类没有无参构造器,则子类中一定要使用super(参数)指定父类的有参构造器,否则会报错
- 自身的成员变量和块赋值(按照声明顺序)
- 自身构造器赋值
2.数组是对象吗
- 数组是一个对象,不同类型的数组具有不同的类
- 两个数组用equals方法比较时,比较的是地址,Arrays.equal()可以比较数组元素。
3.枚举类的构造方法
枚举类在后台实现时,实际上是转化为一个继承了java.lang.Enum类的实体类,原先的枚举类型变成对应的实体类型,上例中AccountType变成了个class AccountType,并且会生成一个新的构造函数,若原来有构造函数,则在此基础上添加两个参数,生成新的构造函数,如上例子中:
private AccountType(){ System.out.println(“It is a account type”); }
会变成
private AccountType(String s, int i){
super(s,i); System.out.println(“It is a account type”); }
而在这个类中,会添加若干字段来代表具体的枚举类型:
public static final AccountType SAVING;
public static final AccountType FIXED;
public static final AccountType CURRENT;
所以,有几个枚举实例,便会调用几次构造方法。
4.有关finally语句块说法正确的是
- 不管catch是否捕获异常,finally语句块都是要被执行的(√)
- 在try语句块或catch语句块中执行到System.exit(0)直接退出程序(√)
- finally块中的return语句会覆盖try块中的return返回(√)
- finally 语句块在 catch语句块中的return语句之前执行(×)
finally语句并非在catch语句块中的return语句之前执行,而是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的;
5.is-a:继承关系 has-a:从属关系 like-a:组合关系
- is-a 表示的是继承
- has-a 表示的是一个类中包含另一个类
- like-a 表示实现接口
6.Java中的四类八种基本数据类型
- 整数类型 byte short int long
- 浮点型 float double
- 逻辑型 boolean(它只有两个值可取true false)
- 字符型 char
7.Java四种访问权限
8.super()与this()
- super()表示调用父类构造函数、this()调用自己的构造函数,而自己的构造函数第一行要使用super()调用父类的构造函数,所以这俩不能在一个构造函数中会出现重复引用的情况
- super()和this()必须在构造函数第一行,所以这一点也表明他俩不能在一个构造函数中
- this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块(里面不能使用非static类型的)。
9.off-heap堆外内存
off-heap叫做堆外内存,将你的对象从堆中脱离出来序列化,然后存储在一大块内存中,这就像它存储到磁盘上一样,但它仍然在RAM中。对象在这种状态下不能直接使用,它们必须首先反序列化,也不受垃圾收集。序列化和反序列化将会影响部分性能(所以可以考虑使用FST-serialization)使用堆外内存能够降低GC导致的暂停。堆外内存不受垃圾收集器管理,也不属于老年代,新生代。
10.判断一块内存空间是否符合垃圾收集器收集标准的标准
- 给对象赋值为null,以下没有调用过。
- 给对象赋了新的值,重新分配了内存空间。