黑马程序员技术交流社区

标题: 关于数组的问题 [打印本页]

作者: 付玉光    时间: 2013-3-1 00:21
标题: 关于数组的问题
本帖最后由 付玉光 于 2013-3-1 00:26 编辑

我知道数组是一个引用数据类型,也是一个类,但我无意中总感觉它跟其它的

类不一样,特别的另类,比如:枚举也是一个类,它里可定义构造方法,

抽象方法,普通方法,成员变量等。而注解很像接口(其实它就是一个接口),

它里的属性很像方法等,这些我都还能勉强理解,因为它们都有相似

的地方,而对于数组这种类,我是真的感觉到它奇怪的到不能行,
一个字屌!

以下是我认为它屌的原因:

①它作为一个类,在形式上居然没有类成员(应该有一个length属性),
   和类的声明,难道是都封装到JVM中了?

②从它定义数组的格式上就和其它类new对象的格式不一样。

③所有具有相同元素类型和维数的数组都共享它的 Class 对象。

//想到了反射,用反射来了解一下它。
class Demo3{
        public static void main(String args[])throws Exception{

                //运行这行代码后居然产生了InstantiationExceptio,查看该异常发现说
                //当应用程序试图使用 Class 类中的 newInstance 方法创建一个类的实例,
                //而指定的类对象无法被实例化时,抛出该异常。
                //难道它用反射的方式都不能创建吗?   真是不得了呀!!!!!

                //int[] i = (int[])int[].class.newInstance();
                //System.out.println(i);

                //于是我自己定义了一个数组,然后试图通过
                //反射来了解该数组类中的信息。
                int[] i = new int[5];

                //运行测试后发现
                //该数组实现了这两个接口 Cloneable 、 Serializable。
                System.out.println("--------------打印接口方法----------");
                Class[] clas  = i.getClass().getInterfaces();
                for(Class c : clas)
                        System.out.println(c);

                //它没有构造方法
                System.out.println("--------------打印构造方法----------");
                Constructor[] cs  = i.getClass().getConstructors();
                for(Constructor c : cs)
                        System.out.println(c);

                //它中的方法都是Object中的
                System.out.println("--------------打印方法----------");
                Method[] ms  = i.getClass().getMethods();
                for(Method m : ms)
                        System.out.println(m);

                //它没有字段,
                System.out.println("--------------打印字段----------");
                Field[] fs  = i.getClass().getFields();
                for(Field f : fs)
                        System.out.println(f);
        }
}

//居然使用反射不能创建它的对象。

//使用反射返回空字段,也就是说它没有length属性?它有呀。

//它继承自Object,这没错,但它什么时候实现了Cloneable 、 Serializable 口的呀?


//不懂了,请教高人!!!!!:):)



作者: 张豪杰    时间: 2013-3-1 01:12
我承认我来混金币,同等高人解答
作者: 许鑫星    时间: 2013-3-1 15:13
你用int[].class得到的类由于没有构造方法,自然不能直接用newInstance来实例化,对于数组的反射java提供了专门的类,你可以改成
  1.                 //java.lang.reflect.Array 用于数组的反射,参数第一个是数组元素类型,第二个是数组长度
  2.             int[] ints = (int[]) Array.newInstance(int.class, 2);
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2