对于数组的一点理解

一:

声明一个数组:int [] arr  = new int[10];

 

二:

利用java的反射来获取一些java类的信息

package com.cn.am;

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 Test1 {
    public static void showModifier(int modifiers){
        //权限
        if(Modifier.isPublic(modifiers)){
            System.out.println("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 clazz=int[].class;
        // 获取父类
        Class<?> superclass = clazz.getSuperclass();// class java.lang.Object
        System.out.println("superclass:" + superclass);
        // 获取类所在的包名
        Package packageName = clazz.getPackage();// null
        System.out.println("Package:" + packageName);
        // 获取类的注解
        Annotation[] declaredAnnotations = clazz.getDeclaredAnnotations();
        if (null != declaredAnnotations && declaredAnnotations.length > 0) {
            for (Annotation ann : declaredAnnotations) {
                System.out.println(ann);
            }
        }
        // 获取类的修饰符
        int modifiers = clazz.getModifiers();
        System.out.print("modifier: ");
        showModifier(modifiers);
        // 获取类的名称
        String name = clazz.getName();// [I
        System.out.println("className:" + name);
        // 获取类的接口
        Class<?>[] interfaces = clazz.getInterfaces();
        if (null != interfaces && interfaces.length > 0) {
            for (Class<?> cl : interfaces) {
                System.out.println(cl);
            }
        }
        // 获取类构造器
        Constructor<?>[] constructors = clazz.getConstructors();// []
        if (null != interfaces && interfaces.length > 0) {
            for (Constructor<?> con : constructors) {
                System.out.println(con);
            }
        }
        // 获取类成员变量
        Field[] declaredFields = clazz.getDeclaredFields();// []
        if (null != declaredFields && declaredFields.length > 0) {
            for (Field field : declaredFields) {
                System.out.println(field);
            }
        }
        // 获取类成员方法
        Method[] declaredMethods = clazz.getDeclaredMethods();// []
        if (null != declaredMethods && declaredMethods.length > 0) {
            for (Method method : declaredMethods) {
                System.out.println(method);
            }
        }
    }
}

console:

superclass:class java.lang.Object
Package:null
modifier: public
 final  abstract  class 
className:[I
interface java.lang.Cloneable
interface java.io.Serializable
View Code

由此可以发现

1.数组没有成员变量、成员方法,只有默认构造函数,此外,它实现了 CloneableSerializable 两个接口,可以说它就是一个的空类。

2.它的类名也比较特殊:

    对基础类型而言为:[+类型名称的首字母大写
    对引用类型而言为:[L+类的全名称+;     eg [Ljava.lang.String;

3.对于1维数组而言有一个"["n维数组而言有n"[",java数组最多有255维度

 

三:数组的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虚拟机动态创建动态加载的。

 

posted @ 2019-08-05 11:17  沦为旧友  阅读(278)  评论(0编辑  收藏  举报