java吧 关注:1,302,532贴子:12,854,250

【驳】数组不是个类

只看楼主收藏回复

刚刚看到一篇帖子,楼主经过一系列验证得出了个结论,说数组是个类,并且说在API中看到了解释,不过我查看了API手册,但是我没有发现哪里明确指出了“数组是类”这个说法,
当然,如果这句话也算的话,。对于这个class我觉得应该翻译成类型,而不是java中的“类”这个概念,下面我说说我的观点,为什么说数组不是个类。


IP属地:浙江1楼2014-07-21 14:51回复
    @老衲法号劫色00


    IP属地:江苏2楼2014-07-21 14:54
    收起回复
      2026-05-09 12:01:31
      广告
      不感兴趣
      开通SVIP免广告
      数组没有类描述文件。
      众所周知,java中的外部类都对应一个java文件,包括Object,可以看到这个类的属性,方法等等,但是数组就看不到,包括在API手册也查不到“数组”这个类。
      把数组的类名输出来和其他的普通做对比。
      System.out.println(int[].class);
      System.out.println(String.class);
      结果是这样:
      class [I
      class java.lang.String
      这么个不伦不“类”的东西,没有包名,没有类名。


      IP属地:浙江3楼2014-07-21 14:54
      回复
        Java的数组可以认为是个类。 或者换句话说 它不是象其它某些语言中那样基本数据类型的重复。
        至于说要说它与其它类是有区别的 那肯定是有的 如果要从这点上来说它是不是一个类的话
        那就要先定义一下 “什么是一个类”


        IP属地:湖北4楼2014-07-21 14:57
        收起回复
          再者,如果数组是类的话,那么他应该有一个构造函数。
          可是这样写的话
          int[] i = int[].class.newInstance();
          会抛出
          java.lang.InstantiationException: [I
          at java.lang.Class.newInstance(Class.java:359)
          at test.MathExpression.main(MathExpression.java:134)
          实例化失败,一般来说,这个异常是没有默认的构造函数才会导致的·。
          我假设数组这个“类”有其他的构造函数,那么我把数组这个类的构造函数的数量输出来。
          int[] i = new int[3];
          System.out.println(i.getClass().getDeclaredConstructors().length);
          结果是0,这说明,数组这个“类”没有构造函数。
          没有构造函数的“类”也能叫构造函数?


          IP属地:浙江5楼2014-07-21 14:57
          收起回复
            然后再说length这个属性。
            貌似这个属性大概是最能说明数组是个“类”的证据了。
            那么
            int[] i = new int[3];
            System.out.println(i.getClass().getDeclaredFields().length);
            这样输出来结果至少应该为1吧?
            很可惜,还是0。
            这样一个没有构造函数,明明有成员变量却输不出来的“类”,不配称为”类“


            IP属地:浙江6楼2014-07-21 15:00
            回复
              再来看看数组实例化时的字节码和普通类实例化的字节码有什么区别
              public class Test{
              public static void main(String[] args){
              Integer it = new Integer(3);
              int[] i = new int[3];
              }
              }
              先 javac java.Test
              再 javap -c Test.class

              主意到main函数的0:字节码为new,这是对应Integer it = new Integer(3);
              说明实例化一个类的对象的字节码为“new”
              然而标号为10的地方的字节码是“newarray”
              并不是实例化对象的”new"字节码
              说明虚拟机对数组实例化和普通类实例化的操作是不一样的。
              既然不一样,那么数组又怎么能算个类呢?


              IP属地:浙江7楼2014-07-21 15:04
              回复
                在c++中,数组就是数组,你也别想从数组中能.length;
                我认为java只不过是为了方便数组操作,提供一些类似于对象的操作方法(比如.length),但这样并不能说明数组是“”类“,数组就是数组,不是类,也不是基本数据类型


                IP属地:浙江8楼2014-07-21 15:10
                回复
                  2026-05-09 11:55:31
                  广告
                  不感兴趣
                  开通SVIP免广告
                  争这个有意思吗


                  IP属地:广东来自Android客户端9楼2014-07-21 15:16
                  收起回复
                    Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。
                    引用自Java 6的API文档,数组类的确是类,虽然它十分特殊。Class类是代表类的类,每个数组类都是在运行时动态生成的。Class.forName("int")会失败,因为int不是类,但是Class.forName("[I")是可以取到int[]的Class对象的。
                    再说,如果数组类不是类的话,Object类型的变量还能引用数组类对象么?数组类对象拥有Object的方法,所以数组类是继承自Object的,甚至数组类还实现了Cloneable和Serializable接口。


                    IP属地:广西本楼含有高级字体10楼2014-07-21 15:27
                    收起回复
                      是不是类,请测试 int i[] = new int []{1};然后打印i.getClass()


                      IP属地:上海来自Android客户端11楼2014-07-21 15:31
                      收起回复
                        没有构造方法就不是类。。。这个概念就不对。。拿不到域就不是类,这个更不对。。。楼主在哪里见过对类要求有构造方法和域必须可以反射到了


                        12楼2014-07-21 15:43
                        收起回复
                          至于操作不一样,楼主可以看看对数字1和数字1000操作也不一样。一个用指令,一个用操作数加指令。这只是为了方便和提升运行效率,没有本质不同


                          13楼2014-07-21 15:45
                          回复

                            这一堆东西中,只有基本类型int没有被称为类,其它的甚至注解类型都是类


                            IP属地:广西14楼2014-07-21 15:56
                            收起回复
                              2026-05-09 11:49:31
                              广告
                              不感兴趣
                              开通SVIP免广告

                              可以试试让它去 instanceof Object


                              IP属地:重庆15楼2014-07-21 16:06
                              收起回复