Java程序設(shè)計(jì)復(fù)習(xí)題

1. ==與equals的區(qū)別

對(duì)于引用數(shù)據(jù)類型來(lái)說(shuō),==是比較它們的內(nèi)存空間是不是相同的,而equals是比較它們的值

2. abstract class和interface的區(qū)別?

  • Interface需要實(shí)現(xiàn),要用implements,而abstract class需要繼承,要用extends。
  • 一個(gè)類可以實(shí)現(xiàn)多個(gè)Interface,但一個(gè)類只能繼承一個(gè)abstract class。
  • Interface強(qiáng)調(diào)特定功能的實(shí)現(xiàn),而abstract class強(qiáng)調(diào)所屬關(guān)系。
  • 盡管interface實(shí)現(xiàn)類及abstrct class的子類都必須要實(shí)現(xiàn)相應(yīng)的抽象方法,但實(shí)現(xiàn)的形式不同。Interface中的每一個(gè)方法都是抽象方法,都只是聲明的(declaration, 沒有方法體),Interface 的實(shí)現(xiàn)類必須要實(shí)現(xiàn),而abstract class的子類可以有選擇地實(shí)現(xiàn)。

3. final, finally, finalize的區(qū)別

  1. Final

修飾符(關(guān)鍵字) 如果一個(gè)類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。被聲明為final的變量必須在聲明時(shí)給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載。

  1. Finally

在異常處理時(shí)提供 finally 塊來(lái)執(zhí)行任何清除操作。
finally是在try-catch-finally塊中配套使用,作用是不管代碼執(zhí)行了try還是catch,無(wú)論是否異常,最后總是會(huì)執(zhí)行finally里面的代碼

    //例子:
    try{
        //這里寫一些可能出現(xiàn)異常的代碼
    }catch(Exception e){
        //出現(xiàn)了異常就執(zhí)行這里的代碼。否則不執(zhí)行
    }finally{
        //無(wú)論有沒有異常,都執(zhí)行這里的代碼
    }
  1. Finalize

方法名。Java允許使用 finalize() 方法在垃圾收集器將對(duì)象從內(nèi)存中清除出去之前做必要的清理工作。這個(gè)方法是由垃圾收集器在確定這個(gè)對(duì)象沒有被引用時(shí)對(duì)這個(gè)對(duì)象調(diào)用的。finalize是召喚垃圾收集器的命令,使用后,系統(tǒng)就安排一次垃圾回收。但是否立即執(zhí)行,執(zhí)行的時(shí)間點(diǎn)是無(wú)法確定的。

4. error和exception有什么區(qū)別?

  • error

屬于編譯時(shí)錯(cuò)誤,根本不會(huì)編譯通過,也就是不會(huì)生成.class文件,比如,內(nèi)存資源不足等,對(duì)于這種錯(cuò)誤,程序基本無(wú)能為力,除了退出運(yùn)行外別無(wú)選擇。Error表示系統(tǒng)級(jí)的錯(cuò)誤和程序不必處理的異常,是java運(yùn)行環(huán)境中的內(nèi)部錯(cuò)誤或者硬件問題,Error類對(duì)象由Java虛擬機(jī)生成并拋出。

  • exception

屬于運(yùn)行時(shí)錯(cuò)誤,只有在調(diào)用的時(shí)候才會(huì)報(bào)錯(cuò),比如空指針或數(shù)組下標(biāo)越界等等,Exception(違例)表示需要捕捉或者需要程序進(jìn)行處理的異常,Exception類對(duì)象由應(yīng)用程序處理或拋出。

5.Java多態(tài)的實(shí)現(xiàn)(繼承 重載 覆蓋)

  1. 繼承(inheritance)

