package test;
import static test.MyPrint.println;
/**
* Created by wangsong on 17-9-9.
*/
public class TestExtends {
public static void main(String[] args) {
Derived d = new Derived();
println(d.str); //输出为declared
}
}
class Base {
Base() {
proceed();
}
void proceed() {
println("父类的proceed");
}
}
class Derived extends Base {
@Override
void proceed() {
println("子类的proceed");
str = "proceed";
}
String str = "declared";
}
在new Derived的实例时,会隐式调用父类Base的构造器,即会执行proceed方法,执行的是子类Derived的proceed方法,因为执行的是哪个类的方法由这个引用具体指向哪个对象决定,所以执行的是子类的proceed方法。在子类Derived的构造器中,先执行str = “porceed”, 再执行str = “declared”,所以输出为declared。
语句String str = “declared”实际上是一个声明和赋值语句,赋值经过编译器优化,最终放到构造器里面执行。