class Parent
{
private String name=null;
Parent(String name)
{
this.name=name;
System.out.println("parent construct ");
}
static
{
System.out.println("parent static block ");
}
{
System.out.println("parent block");
}
public static void method()
{
System.out.println("parent static method");
}
public void method1()
{
System.out.println("parent method");
}
}
class Son extends Parent
{
private String name=null;
Son(String name)
{
super(name);
System.out.println("son construct ");
}
static
{
System.out.println("Son static block ");
}
public static void method()
{
System.out.println("son static method");
}
{
System.out.println("Son block");
}
}
class Daughter extends Parent
{
private String name=null;
Daughter(String name)
{
super(name);
System.out.println("daughter construct ");
}
static
{
System.out.println("Daughter static block ");
}
public static void method()
{
System.out.println("daughter static method");
}
public void method1()
{
System.out.println("daughter method");
}
{
System.out.println("Daughter block");
}
}
class zhanxuntest
{
public static void main(String[] args)
{
Parent p1=new Son("childA");
Parent p2=new Daughter("childB");
p1.method();
p1.method1();
p2.method();
p2.method1();
}
}
打印結果爲
parent static block
Son static block
parent block
parent construct
Son block
son construct
Daughter static block
parent block
parent construct
Daughter block
daughter construct
parent static method
parent method
parent static method
daughter method
規律:父類靜態代碼塊先執行,然後執行子類靜態代碼塊,然後執行父類非靜態代碼塊和構造方法,然後執行子類非靜態代碼塊和構造方法。注意父類中的靜態代碼塊只執行一次(凡是靜態的初始化如static int i=0都是隻執行一次),靜態方法不能被覆蓋,如Parent p=new Son("childA"); p.method(),調用的依舊是父類方法。注意不管是靜態方法還是非靜態方法,都需要調用後執行,其執行的次序和在類裏聲明的次序無關,區別是靜態方法是“class.method"方式執行,非靜態方法是"object.method"方式執行,即後者需要創建一個對象。