剛開始學(xué)習(xí)Java的時候一直搞不清除獲取數(shù)組的長度是用length()還是length泣港,現(xiàn)在不妨來深入了解一下數(shù)組的真實面目违寞。
我們不妨來看一下數(shù)組的源碼抵乓,誒店归,數(shù)組的類名叫什么刃麸?我們聲明一個int數(shù)組的時候用的是: int [] arr = new int[10];這樣的格式醒叁,
莫非int數(shù)組的類名叫做 int[],學(xué)過反射的朋友可能會知道,我們可以通過反射來獲取Java類的一些信息泊业,我們可以來試一下:
package com.liuwen.test;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class Demo {
public static void showModifier(int modifiers) {
if (Modifier.isPublic(modifiers)) {
System.out.print("public ");
} else if (Modifier.isProtected(modifiers)) {
System.out.print("protected ");
} else if (Modifier.isPrivate(modifiers)) {
System.out.print("private ");
} else {
System.out.print("");
}
if (Modifier.isFinal(modifiers)) {
System.out.print(" final ");
}
if (Modifier.isAbstract(modifiers) && !Modifier.isInterface(modifiers)) {
System.out.print(" abstract ");
}
if (Modifier.isInterface(modifiers)) {
System.out.print(" interface ");
} else {
System.out.print(" class ");
}
System.out.println("");
}
public static void main(String[] args) {
Class<int[]> clz = int[].class;
// 獲取父類
Class<?> superclass = clz.getSuperclass();// class java.lang.Object
System.out.println("superclass:" + superclass);
// 獲取類所在的包名
Package packageName = clz.getPackage();// null
System.out.println("Package:" + packageName);
// 獲取類的注解
Annotation[] declaredAnnotations = clz.getDeclaredAnnotations();
if (null != declaredAnnotations && declaredAnnotations.length > 0) {
for (Annotation ann : declaredAnnotations) {
System.out.println(ann);
}
}
// 獲取類的修飾符
int modifiers = clz.getModifiers();
System.out.print("modifier: ");
showModifier(modifiers);
// 獲取類的名稱
String name = clz.getName();// [I
System.out.println("className:" + name);
// 獲取類的接口
Class<?>[] interfaces = clz.getInterfaces();
if (null != interfaces && interfaces.length > 0) {
for (Class<?> cl : interfaces) {
System.out.println(cl);
}
}
// 獲取類構(gòu)造器
Constructor<?>[] constructors = clz.getConstructors();// []
if (null != interfaces && interfaces.length > 0) {
for (Constructor<?> con : constructors) {
System.out.println(con);
}
}
// 獲取類成員變量
Field[] declaredFields = clz.getDeclaredFields();// []
if (null != declaredFields && declaredFields.length > 0) {
for (Field field : declaredFields) {
System.out.println(field);
}
}
// 獲取類成員方法
Method[] declaredMethods = clz.getDeclaredMethods();// []
if (null != declaredMethods && declaredMethods.length > 0) {
for (Method method : declaredMethods) {
System.out.println(method);
}
}
}
}
運行結(jié)果如下:
superclass:class java.lang.Object
Package:null
modifier: public final abstract class
className:[I
interface java.lang.Cloneable
interface java.io.Serializable
我們發(fā)現(xiàn)數(shù)組沒有成員變量把沼、成員方法,只有默認(rèn)構(gòu)造函數(shù)吁伺,此外饮睬,它實現(xiàn)了 Cloneable和Serializable 兩個接口,可以說它就是一個的空類箱蝠。
它的類名也比較特殊:
對基礎(chǔ)類型而言為:[+類型名稱的首字母大寫
對引用類型而言為:[L+類的全名稱+; eg [Ljava.lang.String;
對于1維數(shù)組而言有一個"["续捂,n維數(shù)組而言有n個"[",java數(shù)組最多有255維度垦垂,您不妨可以試一下
//256 維數(shù)組 報錯:數(shù)組類型維過多
int[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] arr = new int[1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1];
OK,但是還有一個問題牙瓢,數(shù)組的length屬性是哪里冒出來的劫拗?我們不妨簡單地看一下:
public class ArrayLengthDemo {
public static void main(String args[]) {
int[] arr = new int[1];
System.out.println(arr.length);
}
}
反編譯一下 javap -c ArrayLengthDemo.class
結(jié)果如下
我們可以看到 main方法中序號為8處有一個arraylength指令,由此可見Java專門為數(shù)組定義了取得長度的指令矾克,數(shù)組的length不是數(shù)組的成員變量页慷,數(shù)組的實例是java虛擬機動態(tài)創(chuàng)建動態(tài)加載的。
以上便是對數(shù)組的一些探究胁附,圉于博主水平酒繁,理解可能有所偏差,還望各位大佬不吝指正控妻!