抽象類與接口的的區(qū)別
抽象類:用關(guān)鍵字abstract修飾,存在抽象方法的類一定是抽象類疹吃,但抽象類不一定有抽象方法蹦疑,抽象類可以存在成員變量,也可以存在構(gòu)造器用于對(duì)屬性的初始化萨驶,但是抽象類不能被實(shí)例化歉摧,繼承抽象類的子類可以將父類的所有抽象方法實(shí)現(xiàn),也可以選擇性的實(shí)現(xiàn)而將子類繼續(xù)設(shè)定為抽象方法,
接口:用關(guān)鍵字interface聲明叁温,接口中只存在抽象方法再悼,并且存在的屬性全部為public static final類型,且不存在構(gòu)造器膝但,一個(gè)子類可以實(shí)現(xiàn)多個(gè)接口冲九,用implements關(guān)鍵字實(shí)現(xiàn)接口,要將接口中的全部方法實(shí)現(xiàn)锰镀,接口也可以存在繼承關(guān)系娘侍,子類要將實(shí)現(xiàn)的接口的全部方法實(shí)現(xiàn),包括該接口的父類接口中的方法
為什么要有g(shù)et,set方法
set和get方法是面向?qū)ο缶幊讨谐S玫姆N封裝方式泳炉,用于對(duì)類的屬性進(jìn)行訪問(wèn)和修改憾筏。它們的用如下:
1.封裝數(shù)據(jù):set方法用于設(shè)置屬性的值,get方法用于獲取屬性的值花鹅。通過(guò)使用set和get方法氧腰,可以將屬性的訪問(wèn)限制在類的內(nèi)部,避免直接對(duì)屬性進(jìn)行操作刨肃,提高了代碼的安全性和可維護(hù)性古拴。
2.控制訪問(wèn)權(quán)限:set和get方法可以對(duì)屬性的訪問(wèn)進(jìn)行控制。例如真友,可以在set方法中添加一些條件判斷黄痪,對(duì)傳入的值進(jìn)行驗(yàn)證和處理,確保屬性值的有效性盔然。同時(shí)桅打,get方法可以對(duì)屬性的返回值進(jìn)行處理,例如格式化輸出或者進(jìn)行計(jì)算愈案。
3.實(shí)現(xiàn)數(shù)據(jù)封裝:通過(guò)使用set和get方法挺尾,可以將屬性的實(shí)現(xiàn)細(xì)節(jié)隱藏起來(lái),只暴露必要的接口給外部使用站绪。這樣可以提高代碼的封裝性遭铺,減少對(duì)屬性的直接訪問(wèn),降低了類與類之間的耦合度恢准。
4.可以添加額外邏輯:在set和get方法中魂挂,可以添加一些額外的邏輯操作。例如馁筐,在set方法中可以觸發(fā)事件或者通知其他對(duì)象涂召,實(shí)現(xiàn)更復(fù)雜的業(yè)務(wù)邏輯。
總結(jié)眯漩,set和get方法提供了一種良好的封裝方式,使得類的屬性訪問(wèn)更加安全、可控赦抖,并且提供了更好的代碼封裝性和可維護(hù)性舱卡。
向上轉(zhuǎn)型與向下轉(zhuǎn)型
1.向上轉(zhuǎn)型:
父類 : class Fruit {}
子類 : class Apple extends Fruit{}
創(chuàng)建向上轉(zhuǎn)型對(duì)象 fruit ;
Fruit fruit = new Apple();
Apple 向上轉(zhuǎn)型為父類
如果 Apple 中有重寫父類方法,fruit 對(duì)象默認(rèn)調(diào)用子類中重寫方法
注意 :
fruit 可以直接訪問(wèn)子類重寫方法队萤。
fruit 不能直接訪問(wèn)子類私有方法轮锥、子類所有屬性。
fruit 可以通過(guò)重寫方法調(diào)用子類私有方法和屬性
fruit 重寫方法中調(diào)用方法和屬性順序 : 子類 -> 父類
其他 : 關(guān)于重寫的返回值類:如果方法的返回類型是 void和基本數(shù)據(jù)類型要尔,則返回值重寫時(shí)不可修改舍杜。但是如果方法的返回值是引用類型,重寫時(shí)是可以返回該引用類型的子類的赵辕。
2.向下轉(zhuǎn)型
注意 : 只有向上轉(zhuǎn)型過(guò)的對(duì)象才能向下轉(zhuǎn)型
向下轉(zhuǎn)型為恢復(fù)子類所有功能既绩。
Apple apple = (Apple) fruit;
有參構(gòu)造與無(wú)參構(gòu)造的存在情況
有參構(gòu)造函數(shù)和無(wú)參構(gòu)造函數(shù)是面向?qū)ο缶幊讨谐S玫膬煞N構(gòu)造函數(shù)形式。
無(wú)參構(gòu)造函數(shù):指沒有參數(shù)的構(gòu)造函數(shù)还惠,也稱為默認(rèn)構(gòu)造函數(shù)饲握。它在創(chuàng)建對(duì)象時(shí)不需要傳入任何參數(shù),可以直接使用默認(rèn)的屬性值進(jìn)行對(duì)象的初始化蚕键。無(wú)參構(gòu)造函數(shù)通常用于創(chuàng)建對(duì)象時(shí)不需要額外信息的情況救欧。
有參構(gòu)造函數(shù):指帶有參數(shù)的構(gòu)造函數(shù)。它在創(chuàng)建對(duì)象時(shí)需要傳入相應(yīng)的參數(shù)锣光,用于初始化對(duì)象的屬性值笆怠。有參構(gòu)造函數(shù)可以根據(jù)傳入的參數(shù)不同,靈活地初始化對(duì)象的屬性誊爹。有參構(gòu)造函數(shù)通常用于創(chuàng)建對(duì)象時(shí)需要額外信息的情況蹬刷。
有參構(gòu)造函數(shù)和無(wú)參構(gòu)造函數(shù)可以同時(shí)存在于一個(gè)類中,也可以只存在其中一種替废。如果一個(gè)類中沒有定義任何構(gòu)造函數(shù)箍铭,編譯器會(huì)自動(dòng)生成一個(gè)默認(rèn)的無(wú)參構(gòu)造函數(shù)。如果在類中定義了有參構(gòu)造函數(shù)椎镣,但沒有定義無(wú)參構(gòu)造函數(shù)诈火,那么在創(chuàng)建對(duì)象時(shí)必須顯式地傳入?yún)?shù),否則會(huì)編譯
錯(cuò)誤状答。
總結(jié):
無(wú)參構(gòu)造函數(shù):不需要傳入?yún)?shù)冷守,使用默認(rèn)的屬性值進(jìn)行對(duì)象初始化。
有參構(gòu)造函數(shù):需要傳入?yún)?shù)惊科,根據(jù)參數(shù)的不同進(jìn)行對(duì)象初始化拍摇。
在平時(shí)寫代碼的過(guò)程中,要么無(wú)參構(gòu)造和有參構(gòu)造都寫馆截,要么都不寫蜂莉。
方法的重寫與重載
方法的重寫是子類重新定義父類中已經(jīng)存在的方法,方法名稱混卵、參數(shù)列表和返回類型必須相同,實(shí)現(xiàn)多態(tài)幕随。
方法的重載是在同一個(gè)類中定義多個(gè)具有相同名稱但參數(shù)列表不同的方法,根據(jù)參數(shù)類型和數(shù)量確定調(diào)用哪個(gè)方法辕录。
重寫與重載的區(qū)別:
1.方法重載是發(fā)生在同一個(gè)類中,而方法重寫是發(fā)生在子類和父類之間梢卸;
2.方法重載要求:方法名相同低剔、但參數(shù)類型或參數(shù)個(gè)數(shù)不同速梗;方法重寫:方法名、返回值類型和參數(shù)列表都相同
3.方法重載是用于相同的方法名稱不同的問(wèn)題襟齿;方法重寫是因?yàn)楦割惖哪硞€(gè)方法不滿足子類的要求姻锁,所以對(duì)該方法進(jìn)行重寫
比較字符串用==還是equal
”==”是用來(lái)比較字符串的引用地址,而equals()才是比較字符串的值猜欺。兩個(gè)值相同的字符串用”==”比較結(jié)果有可能是false位隶,而用equals()則一定為true。除非兩個(gè)字符串是同一個(gè)new出來(lái)的對(duì)象开皿,不然比較字符串值是否相同應(yīng)該要用equals()涧黄。
==是運(yùn)算符,equal是方法
總結(jié):
1.java基本類型(short赋荆,int笋妥,long,byte窄潭,char春宣,float,double嫉你,boolean)
比較基本類型月帝,只能用==,不能用equal幽污,這里的==比較的是兩個(gè)變量的值
2.比較包裝類型
==比較的是內(nèi)存地址嚷辅,因?yàn)閍和b是new出來(lái)的,是兩個(gè)不同的對(duì)象距误,所以地址肯定是不同的簸搞,而equal比較的是值
3.比較String類型
==比較的是內(nèi)存地址扁位,equal比較的是值
4.比較對(duì)象
==和equal比較的都是內(nèi)存地址,因?yàn)閑qual沒有被重寫趁俊,沒有被重寫的equal都是object的equal方法
創(chuàng)建字符串的2種方式的區(qū)別
1.采用直接賦值的方式賦值
eg:? String str1 = "abc";
采用這種方法去創(chuàng)建字符串時(shí)贤牛,JVM會(huì)在方法區(qū)的字符串常量池中尋找這個(gè)字符串是否存在,如果存在則不去創(chuàng)建则酝,讓創(chuàng)建的對(duì)象直接引用其在字符串常量池中的地址;如果不存在則在字符串常量池中創(chuàng)建這個(gè)字符串并且返回這個(gè)字符串在常量池中的地址闰集。
2.采用new關(guān)鍵字新建一個(gè)字符串對(duì)象
eg:? String str2 = new String("abc");
采用new關(guān)鍵字新建一個(gè)字符串對(duì)象時(shí)沽讹,JVM首先在字符串池中查找有沒有"abc"這個(gè)字符串如果有,則不在池中再去創(chuàng)建"abc"這個(gè)對(duì)象了武鲁,直接在堆中創(chuàng)建一個(gè)"abc"字符串對(duì)象爽雄,然后將堆中的這個(gè)"abc"對(duì)象的地址返回賦給引用str,這樣沐鼠,str就指向了堆中創(chuàng)建的這個(gè)"abc"字符串對(duì)象挚瘟;如果沒有,則首先在字符串池中創(chuàng)建一個(gè)"abc"字符串對(duì)象饲梭,然后再在堆中創(chuàng)建一個(gè)"abc"字符串對(duì)象乘盖,然后將堆中這個(gè)"abc"字符串對(duì)象的地址返回賦給str引用,這樣憔涉,str指向了堆中創(chuàng)建的這個(gè)"abc"字符串對(duì)象订框。
注意:這種方法本質(zhì)是在堆區(qū)引用字符串常量池中的地址,每次new的對(duì)象兜叨,在堆上都會(huì)創(chuàng)建一個(gè)新的對(duì)象指向常量池穿扳。
?這兩種方法創(chuàng)建出的字符串雖然內(nèi)容是一樣的,但指向是不一樣的国旷。str1和str3直接指向的是常量池的地址矛物,str2指向堆的地址。
總結(jié):new創(chuàng)建出的對(duì)象指向均不相等跪但,字符串的創(chuàng)建無(wú)論是哪種方式履羞,都需要先在字符串常量池中尋找該字符串是否存在。
數(shù)組的動(dòng)態(tài)初始化與靜態(tài)初始化
數(shù)組的初始化:數(shù)組元素類型[] 數(shù)組名=new 數(shù)組元素類型[]{元素1特漩,元素2.....} 吧雹;
數(shù)組的初始化:?數(shù)組元素類型[] 數(shù)組名={元素1,元素2.....} 涂身;
foreach
使用?for each?循環(huán)來(lái)遍歷數(shù)組或集合中的元素雄卷。for each?循環(huán)也被稱為增強(qiáng)型?for?循環(huán)。
?for each?循環(huán)的基本語(yǔ)法:
for (元素類型 變量名 : 數(shù)組或集合) {
? ? // 執(zhí)行循環(huán)體操作
}
for each遍歷二維數(shù)組:
for(元素類型 [ ] 過(guò)渡一維數(shù)組名 : 二維數(shù)組名){
????for(元素類型 變量名 :?過(guò)渡一維數(shù)組名){
? ? ? ? ? ? ? // 執(zhí)行循環(huán)體操作
????}
}
Arrylist是否有序
ArrayList:(有序蛤售、可重復(fù)的)
創(chuàng)建集合:ArrayList 集合名=new ArrayList();
獲取元素:get(int index)
替換元素:set(int index,Object element)
添加元素:add(添加一個(gè)元素)? ? ? addAll(將指定集合中的所有元素都添加到當(dāng)前集合中)
刪除元素:remove(刪除集合中的指點(diǎn)元素)? ? ? ? removeAll(刪除指定集合中的所有元素)
將集合元素順序翻轉(zhuǎn):reverse(List list)
將集合元素按自然順序排列:sort(List list)
判斷是否包含元素:contains(判斷集合中是否包含某個(gè)元素)? ? ? containsAll(判斷集合中是否包含指定集合中所有元素)
HashSet:(無(wú)序丁鹉、不可重復(fù))