基类
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指的是子类