基類
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的實例。
總結:
- 調用Dog類的靜態方法會進行Dog類的類加載,如果Dog類有父類,先進行父類的類加載。
- 類加載時會初始化類靜態域,類加載只進行一次。
- 靜態方法不能加載非靜態域。
- 實例化對象,如果類沒有加載過,也會進行類加載。然後開闢內存空間,分配內存對象,
- 類的成員變量會默認初始化,局部變量需要手動初始化。
- 構造器的執行也是,先執行父類的構造器,類似於靜態方法,但只有創建對象,才執行構造方法。
- getClass()實際是調用this.getClass(),this指的是子類