情景1: Father和Son中 方法showMeTheMoney();相同时:
/**
* @ClassName FieldHasNoPolymorphic
* @Description:
* @Author BruthLi
* @Date 2020/1/31
* @Version V1.0
**/
public class FieldHasNoPolymorphic {
static class Father{
int money = 1;
public Father(){
money = 2;
showMeTheMoney();
};
public void showMeTheMoney(){
System.out.println("I am Father, i have $"+money);
}
}
static class Son extends Father{
int money = 3;
public Son(){
money = 4;
showMeTheMoney();
};
public void showMeTheMoney(){
System.out.println("I am Son, i have $"+money);
}
}
public static void main(String[] args) {
Father gay = new Son();
System.out.println("This gay has $"+gay.money);
}
}
分析:Father gay = new Son(); 走debug一步一步走发现(如下)
随后从Father直接跳入Son中的showMeTheMoney()方法,因为Father和Son中方法showMeTheMoney();相同
输出:
情景2: Father方法showMeTheMoney1(),Son中 方法showMeTheMoney():
/**
* @ClassName FieldHasNoPolymorphic
* @Description:
* @Author BruthLi
* @Date 2020/1/31
* @Version V1.0
**/
public class FieldHasNoPolymorphic {
static class Father{
int money = 1;
public Father(){
money = 2;
showMeTheMoney1();
};
public void showMeTheMoney1(){
System.out.println("I am Father, i have $"+money);
}
}
static class Son extends Father{
int money = 3;
public Son(){
money = 4;
showMeTheMoney();
};
public void showMeTheMoney(){
System.out.println("I am Son, i have $"+money);
}
}
public static void main(String[] args) {
Father gay = new Son();
System.out.println("This gay has $"+gay.money);
}
分析:Father gay = new Son(); 走debug一步一步走发现(如下)
自此Father走完。
下图从Son一步一步走,因为new Son(),所以从Son一步一步走。
输出:
总结:
条件 Son extends Father
(1):Father gay = new Son(); 这行代码先走Father的构造函数在走Son的构造函数。
(2):若Father 构造方法中的方法与Son中一样,则实际只执行Son 构造方法和Son构造方法之后的代码的,而不执行Father中的。
若Father 构造方法中的方法与Son中不一样,则先执行Father 构造方法和Father构造方法之后的代码,后执行Son中的,两个都执行。