记录几个常见的笔试题

一、局部代码块的加载时机与顺序
记录几个常见的笔试题_第1张图片
答案:
D
A
C
B
C
D
解释:
类的加载过程分为:加载->验证->准备->解析->初始化
静态代码块属于类的变量的一部分,在类的加载阶段会被执行调用,是最先被加载的,普通的局部代码块,属于实例对象,当new出对象的时候会率先于构造函数的方法而执行,具体对应于初始化过程中。所以正确的加载顺序就是答案所示了。


二、类的继承与加载顺序

记录几个常见的笔试题_第2张图片
答案:
AC
解释:
本题涉及类的多态,B类知识默默基础A类的共有静态属性,在main函数里面调用B.c,实际上是读取A.c,在此过程中实际访问的是A类,所以是不会有输出B类的静态代码块的。可能会有读者对此有所疑惑,那么我们对B类稍作更改,如下图所示
记录几个常见的笔试题_第3张图片
此时输出为ABC
此时是踏踏实实的对B类的调用,而B类继承自A类,按照调用的逻辑顺序,在加载顺序上是,JVM先加载了A类,在记载B类,最后的输出即为ABC


三、字符串的比较
记录几个常见的笔试题_第4张图片
答案:
true
false
解释:
栈中存放基本类型的变量和对象的引用变量,而new出来的对象和数组存放在堆中。然而除此之外还有一块区域叫做常量池。像我们通常想String s1 = “abc”; 这样申明的字符串对象,其值就是存储在常量池中。当我们创建String s1 = “abc”这样一个对象之后,”abc”就存储到了常量池中,当我们创建引用String s2 = “abc” 的时候,Java底层会优先在常量池中查找是否存在”abc”,如果存在则让s2指向这个值,不会重新创建。所以使用 == 比较时,因为地址相同,所以比较的结果是true。而当new新的对象的时候会发现,比较的是两个对象的地址。


四、整数的装箱、拆箱与缓存
记录几个常见的笔试题_第5张图片
答案:
true
true
true
‘—————’
true
true
false
Integer箱体类和int基本类型比较时,有一个拆箱的动作,比较的仅仅是数值类型。Integer和Integer比较时,比较的是地址值。
此外JVM底层默认缓存大小在一个字节之内的数值,也就是值的大小在-128~127之间的值,是被缓存在内存里面的。所以图中的c和d的对象地址是相同的,因此相等。


你可能感兴趣的:(笔试)