[关闭]
@natsumi 2017-06-13T14:38:30.000000Z 字数 951 阅读 1070

静态代码块什么时候执行

Java


毕设中遇到的问题,把类的关系抽象出来写了下面这个Demo。
静态代码块什么时候执行?一直以来的理解是:随着类的加载而执行,只执行一次。
但是类的加载,是在首次访问类之前。

需要明确的是这个访问的概念

下面看看demo,什么样的访问会触发静态代码块的执行?

  1. /**
  2. * Created by tiantian on 17-6-13.
  3. * 关于静态代码块的Demo
  4. */
  5. public class StaticBlockTest {
  6. /**
  7. * 依次输出
  8. * 3.0
  9. * 3.0
  10. * 6.0
  11. * 3.0
  12. * 5.0
  13. * 2.0
  14. * 2.0
  15. *
  16. * @param args 未使用
  17. */
  18. public static void main(String[] args) {
  19. System.out.println(Test1.a);//访问Test1中的a前会执行Test1的静态代码块
  20. System.out.println(Test2.a);//a并不是Test2的域,所以不会执行Test2的静态代码块
  21. System.out.println(Test2.C);//访问Test2中的final字段前不会执行静态代码块
  22. System.out.println(Test2.a);
  23. System.out.println(Test2.b);//访问Test2的静态成员前会调用Test2的静态代码块
  24. //Test2.print();//或者调用Test2的静态方法
  25. //new Test2();//或者新建Test2对象
  26. System.out.println(Test1.a);
  27. System.out.println(Test2.a);
  28. }
  29. }
  30. class Test1 {
  31. public static double a = 1;
  32. static {
  33. a = 3;
  34. }
  35. }
  36. class Test2 extends Test1 {
  37. public static double b = 5;
  38. public static final double C = 6;
  39. static {
  40. a = 2;
  41. }
  42. public static void print() {
  43. System.out.println("execute print");
  44. }
  45. }

结论:
首次 对类中静态(非final)域、静态方法的访问、或者新建对象 之前会执行类的静态代码块。对于静态域的访问要求域严格的属于当前类,通过当前类类名访问基类的静态域 不会 加载当前类。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注