1 public class InitializeBlockClass 2 { 3 { 4 field=200; 5 } 6 public int field = 100; 7 public InitializeBlockClass(int value) 8 { 9 this.field=value; 10 } 11 12 public InitializeBlockClass() 13 { 14 15 } 16 17 public static void main(String[] args) 18 { 19 InitializeBlockClass obj=new InitializeBlockClass(); 20 System.out.println(obj.field); 21 22 obj=new InitializeBlockClass(300); 23 System.out.println(obj.field); 24 } 25 }
1、Java 初始化字段方式和顺序:
-
类加载时直接初始化静态字段;
-
类加载时调用静态方法初始化静态字段;
-
实例化对象时,在调用构造函数之前代码块中初始化字段;
-
实例化对象时,在调用构造函数之时初始化字段;
2、如何在静态方法中访问类的实例成员
1 public class Test 2 { 3 int a=1; 4 static int b=2; 5 6 public static void main(String[] args) 7 { 8 System.out.println("实例变量a = "+new Test().a); 9 System.out.println("静态变量b = "+b); 10 } 11 12 }
3、以下代码为何无法通过编译?哪儿出错了?
如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。
4、
1 class Root 2 { 3 static{ 4 System.out.println("Root的静态初始化块"); 5 } 6 { 7 System.out.println("Root的普通初始化块"); 8 } 9 public Root() 10 { 11 System.out.println("Root的无参数的构造器"); 12 } 13 } 14 class Mid extends Root 15 { 16 static{ 17 System.out.println("Mid的静态初始化块"); 18 } 19 { 20 System.out.println("Mid的普通初始化块"); 21 } 22 public Mid() 23 { 24 System.out.println("Mid的无参数的构造器"); 25 } 26 public Mid(String msg) 27 { 28 //通过this调用同一类中重载的构造器 29 this(); 30 System.out.println("Mid的带参数构造器,其参数值:" + msg); 31 } 32 } 33 class Leaf extends Mid 34 { 35 static{ 36 System.out.println("Leaf的静态初始化块"); 37 } 38 { 39 System.out.println("Leaf的普通初始化块"); 40 } 41 public Leaf() 42 { 43 //通过super调用父类中有一个字符串参数的构造器 44 super("Java初始化顺序演示"); 45 System.out.println("执行Leaf的构造器"); 46 } 47 48 } 49 50 public class TestStaticInitializeBlock 51 { 52 public static void main(String[] args) 53 { 54 new Leaf(); 55 56 57 } 58 }
静态初始化块只执行一次, 创建子类型的对象时,也会导致父类型的静态初始化块的执行。