2017-08-14 56 views
0

所以,我是从深入浅出学习Java的在那里我阅读 -可以将方法重载视为一种描述Java中的多态的方式吗?

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

不过,我命名为Java的另一个著名的书 - 由赫伯特·希和这本书完全参考,我读:

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

其中哪一个是正确的?

+3

接口中的几个方法与多态性无关。 –

+0

@JBNizet该语句适用于重载,而不仅仅是有几种方法 –

+0

根据官方消息,https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html,方法**覆盖**是多态的一种形式 –

回答

2

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

没有这些是两个不同的概念。

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

我强调了大胆的重要组成部分:

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

它只是意味着重载和多态不是不兼容的。

例如,你可以具有限定了重载方法的接口:

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

MyDoable假设它的一个实施和MyChildDoable一个的MyDoable子类。

当你写:

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

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

4

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

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

多态性是对象采取多种形式的能力。这发生在使用父类引用来引用子类对象时。

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

+1

我也同意你的回答,但我想知道为什么有这么多人遵循The Complete Reference,尽管它在这个概念上写了一个错误。 – DG4

+0

多态性适用于类和方法。简单地说,子类不是多态,但只是OOP –

+0

我认为你正在想的遥遥领先。完整引用没有说方法重载是描述多态的方式,它只是简单地说明方法重载支持多态。我没有在书面前的页面,所以我不能真正给出一个完整的意见,但它似乎是在谈论重载构造函数方法,然后根据您的情况使用这些方法来使用多态概念。 – Brenton

0

所以,编译时多态性和运行时多态性有这样的想法。多态的想法意味着相同的界面,但不同的实现。

“编译时间”多态性的工作方式是通过函数重载,即具有相同的函数名称但具有不同的真实性。我猜测这是第二本书提到的“通过方法重载支持多态性”。但严格来说,接口也包含了真实性,这意味着方法重载可能不会构成多态。

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

1

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

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

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

将打印 “基地”

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。

相关问题