Java面對(duì)對(duì)象編程復(fù)習(xí)(附帶面試題)

一.了解java
1.java實(shí)現(xiàn)一致性靠的是JVM,JVM本質(zhì)是一臺(tái)虛擬機(jī),只要在不的操作系統(tǒng)上植入不不同版本的jvm,那么 Java 程序就可以在各個(gè)平臺(tái)上移植,做到“一次編寫,處處運(yùn)行”
2.Java 中程序的執(zhí)行步驟如下
使用javac命令將一個(gè)*java 文件編譯成*class 文件
使用 java 命令可以執(zhí)行一個(gè)*.class 文件。
3.每次使用java 命令執(zhí)行一個(gè) class 的時(shí)候,都會(huì)啟動(dòng)JVM 進(jìn)程,JVM 通過 CLASSPATH 給出的
路徑加載所需要的類文件,可以通過 SET CLASSPATH 設(shè)置類的加載路徑。
4.Java 程序主要分為兩種: Java Application 和 Java Applet 程序,Java Applet 主要是在網(wǎng)頁中嵌入的Java 程序,基本上已經(jīng)不再使用了, 而 Application 是指有 main 方法的程序
5.JDK1.9 之后的開發(fā)包中提供有 JShell 交式工具,利用此工具可以直接執(zhí)行程序代碼,從而避免主方法執(zhí)行的限制。但此類操作只適合于簡單的編程,在實(shí)際開發(fā)之中還是建議使用標(biāo)準(zhǔn)的程序結(jié)構(gòu)開發(fā)程序。
*面試題? JDK,JRE,JVM三者之間的關(guān)系
?1.JDK(java development Kit)是針對(duì)Java開發(fā)員的產(chǎn)品,是Java的核心,包括Java的運(yùn)行環(huán)境,JRE,JAVA工具和Java基礎(chǔ)類庫。
2.JRE(Java runtime environment)是運(yùn)行Java程序所必須的環(huán)境集合,包含jvm標(biāo)準(zhǔn)實(shí)現(xiàn)以及Java核心類庫
3.JVM(java virtual machine)是整個(gè)Java跨平臺(tái)的最核心部分,能夠運(yùn)行java語言編寫的軟件程序
*面試題 1、JDK 和 JRE 有什么區(qū)別?
JDK(Java Development Kit),Java開發(fā)工具包
JRE(Java Runtime Environment),Java運(yùn)行環(huán)境
JDK中包含JRE,JDK中有一個(gè)名為jre的目錄,里面包含兩個(gè)文件夾bin和lib,bin就是JVM,lib就是JVM工作所需要的類庫。

二.程序的基本概念
1.程序開發(fā)利用注釋可以提升程序源代碼的可閱讀性,在 Java 中提供有 3 類注釋,單行注釋、多行注釋和文檔注釋。
2.標(biāo)識(shí)符是程序單元定義的唯一標(biāo)記,可以定義類、方法、變量,Java 中標(biāo)識(shí)符組成原則: 字母數(shù)字、_、$所組成,其中不能以數(shù)字開頭,不能使用 Java 的關(guān)鍵字,并且也可以使用中文進(jìn)行標(biāo)識(shí)符定義。
3.Java 的數(shù)據(jù)類型可分為下列兩種:基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。其中,基本數(shù)據(jù)類型可以直接進(jìn)行內(nèi)容處理,而引用數(shù)據(jù)類型需要進(jìn)行內(nèi)存空間的分配后才可以使用

4.Unicode 為每個(gè)字符制定了一個(gè)唯一的數(shù)值,因此在任何語言、平臺(tái)和程序上都可以安心使用
5.布爾 (boolean)類型的變量只有 true (真)和 false (假) 兩個(gè)值。
6.數(shù)據(jù)類型的轉(zhuǎn)換可分為“自動(dòng)類型轉(zhuǎn)換”與“強(qiáng)制類型轉(zhuǎn)換”,在進(jìn)行強(qiáng)制類型轉(zhuǎn)換時(shí)需要注意數(shù)據(jù)溢出。
7.算術(shù)運(yùn)算符的成員有加法運(yùn)算符、減法運(yùn)算符、乘法運(yùn)算符、除法運(yùn)算符和余數(shù)運(yùn)算符
8.遞增與遞減運(yùn)算符有著相當(dāng)大的便利性,善用它們可提高程序的簡潔程度。
9.任何運(yùn)算符都有執(zhí)行順序,在開發(fā)中建議利用括號(hào)來修改運(yùn)算符的優(yōu)先級(jí).
10.邏輯“與”和邏輯“或”操作分別提供有“普通與、或”與“短路與、或”兩類,開發(fā)中建議使用“短路與、或”操作提升程序的執(zhí)行性能。

