static 修饰的会被称之为 静态常量,静态变量, 静态方法 ,还有就是静态代码块

static{
 // 代码块 非static修饰的方法,变量,常量, 是不能再静态代码块中使用的 
}

静态常量,静态变量,静态方法, 都是通过类名直接调用的(例如:Demo.getStatic() )。但是静态代码块 不是主动调用的。 那它到底什么时候被执行呢?

✔**只要你的代码在任意地方,动用了静态代码块所属的类中的任意东西,那么该静态代码块就会马上执行(说白了就是静态代码块是这个类最先执行的代码,但前提是你要使用这个类,不使用的话,这个类中的静态代码块是不会执行的与静态变量相比就是看代码编写的前后顺序,和静态方法有很大的区别)。**
  • 当一个类中有多个静态代码块的时候,是按照代码编写的上下顺序先后执行的。
  • 静态代码块与静态变量之间的关系:
    静态变量的定义与静态代码块的执行是会根据代码编写的顺序来决定的。
public class Demo{
    public static int i;
    static{
      i = 20;//这里的i, 是可以被用作运算的。
    }
}

这时候如果你在main函数输出i, 那么i=20;

public class Demo{ 
     static{
        i = 20;//这里的i, 是不能被用作运算的, 因为本质上 i 还未被定义  
      }
     public static int i;
}

这时候如果你在main函数输出i, 那么i=20;

public class Demo{ 
     static{
        i = 20;  //这里的i, 是不能被用作运算的, 因为本质上 i 还未被定义 
      }
     public static int i = 1; //但是如果我们给静态的i附上一个初始值后,那么结果就变了。
}

这时候如果你在main函数输出i, 那么i=1;

上述的代码就是进一步说明静态变量和static修改的静态代码块运行的顺序是根据代码编写的先后,而且第二种写法毫无意义。所以不管是否在静态代码块中使用静态变量,都应当把静态变量写在静态代码块的上方。 静态常量的情况和静态变量是一样。

1、执行顺序

1.1、一个类中的初始化顺序

类内容(静态变量、静态初始化块) => 实例内容(变量、初始化块、构造器)

1.2、两个具有继承关系类的初始化顺序

父类的(静态变量、静态初始化块)=> 子类的(静态变量、静态初始化块)=> 父类的(变量、初始化块、构造器)=> 子类的(变量、初始化块、构造器)

2、对变量值的影响

  • 初始化块可以对在它之后定义的变量赋值,但不能访问(如打印)。
  • 变量最终值:一个变量,若显示初始化、初始化块对该变量赋值、构造方法对该变量赋值同时存在,则变量最终值如何确定:
    1、按执行顺序
    2、若对变量赋值的初始化块在变量定义前时:若变量显示初始化了则最终为显示初始化值,否则为初始化块的赋值。