最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Java-八股文-基礎(chǔ)本部分<一>

2023-07-01 14:39 作者:編程小宇e  | 我要投稿

??1. 解釋下什么是面向?qū)ο螅棵嫦驅(qū)ο蠛兔嫦蜻^(guò)程的區(qū)別?

? ? ? ? ?面向過(guò)程就是分析出解決問(wèn)題所需要的步驟,然后用函數(shù)把這些步驟一步一步實(shí)現(xiàn),使用的時(shí)候一個(gè)一個(gè)依次調(diào)用就可以了;面向?qū)ο笫前褬?gòu)成問(wèn)題事務(wù)分解成各個(gè)對(duì)象,建立對(duì)象的目的不是為了完成一個(gè)步驟,而是為了描敘某個(gè)事物在整個(gè)解決問(wèn)題的步驟中的行為。


面向過(guò)程的設(shè)計(jì)思路就是首先分析問(wèn)題的步驟,面向?qū)ο笫且怨δ軄?lái)劃分問(wèn)題,而不是步驟。


? ? ? ? 面向過(guò)程 :優(yōu)點(diǎn):性能比面向?qū)ο蟾撸驗(yàn)轭愓{(diào)用時(shí)需要實(shí)例化,開(kāi)銷比較大,比較消耗資源;比如單片機(jī)、嵌入式開(kāi)發(fā)、 Linux/Unix等一般采用面向過(guò)程開(kāi)發(fā),性能是最重要的因素。

缺點(diǎn):沒(méi)有面向?qū)ο笠拙S護(hù)、易復(fù)用、易擴(kuò)展


? ? ? ? 面向?qū)ο螅?優(yōu)點(diǎn):易維護(hù)、易復(fù)用、易擴(kuò)展,由于面向?qū)ο笥蟹庋b、繼承、多態(tài)性的特性,可以設(shè)計(jì)出低耦合的系統(tǒng),使系統(tǒng) 更加靈活、更加易于維護(hù)

缺點(diǎn):性能比面向過(guò)程低


??2. 面向?qū)ο蟮娜筇匦??分別解釋下?

? ? ? ? 面向?qū)ο蟮娜筇卣鞣庋b,繼承,多態(tài)。封裝,封裝說(shuō)明一個(gè)類方法和屬性與其他類的關(guān) 系,繼承是父類和子類的關(guān)系,多態(tài)說(shuō)的是類與類的關(guān)系。


? ? ? ? 封裝隱藏了類的內(nèi)部實(shí)現(xiàn)機(jī)制,對(duì)外界而已它的內(nèi)部細(xì)節(jié)是隱藏的,暴露給外界的只是它的訪問(wèn)方法,保護(hù)了數(shù)據(jù),限制對(duì)屬性的 不合理操作;


? ? ? ? 繼承是從已有的類中派生出新的類,新的類能繼承父類的屬性和方法,并能擴(kuò)展新的能力。Java通過(guò)extends關(guān)鍵字來(lái)實(shí)現(xiàn)繼承,父類中通過(guò)private定義的變量 和方法不會(huì)被繼承。


? ? ? ? 多態(tài)必備三個(gè)要素:繼承,重寫(xiě),父類引用指向子類對(duì)象(多態(tài)性不適用于屬性)。子類共同的操作可以先由父類來(lái)聲明占坑,然后 由不同的子類分別實(shí)現(xiàn),增加了代碼的復(fù)用性。? ? ? ??


??3. JDK、JRE、JVM 三者之間的關(guān)系?

JVM(Java虛擬機(jī))是整個(gè)java實(shí)現(xiàn)跨平臺(tái)的最核心的部分,能夠運(yùn)行以Java寫(xiě)作的軟件程序。


JRE 是運(yùn)行JAVA程序所必須的環(huán)境的集合。


JDK 針對(duì)Java開(kāi)發(fā)員的產(chǎn)品且Java的核心,包括Java運(yùn)行環(huán)境JRE、Java工具和Java基礎(chǔ)類庫(kù)。


