static,大家都很熟悉。但是要说真的懂,那就很少了。(当然我也不是很懂,但不妨碍学习吗。)
首先,我认为static修饰的成员就是属于类本身的成员。如果你加了一个static修饰符,好吧,那就相当于表面这是属于大家(所有该类的实例)共享的,属于公共资源。这一些想必大家都有这个意思。但是,对于那些静态成员的初始化是在什么时候呢?这个其实还是没有多少人去详细关注的。下面我就试验一下。
首先写一个类——FirstTest,它包括一个静态变量var,静态内部类BaseInnerClass
public class FirstTest { static{ System.out.println("Load FirstTest static"); } final static public String var = "FirstTest static var"; public static void show() { System.out.println("FirstTest show()"); } public FirstTest(){ System.out.println("FirstTest constructor"); } static class BaseInnerClass{ static{ System.out.println("Inner class static"); } public BaseInnerClass(){ System.out.println("InnerClass constructor"); } public static void show() { System.out.println("InnerClass show()"); } } }
下面测试当访问它的静态成员变量var,静态内部类的方法show,以及它的构造器
public class Second { public static void main(String[] args) { System.out.println(FirstTest.var); FirstTest.show(); FirstTest.BaseInnerClass.show(); new FirstTest(); } }
实验结果如下:
FirstTest static var Load FirstTest static FirstTest show() Inner class static InnerClass show() FirstTest constructor
可以发现:当我们取final修饰的静态成员变量的值时,并不会条用static块中的程序;但是一旦调用它的静态方法或者静态成员时就会调用static块中的程序。所以我觉得static代码块是首次使用这个类时执行的,其后并不会执行。而内部静态类等价于一个final static 修饰的成员,static代码并不会在构建内部类时执行。
总而言之,内部静态类和final修饰的static变量是最先构造的。final修饰的成员必须初始化,因为FirstTest类有一个静态的内部类,所以FirstTest类需要在内部类BaseInnerClass构造完成后才能构造,所以会先执行内部类中的静态方法。然后还有一点static代码块只执行一遍,所以可以用来为类的静态变量初始化。而其余非静态成员全部共享这些数据,即除第一次实例化某个对象时会执行static代码块的程序外,别的时候都不会调用了。
时间: 2024-11-05 17:28:23