最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Java最全八股文(2023最新整理)

2023-06-16 15:38 作者:編程小宇e  | 我要投稿

Java的特點

Java是一門面向?qū)ο蟮木幊陶Z言。面向?qū)ο蠛兔嫦蜻^程的區(qū)別參考下一個問題。


Java具有平臺獨立性和移植性。


Java有一句口號:Write once, run anywhere,一次編寫、到處運行。這也是Java的魅力所在。而實現(xiàn)這種特性的正是Java虛擬機JVM。已編譯的Java程序可以在任何帶有JVM的平臺上運行。你可以在windows平臺編寫代碼,然后拿到linux上運行。只要你在編寫完代碼后,將代碼編譯成.class文件,再把class文件打成Java包,這個jar包就可以在不同的平臺上運行了。

Java具有穩(wěn)健性。


Java是一個強類型語言,它允許擴展編譯時檢查潛在類型不匹配問題的功能。Java要求顯式的方法聲明,它不支持C風格的隱式聲明。這些嚴格的要求保證編譯程序能捕捉調(diào)用錯誤,這就導致更可靠的程序。

異常處理是Java中使得程序更穩(wěn)健的另一個特征。異常是某種類似于錯誤的異常條件出現(xiàn)的信號。使用try/catch/finally語句,程序員可以找到出錯的處理代碼,這就簡化了出錯處理和恢復的任務。

Java是如何實現(xiàn)跨平臺的?

Java是通過JVM(Java虛擬機)實現(xiàn)跨平臺的。


JVM可以理解成一個軟件,不同的平臺有不同的版本。我們編寫的Java代碼,編譯后會生成.class 文件(字節(jié)碼文件)。Java虛擬機就是負責將字節(jié)碼文件翻譯成特定平臺下的機器碼,通過JVM翻譯成機器碼之后才能運行。不同平臺下編譯生成的字節(jié)碼是一樣的,但是由JVM翻譯成的機器碼卻不一樣。


只要在不同平臺上安裝對應的JVM,就可以運行字節(jié)碼文件,運行我們編寫的Java程序。


因此,運行Java程序必須有JVM的支持,因為編譯的結(jié)果不是機器碼,必須要經(jīng)過JVM的翻譯才能執(zhí)行。


Java 與 C++ 的區(qū)別

Java 是純粹的面向?qū)ο笳Z言,所有的對象都繼承自 java.lang.Object,C++ 兼容 C ,不但支持面向?qū)ο笠仓С置嫦蜻^程。

Java 通過虛擬機從而實現(xiàn)跨平臺特性, C++ 依賴于特定的平臺。

Java 沒有指針,它的引用可以理解為安全指針,而 C++ 具有和 C 一樣的指針。

Java 支持自動垃圾回收,而 C++ 需要手動回收。

Java 不支持多重繼承,只能通過實現(xiàn)多個接口來達到相同目的,而 C++ 支持多重繼承。

JDK/JRE/JVM三者的關系

JVM


英文名稱(Java Virtual Machine),就是我們耳熟能詳?shù)?Java 虛擬機。Java 能夠跨平臺運行的核心在于 JVM 。

所有的java程序會首先被編譯為.class的類文件,這種類文件可以在虛擬機上執(zhí)行。也就是說class文件并不直接與機器的操作系統(tǒng)交互,而是經(jīng)過虛擬機間接與操作系統(tǒng)交互,由虛擬機將程序解釋給本地系統(tǒng)執(zhí)行。


針對不同的系統(tǒng)有不同的 jvm 實現(xiàn),有 Linux 版本的 jvm 實現(xiàn),也有Windows 版本的 jvm 實現(xiàn),但是同一段代碼在編譯后的字節(jié)碼是一樣的。這就是Java能夠跨平臺,實現(xiàn)一次編寫,多處運行的原因所在。

JRE

英文名稱(Java Runtime Environment),就是Java 運行時環(huán)境。我們編寫的Java程序必須要在JRE才能運行。它主要包含兩個部分,JVM 和 Java 核心類庫。