?*面試題:String 屬于基礎(chǔ)的數(shù)據(jù)類型嗎?
不屬于。
八種基本數(shù)據(jù)類型:byte、short、char、int、long、double、float、boolean。
*面試題 :byte類型127+1等于多少
byte的范圍是 -128~127。
字節(jié)長度為8位,最左邊的是符號(hào)位,而127的二進(jìn)制為01111111,所以執(zhí)行+1操作時(shí),01111111變?yōu)?0000000。
大家知道,計(jì)算機(jī)中存儲(chǔ)負(fù)數(shù),存的是補(bǔ)碼的興衰。左邊第一位為符號(hào)位。
那么負(fù)數(shù)的補(bǔ)碼轉(zhuǎn)換成十進(jìn)制如下:
一個(gè)數(shù)如果為正,則它的原碼、反碼、補(bǔ)碼相同;一個(gè)正數(shù)的補(bǔ)碼,將其轉(zhuǎn)化為十進(jìn)制,可以直接轉(zhuǎn)換。
已知一個(gè)負(fù)數(shù)的補(bǔ)碼,將其轉(zhuǎn)換為十進(jìn)制數(shù),步驟如下:
??? 先對(duì)各位取反;
??? 將其轉(zhuǎn)換為十進(jìn)制數(shù);
??? 加上負(fù)號(hào),再減去1;例如10000000,最高位是1,是負(fù)數(shù),①對(duì)各位取反得01111111,轉(zhuǎn)換為十進(jìn)制就是127,加上負(fù)號(hào)得-127,再減去1得-128;

三.程序邏輯的控制
1.f語句可依據(jù)判斷的結(jié)果來決定程序的流程。
2,選擇結(jié)構(gòu)包含 if、if ..else 及 switch 語句,語句中加上了選擇的結(jié)構(gòu)之后,根據(jù)選擇的不同,程序的運(yùn)行會(huì)有不同的方向與結(jié)果。
3.需要重復(fù)執(zhí)行某項(xiàng)功能時(shí),最好使用循環(huán)結(jié)構(gòu)??梢赃x擇使用Java 所提供的 for? while 及 do...while循環(huán)來完成。
4.break 語句可以強(qiáng)制程序逃離循環(huán)。當(dāng)程序運(yùn)行到 break 語句時(shí),即會(huì)離開循環(huán),執(zhí)行循環(huán)外的語句,如果 break 語句出現(xiàn)在嵌套循環(huán)中的內(nèi)層循環(huán),則 break 語只會(huì)逃離當(dāng)前層循環(huán)。
5,continue 語句可以強(qiáng)制程序跳到循環(huán)的起始處,當(dāng)程序運(yùn)行到 continue 語句時(shí),即會(huì)停止運(yùn)行剩余的循環(huán)主體,而回到循環(huán)的開始處繼續(xù)運(yùn)行。


