我对这个问题进行了一些研发,并提出了解决方案来消除你的困惑。希望它能帮助你理解。
查找以下代码:
class A {
public void func(Number obj){
System.out.println("In a func");
}
public void func(Integer obj){
System.out.println("In b func");
}
}
class B extends A {
}
public class X {
public static void main(String s[]){
B b = new B();
b.func(3);
A a = new B();
a.func(3);
}
}
如果您将运行此代码,您将得到输出:
"In b func"
"In b func"。
在这种情况下,这里有 4 种方法:
- A 类同时具有重载方法:func(Number)[say method 1] 和 func(Integer)[say method 2]
- 由于继承,B 类也有 2 个方法。所以它有 func(Number)[say method 3] 和 func(Integer)[say method 4]
现在,当您在 B 的引用上调用 b.func(3) 时,它将看到“方法 3”和“方法 4”,它们具有最适合派生类的参数。这里 Number 和 Integer 类都适合参数3,但是 Integer 是从 Number 派生的,所以 func(Integer)[method 3] 将被调用。因此输出是“In b func”
由于相同的逻辑,第二个输出也是“In b 方法”。首先请记住,您不能在 A 类引用上调用 A 类没有的任何方法。所以你只能在它拥有的类 A 的引用上调用这些方法。无论实例是 A 类还是它的子类的实例。
您需要从两个方面来理解它,编译和链接和执行。
现在 A 类同时具有这两种方法,因此当编译器在 A 类的引用上查看 a.func(3) 时。编译器将查看 A 类的“方法 1”和“方法 2”并绑定具有参数的方法签名最适合派生类。“func(整数)”也是如此。
现在在运行时,func(Integer) 将被执行,它被 B 类调用,因为实例属于 B 类。(在运行时,方法从类执行,其实例正在调用方法)。所以方法4被调用。因此输出。
我敢肯定,你会有困惑,为什么不调用方法 2 而调用方法 4。
如果您将运行以下代码:
class A {
public void func(Number obj){
System.out.println("In a func");
}
public void func(Integer obj){
System.out.println("In b func");
}
}
class B extends A {
public void func(Number obj){
System.out.println("In a func of class B");
}
public void func(Integer obj){
System.out.println("In b func of class B");
}
}
public class X {
public static void main(String s[]){
B b = new B();
b.func(3);
A a = new B();
a.func(3);
}
}
输出将是:
在 B 类的
b 函数中 在 B 类的 b 函数中
现在你可以通过上面的解释来理解这段代码了。我们在类 A 或类 B 的引用上调用了 fun(3)。每次调用类 B 的方法(方法 4)。因为实例是B类的。但是如果A类就没有(方法2)。不会在“a.func(3)”上调用方法 4
让我们看看下面的代码:
class A {
public void func(Number obj){
System.out.println("In a func");
}
}
class B extends A {
public void func(Integer obj){
System.out.println("In b func");
}
}
public class X {
public static void main(String s[]){
B b = new B();
b.func(3);
A a = new B();
a.func(3);
}
}
该程序的输出是:
In b func
In a func
现在您可能会感到困惑,为什么它的输出不同?
请记住,这里不是 4 种方法。这里只有3种方法:
- A 类中的 func(Number)
- B 类中的 func(Number),继承自 A 类
- B 类中的 func(Integer)
现在如果你调用 a.fun(3),A 类没有 func(Integer),你不能调用 A 类没有引用的方法。所以编译器不会绑定 func(Integer) 因为类 A 中没有这样的方法。但是还有另一个方法 func(Number) 可以用相同的代码调用 a.func(3) java 的自动装箱概念。
所以当a.func(3)被调用时,它基本上是调用func(Number)。现在因为实例属于 B 类,所以调用 B 类的方法 func(Number)。因此输出是“In a func”
这是一个很大的答案,但我解释得很深入,所以你可以很容易地理解不同用例中输出的不同可能性。
享受编码!