搜索
当前位置: sk彩票 > 对象式语言 >

“加哇”到底是不是一种纯面向对象语言?

gecimao 发表于 2019-04-13 16:11 | 查看: | 回复:

  在我刚开始学习“加哇”的前面几年,我从书本里知道了 “加哇” 是遵循 “编程范式(Object Oriented Programming paradigm)”的。在“加哇”世界内一切都是对象,甚至包括字符串(String)这些都是对象(在

  但是在后来,我在互联网站上陆续看到不少开发者说 “加哇”实际上不是纯粹的面向对象,因为并不是所有的东西在“加哇” 世界都是一个对象”。他们很多的论点都可以概括为以下两点:

  所有的静态内容( static 关键修饰的变量和方法)不属于任何对象,所以这些是非对象的东西。

  所有基本类型(char,boolean,byte,short,int,long,float,double)都不是对象,因为我们不能做类似正常对象的所具有的操作(例如:使用“.”来访问对象的属性和方法)。

  在那时,由于个人知识经验储备有限,我又很容地相信上面的论点,并且也开始认为 “加哇”不是纯粹的面向对象编程语言”。

  另一个是Class 对象。该Class 对象在JVM内仅仅会装载一次,该类的静态方法和静态属性也一同装载,JVM使用该 Class 对象来创建具体的实例对象(如上面的对象)。

  一个是实例对象 emp ;另一个则是 Class对象,我们可以通过 Employee.class 引用到它;这个 Class 对象拥有所有的这个类定义的静态变量和静态方法,同时,如果我们访问 通过 emp 对象来访问静态内容,会发现它其实指向的对象就是 Employee.class 。

  这也揭开了另一个迷:为什么静态内容在一个对象中(不管是emp还是emp2)改变了,在另一个对象中也同时改变,因为这两个对象改变的都是在 Employee.class 同一个对象里面的内容。

  现在,上面说到的第一个论点我们要取消了。因为,静态内容确实被证实属于一个对象。

  但是我们还要确认第二个论点:正如早前提到的,原始类型在“加哇”中不是对象,它们无法做类似对象的操作。为了解决这个问题,“加哇”官方为每一个原始类型推出了对应的包装类(比如:Integer 对应 int,Long 对应 long,Character 对应 char),所以,其实现在我们可以为原始类型创建一个包装对象,同时对它们做对象相关的操作。并且,由于自动拆装箱,我们可以把一个原始类型值赋值给它对应的包装类的引用。但是我们仍然不能对这些原始类型做对象的操作我们需要创建对应包装类的对象。

  到目前为止,从一个最终用户的角度上来看的,我们可以确认 “原始类别不是对象”。( “加哇”开发人员是“加哇”的最终用户,因为我们正在使用它,而不是创造它 )。

  其实,在JVM看来它把所有的 “原始类型” 都是当作对象处理” ,要证明这一点可以通过 Class类的源代码 或者“加哇”doc中Class类的说明。

  Class类的实例表示正在运行的“加哇”应用程序的类和接口。像枚举是一种类和注解则是一种接口。每个数组也属于被反射作为由具有相同的元素类型和尺寸的数目的所有阵列共享一类对象的类。原始的“加哇”类型(boolean, byte, char, short, int, long, float, and double)和关键字void也表示为Class对象。

  一共有9种设定好的Class对象来表示对应的基本类型和void关键字。这些对象都是由JVM创建的。

  当你打开 J**adoc 对 Class 类的定义中,通过 “CTRL+F ” 查找关键字 “primitive”, 将会发现证据在表面 “在JVM里,它把基本类型当作对象来处理的”。

  我们可以再来看一个例子: Integer.TYPE,在这部分文档清晰记录着:

  那么,既然说 “JVM”会为所有的基本类型创建一个对象,那我们为什么还那么常用 “原始类型”, 而不是直接使用对应的包装类对象呢?

  这是因为,为 “原始类型” 创建的对象,在JVM内部是很轻量级的,相对与我们直接创建的对应包装类对象做了许多优化; 也正因为轻量的缘故,这些原始类的功能就比较少(例如我们不能调用其内部的方法,因为他们内部已经优化成没有方法了)

  “原始类型”有更快的速度(例如,下面的代码执行,在我们的机器上需要9秒,但当我把 Long 改成 long 之后,0秒内就完成了)

  我们注意看第四句,输出结果确实为 “false” 。这个是因在 [-128; 127] 这个区间的265个整数会被 JVM 缓存存放, 所以在这个区间, JVM返回相同的对象;然而,超出这个区间, JVM就不再有缓存了,将会创建新的对象,所以结果是不等的。

  所以总结一下是: 在JVM内部,原始类型就是被当作对象来处理的。但是我们开发者直接把 “原始类型” 当作对象使用,开发者应该使用对应的包装来。

本文链接:http://moodyjews.net/duixiangshiyuyan/19.html
随机为您推荐歌词
推荐文章

联系我们 | 关于我们 | 网友投稿 | 版权声明 | 广告服务 | 站点统计 | 网站地图

版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright @ 2012-2013 织梦猫 版权所有  Powered by Dedecms 5.7
渝ICP备10013703号  

回顶部