JRE是Java的運行環(huán)境,并不是一個開發(fā)環(huán)境,所以沒有包含任何開發(fā)工具,如編譯器和調(diào)試器等。

如果你只是想運行Java程序,而不是開發(fā)Java程序的話,那么你只需要安裝JRE即可。


JDK

英文名稱(Java Development Kit),就是 Java 開發(fā)工具包

學過Java的同學,都應該安裝過JDK。當我們安裝完JDK之后,目錄結(jié)構(gòu)是這樣的

可以看到,JDK目錄下有個JRE,也就是JDK中已經(jīng)集成了 JRE,不用單獨安裝JRE。

另外,JDK中還有一些好用的工具,如jinfo,jps,jstack等。

最后,總結(jié)一下JDK/JRE/JVM,他們?nèi)叩年P系

JRE = JVM + Java 核心類庫

JDK = JRE + Java工具 + 編譯器 + 調(diào)試器

Java程序是編譯執(zhí)行還是解釋執(zhí)行?

先看看什么是編譯型語言和解釋型語言。


編譯型語言


在程序運行之前,通過編譯器將源程序編譯成機器碼可運行的二進制,以后執(zhí)行這個程序時,就不用再進行編譯了。


優(yōu)點:編譯器一般會有預編譯的過程對代碼進行優(yōu)化。因為編譯只做一次,運行時不需要編譯,所以編譯型語言的程序執(zhí)行效率高,可以脫離語言環(huán)境獨立運行。


缺點:編譯之后如果需要修改就需要整個模塊重新編譯。編譯的時候根據(jù)對應的運行環(huán)境生成機器碼,不同的操作系統(tǒng)之間移植就會有問題,需要根據(jù)運行的操作系統(tǒng)環(huán)境編譯不同的可執(zhí)行文件。


總結(jié):執(zhí)行速度快、效率高;依靠編譯器、跨平臺性差些。


代表語言:C、C++、Pascal、Object-C以及Swift。


解釋型語言


定義:解釋型語言的源代碼不是直接翻譯成機器碼,而是先翻譯成中間代碼,再由解釋器對中間代碼進行解釋運行。在運行的時候才將源程序翻譯成機器碼,翻譯一句,然后執(zhí)行一句,直至結(jié)束。


優(yōu)點:


有良好的平臺兼容性,在任何環(huán)境中都可以運行,前提是安裝了解釋器(如虛擬機)。

靈活,修改代碼的時候直接修改就可以,可以快速部署,不用停機維護。

缺點:每次運行的時候都要解釋一遍,性能上不如編譯型語言。


總結(jié):解釋型語言執(zhí)行速度慢、效率低;依靠解釋器、跨平臺性好。


代表語言:JavaScript、Python、Erlang、PHP、Perl、Ruby。


對于Java這種語言,它的源代碼會先通過javac編譯成字節(jié)碼,再通過jvm將字節(jié)碼轉(zhuǎn)換成機器碼執(zhí)行,即解釋運行 和編譯運行配合使用,所以可以稱為混合型或者半編譯型。


面向?qū)ο蠛兔嫦蜻^程的區(qū)別?

面向?qū)ο蠛兔嫦蜻^程是一種軟件開發(fā)思想。


面向過程就是分析出解決問題所需要的步驟,然后用函數(shù)按這些步驟實現(xiàn),使用的時候依次調(diào)用就可以了。


面向?qū)ο笫前褬?gòu)成問題事務分解成各個對象,分別設計這些對象,然后將他們組裝成有完整功能的系統(tǒng)。面向過程只用函數(shù)實現(xiàn),面向?qū)ο笫怯妙悓崿F(xiàn)各個功能模塊。


以五子棋為例,面向過程的設計思路就是首先分析問題的步驟:


1、開始游戲,2、黑子先走,3、繪制畫面,4、判斷輸贏,5、輪到白子,6、繪制畫面,7、判斷輸贏,8、返回步驟2,9、輸出最后結(jié)果。

把上面每個步驟用分別的函數(shù)來實現(xiàn),問題就解決了。


