gpt4 book ai didi

java - 在 Java 中,为什么 ((A)b).disp() 调用派生类方法 disp() 而不是基类方法 disp() ?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:10:27 24 4
gpt4 key购买 nike

我正在学习 Java,是初学者...请帮我找出为什么这不起作用...

在下面的程序中,我的目标是从 main 方法调用基类方法,而不在派生类方法中使用 super 关键字。

如代码所示,main 方法中的 ((A)b).num 工作得很好,输出 100,如预期的那样,但是 ((A)b).disp() 输出 B 方法中的内容,而不是A 的方法。

class A
{
int num=100;

public void disp()
{
System.out.println("Disp() of A:");
System.out.println(num);
}

}

class B extends A
{
int num=200;

public void disp()
{
System.out.println("Disp() of B:");
super.disp(); //100
System.out.println( num ); //200
}

}

class ques
{

public static void main(String a[])
{
B b=new B();

b.disp();

System.out.println();
((A)b).disp(); //doesn't work

System.out.println();
System.out.println(((A)b).num); //works
}

}

输出是:

Disp() of B:
Disp() of A:
100
200

Disp() of B:
Disp() of A:
100
200
100

但我的预期输出是:

Disp() of B:
Disp() of A:
100
200


Disp() of A:
100

100

任何人都可以帮我找到这个输出的原因。

为什么 ((A)b).num 工作正常而 ((A)b).disp() 没有按预期工作......

此外,这不会给出编译错误.... !!提前致谢..:)

最佳答案

必须这样才能保留派生类的语义。

假设 A 有一个整数属性名称​​值,而 A.alter() 是一种更改该值的方法。想象一下,B 扩展了 A 并覆盖了该方法,B 提供了属性 value 始终为正的额外保证。 A.alter() 有时可能会导致值为负数,但 B.alter() 永远不会。

如果 ((A)b).alter() 在类型 B 的对象上调用 A.alter() 方法,结果可能是一个具有负值的 B:B 应该具有的保证将被打破。

关于java - 在 Java 中,为什么 ((A)b).disp() 调用派生类方法 disp() 而不是基类方法 disp() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29600549/

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