【2021-07-05】分析程序的运行结果,并解释为什么?

153 阅读1分钟

请移步至 【DobbyKim 的每日一题】 查看更多的题目~

程序一:

public class Polymorphic {
    public static void main(String[] args) {
        Animal cat = new Cat();
        System.out.println(cat.name);
    }
}
class Animal {
    String name = "animal";
}
class Cat extends Animal{
    String name = "cat";
}

程序二:

public class Polymorphic {
    public static void main(String[] args) {
        Animal cat = new Cat();
        cat.speak();
    }
}
class Animal {
    public void speak(){
        System.out.println("我是一个动物");
    }
}
class Cat extends Animal{
    @Override
    public void speak() {
        System.out.println("我是一只猫");
    }
}

答:

程序一的输出结果为:

animal

程序二的输出结果为:

我是一只猫

本题考查的知识点为多态。需要知道,多态分为编译时的多态性与运行时的多态性。

  • 多态的应用中,对于成员变量访问的特点:编译看左边,运行看左边
  • 多态的应用中,对于成员方法调用的特点:编译看左边,运行看右边

对于程序一,在程序编译时期,首先 JVM 会看向 Animal cat = new Cat(); 这句话等号左边的父类 Animal 是否有该变量(name)的定义,如果有则编译成功,如果没有则编译失败;在程序运行时期,对于成员变量,JVM 仍然会看向左边的所属类型,获取的是父类的成员变量。

对于程序二,在程序编译时期,首先 JVM 会看向 Animal cat = new Cat(); 这句话等号左边的类是否有该方法,如果有则编译成功,如果没有则编译失败;在程序运行时,则是要看等号右边的对象是如何实现该方法的,所以最终呈现的结果为右边对象对这个方法重写后的结果。