可以将方法重载视为描述Java中多态的一种方式吗?

时间:2017-08-14 17:11:13

标签: java oop polymorphism overloading

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

  

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

然而,我有一本名为 Java - The Complete Reference 的着名书籍,由Herbert Schildt撰写,在那本书中,我读到:

  

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

哪一个是正确的?

5 个答案:

答案 0 :(得分:4)

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

方法重载是指一个类有两个或多个同名的方法,唯一的区别是它的参数。这是一个完全不同于多元主义的概念。

多态性是一种物体采取多种形式的能力。当父类引用用于引用子类对象时,会发生这种情况。

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

答案 1 :(得分: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)(多态性)。

答案 2 :(得分:1)

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

重载支持多态,多态行为调用基于传递的类型参数,它以临时方式发生。

答案 3 :(得分:0)

因此,存在编译时多态性和运行时多态性的想法。多态的想法意味着相同的接口但不同的实现。

方式"编译时间"多态性工作是通过函数重载,即你有相同的函数名,但具有不同的精度。我猜这是第二本第二本书所指的"通过方法重载支持的多态性"。但是,严格来说接口还包括arrity,这意味着方法重载可能不构成多态。

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

答案 4 :(得分:0)

重写 - 这是关于多态的。

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();

将打印" Base"

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"

覆盖 - 这是运行时功能;

重载 - 这个编译时功能; 所有重载方法(带有一个名称)必须是相同的返回类型或无效。