JDK包含JRE,而JRE包含JVM;


? ? ? ? JDK是用于java程序的開(kāi)發(fā),而JRE則是只能運(yùn)行class而沒(méi)有編譯的功能,所編譯的class文件都必須通過(guò)JVM去執(zhí)行字節(jié)碼文件。java的特點(diǎn)之一是跨平臺(tái),它不是JAVA跨平臺(tái),而是JVM跨平臺(tái),在不同的操作系統(tǒng)上有不同的jvm虛擬機(jī),因jvm,java有著**“一處執(zhí)行,處處執(zhí)行**”的特點(diǎn)。

??4. 重載和重寫(xiě)的區(qū)別?

? ? ? ? 方法的重載和重寫(xiě)都是實(shí)現(xiàn)多態(tài)的方式,區(qū)別在于前者實(shí)現(xiàn)的是編譯時(shí)的多態(tài)性,而后者實(shí)現(xiàn)的是運(yùn)行時(shí)的多態(tài)性。重載發(fā)生在一個(gè)類中,同名的方法如果有不同的參數(shù)列表(參數(shù)類型不同、參數(shù)個(gè)數(shù) 不同或者二者都不同)則視為重載;重寫(xiě)發(fā)生在子類與父類之間,重寫(xiě)要求子類被重寫(xiě)方法與父類被重寫(xiě)方法有相同的返回類型,比父類被重寫(xiě)方法更好訪問(wèn),不能比父類被重寫(xiě)方法聲明更多的異常(里氏代換原則)。重載對(duì)返回類型 沒(méi)有特殊的要求。


? ? ? ? 方法重載的規(guī)則: 1.方法名一致,參數(shù)列表中參數(shù)的順序,類型,個(gè)數(shù)不同。 2.重載與方法的返回值無(wú)關(guān),存在于父類和子類,同類中。 3.可以拋出不同的異常,可以有不同修飾符


? ? ? ? 方法重寫(xiě)的規(guī)則: 1.參數(shù)列表必須完全與被重寫(xiě)方法的一致,返回類型必須完全與被重寫(xiě)方法的返回類型一 致。 2.構(gòu)造方法不能被重寫(xiě),聲明為 final 的方法不能被重寫(xiě),聲明為 static 的方法不能被重寫(xiě),但是能夠被再次聲明。 3.訪問(wèn)權(quán)限不能比父類中被重寫(xiě)的方法的訪問(wèn)權(quán)限更低。 4.重寫(xiě)的方法能夠拋出任何非強(qiáng)制異常(UncheckedException,也叫非運(yùn)行時(shí)異常),無(wú)論被重寫(xiě)的方法是否拋出異常。但是,重寫(xiě)的方法不能拋出新的強(qiáng)制性異常,或者比被重寫(xiě)方法聲明的更廣 泛的強(qiáng)制性異常,反之則可以。

??5. Java 中是否可以重寫(xiě)一個(gè) private 或者 static 方法?

? ? ? ? java中的static方法是不可以被覆蓋的,因?yàn)榉椒ǜ采w是基于運(yùn)行時(shí)的動(dòng)態(tài)綁定的,而static方法編譯時(shí)是靜態(tài)綁定的,static方法類的任何事例都不相關(guān)聯(lián)。

? ? ? ? java中也不可以覆蓋private權(quán)限的方法,因?yàn)閜rivate修飾變量只能在當(dāng)前類內(nèi)部使用,其他類繼承當(dāng)前類的時(shí)候,訪問(wèn)不到private變量,不能覆蓋!


??6. 構(gòu)造方法有哪些特性?

1.首先說(shuō)一下java語(yǔ)言構(gòu)造方法的特點(diǎn)


? ? ? ? 方法名與類名相同


? ? ? ? 沒(méi)有返回類型


2.然后是構(gòu)造方法和成員方法的區(qū)別


? ? ? ? A:格式區(qū)別


? ? ? ? ? ? ? ? 構(gòu)造方法和類名相同,并且沒(méi)有返回類型,也沒(méi)有返回值


