java初探之初始化

首先明确,变量初始化是在任何方法(包括构造器)被调用之前进行的。

1、实例变量的初始化

  实例变量只有当它所属的类实例化后才会存在,构造器被执行就意味着对象就被创建。

1.1、指定初始化。

class Dog
{
  Dog(){
    System.out.println("Constructor is coming!");
  }

  String a = "dog's name is Lily.";
  String b = "dog's attribute is big.";

}

1.2、构造器初始化。

class Dog
{

  String a;

  String b;
  Dog(){

    a = "dog's name is Lily.";
    b = "dog's attribute is big.";
    System.out.println("Constructor is coming!");
  }

}

显然,构造器初始化方法,能够保证初始值必为构造器中的设定值(构造器初始化后于指定初始化及实例代码块初始化);

1.3、实例代码块初始化。

class Dog
{
  Dog(){
    System.out.println("Constructor is coming!");
  }

  String a;
  String b;
  {
    a = "dog's name is Lily.";
    b = "dog's attribute is big.";

    System.out.println(a);
    System.out.println(b);
  }

  Dog(int a){
    System.out.println("Constructor "+a+" is coming!");
  }

  public static void main(String args[]){
    Dog dog = new Dog();
  }
}

实例代码块初始化中,变量定义和赋值语句位置可以颠倒。按笔者水平看来,代码块初始化和指定初始化并无区别,都先于构造器之前被执行,并都是按定义的先后顺序来决定初始化的先后顺序。

2.静态数据的初始化

静态是相对于内存而言的,静态变量仅初始化一次,并且只有在必要时刻才会被初始化。

指定初始化和静态块代码初始化与非静态变量类似,同样的执行优先级,这里不再细分。构造器初始化与非静态变量相同,不在赘述。

class Dog
{
  Dog(){
  System.out.println("Constructor is coming!");
}

  String a1;
  String b1;
  {  
    a1 = "The dog is not static.";
    b1 = "The dog's name is Jack.";
    System.out.println(a1);
    System.out.println(b1);
  }

  static String b;
  static String a = "dsada";
  static {
    a = "dog's name is Lily.";
    b = "dog's attribute is big.";
    System.out.println(a);
    System.out.println(b);
  }


  Dog(int a){
    System.out.println("Constructor "+a+" is coming!");
  }

  public static void main(String args[]){
    Dog dog = new Dog(666);
  }
}

3.总结

初始化顺序为,父类先于子类,静态数据先于非静态数据,构造器初始化总在最后。

posted @ 2017-02-17 10:23  大侠熊猫儿  阅读(208)  评论(0编辑  收藏  举报