电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java到底是不是一種純面向對象語言?

瀏覽:91日期:2022-09-05 16:28:04

Java——是否確實的 “純面向對象”?讓我們深入到Java的世界,試圖來證實它。

Java到底是不是一種純面向對象語言?

在我剛開始學習 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 typeSince: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<Integer> TYPEThe 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); // falsenew Integer(100) == new Integer(100); // falseInteger.valueOf(5) == Integer.valueOf(5); //trueInteger.valueOf(200) == Integer.valueOf(200); //false

我們注意看第四句,輸出結果確實為 “false” 。這個是因在 [-128; 127] 這個區間的265個整數會被 JVM 緩存存放, 所以在這個區間, JVM返回相同的對象;然而,超出這個區間, JVM就不再有緩存了,將會創建新的對象,所以結果是不等的。

所以總結一下是: 在JVM內部,原始類型就是被當作對象來處理的。但是我們開發者直接把 “原始類型” 當作對象使用,開發者應該使用對應的包裝來。

以上就是為什么我說 “ Java確實是一個純粹的面向對象語言 ”的證實過程。如果你們對這個有什么其他的觀點,請在評論留言,一起討論。

英文原文:Why Java Is a Purely Object-Oriented Language... Or Why Not 翻譯:碼農網

標簽: Java
相關文章:
主站蜘蛛池模板: 七维官网-水性工业漆_轨道交通涂料_钢结构漆 | 柔性测斜仪_滑动测斜仪-广州杰芯科技有限公司 | 全自动翻转振荡器-浸出式水平振荡器厂家-土壤干燥箱价格-常州普天仪器 | 水篦子|雨篦子|镀锌格栅雨水篦子|不锈钢排水篦子|地下车库水箅子—安平县云航丝网制品厂 | 金属软管_不锈钢金属软管_巩义市润达管道设备制造有限公司 | 南京试剂|化学试剂|分析试剂|实验试剂|cas号查询-专业60年试剂销售企业 | 知网论文检测系统入口_论文查重免费查重_中国知网论文查询_学术不端检测系统 | 尚为传动-专业高精密蜗轮蜗杆,双导程蜗轮蜗杆,蜗轮蜗杆减速机,蜗杆减速机生产厂家 | 红酒招商加盟-葡萄酒加盟-进口红酒代理-青岛枞木酒业有限公司 | 锂电混合机-新能源混合机-正极材料混料机-高镍,三元材料混料机-负极,包覆混合机-贝尔专业混合混料搅拌机械系统设备厂家 | 镀锌钢格栅_热镀锌格栅板_钢格栅板_热镀锌钢格板-安平县昊泽丝网制品有限公司 | 紫外线老化试验箱_uv紫外线老化试验箱价格|型号|厂家-正航仪器设备 | 质检报告_CE认证_FCC认证_SRRC认证_PSE认证_第三方检测机构-深圳市环测威检测技术有限公司 | 上海防爆真空干燥箱-上海防爆冷库-上海防爆冷柜?-上海浦下防爆设备厂家? | 碳纤维复合材料制品生产定制工厂订制厂家-凯夫拉凯芙拉碳纤维手机壳套-碳纤维雪茄盒外壳套-深圳市润大世纪新材料科技有限公司 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | 德国GMN轴承,GMN角接触球轴承,GMN单向轴承,GMN油封,GMN非接触式密封 | 高清视频编码器,4K音视频编解码器,直播编码器,流媒体服务器,深圳海威视讯技术有限公司 | 钢托盘,铁托盘,钢制托盘,镀锌托盘,饲料托盘,钢托盘制造商-南京飞天金属13260753852 | ET3000双钳形接地电阻测试仪_ZSR10A直流_SXJS-IV智能_SX-9000全自动油介质损耗测试仪-上海康登 | 【MBA备考网】-2024年工商管理硕士MBA院校/报考条件/培训/考试科目/提前面试/考试/学费-MBA备考网 | 学校用栓剂模,玻璃瓶轧盖钳,小型安瓿熔封机,实验室安瓿熔封机-长沙中亚制药设备有限公司 | 防爆电机生产厂家,YBK3电动机,YBX3系列防爆电机,YBX4节防爆电机--河南省南洋防爆电机有限公司 | 印刷人才网 印刷、包装、造纸,中国80%的印刷企业人才招聘选印刷人才网! | 红外光谱仪维修_二手红外光谱仪_红外压片机_红外附件-天津博精仪器 | 电缆接头_防水接头_电缆防水接头 - 乐清市新豪电气有限公司 | 西安展台设计搭建_西安活动策划公司_西安会议会场布置_西安展厅设计西安旭阳展览展示 | 涂层测厚仪_漆膜仪_光学透过率仪_十大创新厂家-果欧电子科技公司 | 南京雕塑制作厂家-不锈钢雕塑制作-玻璃钢雕塑制作-先登雕塑厂 | ORP控制器_ORP电极价格-上优泰百科| 对照品_中药对照品_标准品_对照药材_「格利普」高纯中药标准品厂家-成都格利普生物科技有限公司 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库 | 中天寰创-内蒙古钢结构厂家|门式刚架|钢结构桁架|钢结构框架|包头钢结构煤棚 | 污水处理设备维修_污水处理工程改造_机械格栅_过滤设备_气浮设备_刮吸泥机_污泥浓缩罐_污水处理设备_污水处理工程-北京龙泉新禹科技有限公司 | 暴风影音| 陕西安玻璃自动感应门-自动重叠门-磁悬浮平开门厂家【捷申达门业】 | 全自动烧卖机厂家_饺子机_烧麦机价格_小笼汤包机_宁波江北阜欣食品机械有限公司 | 杭州货架订做_组合货架公司_货位式货架_贯通式_重型仓储_工厂货架_货架销售厂家_杭州永诚货架有限公司 | 模具硅橡胶,人体硅胶,移印硅胶浆厂家-宏图硅胶科技 | BOE画框屏-触摸一体机-触控查询一体机-触摸屏一体机价格-厂家直销-触发电子 | 大流量卧式砂磨机_强力分散机_双行星双动力混合机_同心双轴搅拌机-莱州市龙跃化工机械有限公司 | 武汉高温老化房,恒温恒湿试验箱,冷热冲击试验箱-武汉安德信检测设备有限公司 |