Java 复写方法的调用顺序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/woxueplc/article/details/80441207
接触新项目,今天看代码的时候,发现一段代码的调用顺序和打印的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 子类,它包括的父类的所有方法,如果某个函数被多次复写,那么优先级最高的是子类的。

有不足的请大家补充,谢谢。

猜你喜欢

转载自blog.csdn.net/woxueplc/article/details/80441207