对java数组的一些理解

   刚开始学习Java的时候一直搞不清除获取数组的长度是用length()还是length,现在不妨来深入了解一下数组的真实面目。

我们不妨来看一下数组的源码,诶,数组的类名叫什么?我们声明一个int数组的时候用的是: int [] arr  = new int[10];这样的格式,

莫非int数组的类名叫做 int[],学过反射的朋友可能会知道,我们可以通过反射来获取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);
			}
		}
		// 获取类构造器
		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);
			}
		}

	}
}
运行结果如下:
superclass:class java.lang.Object
Package:null
modifier: public  final  abstract  class 
className:[I
interface java.lang.Cloneable
interface java.io.Serializable
我们发现数组没有成员变量、成员方法,只有默认构造函数,此外,它实现了 Cloneable和Serializable 两个接口,可以说它就是一个的空类。
它的类名也比较特殊:
    对基础类型而言为:[+类型名称的首字母大写
    对引用类型而言为:[L+类的全名称+;     eg [Ljava.lang.String;

    对于1维数组而言有一个"[",n维数组而言有n个"[",java数组最多有255维度,您不妨可以试一下

//256 维数组 报错:数组类型维过多
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,但是还有一个问题,数组的length属性是哪里冒出来的?我们不妨简单地看一下:

public class ArrayLengthDemo {
	public static void main(String args[]) {
		int[] arr = new int[1];
		System.out.println(arr.length);
	}
}
反编译一下 javap -c ArrayLengthDemo.class

结果如下


我们可以看到 main方法中序号为8处有一个arraylength指令,由此可见Java专门为数组定义了取得长度的指令,数组的length不是数组的成员变量,数组的实例是java虚拟机动态创建动态加载的。

以上便是对数组的一些探究,圉于博主水平,理解可能有所偏差,还望各位大佬不吝指正!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值