THIS 在父类中源码级别只能调用 父类中的 抽象方法或者普通方法, 但是存在 THIS的父类方法调用者为子类时, THIS指向的方法为子类覆盖过的, 注意的是, 属性仍然使用父类的
这样做直观的意义在于, 父类中可以 类似 facade模式, 把 DO_STH() { DO_A DO_B DO_C } 封装, 子类在根绝各自的功能 确认要不要覆盖或者实现 DO_A DO_B DO_C
至于 THIS 执行的属性为什么还用父类的, 不是很理解, 可能是编译的时候好编译点
SUPER 在父类方法中出现时(假设 方法A), 子类在调用 super.A() 时, A 方法里面出现的 super代表 父类的父类, 而不是象上面讲的 THIS, 代表的是 子类自己覆盖的方法;
值得一提的是, THIS 不管在什么情况下, 指向的属性都是 当前类定义的,
public class PaPa {
public String objName = "PAPA";
public void init() {
System.out.println(objName); // PAPA
System.out.println("1.PAPA INIT");
this.daemon();// SON DAEMON [this在运行时方法就跑实际覆盖的]
}
public void daemon() {
System.out.println(objName);
this.daemon();
System.out.println("2.PAPA INIT");
}
}
public class Father extends PaPa {
public String objName = "FATHER";
public void init() {
System.out.println("1.FATHER INIT");
this.daemon();
}
public void daemon() {
System.out.println(objName); // FATHER
System.out.println(super.objName); // PAPA
super.init();// PAPA INIT
System.out.println("2.FATHER INIT");
}
}
public class Son extends Father {
private String objName = "SON";
public void init() {
super.init();
System.out.println("3.SON INIT");
super.daemon();
}
public void daemon() {
System.out.println(objName); // SON
System.out.println(super.objName); // FATHER
super.daemon(); // FATHER DAEMON
System.out.println("4.SON DAEMON");
}
public static void main(String[] args) {
Son son = new Son();
// son.init();
son.daemon();
}
}