雖然做了很久的開發(fā),但是總是覺得自己基礎(chǔ)不太牢固,對一些東西有些模糊,重新回顧一下以前可能沒有注意到的知識點(不定期更新)
局部變量和成員變量得區(qū)別
1.定義位置上的區(qū)別
成員變量定義在方法體之外,類之內(nèi)
局部變量定義在方法體之內(nèi)
2.作用上的區(qū)別
成員變量描述一個對象的公共屬性
局部變量只是在方法內(nèi)使用
3.生命周期的區(qū)別
成員變量的生命周期跟隨對象的生命周期
局部變量跟隨方法的周期,方法執(zhí)行時到創(chuàng)建成員變量的地方被創(chuàng)建,方法執(zhí)行完畢時候馬上從內(nèi)存中消失
4.初始值的區(qū)別
成員變量都會有默認的初始值,如int 的初始值為0,boolean 的初始值為false float的初始值為0.0f
局部變量是沒有默認的初始值的,在調(diào)用之前必須先進行初始化。否則編譯器會報錯。
匿名對象注意事項和應(yīng)用場景
1我們一般不給匿名對象的某個屬性賦予屬性值,因為不可能調(diào)用得到。
2兩個匿名對象在內(nèi)存中指向不同的內(nèi)存地址,不==
應(yīng)用場景
如果對象需要調(diào)用一個方法,而且調(diào)用完這個方法之后,該對象就不再使用了,這時候使用匿名對象比較合適。
封裝的作用
1.隱藏內(nèi)部實現(xiàn),外部只需調(diào)用即可
2.提高數(shù)據(jù)的安全性
構(gòu)造代碼塊與構(gòu)造函數(shù)
構(gòu)造代碼塊對所有對象進行統(tǒng)一的初始化(先于構(gòu)造函數(shù)執(zhí)行)
構(gòu)造函數(shù)對對應(yīng)的對象進行初始化
this關(guān)鍵字
如果存在同名的成員變量與局部變量,在方法內(nèi)部默認是訪問局部變量的數(shù)據(jù),可以通過this關(guān)鍵字訪問到成員變量。
在構(gòu)造函數(shù)中可以調(diào)用另一個構(gòu)造函數(shù)初始化對象。
this關(guān)鍵字不能在構(gòu)造函數(shù)中相互調(diào)用,因為這樣是一個死循環(huán)。
如果在一個方法中訪問到一個變量,并且該變量只存在于成員變量中,編譯器會自動添加this關(guān)鍵字以訪問成員變量。
static關(guān)鍵字
靜態(tài)數(shù)據(jù)的生命周期:靜態(tài)代碼塊是在class文件加載到內(nèi)存中的時候執(zhí)行, 不用等到創(chuàng)建對象,所以靜態(tài)的數(shù)據(jù)優(yōu)先于對象而存在。靜態(tài)成員是隨類的加載而創(chuàng)建,隨類文件的消失而消失,。非靜態(tài)成員隨對象的創(chuàng)建而創(chuàng)建,隨gc回收而消失。
static聲明的成員變量存在于方法區(qū)的靜態(tài)數(shù)據(jù)共享區(qū),不在堆內(nèi)存和棧內(nèi)存,只在方法區(qū)維護一份,非靜態(tài)的成員變量在每個對象中都會維護一份。
static修飾的方法,可以通過對象或者類名進行調(diào)用(一般直接使用類名訪問),而非靜態(tài)函數(shù)只能通過對象進行調(diào)用。靜態(tài)方法不能訪問非靜態(tài)的變量,和方法(非靜態(tài)的函數(shù)和變量以及this和super都是依賴于對象而存在,調(diào)用靜態(tài)方法的時候?qū)ο蟛灰欢ㄒ呀?jīng)存在了。而對象存在的時候靜態(tài)變量等早已在類加載的時候已經(jīng)存在)。
靜態(tài)函數(shù)不能出現(xiàn)this或super關(guān)鍵字
super關(guān)鍵字
當(dāng)子類和父類存在同名的成員(包括屬性和方法)時候,子類默認訪問自己的成員??梢酝ㄟ^super調(diào)用父類的對應(yīng)成員
創(chuàng)建子類對象時候會默認會先調(diào)用表父類的無參構(gòu)造方法,可以通過super制定調(diào)用父類的某個構(gòu)造方法。
重寫與重載
1 方法重寫時候方法名與形參列表必須一致
2 .重寫時子類權(quán)限修飾符要大于或等于父類權(quán)限修飾符
3.子類返回值類型要小與或等于父類返回值類型
4.重寫時候子類拋出的異常要小與或等于父類拋出的異常 |Exception最大
重載
1.函數(shù)名要一致
2.形參列表不一致(形參的個數(shù)或類型要不一致)
3.與返回值類型無關(guān)
instanceof關(guān)鍵字
作用:判斷一個對象是否屬于指定的類別(一般進行強制類型轉(zhuǎn)換之前可以判斷一下。如果false強制類型轉(zhuǎn)換必然是會拋出異常的)
判斷對象與指定類別需要存在繼承或?qū)崿F(xiàn)的關(guān)系
final關(guān)鍵字
1、修飾一個基本類型的變量時候,該變量不能被重新賦值,第一次的賦值則為最終的。
2、修飾一個引用類型的變量時候,該變量不能重新指向新的對象。(如果修飾數(shù)組或者其他容器類型時候紙指向的地址不能改變,但是數(shù)組的內(nèi)部是可以發(fā)生改變 的)
3、修飾一個函數(shù)的時候,該函數(shù)不能被重寫
4、修飾一個類的時候,該類不能被繼承 如String
interface
1.接口算是一個特殊的類
2.接口的成員變量默認的修飾符 public static final
3.接口中的方法都是抽象方法,默認修飾符為 public abstract
4.接口沒有構(gòu)造方法
5.接口不能創(chuàng)建對象
6.非抽象類實現(xiàn)接口必須實現(xiàn)接口的所有方法。
作用
1、程序解耦
2、拓展功能
3、定義規(guī)范
多態(tài)
父類的引用類型指向子類對象或者是接口的引用類型指向?qū)崿F(xiàn)了接口的類的對象
前提:繼承 重寫 向上轉(zhuǎn)型
多態(tài)情況下子類父類存在相同成員時候,訪問的是父類的,只有存在同名非靜態(tài)的函數(shù)才是訪問的子類的。且不能訪問子類特有的成員。(實在要訪問可以強制類型轉(zhuǎn)換)
內(nèi)部類
1.內(nèi)部類可以訪問外部類的所有成員
2.如果外部類與內(nèi)部類存在同名的成員,默認訪問的是內(nèi)部類的。如果想要訪問外部類的,可以用外部類.this.變量訪問到。
3.內(nèi)部類中如果出現(xiàn)了static成員。則他自己也要用static修飾
4.如果局部內(nèi)部類(方法中的內(nèi)部類)中訪問到了一個局部變量。則這個局部變量需要用final修飾(防止方法執(zhí)行完畢的時候變量被回收。而局部內(nèi)部類的生命周期比局部變量長,它需要等到gc回收。)
線程
運行狀態(tài)下的線程調(diào)用sleep或者wait方法,線程會進入臨時阻塞狀態(tài),如果是調(diào)用的sleep,線程一旦超過sleep指定的時間將會進入可運行狀態(tài),如果是調(diào)用的wait方法,需要其他的線程喚醒該線程才可以重新進入可運行狀態(tài)。

