Java重载和覆盖

我们总是说方法重载是静态多态,而重写是运行时多态。 静态到底是什么意思? 在编译代码时是否解析了对方法的调用? 那么普通方法调用和调用最终方法之间的区别是什么呢? 哪一个在编译时链接?

方法重载意味着根据输入创建函数的多个版本。 例如:

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 

我希望有所帮助

你是对的 – 在编译时实现对重载方法的调用。 这就是为什么它是静态的

根据调用方法的类型,在运行时实现对重写方法的调用。

在虚拟方法维基百科上说:

在Java中,默认情况下所有非静态方法都是“虚函数”。 只有标记有关键字final的方法才是非虚拟的。

final方法不能被覆盖,因此它们是静态实现的。

想象一下这个方法:

 public String analyze(Interface i) { i.analyze(); return i.getAnalysisDetails(); } 

编译器不能为可能传递给它的所有Interface实现重载此方法。

我不认为你可以调用重载任何类型的多态。 重载方法在编译时链接,这种方法排除了将其称为多态。

多态性是指在对派生类对象使用基类引用时,方法与其调用的动态绑定。 覆盖方法是如何实现此多态行为。

1)方法重载用于增加程序的可读性。 方法重写用于提供其超类已经提供的方法的特定实现。

2)方法重载在类内执行。 方法重写发生在具有IS-A(inheritance)关系的两个类中。

3)在方法重载的情况下,参数必须不同。 在方法覆盖的情况下,参数必须相同。

4)方法重载是编译时多态的一个例子。 方法重写是运行时多态的示例。

5)在java中,只能通过改变方法的返回类型来执行方法重载。 返回类型在方法重载方面可以相同或不同。 但您必须更改参数。 方法覆盖中的返回类型必须相同或协变。

我同意rachel,因为在K&B书中直接提到过载不属于第2章(面向对象)中的多态 。 但在很多地方我发现重载意味着静态多态,因为它是编译时间,覆盖意味着动态多态,因为它是运行时。

但有一件有趣的事情是在C ++书(C ++中的面向对象编程–Robert Lafore)中直接提到过载意味着静态多态。 但还有一件事是java和c ++都是两种不同的编程语言,它们有不同的对象操作技术,所以c ++和java中的多态性可能不同吗?

方法重载只是意味着在具有相同名称但不同参数的类中提供两个单独的方法,而方法返回类型可能会或可能不会不同,这允许我们重用相同的方法名称。

但是这两种方法都不同,因此可以在编译时通过编译器来解决,这就是为什么它也被称为编译时多态静态多态

方法重写意味着在子类中定义一个方法,该方法已在父类中定义,具有相同的方法签名,即相同的名称,参数和返回类型。

 Mammal mammal = new Cat(); System.out.println(mammal.speak()); 

在该行中, mammal.speak()编译器表示引用类型Mammalspeak()方法被调用,因此对于编译器,此调用是Mammal.speak()

但是在执行时JVM清楚地知道mammal引用持有Cat对象的引用,因此对于JVM,这个调用是Cat.speak()

因为方法调用在运行时由JVM解析,这就是为什么它也被称为运行时多态动态方法调度

方法重载与方法重写的区别

方法重载与方法重写的区别

有关更多详细信息,您可以阅读关于方法重载和方法覆盖的所有内容 。

简单定义 – 方法重载处理在同一个类中具有相同名称但不同参数的两个或多个方法(函数)的概念。

而Method overriding意味着有两个方法具有相同的参数,但实现方式不同。 其中一个将存在于Parent类(B​​ase Class)中,而另一个将存在于派生类(Child Class)中。@ Override注释是必需的。

检查一下: 点击此处查看详细示例

属性超载覆盖

方法名称————–>必须相同—————-必须相同

Arg类型——————>必须是不同的(至少是arg)

方法签名

退货类型

私人,静态,终

访问修饰符

试着抓

方法解决方案

方法重载处理在同一个类中具有相同名称但不同参数的两个或多个方法的概念。

方法重写意味着具有两个具有相同参数但具有不同实现的方法。 其中一个将存在于父类中,而另一个将存在于派生类或子类中。 @Override注释虽然不是必需的,但可以帮助在编译时强制正确覆盖方法。

首先,我想讨论运行时/动态多态和编译时/静态多态。

编译时/静态多态: – 顾名思义,它在编译时将函数调用绑定到其相应的Function。 这意味着编译器确切地知道哪个函数调用与哪个函数相关联。 函数重载是编译时多态的一个例子。

运行时/动态多态: – 在这种类型的多态性编译器中,在程序运行之前,不知道哪些函数调用关联到哪个函数。 例如。 function重写。

现在,什么是函数重写和函数重载?

函数重载: – function名称相同但function签名/参数不同。

 eg. Area(no. of parameter) { ------------- ---------------- return area;} area of square requires only one parameter area of rectangle requires two parameters(Length and breadth) 

function overriding: – 改变Superclass和Child类中存在的函数的工作。 例如。 超类中的name()打印“hello Rahul”,但在子类中重写后打印出“hello Akshit”