【问题标题】:Is method hiding a form of Polymorphism?方法是否隐藏了一种多态性?
【发布时间】:2015-02-25 04:40:58
【问题描述】:

多态性是具有多种形式的能力。方法覆盖是运行时多态性。

我的问题是:

  1. Java 中有没有类似静态多态的东西?

  2. 可以将方法隐藏视为一种多态形式吗?

在这个question's answer中,据说静态方法不是多态的。这是什么原因?

【问题讨论】:

    标签: java polymorphism overriding


    【解决方案1】:

    如果我们运行这个测试

    class A {
        static void x() {
            System.out.println("A");
        }
    }
    
    class B extends A {
        static void x() {
            System.out.println("B");
        }
    }
    
    class Test {
        public static void main(String[] args) throws Exception {
            A a = new B();
            a.x();
        }
    }
    

    它将打印 A。如果方法 x() 是多态的,它将打印 B。

    【讨论】:

    • 是的,确实很有帮助。我可以知道这种行为的原因是什么吗?
    • 我会这样说:polyphormism 是 OOP 的特性之一,OOP 是关于对象的,静态方法不适用于对象而是直接作用于类,也就是说静态方法不是 OOP
    • @JeeshuMittal 如果方法是虚拟的(所有实例方法都在Java中),它不会在编译时绑定,它会根据实际对象类型查找运行时要运行的方法,不是它声明的类型。
    【解决方案2】:

    运行时的多态性采用“动态调度”的形式。也就是说,被调用的实际方法是根据您调用该方法的实际实例确定的。显然,这只适用于你有一个类的实例,所以严格来说,多态性不适用于隐藏静态方法。进一步解释差异check here

    【讨论】:

      【解决方案3】:
      1. 多态性可以是静态的也可以是动态的。重载是静态多态,重载是动态多态。 简单来说,重载意味着两个方法具有相同的方法名称但采用不同的输入参数。这称为静态,因为要调用哪个方法将在编译时决定 覆盖意味着派生类正在实现其超类的方法。

      【讨论】:

        【解决方案4】:

        多态性

        Static Binding/Early binding/Compile time binding - Method overloading.(in same class)
        Dynamic binding/Runtime binding/Method overriding.(in different classes.)
        

        java中的多态

        它只有Method overloadingMethod overriding两种类型,一旦method overriding变成Method Hiding,它就失去了它的多态特性。

        请参阅stackoverflow中的以下问题。

        1.) Question1

        2.) Question2

        【讨论】:

        • 如果我错了,请纠正我。方法重载不是多态的一种形式,因为我们正在更改方法签名。所以同样的方法没有采取不同的形式。有两种具有相同名称和不同方法签名的不同方法。因此,它不是多态的一种形式......根据 Head First Java
        • @JeeshuMittal 是的——特别是因为要调用的方法是静态确定的。
        • @JeeshuMittal 已添加答案,为您的确切问题添加了链接。
        【解决方案5】:

        我相信方法隐藏在技术上会被认为是多态的。根据定义,隐藏方法具有与其基类中相同的签名或形式。这只是它的“多种形式”之一。将其视为重载......恰好“覆盖”了完全相同的签名。这将是静态多态性。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-18
          • 2011-05-08
          • 1970-01-01
          • 2015-12-28
          • 1970-01-01
          • 1970-01-01
          • 2011-12-10
          相关资源
          最近更新 更多