静态块的初始化要早于非静态的,原因是在于这些东西是在类装载时开始初始化了。

  说起static的“局限“,总结起来是:在static的方法中仅能够调用其他的static方法和static变量;在static方法中不能以任何方式引用this或super;static变量在定义时必须进行初始化,并且初始化的时间早于非静态。还有一个局限我需要具体的说明一下,static的变量的初始化仅能一次,如下例:

package com.meritit.test;

public class Static {
 T1 t1 = new T1(2);
 T1 t2 = new T1(3);
 T1 t3 = new T1(4);

 public Static() {
  System.out.println("t1: " + t1.t);
  System.out.println("t2: " + t2.t);
  System.out.println("t3: " + t3.t);
 }

 public static void main(String args[]) {
  new Static();
 }
}

class T1 {
 static int t = 1;

 T1(int b) {
  t = b;
 }
}

  运行结果:

  t1: 4

  t2: 4

  t3: 4

  该static变量只是接受了后一次的初始化.实际这还是我们先前提到的多个实例共享一个静态的变量的问题。

  总之,static是给我们一个这样的忠告:static的东西在编译时,已向内存要到了存取空间了。