? ? ? ? ? ? ? ? 普通成員方法可以任意起名,必須有返回類型,可以沒(méi)有返回值


? ? ? ? B:作用區(qū)別


? ? ? ? ? ? ? ? 構(gòu)造方法用于創(chuàng)建對(duì)象,并進(jìn)行初始化值,對(duì)象一建立就自動(dòng)調(diào)用相對(duì)應(yīng)的構(gòu)造函數(shù)


? ? ? ? ? ? ? ? 普通成員方法是用于完成特定功能的


? ? ? ? C:調(diào)用區(qū)別


? ? ? ? ? ? ? ? 構(gòu)造方法是在創(chuàng)建對(duì)象時(shí)被調(diào)用的,一個(gè)對(duì)象建立,只調(diào)用一次相應(yīng)構(gòu)造函數(shù)


? ? ? ? ? ? ? ? 普通成員方法是由創(chuàng)建好的對(duì)象調(diào)用,可以調(diào)用多次


3. 最后是構(gòu)造方法的注意事項(xiàng):


? ? ? ? A. 如果一個(gè)自定義類沒(méi)有構(gòu)造方法,系統(tǒng)會(huì)默認(rèn)給出一個(gè)無(wú)參構(gòu)造方法。


? ? ? ? B. 如果一個(gè)自定義類提供了構(gòu)造方法,那么,系統(tǒng)將不再給出無(wú)參構(gòu)造方法。


這個(gè)時(shí)候,你可以不使用無(wú)參構(gòu)造方法。如果你想使用,那么,就必須手動(dòng)給出無(wú)參構(gòu)造方法。需要注意的是,一般情況下,我們的自定義類都要手動(dòng)給出無(wú)參構(gòu)造方法。

?


??7. 在 Java 中定義一個(gè)不做事且沒(méi)有參數(shù)的構(gòu)造方法有什么作用?

(1)子類實(shí)例化對(duì)象時(shí),必定會(huì)調(diào)用自己的構(gòu)造方法,在自己的構(gòu)造方法中又必定會(huì)調(diào)用父類的構(gòu)造方法(默認(rèn)調(diào)用父類的無(wú)參構(gòu)造方法)。

(2)如果父類沒(méi)有任何構(gòu)造方法,那么不會(huì)報(bào)編譯上的錯(cuò)誤,因?yàn)橄到y(tǒng)會(huì)贈(zèng)送父類一個(gè)無(wú)參構(gòu)造方法,但如果父類有帶參數(shù)的構(gòu)造方法,那么系統(tǒng)不會(huì)贈(zèng)送父類無(wú)參構(gòu)造方法了,那么子類中如果沒(méi)有使用super()調(diào)用父類的有參構(gòu)造方法,會(huì)報(bào)編譯上的錯(cuò)誤。

(3)解決方法就是在父類上添加一個(gè)無(wú)參構(gòu)造方法,那么子類在實(shí)例化對(duì)象時(shí),直接默認(rèn)調(diào)用父類的無(wú)參構(gòu)造方法,不會(huì)產(chǎn)生編譯上的問(wèn)題。

? ? ? ? 因此一個(gè)不做事且沒(méi)有參數(shù)的構(gòu)造方法的作用就是讓子類繼承父類的時(shí)候能夠默認(rèn)調(diào)用無(wú)參構(gòu)造方法順利實(shí)例化父類對(duì)象,而不至于產(chǎn)生編譯上的錯(cuò)誤。在調(diào)用子類構(gòu)造方法之前會(huì)先調(diào)用父類的無(wú)參構(gòu)造方法,目的是幫助子類完成初始化工作。


??8. Java 中創(chuàng)建對(duì)象的幾種方式?

4種創(chuàng)建對(duì)象的方法:

? ? ? ? 使用 new 關(guān)鍵字調(diào)用對(duì)象的構(gòu)造器;

? ? ? ? 使用 Java 反射的 newInstance() 方法;

