Java静态变量加载赋值问题

    xiaoxiao2021-03-25  76

    Java静态变量加载赋值问题

    static在JVM类加载->链接->准备阶段赋零值,在JVM类加载->链接->初始化阶段赋初值 static final 在JVM类加载->链接->初始化阶段赋初值

    涉及的问题:

    初始化阶段对字节码的读取是按顺序的,故静态语句块只能访问到定义在它之前的类变量 static

    final变量在编译时不定的情况下,如果客户程序这个时候访问了该类的静态变量,那就会对类进行初始化,所以静态final变量尽量不要放可变因素在里面,否则性能会有所下降。

    对于类使用的静态字段,只会初始化定义该字段的类(如定义在父类中,不初始化子类。是否会触发子类的加载和验证,虚拟机规范没有明确规定,视虚拟机具体实现而定)

    class ParentClass{ protected static Integer variable =1; static{ System.out.println("parent before staticblock"); } { System.out.println("parent before block"); } public ParentClass() { System.out.println("parent constructor"); } static{ System.out.println("parent after staticblock"); } } class SubClass extends ParentClass{ static{ System.out.println("sub before staticblock"); } { System.out.println("sub before block"); } public SubClass() { System.out.println("sub constructor"); } static{ System.out.println("sub after staticblock"); } } public class CLassExecuteTest { public static void main(String[] args) { System.out.println(SubClass.variable); } }

    输出: parent before staticblock parent after staticblock 1

    JVM的相关知识整理和学习 - ImportNew http://www.importnew.com/16388.html

    转载请注明原文地址: https://ju.6miu.com/read-34446.html

    最新回复(0)