1. Java環(huán)境配置
??安裝完JDK后配置環(huán)境變量:計算機(jī)→屬性→高級系統(tǒng)設(shè)置→高級→環(huán)境變量。
??1、系統(tǒng)變量→新建 JAVA_HOME 變量。變量值填寫jdk的安裝目錄(本人是 D:\Program Java\jdk1.8.0_60);
??2、系統(tǒng)變量→尋找 Path 變量→編輯,在變量值最后輸入 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;(注意原來Path的變量值末尾有沒有;號,如果沒有,先輸入;號再輸入上面的代碼);
??3、系統(tǒng)變量→新建 CLASSPATH 變量,變量值填寫:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(注意最前面有一點)。
??4、系統(tǒng)變量配置完畢,檢驗是否配置成功 運(yùn)行cmd 輸入 java -version (java 和 -version 之間有空格),顯示版本信息,則說明安裝和配置成功。
2. Java跨平臺的原理
??首先什么是平臺?
??我們把CPU處理器與操作系統(tǒng)的整體叫平臺。 CPU的種類很多,除去我們熟知的Intel與AMD外,還有比如SUN的Sparc,比如IBM的PowerPC等等,這些各個公司生產(chǎn)的CPU使用或相同或不同的指令集。指令集就是cpu中用來計算和控制計算機(jī)系統(tǒng)的一套指令的集合。指令集又分為精簡指令集(RISC)與復(fù)雜指令集(CISC), 每種cpu都有其特定的指令集。開發(fā)程序,首先要知道該程序在什么CPU上運(yùn)行,也就是要知道CPU所使用的指令集。
??操作系統(tǒng)則是充當(dāng)用戶和計算機(jī)之間交互的界面軟件,不同的操作系統(tǒng)支持不同的CPU,嚴(yán)格意義上說是不同的操作系統(tǒng)支持不同CPU的指令集。例如 windows和liunx都支持Intel和AMD的復(fù)雜指令集,但并不支持PowerPC所使用的精簡指令集,而早期的MAC電腦使用的是PowerPC處理器,所以也就無法在MAC下直接安裝windows,直到05年MAC改用了Intel的CPU,才使在MAC下安裝windows成為可能。但問題來了,原來的MAC 操作系統(tǒng)也只支持PowerPC,在Intel上也不能安裝,怎么辦?所以蘋果公司也得重寫自己的MAC操作系統(tǒng)以支持這種變化。最后總結(jié)下,不同的操作系統(tǒng)支持不同的CPU指令集。
??由于各操作系統(tǒng)支持的指令集,不是完全一致的。就會讓我們的程序在不同的操作系統(tǒng)上要執(zhí)行不同程序代碼。Java開發(fā)了適用于不同操作系統(tǒng)及位數(shù)的java虛擬機(jī)來屏蔽各系統(tǒng)之間的差異,提供統(tǒng)一的接口。 對于我們java開發(fā)者而言,你只需要在不同的系統(tǒng)上安裝對應(yīng)的不同java虛擬機(jī)、這時你的java程序只要遵循java規(guī)范,就可以在所有的操作系統(tǒng)上面運(yùn)行java程序了。

??Java通過不同的系統(tǒng)、不同版本、不同位數(shù)的java虛擬機(jī)(jvm),來屏蔽不同的系統(tǒng)指令集差異而對外體統(tǒng)統(tǒng)一的接口(java API),對于我們普通的java開發(fā)者而言,只需要按照接口開發(fā)即可。如果我系統(tǒng)需要部署到不同的環(huán)境時,只需在系統(tǒng)上面按照對應(yīng)版本的虛擬機(jī)即可。

