In the Java programming language,arrays are objects(§4.3.1) ,are dynamically creaeted,and may be assigned to variables of type Object (§4.3.2). .All method of class Object may be invoked on an array.
即数组是一个对象,它拥有Object类中的方法。
char[] ch=new char[5]; System.out.println(ch.getClass()); System.out.println(ch.getClass().getSuperclass()); /*Output *class [C *class java.lang.Object *说明数组是一个类[C对象,同时基类为Object */
int[] a1;//定义"一个int型数组引用",现在只是为该引用分配了足够的存储空间,但没给数组对象本身分配任何空间。 //System.out.println(a1.toString());//编译错误,原因没有初始化。在JAVA,除了类成员变量会自动初始化(数组类型初始化为0,布尔型为false,引用为null),局部变量不初始化不能直接使用,否则编译器报错。 //int[2] a2;//定义数组的时候不允许指定数组的大小,否则编译错误
int[] a1={1,2,3,4};//初始化方法1 int[] a2=new int[4];//初始化方法2 ,它的元素值为该元素类型的默认值(数字类型为0,布尔类型为false,引用类型为null),只是初始化数组a2是指向一个int引用的数组,并没有把int存放到数组中。 Father[] f=new Father[5];//这是运用了初始化方法2,它的元素值均为null,即都为空引用 //f[0].a=1;//直接使用空引用,运行时产生NullPointerException异常 for(Father x:f)//需要对数组中的引用进行初始化 { x=new Father(); } int[] a3=a1;//初始化方法3 ,复制了一个引用,注意此时a3和a1指向对一个数组对象
int[] a1={1,2,3,4}; System.out.println(a1.length);//输出数组a1的长度4 //a1[4]++;//运行时,java会检查数组下标,一旦越界,就会抛出ArrayIndexOutOfBoundsException异常。
toString()和Arrays.toString() :前者属于Object类的方法
//Object.toString() public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
int[] a1={1,2,3,4}; System.out.println(a1.toString()); System.out.println(Arrays.toString(a1)); /*Output: *[I@7852e922 *[1, 2, 3, 4] */
int[] a1={1,2,3,4}; int[] a3=a1;//这种复制方法,使得a3和a1指向同一个对象 int[] a4=a1.clone();//使用clone方法复制,a4和a1不指向同一个对象 System.out.println(a1==a3);//true System.out.println(a1==a4);//false
深入探讨
对象数组和基本类型数组的唯一区别在于,对象数组存放的是对象的引用,而基本类型数组存放的是基本类型的值。
方法的返回值就两种形式:1.数值(对于基本类型而言);2.引用(对于对象包括数组而言)
对于多维数组中,在new只需指明第一维的维数即可。
不能创建一个泛型数组(即T[] a//error;Peel<Apple>[] a//error),但是能够创建一个Object数组,再转型为T[],即(T[])new Object[4];
数组不支持自动包装机制
System.arraycopy()数组复制,属于浅复制
浅拷贝是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。举例来说更加清楚:对象A1中包含对B1的引用,B1中包含对C1的引用。浅拷贝A1得到A2,A2 中依然包含对B1的引用,B1中依然包含对C1的引用。深拷贝则是对浅拷贝的递归,深拷贝A1得到A2,A2中包含对B2(B1的copy)的引用,B2 中包含对C2(C1的copy)的引用。
CompareTo()返回值(默认情况下)
如果指定的数与参数相等返回0。
如果指定的数小于参数返回 -1。
如果指定的数大于参数返回 1。