java 纯面向对象_Java到底是不是一种纯面向对象语言?

原标题:Java到底是不是一种纯面向对象语言?

Java——是否确实的 “纯面向对象”?让我们深入到Java的世界,试图来证实它。

2cab3faac98cce00eb517a3a621981f1.png

在我刚开始学习 Java 的前面几年,我从书本里知道了 Java 是遵循 “面向对象编程范式(Object Oriented Programming paradigm)”的。在Java世界内一切都是对象,甚至包括字符串(String)这些都是对象(在 C 语言中,字符串是字符数组),那时候,我认为 Java是一种面向对象的语言。

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

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

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

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

到了更后来,在我的一次JVM学习过程中,我有了新的发现:

JVM 在创建对象的时候,实际上会创建两个对象:

一个是实例对象。

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

例如,在下面的 Java 语句中,将有两个对象被创建:

Employee emp = new Employee();

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

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

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

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

例如:

Integer obj = new Integer(5); // here we can do i.toString();

int i = 5; // but we can't do i.toString() here

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

如果站在JVM的视角,会有新的发现:

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

根据 java.lang.Class 类的源代码,该类的注释是:

Java官方描述:

Instances of the class Class represent classes and interfaces in a running Java application. An enum is a kind of class and an annotation is a kind of interface. Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions. The primitive Java types (boolean, byte, char, short, int, long, float, and double), and the keyword void are also represented as Class objects.

参考译文:

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

同时也根据Javadoc中对Class.isPrimitive()方法的定义,来判断

Java官方描述:

public boolean isPrimitive()

Determines if the specified Class object represents a primitive type.

There are nine predefined Class objects to represent the eight primitive types and void. These are created by the Java Virtual Machine, and have the same names as t he primitive types that they represent, namely boolean,byte, char, short, int, long, float, and double.

These objects may only be accessed via the following public static final variables, and are the only Class objects for which this method returns true.

Returns:

true if and only if this class represents a primitive type

Since:

JDK1.1

参考翻译:

public boolean isPrimitive()

判断指定的Class对象是否代表一个基本类型。

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

return

当且仅当该类表示一个真正的基本类型

以上都说明,在JVM内部,其实原始类型就是对象。

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

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

Java官方描述:

public static final Class TYPE

The Class instance representing the primitive type int.

以上都说明,在JVM内部,其实原始类型就是对象。

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

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

使用实际的例子来说明,为什么我们更应该使用 “原始类型”:

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

public static void main(String[] args) {

long millis = System.currentTimeMillis();

Long sum = 0L; // uses Long, not long

for (long i = 0; i <= Integer.MAX_VALUE; i++) {

sum += i;

}

System.out.println(sum);

System.out.println((System.currentTimeMillis() - millis) / 1000);

}

“原始类型”允许我们直接使用 “==”来进行比较

new Integer(3) == new Integer(3); // false

new Integer(100) == new Integer(100); // false

Integer.valueOf(5) == Integer.valueOf(5); //true

Integer.valueOf(200) == Integer.valueOf(200); //false

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

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

以上就是为什么我说 “ Java确实是一个纯粹的面向对象语言 ”的证实过程。如果你们对这个有什么其他的观点,请在评论留言,一起讨论。

责任编辑:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java爬虫post 404_POST 后台404错误

今天在开发一个用户信息更新模块的时候遇到了两个问题&#xff1a;1、在我提交form表单的时候我希望在提交表单之后页面不刷新&#xff0c;同时返回更新数据2、向后台POST表单信息的时候&#xff0c;后台显示POST url 404的错误解决第一个问题的使用使用jquery.form的插件进行异…

java防止重复启动bat_java调用exe,及调用bat不成功的解决办法

开门见山的说&#xff0c;文件目录如下想调用123.exe,但是尝试了几次调用不到&#xff0c;然后写了个bat。初始内容如下echo offD:cd test"123.exe"双击可以运行&#xff0c;但是java代码无法调用&#xff0c;怪事。于是&#xff0c;辗转反侧&#xff0c;苦思冥想&am…

