關於靜態域,靜態方法,構造函數的執行順序探討

基類

public class Animal {
	//getClass()得到當前調用對象的類對象,Dog,getSuperClass()返回Animal類對象
    private String Tag = getClass().getSuperclass().getSimpleName();

    public int a;

    private static String staticTag = "Animal_STATIC";
    static {
        System.out.println(staticTag + "的靜態域初始化");
    }

    public Animal() {
        System.out.println(Tag + "的無參構造函數" + a);
    }

}

子類:

public class Dog extends Animal {
	//getClass()得到當前調用對象的類對象,Dog
    private String Tag = getClass().getSimpleName();

    private int a = 2;

    private static String staticTag = "DOG_STATIC";
    static {
        System.out.println(staticTag + "的靜態域初始化");
    }

    public Dog() {
        System.out.println(Tag + "的無參構造函數" + a);
    }

    public static void swimming() {
        System.out.println(staticTag + "調用靜態方法swimming");
    }

}

運行:

public static void main(String[] args) {
        Dog.swimming();
        System.out.println("---實例化對象---");
        new Dog();
    }

輸出:

Animal_STATIC的靜態域初始化
DOG_STATIC的靜態域初始化
DOG_STATIC的靜態方法swimming
---實例化對象---
Animal的無參構造函數0
Dog的無參構造函數2

注意:Dog和Cat繼承自Animal,在Animal中打印TAG = getClass().getSimpleName(),和this。
this指的是調用方,當前對象的引用,是Dog和Cat的實例。

在這裏插入圖片描述

總結:

  1. 調用Dog類的靜態方法會進行Dog類的類加載,如果Dog類有父類,先進行父類的類加載。
  2. 類加載時會初始化類靜態域,類加載只進行一次。
  3. 靜態方法不能加載非靜態域。
  4. 實例化對象,如果類沒有加載過,也會進行類加載。然後開闢內存空間,分配內存對象,
  5. 類的成員變量會默認初始化,局部變量需要手動初始化。
  6. 構造器的執行也是,先執行父類的構造器,類似於靜態方法,但只有創建對象,才執行構造方法。
  7. getClass()實際是調用this.getClass(),this指的是子類
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章