一、jdk jre jvm之間的關(guān)系
jdk: 開(kāi)發(fā)工具包晴埂,如果你要開(kāi)發(fā)java程序究反,必須安裝jdk
jre: Java的運(yùn)行環(huán)境,如果測(cè)試運(yùn)行Java環(huán)境必須安裝jre
jvm: Java虛擬機(jī)儒洛,實(shí)現(xiàn)Java跨平臺(tái)的核心
jdk 包含 jre 包含 jvm
二精耐、Java運(yùn)行過(guò)程
Java程序→javac編譯 成class→通過(guò)類(lèi)加載器去加載class文件→Java命令去運(yùn)行Java程序
三、gc: 垃圾回收琅锻,一個(gè)程序去運(yùn)進(jìn)行卦停,是需要在電腦內(nèi)存中去運(yùn)行,涉及到申請(qǐng)內(nèi)存和釋放內(nèi)存恼蓬,有了gc程序就不需要手動(dòng)去釋放內(nèi)存了
四惊完、類(lèi)和對(duì)象
1,什么是面向?qū)ο螅?什么是面型過(guò)程处硬?
面向?qū)ο螅涸陂_(kāi)發(fā)過(guò)程中专执,注重的是誰(shuí)能幫我去完成這件事,有對(duì)象用對(duì)象郁油,沒(méi)有對(duì)象創(chuàng)建一個(gè)對(duì)象(點(diǎn)外賣(mài))
優(yōu)點(diǎn):復(fù)用性更高本股,容易維護(hù)和擴(kuò)展;缺點(diǎn):開(kāi)銷(xiāo)比較大
面向過(guò)程:注重的是中間的過(guò)程桐腌,每一個(gè)步驟都需要自己去完成
優(yōu)點(diǎn):開(kāi)銷(xiāo)必面向?qū)ο笮≈粝裕阅芨咭稽c(diǎn);缺點(diǎn):不容易擴(kuò)展和維護(hù) (自己做飯 )
怎么去創(chuàng)建一個(gè)對(duì)象案站? 類(lèi)名 對(duì)象名=new 類(lèi)名()
類(lèi)和對(duì)象是面向?qū)ο蠓椒ǖ暮诵母拍罟蟆n?lèi)是對(duì)一類(lèi)事物的描述,是抽象的蟆盐,概念上的定義承边;對(duì)象是實(shí)際存在的該類(lèi)事物的每個(gè)個(gè)體,因而也稱(chēng)實(shí)例石挂。開(kāi)發(fā)偶成中注重類(lèi)的設(shè)計(jì)博助。(汽車(chē)圖紙,汽車(chē)實(shí)例)
類(lèi)與對(duì)象的關(guān)系:類(lèi)就是對(duì)象的描述痹愚,對(duì)象就是該類(lèi)的實(shí)例
五富岳、成員變量和局部變量的區(qū)別:
1蛔糯,定義的位置不同
成員變量定義在類(lèi)的內(nèi)部,方法之外
局部變量定義在方法的內(nèi)部
2窖式,作用域不同
成員變量作用在類(lèi)的內(nèi)部
局部變量作用在方法的內(nèi)部
3蚁飒,默認(rèn)值不同
成員變量有默認(rèn)值
局部變量沒(méi)有默認(rèn)值
4,內(nèi)存位置不同
成員變量保存在堆里面
局部變量保存在棧里面
5萝喘,成員變量的訪問(wèn)修飾符有四個(gè): public(公共) protected(受保護(hù)的) 缺省 private(私有的)
局部變量沒(méi)有訪問(wèn)修飾符
六淮逻、什么是構(gòu)造方法,構(gòu)造方法的作用
在我們java中有時(shí)候會(huì)使用一個(gè)特殊的方法叫構(gòu)造方法阁簸,也叫構(gòu)造器
構(gòu)造方法最最大的作用就是創(chuàng)建對(duì)象爬早,就我們new的時(shí)候就是調(diào)用了構(gòu)造方法
七、如何創(chuàng)建構(gòu)造方法强窖?
public 構(gòu)造方法名(參數(shù)){ }
注意:
1.構(gòu)造方法不能定義返回值
2.構(gòu)造方法名必須和你類(lèi)的名字一致,大小寫(xiě)也得一致
構(gòu)造方法也是一個(gè)方法削祈,那么可以進(jìn)行方法重載嗎翅溺?
可以
構(gòu)造方法的作用:
1.無(wú)參構(gòu)造方法就是創(chuàng)建對(duì)象
2.有參構(gòu)造方法就是在創(chuàng)建對(duì)象的同時(shí)給屬性賦值
注意:
如果在定義一個(gè)類(lèi)時(shí)候,我沒(méi)有去定義構(gòu)造方法髓抑,系統(tǒng)默認(rèn)會(huì)提供一個(gè)無(wú)參的構(gòu)造方法
如果你定義了構(gòu)造方法咙崎,系統(tǒng)將不會(huì)在提供無(wú)參構(gòu)造方法
重點(diǎn):如果你定義了有參構(gòu)造方法,一定要加上無(wú)參構(gòu)造方法
七吨拍、參數(shù)
形參:在方法定義的時(shí)候?qū)嶋H定義的參數(shù)褪猛,寫(xiě)在方法小括號(hào);里面的參數(shù)
實(shí)參:在調(diào)用方法的時(shí)候羹饰,實(shí)際傳入到方法里面的數(shù)據(jù)
參數(shù)傳遞過(guò)程中伊滋,有兩項(xiàng)規(guī)則
1,對(duì)于基本數(shù)據(jù)類(lèi)型來(lái)說(shuō)队秩,形參的操作不會(huì)影響實(shí)參
2笑旺,對(duì)于引用數(shù)據(jù)類(lèi)型來(lái)說(shuō),形參的操作會(huì)影響實(shí)參馍资,因?yàn)閭魅氲氖嵌牙锩娴牡刂吠仓鳎螀⒑蛯?shí)參指向的是同一塊地址值
八、封裝性
1鸟蟹,什么是封裝性乌妙?
把屬性通過(guò)方法封裝起來(lái),因?yàn)槲覀冎苯硬僮鲗傩缘臅r(shí)候可能會(huì)出現(xiàn)一些不符合實(shí)際情況的問(wèn)題建钥,封裝起來(lái)以后藤韵,在方法里面加入邏輯對(duì)屬性限制。
2熊经,面向?qū)ο蟮牡谝淮筇卣鳎悍庋b性
當(dāng)我創(chuàng)建完對(duì)象以后荠察,如果直接通過(guò)“對(duì)象名.屬性”的方式進(jìn)行賦值的話置蜀,可能會(huì)出現(xiàn)不符合實(shí)際情況的問(wèn)題,所以我們不考慮使用“對(duì)象名.屬性名”的方式進(jìn)行賦值悉盆,而是創(chuàng)建一個(gè)方法盯荤,通過(guò)"對(duì)象名.方法名"的方式進(jìn)行賦值,因?yàn)槲覀兛梢栽诜椒ɡ锩鎸?xiě)大量的業(yè)務(wù)邏輯限制屬性值焕盟。
3秋秤,如何使用封裝
將屬性私有化 private
提供對(duì)應(yīng)的get 和set 方法,獲取屬性值和給屬性賦值
4脚翘,封裝的好處
隱藏一個(gè)類(lèi)中不需要對(duì)外提供的實(shí)現(xiàn)細(xì)節(jié)灼卢;使用者只能通過(guò)事先定制好的方法來(lái)訪問(wèn)數(shù)據(jù),可以方便的加入控制邏輯来农,限制對(duì)屬性的不合理操作鞋真;便于修改,增強(qiáng)代碼的可維護(hù)性沃于;安全性更好
5涩咖,面向?qū)ο蟮牡诙筇卣鳎豪^承性?
1.什么是繼承繁莹?允許子類(lèi)擁有父類(lèi)的屬性和行為
2.優(yōu)點(diǎn):提高了代碼的復(fù)用性
缺點(diǎn):就是類(lèi)和類(lèi)之間的耦合度變高了
3.繼承的語(yǔ)法
class 子類(lèi) extends 父類(lèi){
}
4.繼承的特點(diǎn)
(1).子類(lèi)繼承父類(lèi)以后檩互,父類(lèi)聲明的屬性和行為子類(lèi)都可以獲取 父》兒子
(2).子類(lèi)除了通過(guò)繼承獲取了父類(lèi)的屬性和方法外,還可以自己定義獨(dú)有的屬性和方法 師父》徒弟
子類(lèi)的功能永遠(yuǎn)比父類(lèi)多
(3).java是單繼承的咨演,一個(gè)子類(lèi)只能繼承一個(gè)父類(lèi),一個(gè)父類(lèi)可以有多個(gè)子類(lèi)
一個(gè)子類(lèi)可以在派生一個(gè)子類(lèi)嗎闸昨?可以 新派生的子類(lèi)同時(shí)可以獲取學(xué)生類(lèi)里面的獨(dú)有屬性和方法,
還可以或人類(lèi)里面的屬性和方法 孫子>父親>爺爺
5.方法重寫(xiě):如果父類(lèi)的方法體滿足不了子類(lèi)要求薄风,子類(lèi)可以重寫(xiě)父類(lèi)的方法
? ? 要求:
? ? (1)子類(lèi)重寫(xiě)父類(lèi)的方法饵较,要求方法名、形參列表遭赂、返回值類(lèi)別必須和父類(lèi)一致
? ? (2)子類(lèi)重寫(xiě)的方法的訪問(wèn)修飾符權(quán)限不能低于父類(lèi)的訪問(wèn)修飾符
? ? (3)子類(lèi)方法和父類(lèi)方法必須同為static或者非static
常見(jiàn)面試題*
方法重載(overload)和方法重寫(xiě)(override)的區(qū)別
(1).方法重載要求方法名相同告抄、形參列表必須不同(參數(shù)個(gè)數(shù)、類(lèi)型嵌牺、類(lèi)型的順序)和返回值無(wú)關(guān)
(2).方法重寫(xiě)要求方法名打洼、形參列表、返回值類(lèi)型必須和父類(lèi)一致逆粹,訪問(wèn)修飾符不能小于父類(lèi)的
(3).方法重載必須在同一個(gè)類(lèi)里面進(jìn)行重載
(4).方法重寫(xiě)必須存在繼承關(guān)系,發(fā)生在子類(lèi)和父類(lèi)之間
九募疮、運(yùn)行一段程序,申請(qǐng)電腦內(nèi)存僻弹,內(nèi)存都是jvm進(jìn)行管理的
內(nèi)存會(huì)分為五部分:
1阿浓,棧(stack):主要就是存放局部變量
2,堆(Heap):new出來(lái)的東西都在堆里面蹋绽,在對(duì)堆里面的變量都是成員變量芭毙,都會(huì)要默認(rèn)值
整數(shù):默認(rèn)值為0筋蓖;
浮點(diǎn)數(shù)默認(rèn)值為0.0
字符默認(rèn)是空格
布爾默認(rèn)是false
引用類(lèi)型默認(rèn)是null
3, 方法區(qū)(Method Area):存放class文件
4,本地方法區(qū):(Native Method Area):與操作系統(tǒng)有關(guān)
5退敦,寄存器(pc Register):與cup有關(guān)
十粘咖、final關(guān)鍵字
可以修飾什么?
1.類(lèi)
2.方法
3.成員變量
4.局部變量
修飾類(lèi)侈百,代表這個(gè)類(lèi)是一個(gè)最終類(lèi)
這個(gè)類(lèi)不能被繼承瓮下,但是可以繼承別的類(lèi)
修飾方法,就是一個(gè)最終方法
這個(gè)方法不能被重寫(xiě)
修飾成員變量钝域,成員變量的值不可改變
1.成員變量不會(huì)再有默認(rèn)值
2.如果加了final關(guān)鍵字讽坏,需要對(duì)成員變量直接賦值
修飾局部變量,局部變量就變成了一個(gè)常量
一旦賦值不可改變
十一例证、什么是多態(tài)路呜?
1,多態(tài)的理解
(1)同一個(gè)動(dòng)作作用于不同的對(duì)象產(chǎn)生的不同的行為(多種形態(tài))
(2)多態(tài)就是一個(gè)對(duì)象的多種形態(tài)(金毛是寵物也是狗)
2织咧,多態(tài)的體現(xiàn)方式
(1)基于繼承的實(shí)現(xiàn)胀葱,不同的子類(lèi)重寫(xiě)了父親方法以后體現(xiàn)的不同形式
(2)接口的實(shí)現(xiàn)
3,以下都是多態(tài)的條件
(1)繼承:子類(lèi)去繼承父類(lèi) Dog extends Pet
(2) 重寫(xiě):子類(lèi)重寫(xiě)父類(lèi)的方法
(3)重載:同一個(gè)方法名烦感,根據(jù)形參不同巡社,實(shí)現(xiàn)的功能也不同
(4)子類(lèi)對(duì)象的多態(tài)性:父類(lèi)的引用指向子類(lèi)
4膛堤,多態(tài)的類(lèi)型
(1)編譯時(shí)的多態(tài):方法的重載(在編譯期間手趣,請(qǐng)用相同的方法名根據(jù)不同的參數(shù)列表來(lái)確定調(diào)用的是哪個(gè)方法)
(2)運(yùn)行時(shí)的多態(tài):方法的重寫(xiě)(只有在運(yùn)行期間在能確定使用的對(duì)象類(lèi)型,才能確定變量的引用指向哪個(gè)實(shí)例)
十二、程序分為兩種狀態(tài): 編譯狀態(tài)肥荔,運(yùn)行狀態(tài)
對(duì)于多態(tài)來(lái)說(shuō)绿渣,編譯時(shí)看左邊,會(huì)把PI變量看成是pet類(lèi)類(lèi)型燕耿;運(yùn)行時(shí)看右邊中符,真正執(zhí)行的對(duì)象,也就是子類(lèi)對(duì)象誉帅,執(zhí)行的就是子類(lèi)重寫(xiě)后的方法
十三淀散、向上轉(zhuǎn)型和向下轉(zhuǎn)型
向上轉(zhuǎn)型:將子類(lèi)對(duì)象交給父類(lèi)的引用,可以自動(dòng)類(lèi)型轉(zhuǎn)換
向下轉(zhuǎn)型:把父類(lèi)轉(zhuǎn)成子類(lèi)蚜锨,需要強(qiáng)制類(lèi)型轉(zhuǎn)換
十四档插、super關(guān)鍵字和this關(guān)鍵字的區(qū)別?*
this調(diào)用本類(lèi)中的屬性亚再,也就是類(lèi)中的成員變量郭膛;
super關(guān)鍵字可以修飾屬性、方法氛悬、構(gòu)造方法
1.當(dāng)子類(lèi)和父類(lèi)的屬性名同名時(shí)则剃,默認(rèn)會(huì)使用子類(lèi)的屬性吧耘柱,咱們可以通過(guò)
"super.屬性名"調(diào)用父類(lèi)的屬性
2.子類(lèi)重寫(xiě)父類(lèi)方法后,如果子類(lèi)想再次調(diào)用父類(lèi)重寫(xiě)前的方法棍现,可以super.方法名
調(diào)用父類(lèi)重寫(xiě)前的方法
3.super修飾構(gòu)造方法调煎,通過(guò)在子類(lèi)構(gòu)造方法中使用"super(形參)"來(lái)顯示的調(diào)用父類(lèi)的構(gòu)造方法
(1)super()必須放在構(gòu)造方法的首行
(2)在構(gòu)造方法內(nèi)部"this(形參)"或"super(形參)"只能出現(xiàn)一個(gè)
(3)在構(gòu)造方法中,如果不顯示的使用"super(形參)"的方式調(diào)用父類(lèi)對(duì)應(yīng)的構(gòu)造方法轴咱,默認(rèn)會(huì)
調(diào)用父類(lèi)的構(gòu)造方法汛蝙,只是給你隱藏掉了
Object:所有的類(lèi)都繼承Object
十五、
面試重點(diǎn):==和equals的區(qū)別朴肺?
1窖剑,= =: 比較運(yùn)算符,
(1)可以在基本數(shù)據(jù)類(lèi)型和引用數(shù)據(jù)類(lèi)型中使用
(2)如果比較基本數(shù)據(jù)類(lèi)型的話戈稿,比較的是比較的是兩個(gè)變量的值是否相等
(3)如果比較引用數(shù)據(jù)類(lèi)型的話西土,比較的是兩個(gè)對(duì)象的地址值是否相等
2,equals()的使用
(1)equals 是一個(gè)方法
(2)只能對(duì)引用書(shū)庫(kù)類(lèi)型比較
(3)object類(lèi)里面是這么定義的
public boolean equals (object obj){
return(this = = obj);
}
發(fā)現(xiàn)它還是通過(guò)= = 進(jìn)行補(bǔ)繳的兩個(gè)對(duì)象鞍盗。object定義的兩個(gè)方法和= = 的作用一樣需了,實(shí)際比較的是兩個(gè)對(duì)象的地址值是否相等
(4)像String,Date,File, 包裝類(lèi)等等都重寫(xiě)了equals方法般甲,沖刺額以后的比較的不是地址肋乍,而是兩個(gè)對(duì)象的“實(shí)體內(nèi)容”是否相等
(5)通常情況下,我們自己定義的類(lèi)是沒(méi)有重寫(xiě)equals方法的敷存,如果比較兩個(gè)對(duì)象的實(shí)體內(nèi)容是否相等墓造,我們需要重寫(xiě)equals方法,一般情況下都會(huì)進(jìn)行重寫(xiě)
重寫(xiě)原則:比較兩個(gè)對(duì)象的實(shí)體內(nèi)容是否相等锚烦,如果沒(méi)有重寫(xiě)觅闽,沒(méi)有區(qū)別,如果重寫(xiě)了涮俄,那么equals比較的是兩個(gè)內(nèi)容是否相等
十六蛉拙,List 和Set 的區(qū)別:
都是collection子接口
list:存儲(chǔ)有序的,可以重復(fù)的數(shù)據(jù)彻亲,以數(shù)組為底層實(shí)現(xiàn)
set:存儲(chǔ)無(wú)序的孕锄,不可重復(fù)的數(shù)據(jù),以map為底層實(shí)現(xiàn)
十七苞尝,三種遍歷方式:
1畸肆,迭代器,Iterator, hasnext() 和 next()
Collection coll = new SrrayList();
coll.add(1);
coll.add(“name”);
Iterator i = coll.iterator();
while(i.hasnext()){
System.out.println(i.next());
}
2, 增強(qiáng)for循環(huán)
for(Object o:coll){
System.out.priltln(o);
}
3,把集合轉(zhuǎn)成數(shù)組
Object [ ] objects = new.toArray();
for(object o:objects){
System.out.pritln(o);
}
十八野来,
ArrayrList 恼除、LinkedList 、Vector
相同點(diǎn):
1,都是list集合的實(shí)現(xiàn)類(lèi)
2豁辉,存在數(shù)據(jù)的特點(diǎn)相同:有序的令野,可重復(fù)的
不同點(diǎn):
1,ArraryList:主要實(shí)現(xiàn)類(lèi)徽级,底層就是數(shù)組 Object[] elementData, 線程不安全气破,查詢速度比較快
2,LinkedList: 底層使用雙向鏈條的形式進(jìn)行存儲(chǔ)的餐抢,添加现使、刪除速度高
3,Vector:是list接口的古老實(shí)現(xiàn)類(lèi)旷痕,線程安全的碳锈,效率比較低,Object[] elementData