首页 > 解决方案 > 这是否是动态多态性?

问题描述

程序的输出是A不是它应该是B如果我将Class A中的方法修饰符更改为public则输出为B。有人可以解释这里发生了什么吗?

代码:

public class HelloWorld {
    public static void main(String[] args) {
        HelloWorld hw = new HelloWorld();
        hw.createInstance();
    }

    public void createInstance() {
        A b = new B();
        b.isTrue();
    }
    
    public class A {
        private void isTrue() {
            System.out.println("A");
        }
    }
    public class B extends A {
        public void isTrue() { 
            System.out.println("B");
        }
    }
}

输出:一个

标签: javatype-conversionpolymorphisminner-classesprivate-methods

解决方案


如果isTrue()在 A 中是公开的,那么isTrue()在 B 中将覆盖它。(重写意味着如果调用基类中声明的方法,则执行子类中匹配的方法。)

在这种情况下,由于isTrue()in A 是私有的,因此这两个isTrue()方法是独立的。私有方法不受覆盖。

由于您正在调用isTrue()A 类型的变量,因此isTrue()执行的是 A 中的方法。在这种情况下,私有并不会阻止您访问该方法,因为您的所有代码都在一个类中,HelloWorld. 如果您的类不是内部(或嵌套)类,那么您将无法从声明它的类外部调用私有方法。


推荐阅读