【问题标题】:Can method overloading be considered a way of describing polymorphism in Java?方法重载可以被认为是Java中描述多态性的一种方式吗?
【发布时间】:2017-08-14 17:11:12
【问题描述】:

所以,我是从 Head First Java 学习的,在那里我读到了 -

重载方法只是一个不同的方法碰巧有相同的方法名,它与继承和多态无关。

但是,我有另一本赫伯特·希尔特 (Herbert Schildt) 的名为 Java - The Complete Reference 的著名书籍,在那本书中,我读到:

方法重载是 Java 支持多态的方式之一。方法重载支持多态,因为它是 Java 实现“一个接口,多个方法”范式的一种方式。

哪一个是正确的?

【问题讨论】:

  • 在一个接口中有多个方法与多态无关。
  • @JBNizet 语句适用于重载,不只是有几个方法
  • 根据官方消息docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html,方法覆盖是多态的一种形式
  • 两者都有自己的观点。第一个是对的,但第二个不是“那个”错。
  • @cricket_007,是的,我同意方法覆盖部分,但我的问题与重载有关,而不是覆盖。

标签: java oop polymorphism overloading


【解决方案1】:

在标题中回答你的问题,不,你不能使用方法重载来描述多态性。

方法重载是当一个类有两个或多个同名方法时,唯一的区别是它的参数。这是与多态性完全不同的概念。

多态性是对象具有多种形式的能力。当父类引用用于引用子类对象时,就会发生这种情况。

例如,如果我的任务是为动物园创建某种类型的应用程序,并且我想使用类来跟踪动物。我会创建一个名为“动物”的课程,并为每种动物创建一个附加课程,“狮子”、“鹰”、“海豚”。在将动物类声明为子类之后,我可以使用多态性的概念来创建“动物”类型的狮子、鹰和海豚。

【讨论】:

  • 我也同意你的回答,但我想知道为什么有这么多人关注 The Complete Reference,尽管它在这个概念上写了一个错误。
  • 多态适用于类和方法。简单地拥有子类不是多态性,而只是 OOP
  • 我想你想的太远了。完整参考并没有说方法重载是描述多态性的方式,它只是简单地说明方法重载支持多态性。我面前没有书中的页面,所以我不能真正给出完整的意见,但它似乎是在谈论重载构造函数方法,然后根据你的情况使用这些方法来使用多态性概念。跨度>
【解决方案2】:

方法重载可以被认为是描述多态性的一种方式吗 在 Java 中?

不,这是两个不同的概念。

我认为您错误地理解了作者的意思。

我用粗体强调了重要的部分:

方法重载是 Java 支持多态的方式之一。 方法重载支持多态性,因为它是一种方法 Java 实现了“一个接口,多个方法”的范式。

简单来说就是重载和多态并不是不兼容的。

例如,您可能有一个定义了重载方法的接口:

public interface Doable{
   void doX(String s);
   void doX(Integer s)
}

假设MyDoable 是它的实现,MyChildDoableMyDoable 的子类。

当你写的时候:

MyDoable myDoable = new MyChildDoable(); 
myDoable.doX("a")

编译器会将调用的方法绑定到void doX(String s);重载),但在运行时,将使用实例的方法(MyChildDoable)(polymorshism )。

【讨论】:

    【解决方案3】:

    多态不是一种类型,有不同类型的多态。请参考这个精彩的链接 - Java Polymorphism 以更好地理解它。

    重载支持多态性,多态行为调用基于传递的类型参数,并且以特殊方式发生。

    【讨论】:

      【解决方案4】:

      所以,就有了编译时多态和运行时多态的概念。多态的思想意味着相同的接口但不同的实现。

      “编译时”多态性的工作方式是通过函数重载,即您具有相同的函数名称但具有不同的 arity。我猜这就是第二本书所说的“通过方法重载支持的多态性”。但是严格来说接口也包含了arity,也就是说方法重载可能不构成多态性。

      运行时多态性是给定对象的实际类型决定了应该使用什么实现。这是接口/基类和派生类出现的地方。这将是多态性的更准确定义——至少从面向对象的角度来看。

      【讨论】:

        【解决方案5】:

        覆盖 - 这是关于多态性的。

        public class Base {
            public void print() {
                System.out.println("base");
            }
        }
        
        public class Extend extends Base {
            @Override
            public void print() {
                System.out.println("Extend");
            }
        }
        

        让我们看看输出

        new Base().print();
        

        将打印“基地”

        new Extend().print();
        

        将打印“扩展”。

        重载 - 这是关于一个类中具有不同参数的方法重载:

        public class ABC {
            // method 1
            void method(int a){
                System.out.println("method 1");
            }
        
            // method 2
            void method(int a, int b){
                System.out.println("method 2");
            }
        }
        

        让我们看看输出

        ABC abc = new ABC();
        abc.method(5);
        

        将调用方法(int)并打印“方法1”

        abc.method(1,2)
        

        将调用方法(int,int)并打印“方法2”

        覆盖 - 这是运行时功能;

        重载——这个编译时特性; 所有重载方法(只有一个名称)必须是相同的返回类型或 void。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-24
          • 1970-01-01
          • 2015-06-28
          • 1970-01-01
          • 2015-01-19
          • 1970-01-01
          • 1970-01-01
          • 2022-12-16
          相关资源
          最近更新 更多