? ? ? ? 使用 Object 類的 clone() 方法;

? ? ? ? 使用對(duì)象流 ObjectInputStream的readObject()方法讀取序列化對(duì)象;

1、使用 new 關(guān)鍵字

最常見(jiàn)的Java 對(duì)象的構(gòu)造方法,通過(guò)調(diào)用類提供的構(gòu)造器創(chuàng)建對(duì)象。


2、使用 newInstance() 方法

Java 反射中有一個(gè) newInstance() 方法,可以創(chuàng)建對(duì)象,步驟如下:獲取要?jiǎng)?chuàng)建的類的 Class 對(duì)象。如果只需要調(diào)用這個(gè)類的訪問(wèn)權(quán)限為 public 無(wú)參構(gòu)造器,直接使用 Class 類的實(shí)例方法 newInstance()。獲取 Class 對(duì)象的構(gòu)造器對(duì)象,通過(guò)調(diào)用 Class 類的實(shí)例方法 getDeclaredConstractors() 來(lái)獲取構(gòu)造器對(duì)象的數(shù)組。(獲取所有構(gòu)造器,無(wú)視訪問(wèn)權(quán)限的限制,數(shù)組順序按照代碼中的順序決定)如果調(diào)用的構(gòu)造器是 private 的,需要調(diào)用 Constractor 類的父類 AccessibleObject 類的實(shí)例方法 setAccessible(true) 來(lái)打破訪問(wèn)限制。使用 Constractor 類的實(shí)例方法 newInstance()。獲取 Class 對(duì)象的方法有3個(gè),此處不多贅述。獲取Constractor 對(duì)象的方法有4個(gè),此處不多贅述。


3、使用 clone() 方法

Object 類是所有類的直接或間接父類,Object 類中提供了 實(shí)例方法 native(),在給定對(duì)象的基礎(chǔ)上,創(chuàng)建一個(gè)完全相同的對(duì)象。步驟如下:想要使用 clone() 方法創(chuàng)建對(duì)象的類,實(shí)現(xiàn) Cloneable 接口。在類的內(nèi)部,重寫(xiě) Object 類的 clone() 方法。

備注:

沒(méi)有實(shí)現(xiàn) Cloneable 接口,會(huì)拋出 CloneNotSupportedException 異常。Object 類提供的 clone() 方法,訪問(wèn)權(quán)限是 protected,所以如果不重寫(xiě) clone() 方法,是沒(méi)有權(quán)限調(diào)用的。Object 類的 clone() 方法,是 native 方法。


4、使用反序列化的 readObject() 方法

這個(gè)方法一共分兩步:將對(duì)象序列化,存儲(chǔ)到一個(gè)文件中。從文件中反序列化,得到類對(duì)象。

序列化:想要序列化對(duì)象的類,實(shí)現(xiàn)Serializable接口。使用文件輸出流FileOutputStream創(chuàng)建存儲(chǔ)序列化之后對(duì)象的文件。使用對(duì)象輸出流ObjectOutputStream的實(shí)例方法writeObject(obj)。判斷類中是否存在,名為writeReplace(),返回類型為Object的方法,若有,寫(xiě)入這個(gè)方法的返回值;否則,寫(xiě)入obj對(duì)象。

反序列化:使用文件輸入流FileInputStream找到存儲(chǔ)序列化對(duì)象的文件。使用對(duì)象輸入流ObjectInputStream的實(shí)例方法readObject()。判斷類中是否存在,名為readResolve(),返回類型為Object的方法,若有讀取這個(gè)對(duì)象;否則,反序列化文件中的對(duì)象流。

備注:在類中,writeReplace()和readResoleve()是兩個(gè)非常特殊的方法,其特征簽名需要嚴(yán)格限制:方法名限定,參數(shù)個(gè)數(shù)限定為0,返回類型必須是Object,不能為Object的子類,但是可以拋出不同的異常。訪問(wèn)修飾符沒(méi)有限制,但一般推薦為private,防止誤操作。其特殊的地方還在于將其設(shè)為private方法,沒(méi)有其他方法調(diào)用的情況下,編譯器不會(huì)發(fā)出警告。

