用Java创建对象数组

时间:2011-03-19 19:13:09

标签: java arrays class

我是Java新手,当时在Java中创建了一个对象数组。

我有一个A类 - 例如

A[] arr = new A[4];

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

A[] arr = new A[4];
for( int i=0; i<4; i++ )
    arr[i] = new A();

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

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

9 个答案:

答案 0 :(得分:235)

这是正确的。

A[] a = new A[4];

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

A a1;
A a2;
A a3;
A a4;

现在你不能在不将a1分配为

的情况下执行a1.someMethod()
a1 = new A();

类似地,您需要使用数组

a[0] = new A();

使用前。

答案 1 :(得分:73)

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

A[] a = new A[] { new A("args"), new A("other args"), .. };

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

someMethod( new A[] { new A("args"), new A("other args"), . . } )

答案 2 :(得分:30)

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

  

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

     

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

     

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

     

在Java中声明数组

     

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

int[] array;
int array[];
     

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[];
     

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

int[5] intArray;       // Don't mention size!
double{} doubleArray;  // Square Brackets please!
     

实例化

     

这就是我们“实例化”或为数组分配内存的方法 -

int[] array = new int[5];
     

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

的“引用”的数组      

初始化

     

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

     

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

int[] arr = {1, 2, 3, 4, 5};
     

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

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

来源 - Arrays in Java

答案 3 :(得分: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);
    }
}

答案 4 :(得分:3)

你是对的。除此之外,如果我们想要创建一些特定大小的数组,其中填充了一些“工厂”提供的元素,那么从Java 8(引入stream API)开始,我们可以使用这个单行:

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

对于某些原始类型,您可以使用DoubleStreamIntStreamLongStream,它们还会提供range rangeClosed等其他生成器。

答案 5 :(得分:0)

是的,在Java中是正确的,有几个步骤来创建一个对象数组:

  1. 声明然后实例化(创建内存以存储&#39; 4&#39;对象):

    A[ ] arr = new A[4];
    
  2. 初始化对象(在这种情况下,您可以初始化A类的4个对象)

    arr[0] = new A();
    arr[1] = new A();
    arr[2] = new A();
    arr[3] = new A();
    

    for( int i=0; i<4; i++ )
      arr[i] = new A();
    
  3. 现在您可以从刚制作的对象开始调用现有方法等。

    例如:

      int x = arr[1].getNumber();
    

      arr[1].setNumber(x);
    

答案 6 :(得分:0)

对于泛型类,有必要创建一个包装类。 例如:

Set<String>[] sets = new HashSet<>[10]

导致:&#34;无法创建通用数组&#34;

改为使用:

        class SetOfS{public Set<String> set = new HashSet<>();}
        SetOfS[] sets = new SetOfS[10];  

答案 7 :(得分:0)

在Java中声明新数组的一般形式如下:

type arrayName[] = new type[numberOfElements];

类型是原始类型或对象。 numberOfElements是要存储到数组中的元素数,并且此值不能更改,因为Java不支持动态数组(如果需要灵活而动态的结构来保存对象,则可以可能要使用一些Java集合。

让我们初始化一个数组来存储一个5人的小公司中所有员工的薪水:

int salaries[] = new int[5];

数组的类型(在这种情况下为int)适用于数组中的所有值。您不能在一个数组中混合类型。

现在我们已经初始化了salaries数组,我们想在其中添加一些值。我们可以在初始化期间执行以下操作:

int salaries[] = {50000, 75340, 110500, 98270, 39400};

或者在以后这样的时候做:

salaries[0] = 50000;
salaries[1] = 75340;
salaries[2] = 110500;
salaries[3] = 98270;
salaries[4] = 39400;

更直观的数组创建示例: enter image description here

要了解有关数组的更多信息,check out the guide

答案 8 :(得分:0)

假设A类是这样的:

class A{
int rollno;
int DOB;
}        

并且你想为类 A 创建一个对象数组。所以你这样做,

    A[] arr = new A[4];    //Statement 1
    for (int i = 0; i < 4; i++) {
    arr[i] = new A();      //Statement 2
    }

这是绝对正确的。

这里 A 是类,在语句 1 中,A 类是数组的数据类型。当由于 new 关键字而执行此语句时,将创建一个对象并为其动态分配内存,这将等于 4 个数据类型 A 块所需的空间,即(对于数组中的一个块,所需空间为 8 个字节(4+4),我假设 int 占用 4 个字节的空间。因此分配的总空间为数组 4*4 个字节)。 然后将对象的引用赋予 arr 变量。这里需要注意的重要一点是,语句 1 与为 A 类创建对象无关,没有为此类创建对象,它仅用作数据类型,它给出了 A 类内存分配所需的大小数组。

然后当 for 循环运行并执行语句 2 时,JVM 现在为 A 类分配内存(即创建一个对象)并将其引用给 arr[i]。每次调用循环时都会创建一个对象,并将其引用提供给 arr[i]。

因此,包含 8 个字节空间的 arr[0] 被赋予 A 类对象的引用,每次循环运行时都会创建新对象并赋予该对象引用,以便它现在可以访问该对象中的数据。