java8.0 platform图_Java Platform SE binary语言-Java编程32位/64位版(jdk-jeb)下载V8.0.2510.8官方安装版-西西软件下载...

Java编程32位/64位版(jdk-jeb)是一款功能强大的计算机编程语言工具&#xff0c;Java技术让您可以在安全的计算环境下工作和游戏。使用 Java您可以畅玩网络游戏、与世界各地的朋友聊天、计算按揭利息&#xff0c;还可以在 3D 模式下浏览图像&#xff0c;诸多功能不一而足。软件特…

java 线程由浅入深_由浅入深,Java 并发编程中的 Synchronized(一)

synchronized 作用synchronized 关键字是 Java 并发编程中线程同步的常用手段之一。1.1 作用&#xff1a;确保线程互斥的访问同步代&#xff0c;锁自动释放&#xff0c;多个线程操作同个代码块或函数必须排队获得锁&#xff0c;保证共享变量的修改能够及时可见&#xff0c;获得…

php有哪些高级扩展,php扩展有哪些

什么是PHP扩展&#xff1f;为PHP提供一些扩展的功能常见的PHP扩展mysql-----提供给PHP操作MySQL数据库的功能gd2----动态创建图像xdebug-----跟踪、调试和分析PHP程序的运行状况查看PHP扩展1.使用phpinfo探针phpinfo()---输出关于PHP配置的信息输出PHP当前状态的大量信息&#…

php 图片系统,Linger

软件简介Linger 是 PHP 图片分享系统。一个精简的图片分享系统网站&#xff0c;采用Bootstrap前端框架&#xff0c;支持部分页面的移动端自适应。同时采用HTML5进行图片批量上传。使用了一个简单的时间线动态展示&#xff0c;可作为简易的图片社交社区。有一个完整的用户中心和…

php 传递类名,php 对象和数组序列化 serialize()返回字符串方便存储和传递 unserialize()反序列化 不丢失类型和结构...

现在开发中经常使用序列号和反序列化技术手段&#xff0c;php开发中也大量使用到。如下几个知名系统都使用了大量的序列化技术ecshop2. phpcms内容管理系统3.laravel框架一、序列号的目的&#xff1f;方便数组和对象的传输或存储&#xff0c;同时不丢失其类型和结构如下是ecsho…

python操作json字符串,超详细的Python文件操作知识

来自&#xff1a;CSDN&#xff0c;作者&#xff1a;南枝向暖北枝寒MA链接&#xff1a;https://blog.csdn.net/mall_lucy/article/details/104547365【导语】&#xff1a;python进行文件操作&#xff0c;在日常编程中是很常用的。为了方便大家&#xff0c;这里对各种文件操作的知…

php头尾分离,laravel怎么做模板的头尾分离

关注博主&#xff0c;每天分享项目实战经验1.首先找到页面的公共部分&#xff0c;放在layouts这个目录下的home.blade.php2.设置内容区域yield(content)3.在其他页面使用模板引擎&#xff0c;先继承&#xff0c;然后在使用section即可extends(layouts.home)section(content)I a…

log4j日志 linux配置,Log4j 日志详细用法

简单的说log4j就是帮助开发人员进行日志输出管理的API类库。它最重要的特点就可以配置文件灵活的设置日志信息的优先级、日志信息的输出目的地、日志信息的输出格式Log4j 除了可以记录程序运行日志信息外还有一重要的功能就是用来显示调试信息。程序员经常会遇到脱离Java ide环…

linux qtcreator输入中文,新版QT creator下解决fcitx无法输入中文问题(QTcreatorV4.1.0)...

Preface新版本的QT creatorV4.0.0之后&#xff0c;就QT creator结构本身就发生了很大的变化&#xff0c;许多文件路径以及结构都发生了较大的变化。因此&#xff0c;fcitx的qt5库位置也发生了变化&#xff0c;但是原理还是一样的&#xff0c;都是需要一个动态依赖库&#xff1a…

