疯狂Java讲义_03_初始化块
初始化块
初始化块与成员变量的执行顺序:
public class helloworld
{
//初始化块
{
a=6;
}
//成员变量
private int a=9;
public static void main(String[] args)
{
System.out.println(new helloworld().a);//9
}
}
public class helloworld
{
//成员变量
private int a=9;
//初始化块
{
a=6;
}
public static void main(String[] args)
{
System.out.println(new helloworld().a);//6
}
}
当Java创建一个对象时,系统先为该对象的所有实例 Field分配内存(前提是该类已经被加载过了),接着程序开始对这些实例变量执行初始化,其初始化顺序是:先执行初始化块或声明 Field时指定的初始值(看两者的顺序),再执行构遗器里指定的初始值。
从某种程度上说,初始化块是构造器的补充。初始化块总是在构造器执行之前执行。
静态初始化块
初始化块用static修饰后就是静态初始化块了,并且只能被static修饰。
静态初始化块也被称为类初始化块,也属于类的静态成员,同样需要遵循静态成员不能访问非静态成员的规则,因此静态初始化块不能访问非静态成员,包括不能访问实例Field和实例方法。
静态初始化块与静态成员变量的初始化(同样也是看谁在前谁在后):
public class Helloworld
{
//初始化块
static {
a=6;
}
//成员变量
private static int a=9;
public static void main(String[] args)
{
System.out.println(Helloworld.a);//9
}
}
public class Helloworld
{
//成员变量
private static int a=9;
//初始化块
static {
a=6;
}
public static void main(String[] args)
{
System.out.println(Helloworld.a);//6
}
}
初始化块、静态初始化块、构造器 执行顺序
静态初始化块:用来对类进行初始化(又称为类初始化)
初始化块:用来对对象进行初始化
构造器:创建一个对象时,调用的方法。可以进行初始化,默认有一个无参数构造器,但一旦自己写了有参数构造器后,系统就不会再提供默认的无参数构造器了。
先 静态初始化块 (并且只执行一次)当第一次使用到该类时,JVM加载该类,进行类初始化,一旦加载成功就永在JVM内存中,直到JVM退出。
再 初始化块
再 构造器
另外:初始化某个类时,总是先初始化该类的所有父类(包括直接父类和间接父类)。
public class ConversionTest
{
public static void main(String [] args)
{
new Leaf();
new Leaf();
}
}
/* 结果:
Root 静态初始化块
Mid 静态初始化块
Leaf 静态初始化块
Root 普通初始化块
Root 构造器
Mid 普通初始化块
Mid 构造器
Leaf 普通初始化块
Leaf 构造器
Root 普通初始化块
Root 构造器
Mid 普通初始化块
Mid 构造器
Leaf 普通初始化块
Leaf 构造器
*/
class Root
{
//静态初始化块
static{ System.out.println("Root 静态初始化块"); }
//初始化块
{ System.out.println("Root 普通初始化块"); }
//构造器
public Root(){ System.out.println("Root 构造器"); }
}
class Mid extends Root
{
//静态初始化块
static{ System.out.println("Mid 静态初始化块"); }
//初始化块
{ System.out.println("Mid 普通初始化块"); }
//构造器
public Mid(){ System.out.println("Mid 构造器"); }
}
class Leaf extends Mid
{
//静态初始化块
static{ System.out.println("Leaf 静态初始化块"); }
//初始化块
{ System.out.println("Leaf 普通初始化块"); }
//构造器
public Leaf(){ System.out.println("Leaf 构造器"); }
}