?

??9. 抽象類和接口有什么區(qū)別?

?? 10. 靜態(tài)變量和實(shí)例變量的區(qū)別?

(1)語(yǔ)法定義上的區(qū)別


? ? ? ? 靜態(tài)變量用static修飾


? ? ? ? 實(shí)例變量沒(méi)有static修飾


(2)運(yùn)行區(qū)別,實(shí)例區(qū)別


? ? ? ? 靜態(tài)變量在類中,不屬于實(shí)例對(duì)象,屬于類所有,只要程序加載了字節(jié)碼,不用創(chuàng)建實(shí)例對(duì)象靜態(tài)變量就會(huì)被分配空間,已經(jīng)可以使用。


? ? ? ? 實(shí)例變量是某個(gè)對(duì)象的屬性,只有實(shí)例化對(duì)象后,才會(huì)被分配空間,才能使用。類變量是所有對(duì)象共有,其中一個(gè)對(duì)象將它值改變,其他對(duì)象得到的就是改變后的結(jié)果;而實(shí)例變量則屬對(duì)象私有,某一個(gè)對(duì)象將其值改變,不影響其他對(duì)象;

??11. short s1 = 1;s1 = s1 + 1;有什么錯(cuò)?那么 short s1 = 1; s1 += 1;呢?有沒(méi)有錯(cuò)誤?

? ? ? ? 先說(shuō)一下Java的基本數(shù)據(jù)類型轉(zhuǎn)換規(guī)則,大的數(shù)據(jù)類型轉(zhuǎn)換為小的數(shù)據(jù)類型需要強(qiáng)制轉(zhuǎn)換,反之可以自動(dòng)轉(zhuǎn)換。賦值表達(dá)式等號(hào)兩側(cè)的轉(zhuǎn)換的規(guī)則是右側(cè)的向左側(cè)的看齊,即右側(cè)表達(dá)式要轉(zhuǎn)換到和左邊的類型一樣。


? ? ? ? 第一題:short s1 = 1; s1 = s1 + 1;


錯(cuò)! s1 + 1,s1是short類型,1是int型,s1會(huì)自動(dòng)轉(zhuǎn)換為int型的1,與1相加后,得到int型的2,要向左側(cè)的short類型的s1看齊,即需要通過(guò)強(qiáng)制類型轉(zhuǎn)換。正確寫(xiě)法:s1 = (short) (s1 + 1);


? ? ? ? 第二題:short s1 = 1; s1 += 1;


正確! 執(zhí)行s1+=1;其實(shí)執(zhí)行的是s1 = (short) (s1 + 1); 其中會(huì)有一個(gè)強(qiáng)制轉(zhuǎn)換的過(guò)程。


? ? ? ? 第三題:short s1=1,s2=1;short s3=s1+s2;


錯(cuò)誤!這里是編譯器從數(shù)據(jù)安全方面考慮,如果s1和s2都是較大的short類型數(shù),可能會(huì)導(dǎo)致溢出,所以會(huì)要求強(qiáng)制轉(zhuǎn)換到int。正確的三種寫(xiě)法:

??12. Integer 和 int 的區(qū)別?

Integer是int的包裝類;int是基本數(shù)據(jù)類型;

Integer變量必須實(shí)例化后才能使用;int變量不需要;

Integer實(shí)際是對(duì)象的引用,指向此new的Integer對(duì)象;int是直接存儲(chǔ)數(shù)據(jù)值 ;

Integer的默認(rèn)值是null;int的默認(rèn)值是0。

???13. 裝箱和拆箱的區(qū)別

?Java為每種基本數(shù)據(jù)類型都提供了對(duì)應(yīng)的包裝器類型。


? ? ? ? ? ? ? ? 裝箱:基本類型轉(zhuǎn)變?yōu)榘b器類型的過(guò)程。

