调用final static类变量时,是否会触发类的初始化执行static代码块

类加载

类加载包括三个阶段,加载、连接、初始化,

加载:查找并加载字节码文件。

链接:分为三个阶段:①验证:文件格式验证,元数据验证,②准备:为静态变量分配内存,并设定默认值③解析:把类的符号引用转为直接引用。

初始化:通过<clinit>方法为类的静态变量赋予正确的初始值或执行静态代码块逻辑,如果只有静态成员,但没有赋值操作,不会有<clinit>方法

其中当final static 修饰的是基础数据类型和String数据类型时,在编译时Javac会为该常量生成ConstantValue属性,在准备阶段虚拟机便会根据ConstantValue为常量设置相应的值,如果该变量没有被final修饰,或者并非基本类型及字符串,则选择在类构造器中进行初始化

final static 修饰基本数据类型和String

public class Test {
    public static void main(String[] args) {
        System.out.println(A.a);
        System.out.println(B.b);
    }
}
class A{
    public final static int a = 10;
    static {
        System.out.println("A静态代码块执行");
    }
  }
  class B{
    public final static String b = "xxx";
      static {
          System.out.println("B静态代码块执行");
      }
  }

输出

10
xxx

结果不会触发类的初始化和静态代码块的执行。

final static 修饰非基本类型及String

public class Test {
    public static void main(String[] args) {
        System.out.println(C.obj);
    }
}
class C{
    public final static Object obj = new Object();
    static{
        System.out.println("C代码块被执行");
    }
}

输出

C代码块被执行
java.lang.Object@4554617c

没有final,只有static修饰

public class Test {
    public static void main(String[] args) {
        System.out.println(D.obj);
        System.out.println(E.e);
        System.out.println(F.f);
    }
}
class D{
    public  static Object obj = new Object();
    static{
        System.out.println("D代码块被执行");
    }
}
class E{
    public  static int e = 10;
    static {
        System.out.println("E静态代码块执行");
    }
  }
  class F{
    public  static String f = "xxx";
      static {
          System.out.println("F静态代码块执行");
      }
  }

输出

D代码块被执行
java.lang.Object@4554617c
E静态代码块执行
10
F静态代码块执行
xxx

以上除了final static修饰,其余的在准备阶段只给定了默认值,在初始化阶段才赋予了相对应的值,并且执行了静态代码块。

结论:

当final static 修饰的是基础数据类型和String数据类型时,不会触发类的初始化和static代码块的执行

final static 修饰非基本类型及String和只有static修饰会触发类的初始化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值