而面向?qū)ο蟮脑O計則是從另外的思路來解決問題。整個五子棋可以分為:


黑白雙方

棋盤系統(tǒng),負責繪制畫面

規(guī)則系統(tǒng),負責判定諸如犯規(guī)、輸贏等。

黑白雙方負責接受用戶的輸入,并告知棋盤系統(tǒng)棋子布局發(fā)生變化,棋盤系統(tǒng)接收到了棋子的變化的信息就負責在屏幕上面顯示出這種變化,同時利用規(guī)則系統(tǒng)來對棋局進行判定。


面向?qū)ο笥心男┨匦裕?/p>

面向?qū)ο笏拇筇匦裕悍庋b,繼承,多態(tài),抽象


1、封裝就是將類的信息隱藏在類內(nèi)部,不允許外部程序直接訪問,而是通過該類的方法實現(xiàn)對隱藏信息的操作和訪問。 良好的封裝能夠減少耦合。


2、繼承是從已有的類中派生出新的類,新的類繼承父類的屬性和行為,并能擴展新的能力,大大增加程序的重用性和易維護性。在Java中是單繼承的,也就是說一個子類只有一個父類。


3、多態(tài)是同一個行為具有多個不同表現(xiàn)形式的能力。在不修改程序代碼的情況下改變程序運行時綁定的代碼。實現(xiàn)多態(tài)的三要素:繼承、重寫、父類引用指向子類對象。


靜態(tài)多態(tài)性:通過重載實現(xiàn),相同的方法有不同的參數(shù)列表,可以根據(jù)參數(shù)的不同,做出不同的處理。

動態(tài)多態(tài)性:在子類中重寫父類的方法。運行期間判斷所引用對象的實際類型,根據(jù)其實際類型調(diào)用相應的方法。

4、抽象。把客觀事物用代碼抽象出來。


面向?qū)ο缶幊痰牧笤瓌t?

對象單一職責:我們設計創(chuàng)建的對象,必須職責明確,比如商品類,里面相關的屬性和方法都必須跟商品相關,不能出現(xiàn)訂單等不相關的內(nèi)容。這里的類可以是模塊、類庫、程序集,而不單單指類。

里式替換原則:子類能夠完全替代父類,反之則不行。通常用于實現(xiàn)接口時運用。因為子類能夠完全替代基(父)類,那么這樣父類就擁有很多子類,在后續(xù)的程序擴展中就很容易進行擴展,程序完全不需要進行修改即可進行擴展。比如IA的實現(xiàn)為A,因為項目需求變更,現(xiàn)在需要新的實現(xiàn),直接在容器注入處更換接口即可.

迪米特法則,也叫最小原則,或者說最小耦合。通常在設計程序或開發(fā)程序的時候,盡量要高內(nèi)聚,低耦合。當兩個類進行交互的時候,會產(chǎn)生依賴。而迪米特法則就是建議這種依賴越少越好。就像構(gòu)造函數(shù)注入父類對象時一樣,當需要依賴某個對象時,并不在意其內(nèi)部是怎么實現(xiàn)的,而是在容器中注入相應的實現(xiàn),既符合里式替換原則,又起到了解耦的作用。

開閉原則:開放擴展,封閉修改。當項目需求發(fā)生變更時,要盡可能的不去對原有的代碼進行修改,而在原有的基礎上進行擴展。

依賴倒置原則:高層模塊不應該直接依賴于底層模塊的具體實現(xiàn),而應該依賴于底層的抽象。接口和抽象類不應該依賴于實現(xiàn)類,而實現(xiàn)類依賴接口或抽象類。

接口隔離原則:一個對象和另外一個對象交互的過程中,依賴的內(nèi)容最小。也就是說在接口設計的時候,在遵循對象單一職責的情況下,盡量減少接口的內(nèi)容。

簡潔版:


單一職責:對象設計要求獨立,不能設計萬能對象。

開閉原則:對象修改最小化。

里式替換:程序擴展中抽象被具體可以替換(接口、父類、可以被實現(xiàn)類對象、子類替換對象)

