一、类的初始化
类的初始化:主要是执行执行类中的静态块初始化和静态变量初始化
当类被用到的时候就会进行初始化,但是不一定会被实例化,实例化的时候才会执行实例域的初始化和初始化代码块的代码
class ThirdInit{
private int age=0;//这种是第一种方式
private String name="initial name";
private static String staticField="initial staticField";
{
System.out.println("初始化之前 "+age+" "+name+" "+staticField);
age=10;
name="static name";
staticField="static staticfield";
System.out.println("初始化之后 "+age+" "+name+" "+staticField);
}
static {
/**
* 静态初始化块:用来初始化静态变量的,静态初始化块中只能接触静态变量
*/
System.out.println("静态初始化之前"+staticField);
staticField="static name";
System.out.println("静态初始化之后"+staticField);
}
public ThirdInit(String name,int age,String staticField){
System.out.println("构造器执行之前:"+age+" "+name+" "+staticField);
this.name=name;
this.age=age;
this.staticField=staticField;
System.out.println("构造器执行之后:"+age+" "+name+" "+staticField);
}
}
结果:
静态初始化之前initial staticField
静态初始化之后static name
初始化之前 0 initial name static name
初始化之后 10 static name static staticfield
构造器执行之前:100 new name new static field
构造器执行之后:100 new name new static field
结果说明:
- 当实例化一个类的时候顺序:先是静态的,然后是显示的,最后才是构造器本身
- 先是静态域和静态块顺序执行,显示的域初始化和块初始化顺序执行、最后是构造器本身
----------
class ThirdInit{
private int age=0;//这种是第一种方式
private String name="initial name";
private static String staticField="initial staticField";
{
System.out.println("初始化之前 "+age+" "+name+" "+staticField);
age=10;
name="static name";
staticField="static staticfield";
System.out.println("初始化之后 "+age+" "+name+" "+staticField);
}
static {
/**
* 静态初始化块:用来初始化静态变量的,静态初始化块中只能接触静态变量
*/
System.out.println("静态初始化之前"+staticField);
staticField="static name";
System.out.println("静态初始化之后"+staticField);
}
public ThirdInit(String name,int age,String staticField){
System.out.println("构造器执行之前:"+age+" "+name+" "+staticField);
this.name=name;
this.age=age;
this.staticField=staticField;
System.out.println("构造器执行之后:"+age+" "+name+" "+staticField);
}
public static void main(String[] args) {
System.out.println("main 方法开始执行");
}
}
输出:
静态初始化之前initial staticField
静态初始化之后static name
main 方法开始执行
这里说明:构造代码块和显示域是属于一个类的实例的,如果没有调用一个类的构造函数,那么这些都不会执行。
所有的动作都是从父类到子类执行的
二、对象的初始化
public class Test{
private static String staticField=init("Test类静态域初始化");
public String obField=init("Test实例域初始化");
static{
System.out.println("Test 静态块");
}
{
System.out.println("Test 实例域块");
}
public static void main(String[] args) {
System.out.println("\n main 函数开始执行,实例化Test类和Apple类---------------------------\n");
new Test();
new Apple();
}
public static String init(String field){
System.out.println(field);
return "static Field";
}
}
class Fruit{
static{
System.out.println("父类static block");
}
{
System.out.println("父类 block");
}
public Fruit() {
System.out.println("父类构造函数");
}
}
class Apple extends Fruit{
static{
System.out.println("子类 static block");
}
{
System.out.println("子类 block");
}
public Apple() {
System.out.println("子类 构造函数");
}
}
输出结果:
Test类静态域初始化
Test 静态块
main 函数开始执行,实例化Test类和Apple类---------------------------
Test实例域初始化
Test 实例域块
父类static block
子类 static block
父类 block
父类构造函数
子类 block
子类 构造函数
这说明,用到某个类的时候它才会被加载进来并进行类初始化(执行static变量和static块,此时先执行父类的在执行子类的),当实例化的时候才会进行对象初始化(实例域初始化和代码块初始化,先父类再子类)