用Java创建对象数组

use*_*201 182 java arrays class

我是Java的新手,并且当时在Java中创建了一个对象数组.

我有一个例如A级 -

A[] arr = new A[4];
Run Code Online (Sandbox Code Playgroud)

但这只是为A而不是4个对象创建指针(引用).它是否正确?我看到当我尝试访问创建的对象中的函数/变量时,我得到一个空指针异常.为了能够操纵/访问我必须这样做的对象 -

A[] arr = new A[4];
for( int i=0; i<4; i++ )
    arr[i] = new A();
Run Code Online (Sandbox Code Playgroud)

这是正确的还是我做错了什么?如果这是正确的,那真的很奇怪.

编辑:我发现这很奇怪,因为在C++中你只是说新的A [4]并且它创建了四个对象.

MeB*_*Guy 248

这是对的.

A[] a = new A[4];
Run Code Online (Sandbox Code Playgroud)

创建4个A引用,类似于这样做

A a1;
A a2;
A a3;
A a4;
Run Code Online (Sandbox Code Playgroud)

现在你不能在不分配a1的情况下执行a1.someMethod()

a1 = new A();
Run Code Online (Sandbox Code Playgroud)

同样,您需要使用阵列

a[0] = new A();
Run Code Online (Sandbox Code Playgroud)

在使用它之前.

  • 这个答案给我带来了一大堆困惑,谢谢你的存在. (8认同)
  • 最后一部分'在使用之前'谢谢你. (4认同)
  • @Jasser-您将为元素调用什么构造函数?如果唯一的元素构造函数接受一堆参数怎么办?您将如何创建这些对象? (2认同)

Ste*_* B. 76

这是对的.你也可以这样做:

A[] a = new A[] { new A("args"), new A("other args"), .. };
Run Code Online (Sandbox Code Playgroud)

此语法还可用于在任何位置创建和初始化数组,例如在方法参数中:

someMethod( new A[] { new A("args"), new A("other args"), . . } )
Run Code Online (Sandbox Code Playgroud)


Vam*_*gam 31

是的,它只创建引用,将其设置为默认值null.这就是你得到NullPointerException的原因你需要单独创建对象并分配引用.在Java中创建数组有3个步骤 -

声明 - 在此步骤中,我们指定数据类型和我们要创建的数组的维度.但请记住,我们还没有提到尺寸的大小.他们是空的.

实例化 - 在此步骤中,我们使用new关键字创建数组或为数组分配内存.在这一步中,我们提到了阵列尺寸的大小.

初始化 - 数组始终初始化为数据类型的默认值.但我们可以进行自己的初始化.

在Java中声明数组

这是我们在Java中声明一维数组的方法 -

int[] array;
int array[];
Run Code Online (Sandbox Code Playgroud)

Oracle建议您使用以前的语法来声明数组.以下是法律声明的其他一些例子 -

// One Dimensional Arrays
int[] intArray;             // Good
double[] doubleArray;

// One Dimensional Arrays
byte byteArray[];           // Ugly!
long longArray[];

// Two Dimensional Arrays
int[][] int2DArray;         // Good
double[][] double2DArray;

// Two Dimensional Arrays
byte[] byte2DArray[];       // Ugly
long[] long2DArray[];
Run Code Online (Sandbox Code Playgroud)

这些是非法声明的一些例子 -

int[5] intArray;       // Don't mention size!
double{} doubleArray;  // Square Brackets please!
Run Code Online (Sandbox Code Playgroud)

实例化

这就是我们"实例化"或为数组分配内存的方式 -

int[] array = new int[5];
Run Code Online (Sandbox Code Playgroud)

当JVM遇到new关键字时,它理解它必须为某些东西分配内存.通过指定int[5],我们意味着我们需要一个int大小为5 的数组.因此,JVM创建内存并将新分配的内存的引用分配给类型为"引用"的数组int[]

初始化

使用循环 - 使用for循环初始化数组元素是获取数组的最常用方法.如果您要自己分配默认值,则无需运行for循环,因为JVM会为您执行此操作.

一体..! - 我们可以一次性声明,实例化和初始化我们的数组.这是语法 -

int[] arr = {1, 2, 3, 4, 5};
Run Code Online (Sandbox Code Playgroud)

在这里,我们没有提到大小,因为JVM可以看到我们给出了5个值.

因此,在我们实例化之前,引用保持为null.我希望我的回答能帮助你......!:)

源 - Java中的数组


use*_*551 5

以下是创建10个员工对象数组的明显示例,其中包含一个带参数的构造函数:

public class MainClass
{  
    public static void main(String args[])
    {
        System.out.println("Hello, World!");
        //step1 : first create array of 10 elements that holds object addresses.
        Emp[] employees = new Emp[10];
        //step2 : now create objects in a loop.
        for(int i=0; i<employees.length; i++){
            employees[i] = new Emp(i+1);//this will call constructor.
        }
    }
}

class Emp{
    int eno;
    public Emp(int no){
        eno = no;
        System.out.println("emp constructor called..eno is.."+eno);
    }
}
Run Code Online (Sandbox Code Playgroud)


Psh*_*emo 5

你是对的。除此之外,如果我们想创建由某个“工厂”提供的元素填充的特定大小的数组,因为 Java 8(引入了流 API)我们可以使用这个单行:

A[] a = Stream.generate(() -> new A()).limit(4).toArray(A[]::new);
Run Code Online (Sandbox Code Playgroud)
  • Stream.generate(() -> new A())就像以 lambda 描述的方式创建的单独 A 元素的工厂,() -> new A()这是实现Supplier<A>- 它描述了应该如何创建每个新的 A 实例。
  • limit(4)设置流将生成的元素数量
  • toArray(A[]::new)(也可以重写为toArray(size -> new A[size])) - 它让我们决定/描述应该返回的数组类型。

对于某些原始类型,您可以使用DoubleStream, IntStreamLongStream它们还提供类似range rangeClosed和其他一些生成器。