重载多态的概念还是?

时间:2011-09-04 00:19:48

标签: java

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. 封装意味着隐藏信息和抽象意味着隐藏植入细节。所以,当我超载一个方法时,我是否携带以上这两个方面的任何内容...... {抽象与诅咒}
  3. 是重载编译时还是运行时?他们为什么称它为重载和覆盖?

4 个答案:

答案 0 :(得分:2)

是的,你是对的,期待你所做的错字?

  

函数是否重载了多态的概念?如果不是,在   哪个OOP分支来了。

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

重载

该方法根据争论的不同而不同。

覆盖

该方法根据使用哪个类来实现它的方式不同。方法树皮对CAT类和类DOG的声音可能不同。

  

封装意味着隐藏信息和抽象意味着   隐藏植入细节。所以,当我超载一个方法时,做我   在上面这两个方面带有任何东西...... {抽象和诅咒}

不。也许有人可以更清楚地回答这个问题。

  

是重载编译时还是运行时?为什么他们这样称呼它   超载和覆盖?

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

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

答案 1 :(得分:2)

Java不仅仅通过名称来识别方法,而是通过它们的签名来识别方法。签名由方法名称和参数类型的有序列表组成。因此,从编译器和jvm的角度来看,这两种方法完全不同。如果不是人类,那么他们共享名称(以及相似的签名)这一事实毫无意义。

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

在同一个类中,不能有两个具有相同签名的方法。值得注意的是,方法的返回类型不是其签名的一部分,因此您不能使用具有相同和相同参数的两个方法,而是返回两种不同的类型。

在其他语言中,例如javascript,因为参数总是动态的,签名只包含方法的名称,这使得重载不可能

答案 2 :(得分:1)

关于你问题的第一部分,是的,你展示的代码是一个重载的例子,好吧,假设第一部分是正确的,第二部分中的0是拼写错误。

  1. 我不熟悉这些日子如何正式教授这些主题,但在我看来,重载与多态无关。这只是一种方便的方法,可以或多或少地做同样的事情(并经常互相呼叫)来共享一个名字。我不知道如何回答你的第二个问题。什么是“OOP分支”?

  2. 同样,我不太确定这些是如何结合的。它不依赖于实际所做的方法吗?

  3. 嗯,这样想吧。在Java中,当你通常调用一个方法时,将重载放在一边,系统在什么阶段确定你正在调用哪个方法(而不是该方法的哪个类的实现)?至于这些术语的起源,老实说,这应该很容易查找。

答案 3 :(得分:1)

  1. 由于函数重载在没有对象的情况下可以很好地工作,所以我认为没有任何理由将其作为OOP概念。对于它是否是多态的问题,它确实满足一般要求,并且根据Wikipedia是多态的一种形式。
  2. 通常,在创建方法时,您始终同时执行这两项操作(您抽象出一些常规功能,并隐藏函数内部工作的信息)。重载不会同时增加,IMO。 (即使通过重载和获得的多态性,你可以争论获得抽象,因为函数变得更通用,IMO仍然处于相同的抽象层次。)
  3. 重载决议是 - 首先让我感到惊讶 - 编译时间。这与上面提到的重写相反。 (所以它在那个意义上不是同一种多态,因为一个是运行时而另一个是编译时。)