gpt4 book ai didi

java - 如果子类的字段隐藏了父类(super class)的同名字段,那么这两个字段在内部到底会发生什么?

转载 作者:行者123 更新时间:2023-12-02 05:56:25 26 4
gpt4 key购买 nike

如果我通过在子类中声明具有相同名称的相同字段来隐藏父类(super class)的字段,那么父类(super class)字段内部会发生什么。说,我有领域

class Animal{
String name = "Peter";
}

在父类(super class)中,然后声明字段

class Dog extends Animal{
String name = "Sigmund";
}

在子类中。如果我实例化子类,我可以通过类型转换到父类(super class)来访问父类(super class)字段。我理解隐藏字段与重写方法的概念,但是隐藏字段在内存中内部是如何表示的?我的子类对象是否有两个同名字段,一个包含字符串“Peter”,另一个包含字符串“Sigmund”?

这里是一个简单的代码示例:

class Animal{
String name = "Peter";
}

class Dog extends Animal{
String name = "Sigmund";
}
public class Demo {
public static void main(String[] args) {

Animal a = new Dog();

System.out.println(a.name); // -> Peter
System.out.println(((Dog)a).name); //-> Sigmund
}
}

最佳答案

当您创建 Animal 的对象时,将分配内存来保存 Animal 类具有的所有字段的值或引用,无论使用的可见性如何。因此,在本例中,内存被分配给 String 引用,该引用通过字段 name 的名称进行标识。

当您创建 Dog 的对象时,将分配内存来保存 Dog 类拥有的所有字段的值或引用以及Animal 类,无论使用的可见性如何。这意味着当您创建 Dog 类的对象时,您将拥有一个由 Animal 类定义的字段 name,该字段引用 String “Peter”,您将有一个不同的字段 name,由 Dog 类定义,它引用字符串“Sigmund”。

使用时读取/写入哪个字段取决于上下文以及编译器看到的类型。当你写的时候

Animal a = ...;
... a.name ...;

编译器将使用 Animal 类中的 name 字段。当你写的时候

Dog d = ...
... d.name ...;

编译器使用 Dog 类中的一个。

回答你的问题:是的,这两个字段都存在于内存中。

关于java - 如果子类的字段隐藏了父类(super class)的同名字段,那么这两个字段在内部到底会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56009692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com