【问题标题】:Is this Dynamic polymorphism or not?这是否是动态多态性?
【发布时间】:2021-08-20 18:10:30
【问题描述】:

程序的输出是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");
        }
    }
}

输出: A

【问题讨论】:

    标签: java type-conversion polymorphism inner-classes private-methods


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您正在创建一个由 A 实例指向的 B 实例。 由于 A isTrue 是私有的,编译器会报错

      如果您将 A.isTrue() 公开,当您创建 B 实例时,它将执行 B isTrue 方法,因为该方法被覆盖

      由于您的类是内部类,当您调用 A 类指向的 isTrue 时,它​​会从 A 执行 isTrue 并且不会应用覆盖,因为这些方法具有不同的可见性。当您从 A 公开 isTrue 时,它​​会应用多态性,因为它们具有相同的修饰符。

      混淆是因为它们是内部类,如果它们不是内部类,您的代码将无法编译

      【讨论】:

      • 由于A isTrue 是私有的,编译器会报错 - 没有编译错误link
      猜你喜欢
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      • 2020-04-30
      • 2023-04-10
      • 1970-01-01
      相关资源
      最近更新 更多