Java字段初始化的规律:
1有实际参数值的,按实际参数值进行初始化例如obj=new Init(300);
System.out.println(obj.field);
2没有给出实际参数值时,找默认的构造函数例如Init obj=new Init();
System.out.println(obj.field);
2当多个类之间有继承关系时,创建子类对象导致父类初始化快的执行的程序:
package com;
class Father {
static
{
System.out.println("父类静态块");
}
public Father() {
System.out.println("父类构造方法");
}
}
class Child extends Father {
static
{
System.out.println("子类静态块");
}
public Child() {
System.out.println("子类构造方法");
}
}
public class Duo {
public static void main(String []args) {
new Father();
System.out.println("--------------");
new Child();
}
}
3总结静态初始化块的执行顺序:
代码如下:package com;
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的无参数的构造器");
}
public Mid(String msg)
{
//通过this调用同一类中重载的构造器
this();
System.out.println("Mid的带参数构造器,其参数值:" + msg);
}
}
class Leaf extends Mid
{
static{
System.out.println("Leaf的静态初始化块");
}
{
System.out.println("Leaf的普通初始化块");
}
public Leaf()
{
//通过super调用父类中有一个字符串参数的构造器
super("Java初始化顺序演示");
System.out.println("执行Leaf的构造器");
}
}
public class Q
{
public static void main(String[] args)
{
new Leaf();
}
}
分析如下:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕后再去看父类有没有非静态代码块。如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕后接着看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕执行构造方法。总之静态代码块内容优先,然后是父类的非静态代码块和构造方法,做后是子类的非静态代码块和构造方法。