四.方法
1.方法是一段可重復(fù)調(diào)用的代碼段,因?yàn)榉椒梢杂芍鞣椒ㄖ苯诱{(diào)用,所以要加入 public??? static 關(guān)鍵字修飾。
2.方法的重載:方法名稱相同,參數(shù)的類型或個(gè)數(shù)不同,則此方法被稱為重載。
3.方法遞歸調(diào)用指的是本方法的自身重復(fù)執(zhí)行,在使用遞歸調(diào)用時(shí)一定要設(shè)置好方法的結(jié)束條件否則就會(huì)出現(xiàn)內(nèi)存溢出問題,造成程序中斷執(zhí)行。
*面試題 在 Java 中,為什么不允許從靜態(tài)方法中訪問非靜態(tài)變量?
靜態(tài)變量屬于類本身,在類加載的時(shí)候就會(huì)分配內(nèi)存,可以通過類名直接訪問;
非靜態(tài)變量屬于類的對(duì)象,只有在類的對(duì)象產(chǎn)生時(shí),才會(huì)分配內(nèi)存,通過類的實(shí)例去訪問;
靜態(tài)方法也屬于類本身,但是此時(shí)沒有類的實(shí)例,內(nèi)存中沒有非靜態(tài)變量,所以無法調(diào)用

五.類與對(duì)象
1.面向?qū)ο蟪绦蛟O(shè)計(jì)是現(xiàn)在主流的程序設(shè)計(jì)方法,它有三大主要特性:封裝性、繼承性、多態(tài)性。
2.類與對(duì)象的關(guān)系:類是對(duì)象的模板,對(duì)象是類的實(shí)例,類只能通過對(duì)象才可以使用。
3.類的組成:成員屬性(Field)和方法(Method)。
4.對(duì)象的實(shí)例化格式:類名稱 對(duì)象名稱 = new 類名稱(),關(guān)鍵字new用于為對(duì)象分配內(nèi)存空間。
5.如果一個(gè)對(duì)象沒有被實(shí)例化而直接使用,則會(huì)出現(xiàn)空指針異常(NullPointerException)。
6.類屬于引用數(shù)據(jù)類型,在引用傳遞時(shí),傳遞的只是堆內(nèi)存的地址(多個(gè)棧內(nèi)存可以指向同一塊堆內(nèi)存).
7.類的封裝性:通過private關(guān)鍵字修飾屬性,被封裝的屬性不能被外部直接訪問,只能通過setter和getter方法訪問。所有屬性都應(yīng)該進(jìn)行封裝。
8.構(gòu)造方法可以用于初始化類的屬性,構(gòu)造方法與類名稱相同,并且沒有返回值類型聲明。如果在類中沒有明確定義構(gòu)造方法,系統(tǒng)會(huì)自動(dòng)生成一個(gè)無參的空構(gòu)造方法。一個(gè)類中可以有多個(gè)構(gòu)造方法,稱為構(gòu)造方法的重載,但每個(gè)類必須至少有一個(gè)構(gòu)造方法。
9.在Java中使用this關(guān)鍵字表示當(dāng)前對(duì)象,通過"this.屬性"調(diào)用本類中的屬性,通過"this.方法()"調(diào)用本類中的其他方法。還可以使用this()調(diào)用本類中的構(gòu)造方法,但要放在構(gòu)造方法的首行。
例如使用以下代碼創(chuàng)建Person對(duì)象:
10.使用static關(guān)鍵字聲明的屬性和方法可以直接通過類名稱調(diào)用,static屬性是所有對(duì)象共享的,所有對(duì)象都可以對(duì)其進(jìn)行操作。
*面試題 Java具有哪三大特性:
三大特性:封裝性,繼承性,多態(tài)性
封裝性:指的是將類的信息隱藏在內(nèi)部,外部程序不允許直接訪問,而是通過類的方法對(duì)隱藏信息的操作和訪問
繼承性: 繼承是類魚類之間的一種關(guān)系,比較像集合中的從屬關(guān)系,子類可以獲取到父類的屬性和方法,在Java中是單繼承的,一個(gè)子類只有一個(gè)父類
多態(tài)性:Java語言允許某個(gè)類型的引用變量引用子類的實(shí)例,而且可以對(duì)這個(gè)引用變量進(jìn)行類型轉(zhuǎn)換
?*面試題: final 在 java 中有什么作用?
用來修飾一個(gè)引用
?如果引用為基本數(shù)據(jù)類型,則該引用為常量,該值無法修改;
?如果引用為引用數(shù)據(jù)類型,比如對(duì)象、數(shù)組,則該對(duì)象、數(shù)組本身可以修改,但指向該對(duì)象或數(shù)組的地址的引用不能修改。
?如果引用時(shí)類的成員變量,則必須當(dāng)場賦值,否則編譯會(huì)報(bào)錯(cuò)。

