当前位置: 首页 > 知识库问答 >
问题:

关于Java中对数组的引用[duplicate]

罗鸿畴
2023-03-14

“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等于managers,所以它们指向内存的相同位置,当您编写语句staff[0]=new Employee()时,我认为它等于语句managers[0]=new Employee()对父对象的引用指向子对象是错误的。

我不确定我是否正确,我希望知道对数组的引用(staff/managers)和单个数组元素(staff[0],staff[1]...)的关系,staff能否告诉我数组中第一个元素在内存中的位置。

我还想知道,对于不同的对象数组,如cat[]cats=new cat[2]dog[]dogs=new dog[2],它们在内存中占用的大小是否相同。对不同对象的引用占用相同的内存吗?

共有1个答案

拓拔骁
2023-03-14

我希望知道对数组的引用(staff/managers)和单个数组元素(staff[0]staff[1]...)的关系,staff能否告诉我数组中第一个元素在内存中的位置。

在Java中,单个数组元素是数组对象中的变量,如语言规范第10节所述。在语言层面上,没有内存地址或指针算术。该语言不会告诉您staff[0]staff[1]staff的内存地址之间是否存在任何关系--这取决于实现。

关于实现是如何工作的,Aleksey Shipil的这篇文章(JOL的原作者)是一个很棒的资源:https://shipilev.net/jvm/objects-inside-out/

总之,数组对象内存布局包括一个指向对象类的指针、一个帮助垃圾收集和并发的“标记字”、数组长度(项数),后面是数组元素本身。

由于“对象头”的原因,staff[0]与staff不在同一地址。但JVM知道的数字是不同的,因此它可以生成使用航位推算访问数组元素的高效代码。

至于ArrayStoreException是如何抛出的:当您创建一个对象数组(如New Manager[3])时,JVM会设置类指针,以便它引用“Manager的数组”类(如果不存在,则会动态创建)。当存储对数组的对象引用时,JVM使用这个类指针来检查引用是否与数组组件类型兼容,如果不兼容,则抛出ArrayStoreException

 类似资料:
  • 问题内容: 在阅读有效的Java时,我遇到了“使用枚举而不是常量”的建议。在当前项目中,我正在执行与以下类似的操作: 我将如何使用枚举来实现此目的?由于必须使用该接口,因此必须为索引使用。上面的例子只是一个例子。我实际上正在使用一个for索引值的API 。 问题答案: 将一种有用的模式与一种反模式一起应用通常会失败;-) 在您的情况下,如果要用值替换常量,则将数组用于非真正的类数组数据会带来问题。

  • 想象一下,我们有1000个相同类型的对象分散在内存中(它们是在不同的时间创建的,其他对象是在这两者之间创建的)。 我们有一个数组,其中包含对1000个对象中每个对象的引用。 如果我们依次迭代数组,什么将被预取到CPU的缓存中?只有数组持有的引用,或者这些引用将被取消引用,对象也将被加载到缓存中? Java(JVM)实现了某种软件预取吗?如果没有,是否有提供软件预取的库?

  • 问题内容: 你们每个人都知道 JMM的 这一功能,有时对对象的引用可能 在 此对象的构造函数完成 之前 获得值。 在JLS7中,第4页。17.5 最终的字段语义 我们还可以阅读: 字段的使用模型很简单:在对象的构造函数中设置对象的字段; 并且不要在对象的构造函数完成之前,在另一个线程可以看到它的地方编写对正在构造的对象的引用 。如果执行此操作,则当另一个线程看到该对象时,该线程将始终看到该对象的字

  • 问题内容: 我正在尝试引用函数内部的数组。 像这样:和是的数组。 这不会编译,我只能用于函数参数吗?如果是这样,我该如何在函数内进行引用/指针? 问题答案: 只能用于将变量作为参数传递给函数。因此,最简单的解决方案可能是在函数内部使用一个辅助函数: 您 可以使用以下命令 创建对数组的引用: 但是此解决方案有两个问题: 创建一个非所有者引用,因此编译器可能会决定在仍使用该引用的同时取消分配数组。 数

  • 我是Java编程的新手,我正在使用数组。在数组中,索引必须是整数,它不允许浮点数或双精度型,所以我使用了长数据类型作为索引,它给出了错误。然而,当我使用字节和短整型和Int时,它的工作原理。我想知道,因为错误是“从多头到int的可能有损转换”,是否只允许在索引中使用int,并且由于字节和短小,这就是为什么它起作用(自动升级)并且long大于int,所以它给出了错误(没有自动取消)请帮助

  • 问题内容: 在我的脚本中,有必要创建一个哈希表,我在Google中搜索了此表。为此,大多数人都建议使用JavaScript对象。问题是,哈希表中的某些键具有“”。在他们中。我可以使用关联数组轻松创建这些键。 我不明白为什么关联数组不好。在我查看的站点中提到的第一件事是length属性。我来自使用散列的Perl背景。最常见的用途是从键中获取值,检查键是否存在,删除键值对,添加键值对。如果这些是我的常