为什么重写方法始终从子类的对象调用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么重写方法始终从子类的对象调用?相关的知识,希望对你有一定的参考价值。

你能否清楚一下为什么覆盖方法总是从子实例调用到它的父类时调用的概念?我写了一段代码来理解这个概念。只是覆盖方法,发生在子类中?

class A {
        int x = 15;
        int marry(int a) {
            System.out.println("pppppp parent marry: " + a);
            return 0;
        }

        void show(int a) {
            System.out.println("pppppp parent show: " + a);
        }
    }

    class B extends A {

        int x = 10;
        void show(int a) {
            System.out.println("pppppp child show: " + a);
        }

        void wedding(int a) {
            System.out.println("pppppp child wedding: " + a);
        }
    }


 private void test() {
        A b = new B(); 
        b.show(10); //pppppp child show: 10
        b.marry(34);//pppppp parent marry: 34
        System.out.println("pppppp b.x: " + b.x);  //pppppp b.x: 15
        //////////////////////////////////////////////////////
        B a = (B)b; 
        a.show(22);  //pppppp child show: 22
        a.wedding(22); //pppppp child wedding: 22
        a.marry(22);//pppppp parent marry: 22
        System.out.println("pppppp a.x: " + a.x); //pppppp a.x: 10
        //////////////////////////////////////////////////////
    }
答案

因为那是多态性的重点。方法由实例的类型调用,而不是由类实例的引用类型调用。另外,请务必阅读java中的dynamic dispatch。此外,您的情况完全符合this article's的内容。

以上是关于为什么重写方法始终从子类的对象调用?的主要内容,如果未能解决你的问题,请参考以下文章

这是指在子类对象上调用非重写方法时的内容?

面向对象随笔(多态)

进阶面向对象

重载和重写的区别

Java 多态

子类可以直接调用父类的函数吗