類的加載順序(例題)

一、很重要!!!    
例子:
package Servlet.day0811.am;
public class StaticTest {
	static StaticTest st=new StaticTest();
	static{
		System.out.println("靜態代碼塊");
	}
	public StaticTest(){
		System.out.println("構造器");
		System.out.println(st);
		m1();
	}	
	public static void m1(){
		System.out.println("m1靜態方法");
		System.out.println(st);
	}
	{
		System.out.println("普通代碼塊");
	}
	public static void main(String[] args) {
		System.out.println("main開始");
		StaticTest.m1();
		System.out.println("main結束");
	}
}
-------------------------------------結果以下-------------------------------------
普通代碼塊    (先加載普通代碼塊)
構造器        (再加載構造器)
null          (輸出構造器中的st,此時並未加載靜態屬性,因此輸出null)
m1靜態方法    (構造器中的m1方法,輸出m1靜態方法)
null          (m1方法中的st,此時st仍然未被加載)
靜態代碼塊    (加載靜態代碼塊)
main開始      (main方法開始,st在這時候被加載(分配內存))
m1靜態方法    (調用靜態方法m1)
Servlet.day0811.am.StaticTest@d1f24bb  (st已經被加載過了,因此爲對象對應的地址)
main結束      (main方法結束)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
二、
    一、虛擬機在首次加載Java類時,會對靜態初始化塊、靜態成員變量、靜態方法進行一次初始化
    二、只有在調用new方法時纔會建立類的實例
    三、類實例建立過程:按照父子繼承關係進行初始化,首先執行父類的初始化塊部分,而後是父類
 的構造方法;再執行本類繼承的子類的初始化塊,最後是子類的構造方法
    四、類實例銷燬時候,首先銷燬子類部分,再銷燬父類部分
public class Dervied extends Base{
	private String name="dervied";
	public Dervied(){
		System.out.println(new Base().i);
		tellName();
		printName();
	}
	static{
		System.out.println("子類靜態代碼塊");
	}
	public void tellName(){
		System.out.println("Dervied tell name : "+name);
	} 
	public void printName(){
		System.out.println("Dervied print name : "+name);
	}
	public static void main(String[] args) {
		new Dervied();
	}
}
class Base{
	public int i=99;
	private String name="111";
	static{
		System.out.println("父類靜態代碼塊");
	}
	{
		System.out.println("父類非靜態代碼塊");
	}
	public Base(){
		tellName();
		printName();
	}
	public void tellName(){
		System.out.println("Base tell name : "+name);
	} 
	public void printName(){
		System.out.println("Base print name : "+name);
	}
}
-------------------------------------結果以下-------------------------------------

父類靜態代碼塊ide

子類靜態代碼塊this

父類非靜態代碼塊spa

Dervied tell name : null對象

Dervied print name : null繼承

父類非靜態代碼塊內存

Base tell name : 111虛擬機

Base print name : 111it

99class

Dervied tell name : dervied變量

Dervied print name : dervied

++++++++++++++++++++++++++作以下修改++++++++++++++++++++++++++++

將main方法裏面new Dervied( ) 改成:System.out.println("hello");

結果爲:        

    父類靜態代碼塊

    子類靜態代碼塊

    hello


============================================================

三、

class Farther{

public static int a=2;

public int b=3;

{

System.out.println("非靜態代碼塊:b="+b);

}

static{

a=4;

System.out.println("靜態代碼塊:a="+a);

}

public Farther(){

System.out.println("父類構造器");

this.s();

}

public void s(){

System.out.println("父類方法");

}

}

public class Son extends Farther{

public Son(){

System.out.println("子類構造器");

}

public static void main(String[] args) {

Farther f=new Son();

f.s();

}

public void s(){

super.s();

System.out.println("子類方法");

}

}

-------------------------------------結果以下-------------------------------------

靜態代碼塊:a=4

非靜態代碼塊:b=3

父類構造器

父類方法

子類方法

子類構造器

父類方法

子類方法

==========================================================

四、

public class InitializeDemo {

private static int k=1;

private static InitializeDemo t1=new InitializeDemo("t1");

private static InitializeDemo t2=new InitializeDemo("t2");

private static int i=print("1");

private static int n=99;

static{

print("靜態代碼塊");

}

private int j=print("j");

{

print("非靜態代碼塊");

}

public InitializeDemo(String str){

System.out.println(k++ + " : "+ str +"  i="+i+"  n="+n);

++i;

++n;

}

public static int print(String str){

System.out.println(k++ + " : "+ str +"  i="+i+"  n="+n) ;

++n;

return ++i;

}

public static void main(String[] args) {

new InitializeDemo("init");

}

}

-------------------------------------結果以下-------------------------------------

1 : j  i=0  n=0

2 : 非靜態代碼塊  i=1  n=1

3 : t1  i=2  n=2

4 : j  i=3  n=3

5 : 非靜態代碼塊  i=4  n=4

6 : t2  i=5  n=5

7 : 1  i=6  n=6

8 : 靜態代碼塊  i=7  n=99

9 : j  i=8  n=100

10 : 非靜態代碼塊  i=9  n=101

11 : init  i=10  n=102

相關文章
相關標籤/搜索