一旦你已經(jīng)創(chuàng)建了一個(gè)定義了對(duì)象一般屬性的父類,該父類可以被繼承以生成特殊用途的類。每一個(gè)子類只增添它自己獨(dú)特的屬性。這是繼承的本質(zhì)。Java 不支持多父類的繼承。

  1. 重載(overload)
    • 方法重載是指多個(gè)方法享有相同的名字,但是這些方法的參數(shù)必須不同,或者是參數(shù)的個(gè)數(shù)不同,或者是參數(shù)類型不同。。
    • 對(duì)返回類型無(wú)限制,返回類型不能用來(lái)區(qū)分重載的方法。
    • 對(duì)于繼承來(lái)說(shuō),如果某一方法在父類中是訪問權(quán)限是private,那么就不能在子類對(duì)其進(jìn)行重載,如果定義的話,也只是定義了一個(gè)新方法,而不會(huì)達(dá)到重載的效果。
  2. 覆蓋(override)(方法的重寫)

是指子類對(duì)自父類繼承的方法進(jìn)行重新的定義。
要求:相同的方法名稱、參數(shù)列表、返回值。
從字面就可以知道,它是覆蓋了一個(gè)方法并且對(duì)其重寫,以求達(dá)到不同的作用。對(duì)我們來(lái)說(shuō)最熟悉的覆蓋就是對(duì)接口方法的實(shí)現(xiàn),在接口中一般只是對(duì)方法進(jìn)行了聲明,而我們?cè)趯?shí)現(xiàn)時(shí),就需要實(shí)現(xiàn)接口聲明的所有方法。

6. 工廠模式的定義、原理與作用

  1. 定義

提供創(chuàng)建對(duì)象的接口

  1. 原理

創(chuàng)建一個(gè)抽象工廠,它決定返回哪一個(gè)類的實(shí)例并將該實(shí)例返回。接下來(lái)可以調(diào)用那個(gè)類實(shí)例的方法,但不需要知道具體使用的是哪一個(gè)子類,這種方法把和數(shù)據(jù)相關(guān)的問題與類的其他方法分隔開來(lái)

  1. 作用

工廠模式主要是為創(chuàng)建對(duì)象提供過渡接口,以便將創(chuàng)建對(duì)象的具體過程屏蔽隔離起來(lái),達(dá)到提高靈活性的目的。
編碼設(shè)計(jì)法則:
(1)OCP法則(開閉原則:一個(gè)軟件的實(shí)體應(yīng)該對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉)
(2)DIP法則(依賴倒轉(zhuǎn):抽象不應(yīng)當(dāng)依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)當(dāng)依賴于抽象)

7. 多線程的實(shí)現(xiàn)方法

創(chuàng)建線程有兩種方法:繼承Thread類和實(shí)現(xiàn)Runnable接口。

  1. 繼承Thread類:

一個(gè)Thread類的對(duì)象代表一個(gè)線程

啟動(dòng)線程——start( ) 啟動(dòng)線程時(shí),由java直接調(diào)用public void run()
運(yùn)行線程的主體——run ( )
暫停線程的執(zhí)行——sleep(),讓出CPU給其他線程使用,在指定的時(shí)間后,CPU回到剛才暫停的線程上執(zhí)行。

  1. 實(shí)現(xiàn)Runnable接口:

該類中只有一個(gè)run()方法,我們聲明自己的類實(shí)現(xiàn) Runnable 接口并提供這一方法,將我們的線程代碼寫入其中,就完成了這一部分的任務(wù)。但是 Runnable 接口并沒有任何對(duì)線程的支持,我們還必須創(chuàng)建 Thread 類的實(shí)例,這一點(diǎn)通過 Thread 類的構(gòu)造函數(shù)public Thread(Runnable target);來(lái)實(shí)現(xiàn)

8. 類、抽象類、接口之間的聯(lián)系與區(qū)別

  • 答案一

abstract class是interface與Class的中介。interface是完全抽象的,只能聲明方法,而且只能聲明pulic的方法,不能聲明private及protected的方法,不能定義方法體,也不能聲明實(shí)例變量。然而,interface卻可以聲明常量變量。abstract class在interface及Class中起到了承上啟下的作用。'
一方面,abstract class是抽象的,可以聲明抽象方法,以規(guī)范子類必須實(shí)現(xiàn)的功能;
另一方面,它又可以定義缺省的方法體,供子類直接使用或覆蓋。另外,它還可以定義自己的實(shí)例變量,以供子類通過繼承來(lái)使用。

  • 答案二

