gpt4 book ai didi

java - 是方法覆盖还是重载?

转载 作者:行者123 更新时间:2023-11-29 10:09:53 26 4
gpt4 key购买 nike

public class Tester {
public static void main(String[] args) {
A a2 = new B();
a2.dosomething1(new B());
a2.dosomething2(new B());
}
}

class A {
public void dosomething1(A a){
System.out.println("Inside a dosomething1");
}

public void dosomething2(A a){
System.out.println("Inside a dosomething2");
}
}

class B extends A {
public void dosomething1(A a){
System.out.println("Inside b dosomething1");
}

public void dosomething2(B b){
System.out.println("Inside b dosomething2");
}
}

输出

Inside b dosomething1
Inside a dosomething2

输出中的第一行显然是由于方法覆盖。但是二线背后的原因是什么?为什么 java 不调用 B 中定义的方法,因为在运行时它知道 a2 是 B 的对象。

最佳答案

您需要回答的问题是:B.dosomething2(B b) 可以完全替代 A.dosomething2(A a) 吗?或者更具体地说:A.dosomething2(A a) 接受的每个参数值是否也可以传递给 B.dosomething2(B b)

答案很简单:不。

B obj_B= new B();
A obj_A= new A();
obj_B.doSomething2(obj_A);

上面的例子应该说清楚了为什么:obj_A不是B的实例,所以不能作为参数传递给B。 dosomething2(B b)。这意味着这两个方法虽然共享相同的名称但不共享相同的签名,这反过来意味着我们正在重载该方法而不是覆盖它。

您碰巧用适合两者的东西来调用它这一事实是无关紧要的,因为在 Java 中选择调用哪个重载方法是在编译时发生的,基于变量 a2 的类型 (A) 而不是它指向的对象的运行时类 (B)。

这种错误很容易偶然发生,尤其是当你改变你的方法并重命名它们时。为避免在您打算覆盖时意外重载,请确保在您打算覆盖某些内容时始终使用 @Override 注释,这样编译器会报错。

class B extends A {
@Override //this will compile fine
public void dosomething1(A a){
System.out.println("Inside b dosomething1");
}

@Override //this will fail compilation
public void dosomething2(B b){
System.out.println("Inside b dosomething2");
}
}

此注释在技术上是可选的,但它非常有用,以至于在实践中人们将其视为强制性的。

关于java - 是方法覆盖还是重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44472919/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com