java吧 关注:1,302,546贴子:12,855,149

回复:【驳】数组不是个类

只看楼主收藏回复

好吧我闲到蛋疼去翻了Java Language Specification……
4.3 里提到,引用类型分为类类型、接口类型、泛型参数类型和数组类型
4.3.1 里提到,一个对象是一个类的实例或者是一个数组
10 里提到,数组是对象,是动态分配的并可以赋值给Object类型的变量
10.1 里提到,Object, Cloneable和Serializable是数组类型的超类型
10.7 里提到,数组拥有public final的字段length,并且重写了Object里的clone方法
10.8 里提到,数组类型也抽象为Class对象来表示
结论大致就是数组不是类,至少不是我们传统认识的类。
现在我们可以开一个新贴讨论java.lang.Object是不是类了


IP属地:广西16楼2014-07-21 16:45
收起回复
    public class Main {
    private String[] strs;
    public static void main(String[] args) throws FileNotFoundException, IOException {
    for(Field f : Main.class.getDeclaredFields()){
    System.out.println(f.getType().getSuperclass());
    }
    }
    }


    17楼2014-07-21 16:47
    回复
      2026-05-09 18:20:21
      广告
      不感兴趣
      开通SVIP免广告
      Java 虚拟机中有三种引用类型:类类型(Class Types)、数组类型(Array Types)和
      接口类型(Interface Types)。这些引用类型的值分别由类实例、数组实例和实现了某个接口
      的类实例或数组实例动态创建。
      根据虚拟机规范第7版 2.4节,类、数组、接口是被区分开来的,同属于引用类型。
      但是数组的实例确实是对象。
      在虚拟机规范这本书中,数组类型和类类型是区分开来的。
      由此可见,数组确实不属于严格意义上的类类型。
      但是在3.9节,数组中是这样描述的:
      在 Java 虚拟机中,数组也使用对象来表示。数组由专门的指令集来创建和操作。newarray
      指令用于创建元素类型为数值类型的数组。
      明确指出了数组是使用对象来表示的,这也说了他为什么可以调用方法。
      貌似在虚拟机规范中,除了基本数据类型,其他都被称作类。但是数组和严格意义上的类类型还是不同的,
      总之,数组是类也不是类。·就这样吧


      IP属地:浙江18楼2014-07-21 16:50
      收起回复
        为啥纠结这些问题 类就是个oop思想里的抽象概念罢了 一个语言怎么实现数组 用类封装也好 直接底层实现也罢 都不是我们需要考虑的 另外 数组是数组 类是类 一个算是一种数据结构 一个是oop一些思想的体现 不要以为一个语言的一些暧昧的语言特性就把两者混为一谈了


        IP属地:浙江19楼2014-07-21 17:21
        收起回复
          十五字十五字十五字十五字十五字


          来自Android客户端20楼2014-07-21 18:20
          回复
            一群大神冒出来了,吓死我了,,总的来说,我学到的还蛮多的,首先,数组是数组类型,不是一个类,是一种定义内存分配的一个存放数据的类型,length是数组的一个固有成员,还有一个疑问是,数组对象怎么instanceof object的值是true,既然是三个类型,接口instanceof object是false


            IP属地:上海来自Android客户端21楼2014-07-21 18:44
            收起回复
              看了java jvm设计原理,你就知道为什么数组是一个类了


              22楼2014-07-21 19:06
              回复
                楼主的手册是下载回来的还是网页直接看的


                来自Android客户端23楼2014-07-21 20:13
                收起回复
                  2026-05-09 18:14:21
                  广告
                  不感兴趣
                  开通SVIP免广告


                  IP属地:北京来自WindowsPhone客户端25楼2014-07-21 21:14
                  回复
                    int, double都是类型,有相应的class,系统也提供了对应的装箱类,但要注意的是它的底层实现操作都是native的,跟面向对象无关,是基于c或者汇编实现的,反射也是这样。所以可以取到class的是任何类型而不是类。而Class类的本身操作也都是native的,所以从这个意义上来说Object类本身也不是一个纯面向对象的类。
                    或者楼主跟Java的客服打个电话问问呗


                    IP属地:上海27楼2014-07-21 21:40
                    收起回复
                      你认为他是他就是,认为他不是就不是。就如数据库中的一个表,你认为他是个类它就成了一个,认为他就是有行有列的表,那它就是一张表。
                      对于机器而言,根本就不知道什么类什么对象,甚至不知道0101(二进制数字也是一种抽象,数字本身就是一种抽象),机器只知道高电平低电平什么的--甚至高低电平这些概念,
                      也是人类自己为了自己理解方便而抽象出来的。反正概念的东西都是人类自己弄出来的,而这些人觉得方便,而对于一些人而言就是种困扰--比如LZ
                      ——我喂自己袋盐
                      >>Opera/9.80 (Windows NT 6.1; WOW64; Edition IBIS) Presto/2.12.388 Version/12.17


                      28楼2014-07-21 22:16
                      收起回复

                        不应该是个结构么


                        IP属地:北京29楼2014-07-21 23:33
                        回复
                          废话让你说完了 java基础你是怎么学的?
                          java 数据类型分类有两种
                          1、简单数据类型,也叫基本数据类型
                          2、引用数据类型 也分两个 叫做数组和类
                          再者 从命名规则就能看出 类是大写 数组 根本就没有特定的。
                          而且内存的存储也不一样 数据本就不是类
                          纠结个屁啊 只不过是一些特性比较像类而已


                          IP属地:辽宁30楼2014-07-22 00:00
                          收起回复