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)
在使用它之前.
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中声明一维数组的方法 -
Run Code Online (Sandbox Code Playgroud)int[] array; int array[];Oracle建议您使用以前的语法来声明数组.以下是法律声明的其他一些例子 -
Run Code Online (Sandbox Code Playgroud)// 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];当JVM遇到
new关键字时,它理解它必须为某些东西分配内存.通过指定int[5],我们意味着我们需要一个int大小为5 的数组.因此,JVM创建内存并将新分配的内存的引用分配给类型为"引用"的数组int[]初始化
使用循环 - 使用for循环初始化数组元素是获取数组的最常用方法.如果您要自己分配默认值,则无需运行for循环,因为JVM会为您执行此操作.
一体..! - 我们可以一次性声明,实例化和初始化我们的数组.这是语法 -
Run Code Online (Sandbox Code Playgroud)int[] arr = {1, 2, 3, 4, 5};在这里,我们没有提到大小,因为JVM可以看到我们给出了5个值.
因此,在我们实例化之前,引用保持为null.我希望我的回答能帮助你......!:)
源 - Java中的数组
以下是创建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)
你是对的。除此之外,如果我们想创建由某个“工厂”提供的元素填充的特定大小的数组,因为 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, IntStream,LongStream它们还提供类似range rangeClosed和其他一些生成器。
| 归档时间: |
|
| 查看次数: |
729656 次 |
| 最近记录: |