谢谢啊,其实是这样的。int[][] a = new int[4][]; System.out.println(a[1]); //结果是nullchar[][] b = new char[4][]; System.out.println(b[0]); //这个执行时报错所以,定义数组时,整型和字符型 在内存分配上有什么差异,或者我猜错了,造成错误的是其他什么原因?
这个问题不错,期待一下。 确实不是很明白。 byte string int 都可以正常。唯有char不行。 想不明白。
int[][] a = new int[4][];没有确定a的长度,你输出的a[1]是一个数组地址——a[1][0]、a[1][1]、a[1][2]等,但没有赋给数组a一个引用对象,那么a[1]则为null,你可以输出System.out.println(a[1].length);试一试,会报错 如果确定a的长度后int[][] a = new int[4][1];再输出System.out.println(a[1]);因为把数组a初始化了,则a[1]确定了引用的地址,则输出的结果不是null,应该是a[1]的地址了。java语言可以随时声明和定义变量,不像c++一样,要先声明,再定义,java中int[][] a = new int[4][];就是为了你先声明,不确定你要定义多少个值,让用户以后随时根据自己的需求再定义。
char[][] b = new char[4][]; 没有确定b的长度,你输出的b[0]是一个字符数组——b[0][0]、b[0][1]、b[0][2]等,在你输出的时候System.out.println(****)自动将数据转成String类型来输出,将该空字符数组b[0]转成String类型输出,而且还没有引用地址,当然就会错误了。 你可以再试试这个char[] c; System.out.println(c); 同样报错。然后你再这样试一试 b[0]=c;System.out.println(b[0]); 也是报错。 在没有声明c的时候——char[][] b = new char[4][]; 可以假定c存在,b[0]引用的数组就是c[],c[]没有初始化,当然报错了。
你看看数据结构吧
很好的一般书 有java版的
System.out.println(a[1]); //结果是nullchar[][] b = new char[4][];
System.out.println(b[0]); //这个执行时报错所以,定义数组时,整型和字符型 在内存分配上有什么差异,或者我猜错了,造成错误的是其他什么原因?
确实不是很明白。
byte string int 都可以正常。唯有char不行。
想不明白。
int[][] a = new int[4][];没有确定a的长度,你输出的a[1]是一个数组地址——a[1][0]、a[1][1]、a[1][2]等,但没有赋给数组a一个引用对象,那么a[1]则为null,你可以输出System.out.println(a[1].length);试一试,会报错
如果确定a的长度后int[][] a = new int[4][1];再输出System.out.println(a[1]);因为把数组a初始化了,则a[1]确定了引用的地址,则输出的结果不是null,应该是a[1]的地址了。java语言可以随时声明和定义变量,不像c++一样,要先声明,再定义,java中int[][] a = new int[4][];就是为了你先声明,不确定你要定义多少个值,让用户以后随时根据自己的需求再定义。
你可以再试试这个char[] c; System.out.println(c); 同样报错。然后你再这样试一试
b[0]=c;System.out.println(b[0]); 也是报错。
在没有声明c的时候——char[][] b = new char[4][]; 可以假定c存在,b[0]引用的数组就是c[],c[]没有初始化,当然报错了。
1)
int[][] a = new int[4][];
char[][] b=new char[4][];
内存分配的布局是一样的.都是:
a指向一个一维数组,元素是:a[0],a[1],a[2],a[3],它们的值都是null(因为:new 数组时会自动初始化成默认值)
同样:
b指向一个一维数组,元素是:b[0],b[1],b[2],b[3],它们的值都是null(因为:new 数组时会自动初始化成默认值) 差别在于输出打印上.
System.out.println(a[1]); //结果是null
其实调用的是:public void println(Object x)方法(因为:不存在println(int[])方法),而该方法是:当x是null,打印出null而:System.out.println(b[0]); //这个执行时报错
其实调用的是:public void println(char[] x)方法,该方法内部又是调用public void print(char[] x)方法,该方法明确说明:当x是null时,会抛出:NullPointerException 异常.
我还是不是很明白,为什么别的类型byte string int这些都打印null,为有char要throw nullpointexception。
这么设计的初衷是什么?或者说是基于什么考虑的??
栈 | 堆
s1 ----> | "abc"
=======================================
String[] s2=new String[]{new String("ab"),new String("cd"),new String("ef")};
栈 | 堆1 | 堆2
s2 |s2[0]-----> | "ab"
|s2[1]-----> | "cd"
|s2[2]-----> | "ef"注:s1,s2,s2[0],s2[1],s2[2]都是地址。其余情况LZ自推。
int[][] a = new int[4][];
char[][] b=new char[4][];
内存分配的布局是一样的.都是:
a指向一个一维数组,元素是:a[0],a[1],a[2],a[3],它们的值都是null(因为:new 数组时会自动初始化成默认值)
同样:
b指向一个一维数组,元素是:b[0],b[1],b[2],b[3],它们的值都是null(因为:new 数组时会自动初始化成默认值) 差别在于输出打印上.
System.out.println(a[1]); //结果是null
其实调用的是:public void println(Object x)方法(因为:不存在println(int[])方法),而该方法是:当x是null,打印出null 而:System.out.println(b[0]); //这个执行时报错
其实调用的是:public void println(char[] x)方法,该方法内部又是调用public void print(char[] x)方法,该方法明确说明:当x是null时,会抛出:NullPointerException 异常-----又学习到了一些东西 顶了啊
能说明下jvm为什么对char和其他的类型区分开来,sun这样做的初衷是什么?