关于java中cinit/<init>()方法的和类中构造方法的关系和执行顺序?

https://www.zhihu.com/question/447387629/answer/1763180619

作者:千里象
链接:https://www.zhihu.com/question/447387629/answer/1762489678
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你好,在java基础面试题中经常碰到的就是代码块、静态方法、构造方法的执行顺序的问题。我们可以通过自己书写案例观察到实际的执行顺序// 子类
public class ClassLoadOrder extends Test{

static {
    System.out.println("子类静态代码块!");
}
{
    System.out.println("子类代码块!");
}
public ClassLoadOrder(){
    super();
    System.out.println("子类构造!");
}
public static void main(String[] args) {
    ClassLoadOrder test = new ClassLoadOrder();
}

}
// 父类
class Test {
public Test(){
System.out.println(“父类构造!”);
}

{
    System.out.println("父类代码块!");
}

static {
    System.out.println("父类静态代码块!");
}

}输出结果 首先我们知道静态类是在类初始化的时候就创建了,所以静态代码块肯定在main方法前执行;子类与父类静态代码块的执行顺序通过jclasslib插件,查看当前类的字节码如下图: 通过上面的jclasslib生成的信息中的Methods,结合JVM中方法的入栈顺序是先进后出,可以看出执行的顺序是–>main–>。 :加载静态方法(静态块),执行类的初始化等操作;main:初始化结束,进入程序入口;:执行一些其他的初始化,类中的代码块初始化,构造方法的初始化等。总结一下:JVM角度分析理解,类构造器方法以及实例构造器方法执行顺序,类构造器方法,在jvm第一次加载class文件时调用,因为是类级别的,所以只加载一次,是编译器自动收集类中所有类变量(static修饰的变量)和静态语句块(static{}),中的语句合并产生的,编译器收集的顺序,是由程序员在写在源文件中的代码的顺序决定的。,实例构造器方法,在实例创建出来的时候调用,包括调用new操作符;调用Class或java.lang.reflect.Constructor对象的newInstance()方法;调用任何现有对象的clone()方法;通过java.io.ObjectInputStream类的getObject()方法反序列化。需要记住的几点 1.方法和类的构造函数不同,它不需要显示调用父类的构造方法,虚拟机会保证子类的方法执行之前,父类的此方法已经执行完毕,因此虚拟机中第一个被执行的方法的类肯定是java.lang.Object 2、接口中不能使用static块,但是接口仍然有变量初始化的操作,因此接口也会生成方法。但接口和类不同的是,不会先去执行继承接口的方法,而是在调用父类变量的时候,才会去调用方法。接口的实现类也是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值