迪米特:高內(nèi)聚,低耦合。盡量不要依賴細節(jié)。

依賴倒置:面向抽象編程。也就是參數(shù)傳遞,或者返回值,可以使用父類類型或者接口類型。從廣義上講:基于接口編程,提前設計好接口框架。

接口隔離:接口設計大小要適中。過大導致污染,過小,導致調(diào)用麻煩。

數(shù)組到底是不是對象?

先說說對象的概念。對象是根據(jù)某個類創(chuàng)建出來的一個實例,表示某類事物中一個具體的個體。

對象具有各種屬性,并且具有一些特定的行為。站在計算機的角度,對象就是內(nèi)存中的一個內(nèi)存塊,在這個內(nèi)存塊封裝了一些數(shù)據(jù),也就是類中定義的各個屬性。

所以,對象是用來封裝數(shù)據(jù)的。

java中的數(shù)組具有java中其他對象的一些基本特點。比如封裝了一些數(shù)據(jù),可以訪問屬性,也可以調(diào)用方法。

因此,可以說,數(shù)組是對象。

也可以通過代碼驗證數(shù)組是對象的事實。比如以下的代碼,輸出結(jié)果為java.lang.Object。

由此,可以看出,數(shù)組類的父類就是Object類,那么可以推斷出數(shù)組就是對象。


Java的基本數(shù)據(jù)類型有哪些?

byte,8bit

char,16bit

short,16bit

int,32bit

float,32bit

long,64bit

double,64bit

boolean,只有兩個值:true、false,可以使?用 1 bit 來存儲

在Java規(guī)范中,沒有明確指出boolean的大小。在《Java虛擬機規(guī)范》給出了單個boolean占4個字節(jié),和boolean數(shù)組1個字節(jié)的定義,具體 還要看虛擬機實現(xiàn)是否按照規(guī)范來,因此boolean占用1個字節(jié)或者4個字節(jié)都是有可能的。


為什么不能用浮點型表示金額?

由于計算機中保存的小數(shù)其實是十進制的小數(shù)的近似值,并不是準確值,所以,千萬不要在代碼中使用浮點數(shù)來表示金額等重要的指標。


建議使用BigDecimal或者Long來表示金額。


什么是值傳遞和引用傳遞?

值傳遞是對基本型變量而言的,傳遞的是該變量的一個副本,改變副本不影響原變量。

引用傳遞一般是對于對象型變量而言的,傳遞的是該對象地址的一個副本,并不是原對象本身,兩者指向同一片內(nèi)存空間。所以對引用對象進行操作會同時改變原對象。

java中不存在引用傳遞,只有值傳遞。即不存在變量a指向變量b,變量b指向?qū)ο蟮倪@種情況。


了解Java的包裝類型嗎?為什么需要包裝類?

Java 是一種面向?qū)ο笳Z言,很多地方都需要使用對象而不是基本數(shù)據(jù)類型。比如,在集合類中,我們是無法將 int 、double 等類型放進去的。因為集合的容器要求元素是 Object 類型。


為了讓基本類型也具有對象的特征,就出現(xiàn)了包裝類型。相當于將基本類型包裝起來,使得它具有了對象的性質(zhì),并且為其添加了屬性和方法,豐富了基本類型的操作。


Java最全八股文(2023最新整理)的評論 (共 條)

分享到微博請遵守國家法律
濮阳县| 中西区| 拉孜县| 怀来县| 高陵县| 泸溪县| 东乡族自治县| 青铜峡市| 铜鼓县| 大庆市| 赫章县| 铅山县| 花莲市| 黄陵县| 海盐县| 永吉县| 永登县| 景德镇市| 宁乡县| 阳西县| 湟源县| 保靖县| 呼伦贝尔市| 马鞍山市| 武隆县| 正阳县| 宝应县| 靖州| 拉萨市| 合山市| 齐河县| 张家港市| 满城县| 胶南市| 静安区| 四川省| 湖南省| 云和县| 嘉黎县| 阳谷县| 基隆市|