- 面向?qū)ο蠛兔嫦蜻^(guò)程的區(qū)別
面向過(guò)程
面向?qū)ο?/li> - Java 語(yǔ)言有哪些特點(diǎn)
- 什么是 JDK 什么是 JRE 什么是 JVM 三者之間的聯(lián)系與區(qū)別
- 什么是字節(jié)碼 采用字節(jié)碼的最大好處是什么
先看下 java 中的編譯器和解釋器:
采用字節(jié)碼的好處: - Java和C++的區(qū)別
- 什么是 Java 程序的主類 應(yīng)用程序和小程序的主類有何不同
- Java 應(yīng)用程序與小程序之間有那些差別
- 字符型常量和字符串常量的區(qū)別
- 構(gòu)造器 Constructor 是否可被 override
- 重載和重寫(xiě)的區(qū)別
- Java 面向?qū)ο缶幊倘筇匦?封裝泄鹏、繼承、多態(tài)
封裝
繼承
多態(tài)
1. 面向?qū)ο蠛兔嫦蜻^(guò)程的區(qū)別
面向過(guò)程
優(yōu)點(diǎn): 性能比面向?qū)ο蟾呦ィ驗(yàn)轭愓{(diào)用時(shí)需要實(shí)例化像吻,開(kāi)銷比較大岭佳,比較消耗資源;比如單片機(jī)炕桨、嵌入式開(kāi)發(fā)、Linux/Unix等一般采用面向過(guò)程開(kāi)發(fā)春寿,性能是最重要的因素光坝。
缺點(diǎn): 沒(méi)有面向?qū)ο笠拙S護(hù)尸诽、易復(fù)用、易擴(kuò)展
面向?qū)ο?/h3>
優(yōu)點(diǎn): 易維護(hù)教馆、易復(fù)用逊谋、易擴(kuò)展,由于面向?qū)ο笥蟹庋b土铺、繼承胶滋、多態(tài)性的特性,可以設(shè)計(jì)出低耦合的系統(tǒng)悲敷,使系統(tǒng)更加靈活究恤、更加易于維護(hù)
缺點(diǎn): 性能比面向過(guò)程低
2. Java 語(yǔ)言有哪些特點(diǎn)
- 簡(jiǎn)單易學(xué);
- 面向?qū)ο螅ǚ庋b后德,繼承部宿,多態(tài));
- 平臺(tái)無(wú)關(guān)性( Java 虛擬機(jī)實(shí)現(xiàn)平臺(tái)無(wú)關(guān)性)瓢湃;
- 可靠性理张;
- 安全性;
- 支持多線程( C++ 語(yǔ)言沒(méi)有內(nèi)置的多線程機(jī)制绵患,因此必須調(diào)用操作系統(tǒng)的多線程功能來(lái)進(jìn)行多線程程序設(shè)計(jì)雾叭,而 Java 語(yǔ)言卻提供了多線程支持);
- 支持網(wǎng)絡(luò)編程并且很方便( Java 語(yǔ)言誕生本身就是為簡(jiǎn)化網(wǎng)絡(luò)編程設(shè)計(jì)的落蝙,因此 Java 語(yǔ)言不僅支持網(wǎng)絡(luò)編程而且很方便)织狐;
- 編譯與解釋并存暂幼;
3. 什么是 JDK 什么是 JRE 什么是 JVM 三者之間的聯(lián)系與區(qū)別
這幾個(gè)是Java中很基本很基本的東西,但是我相信一定還有很多人搞不清楚移迫!為什么呢旺嬉?因?yàn)槲覀兇蠖鄶?shù)時(shí)候在使用現(xiàn)成的編譯工具以及環(huán)境的時(shí)候,并沒(méi)有去考慮這些東西厨埋。
JDK: 顧名思義它是給開(kāi)發(fā)者提供的開(kāi)發(fā)工具箱,是給程序開(kāi)發(fā)者用的邪媳。它除了包括完整的JRE(Java Runtime Environment),Java運(yùn)行環(huán)境荡陷,還包含了其他供開(kāi)發(fā)者使用的工具包悲酷。
JRE: 普通用戶而只需要安裝 JRE(Java Runtime Environment)來(lái)運(yùn)行 Java 程序。而程序開(kāi)發(fā)者必須安裝JDK來(lái)編譯亲善、調(diào)試程序。
JVM: 當(dāng)我們運(yùn)行一個(gè)程序時(shí)逗柴,JVM 負(fù)責(zé)將字節(jié)碼轉(zhuǎn)換為特定機(jī)器代碼蛹头,JVM 提供了內(nèi)存管理/垃圾回收和安全機(jī)制等。這種獨(dú)立于硬件和操作系統(tǒng)戏溺,正是 java 程序可以一次編寫(xiě)多處執(zhí)行的原因渣蜗。
區(qū)別與聯(lián)系:
- JDK 用于開(kāi)發(fā),JRE 用于運(yùn)行java程序 旷祸;
- JDK 和 JRE 中都包含 JVM 耕拷;
- JVM 是 java 編程語(yǔ)言的核心并且具有平臺(tái)獨(dú)立性。
4. 什么是字節(jié)碼 采用字節(jié)碼的最大好處是什么
先看下 java 中的編譯器和解釋器:
Java 中引入了虛擬機(jī)的概念托享,即在機(jī)器和編譯程序之間加入了一層抽象的虛擬的機(jī)器骚烧。這臺(tái)虛擬的機(jī)器在任何平臺(tái)上都提供給編譯程序一個(gè)的共同的接口。
編譯程序只需要面向虛擬機(jī)闰围,生成虛擬機(jī)能夠理解的代碼赃绊,然后由解釋器來(lái)將虛擬機(jī)代碼轉(zhuǎn)換為特定系統(tǒng)的機(jī)器碼執(zhí)行。在 Java 中羡榴,這種供虛擬機(jī)理解的代碼叫做字節(jié)碼
(即擴(kuò)展名為 .class
的文件)碧查,它不面向任何特定的處理器,只面向虛擬機(jī)校仑。
每一種平臺(tái)的解釋器是不同的忠售,但是實(shí)現(xiàn)的虛擬機(jī)是相同的。Java 源程序經(jīng)過(guò)編譯器編譯后變成字節(jié)碼迄沫,字節(jié)碼由虛擬機(jī)解釋執(zhí)行稻扬,虛擬機(jī)將每一條要執(zhí)行的字節(jié)碼送給解釋器,解釋器將其翻譯成特定機(jī)器上的機(jī)器碼邢滑,然后在特定的機(jī)器上運(yùn)行腐螟。這也就是解釋了 Java 的編譯與解釋并存的特點(diǎn)愿汰。
Java 源代碼---->編譯器---->jvm 可執(zhí)行的 Java 字節(jié)碼(即虛擬指令)---->jvm---->jvm 中解釋器----->機(jī)器可執(zhí)行的二進(jìn)制機(jī)器碼---->程序運(yùn)行。
采用字節(jié)碼的好處:
Java 語(yǔ)言通過(guò)字節(jié)碼的方式乐纸,在一定程度上解決了傳統(tǒng)解釋型語(yǔ)言執(zhí)行效率低的問(wèn)題衬廷,同時(shí)又保留了解釋型語(yǔ)言可移植的特點(diǎn)。所以 Java 程序運(yùn)行時(shí)比較高效汽绢,而且吗跋,由于字節(jié)碼并不專對(duì)一種特定的機(jī)器,因此宁昭,Java程序無(wú)須重新編譯便可在多種不同的計(jì)算機(jī)上運(yùn)行跌宛。
解釋性語(yǔ)言:解釋型語(yǔ)言,是在運(yùn)行的時(shí)候?qū)⒊绦蚍g成機(jī)器語(yǔ)言积仗。解釋型語(yǔ)言的程序不需要在運(yùn)行前編譯疆拘,在運(yùn)行程序的時(shí)候才翻譯,專門的解釋器負(fù)責(zé)在每個(gè)語(yǔ)句執(zhí)行的時(shí)候解釋程序代碼寂曹。這樣解釋型語(yǔ)言每執(zhí)行一次就要翻譯一次哎迄,效率比較低÷≡玻——百度百科
5. Java和C++的區(qū)別
我知道很多人沒(méi)學(xué)過(guò) C++漱挚,但是面試官就是沒(méi)事喜歡拿咱們 Java 和 C++ 比呀!沒(méi)辦法C煅酢V祭浴!就算沒(méi)學(xué)過(guò)C++侣背,也要記下來(lái)白华!
- 都是面向?qū)ο蟮恼Z(yǔ)言,都支持封裝秃踩、繼承和多態(tài)
- Java 不提供指針來(lái)直接訪問(wèn)內(nèi)存衬鱼,程序內(nèi)存更加安全
- Java 的類是單繼承的,C++ 支持多重繼承憔杨;雖然 Java 的類不可以多繼承鸟赫,但是接口可以多繼承。
- Java 有自動(dòng)內(nèi)存管理機(jī)制消别,不需要程序員手動(dòng)釋放無(wú)用內(nèi)存
6. 什么是 Java 程序的主類 應(yīng)用程序和小程序的主類有何不同
一個(gè)程序中可以有多個(gè)類抛蚤,但只能有一個(gè)類是主類。在 Java 應(yīng)用程序中寻狂,這個(gè)主類是指包含 main()方法的類岁经。而在 Java 小程序中,這個(gè)主類是一個(gè)繼承自系統(tǒng)類 JApplet 或 Applet 的子類蛇券。應(yīng)用程序的主類不一定要求是 public 類缀壤,但小程序的主類要求必須是 public 類樊拓。主類是 Java 程序執(zhí)行的入口點(diǎn)。
7. Java 應(yīng)用程序與小程序之間有那些差別
簡(jiǎn)單說(shuō)應(yīng)用程序是從主線程啟動(dòng)(也就是 main() 方法)塘慕。applet 小程序沒(méi)有main方法筋夏,主要是嵌在瀏覽器頁(yè)面上運(yùn)行(調(diào)用init()線程或者run()來(lái)啟動(dòng)),嵌入瀏覽器這點(diǎn)跟 flash 的小游戲類似图呢。
8. 字符型常量和字符串常量的區(qū)別
- 形式上: 字符常量是單引號(hào)引起的一個(gè)字符 字符串常量是雙引號(hào)引起的若干個(gè)字符
- 含義上: 字符常量相當(dāng)于一個(gè)整形值( ASCII 值),可以參加表達(dá)式運(yùn)算 字符串常量代表一個(gè)地址值(該字符串在內(nèi)存中存放位置)
- 占內(nèi)存大小 字符常量只占2個(gè)字節(jié) 字符串常量占若干個(gè)字節(jié)(至少一個(gè)字符結(jié)束標(biāo)志) (注意: char在Java中占兩個(gè)字節(jié))
9. 構(gòu)造器 Constructor 是否可被 override
在講繼承的時(shí)候我們就知道父類的私有屬性和構(gòu)造方法并不能被繼承条篷,所以 Constructor 也就不能被 override(重寫(xiě)),但是可以 overload(重載),所以你可以看到一個(gè)類中有多個(gè)構(gòu)造函數(shù)的情況。
10. 重載和重寫(xiě)的區(qū)別
重載: 發(fā)生在同一個(gè)類中蛤织,方法名必須相同赴叹,參數(shù)類型不同、個(gè)數(shù)不同指蚜、順序不同乞巧,方法返回值和訪問(wèn)修飾符可以不同,發(fā)生在編譯時(shí)摊鸡。
重寫(xiě): 發(fā)生在父子類中摊欠,方法名、參數(shù)列表必須相同柱宦,返回值范圍小于等于父類,拋出的異常范圍小于等于父類播瞳,訪問(wèn)修飾符范圍大于等于父類掸刊;如果父類方法訪問(wèn)修飾符為 private 則子類就不能重寫(xiě)該方法。
11. Java 面向?qū)ο缶幊倘筇匦?封裝赢乓、繼承忧侧、多態(tài)
封裝
封裝把一個(gè)對(duì)象的屬性私有化,同時(shí)提供一些可以被外界訪問(wèn)的屬性的方法牌芋,如果屬性不想被外界訪問(wèn)蚓炬,我們大可不必提供方法給外界訪問(wèn)。但是如果一個(gè)類沒(méi)有提供給外界訪問(wèn)的方法躺屁,那么這個(gè)類也沒(méi)有什么意義了肯夏。
繼承
繼承是使用已存在的類的定義作為基礎(chǔ)建立新類的技術(shù),新類的定義可以增加新的數(shù)據(jù)或新的功能犀暑,也可以用父類的功能驯击,但不能選擇性地繼承父類。通過(guò)使用繼承我們能夠非常方便地復(fù)用以前的代碼耐亏。
關(guān)于繼承如下 3 點(diǎn)請(qǐng)記谆捕肌:
- 子類擁有父類非 private 的屬性和方法。
- 子類可以擁有自己屬性和方法广辰,即子類可以對(duì)父類進(jìn)行擴(kuò)展暇矫。
- 子類可以用自己的方式實(shí)現(xiàn)父類的方法主之。(以后介紹)。
多態(tài)
所謂多態(tài)就是指程序中定義的引用變量所指向的具體類型和通過(guò)該引用變量發(fā)出的方法調(diào)用在編程時(shí)并不確定李根,而是在程序運(yùn)行期間才確定槽奕,即一個(gè)引用變量倒底會(huì)指向哪個(gè)類的實(shí)例對(duì)象,該引用變量發(fā)出的方法調(diào)用到底是哪個(gè)類中實(shí)現(xiàn)的方法朱巨,必須在由程序運(yùn)行期間才能決定史翘。
在Java中有兩種形式可以實(shí)現(xiàn)多態(tài):繼承(多個(gè)子類對(duì)同一方法的重寫(xiě))和接口(實(shí)現(xiàn)接口并覆蓋接口中同一方法)。