類的加載順序(例題)
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
類的加載順序(例題)