六.數(shù)組
1.數(shù)組是一組相關(guān)數(shù)據(jù)變量的線性集合,利用數(shù)組可以方便地實(shí)現(xiàn)一組變量的關(guān)聯(lián),數(shù)組的缺點(diǎn)在于長度不可改變。
2.數(shù)組在訪問時(shí)需要通過“數(shù)組名稱[索引”的形式訪問,索引范圍為 0~數(shù)組長度-1,如果超過數(shù)組索引訪問范圍則會(huì)出現(xiàn)“java.lang.ArrayIndexOutOfBoundsException”異常。
3.數(shù)組長度可以使用“數(shù)組名稱.length”的形式動(dòng)態(tài)獲取。
4.數(shù)組采用動(dòng)態(tài)初始化時(shí),數(shù)組中每個(gè)元素的內(nèi)容都是其對(duì)應(yīng)數(shù)據(jù)類型的默認(rèn)值。
數(shù)組的靜態(tài)初始化與動(dòng)態(tài)初始化:
總結(jié):
靜態(tài)初始化是在創(chuàng)建數(shù)組時(shí)直接為數(shù)組元素賦初值,可在聲明數(shù)組時(shí)進(jìn)行。
動(dòng)態(tài)初始化是先創(chuàng)建數(shù)組對(duì)象,再為數(shù)組元素分配內(nèi)存并設(shè)定初值,適用于需要根據(jù)運(yùn)行時(shí)需求確定數(shù)組長度的情況。
5.數(shù)組屬于引用數(shù)據(jù)類型,在使用前需要通過關(guān)鍵字 new 為其開辟相應(yīng)的堆內(nèi)存空間,如果使用
了未開辟堆內(nèi)存空間的數(shù)組則會(huì)出現(xiàn)“java.lang.NullPointerException”異常。
6.JDK 為了方便數(shù)組操作提供有 System.arraycopy0與 java.util.Arrayssort0兩個(gè)方法實(shí)現(xiàn)數(shù)組復(fù)制與數(shù)組排序。



8.對(duì)象數(shù)組可以實(shí)現(xiàn)一組對(duì)象的管理,在開發(fā)中可以描述多個(gè)實(shí)例。
與枚舉的區(qū)別:
對(duì)象數(shù)組是一種通用的數(shù)據(jù)結(jié)構(gòu),可用于存儲(chǔ)多個(gè)對(duì)象引用,使其更靈活地管理和操作這些對(duì)象。
枚舉是一種特殊的數(shù)據(jù)類型,用于定義一組有限的常量,并提供更加可讀性和類型安全性的常量值。
9.簡單 Java 類可以實(shí)現(xiàn)數(shù)據(jù)表結(jié)構(gòu)的映射轉(zhuǎn)換,通過面向?qū)ο蟮年P(guān)聯(lián)形式描述數(shù)據(jù)表存儲(chǔ)結(jié)構(gòu)。

