了解 Android Studio 中的调试器输出

问题描述 投票:0回答:1

我正在设置一个简单的示例来展示继承和多态性。我不确定如何解释我在 Android Studio 调试器中看到的行为。 我在空视图活动项目中声明了这两个简单的类:

public class FirstClass {
    public String whoAmI = "FirstClass";
    int complexCalculation = 0;

    public FirstClass(){
        System.out.println("FirstClass Constructor");
        complexCalculation = 3^6^8^9^3;
    }
}

public class SecondClass extends FirstClass{
    public String whoAmI = "SecondClass";

    public SecondClass(){
        System.out.println("SecondClass Constructor");
    }

    public void printWhoAmI(){
        System.out.println(whoAmI);
    }

}

在主活动中:

SecondClass test = new SecondClass(); 
FirstClass tester= new FirstClass(); //What will be printed to log?

tester = test; 
tester.whoAmI = "DoingStuff";

在最后一行放置断点并查看变量状态时,我看到: 为什么属性本身不改变? 我在哪里可以进一步了解此处显示的行为?

java android-studio debugging
1个回答
0
投票

让我们将您的示例归结为相关部分:

public class FirstClass {
    public String whoAmI = "FirstClass";
}
public class SecondClass extends FirstClass{
    public String whoAmI = "SecondClass";
}

字段不会被覆盖。这意味着

SecondClass
的实例实际上包含 2 个同名字段。为了区分它们,有一种方法可以解决它们,这就是为什么它们在调试器中显示为
whoAmI
FirstClass.whoAmI

您的测试设置基本上是

FirstClass tester = new SecondClass();
tester.whoAmI = "DoingStuff";

您创建了对

FirstClass
类型的对象的引用,该对象实际上指向
SecondClass
的实例。然而,与方法不同的是,字段不使用动态绑定,这本质上使java变得“哦,这里实际上有一个子类。如果你想调用一个方法,我现在会调用子类的方法。但它是一个字段,所以机制不在图片中。我将访问该引用声明的类型的字段,即 FirstClass”

© www.soinside.com 2019 - 2024. All rights reserved.