Java 变量隐藏混淆?
这基本上是我的代码Java 变量隐藏混淆?,java,inheritance,Java,Inheritance,这基本上是我的代码 abstract class B { int x = 3; B() { x+=2; System.out.print("-x" + x + "\n"); // print -x5 x++; // 5 then 6 } abstract int calculate(); abstract int calculate(int i); } class A extends B {
abstract class B
{
int x = 3;
B()
{
x+=2;
System.out.print("-x" + x + "\n"); // print -x5
x++; // 5 then 6
}
abstract int calculate();
abstract int calculate(int i);
}
class A extends B
{
int x = 2;
A()
{
System.out.print("-x" + calculate(2)+"\n");
}
@Override
int calculate()
{
return x;
}
@Override
int calculate(int i)
{
return(calculate()+i);
}
}
public class Test2 extends A
{
Test2()
{
x+=3;
}
@Override
int calculate()
{
return x + 6;
}
public static void main(String[] args) {
Test2 sub = new Test2();
System.out.print("-x" + sub.calculate()+"\n");
}
}
这里的问题是,在深入了解变量隐藏之后,我了解到,如果一个实例变量在父类和子类中具有相同的名称,那么子类将隐藏父类的实例变量。我也知道,当子类继承父类时,变量不能被重写
现在问题来了,在A扩展到B的代码中,为什么构造函数A()中的print语句会给出一个值-x10?它不应该是-x8吗??我不明白这里的变量是如何变化的。我是java新手,因此任何知识都将不胜感激。:)
我已经做了一些调试,发现类A中的calculate(void)方法返回8。但是这怎么可能呢?它不应该返回6吗?请帮忙 它打印-x10的原因是A::calculate(2)调用Test2::calculate(),该函数使用A::x进行计算 调用的顺序如下所示:
Test2() {
A()
B() {
B::x = 3
B::x += 2
System.out.print("-x" + x + "\n"); // print -x5
B::x++ // B::x is now 6
}
A::x = 2
System.out.print("-x" + calculate(2)+"\n")
A::calculate(2) {
return(calculate()+2);
Test2::calculate() {
return A::x + 6; // A::x is 2 here, so returns 8
}
} // returns calculate()+2, so returns 10
}
A::x += 3
}
我希望这只是用来测试的代码,因为您永远不应该允许这种情况在真实的代码中发生。您应该永远不要允许从基类的构造函数调用子类的方法,因为此时子类没有初始化。Java编译器尽最大努力防止这种情况,但有时它不会检测到它。它返回8,因为:
调用的行System.out.print(“-x”+sub.calculate()+”\n”)代码>在A类调用中
@Override
int calculate()
{
return x + 6;
}
在类A中,它仍然在增加类A中的实例变量int x=2
。此变量重写了B类中的变量
因此,2+6=8您试过调试此代码吗?使用Eclipse或其他IDE时,调试相当容易Intellij@Daniele我实际上使用的是netbeans,我不知道如何在netbeans中进行调试在调试时,添加一个断点,然后在调试模式下执行代码。然后,您可以一步一步地执行代码并检查值-也许可以看一看(如何使用Java的NetBeans调试器)您可以解释为什么Test2类的类a调用calculate()的计算(2)会发生吗?因为对象具有类Test2
。因此,它是类Test2的calculate(inti)
调用Test2的calculate()
<代码>计算(inti)
恰好在类A中实现。好的,非常感谢。我从未尝试过这种方法,因为这不是gd编程,但我的老师想让我们展示这段代码的输出。非常感谢您的帮助谢谢:)