七 .String類(重點(diǎn)內(nèi)容)
1.String 類在 Java 中較為特殊,String 可以通過直接賦值或構(gòu)造方法進(jìn)行實(shí)例化。前者只產(chǎn)生一個(gè)實(shí)例化對(duì)象,而且此實(shí)例化對(duì)象可以重用;而后者將產(chǎn)生兩個(gè)實(shí)例化對(duì)象,其中一個(gè)是垃圾空間。
重用與重載的區(qū)別:
重用(Reuse):
重用是指使用已有的代碼、組件或功能來實(shí)現(xiàn)新的功能或解決新的問題,以減少開發(fā)時(shí)間和工作量。
在面向?qū)ο缶幊讨?,重用通常通過繼承和組合來實(shí)現(xiàn)。
繼承允許子類繼承父類的屬性和方法,在子類中可以直接使用繼承得到的屬性和方法,以實(shí)現(xiàn)代碼的重用。
組合是將多個(gè)類組合在一起以實(shí)現(xiàn)特定功能,通過將一個(gè)類的對(duì)象作為另一個(gè)類的成員變量,以實(shí)現(xiàn)代碼的復(fù)用。
重載(Overload):
重載是指在同一個(gè)類中定義多個(gè)同名但參數(shù)列表不同的方法,以實(shí)現(xiàn)方法的多態(tài)性。
重載方法具有相同的名稱但不同的參數(shù)數(shù)量、類型或順序,編譯器根據(jù)方法調(diào)用時(shí)提供的參數(shù)來選擇匹配的方法進(jìn)行調(diào)用。
重載方法可以根據(jù)不同的需求和情況,提供不同的方法實(shí)現(xiàn),但它們具有相似的功能。
2.JVM 提供有兩類 String 常量池:靜態(tài)常量池、運(yùn)行時(shí)常量池。對(duì)于靜態(tài)常量池,需在編譯的時(shí)
候進(jìn)行字符串處理,運(yùn)行時(shí)常量池是在程序執(zhí)行中動(dòng)態(tài)地實(shí)例化字符串對(duì)象。
3.在 String 中比較內(nèi)容時(shí)使用 equals()方法,而“==”比較的只是兩個(gè)字符串的地址值。
4.字符串的內(nèi)容一旦聲明則不可改變。而字符串變量的修改是通過引用地址的變更而實(shí)現(xiàn)的,但是會(huì)產(chǎn)生垃圾空間。
5.在使用 String類的 split0方法時(shí)需要考慮正則表達(dá)式的影響,需要使用“\\”進(jìn)行轉(zhuǎn)義處理
?6.如果要對(duì)字符串編碼進(jìn)行轉(zhuǎn)換可以用getBytes()方法實(shí)現(xiàn)
面試題 :在 Java 中,什么時(shí)候用重載,什么時(shí)候用重寫?
(1)重載是多態(tài)的集中體現(xiàn),在類中,要以統(tǒng)一的方式處理不同類型數(shù)據(jù)的時(shí)候,可以用重載。
(2)重寫的使用是建立在繼承關(guān)系上的,子類在繼承父類的基礎(chǔ)上,增加新的功能,可以用重寫。
(3)簡單總結(jié):
重載是多樣性,重寫是增強(qiáng)劑;
目的是提高程序的多樣性和健壯性,以適配不同場景使用時(shí),使用重載進(jìn)行擴(kuò)展;
目的是在不修改原方法及源代碼的基礎(chǔ)上對(duì)方法進(jìn)行擴(kuò)展或增強(qiáng)時(shí),使用重寫;
?面試題 :== 和
的區(qū)別是什么?
對(duì)于基本類型,==比較的是值;
對(duì)于引用類型,==比較的是地址;
equals不能用于基本類型的比較;
如果沒有重寫equals,equals就相當(dāng)于==;
如果重寫了equals方法,equals比較的是對(duì)象的內(nèi)容;
?面試題 :String 類的常用方法都有那些?
(1)常見String類的獲取功能
length:獲取字符串長度;
charAt(int index):獲取指定索引位置的字符;
indexOf(int ch):返回指定字符在此字符串中第一次出現(xiàn)處的索引;
substring(int start):從指定位置開始截取字符串,默認(rèn)到末尾;
substring(int start,int end):從指定位置開始到指定位置結(jié)束截取字符串;(2)常見String類的判斷功能
equals(Object obj): 比較字符串的內(nèi)容是否相同,區(qū)分大小寫;
contains(String str): 判斷字符串中是否包含傳遞進(jìn)來的字符串;
startsWith(String str): 判斷字符串是否以傳遞進(jìn)來的字符串開頭;
endsWith(String str): 判斷字符串是否以傳遞進(jìn)來的字符串結(jié)尾;
isEmpty(): 判斷字符串的內(nèi)容是否為空串"";(3)常見String類的轉(zhuǎn)換功能
byte[] getBytes(): 把字符串轉(zhuǎn)換為字節(jié)數(shù)組;
char[] toCharArray(): 把字符串轉(zhuǎn)換為字符數(shù)組;
String valueOf(char[] chs): 把字符數(shù)組轉(zhuǎn)成字符串。valueOf可以將任意類型轉(zhuǎn)為字符串;
toLowerCase(): 把字符串轉(zhuǎn)成小寫;
toUpperCase(): 把字符串轉(zhuǎn)成大寫;
concat(String str): 把字符串拼接;(4)常見String類的其他常用功能
replace(char old,char new) 將指定字符進(jìn)行互換
replace(String old,String new) 將指定字符串進(jìn)行互換
trim() 去除兩端空格
int compareTo(String str) 會(huì)對(duì)照ASCII 碼表 從第一個(gè)字母進(jìn)行減法運(yùn)算 返回的就是這個(gè)減法的結(jié)果,如果前面幾個(gè)字母一樣會(huì)根據(jù)兩個(gè)字符串的長度進(jìn)行減法運(yùn)算返回的就是這個(gè)減法的結(jié)果,如果連個(gè)字符串一摸一樣 返回的就是0。
?面試題 :new String("a") + new String("b") 會(huì)創(chuàng)建幾個(gè)對(duì)象?
對(duì)象1:new StringBuilder()
對(duì)象2:new String("a")
對(duì)象3:常量池中的"a"
對(duì)象4:new String("b")
對(duì)象5:常量池中的"b"
深入剖析:StringBuilder中的toString():
對(duì)象6:new String("ab")
強(qiáng)調(diào)一下,toString()的調(diào)用,在字符串常量池中,沒有生成"ab"

