我是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]它会创建四个对象。
答案 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])
) - 它让我们决定/描述应该返回的数组类型。对于某些原始类型,您可以使用DoubleStream
,IntStream
,LongStream
,它们还会提供range
rangeClosed
等其他生成器。
答案 5 :(得分:0)
是的,在Java中是正确的,有几个步骤来创建一个对象数组:
声明然后实例化(创建内存以存储&#39; 4&#39;对象):
A[ ] arr = new A[4];
初始化对象(在这种情况下,您可以初始化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();
现在您可以从刚制作的对象开始调用现有方法等。
例如:
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;
要了解有关数组的更多信息,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 类对象的引用,每次循环运行时都会创建新对象并赋予该对象引用,以便它现在可以访问该对象中的数据。