一维数组的定义:
//动态初始化
int []a;
int b[];
int []c=new int [3];
int d[]=new int [3];
//通过下标赋值
//a,b这种定义方式必须在使用前给a,b声明长度,否则编译会出问题:
//(The local variable a may not have been initialized)。
//静态初始化
int aa[] = {1,2,3};
int []bb = {1,2,3};
System.out.println(Arrays.toString(aa));
通过debug看到int []a 和int b[] 这种方式定义后,并没有在产生其地址空间,也就是没有初始化吧。目前没有学到堆栈,老师简单的说了一下new出来的对象在堆中,而局部变量和对象引用(地址)在栈中。这可能就是堆中没有出现a的地址。为了验证一下,修改代码如下:
//动态初始化
int []a=null;
int b[];
int []c=new int [3];
int d[]=new int [3];
//通过下标赋值
//a,b这种定义方式必须在使用前给a,b声明长度,否则编译会出问题:
//(The local variable a may not have been initialized)。
b=c;
//静态初始化
int aa[] = {1,2,3};
int []bb = {1,2,3};
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(Arrays.toString(aa));
}
输出结果为
null
[I@6d06d69c
[I@6d06d69c
[1, 2, 3]
我认为这个就是堆中的地址,因为用b=c;使得b也指向 了c在堆中的内存地址,所以输出结果一样。一开始不解为什么int []a 可以初始化为null,本想a中是int类型的数据;-----------数组的引用类型,并不是基本类型更不是整型。所以可以定义为null,只不过a[?]数组中的内容是整型罢了。所以数组看做一个对象,是在堆中开辟空间的,所以可以初始化为null;(大概是这样吧?????????????)
==================================================================================================
接下来到了二维数组,定义如下:首先就是和一维数组一样,这样的定义可以说没什么意义。会报错,显示没有初始化。
public static void main(String[] args) {
//语法 跟一维数组一样,这样定义后,想要使用必须定义其长度
//否则就会报错。和一维数组一样。
int [][] a ;
int b[][];
int []c[];
System.out.println(a);
}
然后还是类似一位数组验证,代码如下:(我理解的二维数组就是一个不标准的行列式,第一个[]代表行数,第二个代表列数,你也可以选择定义标准的比如 new int [3][4] ,也可以定义不标准的比如静态初始化 int [][] a = {1,2,3},{2,3},{2,3,4,5,6}})
//语法 跟一维数组一样,这样定义后,想要使用必须定义其长度
//否则就会报错。和一维数组一样。
int [][] a = null ;
int b[][];
int []c[];
//动态初始化 以下的方式相当于全部初始化为0
int [][]aa=new int [3][4];
int bb[][]=new int [3][4];
int []cc[]=new int [3][4];
//通过下标可以去赋值
System.out.println(aa);
System.out.println(bb);
System.out.println(cc);
System.out.println(aa[0]);
System.out.println(Arrays.toString(aa));
System.out.println(Arrays.toString(aa[0]));
System.out.println(a);
}
输出的结果是
[[I@6d06d69c
[[I@7852e922
[[I@4e25154f
[I@70dea4e
[[I@70dea4e, [I@5c647e05, [I@33909752]
[0, 0, 0, 0]
null
前三行输出的是三个二维数组的地址,[[I@70dea4e, [I@5c647e05, [I@33909752]指代的应该就是二维数组aa中的三个一维数组aa[0] aa[1] aa[2];因为看到输出的aa[0]跟aa的第一个一样。想要输出aa[0]的内容时,输出的就是初始化好的[0,0,0,0];
下边写一种应该比较常用的定义方式
//这种动态初始化的方式可以实现二维数组的不规则定义,
//也就是说可以在每一个一维数组定义不同长度
//此时的定义语法相当于定义了aa[0]=null;aa[1]=null;
//aa[2]=null;而这三个一维数组合起来又是一个数组。
int [][]aa=new int [3][];
System.out.println(aa);
System.out.println(Arrays.toString(aa));
System.out.println(aa[0]);
System.out.println(Arrays.toString(aa[0]));
输出的结果如下
[[I@6d06d69c
[null, null, null]
null
null
可以看到验证了我的注释,aa被初始化了,所以有地址,但是其中的一维数组相当于定义成了null。所以输出的内容都是null,其中一位数组的内容也都是null,地址也是null;
通过后期代码初始化使用,
//这种动态初始化的方式可以实现二维数组的不规则定义,
//也就是说可以在每一个一维数组定义不同长度
//此时的定义语法相当于定义了aa[0]=null;aa[1]=null;
//aa[2]=null;而这三个一维数组合起来又是一个数组。
int [][]aa=new int [3][];
//可以通过这种方式将这个二维数组定义成
//000
// 0000
// 00000 这样的二维数组
aa[0] =new int [3];
aa[1]=new int [4];
aa[2]=new int [5];
System.out.println(aa);
System.out.println(Arrays.toString(aa));
System.out.println(aa[0]);
System.out.println(Arrays.toString(aa[0]));
System.out.println(Arrays.toString(aa[1]));
System.out.println(Arrays.toString(aa[2]));
}
输出的结果如下
[[I@6d06d69c
[[I@7852e922, [I@4e25154f, [I@70dea4e]
[I@7852e922
[0, 0, 0]
[0, 0, 0, 0]
[0, 0, 0, 0, 0]
可以看到所有的内容都被初始化过了,就是全都默认值为0了, 然后地址也都开辟出来了。
新手入门,如有指正,万分感谢。