八.繼承
????????1.繼承可以擴(kuò)充已有類的功能。通過 extends 關(guān)鍵字實(shí)現(xiàn),可將父類的成員 (包含數(shù)據(jù)成員與方法)繼承到子類。
????????2. Java 在執(zhí)行子類的構(gòu)造方法之前,會(huì)先調(diào)用父類中無參的構(gòu)造,其目的是為了對(duì)繼承自父類的成員做初始化的操作,當(dāng)父類實(shí)例構(gòu)造完畢后再調(diào)用子類構(gòu)造。
????????3.父類有多個(gè)構(gòu)造方法時(shí),如要調(diào)用特定的構(gòu)造方法,則可在子類的構(gòu)造方法中,通過 super())這個(gè)關(guān)鍵字來完成。
4.在同一類中,使用"this"關(guān)鍵字調(diào)用其他構(gòu)造函數(shù),而"super()"關(guān)鍵字則用于從子類的構(gòu)造函數(shù)中調(diào)用父類的構(gòu)造函數(shù)。
5.當(dāng)使用"this"訪問屬性或方法時(shí),它首先在當(dāng)前類中查找。如果找不到,則會(huì)在父類中繼續(xù)查找。而使用"super()"則直接在父類中查找所需的屬性或方法。
6."this()"與"super()"的相似之處是,當(dāng)構(gòu)造函數(shù)重載時(shí),兩者都可以根據(jù)提供的參數(shù)類型和數(shù)量來調(diào)用相應(yīng)的構(gòu)造函數(shù)。同時(shí),"this()"和"super()"必須作為構(gòu)造函數(shù)體內(nèi)的第一行代碼寫入。這也是為什么"this()"和"super()"不能同時(shí)存在于同一個(gè)構(gòu)造函數(shù)中的原因。
7."重載"是指在同一個(gè)類中定義相同名稱但參數(shù)個(gè)數(shù)或類型不同的方法。Java可以根據(jù)參數(shù)的數(shù)量或類型調(diào)用相應(yīng)的方法。
8."覆蓋"是指在子類中定義與父類具有相同名稱、參數(shù)個(gè)數(shù)和類型的方法,以覆蓋父類中的方法。
9.如果父類的方法不希望被子類覆蓋,可以在方法前加上"final"關(guān)鍵字,這樣就防止了方法被覆蓋。
10."final"關(guān)鍵字的另一個(gè)用途是將變量聲明為常量,在變量聲明之前添加"final"關(guān)鍵字后,該變量在程序中無法被修改。使用"public static final"可以聲明全局常量。
11.對(duì)象的多態(tài)性主要分為自動(dòng)向上轉(zhuǎn)型和強(qiáng)制向下轉(zhuǎn)型。為了避免在進(jìn)行向下轉(zhuǎn)型時(shí)出現(xiàn)ClassCastException異常,可以使用"instanceof"關(guān)鍵字在轉(zhuǎn)型之前檢查實(shí)例的類型。
12.所有的類都繼承自O(shè)bject類,所有引用數(shù)據(jù)類型都可以向上轉(zhuǎn)型為Object類。通過使用Object,方法可以統(tǒng)一接收參數(shù)或返回?cái)?shù)據(jù)類型。

九.抽象類與接口
Java 可以創(chuàng)建抽象類,抽象類相當(dāng)于一個(gè)模板,用作其他類的父類。抽象類的目的是提供一個(gè)格式,供其他類根據(jù)需要進(jìn)行修改和創(chuàng)建新類。
抽象類的方法可以分為兩種:普通方法和抽象方法。抽象方法是以 abstract 關(guān)鍵字開頭且沒有方法體的方法,它必須在派生類(子類)中進(jìn)行強(qiáng)制性的重寫。
抽象類不能直接通過關(guān)鍵字 "new" 實(shí)例化對(duì)象,而是需要使用子類對(duì)象的向上轉(zhuǎn)型來實(shí)例化。
接口是方法和全局常量的集合,子類必須實(shí)現(xiàn)接口中定義的所有方法。一個(gè)接口可以繼承多個(gè)接口,一個(gè)類可以通過 "implements" 關(guān)鍵字實(shí)現(xiàn)多個(gè)接口。
從 JDK 1.8 版本開始,接口中允許定義默認(rèn)方法和靜態(tài)方法。
Java 不支持類的多重繼承,但支持實(shí)現(xiàn)多個(gè)接口,實(shí)現(xiàn)了接口相當(dāng)于實(shí)現(xiàn)了多繼承的概念。
接口可以通過擴(kuò)展來派生出新的接口,原始接口稱為基本接口或父接口,派生接口稱為派生接口或子接口。派生接口既保留了父接口的成員,也可以添加新的成員以滿足實(shí)際需求。
使用泛型可以避免使用 Object 接收參數(shù)時(shí)出現(xiàn)的 ClassCastException 問題
在引用泛型對(duì)象時(shí),應(yīng)該使用通配符 "?"(或相關(guān)上限、下限設(shè)置)來描述泛型參數(shù)。
面試題: 普通類和抽象類有哪些區(qū)別?
抽象類不能被實(shí)例化;
抽象類可以有抽象方法,只需申明,無須實(shí)現(xiàn);
有抽象方法的類一定是抽象類;
抽象類的子類必須實(shí)現(xiàn)抽象類中的所有抽象方法,否則子類仍然是抽象類;
抽象方法不能聲明為靜態(tài)、不能被static、final修飾。
?面試題:接口和抽象類有什么區(qū)別?
(1)接口
接口使用interface修飾;
接口不能實(shí)例化;
類可以實(shí)現(xiàn)多個(gè)接口;①java8之前,接口中的方法都是抽象方法,省略了public abstract。②java8之后;接口中可以定義靜態(tài)方法,靜態(tài)方法必須有方法體,普通方法沒有方法體,需要被實(shí)現(xiàn);
(2)抽象類
抽象類使用abstract修飾;
抽象類不能被實(shí)例化;
抽象類只能單繼承;
抽象類中可以包含抽象方法和非抽象方法,非抽象方法需要有方法體;
如果一個(gè)類繼承了抽象類,①如果實(shí)現(xiàn)了所有的抽象方法,子類可以不是抽象類;②如果沒有實(shí)現(xiàn)所有的抽象方法,子類仍然是抽象類。

