gpt4 book ai didi

java - 关于 Java 中对数组的引用

转载 作者:行者123 更新时间:2023-12-04 09:07:49 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Why are arrays covariant but generics are invariant?

(9 个回答)


去年关闭。




《Core Java Volume I》一书中的例子

public class Employee {
...
}
public class Manager extends Employee {
...
}
Manager[] managers = new Manager[3];
Employee[] staff = managers; //OK
staff[0] = new Employee(); //error
staff[0]会导致 ArrayStoreException,因为数组存储了错误的对象。
我给出数组的内存图:
enter image description here
我认为变量 staff存储员工[0]的地址(如c++,其中在 int *p = new int[3]中,变量 p存储数组第一个元素的地址)。
因为 staff等于 managers ,所以当你写语句 staff[0] = new Employee() 时,它们指向内存的相同位置,我认为它等于声明 managers[0] = new Employee() ,对父对象的引用指向子对象是错误的。
不知道对不对,希望知道对数组(员工/经理)的引用和各个数组元素( staff[0] , staff[1] ...)的关系,是否 staff可以告诉我数组中第一个元素在内存中的位置。
我也想知道,对于不同的对象数组,比如 Cat[] cats = new Cat[2]Dog[] dogs = new Dog[2] ,它们在内存中是否占用相同的大小。对不同对象的引用占用相同的内存量吗?

最佳答案

I hope to know the relationship of the reference to array (staff/managers) and the individual array elements (staff[0], staff[1]...), whether staff can tell me the position in memory of the first element in array.


在 Java 中,单个数组元素是数组对象内的变量,如 section 10 in the language specification 中所述。 .在语言层面,没有内存地址或指针算法。语言不会告诉你 staff[0]的内存地址之间是否有任何关系。和 staff[1]staff - 这取决于实现。
至于实现是如何工作的,这篇来自 Aleksey Shipilёv( JOL 的原作者)的文章是一个很好的资源: https://shipilev.net/jvm/objects-inside-out/
总之,数组对象内存布局包括一个指向对象类的指针、一个有助于垃圾收集和并发的“标记词”、数组的长度(项目数),然后是数组元素本身。
由于“对象标题”, 员工[0] 与员工地址不同 .但区别在于 JVM 已知的数字,因此它可以生成使用航位推算来访问数组元素的高效代码。
至于如何 ArrayStoreException被抛出:当你创建一个对象数组时,比如 new Manager[3] ,JVM 设置类指针,以便它引用“管理器数组”类(如果一个不存在,则动态创建)。当你存储对数组的对象引用时,JVM 使用这个类指针来检查该引用是否与数组组件类型兼容,并抛出 ArrayStoreException如果不是。

关于java - 关于 Java 中对数组的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63414179/

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