??再說下語言根據(jù)執(zhí)行方式的不同分類:第一是編譯執(zhí)行,如C,它把源程序由特定平臺的編譯器一次性編譯為平臺相關(guān)的機(jī)器碼, 它的優(yōu)點是執(zhí)行速度快,缺點是無法跨平臺;第二是解釋執(zhí)行,如HTML,JavaScript,它使用特定的解釋器,把代碼一行行解釋為機(jī)器碼,類似于同聲翻譯,它的優(yōu)點是可以跨平臺,缺點是執(zhí)行速度慢,暴露源程序;第三種是從Java開始引入的“中間碼+虛擬機(jī)”的方式,它既整合了編譯語言與解釋語言的優(yōu)點,同時如虛擬機(jī)又可以解決如垃圾回收,安全性檢查等這些傳統(tǒng)語言頭疼的問題,所以其后微軟的.NET平臺也使用的這種方式。
??Java先編譯后解釋,同一個.class文件在不同的虛擬機(jī)會得到不同的機(jī)器指令(Windows和Linux的機(jī)器指令不同),但是最終執(zhí)行的結(jié)果卻是相同的。
3. 常見的Java名詞
??EJB:Enterprise Java Bean:Java企業(yè)級容器;
??JMS:Java Message Service:Java消息服務(wù),主要實現(xiàn)各個應(yīng)用程序間的通訊,包括點對點和廣播;
??JTA:Java transaction API:Java事務(wù)服務(wù),提供分布式事務(wù)服務(wù)(只需要調(diào)用接口);
??JAF:Java Action Framwork:Java安全認(rèn)證框架,提供一些安全控制方面的框架;
??JNDI:Java Naming & Directory Interface:Java命名目錄服務(wù);
??RMI:Remote method Invocation/Internet:對象請求中介協(xié)議,主要用于通過遠(yuǎn)程調(diào)用服務(wù)。
??常用工具:
??Javac.exe:編譯源文件(可以沒有main方法);
??Java.exe:運(yùn)行class文件,必須要有main方法入口;
??J2SDK是編譯工具,而不是API;
??Appretriewer.exe:用來解釋執(zhí)行java applet應(yīng)用程序(沒有main函數(shù))。
??DOC下的一些命令:
??Java –version:查看Java開發(fā)工具JDK版本;
??Javac Test.java(Java源文件):編譯Java源文件,生成字節(jié)碼文件Test.class;
??Java Test.class(后綴名.class可以省略);
??Javac去編譯一個含有package語句的java文件要帶參數(shù):javac –d . Java文件名。
4. 面向?qū)ο缶幊痰奶卣?/h2>
??封裝
??封裝是保證軟件部件具有優(yōu)良的模塊性的基礎(chǔ),封裝的目標(biāo)就是要實現(xiàn)軟件部件的“高內(nèi)聚、低耦合”,防止程序相互依賴性而帶來的變動影響。在面向?qū)ο蟮木幊陶Z言中,對象是封裝的最基本單位,面向?qū)ο蟮姆庋b比傳統(tǒng)語言的封裝更為清晰、更為有力。面向?qū)ο蟮姆庋b就是把描述一個對象的屬性和行為的代碼封裝在一個“模塊”中,也就是一個類中,屬性用變量定義,行為用方法進(jìn)行定義,方法可以直接訪問同一個對象中的屬性。把握一個原則:把對同一事物進(jìn)行操作的方法和相關(guān)的方法放在同一個類中,把方法和它操作的數(shù)據(jù)放在同一個類中。
??例如,人要在黑板上畫圓,這一共涉及三個對象:人、黑板、圓,畫圓的方法要分配給哪個對象呢?由于畫圓需要使用到圓心和半徑,圓心和半徑顯然是圓的屬性,如果將它們在類中定義成了私有的成員變量,那么,畫圓的方法必須分配給圓,它才能訪問到圓心和半徑這兩個屬性,人以后只是調(diào)用圓的畫圓方法、表示給圓發(fā)給消息而已,畫圓這個方法不應(yīng)該分配在人這個對象上,這就是面向?qū)ο蟮姆庋b性,即將對象封裝成一個高度自治和相對封閉的個體,對象狀態(tài)(屬性)由這個對象自己的行為(方法)來讀取和改變。
??繼承(extend)
??1、在定義和實現(xiàn)一個類的時候,可以在一個已經(jīng)存在的類的基礎(chǔ)之上來進(jìn)行,把這個已經(jīng)存在的類所定義的內(nèi)容作為自己的內(nèi)容,并可以加入若干新的內(nèi)容,或修改原來的方法使之更適合特殊的需要,這就是繼承。繼承是子類自動共享父類數(shù)據(jù)和方法的機(jī)制,這是類之間的一種關(guān)系,提高了軟件的可重用性和可擴(kuò)展性。
??2、子類最多只能繼承一個父類。
??3、Java所有類都是Object類的子類。
??4、構(gòu)造方法不能被繼承,構(gòu)造方法只能被顯式或隱式調(diào)用,如果希望在子類中調(diào)用父類的構(gòu)造方法,要求在子類的構(gòu)造函數(shù)中調(diào)用super()方法。且必需放在子類構(gòu)造函數(shù)的第一行。
??5、JDK6中有202個包3777個類、接口、異常、枚舉、注釋和錯誤。
??注意幾點:
??1、在一個子類繼承的時候,實際上會繼承父類之中的所有操作(屬性、方法),但是需要注意的是,對于所有的非私有(no private)操作屬于顯式繼承(可以直接利用對象操作),而所有的私有操作屬于隱式繼承(間接完成)。
??2、在繼承關(guān)系之中,如果要實例化子類對象,總是會先調(diào)用父類的構(gòu)造方法,如果子類沒有顯式地指明使用父類的哪個構(gòu)造方法,子類則默認(rèn)調(diào)用無參構(gòu)造方法。(此時若父類自定義了構(gòu)造方法,則沒有無參構(gòu)造方法,會報錯)。
??3、關(guān)于類加載過程中代碼塊的執(zhí)行順序,首先是靜態(tài)代碼塊,是最先執(zhí)行的,且只在加載的時候執(zhí)行一次。構(gòu)造代碼塊在每次new對象的時候于構(gòu)造方法執(zhí)行之前執(zhí)行,即每次調(diào)用構(gòu)造方法都執(zhí)行。即首先執(zhí)行靜態(tài)代碼塊、接著執(zhí)行構(gòu)造代碼塊(非靜態(tài)代碼塊)、最后執(zhí)行構(gòu)造方法。
??在實現(xiàn)繼承的類被new的過程中,初始化執(zhí)行順序如下:1、實現(xiàn)父類的公共靜態(tài)屬性和靜態(tài)塊級代碼。2、實現(xiàn)自身的靜態(tài)屬性和靜態(tài)塊級代碼。3、實現(xiàn)父類的非靜態(tài)屬性和非靜態(tài)代碼塊。4、執(zhí)行父類的構(gòu)造函數(shù)。5、實現(xiàn)自身的非靜態(tài)屬性和非靜態(tài)代碼塊。6、執(zhí)行自身的構(gòu)造函數(shù)。
??多態(tài)
??所謂多態(tài)就是指一個引用(類型)在不同情況下的多種狀態(tài)。也可以這樣理解:多態(tài)是通過指向父類的指針,來調(diào)用在不同子類中實現(xiàn)的方法。
??引用變量所指向的具體類型和通過該引用變量發(fā)出的方法調(diào)用在編程時并不確定,而是在程序運(yùn)行期間才確定,即一個引用變量到底會指向哪個類的實例對象,該引用變量發(fā)出的方法調(diào)用到底是哪個類中實現(xiàn)的方法,必須在由程序運(yùn)行期間才能決定。因為在程序運(yùn)行時才確定具體的類,這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實現(xiàn)上,從而導(dǎo)致該引用調(diào)用的具體方法隨之改變,即不修改程序代碼就可以改變程序運(yùn)行時所綁定的具體代碼,讓程序可以選擇多個運(yùn)行狀態(tài),這就是多態(tài)性。多態(tài)性增強(qiáng)了軟件的靈活性和擴(kuò)展性。
??1、Java允許父類的引用變量引用它的子類的實例(對象)。這種轉(zhuǎn)化是自動完成的。
??2、java實現(xiàn)多態(tài)的機(jī)制靠的是父類或接口定義的引用變量可以指向子類或具體實現(xiàn)類的實例對象,而程序調(diào)用的方法在運(yùn)行期才動態(tài)綁定,就是引用變量所指向的具體實例對象的方法,也就是內(nèi)存里正在運(yùn)行的那個對象的方法,而不是引用變量的類型中定義的方法。
5. Java重載和覆蓋
??重載(overload)
??1、簡單的說:方法重載就是類的同一種功能的多種實現(xiàn)方式,到底采用哪種方式,取決于調(diào)用者給出的參數(shù)。
??2、方法名相同。方法的參數(shù)類型,個數(shù),順序至少有一項不同。
??3、不能通過訪問權(quán)限、返回類型、拋出的異常進(jìn)行重載;
??4、方法返回類型可以不同。但是只是返回類型不一樣,不能夠構(gòu)成重載。我們可以用反證法來說明這個問題,因為我們有時候調(diào)用一個方法時也可以不定義返回結(jié)果變量,即不要關(guān)心其返回結(jié)果,例如,我們調(diào)用map.remove(key)方法時,雖然remove方法有返回值,但是我們通常都不會定義接收返回結(jié)果的變量,這時候假設(shè)該類中有兩個名稱和參數(shù)列表完全相同的方法,僅僅是返回類型不同,java就無法確定編程者到底是想調(diào)用哪個方法了,因為它無法通過返回結(jié)果類型來判斷。
??覆蓋(override)
??簡單的說:方法覆蓋就是子類有一個方法,和父類的某個方法的名稱,返回類型,參數(shù)一樣,那么我們就說子類的這個方法覆蓋了父類的那個方法。
??1、子類的方法的返回類型,參數(shù),方法名稱,要和父類方法的返回類型,參數(shù),方法名稱完全一樣,否則會編譯出錯。
??2、子類方法不能縮小父類方法的訪問權(quán)限。子類方法的訪問權(quán)限只能比父類的更大,不能更小。如果父類的方法是private類型,那么,子類則不存在覆蓋的限制,相當(dāng)于子類中增加了一個全新的方法。
??3、子類覆蓋父類的方法時,只能比父類拋出更少的異常,或者是拋出父類拋出的異常的子異常,因為子類可以解決父類的一些問題,不能比父類有更多的問題。
6. Java訪問修飾符
??java中4中修飾符分別為public、protected、default、private,他們這就說明了面向?qū)ο蟮姆庋b性,所以我們要適用他們盡可能的讓權(quán)限降到最低,從而安全性提高。

??private修飾的屬性或方法為該類所特有,在任何其他類中都不能直接訪問;
??default修飾的屬性或方法具有包訪問特性,同一個包中的其他類可以訪問;
??protected修飾的屬性或方法在同一個包中的其他類可以訪問,同時對于不在同一個包中的子類中也可以訪問;(因此也不能說protected修飾的屬性與方法,在其他包中絕對訪問不到,只要是它的子類就可以)。
??public修飾的屬性或方法外部類中都可以直接訪問。