java基面試礎(chǔ)知識(shí)詳解
1)封裝
就是把同一類事物的屬性和方法歸到同一個(gè)類中,方便使用
防止該類的代碼和數(shù)據(jù)被外部類定義的代碼隨意訪問
要訪問該類的數(shù)據(jù)和代碼必須通過嚴(yán)格的方法控制
封裝的主要功能在于我們能修改自己的實(shí)現(xiàn)代碼,而不用修改哪些調(diào)用程序的代碼片段。
優(yōu)點(diǎn):減少耦合,類內(nèi)部自由修改,可以對類成員變量進(jìn)行更精確的控制,隱藏信息、實(shí)現(xiàn)細(xì)節(jié)。
最佳實(shí)踐:
為了實(shí)現(xiàn)良好的封裝,通常將類的成員變量聲明為private ,通過public的set和get方法完成對屬性的操作
2)繼承
繼承就是子類繼承父類的特征和行為,使得子類對象(實(shí)例)具有父類的實(shí)例域和方法
特性:
子類擁有父類的非private屬性,方法
子類可以擁有自己的屬性和方法,即子類可以對父類進(jìn)行擴(kuò)展
子類可以用自己的方式實(shí)現(xiàn)父類的方法
java的繼承是單繼承
關(guān)鍵字:extends
3)多態(tài)
封裝和繼承幾乎都是為多態(tài)而準(zhǔn)備的
多態(tài)是同一個(gè)行為具有多個(gè)不同表現(xiàn)實(shí)行或形態(tài)的能力
多態(tài)是一個(gè)接口,使用不同的實(shí)例而執(zhí)行不同的操作
多態(tài)存在的三個(gè)必要條件:
繼承
重寫
父類引用指向子類對象
重載和重寫區(qū)別
重寫(Override)
重寫是子類對付類的允許訪問的方法的實(shí)現(xiàn)過程進(jìn)行重新編寫,返回值和形參都不能改變。 子類根據(jù)需要實(shí)現(xiàn)自己的方法
重載(Overload) 是在一個(gè)類里面,方法名字相同,而參數(shù)不同(個(gè)數(shù)和類型不同),返回類型可以相同也可以不同 最常用的就是構(gòu)造器的重載
方法重載是一個(gè)類的多態(tài)性表現(xiàn),而方法重寫是子類與父類的一種多態(tài)性的表現(xiàn)。
重寫發(fā)生在子類和父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的返回類型,比父類被重寫方法更好的訪問,不能比父類被重寫方法聲明更多的異常?!\(yùn)行時(shí)多態(tài)
重寫原則: 參數(shù)列表必須完全與被重寫方法的一致,返回類型必須完全與被重寫的方法的返回類型一致 構(gòu)造方法不能被重寫,聲明為final的方法不能被重寫,聲明為static的方法不能被重寫,但是能夠被再次申明
訪問權(quán)限不能比父類中被重寫的方法的訪問權(quán)限更低。
重寫的父類方法能夠拋出任何非強(qiáng)制異常(也叫非運(yùn)行異常),無論被重寫的方法是否拋出異常,但是,重寫的方法不能拋出新的強(qiáng)制性異常,或者比被重寫方法聲明更廣泛的強(qiáng)制性異常,反之則可以。
多態(tài)的實(shí)現(xiàn)機(jī)制
多態(tài)允許基類(父類)指針或引用指向派生類(子類)的對象,而在具體訪問方法時(shí)實(shí)現(xiàn)動(dòng)態(tài)綁定。
編譯時(shí)多態(tài)(重載)
運(yùn)行時(shí)多態(tài)(重寫)
多態(tài)是針對類的方法而言的,對于類的成員變量是定義的時(shí)候確定的,即編譯的時(shí)候就確定的。
是否可以繼承String類
String是final類型的,所以不能被繼承 java類支持多繼承嗎?可以實(shí)現(xiàn)多個(gè)接口嗎?
java不支持多繼承,但是類可以實(shí)現(xiàn)多個(gè)接口,間接的實(shí)現(xiàn)多繼承,也可以通過內(nèi)部類。
接口和抽象類有什么區(qū)別
接口和抽象類都是繼承樹的上層,他們的共同點(diǎn)如下:
1)都是上層的抽象層
2)都不能夠被實(shí)例化
3)都能包含抽象的方法,這些抽象的方法用于描述類具備的功能
區(qū)別:
在抽象類中可以寫非抽象的方法,從而避免在子類中重復(fù)書寫,提高代碼復(fù)用性–抽象類的優(yōu)勢,而接口當(dāng)中只能有抽象的方法(jdk8之后也可以有實(shí)現(xiàn)方法) 一個(gè)類只能繼承一個(gè)直接父類,這個(gè)父類可以是具體的類也可以是抽象類,但是一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,接口的設(shè)計(jì)具有更大的擴(kuò)展性,而抽象類的設(shè)計(jì)必須十分謹(jǐn)慎。
抽象級(jí)別:接口 大于 抽象類 大于 實(shí)現(xiàn)類
接口的設(shè)計(jì)目的:是針對類的行為進(jìn)行約束,側(cè)重于動(dòng)作,而抽象類的設(shè)計(jì)目的是代碼復(fù)用。 抽象類是 is a的關(guān)系,接口是has a的關(guān)系。
java中修飾符的作用域以及可見性 public :當(dāng)前類、子類,同一包、其他包都可以訪問 protected:當(dāng)前類,子類以及同一包可以訪問,其它包不可以 default:當(dāng)前類和同一包可以訪問,子類和其他包不可以 private:當(dāng)前類可以訪問,同一包、子類、其它包都不可以訪問
==和equals方法的區(qū)別:
兩個(gè)操作用于對象的比較,檢查對象的相等性,但是區(qū)別在與equals是方法,而==是操作符 一般使用==比較原生類型如:boolean、int、char等等,使用equals比較對象 如果兩個(gè)引用指向相同的對象==返回true,equals方法的返回結(jié)果依賴于具體的實(shí)現(xiàn),一般重寫equals方法,也重寫hashcode方法, 字符串的對比使用的是equals代替==操作符
靜態(tài)變量和實(shí)例變量的區(qū)別?
一個(gè)static方法內(nèi)不可以調(diào)用非static方法 因?yàn)榉庆o態(tài)方法是與對象關(guān)聯(lián)在一起的,必須創(chuàng)建一個(gè)對象后,才可以在該對象上進(jìn)行方法調(diào)用,而靜態(tài)方法調(diào)用不需要?jiǎng)?chuàng)建對象,也就是說,當(dāng)一個(gè)靜態(tài)方法被調(diào)用時(shí),如果從一個(gè)static方法中發(fā)出對非static方法的調(diào)用,那么非靜態(tài)方法關(guān)聯(lián)到哪個(gè)對象上呢?這個(gè)邏輯無法成立。
static方法是靜態(tài)方法,是屬于類的方法;
非static方法是屬于對象的方法,所以要想在static方法中調(diào)用非static方法要先創(chuàng)建一個(gè)對象,再由這個(gè)對象來調(diào)用。 本質(zhì)是JVM加載順序決定的,加載static方法的時(shí)候非靜態(tài)方法還沒有初始化,當(dāng)然不能調(diào)用了
靜態(tài)變量和實(shí)例變量的區(qū)別?
1)在語法定義上的區(qū)別:
靜態(tài)變量前要加static關(guān)鍵字,而實(shí)例變量前則不加
2)在程序運(yùn)行時(shí)的區(qū)別:
實(shí)例變量是屬于某個(gè)對象的屬性,必須創(chuàng)建了實(shí)例對象,其中的實(shí)例變量才會(huì)被分配內(nèi)存空間,才可以使用這個(gè)實(shí)例變量 靜態(tài)變量不屬于某個(gè)實(shí)例對象,而是屬于類,所以也稱為類變量,只要程序加載了類的字節(jié)碼,不用創(chuàng)建任何實(shí)例對象,靜態(tài)變量就會(huì)分配內(nèi)存空間,而且只分配一次,靜態(tài)變量就可以被使用了。總之,實(shí)例變量必須創(chuàng)建后才可以通過這個(gè)對象來使用,靜態(tài)變量則直接可以使用類名來調(diào)用。
Integer和int的類型 Integer是int提供的封裝類,從java5之后引入了自動(dòng)裝箱、拆箱機(jī)制,使得兩者可以相互轉(zhuǎn)換,而int是java基本數(shù)據(jù)類型 Integer默認(rèn)值是null,而int默認(rèn)值是0 Integer是對象,用一個(gè)引用指向這個(gè)對象,而int是基本類型,直接存儲(chǔ)數(shù)據(jù)。
Integer提供了好多與整數(shù)相關(guān)的操作方法,例如:將一個(gè)字符串轉(zhuǎn)換成整數(shù)等. Integer會(huì)有緩存
String、StringBuilder、StringBuffer:
1.執(zhí)行速度方面,StringBuilder大于StringBuffer大于String String最慢的原因:String為字符串常量,而StringBuilder和StringBuffer均為字符串變量,即String對象一旦被創(chuàng)建后該對象是不可更改的,但后兩者的對象是變量,是可以更改的
2.線程安全:StringBuilder是線程不安全的,而StringBuffer是線程安全的(StringBuffer中很多方法帶有synchronized關(guān)鍵字)–同步關(guān)鍵字
3.總結(jié):String:適用于少量字符串操作的情況; StringBuilder:適用于在單線程下在字符緩沖區(qū)進(jìn)行大量操作的情況; StringBuffer:適用于在多線程下在字符緩沖區(qū)進(jìn)行大量操作的情況
String中的常用方法有哪些: length()、isEmpty()、split()、toLowerCase()、toUpperCase() subString()、trim()、concat(“abc”)、contains(“a”)
java程序初始化的順序是什么樣子的?
一般遵循三個(gè)原則:
1.靜態(tài)變量優(yōu)先于非靜態(tài)變量初始化,其中靜態(tài)變量只初始化一次,而非靜態(tài)變量可能會(huì)初始化很多次
2.父類優(yōu)先子類進(jìn)行初始化
3.按照成員變量定義順序進(jìn)行初始化,即使變量定義散布于方法之中,它們依然在方法調(diào)用之前(包括構(gòu)造函數(shù))先初始化。 父類靜態(tài)字段初始化 父類靜態(tài)代碼塊 子類靜態(tài)字段初始化 子類靜態(tài)代碼塊 父類普通字段初始化 父類構(gòu)造代碼塊({//代碼}) –優(yōu)先于構(gòu)造函數(shù)執(zhí)行 父類構(gòu)造函數(shù) 子類普通字段初始化 子類構(gòu)造代碼塊 子類構(gòu)造函數(shù)
很明顯的看出,static字段,代碼塊的在執(zhí)行順序優(yōu)先于非sattic、代碼塊,這是因?yàn)殪o態(tài)域是屬于類的,在類加載后就一直存在,而普通域則需要?jiǎng)?chuàng)建對象才能訪問。而在創(chuàng)建對象時(shí),要先加載父類,然后再加載子類,因此父類的靜態(tài)字段初始化和靜態(tài)代碼塊執(zhí)行優(yōu)先于子類
應(yīng)用:單例模式的設(shè)計(jì)(只創(chuàng)建一次對象的目的)
簡單介紹反射機(jī)制?
反射是框架設(shè)計(jì)的靈活 使用的前提條件:必須先得到代表字節(jié)碼的Class,Class類用于表示.class文件(字節(jié)碼)
什么是反射機(jī)制? java反射是在運(yùn)行狀態(tài)中,對任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法,對于任何一個(gè)對象,都能夠調(diào)用它的任意一個(gè)屬性和方法,這種動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對象的方法的功能稱為java的反射機(jī)制
要想剖析一個(gè)類,必須首先獲得該類的字節(jié)碼文件對象,而剖析使用的就是Class類中的方法,所以先要獲得每一個(gè)字節(jié)碼文件對應(yīng)的Class類型的對象
Class是反射的基石
1.Class是一個(gè)類,一個(gè)描述類的類,封裝了描述方法的Method,描述字段的Filed,描述構(gòu)造器的Constructor等屬性,通過反射可以得到類的各個(gè)成分。
2.對于每個(gè)類而言,JRE都為其保留一個(gè)不變的Class類型的對象,一個(gè)Class對象包含了特定某個(gè)類的有關(guān)信息。
3.Class對象只能由JVM創(chuàng)建
4.一個(gè)類在JVM中只有一個(gè)Class實(shí)例 5.反射相關(guān)的類:java.lang.reflect包下
獲取Class對象的三種方式:
1.Object—getClass(); 通過已知對象獲取
2.任何數(shù)據(jù)類型(包括基本數(shù)據(jù)類型)都有一個(gè)靜態(tài)的Class屬性 通過類名.Class
3.通過Class的靜態(tài)方法: Class.forName(String calssName):最常用
應(yīng)用:使用JDBC連接數(shù)據(jù)庫的時(shí)候,都使用的反射,一般都是通過配置文件書寫連接哪個(gè)數(shù)據(jù)庫,比如:mysql、oracle等,以及對應(yīng)的關(guān)鍵信息
簡單來說: 反射就是把各種java類中的各種成分映射成一個(gè)個(gè)的java對象 成員變量、方法、構(gòu)造方法、構(gòu)造方法、包等信息 利用反射技術(shù)可以對一個(gè)類進(jìn)行剖析,把各個(gè)組成部分映射成一個(gè)個(gè)對象 核心類: Class:代表一個(gè)類 Constructor類:代表類的構(gòu)造方法 Filed類:代表類的成員變量 Method:代表類的方法
反射中,Class.forName和classloader的區(qū)別:
相同點(diǎn):java中Class.forName()和classloader都可以用來對類進(jìn)行加載
不同點(diǎn):
class.forName除了將類的.class文件加載到j(luò)vm中之外,還會(huì)對類進(jìn)行解釋,執(zhí)行類中的static塊 而classloader只做一件事情,就是將.class文件加載到j(luò)vm中,不會(huì)執(zhí)行static中的內(nèi)容,只有在newinstance才會(huì)去執(zhí)行static塊。
calssforName(name,initialize,loader)帶參函數(shù)也可以控制是否加載static塊,并且只有調(diào)用了newinstance才會(huì)構(gòu)造函數(shù),來創(chuàng)建類的對象,jvm底層可以控制—–一般不會(huì)干預(yù)
Try catch finally的問題 當(dāng)在try、catch中有return時(shí),finally是否會(huì)執(zhí)行?
總結(jié):
1.不管有沒有異常,finally中的代碼都會(huì)執(zhí)行
2.當(dāng)try、catch中有return語句時(shí),finally中的代碼依然會(huì)繼續(xù)執(zhí)行
3.finally是在return后面的表達(dá)式運(yùn)算之后執(zhí)行的,此時(shí)并沒有返回運(yùn)算后的值,而是把值保存起來,不管finally對該值做了任何改變,返回的值都不會(huì)改變,依然返回保存起來的值,也就是說方法的返回值是在finally運(yùn)算之前就確定了的。
4.如果return的數(shù)據(jù)是引用數(shù)據(jù)類型,而在finally中對該引用數(shù)據(jù)類型的屬性值的改變起作用,try 中return返回的就是finally中改變后的屬性值
5.finally代碼最好不要包含return,程序會(huì)提前退出,也就是說返回的值不是try catch中的值
先執(zhí)行try中的語句,包括return后面的表達(dá)式 有異常時(shí),先執(zhí)行catch中的語句,包括return 后面的表達(dá)式; 然后執(zhí)行fianlly中的語句,如果finally里面有return語句,會(huì)提前退出 最后執(zhí)行try 中的return,有異常執(zhí)行catch中return;
在執(zhí)行try catch 中的return之前一定會(huì)執(zhí)行finally中的代碼(如果finally存在),如果finally中有return語句,就會(huì)執(zhí)行finally中的return方法,所以finally中的return語句一定會(huì)被執(zhí)行的,比那一起吧finally中的retrun語句標(biāo)識(shí)為一個(gè)warning
final、finally、finalize final是最終的意思,表示不能被改變,可用于成員變量、方法和類 修飾變量:變量一旦被初始化不可改變 修飾方法:方法不能被覆蓋 修飾類:類不能夠被繼承
finally:異常處理關(guān)鍵字,finally中的主體總會(huì)執(zhí)行,無論異常發(fā)生與否 finalize:類的finalize方法,可以告訴垃圾回收器應(yīng)該執(zhí)行的操作,該方法從Object繼承而來,在從堆中永久刪除對象之前,調(diào)用該對象的finalize方法
注意:無法確切的保證垃圾回收器何時(shí)調(diào)用該方法,也無法保證調(diào)用不同對象方法的順序,
常見異常:
finally:finally語句塊總是會(huì)被執(zhí)行,它主要用于回收在try中打開的物理資源,如數(shù)據(jù)庫連接,網(wǎng)絡(luò)連接,只有finally執(zhí)行完成之后,才會(huì)回來執(zhí)行try catch 塊中的return語句或者throw語句,如果finally中使用了throw或者return終止方法的語句,則就不會(huì)跳回執(zhí)行,直接終止
throw:拋出異常 throws:用在方法簽名中,用于聲明該方法可能拋出的異常
java中的異??蚣埽?Throwable (Interface) Error Exception RunTimeException
Throwable: 它是java語言中所有錯(cuò)誤或異常的超類 它包含兩個(gè)子類:Error和Exception Throwable包含了其線程創(chuàng)建時(shí)執(zhí)行線程執(zhí)行堆棧的快照,它提供了printStackTrance()等接口用于獲取堆棧跟蹤數(shù)據(jù)信息
Exception 以及子類是Throwable的一種形式,它指出了合理的應(yīng)用程序想要捕獲的條件
3.RuntimeException 是那些可能在java虛擬機(jī)正常運(yùn)行期間拋出的異常的超類 編譯器不會(huì)檢查運(yùn)行時(shí)異常 如果代碼產(chǎn)生RuntimeException,則需要通過修改代碼避免。
Error:和Exception一樣,也是Throwable的子類,它用于指示合理程序不應(yīng)該出現(xiàn)試圖捕獲的嚴(yán)重問題,編譯器也不會(huì)檢查
java異常分為兩類:
1,被檢查的異常(Checked Exception) Exception中除了運(yùn)行時(shí)異常就都稱為編譯異常
2.運(yùn)行時(shí)異常(RuntimeException)—RuntimeException以及其子類 3.錯(cuò)誤(Error) 內(nèi)存溢出
總結(jié)
以上所述是小編給大家介紹的java基面試礎(chǔ)知識(shí)詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
Dubbo?LoadBalance基于權(quán)重的隨機(jī)負(fù)載均衡算法提高服務(wù)性能
這篇文章主要為大家介紹了Dubbo?LoadBalance基于權(quán)重的隨機(jī)負(fù)載均衡算法提高服務(wù)性能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2023-10-10SparkStreaming-Kafka通過指定偏移量獲取數(shù)據(jù)實(shí)現(xiàn)
這篇文章主要為大家介紹了SparkStreaming-Kafka通過指定偏移量獲取數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06Spring AspectJ 實(shí)現(xiàn)AOP的方法你了解嗎
這篇文章主要為大家介紹了Spring AspectJ 實(shí)現(xiàn)AOP的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01MybatisPlus實(shí)現(xiàn)數(shù)據(jù)權(quán)限隔離的示例詳解
Mybatis Plus對Mybatis做了無侵入的增強(qiáng),非常的好用,今天就給大家介紹它的其中一個(gè)實(shí)用功能:數(shù)據(jù)權(quán)限插件,感興趣的可以跟隨小編一起了解下2024-04-04