Java初始化----基础篇
1. 基本初始化:
new关键字后面跟着“类名”,就会找到该类依次进行
1)实例变量的初始化(依照定义的顺序)
2)构造器方法体的执行
1 public class BaseInit { 2 3 private String str = giveString("Initialize Instance Field str"); 4 5 BaseInit(){ 6 System.out.println("BaseInit constructor"); 7 } 8 9 String giveString(String s){ 10 System.out.println(s); 11 return s; 12 } 13 14 public static void main(String[] args) { 15 new BaseInit(); 16 } 17 }
根据以上原则,会输出:
Initialize Instance Field
BaseInit constructor
2.static初始化
类中如果有static方法,或者static域,则在当在首次:
1)引用该类的静态成员时
2)创建该类的对象时
首先加载这些静态成员,然后再按照 1 中的顺序, 先初始化实例变量, 然后在执行构造器的方法体;
(static成员只需初始化一次,比如在main方法中再次new BaseInit()则不会再次初始化static 成员str1)
在 1 的例子中第16行以后,添加一个static域,比如:
private static String str1 = giveString("Initialize Static Field str1");
在这个过程中发现,产生static域的值必须使用一个static方法才可以,因此必须将giveString(String s)声明为static; (原因:类加载的时候先初始化类的静态成员,如果此处若使用非static方法产生值,由于非static方法是属于对象的,此时还没有初始化instance field,以及构造体的方法体, 因此只能用static方法产生static field);
3.引入组合以后的初始化
当一个类拥有一另一个类的引用,初始化仍然是按照 1 ,2 所述顺序执行;下面是一个例子:
public class Combination { private BaseInit baseInit; { System.out.println(baseInit); System.out.println("I'M GOING INTO Constructor"); } Combination(){ baseInit = new BaseInit(); System.out.println("Combination construct"); } static String giveString(String s){ System.out.println(s); return s; } public static void main(String[] args) { new Combination(); } static{ System.out.println("Static Block"); }
private static String s = giveString("Initialize Combination String s"); }
可以看到在Combination类中有一个 1 中例子的类 BaseInit的引用;
系统执行Combinatio的static main方法,首先加载Combination类,
1)将其静态成员初始化(依次),
在本例中 静态块 先初始化; 输出(Static Block)
static String s作为静态域被初始化 输出“Initialize Combination String s”
2)初始化实例域(依次):
在本例中 baseInit 仅仅是被声明, 因此先赋予默认值, null;
在实例块中, 输出 null
I'M GOING INTO Constructor
3)构造器方法体:
baseInit被赋值,运用 new BaseInit(), 该过程回到 1), 只是这次加载的是BaseInit类,步骤还是一样的;
先是静态域, 输出 Initialize Static Field str1
然后时 实例变量; 输出 Initialize Instance Field str
构造方法体: 输出 BaseInit constructor
返回执行方法体继续执行: 输出 Combination construct
接下来我们看看引入继承, 多态, 以及final字段以后初始化过程是如何进行的;
如果成员变量没有被初始化,其在后续的方法中是可以继续使用的;但是在局部变量中如果没有初始化,就会无法使用;
浙公网安备 33010602011771号