Java数组是什么类型?

我们使用Java编程时时,经常会使用到数组,最常见的莫过于整形数组,对象数组,那数组到底是什么,今天我也是花了功夫查阅资料研究了一下。

1.数组是什么?

现有下面一段代码:

		int[] arr = {1,2,3,4,5};
        System.out.println(arr.getClass());
        System.out.println(arr.getClass().getSuperclass());
        System.out.println(arr instanceof Object);

运行System.out.println(arr.getClass());看看arr数组是什么类型,得到如下结果

class [I

但是这是个什么类型呢?继续向下看
运行System.out.println(arr.getClass().getSuperclass());看看他的父类是什么类型,

class java.lang.Object

显而易见,数组竟是Object的子类,那么数组也是一个对象类型无疑了,
通过System.out.println(arr instanceof Object);验证,得

true

结果不言而喻,可见数组的确实是Object的子类型,class [I 就是int类型的数组了。

2.数组的属性和方法

既然数组的父类是Object,那么数组中含有equels,toString等Object的方法那是毫无疑问了,那数组中还有哪些属性和方法呢,我们由反射来获取一下?看下面代码:

		System.out.println("自身属性: ");
        Field[] declaredFields = arr.getClass().getDeclaredFields();
        for (Field field : declaredFields) {
            System.out.println(field);
        }

        System.out.println("共有属性: ");
        Field[] fields = arr.getClass().getFields();
        for (Field field : fields) {
            System.out.println(field);
        }

        System.out.println("自身方法: ");
        Method[] declaredMethods = arr.getClass().getDeclaredMethods();
        for (Method method : declaredMethods) {
            System.out.println(method);
        }

        System.out.println("共有方法: ");
        Method[] methods = arr.getClass().getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }

自身属性/方法,即该数组对象所拥有的所有属性和方法,包括私有属性方法
共有属性/方法,即该数组及其父类(Object)所拥有的且具有public修饰的属性和方法。
结果如下:

自身属性: 
共有属性: 
自身方法: 
共有方法: 
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()

可见数组对象本身不具有任何属性和方法,上面打印的全部是来自Object的方法,但我们都知道在遍历数组时最常用的就是arr.length属性,那么arr.length从哪来呢?

3.数组的length属性来自何方?

从上面的分析我们看出,数组对象并不具有length属性,显然Object也不具有length属性,现有最最简单的一段代码:

		int[] arr = {1,2,3,4,5};
        System.out.println(arr.length);

毫无疑问,结果为5,我们通过他的字节码文件来查看一下(javac Demo01.java编译成class文件,再通过javap -verbose Demo01.class查看反编译后的class的指令)

其中有关数组获取长度的如下:

		getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
        27: aload_1
        28: arraylength
        29: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
        32: return

经查阅字节码指令表,第28行,arraylength的作用的:获得数组的长度值并压入栈顶。可见调用arr.length,在经过编译后,编译器单独会对arr.length语句执行 28: arraylength 这一指令,即推断length既非属性又非方法,而是会被编译器进行优化的指令。

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值