接触新项目,今天看代码的时候,发现一段代码的调用顺序和打印的log有点冲突,且看Demo代码类Animal.class:
public class Animal extends Alive { public String name; public void setName(String str){ name = str; } public String getName() { printName(); return name; } public Animal(String strName){ System.out.println("Animal Custom constructor is called!"); name = strName; } public Animal(){ System.out.println("Animal Default constructor is called! "); } @Override public void printName() { System.out.println("Called in Animail!"); } }
发现当调用getName() 的时候,内部运行调用的不是本类中的printName(), 而是子类中的复写类,这就有点奇怪了,细看代码,发现发起调用的地方是子类。这些瞬间就明白了。补全demo.
Alive.java
public class Alive { public void printName(){ System.out.println("Called by Alive!"); }; }Dog.java
public class Dog extends Animal { public Dog(String str){ name = str; } @Override public void printName() { super.printName(); System.out.println("Called by Dog!"); } }主函数:
public static void main(String[] args){ Dog mDog = new Dog("DearDog"); String tempName = mDog.getName(); System.out.println("tempName ="+tempName); }
输出:
Animal Default constructor is called!
Called in Animail!
Called by Dog!
tempName =DearDog
Process finished with exit code 0
此Demo可以看出:
1. new 子类,父类的默认构造函数也会被调用。
2. new 子类,它包括的父类的所有方法,如果某个函数被多次复写,那么优先级最高的是子类的。
有不足的请大家补充,谢谢。