Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数组在Java内部是如何工作的?_Java_Arrays_Object_Runtime_New Operator - Fatal编程技术网

数组在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中,除原语之外实例化的所有对象都是对象

以下是我对在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源代码、字节码还是反射式。