沈益達(dá)Java基礎(chǔ)總結(jié)

? ? ? java是一門強(qiáng)類型語言(變量的使用要嚴(yán)格符合定義,所有變量都必須先定義后使用),java的內(nèi)存結(jié)構(gòu)是棧內(nèi)存、堆內(nèi)存、方法區(qū)。棧(用于局部變量,當(dāng)數(shù)據(jù)使用完,所占空間會(huì)自動(dòng)釋放),堆(存放數(shù)組和對(duì)象,通過new建立實(shí)例,每一個(gè)實(shí)體都具有內(nèi)存地址值,實(shí)體的變量都有默認(rèn)初始化值,實(shí)體不被使用時(shí)會(huì)被垃圾回收器回收)共同特點(diǎn)都具備自己釋放內(nèi)存。Java中描述事物通過類的形式提現(xiàn),類是具體事物的抽象,概念上的定義。在java中只支持單繼承,不支持多繼承{關(guān)于java中多繼承困惑解答(類定義屬性和方法描述某一類事物的抽象,接口定義的是行為并不限于任何具體意向)接口與接口的關(guān)系稱為實(shí)現(xiàn)比稱為繼承更為貼切}。java對(duì)傳輸數(shù)據(jù)操作通過流的方式,用于操作流的對(duì)象都在IO包中。

1.函數(shù)的特點(diǎn):定義函數(shù)可以將功能代碼進(jìn)行封裝,便于對(duì)該功能進(jìn)行復(fù)用(提高代碼復(fù)用性),函數(shù)之間只能調(diào)用函數(shù),不可以在函數(shù)內(nèi)部定義函數(shù)。

2.數(shù)組:數(shù)組就是一個(gè)容器。

3.面向?qū)ο螅ㄈf物皆對(duì)象思想):基于面向過程創(chuàng)立而成,將功能封裝進(jìn)對(duì)象,強(qiáng)調(diào)具備了功能的對(duì)象。它符合人們的思考習(xí)慣,將復(fù)雜的事情簡(jiǎn)單化。面向?qū)ο蠼凶龇椒?,而面向過程叫做函數(shù)。

3.1—封裝(encapsulation):指隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外提供公共的訪問方式,更好的將變化隔離,便于使用,提高重用性和安全性。

3.2—繼承(inheritance):指子類獲得父類非私有屬性和行為,繼承提高了代碼復(fù)用性,讓類與類之間產(chǎn)生關(guān)系,提供了多態(tài)的前提和條件。繼承中存在覆蓋時(shí),子類方法權(quán)限一定要大于等于父類方法權(quán)限。Final可以修飾類、方法、變量,修飾的類不可以被繼承,修飾的方法不可以被覆蓋,修飾的變量是一個(gè)常量,只能被賦值一次,內(nèi)部類只能訪問被final修飾的局部變量。關(guān)于抽象類是具體事物抽取出來的,本身是不具體的,沒有對(duì)應(yīng)的實(shí)例。抽象類與普通類的區(qū)別就是抽象類是用abstract修飾的,抽象類可以有抽象方法也可以有普通方法,抽象類有構(gòu)造器,但是抽象類本身卻不能夠被實(shí)例化,抽象類的構(gòu)造方法就是給子類實(shí)例化時(shí)初始化使用的,因?yàn)槌跏蓟粋€(gè)子類對(duì)象時(shí)會(huì)先調(diào)用super關(guān)鍵字對(duì)父類進(jìn)行初始化。定義抽象類就是為了給子類繼承,所以抽象類不能為final修飾的最終類,抽象方法不能為static,而抽象方法的權(quán)限至少為protected(或者是public)子類可以訪問的。抽象類與接口區(qū)別:接口比抽象類更加抽象,接口中不能有抽象方法,抽象類只有單繼承而接口可以多繼承,接口中只能有public的抽象方法和public的變量。

3.3多態(tài)(polymorphism):指某一類事物的多種存在形態(tài),它的存在提高了程序擴(kuò)展性和后期可維護(hù)性,前提是需要存在繼承或者實(shí)現(xiàn)關(guān)系,而且要有覆蓋操作。

