gpt4 book ai didi

java - Java的四级继承

转载 作者:行者123 更新时间:2023-12-01 11:55:39 25 4
gpt4 key购买 nike

我一直在努力理解一些使用继承来计算输出的java代码。代码如下:

class A
{
public int calc(double num) {
System.out.println("calc de A");
return (int)(num+1);

}
}

class B extends A
{
public int calc(long num) {
System.out.println("calc de B");
return (int)(num+2);

}
}

class C extends B
{
public int calc(int num) {
System.out.println("calc de C");
return num+3;

}
}

class D extends C
{
public int calc(float num) {
System.out.println("calc de D");
return (int)(num+4);

}
}

class Main
{
public static void main(String[] args)
{
int num1 = 10;
long num2 = num1;

A a1 = new D();
A a2 = new D();

int result = a1.calc(num1) + a2.calc(num2);

System.out.println("Numero: "+ result);
}
}

我和我的 friend 认为控制台的输出应该是:

calc de C
calc de B
Numero: 25

但是我们在 Eclipse 和 Ideone 中运行它(链接: http://ideone.com/CTdklv )来测试它,给出的答案是

calc de A
calc de A
Numero: 22

有人可以解释一下,如果方法的签名不同,为什么输出是 22。

我们相信,如果您使用 int 作为参数调用 calc 方法,您应该转到 B 类的 calc 方法,而不是 A 类。

感谢您的帮助!谢谢。

最佳答案

在Java中,可以调用哪些重载是由引用变量(15.12.1)的类型决定的:

If the form (of the method invocation expression) is ExpressionName . [TypeArguments] Identifier, then the class or interface to search is the declared type T of the variable denoted by ExpressionName if T is a class or interface type, or the upper bound of T if T is a type variable.

由于 a1a2 被声明为 A,因此您可以为它们分配 D,但您只能调用A中的方法。

如果你稍微改变一下类型,你会发现它是这样工作的:

class A {
void m(int i) {}
}

class B extends A {
void m(double d) {}
}

A a = new B();

double d = 0d;
a.m(d); // won't compile
// will say something like
// 'double can not be converted to int'

因此,如果将 a1a2 更改为 D

D a1 = new D();
D a2 = new D();

输出应该如您所料,因为 BCD 中的重载可供调用。

<小时/>

请注意,它也适用于覆盖。

class A {
protected void m() {}
}

class B extends A {
@Override
public void m() {}
}

// in another package...
B b = new B();
b.m(); // call m because it is public in B
A a = b;
a.m(); // won't compile because it is protected in A

哪些方法可用取决于引用的类型。

关于java - Java的四级继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28462619/

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