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字段以后初始化过程是如何进行的;

如果成员变量没有被初始化,其在后续的方法中是可以继续使用的;但是在局部变量中如果没有初始化,就会无法使用;

 

 

 

                                 

 

posted @ 2016-09-08 19:20  Pool  阅读(97)  评论(0)    收藏  举报