4.異常:throws(標(biāo)識(shí))用在函數(shù)上,后跟著異常類名、throw(拋)用在函數(shù)內(nèi),后面跟著異常對(duì)象。如果在處理異常時(shí),之前執(zhí)行了System.exit(0)操作,那么Finally代碼塊則不會(huì)被執(zhí)行。一個(gè)方法被覆蓋時(shí),方法必須拋出相同的異?;蛘弋惓V悺?br>

5.多線程:通過繼承Thread類方法創(chuàng)建線程,通過實(shí)現(xiàn)Runnable接口創(chuàng)建線程。Wait();和sleep();兩者的區(qū)別:wait釋放這個(gè)線程鎖占用的系統(tǒng)資源到線程池中休息,而線程池的設(shè)計(jì)亨元模式,是自帶隊(duì)列的,如果去找它會(huì)找到后進(jìn)去休息的線程,如果不去找它,它就會(huì)一直線程池中休息,從而占用喜用資源,而sleep是原地休息,不進(jìn)線程池,所以不釋放占用的系統(tǒng)資源。多線程安全問題,多個(gè)線程操作同一片資源的時(shí)候,極可能造成資源數(shù)據(jù)錯(cuò)亂,所以就需要使用到線程同步鎖,同步鎖就是把共享的資源加同步,只有一個(gè)線程能夠?qū)@片數(shù)據(jù)進(jìn)行操作,當(dāng)這個(gè)線程結(jié)束對(duì)數(shù)據(jù)的操作,就會(huì)釋放同步讓別的線程來操作數(shù)據(jù),就不會(huì)造成數(shù)據(jù)的錯(cuò)亂。

? ? ? ?單例設(shè)計(jì)模式就是為了保證一個(gè)類的對(duì)象在內(nèi)存的唯一性,單例設(shè)計(jì)模式有4種方式,其中兩種比較早的方式是餓漢式與懶漢式。餓漢式線程同步效率高,但是在類被加載進(jìn)內(nèi)存時(shí)就會(huì)初始化對(duì)象,因此不能延遲加載(如果這個(gè)對(duì)象占用內(nèi)存資源較多),就會(huì)比較浪費(fèi)資源,并且無法防反射破解。懶漢式是可以達(dá)到延遲加載,但是線程不同步,如果懶漢式加了同步鎖,調(diào)用效率就會(huì)比較低,并且也無法防反射破解。因此有了兩種新的方式取代餓漢式與懶漢式。枚舉式取代了餓漢式,枚舉式就是天然的單例,并且它是由虛擬機(jī)底層創(chuàng)建的,天然防反射破解,調(diào)用效率高,可惜不能延遲加載。私有靜態(tài)內(nèi)部類式取代了懶漢式,定義一個(gè)靜態(tài)內(nèi)部類,需要時(shí)在內(nèi)部類創(chuàng)建外部類對(duì)象,內(nèi)部類創(chuàng)建對(duì)象數(shù)據(jù)局部變量,不會(huì)再類加載時(shí)就被初始化,因此達(dá)到延遲加載,并且線程同步,但是遺憾的是它也無法防反射,只能認(rèn)為的在單例類構(gòu)造器中做些手腳來防止反射破解。

6.集合(Collection):就是對(duì)多個(gè)對(duì)象進(jìn)行操作和存儲(chǔ)。問數(shù)組和集合類同是容器,有何不同?數(shù)組長(zhǎng)度固定且只能存儲(chǔ)基本數(shù)據(jù)類型,而集合長(zhǎng)度可變但只能存儲(chǔ)對(duì)象。它的接口List(列表):可存放重復(fù)元素,元素存取是有序的、Set(集):不可存放重復(fù)元素,元素存放是無序的。ArrayList():線程不安全,查詢速度快、LinkedList:鏈表結(jié)構(gòu),增刪速度快。集合的迭代就是取出集合中的元素的一種方式,Collection中有Iterator方法所以每一個(gè)子類集合對(duì)象都具備迭代器,迭代器在集合接口中是通用的,它替代了Vector類中的Enumeration(枚舉),next方法是自動(dòng)向下取元素,要避免出現(xiàn)NoSuchElementException,返回值類型是Object記得要轉(zhuǎn)換類型。Set集合元素唯一性原因:HashSet通過equals方法和hashCode方法來保證,TreeSet通過compareTo或compare方法來保證。泛型的特點(diǎn)提高了程序安全性,將運(yùn)行期遇到的問題轉(zhuǎn)移到了編譯期,省去了類型強(qiáng)轉(zhuǎn)的麻煩,優(yōu)化了程序的設(shè)計(jì)。Map集合常用類HashMap:線程不安全,速度快,允許存放null值,null鍵、TreeMap:對(duì)鍵進(jìn)行排序,原理與TreeSet相同。

