如果我通过在子类中声明具有相同名称的相同字段来隐藏超类的字段,那么超类字段在内部会发生什么。说,我有字段
class Animal{
String name = "Peter";
}
然后声明字段
class Dog extends Animal{
String name = "Sigmund";
}
在子类中。如果我实例化子类,我可以通过类型转换到超类来访问超类字段。我理解隐藏字段与覆盖方法的概念,但是隐藏字段如何在内存中内部表示?我的子类对象是否有两个同名字段,一个带有字符串“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
}
}
当您创建动物
的对象时,内存将被分配来保存动物
类具有的所有字段的值或引用,而不管使用的可见性如何。因此,在这种情况下,内存被分配给String
引用,该引用用字段name
的名称标识。
当您创建Dog
的对象时,将分配内存来保存Dog
类具有的所有字段的值或引用以及Anim
类的所有字段,无论使用的可见性如何。这意味着当您创建Dog
类的对象时,您将有一个字段name
,由动物
类定义,它引用字符串“Peter”,您将有一个不同的字段name
,由Dog
类定义,它引用字符串“Sigmund”。
使用时读/写哪个字段取决于上下文和编译器看到的类型。当你写作的时候
Animal a = ...;
... a.name ...;
编译器将使用Animals
类中的name
字段。当你写
Dog d = ...
... d.name ...;
编译器使用Dog
类中的一个。
回答你的问题:是的,两个字段都存在于内存中。
问题内容: 在以下情况下: 学生“隐藏人的ID字段。 如果我们想在内存中表示以下内容: 约翰对象会为storint Person.ID及其自己拥有两个单独的存储位置吗? 问题答案: 正确。示例中的每个类都有其自己的int IDid字段。 您可以通过以下方式从子类中读取或分配值: 或在外部(当它们是公开的时):
问题内容: 考虑以下代码 如果名称重叠,如何访问外部类的字段? 我尝试了以下方法: 并收到编译错误。 现实生活中会不会发生这种情况? 问题答案: 最好的解决方案是为字段赋予有意义的名称和不同的名称。但这并不总是可能的… 要获取字段或外部实例,您可以使用 或者该字段是静态的 注意:通常是缩写(取决于实际定义的位置) 同样,您需要调用外部类的实例方法。 要么 注意:在Java 8中,您有可能是基于实例
问题内容: 我之前问过这个问题,但没有得到适当的答案。 如果非最终字段的值可以更改,那么如何在非匿名字段类中使用非最终字段? 如果必须在匿名类中使用局部变量,以使编译器可以在匿名类代码中内联其值,如下所示: 之前: 后: 和 那么 ,编译器如何内联非final字段的值? 问题答案: 方法调用的局部变量(内部类必须可以访问)和实例的私有数据成员之间有很大的区别。 内部类可以访问包含的实例,也可以访问
我有这个问题。但我很难解释,因为我不知道确切的术语。希望有人能理解。我会尽力描述。我觉得这与
我在寻找更“改进的方法”来实现这一点,我有一种方法,从一个id中获取所有记录,然后“映射”到一个类中,我有大约200个“标记”要映射,这将是一个非常长的if链。。。例子:
排除不显示字段 Model.findAll({ attributes: { exclude: ['baz'] } });