java静态变量static初始化顺序

Java初始化顺序

日常工作中,有时对于一些变量的赋值过程和初始化顺序产生模糊,今天有时间就来总结下,方便下次模糊时查看。

首先java是一种面向对象的语言(比较书面哈),所以java初始化的过程可以说是实例化对象的过程,即创建一个我们需要的实体对象。

第二就是分清java对象包含的一些属性,java对象一般由属性和方法组成,但是在java中,方法是不点用不执行的,所以我们关注的初始化顺序基本就是类属性的初始化顺序。

下面是我的一些总结:

  1. 没有静态变量的情况(这种情况较简单)

类变量按顺序初始化,其中非静态代码块和类成员变量同一级别,按顺序执行,最后才初始化类。代码

package info.lumanman.thinking5_1;

 

import info.lumanman.thinking17.Print;

 

class Bowl {

  Bowl(int marker) {

             Print.print("Bowl(" + marker + ")执行了");

  }

}

class Table {

  Bowl bowl1 = new Bowl(1);

  {

            System.out.println("我是代码块");

  }

  Table() {

             Print.print("Table()执行了");

  }

  Bowl bowl2 = new Bowl(2);

}

public class Test1 {

 

public static void main(String[] args) {

    Table table = new Table();

  }

}

 

  1. 有静态变量的情况

(1)、没有初始化类

在调用类静态成员(不管是方法还是变量)的时候,按顺序初始化静态属性和代码块,之后才会调用静态方法,非静态成员变量因为没有初始化类,故不会初始化

代码:

 

 

package info.lumanman.thinking5_2;

 

import info.lumanman.thinking17.Print;

 

class Bowl {

  Bowl(int marker) {

             Print.print("Bowl(" + marker + ")执行了");

  }

}

class Table {

  static Bowl bowl1 = new Bowl(1);

  static {

            System.out.println("我是代码块");

  }

   Bowl bowl3 = new Bowl(3);

  Table() {

             Print.print("Table()执行了");

  }

  static Bowl bowl2 = new Bowl(2);

 

  public static void print(){

             System.out.println("我是静态方法");

  }

}

public class Test1 {

 

public static void main(String[] args) {

           Table.print();//调用方法

           //System.out.println(Table.bowl2);//调用成员变量

}

}

(2)、初始化类

先初始化静态成员再初始化非静态的,最后初始化类对象

package info.lumanman.thinking5_2;

 

import info.lumanman.thinking17.Print;

 

class Bowl {

  Bowl(int marker) {

             Print.print("Bowl(" + marker + ")执行了");

  }

}

class Table {

  static Bowl bowl1 = new Bowl(1);

  static {

            System.out.println("我是代码块");

  }

   Bowl bowl3 = new Bowl(3);

  Table() {

             Print.print("Table()执行了");

  }

  static Bowl bowl2 = new Bowl(2);

 

  public static void print(){

             System.out.println("我是静态方法");

  }

}

public class Test1 {

 

public static void main(String[] args) {

           Table t=new Table();

}

}

最后一点,静态成员只会在每个类中初始化一次,和类对象初始化的次数没关系。还有就是java只会给类的成员变量赋初始值,局部变量不会初始化,未初始化就使用局部变量编译会报错。

补充:涉及到继承关系时,初始化顺序问题

先初始化父类和子类的静态成员变量,之后在是按结构初始化父类(变量,构造函数)和子类(变量构造函数)。

代码:

//: polymorphism/Sandwich.java
// Order of constructor calls.
package info.lumanman.thinking5_3;

import info.lumanman.thinking17.Print;

class Meal {
    Meal() {
        Print.print("Meal()");
    }
}

class Bread {
    Bread(String name) {
        Print.print("Bread()"+name);
    }
}

class Cheese {
    Cheese() {
        Print.print("Cheese()");
    }
}

class Lettuce {
    Lettuce() {
        Print.print("Lettuce()");
    }
}

class Lunch extends Meal {
    Lunch() {
        Print.print("Lunch()");
    }
}

class PortableLunch extends Lunch {
    private static Bread b = new Bread("静态基类");
    private Bread c = new Bread("非静态基类");
    PortableLunch() {
        Print.print("PortableLunch()");
    }
}

public class Test1 extends PortableLunch {
    private static Bread b = new Bread("静态子类");
    private Cheese c = new Cheese();
    private Lettuce l = new Lettuce();

    public Test1() {
        Print.print("Sandwich()");
    }

    public static void main(String[] args) {
        new Test1();
    }
}

你可能感兴趣的:(java静态变量static初始化顺序)