? ? ? ? ? ? ? ? 拆箱:包裝器類型轉(zhuǎn)變?yōu)榛绢愋偷倪^(guò)程。


? ? ? ? 裝箱是通過(guò)調(diào)用包裝器類的 valueOf 方法實(shí)現(xiàn)的拆箱是通過(guò)調(diào)用包裝器類的 xxxValue 方法實(shí)現(xiàn)的,xxx代表對(duì)應(yīng)的基本數(shù)據(jù)類型。

? ? ? ? 如int裝箱的時(shí)候自動(dòng)調(diào)用Integer的valueOf(int)方法;Integer拆箱的時(shí)候自動(dòng)調(diào)用Integer的intValue方法。


??14. == 和 equals 的區(qū)別?

? ? ? ? 1)對(duì)于==,如果作用于基本數(shù)據(jù)類型的變量,則直接比較其存儲(chǔ)的 “值”是否相等,如 果作用于引用類型的變量,則比較的是所指向的對(duì)象的地址  


? ? ? ? 2)對(duì)于equals方法,注意:equals方法不能作用于基本數(shù)據(jù)類型的變量。如果沒(méi)有對(duì) equals方法進(jìn)行重寫(xiě),則比較的是引用類型的變量所指向的對(duì)象的地址,諸如String、 Date等類對(duì)equals方法進(jìn)行了重寫(xiě)的話,比較的是所指向的對(duì)象的內(nèi)容。


??15. final、finally、finalize 的區(qū)別

final:java中的關(guān)鍵字,修飾符。


? ? ? 1.如果一個(gè)類被聲明為final,就意味著它不能再派生出新的子類,不能作為父類被繼承。因此,一個(gè)類不能同時(shí)被聲明為absrtact抽象類的和final的類。


? ? ? ?2.如果將變量或者方法聲明為final,可以保證它們?cè)谑褂弥胁槐桓淖?


? ? ? ?2.1 被聲明為final的變量必須在聲明時(shí)給定初值,而在以后的引用中只能讀取,不可修改。?


? ? ? ?2.2被聲明final的方法只能使用,不能重載。

finally:java的一種異常處理機(jī)制。? ? ? ?

? ? ? ?finally是對(duì)Java 異常處理模型的最佳補(bǔ)充。finally 結(jié)構(gòu)使代碼總會(huì)執(zhí)行,而不管有無(wú)異常發(fā)生。使用 finally 可以維護(hù)對(duì)象的內(nèi)部狀態(tài),并可以清理非內(nèi)存資源。特別是在關(guān)閉數(shù)據(jù)庫(kù)連接這方面,如果程序員把數(shù)據(jù)庫(kù)連接的close()方法放到finally中,就會(huì)大大降低程序出錯(cuò)的幾率。

?finalize:Java中的一個(gè)方法名。

? ? ? Java技術(shù)使用finalize()方法在垃圾收集器將對(duì)象從內(nèi)存中清除出去前,做必要的清理工作。這個(gè)方法是由垃圾收集器在確定這個(gè)對(duì)象沒(méi)有被引用時(shí)對(duì)這個(gè)對(duì)象調(diào)用的。它是在Object類中定義的,因此所有的類都繼承了它。子類覆蓋finalize()方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize()方法是在垃圾收集器刪除對(duì)象之前對(duì)這個(gè)對(duì)象調(diào)用的。


Java-八股文-基礎(chǔ)本部分<一>的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
兴仁县| 重庆市| 塔河县| 闵行区| 颍上县| 焦作市| 渭南市| 滁州市| 西畴县| 民权县| 淳安县| 志丹县| 津市市| 安多县| 百色市| 巫山县| 繁昌县| 岳阳市| 河间市| 伊川县| 新蔡县| 新疆| 新和县| 叙永县| 怀来县| 巢湖市| 德保县| 曲水县| 张家界市| 白银市| 开鲁县| 武乡县| 平和县| 龙口市| 江口县| 岚皋县| 土默特右旗| 澄城县| 黔南| 潜江市| 泰安市|