根据某类调用静态方法有初始化对象吗
调用类的静态方法时(首次引用某B类时,B类会被类加载子系统加载,B类经过加载->链接->初始化这些步骤),
意味着静态代码块已经被加载,而且只会被加载一次(无论创建了多少次对象)。类已经被加载,但是还没有使用构造器(new的时候才使用构造器)。
构造器默认调用父类的构造器,然后优先使用代码块。
在第一次new B对象时,其实可以这样说,在运行期,首次引用B类时,B类会被类加载子系统加载,经过加载->链接->初始化这些步骤把B类的信息加载进方法区,这时先进行的是类的初始化步骤,又因为B是A的子类,所以A要先于B被初始化,这里可以简单的想象成,要先有爸爸才能有儿子,因此就出现了A的静态块->B的静态块这个步骤。然后因为我们真正做的是要实例化出B对象,所以肯定是要调用B 的构造方法的,又因为B是A的子类,所以会先调用A的构造方法,然后再继续调用B的构造方法,因此就出现了A类的构造方法->B类的构造方法这个步骤。
-
————————————————
-
版权声明:本文为CSDN博主「绅士jiejie」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
-
原文链接:https://blog.csdn.net/weixin_38106322/article/details/105535640
类初始化阶段是类加载过程的最后阶段。在这个阶段,java虚拟机才真正开始执行类定义中的java程序代码。Java虚拟机是怎么完成初始化的呢?这要从编译开始讲起。在编译的时候,编译器会自动收集类中的所有静态变量(类变量)和静态语句块(static{}块)中的语句合并产生的,编译器收集的顺序是根据语句在java代码中的顺序决定的。
收集完成之后,会编译成java类的 static{} 方法,java虚拟机则会保证一个类的static{} 方法在多线程或者单线程环境中正确的执行,并且只执行一次。在执行的过程中,便完 成了类变量的初始化。值得说明的是,如果我们的java类中,没有显式声明static{}块,如果类中有静态变量,编译器会默认给我们生成一个static{}方法。 我们可以通过
javap -c 的命令,来看一下java字节码中编译器为我们生成或者合并的static{} 方法 https://www.cnblogs.com/jimxz/p/3974939.html