7.IO(Input、Output)流:處理設(shè)備之間數(shù)據(jù)傳輸是通過IO流來完成,按操作數(shù)據(jù)分為:字節(jié)流和字符流,按流向分為:輸入流和輸出流。緩沖區(qū)提高了對(duì)數(shù)據(jù)的讀寫效率。BufferedReader是裝飾設(shè)計(jì),用于增強(qiáng)同一個(gè)體系中的Reader的子類。裝飾設(shè)計(jì)模式中的裝飾類通常跟被裝飾類是在同一個(gè)體系中,但是兩者間不存在直接關(guān)系,都是通過組合、多態(tài)的方式,讓增強(qiáng)類持有被增強(qiáng)類的父類或者接口引用,在需要增強(qiáng)被增強(qiáng)類時(shí),就把被增強(qiáng)類的對(duì)象傳給增強(qiáng)類,裝飾設(shè)計(jì)模式避免了繼承體系膨脹的好處,但是也帶來小對(duì)象過多的弊端。

8.GUI(圖形化界面):事件監(jiān)聽機(jī)制就是確定事件源,通過事件源對(duì)象addXXXXListener()方法接收XXXListener的子類對(duì)象,一般用匿名內(nèi)部類來表示。網(wǎng)絡(luò)通信就是Socket間的通信,Socket是網(wǎng)絡(luò)服務(wù)提供的一種機(jī)制,數(shù)據(jù)在兩個(gè)Socket間通過IO傳輸。


擴(kuò)展內(nèi)容:

? ?在GOF23設(shè)計(jì)模式中接口、組合跟多態(tài)都是一起使用的,例如行為模式中的狀態(tài)模式,設(shè)置一個(gè)狀態(tài)接口,然后許多種狀態(tài)類實(shí)現(xiàn)那個(gè)狀態(tài)接口,真實(shí)對(duì)象持有這個(gè)狀態(tài)接口的引用,真實(shí)對(duì)象再通過多態(tài)達(dá)到不同狀態(tài)的切換。

問:int與Integer的區(qū)別:

int是基本數(shù)據(jù)類型,直接用來存數(shù)值,而Integer是一個(gè)類,int的初始化參數(shù)為0,而Integer是null。

問:泛型有什么作用:

在數(shù)據(jù)類型不明確的時(shí)候可以使用泛型。java是解釋型語言,一個(gè)程序運(yùn)行分兩個(gè)步驟,一個(gè)是編譯時(shí),一個(gè)是運(yùn)行時(shí),而泛型就是在編譯時(shí)進(jìn)行參數(shù)類型的安全檢查,所有的強(qiáng)制類型轉(zhuǎn)換都是自動(dòng)的和隱式的,提高代碼的重用率。泛型不能使用在靜態(tài)屬性跟靜態(tài)的方法上,泛型也不存在多態(tài)。

問:說說暴力反射與反射的區(qū)別:

java的一個(gè)程序運(yùn)行分為運(yùn)行時(shí)和編譯時(shí),反射就是在運(yùn)行時(shí)加載某個(gè)對(duì)象在內(nèi)存中唯一的字節(jié)碼文件,并且獲取該字節(jié)碼文件中的各種屬性,把字節(jié)碼文件中的各種屬性拆分成各種java類, 而暴力反射就是把語言訪問檢查setAccessible開關(guān)設(shè)為true,這樣虛擬機(jī)在反射時(shí)就會(huì)取消安全訪問檢查,提高了反射速度,并且可以對(duì)私有屬性進(jìn)行訪問。

問:正則表達(dá)式的利弊:

正則表達(dá)式用一些符號(hào)對(duì)字符串進(jìn)行操作,簡(jiǎn)化了書寫,但是很多符號(hào)亂糟糟的聚集在一起很大程度降低了閱讀性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容