十.類結(jié)構(gòu)擴(kuò)展
1.Java 中使用包進(jìn)行各個(gè)功能類的結(jié)構(gòu)劃分,也可以解決在多人開發(fā)時(shí)所產(chǎn)生的類名稱重復(fù)的問題。
2.在Java 中使用 package 關(guān)鍵字將一個(gè)類放入一個(gè)包中,包的本質(zhì)就是一個(gè)目錄,在開發(fā)中往往需要依據(jù)自身的開發(fā)環(huán)境定義父包名稱和子包名稱,在標(biāo)準(zhǔn)開發(fā)中所有的類都必須放在一個(gè)包內(nèi)
3.在 Java 中使用 import 語句,可以導(dǎo)入一個(gè)已有的包。
4.如果在一個(gè)程序中導(dǎo)入了不同包的同名類,在使用時(shí)一定要明確指出包的名稱,即“包.類名稱”
5.Java 中的訪問控制權(quán)限分為4 種: private、default、protected、public。
6.使用jar 命令可以將一個(gè)包打成一個(gè)jar 文件,供用戶使用。
7.單例設(shè)計(jì)模式與多例設(shè)計(jì)模式都必須要求構(gòu)造方法私有化,同時(shí)需要在類的內(nèi)部提供好實(shí)例化對(duì)象,利用引用傳遞交給外部類進(jìn)行使用。
8.JDK 1.5 之后提供的枚舉類型可以簡化多例設(shè)計(jì)模式的定義,同時(shí)可以提供更加豐富的類結(jié)構(gòu)定義。
9,使用 enum 關(guān)鍵字定義的舉將默認(rèn)繼承 Enum 父類,在 Enum 類中的構(gòu)造方法使用 protected 權(quán)限定義,并且要接收枚舉的名稱和序號(hào)(根據(jù)枚舉的對(duì)象定義順序自動(dòng)生成)
Weekday monday = Weekday.MONDAY;
System.out.println(monday.getDayNumber()); // 輸出:1

