刚开始学习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虚拟机动态创建动态加载的。

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

对java数组的一些理解的更多相关文章

  1. Java 数组

    数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如numbers[100 ...

  2. Java数组(初学者必看)

    数组无论在哪种编程语言中都算是最重要的数据结构之一,同时不同语言的实现及处理也不尽相同.但凡写过一些程序的人都知道数组的价值及理解数组的重要性,与链表一道,数组成为了基本的数据结构.尽管Java提供了 ...

  3. JAVA:数组,排序,查找<4>

    一.数组 1.一维数组 (1).数组的定义 数据类型 数组名[]=new 数据类型[大小] public class Demo1 { public static void main(String[] ...

  4. Java数组你知多少?

    下面我带大家一起加深一下对Java数组的认识: 1.理解数组 数组也是一种数据类型,本身就是一种引用类型,我们从它的初始化方法,通过关键字new去完成定义及初始化就可以知道. 数组的长度是不变的,一旦 ...

  5. Java数组的声明和遍历

    Java 数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java 语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如 n ...

  6. Java开发知识之Java数组

    Java开发知识之Java数组 一丶数组简介 首先,不管是Java 还是 C++ 还是其它语言.都有数组. (有可能叫法不同) 数组简而言之就是存储一段连续相同数据类型的数据结构 在Java中数组可以 ...

  7. Java 13 - Java 数组

    Java 数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如num ...

  8. Java - 数组解析

    java提高篇(十八)-----数组之一:认识JAVA数组 一.什么是数组 数组?什么是数组?在我印象中的数组是应该这样的:通过new关键字创建并组装他们,通过使用整形索引值访问它的元素,并且它的尺寸 ...

  9. 对Java通配符的个人理解(以集合为例)

    对Java通配符的个人理解(以集合为例) 前言:最近在学习Java,当学到了泛型的通配符时,不是很理解PECS(Producer Extends Consumer Super)原则,以及<? e ...

随机推荐

  1. c 语言冒泡排序

    重要的不是代码 而是思想思路 #include<stdio.h> void Print(int *num, int n) {     int i;     for(i = 0; i < ...

  2. php之 人员的权限管理(RBAC)

    1.想好权限管理的作用? 2.有什么权限内容? 3.既然有权限管理那么就会有管理员? 4.登录后每个人员的界面会是不一样的? 一.想好这个权限是什么? 就做一个就像是vip的功能,普通用户和vip用户 ...

  3. java中的静态代理和动态代理,入门整理

    静态代理和动态代理主要解决的问题是:在直接访问对象时带来的问题,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后 ...

  4. HDU 4570(区间dp)

    E - Multi-bit Trie Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u ...

  5. BZOJ两水题连发~(BZOJ1854&&BZOJ1191)

    前言:两题都是省选题不过水的惊人,且都可以用二分图最大匹配做哎--- 1854: [Scoi2010]游戏 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: ...

  6. linux 中c/c++实现终端命令行命令

    在终端中可以从用下面命令获得帮助: man system 在c/c++代码中实现和在终端中输入的命令行一样的效果,以命令(audacious -p &)为例,该代码实现用audacious在后 ...

  7. 第七届蓝桥杯javaB组真题解析-生日蜡烛(第二题)

    题目 /* 生日蜡烛 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填写他开始 ...

  8. AKKA学习笔记

    AKKA学习笔记总结 01. AKKA 1. 介绍: Akka基于Actor模型,提供了一个用于构建可扩展的(Scalable).弹性的(Resilient).快速响应的(Responsive)应用程 ...

  9. linux环境下搭建 j2ee环境

    一.JDK安装(安装在/usr/java目录下)1.下载:jdk-7-ea-bin-b26-linux-i586-24_apr_2008.bin地址:http://jx.newhua.com/down ...

  10. linux gdb基本概念

    GDB是一个功能强大的调试器,它是一个自由软件,能够用在许多UNIX平台上.它同时也是Linux系统中的默认调试器.GDB已被移植到许多其他的计算机平台上,并且能够用于调试嵌入式实时系统.一般来说,G ...