具有關(guān)鍵字abstract ,在實(shí)現(xiàn)內(nèi)容上沒有完全定義的類就叫抽象類。
抽象類和接口的區(qū)別如下:

  • 在類來(lái)繼承抽象類時(shí),只需實(shí)現(xiàn)部分具體方法和全部抽象方法,而實(shí)現(xiàn)接口則要實(shí)現(xiàn)里面的全部方法。
  • 在接口中無(wú)成員變量,而抽象類中可有成員變量。
    在Java中引進(jìn)接口主要是為了解決多繼承的問題。
    1. 接口中不能有非抽象方法,但抽象類中可以有。
    2. 一個(gè)類能實(shí)現(xiàn)多個(gè)接口,但只能有一個(gè)父類。
    3. 接口并不屬于繼承結(jié)構(gòu),它實(shí)際與繼承無(wú)關(guān),因此無(wú)關(guān)的類也可以實(shí)現(xiàn)同一個(gè)接口。

9. 位運(yùn)算符和邏輯運(yùn)算符的區(qū)別

java的位運(yùn)算符包括:

  1. “按位與”運(yùn)算符 &(雙目運(yùn)算符)
  2. “按位或”運(yùn)算符 | (雙目運(yùn)算符)
  3. “按位非”運(yùn)算符 ~ (單目運(yùn)算符)
  4. “按位異或”運(yùn)算符 ^(雙目運(yùn)算符)

Java 的邏輯運(yùn)算符包括$$、||、!

兩者不同的是:位運(yùn)算符要計(jì)算完a和b之后再給出運(yùn)算的結(jié)果。
比如,X的初值是1,經(jīng)過((y=1)==0)&&((x=8)==8);邏輯運(yùn)算比較后,X的值仍然是1,因?yàn)榍懊娴呐袛嘟Y(jié)果為false,不再執(zhí)行后面的語(yǔ)句。
但是如果經(jīng)過((y=1)==0)&((x=8)==8);位運(yùn)算之后,X的值是8

10. 上溯造型與下溯造型

  • 上溯造型

把子類類型轉(zhuǎn)換為父類類型-自動(dòng)完成。

  • 下溯造型:把父類類型轉(zhuǎn)換為子類需要進(jìn)行強(qiáng)制轉(zhuǎn)換。

規(guī)定:
并不是任意一個(gè)對(duì)象都能夠進(jìn)行下溯造型。只有曾經(jīng)上溯造型過的對(duì)象才能進(jìn)行下溯造型。對(duì)象不允許不經(jīng)過上溯造型而直接下溯造型。否則運(yùn)行時(shí)會(huì)拋出java.lang.ClassCastException.

11. 訪問控制修飾符的作用,可見范圍的區(qū)分

  • 作用

防止程序員接觸到他們不該接觸的東西

  • 區(qū)分
可見度 Public Protected Private 缺省
同一類中可見
同一包中對(duì)子類可見
同一包中對(duì)非子類可見
不同包中對(duì)子類可見
不同包中對(duì)非子類可見

12. Java垃圾收集方法

java垃圾回收由java虛擬機(jī)自己調(diào)用,程序員不用管

兩種方法是

  1. System.gc()
  2. Runtime.gc()

13. Java中的參數(shù)傳遞

JAVA中的參數(shù)傳遞全是以值傳遞的。是基本類型,就拷貝一個(gè)基本類型傳進(jìn)方法;是引用,就拷貝一個(gè)引用變量傳進(jìn)去方法。你可以通過方法來(lái)改變被引用的對(duì)象中的屬性值,卻無(wú)法改變這個(gè)對(duì)象引用(Object reference)本身.也就是當(dāng)一個(gè)對(duì)象的實(shí)例被創(chuàng)建的時(shí)候.

