日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

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

發(fā)布時(shí)間:2023/12/10 java 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java面向对象语言_Java到底是不是一种纯面向对象语言? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

英文原文:Why Java Is a Purely Object-Oriented Language Or Why Not

Java是否確實(shí)是 “純面向?qū)ο蟆?#xff1f;讓我們深入到Java的世界,試圖來(lái)證實(shí)它。

在我剛開(kāi)始學(xué)習(xí)Java的前面幾年,我從書(shū)本里知道了Java是遵循“面向?qū)ο缶幊谭妒?Object Oriented Programming paradigm)”的。在Java世界內(nèi)一切都是對(duì)象,甚至包括字符串(String)這些都是對(duì)象(在 C 語(yǔ)言中,字符串是字符數(shù)組),那時(shí)候,我認(rèn)為Java是一種面向?qū)ο蟮恼Z(yǔ)言。

但是在后來(lái),我在網(wǎng)上陸續(xù)看到不少開(kāi)發(fā)者說(shuō)“Java實(shí)際上不是純粹的面向?qū)ο?#xff0c;因?yàn)椴⒉皇撬械臇|西在Java世界都是一個(gè)對(duì)象”。他們很多的論點(diǎn)都可以概括為以下兩點(diǎn):

所有的靜態(tài)內(nèi)容(static關(guān)鍵字修飾的變量和方法)不屬于任何對(duì)象,這些是非對(duì)象的東西。

所有基本類型(char,boolean,byte,short,int,long,float,double)都不是對(duì)象,因

為我們不能做類似對(duì)象的所具有的操作(例如:使用“.”來(lái)訪問(wèn)對(duì)象的屬性和方法)。

在那時(shí),由于個(gè)人知識(shí)經(jīng)驗(yàn)儲(chǔ)備有限,我又很容地相信上面的論點(diǎn),并且也開(kāi)始認(rèn)為 “Java 不是純粹的面向?qū)ο缶幊陶Z(yǔ)言”。

到了更后來(lái),我發(fā)現(xiàn)JVM在創(chuàng)建對(duì)象的時(shí)候,實(shí)際上會(huì)創(chuàng)建兩個(gè)對(duì)象:

一個(gè)是實(shí)例對(duì)象。

另一個(gè)是Class對(duì)象。該Class對(duì)象在JVM內(nèi)僅僅會(huì)裝載一次,該類的靜態(tài)方法和靜態(tài)屬性也一同裝載,JVM使用該Class對(duì)象來(lái)創(chuàng)建具體的實(shí)例對(duì)象(如上面的對(duì)象)。

例如,在下面的 Java 語(yǔ)句中,將有兩個(gè)對(duì)象被創(chuàng)建:

Employee emp = new Employee ();

一個(gè)是實(shí)例對(duì)象 emp ;另一個(gè)則是Class對(duì)象,我們可以通過(guò)Employee.class引用到它;這個(gè)Class對(duì)象擁有所有的這個(gè)類定義的靜態(tài)變量和靜態(tài)方法。同時(shí),如果我們?cè)L問(wèn)通過(guò)emp對(duì)象來(lái)訪問(wèn)靜態(tài)內(nèi)容,會(huì)發(fā)現(xiàn)它其實(shí)指向的對(duì)象就是Employee.class。

這也揭開(kāi)了另一個(gè)迷:為什么靜態(tài)內(nèi)容在一個(gè)對(duì)象中(不管是emp還是emp2)改變了,在另一個(gè)對(duì)象中也同時(shí)改變,因?yàn)檫@兩個(gè)對(duì)象改變的都是在Employee.class同一個(gè)對(duì)象里面的內(nèi)容。

現(xiàn)在,上面說(shuō)到的第一個(gè)論點(diǎn)我們要取消了。因?yàn)?#xff0c;靜態(tài)內(nèi)容確實(shí)被證實(shí)屬于一個(gè)對(duì)象。

但是我們還要確認(rèn)第二個(gè)論點(diǎn):正如早前提到的,原始類型在Java中不是對(duì)象,它們無(wú)法做類似對(duì)象的操作。為了解決這個(gè)問(wèn)題,Java官方為每一個(gè)原始類型推出了對(duì)應(yīng)的包裝類(比如:Integer對(duì)應(yīng)int,Long對(duì)應(yīng) long,Character對(duì)應(yīng)char),所以,其實(shí)現(xiàn)在我們可以為原始類型創(chuàng)建一個(gè)包裝對(duì)象,同時(shí)對(duì)它們做對(duì)象相關(guān)的操作。并且,由于自動(dòng)拆裝箱,我們可以把一個(gè)原始類型值賦值給它對(duì)應(yīng)的包裝類的引用。但是我們?nèi)匀徊荒軐?duì)這些原始類型做對(duì)象的操作,我們需要?jiǎng)?chuàng)建對(duì)應(yīng)包裝類的對(duì)象。