十一.異常的捕捉與處理
異常是導(dǎo)致程序中斷運(yùn)行的一種指令流,當(dāng)異常發(fā)生時(shí),如果沒有進(jìn)行良好的處理,則程序?qū)?huì)中斷執(zhí)行。
異常處理可以使用 try...catch 結(jié)構(gòu)進(jìn)行處理,也可以使用 try...catch...finally 結(jié)構(gòu)進(jìn)行處理。在 try 語句中捕捉異常,之后在 catch 中處理異常,finally 作為異常的統(tǒng)一出口,不管是否發(fā)生異常都要執(zhí)行此段代碼。
異常的最大父類是 Throwable,其分為兩個(gè)子類:Exception 和 Error。Exception 表示程序處理異常,而 Error 表示 JVM 錯(cuò)誤,一般不由程序開發(fā)人員處理。
發(fā)生異常之后,JVM 會(huì)自動(dòng)產(chǎn)生一個(gè)異常類的實(shí)例化對(duì)象,并匹配相應(yīng)的 catch 語句中的異常類型,也可以利用對(duì)象的向上轉(zhuǎn)型關(guān)系,直接捕獲 Exception。
throws 用在方法聲明處,表示本方法不處理異常。
throw 表示在方法中手動(dòng)拋出一個(gè)異常。
自定義異常類的時(shí)候,只需繼承 Exception 類或 RuntimeException 類即可。
斷言 (assert) 是 JDK 1.4 之后提供的新功能,可以用來檢測程序的執(zhí)行結(jié)果,但開發(fā)中并不提倡使用斷言進(jìn)行檢測。
面試題: throw 和 throws 的區(qū)別?
(1)throw
作用在方法內(nèi),表示拋出具體異常,由方法體內(nèi)的語句處理;
一定拋出了異常;(2)throws
作用在方法的聲明上,表示拋出異常,由調(diào)用者來進(jìn)行異常處理;
可能出現(xiàn)異常,不一定會(huì)發(fā)生異常;
?面試題:final、finally、finalize 有什么區(qū)別?
final可以修飾類,變量,方法,修飾的類不能被繼承,修飾的變量不能重新賦值,修飾的方法不能被重寫
finally用于拋異常,finally代碼塊內(nèi)語句無論是否發(fā)生異常,都會(huì)在執(zhí)行finally,常用于一些流的關(guān)閉。
finalize方法用于垃圾回收。
一般情況下不需要我們實(shí)現(xiàn)finalize,當(dāng)對(duì)象被回收的時(shí)候需要釋放一些資源,比如socket鏈接,在對(duì)象初始化時(shí)創(chuàng)建,整個(gè)生命周期內(nèi)有效,那么需要實(shí)現(xiàn)finalize方法,關(guān)閉這個(gè)鏈接。
但是當(dāng)調(diào)用finalize方法后,并不意味著gc會(huì)立即回收該對(duì)象,所以有可能真正調(diào)用的時(shí)候,對(duì)象又不需要回收了,然后到了真正要回收的時(shí)候,因?yàn)橹罢{(diào)用過一次,這次又不會(huì)調(diào)用了,產(chǎn)生問題。所以,不推薦使用finalize方法。
??面試題:try-catch-finally 中,如果 catch 中 return 了,finally 還會(huì)執(zhí)行嗎?
會(huì)
?面試題:常見的異常類有哪些?
NullPointerException:空指針異常;
SQLException:數(shù)據(jù)庫相關(guān)的異常;
IndexOutOfBoundsException:數(shù)組下角標(biāo)越界異常;
FileNotFoundException:打開文件失敗時(shí)拋出;
IOException:當(dāng)發(fā)生某種IO異常時(shí)拋出;
ClassCastException:當(dāng)試圖將對(duì)象強(qiáng)制轉(zhuǎn)換為不是實(shí)例的子類時(shí),拋出此異常;
NoSuchMethodException:無法找到某一方法時(shí),拋出;
ArrayStoreException:試圖將錯(cuò)誤類型的對(duì)象存儲(chǔ)到一個(gè)對(duì)象數(shù)組時(shí)拋出的異常;
NumberFormatException:當(dāng)試圖將字符串轉(zhuǎn)換成數(shù)字時(shí),失敗了,拋出;
IllegalArgumentException 拋出的異常表明向方法傳遞了一個(gè)不合法或不正確的參數(shù)。
ArithmeticException當(dāng)出現(xiàn)異常的運(yùn)算條件時(shí),拋出此異常。例如,一個(gè)整數(shù)“除以零”時(shí),拋出此類的一個(gè)實(shí)例。

十二.內(nèi)部類
內(nèi)部類的最大作用在于可以與外部類直接進(jìn)行私有屬性的相互訪問,避免對(duì)象引用所帶來的麻煩。
使用 static 關(guān)鍵字定義的內(nèi)部類表示外部類,可以在沒有外部類實(shí)例化對(duì)象的情況下使用,同時(shí)只能訪問外部類中的 static 結(jié)構(gòu)定義。
匿名內(nèi)部類主要應(yīng)用于抽象類和接口上的擴(kuò)展,利用匿名內(nèi)部類可以有效地減少子類定義的數(shù)量。
Lambda 是函數(shù)式編程的一種形式,是在匿名內(nèi)部類的基礎(chǔ)上發(fā)展而來的。Lambda 表達(dá)式使用的前提是該接口只允許有一個(gè)抽象方法,或者使用 "@FunctionalInterface" 注解定義。
方法引用與對(duì)象引用類似,可以為方法進(jìn)行別名定義。
JDK 中提供了四個(gè)內(nèi)建函數(shù)式接口:Function、Consumer、Supplier、Predicate。
鏈表是一種線性的數(shù)據(jù)結(jié)構(gòu),所有的數(shù)據(jù)按照存儲(chǔ)的先后關(guān)系進(jìn)行保存。鏈表的實(shí)現(xiàn)核心是節(jié)點(diǎn)(Node)類的設(shè)計(jì)以及引用關(guān)系的配置。在實(shí)際開發(fā)中,優(yōu)秀的鏈表設(shè)計(jì)不僅具有較高的查找性能,還適合多線程并發(fā)操作。本章介紹的鏈表只是對(duì)鏈表基本原理的分析,實(shí)際開發(fā)中會(huì)使用 JDK 提供的類集來代替自己實(shí)現(xiàn)鏈表。
寵物商店程序中的模式是一種常用的設(shè)計(jì)模式,通過接口作為標(biāo)準(zhǔn)實(shí)現(xiàn)應(yīng)用架構(gòu)的設(shè)計(jì)。