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);
如果我错了,请纠正我。
答案 0 :(得分:2)
是的,你是对的,期待你所做的错字?
函数是否重载了多态的概念?如果不是,在 哪个OOP分支来了。
从历史的角度来看,它确实来了,但仍有许多人认为它不是多态的形式。
重载
该方法根据争论的不同而不同。
覆盖
该方法根据使用哪个类来实现它的方式不同。方法树皮对CAT类和类DOG的声音可能不同。
封装意味着隐藏信息和抽象意味着 隐藏植入细节。所以,当我超载一个方法时,做我 在上面这两个方面带有任何东西...... {抽象和诅咒}
不。也许有人可以更清楚地回答这个问题。
是重载编译时还是运行时?为什么他们这样称呼它 超载和覆盖?
编译时间。在重写决定在运行时决定调用哪个类的方法时,它是运行时。
在重载方法定义时,仅在编译时检查基于方法调用中传递的参数的可用性。
答案 1 :(得分:2)
Java不仅仅通过名称来识别方法,而是通过它们的签名来识别方法。签名由方法名称和参数类型的有序列表组成。因此,从编译器和jvm的角度来看,这两种方法完全不同。如果不是人类,那么他们共享名称(以及相似的签名)这一事实毫无意义。
由于签名用于.class文件,因此编译器负责在编译时使用方法名称和参数计算方法调用的签名。在运行时发生的后期绑定与多态有关,因为调用某个方法的当前实例可能是覆盖某个方法的子类的实例,该方法也是否过载,在java中,不是完全由运行时考虑。
在同一个类中,不能有两个具有相同签名的方法。值得注意的是,方法的返回类型不是其签名的一部分,因此您不能使用具有相同和相同参数的两个方法,而是返回两种不同的类型。
在其他语言中,例如javascript,因为参数总是动态的,签名只包含方法的名称,这使得重载不可能
答案 2 :(得分:1)
关于你问题的第一部分,是的,你展示的代码是一个重载的例子,好吧,假设第一部分是正确的,第二部分中的0是拼写错误。
我不熟悉这些日子如何正式教授这些主题,但在我看来,重载与多态无关。这只是一种方便的方法,可以或多或少地做同样的事情(并经常互相呼叫)来共享一个名字。我不知道如何回答你的第二个问题。什么是“OOP分支”?
同样,我不太确定这些是如何结合的。它不依赖于实际所做的方法吗?
嗯,这样想吧。在Java中,当你通常调用一个方法时,将重载放在一边,系统在什么阶段确定你正在调用哪个方法(而不是该方法的哪个类的实现)?至于这些术语的起源,老实说,这应该很容易查找。
答案 3 :(得分:1)