数组在Java内部是如何工作的?
发布此查询基本上是为了理解以下要点:数组在Java内部是如何工作的?,java,arrays,object,runtime,new-operator,Java,Arrays,Object,Runtime,New Operator,发布此查询基本上是为了理解以下要点: 对象是类实例或数组 数组是对象类的子类 在Java中,除原语之外实例化的所有对象都是对象 以下是我对在Java中使用数组的理解 考虑到以下计划 /* dummy.java */ class C { private int i; public C() { i = 1; System.out.println("Am in constructor"); } } public class dummy {
- 对象是类实例或数组
- 数组是
类的子类对象
- 在Java中,除原语之外实例化的所有对象都是对象
/* dummy.java */
class C {
private int i;
public C() {
i = 1;
System.out.println("Am in constructor");
}
}
public class dummy {
public static void main(String[] args) {
C[] c = new C[2]; // Line 11
c[0] = new C();
System.out.println(c);
}
}
运行后,在运行时创建class[LC
类型的对象
C[] c = new C[2]; //Line 11
在上面的代码中。class[LC
是Object
类的直接子类。在上面的代码中运行第12行后,引用变量c
指向该对象(如下红色边界所示)。引用变量位于堆栈中,类型为class c
的对象将进入堆中
对于上述代码中第11行和第12行的以下更改
C[][] c = new C[2][2];
c[0][0] = new C();
将进行如下所示的表示
我的理解正确吗?如果是,请您详细解释一下在运行时如何使用class[LC
实例化对象
注意:C[].class
给出了运行时的实际类型,即class[LC
回答您的问题:是的,在Java(和C#)中)几乎所有的事物都被分成多个由指针访问的离散内存块。这不仅包括你的二维数组,而且包括C++中对象C.内的任何嵌入对象,如果你有数组(一维或不)在10个对象中,每个对象包含10个嵌入式对象,您可以用一块内存分配所有这些对象。在C#和Java中,您将有至少101个内存分配来存储所有这些对象(如果所有嵌入式对象都是简单对象)在一维数组的情况下,以及在多维数组的情况下
然而,这种内存爆炸不应该被视为一件非常糟糕的事情,因为它让你摆脱了用C/C++管理自己内存分配的困难,而且在大多数情况下,任何现代CPU的能力都足以让它以足够的速度前进。几乎正确C的值不是数组的一部分(与红色边界的含义相反)。你希望从中了解什么?你为什么想知道。这可以帮助别人为你提供更好的答案。还有一些细节,数组的内存将容纳数组的大小、类型,并且可能不是连续的。@OliverCharlesworth你说C的实例不是数组的一部分时,我没有理解你的意思。C的实例s在堆中,与引用变量不同,对吗?数组和C实例都是对象,所以它们都在堆中(至少在概念上是这样)。但它们是独立的对象。是否类[LC
实现任何接口?如果是,请让我知道该接口的名称或定义据我所知。您无法创建一个本机模拟数组的对象。当我们说参考变量c
在执行c[]c=new c[2]后指向类[LC
的实例时
。类的构造函数[LC
get called to instantiate?在内部,运行时会将对象c的内存初始化为正确的值。但是,您无法访问此行为:您不能直接调用它或从Java编码中更改它。因此,无论您是否将此初始化称为构造函数或其他什么,这取决于您。对于我记得,C++给了你访问这个进程的一部分,但是java没有。类[Calue> [L/<代码> ]是代码>对象O/COD>的子类,继承了对象< /代码> API中的所有方法。但是,显然,对象< /C> >是一个类而不是接口。但是,类<代码>[LC;
仅存在于概念意义上。它没有代码,没有自己的方法,不能像普通类那样实例化,无论是Java源代码、字节码还是反射式。