//like this:
Apple a = new Apple(); //a 存的就是這個(gè)對(duì)象Apple實(shí)例的地址
//而這個(gè)地址,也就是a的值作為參數(shù)傳到某個(gè)函數(shù)中的時(shí)候,a本身是不會(huì)改變的。

14. Java中堆與棧的理解及其作用

  • 答案一

Java的堆是一個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū),類的對(duì)象從中分配空間。這些對(duì)象通過new、newarray、anewarray和multianewarray等指令建立,它們不需要程序代碼來(lái)顯式的釋放,堆是由垃圾回收來(lái)負(fù)責(zé)的。堆的優(yōu)勢(shì)是可以動(dòng)態(tài)地分配內(nèi)存大小,生存期也不必事先告訴編譯器,因?yàn)樗窃谶\(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存的,Java的垃圾收集器會(huì)自動(dòng)收走這些不再使用的數(shù)據(jù)。

在方法中定義的一些基本類型的變量和引用變量都是在方法的棧內(nèi)存中分配。當(dāng)在一段代碼塊(也就是一對(duì){}之間)定義一個(gè)變量時(shí),Java就在棧中為這個(gè)變量分配內(nèi)存空間,當(dāng)超過變量的作用域后, Java會(huì)自動(dòng)釋放為該變量分配的內(nèi)存空間。

  • 答案二:

堆是先進(jìn)先出,而棧是先進(jìn)后出

  1. 棧(stack)與堆(heap)都是Java用來(lái)在Ram中存放數(shù)據(jù)的地方。與C++不同,Java自動(dòng)管理?xiàng):投眩绦騿T不能直接地設(shè)置?;蚨?。
    • 棧的優(yōu)勢(shì)是,存取速度比堆要快,僅次于直接位于CPU中的寄存器。但缺點(diǎn)是,存在棧中的數(shù)據(jù)大小與生存期必須是確定的,缺乏靈活性。另外,棧數(shù)據(jù)可以共享。
  • 堆的優(yōu)勢(shì)是可以動(dòng)態(tài)地分配內(nèi)存大小,生存期也不必事先告訴編譯器,Java的垃圾收集器會(huì)自動(dòng)收走這些不再使用的數(shù)據(jù)。但缺點(diǎn)是,由于要在運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存,存取速度較慢。

15。 類圖的表示

自己看資料

16. 簡(jiǎn)述this、super、static關(guān)鍵字的作用

  • super
  1. 引用父類的成員:super.變量 或 super.方法([參數(shù)列])
    當(dāng)然,這需要相應(yīng)的訪問權(quán)限
  2. 在子類構(gòu)造方法中調(diào)用父類的構(gòu)造方法:
    super([…]);//與this用法類似,應(yīng)放在子類構(gòu)造方法的第一行位置上
    請(qǐng)注意:父類變量的初始化只能通過調(diào)用super([…])方法,由父類來(lái)完成,子類不可能“代勞”。只有父類變量的初始化完成之后,子類才開始其新增變量的初始化工作。
  • static:

可以在類的字段、方法前加上static關(guān)鍵字,表明該變量、該方法是屬于類的,故稱為類屬性或類方法。(而無(wú)static修飾的,則稱為實(shí)例屬性量或?qū)嵗椒?
說(shuō)明
靜態(tài)成員屬于類所有,不屬于某一具體對(duì)象私有;
靜態(tài)成員隨類加載時(shí)被靜態(tài)地分配內(nèi)存空間或入口地址,通常通過 類名.靜態(tài)成員 方式來(lái)訪問;
同一個(gè)類的實(shí)例方法可以訪問該類的類屬性、類方法;
而類方法只能訪問該類的類屬性、類方法,不能直接訪問實(shí)例的變量和方法,也不能使用this關(guān)鍵字。

  • this:

this關(guān)鍵字表示的是“當(dāng)前對(duì)象”,當(dāng)出現(xiàn)在類的實(shí)例方法中,代表的是調(diào)用該方法的對(duì)象;當(dāng)出現(xiàn)在類的構(gòu)造方法中時(shí),代表的是調(diào)用該構(gòu)造方法創(chuàng)建的對(duì)象。
在下列兩種情況下,必須使用this

  • 方法的形式參數(shù)與類的成員變量同名:
  • 在內(nèi)部類中使用外部類的同名成員變量的時(shí)候