lisp 读取dwg 统计信息_预制梁厂 BIM 技术和自动化、信息化应用方案

一、使用 Planbar 桥梁模块进行 BIM 模型创建Planbar是德国内梅切克软件工程有限公司专门针对混凝土图纸构件的软件产品&#xff0c;通过三十多年专注于预制构件设计工作所累积的经验&#xff0c;PLANBAR 实现了无与伦比的规划深度。PLANBAR 支持 40 种以上的数据交换形式&…

windows os x linux比较,对比测试:Ubuntu 11.04 vs Win7 vs OS X 10.7

今天我们带来了关于Ubuntu 11.04&#xff0c;Windows 7&#xff0c;Mac OS X 10.7的对比测试&#xff0c;包括图片编辑、视频编码、多任务测试等。本次测试是在同一机子上展开的&#xff0c;这样避免了硬件的因素影响。Ubuntu 11.04&#xff0c;Mac OS X 10.7硬件参数&#xff…

简述osi参考模型各层主要功能_OSI网络模型

OSI七层模型和TCP/IP五层模型 一、OSI参考模型 1、OSI的来源 OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。 ISO为了更好的使网络应用更为普及,推出了OSI参考模型。其含义就是推荐所有…

linux中vi基础知识,Vim入门基础知识集锦

想学习Vim&#xff0c;但是Vim官网的手册又太大而全&#xff0c;而网上各方资料要么不全面&#xff0c;要么不够基础。在网上搜集各方资料&#xff0c;按照自己的框架整理一份Vim入门基础教程&#xff0c;分享出来。特点是偏向基础&#xff0c;但对入门者来说足够全面&#xff…

数学式子对应的c语言表达式是,把数学式写成C语言表达式

(1) 3.26*exp(x)1.0/3.0*pow((ab), 4)(2) 2*sqrt(x)(ab)/(3.0*sin(x))(3) g*m1*m2/(r*r)(4) double pi 3.142.0*pi*r pi*r*r cos(45.0*pi / 180.0 )(5) loan * rate * pow( (1rate) , month ) / ( pow( (1rate) , month) - 1)扩展资料&#xff1a;指针&#xff1a;如果一个变…

pandas 每一列相加_Python3 numpy amp; pandas 学习笔记

写在前面在用python做一些ML和DL的工作前&#xff0c;先看莫烦大佬的视频学习一下numpy和pandas这两个数据处理包&#xff0c;学习中记了一些笔记&#xff0c;便于自己日后查阅&#xff0c;同时发布到知乎希望能够帮助到其他小伙伴&#xff01;视频如下&#xff1a;Numpy &…

c语言学生成绩查询系统2018,南昊网上阅卷学生成绩查询系统

2018南昊网上阅卷学生成绩查询系统开放了&#xff0c;这是面向南昊当地的中小学生们的一款优质的查询学习成绩的平台&#xff0c;只要登录自己的账号就能查询自己的成绩排名情况。对于老师来说这也是一款网上阅卷系统&#xff0c;是一个非常幼稚的学习平台。家长也可以登录本平…

python3 批量定义多个变量_Python3 基本数据类型详解

文章来源&#xff1a;加米谷大数据Python 中的变量不需要声明。每个变量在使用前都必须赋值&#xff0c;变量赋值以后该变量才会被创建。在 Python 中&#xff0c;变量就是变量&#xff0c;它没有类型&#xff0c;我们所说的"类型"是变量所指的内存中对象的类型。等号…

控制cpu_I/O控制器及控制方式,了解一下

1、什么是I/O控制器由于CPU无法直接控制I/O设备的机械部件&#xff0c;因此I/O设备还要有个电子部件作为CPU和I/O设备机械部件之间的“中介”&#xff0c;用于实现CPU对设备的控制&#xff0c;这个电子部件就是I/O控制器&#xff0c;又称为设备控制器。I/O控制器是控制计算机输…