最近翻看下java编程思想,对java类和对象的初始化有点困惑,查阅了一些资料:
一、java类初始化
对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量。
类的编译决定了类的初始化过程。编译器生成的class文件主要对定义在源文件中的类进行了如下的更改:
1、先按照静态成员变量的定义顺序在类内部声明成员变量。
2、再按照原java类中对成员变量的初始化顺序进行初始化。
源文件
public class Person {
public static String name = "gyq";
public static int age;
static {
age = 20;
System.out.println("初始化了age");
}
public static String address;
static {
address = "shenyang";
age = 21;
}
public static void main(String[] args) {
System.out.println(name);
System.out.println(age);
System.out.println(address);
}
}
当java源代码转换成一个class文件后,其转换成类似下面的代码:
public class Person{
public static String name;
public static int age;
public static String address;
static{
name="gyq";
age=20;
System.out.println("初始化了age");
address="shenyang";
age=21;
}
public static void main(String[] args) {
System.out.println(name);
System.out.println(age);
System.out.println(address);
}
}
初始化顺序依据转换后对应的class类成员变量的初始化顺序依次执行,所以所有的静态成员变量都是先声明,后执行赋值的,而且赋值的顺序也是依照源代码对静态成员变量初始化的顺序进行的,注意:定义一个成员变量并直接初始化与在静态代码块中进行初始化是等价的,都是依据它们在源代码中定义的顺序进行的。
二、java对象的生成
对于对象的生成其初始化过程与类的初始化过程类似,但会增加构造函数阶段,源代码如下:
package package1;
public class Person {
{
name = "gyq";
age = 20;
System.out.println("初始化了age");
address = "shenyang";
}
public String name = "ddl";
public int age = 21;
public String address = "dalian";
public Person() {
name = "ddlgyq";
age = 27;
address = "shenyang";
}
}
编译器转换成class文件后,会转换成类似下面的代码:
public class Person {
public String name;
public int age;
public String address;
public Person() {
name = "gyq";
age = 20;
System.out.println("初始化了age");
address = "shenyang";
name = "ddl";
age = 21;
address = "dalian";
name = "ddlgyq";
age = 27;
address = "shenyang";
}
}
可以看到,对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中,并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行。
类的初始化和对象的初始化都可以按照以上说的模型进行记忆。死记硬背只能起到事倍功半的效果,按照模型记忆,则可以事半功倍