基础知识
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 defined 10 } 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 superClass
123
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); //输出:null 10 System.out.println(str2); //编译不通过,报错信息:The local variable str2 may not have been initialized 11 } 12 }
。。。