我们总是说方法重载是静态多态,而重写是运行时多态。静态到底是什么意思?在编译代码时是否解析了对方法的调用?那么正常方法调用和调用最终方法之间的区别是什么?哪一个在编译时链接?
答案 0 :(得分:23)
方法重载意味着根据输入创建函数的多个版本。例如:
public Double doSomething(Double x) { ... }
public Object doSomething(Object y) { ... }
在编译时选择要调用的方法。例如:
Double obj1 = new Double();
doSomething(obj1); // calls the Double version
Object obj2 = new Object();
doSomething(obj2); // calls the Object version
Object obj3 = new Double();
doSomething(obj3); // calls the Object version because the compilers see the
// type as Object
// This makes more sense when you consider something like
public void myMethod(Object o) {
doSomething(o);
}
myMethod(new Double(5));
// inside the call to myMethod, it sees only that it has an Object
// it can't tell that it's a Double at compile time
方法覆盖是指通过原始
的子类定义方法的新版本class Parent {
public void myMethod() { ... }
}
class Child extends Parent {
@Override
public void myMethod() { ... }
}
Parent p = new Parent();
p.myMethod(); // calls Parent's myMethod
Child c = new Child();
c.myMethod(); // calls Child's myMethod
Parent pc = new Child();
pc.myMethod(); // call's Child's myMethod because the type is checked at runtime
// rather than compile time
我希望有帮助
答案 1 :(得分:11)
你是对的 - 在编译时实现对重载方法的调用。这就是为什么它是静态。
根据调用方法的类型,在运行时实现对重写方法的调用。
On virtual methods wikipedia says:
在Java中,默认情况下所有非静态方法都是“虚函数”。只有标记有关键字final的方法才是非虚拟的。
final
方法无法被覆盖,因此它们是静态实现的。
想象一下这个方法:
public String analyze(Interface i) {
i.analyze();
return i.getAnalysisDetails();
}
编译器不能为可能传递给它的Interface
的所有实现重载此方法。
答案 2 :(得分:5)
我认为你不能过度调用任何类型的多态。重载方法在编译时链接,这种方法排除了将其称为多态性。
多态性是指在对派生类对象使用基类引用时,方法与其调用的动态绑定。覆盖方法就是如何实现这种多态行为。
答案 3 :(得分:1)
我同意rachel,因为在K& B书中直接提到第2章(面向对象)中重载不属于多态。但在很多地方我发现重载意味着静态多态,因为它是编译时间,覆盖意味着动态多态,因为它是运行时。
但有一件有趣的事情是在C ++书中(C ++中的面向对象编程--Robert Lafore),也直接提到过载意味着静态多态。 但还有一件事是java和c ++都是两种不同的编程语言,它们有不同的对象操作技术,所以c ++和java中的多态性可能不同吗?
答案 4 :(得分:1)
方法重载只是意味着在类中提供两个具有相同名称但不同参数的单独方法,而方法返回类型可能会有所不同,也可能不同,这使我们可以重用相同的方法名称。
但两种方法都不同,因此可以在编译时由编译器解决,这就是为什么它也被称为编译时多态性或静态多态
方法覆盖意味着在子类中定义一个方法,该方法已在父类中定义,具有相同的方法签名,即相同的名称,参数和返回类型。
Mammal mammal = new Cat();
System.out.println(mammal.speak());
在mammal.speak()
行编译器中,调用了引用类型speak()
的{{1}}方法,因此对于编译器,此调用是Mammal
。
但是在执行时JVM清楚地知道Mammal.speak()
引用持有mammal
对象的引用,因此对于JVM,这个调用是Cat
。
因为JVM在运行时解析了方法调用,这就是为什么它也被称为运行时多态性和动态方法调度。
方法重载和方法覆盖之间的区别
有关详细信息,请参阅Everything About Method Overloading Vs Method Overriding。
答案 5 :(得分:0)
简单定义 - 方法重载处理在同一个类中具有相同名称但不同参数的两个或多个方法(函数)的概念。
虽然方法重写意味着有两个方法具有相同的参数,但实现方式不同。其中一个将存在于Parent类(Base Class)中,而另一个将存在于派生类(Child Class)中。@ Override注释是必需的。
答案 6 :(得分:0)
属性重载覆盖
方法名称-------------->必须相同----------------必须相同
Arg类型------------------>必须不同(至少是arg)
方法签名
返回类型
私人,静态,最终
访问修饰符
的try / catch
方法解决方案
答案 7 :(得分:0)
首先,我要讨论运行时/动态多态性和编译时/静态多态性。
现在,什么是函数重载和函数重载?
函数重载:-相同的函数名称,但不同的函数签名/参数。
<input id="problemText" type="text" class="form-control" name="problem" value="" readonly>
函数覆盖:-更改在超类和子类中都存在的函数的工作。 例如。超类中的name()打印“ hello Rahul”,但是在子类中覆盖后,它打印“ hello Akshit”
答案 8 :(得分:0)
试图涵盖所有差异
Overloading Overriding
Method Name Must be same Must be same
Argument Types Must be same Must be different
Return Type No restriction Must be same till 1.4V
but after 1.4V
co- variants
were introduced
private/static/final Can be overloaded Cannot be overridden
Access Modifiers No restriction Cannot reduce the scope
Throws keyword No restriction If child class method
throws a checked
exception the parent
class method must throw
the same or the
parent exception
Method Resolution Taken care by compiler Taken care by JVM based
based on reference types on run-time object
Known as Compile-Time Polymorphism, RunTime Polymorphism,
Static Polymorphism, or dynamic polymorphism,
early binding late binding.