雷锋教你面试题
看到雷锋敬个礼,好人啊,今天我们来看两道阿里的面试题.
他们的区别是
我们用代码验证一下我们的结论.
第一步:要加载的类
public class jiepi {
static {
System.out.println("洁癖1进行测试:是否执行静态代码块");
}
}
public class jiepi2 {
static {
System.out.println("洁癖2进行测试:是否执行惊天代码块");
}
}
第二步:测试结果
package com.jiepi.test;
public class JvmTestClass {
public static void main(String[] args) throws Exception {
System.out.println("loadclass加载实验开始");
ClassLoader classLoader = JvmTestClass.class.getClassLoader();
Class<?> loadClass=classLoader.loadClass("com.jiepi.test.jiepi");
// loadClass.newInstance();
System.out.println(loadClass.getName());
System.out.println("loadclass记载实验结束");
System.out.println("");
System.out.println("========================");
System.out.println("forname加载实验开始");
Class<?> forName = Class.forName("com.jiepi.test.jiepi2");
System.out.println(forName.getName());
System.out.println("forname加载实验结束");
}
运行结果:
loadclass加载实验开始
com.jiepi.test.jiepi
loadclass记载实验结束
========================
forname加载实验开始
洁癖2进行测试:是否执行静态代码块
com.jiepi.test.jiepi2
forname加载实验结束
看到结果。我们的结论完全正确,有的面试官也可能问一下loadClass在什么时候执行静态代码块呢,其实当执行newInstance()时候才会执行静态代码块。
2.Java类各种成员变量初始化顺序
这道题经常在笔试题中出现,来回都是这些题,今天我们说说,
老套路,上代码
第一步:父类
package com.jiepi.test;
public class Parent {
static {
System.out.println("洁癖爸爸:静态代码块");
}
{
System.out.println("洁癖爸爸:构造代码块");
}
private static String staticString = initStaticString();
private String string = initString();
public Parent() {
System.out.println("构造函数");
}
private static String initStaticString() {
System.out.println("洁癖爸爸:静态方法给静态变量赋值");
return "staticString";
}
private String initString() {
System.out.println("洁癖爸爸:普通方法给普通变量赋值");
return "String";
}
}
第二步:子类
package com.jiepi.test;
public class Child extends Parent { //这里的顺序和父类是不一样的,顺序不一样结果也会不一样
private String string = initString();
private static staticString = initStaticString();
{
System.out.println("洁癖:构造代码块");
}
static {
System.out.println("洁癖:静态代码块");
}
public Child() {
System.out.println("洁癖:构造函数");
}
private String initString() {
System.out.println("洁癖:普通方法赋值普通变量");
return "string";
}
private static String initStaticString(){
System.out.println("洁癖:静态方法给静态变量赋值");
return "staticString";
}
public static void main(String[] args) {
System.out.println("洁癖开始测试------------------------------");
new Child();
System.out.println("洁癖测试完成-----------------------------");
}
}
第三部:运行结果看一下
洁癖爸爸:静态代码块
洁癖爸爸:静态方法给静态变量赋值
洁癖:静态方法给静态变量赋值
洁癖:静态代码块
洁癖爸爸:构造代码块
洁癖爸爸:普通方法给普通变量赋值
洁癖爸爸:构造函数
洁癖:普通方法赋值普通变量
洁癖:构造代码块
洁癖:构造函数
看看和你想一样吗,总结一下他的执行顺序依次如下
只要你严格按照这个顺序,以后遇到这类题保你不会错,笔试顺利通过,稳拿offer,欢迎持续关注,后续有一系列阿里面试题讲解演示.