Java静态变量和静态代码块的执行顺序关系

  Java静态变量和静态代码块之间的执行顺序比较有意思,这里尽量考虑可能出现的情况,总结如下:

  1. 静态变量和静态代码块的执行顺序由这些静态变量和静态代码块出现的顺序决定
  2. 在静态代码块里使用在该静态代码块后面定义的静态变量时,只能引用静态变量或使用静态变量赋值表示式,但是赋值表达式仅在定义该静态变量没有赋值的情况下生效,其余情况都不会生效,在静态代码块里通过其他任何方式调用后面定义的静态变量都无法编译
  3. 在静态代码块里使用未声明的静态变量(不论在该静态代码块前还是后声明)都无法编译

  实际上,上述第二点的本质是给静态变量初始化,可以通过反编译class文件验证这点。

// 源码:STR_AFTER_CODE未初始化
public class StaticValid {
    
    private static String STR_BEFORE_CODE = "在静态代码块前面的变量";
    static {
        System.out.println(STR_BEFORE_CODE);
        STR_AFTER_CODE = "asads";
    }
    private static String STR_AFTER_CODE;  // STR_AFTER_CODE没有初始化
    
    public static void main(String[] args) {
        System.out.println("---------");
        System.out.println(STR_AFTER_CODE);
        System.out.println("---------");
    }
}

  反编译上面的代码(如下),可以发现静态代码块里的STR_AFTER_CODE赋值语句实际上是在定义该静态变量时执行了。

import java.io.PrintStream;

public class StaticValid
{
  private static String STR_BEFORE_CODE = "在静态代码块前面的变量";
  
  static
  {
    System.out.println(STR_BEFORE_CODE);
  }
  
  private static String STR_AFTER_CODE = "asads";
  
  public static void main(String[] args)
  {
    System.out.println("---------");
    System.out.println(STR_AFTER_CODE);
    System.out.println("---------");
  }
}

  如果STR_AFTER_CODE初始化了呢,下面来看看:

// 源码:STR_AFTER_CODE初始化了
public class StaticValid {
    
    private static String STR_BEFORE_CODE = "在静态代码块前面的变量";
    static {
        System.out.println(STR_BEFORE_CODE);
        STR_AFTER_CODE = "asads";
    }
    private static String STR_AFTER_CODE = "在静态代码块后面的变量"; // STR_AFTER_CODE初始化了
    
    public static void main(String[] args) {
        System.out.println("---------");
        System.out.println(STR_AFTER_CODE);
        System.out.println("---------");
    }
}
// Output:
// 在静态代码块前面的变量
// ---------
// 在静态代码块后面的变量
// ---------

  反编译上面的代码如下,发现这里static代码块里的赋值语句还在,但是结合上面代码的输出,发现赋值语句看起来并没有生效,这是因为后面赋值为"在静态代码块后面的变量"为第二次赋值,这也验证了第一点。除此之外,如果此时在static里提前使用了STR_AFTER_CODE会无法编译。

import java.io.PrintStream;

public class StaticValid
{
  private static String STR_BEFORE_CODE = "在静态代码块前面的变量";
  
  static
  {
    System.out.println(STR_BEFORE_CODE);
    STR_AFTER_CODE = "asads";
  }
  
  private static String STR_AFTER_CODE = "在静态代码块后面的变量";
  
  public static void main(String[] args)
  {
    System.out.println("---------");
    System.out.println(STR_AFTER_CODE);
    System.out.println("---------");
  }
}

三游网

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,静态变量静态代码块静态方法的执行顺序是按照以下的规则进行的: 1. 首,父类的静态变量静态代码块执行,按照它们的声明顺序执行。 2. 接着,子类的静态变量静态代码块会执行,也是按照它们的声明顺序执行。 3. 然后,父类的实例变量和非静态代码块会执行,同样按照它们的声明顺序执行。 4. 紧接着,父类的构造方法会执行。 5. 然后,子类的实例变量和非静态代码块会执行,也是按照它们的声明顺序执行。 6. 最后,子类的构造方法会执行。 需要注意的是: 1. 非静态代码块会在构造方法之前执行,并且每次实例化对象之前都会执行非静态代码块。而静态代码块会在非静态代码块之前执行。 2. 静态代码块只会在类第一次被调用时执行一次。 3. 静态代码块只能调用静态变量静态方法,而非静态代码块或非静态方法可以调用任何(静态或非静态)变量。 总结起来,静态变量静态代码块静态方法的执行顺序父类的静态变量静态代码块,再子类的静态变量静态代码块,然后父类的实例变量和非静态代码块,接着是父类的构造方法,然后子类的实例变量和非静态代码块,最后是子类的构造方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [java学习之静态变量静态语句块、静态方法、语句块的执行顺序](https://blog.csdn.net/pig_small/article/details/79975158)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Java静态)变量、(静态代码块、构造方法的执行顺序](https://blog.csdn.net/weixin_30823683/article/details/97356747)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值