我正在设置一个简单的例子来展示继承和多态性.我不知道如何解释我在Android Studio调试器中看到的行为. 我在一个Empty View Activity项目中声明了这两个简单的类:

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);
    }

}

在MainActivity中:

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

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

When placing a breakpoint on the last line 和 looking at the variables state, I see: enter image description here Why doesn't the attribute itself change? Where can I further read about the behavior displayed here?

推荐答案

让我们把你的例子归结为相关部分:

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

字段不会被覆盖.这意味着SecondClass的实例实际上包含两个同名字段.为了区分它们,有一种方法来解决它们,这就是为什么它们在调试器中显示为whoAmIFirstClass.whoAmI.

你的测试设置基本上是

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

您创建了一个类型为FirstClass的变量,它实际上是对SecondClass实例的引用.然而,与方法不同的是,字段不使用动态绑定(因为没有重写),这本质上使javago "哦,这里实际上有一个子类.如果你想调用一个方法,我现在调用子类的方法.但这是一个领域,所以那个机修工是不可能的.我将访问这个引用声明为的类型的字段,即FirstClass "

如果你想专门修改子类的字段,你需要一个强制转换:

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

或者是一个类似public void setWhoAmI(String newWhoAmI)的setter,它由超类定义,子类覆盖.

Java相关问答推荐

Spring安全实现多个SQL表身份验证

如何在Docker容器中使用wireock—Webhooks阻止请求?

RxJava PublishSubject缓冲区元素超时

参数值[...]与预期类型java.util.Date不匹配

JDK22执行repackage of goal org. springframework. boot:spring—boot—maven—plugin:3.2.3:repackage failed:unsupported class file major version 66—>

Junit with Mockito for java

使用动态ID从json获取详细信息的Jolt规范

使用@MappdSuperClass扩展ParentClass&Won t继承ParentClass属性

Java记录的不同序列化/反序列化

安装Java Jar应用程序的Install4j遇到ClassNotFoundException的运行时错误

类型集合的Jackson JsonNode:类型引用的对象读取器应该是Singleton吗?

每次FXMLLoader调用ApplationConext.getBean(类)时创建@Component的新实例

Java17支持哪个MapR版本?

在Ubuntu 23.10上使用mp3创建JavaFX MediaPlayer时出错

错误:未找到扩展元素在JBossEAP 7.2中安装FUSE时出错

EXCEL中的公式单元格显示#NAME?

java21预览未命名的符号用于try-with-resources

try 添加;按流派搜索;在Web应用程序上,但没有;I don’我不知道;It’这个代码错了

Java 21保护模式的穷尽性

有没有办法仅将 JComboBox 中的选定项目居中(因此保持组合框中的所有项目左对齐)