Java初始化顺序
日常工作中,有时对于一些变量的赋值过程和初始化顺序产生模糊,今天有时间就来总结下,方便下次模糊时查看。
首先java是一种面向对象的语言(比较书面哈),所以java初始化的过程可以说是实例化对象的过程,即创建一个我们需要的实体对象。
第二就是分清java对象包含的一些属性,java对象一般由属性和方法组成,但是在java中,方法是不点用不执行的,所以我们关注的初始化顺序基本就是类属性的初始化顺序。
下面是我的一些总结:
类变量按顺序初始化,其中非静态代码块和类成员变量同一级别,按顺序执行,最后才初始化类。代码
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)、没有初始化类
在调用类静态成员(不管是方法还是变量)的时候,按顺序初始化静态属性和代码块,之后才会调用静态方法,非静态成员变量因为没有初始化类,故不会初始化
代码:
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();
}
}