1. 程式人生 > >類的加載順序(例題)

類的加載順序(例題)

javase

1、很重要!!!    
例子:
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)
[email protected]  (st已經被加載過了,所以為對象對應的地址)
main結束      (main方法結束)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2、
    1、虛擬機在首次加載Java類時,會對靜態初始化塊、靜態成員變量、靜態方法進行一次初始化
    2、只有在調用new方法時才會創建類的實例
    3、類實例創建過程:按照父子繼承關系進行初始化,首先執行父類的初始化塊部分,然後是父類
 的構造方法;再執行本類繼承的子類的初始化塊,最後是子類的構造方法
    4、類實例銷毀時候,首先銷毀子類部分,再銷毀父類部分
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);
	}
}
-------------------------------------結果如下-------------------------------------

父類靜態代碼塊

子類靜態代碼塊

父類非靜態代碼塊

Dervied tell name : null

Dervied print name : null

父類非靜態代碼塊

Base tell name : 111

Base print name : 111

99

Dervied tell name : dervied

Dervied print name : dervied

++++++++++++++++++++++++++做如下修改++++++++++++++++++++++++++++

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

結果為:

父類靜態代碼塊

子類靜態代碼塊

hello


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

3、

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

父類構造器

父類方法

子類方法

子類構造器

父類方法

子類方法

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

4、

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


本文出自 “Java學習” 博客,請務必保留此出處http://12181171.blog.51cto.com/12171171/1958973

類的加載順序(例題)