java 继承过程中 代码加载的顺序
class GP {
String say = “我是GP”;
static {
System.out.println("这是GP静态代码块");
}
{
System.out.println("这是GP动态代码块");
}
GP() {
System.out.println("这是GP构造方法");
}
public void getSay() {
System.out.println(this.say);
}
}
class P extends GP {
String say = “我是P”;
static {
System.out.println("这是P静态代码块");
}
{
System.out.println("这是P动态代码块");
}
P() {
System.out.println("这是P构造方法");
}
public void getSay() {
System.out.println(this.say);
}
}
class C extends P {
String say = “我是C”;
static {
System.out.println("这是C静态代码块");
}
{
System.out.println("这是C动态代码块");
}
C() {
System.out.println("这是C构造方法");
}
public static void main(String[] args) {
// C c = new C();
// P p = new C();
// System.out.println(c.say);
// System.out.println(p.say);
GP gp = new P();
System.out.println(gp.say); //我是GP
gp.getSay(); //我是P
}
这是GP静态代码块
这是P静态代码块
这是GP动态代码块
这是GP构造方法
这是P动态代码块
这是P构造方法
我是GP
我是P
gp.getSay会使用P中的getSay方法 这是子类对父类的重写 所有调用的是子类的方法
但是gp.say并不是取子类的say ,因为当子类和父类属性名相同时,并不存在所谓覆盖或者重写;
gp的say取到的具体值是什么,跟gp这个对象的引用类型有关,GP gp = new P()
gp的引用类型是GP,print识别的gp实例的类型为GP,所以打印的属性是GP的say