2011-09-04 69 views
0
Public class John { 

public void setValue(){ 
    this.value = 0; 
} 
public void setValue(int v){ 
    this.value = v; 
} 

现在我怎么会调用这两个方法?重载多态概念或?

John j = new John(); 
j.setValueO(); 
j.setValue(10); 

纠正我,如果我错了。

  1. 函数重载多态概念吗?如果不是这样,那么OOP分支是否会来这里。
  2. 封装手段隐藏信息和抽象手段隐藏植入细节。所以,当我超载的方法,我是否携带上述这两个任何... {抽象和Encapsulation}
  3. 是重载编译时间或运行时?他们为什么称这是为了超载和重写?
+2

看看这里的答案:HTTP://计算器.com/questions/154577/polymorphism-vs-overriding-vs-overloading –

+0

[Types of Polymorphism](http://stackoverflow.com/a/11732581/697630) –

回答

2

是的,你是对的,希望你所做的错字?

函数是否重载多态的概念?如果不是这样,根据OOP分支 这个来。

从历史的角度来看,它确实来了,但它仍然有很多人认为它不是一种多态的形式。

重载

的方法,功能各不相同基于所述arguements。

重写在其上使用的类instainate后援方法树皮可能听起来为不同类别CAT和Class DOG不同基于

的方法的功能。

封装方法隐藏信息和抽象手段 隐藏植入细节。所以,当我做超载的方法,我是否在上面这两个携带任何东西... {抽象和Encpsulation}

没有。可能有人可以更清楚地回答这个问题。

重载编译时间或运行时间?他们为什么称这个为 超载和覆盖?

编译时间。在重写决定运行时决定哪个类的方法时,因此它是运行时

在重载方法定义时,基于方法调用中传递的参数的可用性在编译时被检查。

1

至于你的问题的第一部分,是你显示的代码是一个重载的例子,好吧,假设第一部分是正确的,第二部分中的0是一个错字。

  1. 我不熟悉这些话题是如何正式教导的,但我脑海中的重载并没有真正与多态有关。这只是一个方便的方法,或多或少做同样的事情(并经常互相呼叫)共享一个名字。我不知道如何回答你的第二个问题。什么是“OOP分支”?

  2. 再一次,我不太确定这些是如何搭配的。难道这不取决于的方法是吗?

  3. 嗯,这样想一想。在Java中,当你调用一般的方法,抛开重载时,系统会在哪个阶段找出你调用的方法(而不是那个类的实现那个方法)?至于这些术语的起源,说实话,这应该很容易查找。

1
  1. 由于函数重载可以很好地工作没有对象,我看不出有任何理由为它是一个面向对象的概念都没有。对于是多态的问题,它确实符合一般要求,并且根据Wikipedia是多态的一种形式。
  2. 一般来说,当您创建一个方法时,您总是会同时执行这两个操作(您抽象出一些常规功能,并隐藏该函数的内部运行信息)。 IMO不会重载超载。 (即使通过超载和获得的多态性,你可能认为在抽象中获得了多态性,因为函数变得更加通用,所以IMO仍然处于相同的抽象层次上。)
  3. 重载解析是 - 首先让我感到惊讶的是 - 编译时间。这与所提到的压倒一切形成鲜明对比。 (因此,它在这个意义上不是同一种多态性的,因为一个是运行时,另一种是编译时间。)
2

Java不会单独通过名称来标识方法,而是通过其签名来标识方法。签名由方法名称和参数类型的有序列表组成。因此,从编译器和jvm的角度来看,这是两种完全不同的方法。他们分享这个名字的事实(以及由此产生的类似签名)对于人类来说没有任何意义。

由于签名用于.class文件,因此编译器负责在编译时使用方法名称和参数计算方法调用的签名。在运行时发生的后期绑定与多态性有关,因为调用某个方法的当前实例可能是覆盖特定方法的子类的实例,在java中,该方法也被重载或不被重载完全由运行时考虑。

在同一个类中不能有两个具有相同签名的方法。值得注意的是,方法的返回类型不是它的签名的一部分,所以你不能有两个方法具有相同和相同的参数,但返回两种不同的类型。

在其他语言的JavaScript为例,自参数总是动态的,签名仅由方法的名称,这使得超载不可能