本套可課程為“使用Java(高清版)如何編寫(xiě)程序教學(xué)視頻”,是java編程指導(dǎo)的好教材,大學(xué)資源網(wǎng)收集、整理。
Java越來(lái)越受到大家的青睞,越來(lái)越多的公司都選擇運(yùn)用Java及其相關(guān)技術(shù),例如J2EE技術(shù)來(lái)構(gòu)建它們的應(yīng)用系統(tǒng)。可是,把握好 Java 語(yǔ)言并不是一件能夠輕松完成的任務(wù),如何真正把握 Java 語(yǔ)言,然后編寫(xiě)出健壯的、高效的、靈敏的程序是Java程序員們面臨的重大挑戰(zhàn)。 《Java編程思想》就是一本能夠讓Java程序員輕松面對(duì)這一挑戰(zhàn),并結(jié)尾取得勝利的經(jīng)典書(shū)籍。本書(shū)淺顯易懂、循序漸進(jìn)地把咱們領(lǐng)入Java的國(guó)際,讓咱們?cè)诓恢挥X(jué)中就學(xué)會(huì)了用 Java 的思想去考慮問(wèn)題、處理問(wèn)題。本書(shū)不僅合適 Java 的初學(xué)者,關(guān)于有經(jīng)歷的Java程序員來(lái)說(shuō),每次閱讀本書(shū)也總是能夠有新的領(lǐng)會(huì),這正是本書(shū)的魅力所在。 本書(shū)的第二版由侯捷先生翻譯,他現(xiàn)已把翻譯原著這項(xiàng)工作做到了極致,咱們?cè)诜g過(guò)程中總是誠(chéng)惶誠(chéng)恐,一方面害怕曲解了原著的意思,另一方面也害怕破壞了第二版譯本現(xiàn)已做出的讓廣闊中國(guó)讀者認(rèn)可本書(shū)的種種努力。 咱們?cè)诜g本書(shū)的過(guò)程中力求終于原著。關(guān)于本書(shū)中出現(xiàn)的大量的專(zhuān)業(yè)術(shù)語(yǔ)盡量遵循標(biāo)準(zhǔn)的譯法,并在有能夠引起歧義之處著上了英文原文,以方便讀者的對(duì)照理解。 全書(shū)的翻譯由陳昊鵬和饒若楠合作完成,薛翔、郭嘉和方小麗也參與了全書(shū)的翻譯工作。由于咱們水平有限,書(shū)中出現(xiàn)錯(cuò)誤與不妥之處在所難免,懇請(qǐng)讀者批評(píng)指正。
Java 已由專(zhuān)業(yè)的 Java 開(kāi)發(fā)人員、設(shè)計(jì)師和愛(ài)好者團(tuán)體進(jìn)行測(cè)試、完善、擴(kuò)展和驗(yàn)證。Java 旨在竭盡所能為最廣泛的計(jì)算平臺(tái)開(kāi)發(fā)可移植的高性能應(yīng)用程序。通過(guò)使應(yīng)用程序在異構(gòu)環(huán)境之間可用,公司能夠提供更多的效勞,提高結(jié)尾用戶(hù)生產(chǎn)力并加強(qiáng)溝通與協(xié)作,然后明顯降低公司和消費(fèi)類(lèi)應(yīng)用程序的擁有成本。Java 是開(kāi)發(fā)人員的無(wú)價(jià)之寶,使他們能夠:
在一個(gè)平臺(tái)上編寫(xiě)軟件,然后即可在幾乎一切其他平臺(tái)上運(yùn)轉(zhuǎn),創(chuàng)立可在 Web 瀏覽器中運(yùn)轉(zhuǎn)并可拜訪可用 Web 效勞的程序,開(kāi)發(fā)適用于在線論壇、存儲(chǔ)、投票、HTML 格式處理以及其他用途的效勞器端應(yīng)用程序
將采用 Java 語(yǔ)言的應(yīng)用程序或效勞組合在一起,構(gòu)成高度定制的應(yīng)用程序或效勞,為移動(dòng)電話、遠(yuǎn)程處理器、微控制器、無(wú)線模塊、傳感器、網(wǎng)關(guān)、消費(fèi)商品及幾乎其他任何電子設(shè)備編寫(xiě)強(qiáng)大而高效的應(yīng)用程序,許多院校已開(kāi)設(shè)了 Java 平臺(tái)程序設(shè)計(jì)課程。Oracle Academy 面向中小學(xué)、職業(yè)教育和高等院校提供了用于教學(xué)的全面的軟件、課程、托管技術(shù)、職工培訓(xùn)、支持和認(rèn)證資源組合,其間包括將支持?jǐn)?shù)十萬(wàn)學(xué)生的 Java 商品。此外,開(kāi)發(fā)人員還能夠通過(guò)下列辦法提高自己的 Java 編程技能:瀏覽 Oracle Java 開(kāi)發(fā)人員 Web 站點(diǎn)、訂閱 Java 技術(shù)簡(jiǎn)報(bào)和 Java 雜志、運(yùn)用 Java 教程和 Java 編程中間新手入門(mén),以及報(bào)名參加 Web 課程、虛擬課程或由教師指導(dǎo)的課程和認(rèn)證。
法使目標(biāo)進(jìn)入正常狀況;假如能夠的話,避免調(diào)用其他辦法”。在結(jié)構(gòu)器內(nèi)唯一能夠安全調(diào)用的那些辦法是基類(lèi)中的final辦法(也適用于private辦法,它們主動(dòng)歸于final辦法)。
30. 接口:一切辦法主動(dòng)為public的,一切的域都是隱式的為static和final的。
31. 協(xié)變返回類(lèi)型:Java SE5中添加了協(xié)變返回類(lèi)型,它表明在導(dǎo)出類(lèi)中的被掩蓋辦法能夠
返回基類(lèi)辦法的返回類(lèi)型的某種導(dǎo)出類(lèi)型。
32. 接口承繼能夠用extends承繼多個(gè)接口,這種extends用法只限于接口承繼。如:
Interface Vampire extends DangerousMonster, Lethal{…} 33. 內(nèi)部類(lèi):在內(nèi)部類(lèi)假如需求生成對(duì)外部類(lèi)目標(biāo)的引證,能夠運(yùn)用外部類(lèi)的名字后面緊跟
圓點(diǎn)和this(如:outerClass.this).要想直接創(chuàng)立內(nèi)部類(lèi)的目標(biāo),你不能按照你想象的辦法,去引證外部類(lèi)的名字,而是必須運(yùn)用外部類(lèi)的目標(biāo)來(lái)創(chuàng)立該內(nèi)部類(lèi)目標(biāo),OuterObject.new Inner();。
假如界說(shuō)一個(gè)匿名內(nèi)部類(lèi),并且期望它運(yùn)用一個(gè)在其外部界說(shuō)的目標(biāo),那么編譯器會(huì)要求其參數(shù)引證是final的。
在匿名內(nèi)部類(lèi)中,假如想要做些結(jié)構(gòu)器的工作,則能夠運(yùn)用實(shí)例初始化。關(guān)于匿名類(lèi)而言,實(shí)例初始化的實(shí)際效果就是結(jié)構(gòu)器,當(dāng)然它受到了限制—你不能重載實(shí)例初始化辦法,所以你僅有一個(gè)這樣的結(jié)構(gòu)器。匿名內(nèi)部類(lèi)既能夠擴(kuò)展類(lèi),也能夠?qū)崿F(xiàn)接口,可是不能兩者兼?zhèn)洹2⑶壹偃缡菍?shí)現(xiàn)接口,也只能實(shí)現(xiàn)一個(gè)接口。 34. 嵌套類(lèi):static 內(nèi)部類(lèi)。一般內(nèi)部類(lèi)不能有static數(shù)據(jù)和static字段,也不能包括嵌套類(lèi)。 35. protected的權(quán)限:只要所屬類(lèi)及其子類(lèi),以及與所屬類(lèi)同一個(gè)包中的類(lèi)能拜訪protected
域或辦法。
36. 在辦法和效果域內(nèi)的內(nèi)部類(lèi)只是限制了其的效果域規(guī)模。超過(guò)這個(gè)規(guī)模就不能拜訪了。 37. 運(yùn)用內(nèi)部類(lèi)最吸引人的原因是:每個(gè)內(nèi)部類(lèi)都能獨(dú)立地承繼自一個(gè)(接口的)實(shí)現(xiàn),所
以無(wú)論外為了是不是現(xiàn)已承繼了某個(gè)(接口的)實(shí)現(xiàn),關(guān)于內(nèi)部類(lèi)都沒(méi)有影響。
38. 格式化輸出:System.out.format()與printf()是等價(jià)的,它們只需求一個(gè)簡(jiǎn)單的格式化字
符串,加上一串參數(shù)即可,每個(gè)參數(shù)對(duì)應(yīng)一個(gè)格式修飾符。
格式化說(shuō)明符:%[argument_index$][flags][width][.precision]conversion Argument_index:能夠指定參數(shù)的方位;
Flags:在默許的情況下,數(shù)據(jù)是右對(duì)齊的,能夠通過(guò)設(shè)置標(biāo)志為“-”來(lái)改變對(duì)齊方向。 With:用來(lái)指明最大尺寸,通過(guò)必要時(shí)添加空格來(lái)確保一個(gè)域至少達(dá)到某個(gè)長(zhǎng)度。 Precision:關(guān)于不一樣的數(shù)據(jù)類(lèi)型,有不一樣的意義。用于String時(shí),表明輸出字符的最大數(shù)量。用于浮點(diǎn)數(shù)時(shí),表明小數(shù)部位要顯示出來(lái)的位數(shù)(默許是6位數(shù)),小數(shù)位過(guò)多舍入,太少則在尾部補(bǔ)0。關(guān)于整數(shù),則會(huì)報(bào)反常。
39. 正則表達(dá)式:其間量詞有三種類(lèi)型:貪婪型,勉強(qiáng)型,占有型。
40. 動(dòng)態(tài)加載:一切的類(lèi)都是在對(duì)其第一次運(yùn)用時(shí),動(dòng)態(tài)加載到JVM中的。當(dāng)程序創(chuàng)立第
一個(gè)對(duì)類(lèi)的靜態(tài)成員的引證時(shí),就會(huì)加載這個(gè)類(lèi)。這個(gè)證明結(jié)構(gòu)器也是類(lèi)的靜態(tài)辦法,即便在結(jié)構(gòu)器之前并沒(méi)有運(yùn)用static關(guān)鍵字。因此,運(yùn)用new操作符創(chuàng)立類(lèi)的新目標(biāo)也會(huì)被當(dāng)?shù)箅y類(lèi)的靜態(tài)成員的引證。因此,Java程序在它開(kāi)端運(yùn)轉(zhuǎn)之前并非被徹底加載,其各個(gè)部分是在必需時(shí)才加載的。
41. 當(dāng)運(yùn)用“.class”來(lái)創(chuàng)立對(duì)Class目標(biāo)的引證時(shí),不會(huì)主動(dòng)地初始化該Class目標(biāo)。為了
運(yùn)用類(lèi)而做的準(zhǔn)備工作實(shí)際上包括三個(gè)步驟:1. 加載,由類(lèi)加載器執(zhí)行,找到Class目標(biāo);2. 連接,驗(yàn)證類(lèi)中字節(jié)碼,為靜態(tài)域分配存儲(chǔ)空間;3. 初始化,假如有超類(lèi),則對(duì)其初始化,執(zhí)行靜態(tài)初始化器和靜態(tài)初始化塊。 假如一個(gè)static final值是“編譯器常量”,那么這個(gè)值不需求對(duì)類(lèi)進(jìn)行初始化就能夠被讀
取。假如只是將一個(gè)域設(shè)置為static和final的,但不是“編譯器常量”時(shí),就需對(duì)類(lèi)進(jìn)行初始化。假如一個(gè)static域不是final的,那么對(duì)它的拜訪,總是要求在它被讀取之前,要先進(jìn)行連接(為這個(gè)域分配存儲(chǔ)空間)和初始化(初始化該存儲(chǔ)空間)。
42. 泛化的Class引證:通過(guò)泛型語(yǔ)法對(duì)Class引證所指向的Class目標(biāo)的類(lèi)型進(jìn)行限制。為
了在運(yùn)用泛化的Class引證時(shí)放松限制,運(yùn)用通配符“?”,這是Java泛型的一部分。 ClassintClass = int.class;為了創(chuàng)立一個(gè)Class引證,它被限制為某種類(lèi)型,或該類(lèi)型的任何子類(lèi)型,你需求將通配符與extends關(guān)鍵字相結(jié)合,創(chuàng)立一個(gè)規(guī)模。Class = int.class. 43. RTTI是編譯時(shí)能夠獲取類(lèi)信息。而反射是運(yùn)轉(zhuǎn)時(shí)獲取類(lèi)信息。RTTI和反射之間的真正的
差異只在于,關(guān)于RTTI來(lái)說(shuō),編譯器在編譯時(shí)打開(kāi)和檢查.class文件按。(換句話說(shuō),咱們能夠用“一般辦法調(diào)用目標(biāo)的一切辦法。”)而關(guān)于反射機(jī)制來(lái)說(shuō),.class文件在編譯時(shí)無(wú)法獲取,所以在運(yùn)轉(zhuǎn)時(shí)打開(kāi)和檢查.class文件。
44. 實(shí)現(xiàn)多線程要實(shí)現(xiàn)Runnable接口并編寫(xiě)run()辦法。或許承繼Thread類(lèi),實(shí)現(xiàn)run()方
法。
45. Java虛擬機(jī)通過(guò)裝載、連接和初始化一個(gè)Java類(lèi)型,使該類(lèi)型能夠被正在運(yùn)轉(zhuǎn)的Java
程序所運(yùn)用。連接階段分為三個(gè)子步驟:驗(yàn)證、準(zhǔn)備和解析。一切的Java虛擬機(jī)實(shí)現(xiàn)必需在每個(gè)類(lèi)或接口首次主動(dòng)運(yùn)用時(shí)初始化,有六種情形:
1) 當(dāng)創(chuàng)立某個(gè)類(lèi)的新實(shí)例時(shí)(new,不明確的創(chuàng)立,反射、克隆或許反序列化); 2) 當(dāng)調(diào)用某個(gè)類(lèi)的靜態(tài)辦法時(shí); 3) 當(dāng)運(yùn)用某個(gè)類(lèi)或接口的靜態(tài)字段,用final修飾的靜態(tài)字段在外,它被初始化為一個(gè)
編譯時(shí)的常量表達(dá)式;
4) 當(dāng)調(diào)用Java API中的某些反射辦法時(shí),比如Class中的辦法或許Java.lang.reflect包中
的類(lèi)辦法;
5) 當(dāng)初始化某個(gè)類(lèi)的子類(lèi)時(shí);
6) 當(dāng)虛擬機(jī)啟動(dòng)時(shí)某個(gè)被標(biāo)明為啟動(dòng)類(lèi)的類(lèi)(含有main()辦法)。 初始化一個(gè)類(lèi)包括兩個(gè)步驟:
1) 假如類(lèi)存在直接超類(lèi)的話,且直接超類(lèi)還沒(méi)有被初始化,就先初始化直接超類(lèi); 2) 假如累存在一個(gè)類(lèi)初始化辦法,就執(zhí)行此辦法。
初始化接口不需求初始化它的父接口,因此初始化一個(gè)接口只需一步:假如接口存在一個(gè)接口初始化辦法的話,就執(zhí)行此辦法。
46. 卸載類(lèi)型:Java虛擬機(jī)中類(lèi)的生命周期和目標(biāo)的生命周期很類(lèi)似。虛擬機(jī)裝載、連接并
初始化類(lèi),使程序能運(yùn)用類(lèi),當(dāng)程序不在引證它們的時(shí)分可選地卸載它們。運(yùn)用啟動(dòng)類(lèi)器裝載的類(lèi)型永久是可觸及的,所以永久不會(huì)被卸載。
47. 運(yùn)用notify()時(shí),在眾多等候同一個(gè)鎖的任務(wù)中只要一個(gè)會(huì)被喚醒,因此假如你期望使
用notify(),就必須保證被喚醒的是恰當(dāng)?shù)娜蝿?wù)。另外,為了運(yùn)用notify(),一切任務(wù)必須等候一樣的條件,由于假如你有多個(gè)任務(wù)在等候不一樣的條件,那么你就不會(huì)曉得是不是喚醒了恰當(dāng)?shù)娜蝿?wù)。假如運(yùn)用notify(),當(dāng)條件發(fā)生變化時(shí),必須只要一個(gè)任務(wù)能夠從中受益。最后,這些限制對(duì)一切能夠存在的子類(lèi)都必須總是起效果的。假如這些規(guī)則中有任何一條不滿足,那么你就必須運(yùn)用notifyAll()而不是notify(). 48. 內(nèi)部類(lèi):
假如想從外部類(lèi)的非靜態(tài)辦法之外的恣意方位創(chuàng)立某個(gè)內(nèi)部類(lèi)的目標(biāo),那么必須像
在main()辦法中那樣,具體地指明這個(gè)目標(biāo)的類(lèi)型:OuterClassName.InnerClassName. 在內(nèi)部類(lèi)中生成對(duì)外部類(lèi)目標(biāo)的引證,能夠運(yùn)用外部類(lèi)的名字后面緊跟圓點(diǎn)和this:
OuterClassName.this; 主動(dòng)創(chuàng)立某個(gè)內(nèi)部類(lèi)的目標(biāo),比如在main辦法中,必選在new
匿名內(nèi)部類(lèi),new ClassConstructor(){};這個(gè)class能夠是一個(gè)虛類(lèi),也能夠是一個(gè)普
通類(lèi)。假如界說(shuō)一個(gè)匿名內(nèi)部類(lèi),并且期望它直接運(yùn)用一個(gè)在其外部界說(shuō)的目標(biāo),那么編譯器會(huì)要求其參數(shù)引證是final的,假如不是匿名內(nèi)部類(lèi)直接運(yùn)用,而是傳給其基類(lèi)的結(jié)構(gòu)器,不需求為final。匿名內(nèi)部類(lèi)與正規(guī)的承繼相比有些受限,由于匿名內(nèi)部類(lèi)既能夠擴(kuò)展類(lèi),也能夠?qū)崿F(xiàn)接口,可是不能兩者兼?zhèn)洌⑶壹偃缡菍?shí)現(xiàn)接口,也只能實(shí)現(xiàn)一個(gè)接口。
49. 嵌套類(lèi):將內(nèi)部類(lèi)聲明為static。一般的內(nèi)部類(lèi)目標(biāo)隱式地保存了一個(gè)引證,指向創(chuàng)立
它的外圍類(lèi)目標(biāo)。要?jiǎng)?chuàng)立嵌套類(lèi)的目標(biāo),并不需求其外圍類(lèi)的目標(biāo)。不能從嵌套類(lèi)的目標(biāo)中拜訪非靜態(tài)的外圍類(lèi)目標(biāo)。
嵌套類(lèi)與一般的內(nèi)部類(lèi)還有一個(gè)差異。一般內(nèi)部類(lèi)的字段與辦法,只要放在類(lèi)的外部層次上,所以一般的內(nèi)部類(lèi)不能有static數(shù)據(jù)和static字段,也不能包括嵌套類(lèi)。可是嵌套類(lèi)能夠包括一切這些東西。
50. 為什么需求內(nèi)部類(lèi)? 從多重承繼的視點(diǎn)來(lái)講:每個(gè)內(nèi)部類(lèi)都能獨(dú)立地承繼自一個(gè)(接
口的)實(shí)現(xiàn),所以無(wú)論外圍類(lèi)是不是現(xiàn)已承繼了某個(gè)(接口的)實(shí)現(xiàn),關(guān)于內(nèi)部類(lèi)都沒(méi)有影響。從這個(gè)視點(diǎn)看,內(nèi)部類(lèi)使得多重承繼的處理方案變得完整。接口處理了部分問(wèn)題,而內(nèi)部類(lèi)有效地實(shí)現(xiàn)了“多重承繼”。也就是說(shuō),內(nèi)部類(lèi)允許承繼多個(gè)非接口類(lèi)型。 51. 局部?jī)?nèi)部類(lèi)與匿名內(nèi)部類(lèi):既然局部?jī)?nèi)部類(lèi)的名字在辦法外是不可見(jiàn)的,那為什么咱們
仍然運(yùn)用局部?jī)?nèi)部類(lèi)而不是匿名內(nèi)部類(lèi)呢?唯一的理由是,咱們需求一個(gè)已命名的結(jié)構(gòu)器,或許需求重載結(jié)構(gòu)器,而匿名內(nèi)部類(lèi)只能用于實(shí)例初始化。所以運(yùn)用局部?jī)?nèi)部類(lèi)而不運(yùn)用匿名內(nèi)部類(lèi)的另一個(gè)理由就是,需求不止一個(gè)該內(nèi)部類(lèi)的目標(biāo)。 52. 通過(guò)運(yùn)用泛型,就能夠在編譯期間防止將錯(cuò)誤類(lèi)型的目標(biāo)放置到容器中。
53. ListIterator是一個(gè)愈加強(qiáng)大的Iterator的子類(lèi)型,它只能用于各種List類(lèi)的拜訪。盡管
Iterator只能向前移動(dòng),可是ListIterator能夠雙向移動(dòng)。
54. 意識(shí)到Arrays.asList()發(fā)生的List目標(biāo)會(huì)運(yùn)用底層數(shù)組作為其物理實(shí)現(xiàn)是很重要的。只要
你執(zhí)行的操作會(huì)修正這個(gè)List,并且你不想原來(lái)的數(shù)組被修正,那么你就應(yīng)該在另一個(gè)容器中創(chuàng)立一個(gè)副本。
55. 一切標(biāo)準(zhǔn)反常類(lèi)都有兩個(gè)結(jié)構(gòu)器:一個(gè)是默許結(jié)構(gòu)器;另一個(gè)是接受字符串作為參數(shù),
以便能把信息放入反常目標(biāo)的結(jié)構(gòu)器。
56. throws,反常說(shuō)明關(guān)鍵字,它歸于辦法聲明的一部分,緊跟在形式參數(shù)列表之后。
57. 有時(shí)期望把剛捕獲的反常從頭拋出,尤其是在運(yùn)用Exception捕獲一切反常的時(shí)分,重
拋反常會(huì)把反常拋給上一級(jí)環(huán)境中的反常處理程序,同一個(gè)try塊的后續(xù)catch子句將被忽略。
58. 運(yùn)轉(zhuǎn)時(shí)反常,其類(lèi)型很多,它們會(huì)主動(dòng)被JAVA虛擬機(jī)拋出,所以不必在反常說(shuō)明中把
它們列出來(lái)。它們也被稱(chēng)為“不受檢查反常”。
59. 當(dāng)掩蓋辦法的時(shí)分,只能拋出在基類(lèi)辦法的反常說(shuō)明里列出的那些反常。 60. 任何根本類(lèi)型都不能作為類(lèi)型參數(shù):不能創(chuàng)立ArrayList之類(lèi)的東西。 61. 總結(jié):泛型代碼與JVM
① 虛擬機(jī)中沒(méi)有泛型,只要一般類(lèi)和辦法。 ② 在編譯階段,一切泛型類(lèi)的類(lèi)型參數(shù)都會(huì)被Object或許它們的限制邊界來(lái)替換。
(類(lèi)型擦除) ③ 在承繼泛型類(lèi)型的時(shí)分,橋辦法的組成是為了避免類(lèi)型變量擦除所帶來(lái)的多態(tài)災(zāi)
難。