17. 集合基本概念與用法

集合的類型一共有三種,分別是:set list map

  • set

無(wú)重復(fù)元素,無(wú)序的。不維護(hù)元素的次序。

  • list

對(duì)象以線性方式存儲(chǔ)。在數(shù)據(jù)結(jié)構(gòu)中表現(xiàn)為數(shù)組、響亮、鏈表、堆棧和隊(duì)列。

  • map

每個(gè)元素由key-value構(gòu)成。key是唯一的。

18. 編碼原則與關(guān)系的種類

  • 七大原則

  • SRP法則(單一職責(zé)原則)

就一個(gè)類而言,應(yīng)該僅有一個(gè)引起他變化的原因.

  • OCP法則(開閉原則,Open-Closed Principle)

一個(gè)軟件的實(shí)體應(yīng)該對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。

  • LSP法則(里氏轉(zhuǎn)換原則, Liskov Substitution Principle)

使用指向基類(超類)的引用的函數(shù),必須能夠在不知道具體派生類(子類)對(duì)象類型的情況下使用它們。

  • DIP法則(依賴倒轉(zhuǎn), Dependence Inversion Principle)

抽象不應(yīng)當(dāng)依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)當(dāng)依賴于抽象。?理解:要依賴于抽象,不要依賴于具體,要針對(duì)接口編程,不針對(duì)實(shí)現(xiàn)編程。

  • ISP原則(接口隔離原則,Interface Segregation Principle)

使用多個(gè)專門的接口比使用單一的總接口要好。

  • CARP原則(合成/聚合復(fù)用原則, Composite/Aggregate Reuse Principle)

要盡量使用合成/聚合,盡量不要使用繼承。

  • LoD法則(迪米特法則, Law of Demeter)

一個(gè)對(duì)象應(yīng)當(dāng)對(duì)其它對(duì)象有盡可能少的了解。“不要和陌生人說(shuō)話”

  • 五大關(guān)系:

  • 一般化關(guān)系
  • 關(guān)聯(lián)關(guān)系
  • 聚合關(guān)系
  • 組合關(guān)系
  • 依賴關(guān)系

19. 代碼重構(gòu)的作用與方法

  • 作用

系統(tǒng)發(fā)展到一定階段后,使用重構(gòu)的方式,不改變系統(tǒng)的外部功能,只對(duì)內(nèi)部的結(jié)構(gòu)進(jìn)行重新的整理。通過重構(gòu),不斷的調(diào)整系統(tǒng)的結(jié)構(gòu),使系統(tǒng)對(duì)于需求的變更始終具有較強(qiáng)的適應(yīng)能力。

  • 方法

過大的類和過長(zhǎng)的方法 需要想辦法將其劃分為多個(gè)小方法,以便于分而治之。
過度耦合的信息鏈 需要查看就否有可移除的中間層,或是否可以提供更直接的調(diào)用方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,679評(píng)論 18 399
  • (一)Java部分 1、列舉出JAVA中6個(gè)比較常用的包【天威誠(chéng)信面試題】 【參考答案】 java.lang;ja...
    獨(dú)云閱讀 7,257評(píng)論 0 62
  • 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運(yùn)行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,812評(píng)論 0 11
  • *字典(無(wú)序數(shù)據(jù)集)* * swift 的Dictionary類型被橋接到Foundation的NSDiction...
    Windv587閱讀 444評(píng)論 0 0
  • 梗 一 風(fēng)里帶著的梗像如隱若現(xiàn)對(duì)準(zhǔn)你的槍口大炮。 我似乎很在意,卻是真的在意。 過去了的在心上插把刀又硬生生拔出來(lái)...
    胥大米閱讀 442評(píng)論 0 0

友情鏈接更多精彩內(nèi)容