1.Parent 父類:
public class Parent {
static {
System.out.println("我是父類靜態代碼塊!");
}
{
System.out.println("我是父類非靜態代碼塊!");
}
static void static_method() {
System.out.println("我是父類靜態方法!");
}
Parent() {
System.out.println("我是父類無參構造方法");
}
Parent(String arg) {
System.out.println("我的父類有參構造方法,參數:" + arg);
}
public void say() {
System.out.println("父類一般方法");
}
}
2.Son子類:
public class Son extends Parent {
static {
System.out.println("我是子類類靜態代碼塊!");
}
{
System.out.println("我是子類非靜態代碼塊!");
}
static void static_method() {
System.out.println("我是子類靜態方法!");
}
Son() {
System.out.println("我是子類無參構造方法");
}
Son(String arg) {
System.out.println("我的子類有參構造方法,參數:" + arg);
}
@Override
public void say() {
System.out.println("子類一般方法");
}
}
3.test:
public class Test { public static void main(String[] args) { Parent parent=new Parent(); //Son son= new Son(); // Parent son2=new Son(); } }
首先
1.創建父類 Parent parent=new Parent()
打印結果:
jdk1.8\jre\lib\rt.jar;F:\Idea代碼存放地址\Parent_test\out\production\Parent_test parent_son.Test
我是父類靜態代碼塊!
我是父類非靜態代碼塊!
我是父類無參構造方法
執行順序爲: 靜態塊->非靜態塊->無參構造
2.創建父類 Parent parent=new Parent("1")
我是父類靜態代碼塊!
我是父類非靜態代碼塊!
我的父類有參構造方法,參數:1
執行順序爲: 靜態塊->非靜態塊->有參構造
3.直接調用父類 靜態方法 static_method();
public class Test {
public static void main(String[] args) {
// Parent parent=new Parent("1"); 不創建實例,直接調用靜態方法
Parent.static_method();
//Son son= new Sonp();
// Parent son2=new Son();
}
}
結果:
我是父類靜態代碼塊!
我是父類靜態方法!
執行順序爲: 靜態塊->靜態塊靜態方法 (只加載類靜態,非靜態的屬於類的實例,因此不創建!)
4.創建子類,Son son= new Son();
public class Test {
public static void main(String[] args) {
// Parent parent=new Parent("1");
// Parent.static_method();
Son son= new Son();
// Parent son2=new Son();
}
}
結果:
我是父類靜態代碼塊!
我是子類類靜態代碼塊!
我是父類非靜態代碼塊!
我是父類無參構造方法
我是子類非靜態代碼塊!
我是子類無參構造方法
執行順序爲:父類靜態塊->子類靜態塊->父類非靜態塊->父類無參構造->子類非靜態構造->子類無參構造
首先依次加載父類和子類靜態塊(屬於類的先加載),再去加載實例化代碼(非靜態和構造)
5.創建子類有參,Son son= new Son("1");
執行結果:
我是父類靜態代碼塊!
我是子類類靜態代碼塊!
我是父類非靜態代碼塊!
我是父類無參構造方法
我是子類非靜態代碼塊!
我的子類有參構造方法,參數:1
執行順序可以看到和無參構造差不多,但是它執行的都是父類無參構造函數
6.直接調用子類靜態方法,Son.static_method();
我是父類靜態代碼塊!
我是子類類靜態代碼塊!
我是子類靜態方法!
執行順序:父類靜態塊->子類靜態塊->子類靜態方法
7.子類向上轉型,Parent son2=new Son();
我是父類靜態代碼塊!
我是子類類靜態代碼塊!
我是父類非靜態代碼塊!
我是父類無參構造方法
我是子類非靜態代碼塊!
我是子類無參構造方法
執行順序:父靜態塊->子靜態塊->父非靜態塊->父無參->子非靜態塊-子無參(或有參)構造
-----------------------------------------------------------------------
總結:
創建對象,一般先加載靜態塊-非靜態塊-構造方法,子類的話是先加載父靜態-子靜態-父非靜態塊-父無參構造-子非靜態塊-子無參或者有參構造;
調用靜態方法,先加載靜態代碼塊 再調用靜態方法
最後,一般方法是最後執行的