面试之Java代码的执行顺序
Java代码的执行顺序
静态代码块 —> main方法 —> 普通代码块 —> 构造方法 —> 普通方法
注意:静态代码块随着类的加载而执行,而且只执行一次,因为static代码块只在类加载时执行,类是用类加载器来读取的,类加载器是带有一个缓存区的,它会把读取到的类缓存起来,所以在一次虚拟机运行期间,一个类只会被加载一次,这样的话,静态代码块只会运行一次.
下面看一个示例:
public class test2 {
static {
System.out.println("静态代码块");
};
{
System.out.println("普通代码块");
};
public test2() {
System.out.println("构造方法");
}
public void getVal(String value) {
System.out.println("普通方法");
}
public static void main(String[] args) {
System.out.println("main方法");
test2 test = new test2();
test.getVal("name");
}
}
输出:
静态代码块
main方法
普通代码块
构造方法
普通方法
面试官会一般会问什么?
有一个子类A继承了父类B,并重写了父类中的普通方法,在子类中执行重写后的方法,代码的执行顺序是什么?
class test4 {
static {
System.out.println("父类静态代码块");
};
{
System.out.println("父类普通代码块");
};
public test4() {
System.out.println("父类构造方法");
}
public void getVal(String value) {
System.out.println("父类普通方法");
}
}
class test5 extends test4{
static {
System.out.println("子类静态代码块");
};
{
System.out.println("子类普通代码块");
};
public test5() {
System.out.println("子类构造方法");
}
@Override
public void getVal(String value) {
System.out.println("子类普通方法");
}
public static void main(String[] args) {
System.out.println("子类main方法");
test4 test5 = new test5();
test5.getVal("name");
}
}
输出:
父类静态代码块
子类静态代码块
子类main方法
父类普通代码块
父类构造方法
子类普通代码块
子类构造方法
子类普通方法