例如:

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

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

到目前為止,從一個(gè)最終用戶的角度上來(lái)看的,我們可以確認(rèn) “原始類別不是對(duì)象”。(Java 開(kāi)發(fā)人員是 Java的最終用戶,因?yàn)槲覀冋谑褂盟?#xff0c;而不是創(chuàng)造它)。

如果站在JVM的視角,會(huì)有新的發(fā)現(xiàn):

其實(shí),在JVM看來(lái)它把所有的“原始類型”都是當(dāng)作對(duì)象處理,要證明這一點(diǎn)可以通過(guò)Class類的源代碼或者Javadoc中Class類的說(shuō)明。

根據(jù) 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 類的實(shí)例表示正在運(yùn)行的Java應(yīng)用程序的類和接口。像枚舉是一種類,注解則是一種接口。每個(gè)數(shù)組也屬于被反射作為由具有相同的元素類型和尺寸的數(shù)目的所有陣列共享一類對(duì)象的類。原始的Java 類型(boolean, byte, char, short, int, long, float, and double)和關(guān)鍵字void也表示為Class 對(duì)象。

同時(shí)也根據(jù) Javadoc 中對(duì) Class.isPrimitive ()方法的定義來(lái)判斷。

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 對(duì)象是否代表一個(gè)基本類型。

一共有 9 種設(shè)定好的 Class 對(duì)象來(lái)表示對(duì)應(yīng)的基本類型和 void 關(guān)鍵字。這些對(duì)象都是由 JVM 創(chuàng)建的。

return

當(dāng)且僅當(dāng)該類表示一個(gè)真正的基本類型

以上都說(shuō)明,在 JVM 內(nèi)部,其實(shí)原始類型就是對(duì)象。

當(dāng)你打開(kāi) Javadoc對(duì) Class 類的定義中,通過(guò) “CTRL+F ” 查找關(guān)鍵字“primitive”,將會(huì)發(fā)現(xiàn)證據(jù)在表面 “在JVM里,它把基本類型當(dāng)作對(duì)象來(lái)處理的”。

我們可以再來(lái)看一個(gè)例子: Integer.TYPE,在這部分文檔清晰記錄著:

Java 官方描述:

public static final Class TYPE

The Class instance representing the primitive type int.

以上都說(shuō)明,在 JVM 內(nèi)部,其實(shí)原始類型就是對(duì)象。

那么,既然說(shuō) “JVM”會(huì)為所有的基本類型創(chuàng)建一個(gè)對(duì)象,那我們?yōu)槭裁催€那么常用 “原始類型”, 而不是直接使用對(duì)應(yīng)的包裝類對(duì)象呢?

這是因?yàn)?#xff0c;為“原始類型”創(chuàng)建的對(duì)象,在JVM內(nèi)部是很輕量級(jí)的,相對(duì)與我們直接創(chuàng)建的對(duì)應(yīng)包裝類對(duì)象做了許多優(yōu)化; 也正因?yàn)檩p量的緣故,這些原始類的功能就比較少(例如我們不能調(diào)用其內(nèi)部的方法,因?yàn)樗麄儍?nèi)部已經(jīng)優(yōu)化成沒(méi)有方法了)

使用實(shí)際的例子來(lái)說(shuō)明,為什么我們更應(yīng)該使用 “原始類型”:

“原始類型”有更快的速度(例如,下面的代碼執(zhí)行,在我們的機(jī)器上需要9秒,但當(dāng)我把Long改成long 之后,0 秒內(nèi)就完成了)

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);

}

“原始類型”允許我們直接使用 “==”來(lái)進(jìn)行比較。

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

我們注意看第四句,輸出結(jié)果確實(shí)為 “false” 。這個(gè)是因?yàn)樵?[-128; 127] 這個(gè)區(qū)間的265個(gè)整數(shù)會(huì)被JVM 緩存存放, 所以在這個(gè)區(qū)間, JVM 返回相同的對(duì)象;然而,超出這個(gè)區(qū)間, JVM 就不再有緩存了,將會(huì)創(chuàng)建新的對(duì)象,所以結(jié)果是不等的。

所以總結(jié)一下是:

在JVM內(nèi)部,原始類型就是被當(dāng)作對(duì)象來(lái)處理的。但是我們開(kāi)發(fā)者直接把“原始類型”當(dāng)作對(duì)象使用,開(kāi)發(fā)者應(yīng)該使用對(duì)應(yīng)的包裝來(lái)。

以上就是為什么我說(shuō)“Java確實(shí)是一個(gè)純粹的面向?qū)ο笳Z(yǔ)言”的證實(shí)過(guò)程。

總結(jié)

以上是生活随笔為你收集整理的java面向对象语言_Java到底是不是一种纯面向对象语言?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。