1、类中的静态语句块只能访问到在块之前定义的变量,定义在块之后的变量,可以在块中进行赋值,但是不能访问。如下示例:
1 package com.cfang.loadClassTest; 2 3 public class TestClsStatic { 4 5 //public static int i = 123; //① 6 7 static{ 8 i = 456; 9 System.out.println(i); //Cannot reference a field before it is defined10 }11 12 public static int i = 123; //②13 }
上述第9行报错“非法向前引用”,可以注释掉②所在行,放开①行。
2、调用静态字段,只有直接定义这个字段的类才会被初始化,所以通过子类调用父类的静态字段,只会触发父类的初始化而不初始化子类。如下程序示例:
1 package com.cfang.loadClassTest; 2 3 public class TestLoadClass { 4 5 public static void main(String[] args) { 6 //通过子类去调用父类的静态字段,只会触发父类初始化,而子类本身并不初始化 7 System.out.println(SubClass.value); 8 9 //对自身常量池的引用,不会触发初始化操作10 // System.out.println(SubClass.value1);11 12 //不会触发初始化操作13 // SuperClass[] arr = new SuperClass[10];14 // System.out.println(arr.toString());15 16 // SuperClass cls = new SuperClass();17 18 // SuperClass cls = new SubClass();19 // System.out.println(cls.value3);20 }21 }22 23 class SuperClass{24 static{25 System.out.println("init superClass");26 }27 public static int value = 123;28 public static final int value1 = 456;29 public int value3 = 111;30 }31 32 class SubClass extends SuperClass{33 static{34 System.out.println("init subClass");35 }36 }
输出结果为:
init superClass123
3、类成员变量会初始化值,而局部变量必须进行初始化。如下:
1 package com.cfang.loadClassTest; 2 3 public class TestInit { 4 5 private static String str; 6 7 public static void main(String[] args) { 8 String str2; 9 System.out.println(str); //输出:null10 System.out.println(str2); //编译不通过,报错信息:The local variable str2 may not have been initialized11 }12 }
。。。