標籤:構造器 less 1.3 str system tle 過程 順序 靜態代碼塊
Java 的類載入順序
一、載入順序
1、父類的靜態成員變數初始化
1.1、靜態代碼塊
1.2、普通代碼塊
1.3、無參構造器
2、父類的靜態代碼塊
3、子類的靜態成員變數初始化
3.1、靜態代碼塊
3.2、普通代碼塊
3.3、無參構造器
4、子類的靜態代碼塊
5、父類的普通成員變數初始化
5.1、靜態代碼塊
5.2、普通代碼塊
5.3、無參構造器
6、父類的普通代碼塊
7、父類的無參構造器
8、子類的普通成員變數
8.1、靜態代碼塊
8.2、普通代碼塊
8.3、無參構造器
9、子類的普通代碼塊
10、子類的無參構造器
二、範例程式碼
超級父類A,父類B,子類C,B繼承A,C繼承B;
AA、AAA、BB、BBB、CC、CCC都有各自的普通、靜態成員變數,普通、靜態代碼塊和無參構造器
超級父類A的普通成員變數aa(AA類的執行個體),超級父類A的靜態成員變數aaa(AAA類的執行個體);
父類B的普通成員變數bb(BB類的執行個體),父類B的靜態成員變數bbb(BBB類的執行個體);
子類C的普通成員變數cc(CC類的執行個體),子類C的靜態成員變數ccc(CCC類的執行個體);
1、超級父類A
package cn.com.zfc.lesson05.inherit01;
/**
*
* @title A
* @describe 超級父類 A
* @author 張富昌
* @date 2017年4月3日下午5:59:17
*/
public class A {
//普通成員變數
private AA aa = new AA();
//靜態成員變數
private static AAA aaa = new AAA();
// 靜態代碼塊
static {
System.out.println("我是超級父類 A 的靜態代碼塊");
}
// 普通代碼塊
{
System.out.println("我是超級父類 A 的普通代碼塊");
}
// 無參構造方法
public A() {
System.out.println("我是超級父類 A 的無參構造方法");
}
}
2、父類B
package cn.com.zfc.lesson05.inherit01;
/**
*
* @title B
* @describe 父類
* @author 張富昌
* @date 2017年4月3日下午5:59:17
*/
public class B extends A {
//普通成員變數
private BB bb = new BB();
//靜態成員變數
private static BBB bbb = new BBB();
// 靜態代碼塊
static {
System.out.println("我是父類 B 的靜態代碼塊");
}
// 普通代碼塊
{
System.out.println("我是父類 B 的普通代碼塊");
}
// 無參構造方法
public B() {
System.out.println("我是父類 B 的無參構造方法");
}
}
3、子類C
package cn.com.zfc.lesson05.inherit01;
/**
*
* @title C
* @describe 子類 C
* @author 張富昌
* @date 2017年4月3日下午5:59:17
*/
public class C extends B {
//普通成員變數
private CC cc = new CC();
//靜態成員變數
private static CCC ccc = new CCC();
// 靜態代碼塊
static {
System.out.println("我是子類 C 的靜態代碼塊");
}
// 普通代碼塊
{
System.out.println("我是子類 C 的普通代碼塊");
}
// 無參構造方法
public C() {
System.out.println("我是子類 C 的無參構造方法");
}
}
4、AA類
package cn.com.zfc.lesson05.inherit01;
/**
*
* @title AA
* @describe 超級父類 A 的普通成員變數 AA
* @author 張富昌
* @date 2017年4月3日下午5:59:17
*/
public class AA {
// 靜態代碼塊
static {
System.out.println("我是超級父類 A 的普通成員變數 AA 的靜態代碼塊");
}
// 普通代碼塊
{
System.out.println("我是超級父類 A 的普通成員變數 AA 的普通代碼塊");
}
// 無參構造方法
public AA() {
System.out.println("我是超級父類 A 的普通成員變數 AA 的無參構造方法");
}
}
5、AAA類
package cn.com.zfc.lesson05.inherit01;
/**
*
* @title AAA
* @describe 超級父類 A 的靜態成員變數 AAA
* @author 張富昌
* @date 2017年4月3日下午5:59:17
*/
public class AAA {
// 靜態代碼塊
static {
System.out.println("我是超級父類 A 的靜態成員變數 AAA 的靜態代碼塊");
}
// 普通代碼塊
{
System.out.println("我是超級父類 A 的靜態成員變數 AAA 的普通代碼塊");
}
// 無參構造方法
public AAA() {
System.out.println("我是超級父類 A 的靜態成員變數 AAA 的無參構造方法");
}
}
6、BB類
package cn.com.zfc.lesson05.inherit01;
/**
*
* @title BB
* @describe 父類 B 的普通成員變數 BB
* @author 張富昌
* @date 2017年4月3日下午5:59:17
*/
public class BB {
// 靜態代碼塊
static {
System.out.println("我是父類 B 的普通成員變數 BB 的靜態代碼塊");
}
// 普通代碼塊
{
System.out.println("我是父類 B 的普通成員變數 BB 的普通代碼塊");
}
// 無參構造方法
public BB() {
System.out.println("我是父類 B 的普通成員變數 BB 的無參構造方法");
}
}
7、BBB類
package cn.com.zfc.lesson05.inherit01;
/**
*
* @title BBB
* @describe 父類 B 的靜態成員變數 BBB
* @author 張富昌
* @date 2017年4月3日下午5:59:17
*/
public class BBB {
// 靜態代碼塊
static {
System.out.println("我是父類 B 的靜態成員變數 BBB 的靜態代碼塊");
}
// 普通代碼塊
{
System.out.println("我是父類 B 的靜態成員變數 BBB 的普通代碼塊");
}
// 無參構造方法
public BBB() {
System.out.println("我是父類 B 的靜態成員變數 BBB 的無參構造方法");
}
}
8、CC類
package cn.com.zfc.lesson05.inherit01;
/**
*
* @title CC
* @describe 子類 C 的普通成員變數 CC
* @author 張富昌
* @date 2017年4月3日下午5:59:17
*/
public class CC {
// 靜態代碼塊
static {
System.out.println("我是子類 C 的普通成員變數 CC 的靜態代碼塊");
}
// 普通代碼塊
{
System.out.println("我是子類 C 的普通成員變數 CC 的普通代碼塊");
}
// 無參構造方法
public CC() {
System.out.println("我是子類 C 的普通成員變數 CC 的無參構造方法");
}
}
9、CCC類
package cn.com.zfc.lesson05.inherit01;
/**
*
* @title CCC
* @describe 子類 C 的靜態成員變數 CCC
* @author 張富昌
* @date 2017年4月3日下午5:59:17
*/
public class CCC {
// 靜態代碼塊
static {
System.out.println("我是子類 C 的靜態成員變數 CCC 的靜態代碼塊");
}
// 普通代碼塊
{
System.out.println("我是子類 C 的靜態成員變數 CCC 的普通代碼塊");
}
// 無參構造方法
public CCC() {
System.out.println("我是子類 C 的靜態成員變數 CCC 的無參構造方法");
}
}
10、測試子類C的建立過程:TestC.java
package cn.com.zfc.lesson05.inherit01;
/**
*
* @title TestC
* @describe 測試子類C的建立過程
* @author 張富昌
* @date 2017年4月3日下午6:49:50
*/
public class TestC {
public static void main(String[] args) {
//建立 C 對象
C c = new C();
}
}
三、測試結果
我是超級父類 A 的靜態成員變數 AAA 的靜態代碼塊
我是超級父類 A 的靜態成員變數 AAA 的普通代碼塊
我是超級父類 A 的靜態成員變數 AAA 的無參構造方法
我是超級父類 A 的靜態代碼塊
我是父類 B 的靜態成員變數 BBB 的靜態代碼塊
我是父類 B 的靜態成員變數 BBB 的普通代碼塊
我是父類 B 的靜態成員變數 BBB 的無參構造方法
我是父類 B 的靜態代碼塊
我是子類 C 的靜態成員變數 CCC 的靜態代碼塊
我是子類 C 的靜態成員變數 CCC 的普通代碼塊
我是子類 C 的靜態成員變數 CCC 的無參構造方法
我是子類 C 的靜態代碼塊
我是超級父類 A 的普通成員變數 AA 的靜態代碼塊
我是超級父類 A 的普通成員變數 AA 的普通代碼塊
我是超級父類 A 的普通成員變數 AA 的無參構造方法
我是超級父類 A 的普通代碼塊
我是超級父類 A 的無參構造方法
我是父類 B 的普通成員變數 BB 的靜態代碼塊
我是父類 B 的普通成員變數 BB 的普通代碼塊
我是父類 B 的普通成員變數 BB 的無參構造方法
我是父類 B 的普通代碼塊
我是父類 B 的無參構造方法
我是子類 C 的普通成員變數 CC 的靜態代碼塊
我是子類 C 的普通成員變數 CC 的普通代碼塊
我是子類 C 的普通成員變數 CC 的無參構造方法
我是子類 C 的普通代碼塊
我是子類 C 的無參構造方法
總結:
第一點,所有的類都會優先載入基類
第二點,靜態成員的初始化優先
第三點,成員初始化後,才會執行構造方法
第四點,靜態成員的初始化與靜態塊的執行,發生在類載入的時候。
第四點,類對象的建立以及靜態塊的訪問,都會觸發類的載入。
Java 的類載入順序