Java多态之“编译看左边,运行看右边”

作者: imule 分类: Java知识 发布时间: 2023-02-08 16:07

文章目录[隐藏]

一、问题

        当我们使用经典多态写法 Father f=new Son()时,如果子类和父类存在同名的成员变量和静态变量时,是什么情况呢?

public class Animal {
    static String name = "animal";
    int num = 1;
    public void run() {
        System.out.println("animal run");
    }
    public static void sleep() {
        System.out.println("animal sleep");
    }
}

class Cat extends Animal {
    static String name = "cat";
    int num = 2;
    public void run() {
        System.out.println("cat run");
    }
    public static void sleep() {
        System.out.println("cat sleep");
    }
}

abstract class test {
    public static void main(String args[]) {
        Cat cat = new Cat();
        System.out.println(cat.num);
        System.out.println(cat.name);
        cat.run();
        cat.sleep();

        System.out.println("=================");
        
        Animal animal = new Cat();
        System.out.println(animal.num);
        System.out.println(animal.name);
        animal.run();
        animal.sleep();
    }
}

输出结果:

2
cat
cat run
cat sleep
=================
1
animal
cat run
animal sleep

二、解释

        对于多态中的静态变量、静态方法、成员变量来讲,编译看左,运行也看左。无论右边是当前类还是当前类的子类,编译和运行期间执行的都是当前类中的方法
  对于多态中的非静态方法,编译看左,运行看右。也就是在编译期间看左边的类中有无该方法/属性,而实际在运行时执行的是右边类的方法/属性如果编译期间没有在左边的类找到该非静态域,则会报编译错误。

上述问题的解释:

  • static name: 此为静态变量,运行都看左边,所以cat输出cat,animal输出animal
  • num: 成员变量,运行看左边,所以cat输出2,animal输出1
  • run(): 非静态方法,看右边,cat和animal都使用Cat类的方法,即输出cat run
  • static sleep(): 静态方法,看左边,故cat输出cat sleep,animal输出animal sleep
寄语

    有人在奔跑,有人在睡觉,有人在感恩,有人在抱怨,有目标的睡不着,没目标的睡不醒,努力才是人生应有的态度,睁开眼就是新的开始。

本站文章主要用于个人学习记录,可能对您有所帮助,仅供参考!

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!