線程中的成員變量需要聲明為static共享給多個線程對象使用,否則在多個線程對象中各自有一份改成員變量。
出現(xiàn)線程安全的原因:存在兩個或2個以上的線程對象,而且他們共享著一個資源。
有多個語句操作了共享資源。
解決方案:同步代碼塊(或者同步方法)
注意事項
1.任意一個對象都可以作為鎖對象,鎖對象必須是唯一的
2.在同步代碼塊中調(diào)用sleep方法是不會釋放鎖的
3.只有真正存在線程安全問題的時候才需要同步代碼塊,否則會降低效率。
wait與notify方法,注意事項
1.他們都是屬于Object對象的。
2.他們必須在同步代碼塊或者同步函數(shù)中才能調(diào)用。
3.必須由他們的鎖對象調(diào)用。
wait():一個線程如果調(diào)用了wait方法,那么該線程會進入一個以鎖對象為標(biāo)識符的線程池中等待。
notify():如果一個線程調(diào)用了notify方法,那么會喚醒以鎖對象標(biāo)識符的線程池中的等待線程中的一個。
集合
----collection
----List 特點:有序,可重復(fù)。
---------ArrayList 底層維護的是一個Object數(shù)組(內(nèi)存地址連續(xù)),查詢快,增刪慢
---------LinkedList 底層是鏈表實現(xiàn) ,增刪快,查詢慢
---------Vector 與ArrayList原理相同,但是是線程安全的,效率略低
----Set
---------HashSet 底層(哈希表)實現(xiàn)。特點 :存取快。
注意 :往里面添加元素的時候會調(diào)用hashCode獲得哈希值,再經(jīng)過運算得到它在哈希表中的位置。(如果得到的位置還沒有元素,則直接存入,如果已經(jīng)有元素了,會再調(diào)用equals方法)
---------TreeSet 底層使用紅黑樹數(shù)(二叉樹)數(shù)據(jù)結(jié)構(gòu)實現(xiàn)。如果元素具備自然順序,則會按照自然順序進行順序存儲。如果不具備排序能力,可以通過讓要比較的類實現(xiàn)Comparable接口。在compareTo方法中實現(xiàn)排序規(guī)則?;蛘呓oTreeSet傳入自己的比較器(自己創(chuàng)建一個類,實現(xiàn)Compartor接口)。
---------LinkedHashSet
----Map
----HashMap 底層基于哈希表實現(xiàn)。和hashset一樣,調(diào)用見的hashcode得到元素哈希值。如果不存在該元素,則放入,如果已存在,則調(diào)用equals方法進行比較。如果返回false則進行存儲,否則被視為重復(fù)元素。后出現(xiàn)的會覆蓋前面的Map的值。
----TreeMap 底層基于二叉樹。對鍵進行排序。
----HashTable 與HashMap特點差不多。不過是線程安全的。
泛型
函數(shù)上泛型的定義格式如
public <泛型聲明> 返回值類型 函數(shù)名(泛型 變量名){}
public <T>T getData(T data){ return data;}
泛型類
修飾符 格式 class 類名<泛型>{
}
1.聲明為泛型類的時候創(chuàng)建對象需要傳入泛型的具體類型,如果不指定默認為Object
2.類聲明的泛型只使用用非靜態(tài)方法。靜態(tài)函數(shù)需要獨立聲明。因為靜態(tài)優(yōu)先于對象存在,所以類中的靜態(tài)方法需要單獨進行泛型聲明
泛型接口
interface 名稱<泛型>{}
注意,使用接口時候應(yīng)明確具體類型或者在該類也使用泛型聲明。
待續(xù)。。。