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编程,但我的老师想让我们展示这段代码的输出。非常感谢您的帮助谢谢:)