对java数组的一些理解
来源:互联网 发布:sai绘画软件mac 编辑:程序博客网 时间:2024/06/05 18:14
刚开始学习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.ObjectSystem.out.println("superclass:" + superclass);// 获取类所在的包名Package packageName = clz.getPackage();// nullSystem.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();// [ISystem.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.ObjectPackage:nullmodifier: public final abstract class className:[Iinterface java.lang.Cloneableinterface 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 0
- 对java数组的一些理解
- 对java数组的理解
- 对数组首地址的一些理解
- 对一些指针数组的理解
- 对java里equals的一些理解!
- 对Java关键字synchronized的一些理解
- 对java中static的一些理解
- 对java反射机制的一些理解
- 初学java对一些基本概念的理解
- 对Java中的数组的理解
- 对Java中的数组的理解
- 对kmp算法next数组的一些简单理解
- 对指针数组,数组指针,函数指针数组,函数数组指针的一些简单理解
- 对数组的理解
- 对Java同步一些理解
- 对Java同步一些理解
- 对Java同步一些理解
- 对Java同步一些理解
- centos如何修改默认语言
- 没什么,只是希望娶的人是你
- 欢迎使用CSDN-markdown编辑器
- 测试Mybatis懒加载不能直接用toString方法
- phpcmsV9静态页面替换动态步骤
- 对java数组的一些理解
- 数据库索引基础
- iOS--KVO的实现原理与具体应用
- 引用未经授权的图片
- Java之IO流---字节流
- 1025. 反转链表 (25)
- Greenplum优化--SQL调优篇
- Linux 文件系统基本命令简介
- 利用java.net包访问网络,连接网页并返回html页面代码