我正在设置一个简单的示例来展示继承和多态性。我不确定如何解释我在 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";
让我们将您的示例归结为相关部分:
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”