二、面向?qū)ο?/h2>
1、面試對(duì)象思想:
(1)概述:面向?qū)ο髮?duì)相對(duì)于面向過程而言的,面向過程強(qiáng)調(diào)的是功能,面向?qū)ο髲?qiáng)調(diào)的是講功能封裝進(jìn)對(duì)象,強(qiáng)調(diào)具備功能的對(duì)象;
(2) 思想特點(diǎn):
- 是符合人們思考習(xí)慣的一種思想
- 將復(fù)雜的事情簡(jiǎn)單化
- 將程序員從執(zhí)行者編程了指揮者
(3)特征:
封裝:隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外提供公共訪問方式。
繼承:多個(gè)類中存在相同的屬性和行為時(shí),將這些內(nèi)容抽取到單獨(dú)一個(gè)類中,那么多個(gè)類無需再定義這些屬性和行為,只需要繼承那個(gè)類即可。
多態(tài):一個(gè)對(duì)象在程序不同運(yùn)行時(shí)刻代表的多種狀態(tài),父類或者接口的引用指向子類對(duì)象。
2、類和對(duì)象:
類:對(duì)現(xiàn)實(shí)世界中某種事物的描述,是抽象的。
對(duì)象:事物具體存在的個(gè)體。
3、成員變量和局部變量的區(qū)別(重點(diǎn))
(1)作用域
成員變量:針對(duì)整個(gè)類有效。
局部變量:只在某個(gè)范圍內(nèi)有效(一般指的是方法,語句體內(nèi))。
(2)存儲(chǔ)位置
成員變量:隨著對(duì)象的創(chuàng)建而存在,隨著對(duì)象的消失而消失。
局部變量:在方法被調(diào)用或語句被執(zhí)行的時(shí)候存在,存儲(chǔ)在棧內(nèi)存中,當(dāng)方法調(diào)用完或語句結(jié)束后,就自動(dòng)釋放。
(3)初始值
成員變量:有默認(rèn)初始值。
局部變量:沒有默認(rèn)初始值,使用前必須賦值。
4、匿名對(duì)象
(1)匿名對(duì)象就是沒有名字的對(duì)象,是對(duì)象的一種簡(jiǎn)寫形式。
(2)應(yīng)用場(chǎng)景
- 只調(diào)用一次類中的方法。
- 可以作為實(shí)際參數(shù)在方法傳遞中使用。
5、封裝
定義:隱藏對(duì)象屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外提供公共的訪問方式;
優(yōu)點(diǎn):
- 將變化隔離
- 方便使用
- 提高復(fù)用性
- 提高安全性
6、private關(guān)鍵字在代碼中的體現(xiàn)
- 私有的意思,代表權(quán)限修飾符
- 用來修飾成員變量和函數(shù)
- 用private修飾的成員只在本類中有效
- 私有是封裝的一種體現(xiàn)
7、構(gòu)造方法
(1)特點(diǎn)
- 方法名與類名相同
- 沒有返回值類型
- 沒有返回值
(2)作用
構(gòu)造函數(shù)是用于創(chuàng)建對(duì)象,并對(duì)其進(jìn)行初始化賦值,對(duì)象一建立就自動(dòng)調(diào)用相對(duì)應(yīng)的構(gòu)造函數(shù)。
(3)構(gòu)造方法的注意事項(xiàng)
- 如果一個(gè)自定義的類沒有構(gòu)造方法,系統(tǒng)會(huì)默認(rèn)給出一個(gè)無慘構(gòu)造方法。
- 如果一個(gè)自定義類提供了構(gòu)造方法,那么系統(tǒng)將不再給出無參構(gòu)造方法,這個(gè)時(shí)候你可以不適用無參構(gòu)造方法,如果想適用,那么久必須手動(dòng)給出無參構(gòu)造方法。
*一般情況下,我們的自定義類都要手動(dòng)給出無參構(gòu)造方法。
(4)構(gòu)造方法和成員方法的區(qū)別
A:格式區(qū)別
構(gòu)造方法和類名相同,并且沒有返回值類型,也沒有返回值。
普通成員方法名可以任意起,但不能和系統(tǒng)重名,必須有返回值類型,可以沒有返回值。
B:作用區(qū)別
構(gòu)造方法用于創(chuàng)建對(duì)象,并進(jìn)行初始化值。
普通成員方法用于完成特定的功能。
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)用多次。
8、構(gòu)造代碼塊
(1)作用:
給對(duì)象進(jìn)行初始化,對(duì)象一建立就執(zhí)行,而且優(yōu)先于構(gòu)造函數(shù)執(zhí)行。
(2)構(gòu)造代碼塊和構(gòu)造函數(shù)的區(qū)別:
- 構(gòu)造代碼塊是給所有不同對(duì)象的共性進(jìn)行統(tǒng)一初始化
- 構(gòu)造函數(shù)是給對(duì)應(yīng)的對(duì)象進(jìn)行初始化
9、this關(guān)鍵字
(1)this關(guān)鍵字代表本類對(duì)象的一個(gè)引用,誰調(diào)用的this所在的方法,this就代表誰
(2)this的使用場(chǎng)景
- 用于區(qū)別成員變量和局部變量;
- 在定義函數(shù)時(shí),該函數(shù)內(nèi)部要用到調(diào)用函數(shù)的對(duì)象時(shí),因?yàn)榇藭r(shí)對(duì)象還沒有建立,故用this代表次對(duì)象。
- 構(gòu)造函數(shù)間調(diào)用
this參數(shù)必須作為第一條語句存在。
10、Person p = new Person();在內(nèi)存中做了哪些事情。
- 將Person.class文件加載進(jìn)內(nèi)存中。
- 如果P定義在主方法中,那么久會(huì)在??臻g開辟一個(gè)變量空間p。
- 在堆內(nèi)存給對(duì)象分配空間。
- 對(duì)對(duì)象中的成員進(jìn)行默認(rèn)初始化。
- 對(duì)對(duì)象中的成員進(jìn)行顯示初始化。
- 調(diào)用構(gòu)造代碼塊對(duì)對(duì)象進(jìn)行初始化(如果沒有就不執(zhí)行)。
- 調(diào)用構(gòu)造方法對(duì)對(duì)象進(jìn)行初始化,對(duì)變量初始化完畢。
- 將對(duì)象的內(nèi)存地址賦值給p變量,讓p變量指向該對(duì)象。
11、static關(guān)鍵字
(1)靜態(tài)的意思,用來修飾成員變量和成員函數(shù)。
(2)靜態(tài)的特點(diǎn)
- 隨著類的加載而加載
- 優(yōu)先于對(duì)象存在
- 對(duì)所有對(duì)象共享
- 可以被類名之間調(diào)用
(3)靜態(tài)的注意事項(xiàng)
A:靜態(tài)方法只能訪問靜態(tài)成員,因?yàn)殪o態(tài)的內(nèi)容是隨著類的加載而加載的,它先進(jìn)內(nèi)存。
B:靜態(tài)方法中不能使用this、super關(guān)鍵字。
C:主方法是靜態(tài)的
public static void main (String []args)
public : 公共的意思,是最大的權(quán)限修飾符。
static : 由于jvm調(diào)用main方法的時(shí)候,沒有創(chuàng)建對(duì)象,只能通過類名調(diào)用,所以main必須是static修飾。
void : 由于main方法被jvm調(diào)用,不需要返回值,用void修飾。
main : main是主要的意思,所以jvm采用這個(gè)名字,它是程序的入口。
String[] : 字符串?dāng)?shù)組
args : 數(shù)組名
在運(yùn)行的時(shí)候,通過java命令給args數(shù)組賦值。
(4)靜態(tài)變量和成員變量的區(qū)別
A:調(diào)用方式
- 靜態(tài)變量也成為類變量,可以直接通過類名調(diào)用。也可以通過對(duì)象名調(diào)用,這個(gè)屬于類。
- 成員變量也成為實(shí)例變量,只能用過你對(duì)象名調(diào)用,這個(gè)屬于對(duì)象。
B:存儲(chǔ)位置
- 靜態(tài)變量存儲(chǔ)在方法區(qū)長(zhǎng)中靜態(tài)區(qū)。
- 成員變量存儲(chǔ)在堆內(nèi)存中。
C:生命周期
- 靜態(tài)變量隨著類的加載而存在,隨著類的消失而消失,生命周期長(zhǎng)。
- 成員變量隨著對(duì)象的創(chuàng)建而存在,隨著對(duì)象的消失而消失。
D:與對(duì)象的相關(guān)性
- 靜態(tài)變量的所有對(duì)象的共享的數(shù)據(jù)。
- 成員變量是每個(gè)對(duì)象所特有的數(shù)據(jù)。
(6)什么時(shí)候使用靜態(tài)?
- 當(dāng)所有對(duì)象共享某個(gè)數(shù)據(jù)的時(shí)候,就把這個(gè)成員變量定義為靜態(tài)修飾。
- 當(dāng)某個(gè)方法中沒有訪問該類中的非靜態(tài)成員,就可以把這個(gè)方法定義為靜態(tài)修飾。
- 靜態(tài)的生命周期較長(zhǎng),所以一般不推薦使用。
(7)靜態(tài)代碼塊
- 它只執(zhí)行一次,它比main方法還先執(zhí)行。
- 執(zhí)行順序 靜態(tài)代碼塊 → 構(gòu)造代碼塊 → 構(gòu)造方法
12、制作API(次重點(diǎn))
API(全拼):Application Program Interface 應(yīng)用程序編程接口。
(1)類中的內(nèi)容需要用文檔注釋。
(2)使用JDK\bin目錄下的javadoc工具。
格式:javadoc -d 目錄 -author -version ArrayTool.java
13、單例設(shè)計(jì)模式
(1)設(shè)計(jì)模式是什么?
解決某類問題行之有效的方法,是一種思想,是規(guī)律的總結(jié)。
(2)用來保證某個(gè)類的內(nèi)存中只有一個(gè)對(duì)象。
(3)保證唯一性的思維及步驟
- 為了避免其他程序簡(jiǎn)歷該類對(duì)象,先禁止其他程序簡(jiǎn)歷該類對(duì)象,即將構(gòu)造函數(shù)私有化。
- 為了其他程序訪問到該類對(duì)象,需在本類中創(chuàng)建一個(gè)該類的私有對(duì)象。
- 為了方便其他程序訪問到該類對(duì)象,可以提供對(duì)外公共的訪問方式。
(4)單例設(shè)計(jì)模式的兩種方式
A:餓漢式 當(dāng)類加載的時(shí)候,就創(chuàng)建對(duì)象。
class Student
{
private Student(){}
private static final Student s = new Student();
public static Student getInstance()
{
return s;
}
}
B: 懶漢式 當(dāng)使用的時(shí)候,才去創(chuàng)建對(duì)象。
class Student
{
private Student(){}
private static final Student s = null;
public static Student getInstance()
{
if(s==null)
{
//線程1就進(jìn)來了,線程2就進(jìn)來了。
s = new Student();
}
return s;
}
}
懶漢式和餓漢式的區(qū)別
- 餓漢式是類一加載進(jìn)內(nèi)存就創(chuàng)建好了對(duì)象。
- 懶漢式則是類加載進(jìn)內(nèi)存的時(shí)候,對(duì)象還沒有存在,只有調(diào)用getInstance() 方法時(shí),對(duì)象才開始創(chuàng)建。
- 懶漢式是延遲加載,如果多個(gè)線程同時(shí)操作懶漢式時(shí)就可能出現(xiàn)線程安全問題,解決線程安全問題可以加同步來解決。但是加了同步之后,每次都比較繁瑣,效率變慢,所以加雙重鎖來提高程序效率。
- 開發(fā)常用餓漢式,因?yàn)轲I漢式簡(jiǎn)單安全。懶漢式容易發(fā)生問題。
14、Math類的使用(重點(diǎn))
(1)數(shù)學(xué)操作類 : 該類沒有構(gòu)造方法,方法均為靜態(tài)。
(2)掌握內(nèi)容
A :成員變量:
E:比任何其他值都更接近e(即自然對(duì)數(shù)的底數(shù))的double值。
PI:比任何其他值都更接近pi(即圓的周長(zhǎng)與直徑之比)的double值。
B:成員方法
static double abs(double a)
返回 double 值的絕對(duì)值。返回絕對(duì)值
static double ceil(double a)
返回最小的(最接近負(fù)無窮大)double 值,該值大于等于參數(shù),并等于某個(gè)整數(shù)。
static double floor(double a)
返回最大的(最接近正無窮大)double 值,該值小于等于參數(shù),并等于某個(gè)整數(shù)。
max:返回兩個(gè)值中較大的那個(gè)
min:返回兩個(gè)值中較小的那個(gè)
static long round(double a)
返回最接近參數(shù)的 long。
static int round(float a)
返回最接近參數(shù)的 int。
static double random()
返回帶正號(hào)的 double 值,該值大于等于 0.0 且小于 1.0。
static double pow(double a, double b)
返回第一個(gè)參數(shù)的第二個(gè)參數(shù)次冪的值。
static double sqrt(double a)
返回正確舍入的 double 值的正平方根。
15、Random類的使用(重點(diǎn))
(1) 產(chǎn)生一個(gè)隨機(jī)數(shù)的類
(2) 掌握內(nèi)容
- 構(gòu)造方法
Random(); 創(chuàng)建一個(gè)新的隨機(jī)數(shù)生成器.
Random(long seed); 使用單個(gè)long種子創(chuàng)建一個(gè)新的隨機(jī)數(shù)生成器. - 成員方法
int nextlnt(); 返回下一個(gè)偽隨機(jī)數(shù),它是此隨機(jī)數(shù)生成器的序列中均勻分布的int值.
int nextllnt(int n); 返回一個(gè)偽隨機(jī)數(shù),它是取自此隨機(jī)數(shù)生成器序列的,在0(包括)和指定值(不包括)之間均勻分布的int值.
16、Scanner類的使用
(1)可以獲取從鍵盤輸入的數(shù)據(jù)
(2)掌握內(nèi)容
- 構(gòu)造方法
Scanner(ImputStream source) 構(gòu)造一個(gè)新的Scanner,它生成的值是從指定的輸入流掃描的。
如:Scanner sc = newScanner(System.in);
方法摘要: - sc.nextInt();
- sc.nextLine();
17、繼承(重點(diǎn))
(1)繼承的概念把很多類的相同特征和行為進(jìn)行抽取,用一個(gè)類來描述。讓多個(gè)類和這個(gè)類產(chǎn)生一個(gè)關(guān)系。
好處:多個(gè)類可以省去很多代碼,這個(gè)就是繼承關(guān)系。
(2)繼承的體系結(jié)構(gòu)
A:多個(gè)具體的對(duì)象,不斷的向上抽取共享的內(nèi)容,最終形成一個(gè)體系,這個(gè)體系叫繼承體系。
B:繼承體系的學(xué)習(xí)和使用原則
- 學(xué)習(xí)頂層的內(nèi)容,因?yàn)樗钦麄€(gè)體系的共性內(nèi)容。
- 創(chuàng)建子類使用,也就是使用底層的具體對(duì)象。
(3)繼承的特點(diǎn)
- A:java中只能單繼承,不能多繼承。
- java可以有多重(層)繼承。
(4)繼承的好處:
1、提高代碼的復(fù)用性
2、繼承的出現(xiàn)讓類與類之間產(chǎn)生的關(guān)系,提高了多態(tài)的前提。
(5)子父類中的成員關(guān)系
A、成員變量
在子類方法中使用一個(gè)變量時(shí):
首先,在方法的局部變量中找這個(gè)變量,有則使用。
否則,在本類中找成員變量,有則使用。
否則,在父類中找成員變量,有則使用。
否則,報(bào)錯(cuò)。
B、成員變量
用子類對(duì)象使用一個(gè)方法時(shí):
首先,在子類中找這個(gè)方法,有則使用。
否則,在父類中找這個(gè)方法,有則使用。
否則,報(bào)錯(cuò)。
重寫和重載的區(qū)別?
重載:在同一個(gè)類中,方法名相同,參數(shù)列表不同。重載可以改變返回值類型。
重寫:在不同類中(要有繼承關(guān)系)
方法聲明相同(返回類型、方法名、參數(shù)列表相同)。
重寫需要注意:
- 子類方法的訪問權(quán)限要大于等于父類的訪問權(quán)限。
- 靜態(tài)只能重寫靜態(tài),但是這種情況不會(huì)出現(xiàn)。
構(gòu)造方法
子類的實(shí)例化過程:
- 子類創(chuàng)建對(duì)象時(shí),會(huì)先去創(chuàng)建父類的對(duì)象。
- 默認(rèn)是去調(diào)用父類的無參構(gòu)造方法。
子類的構(gòu)造方法,第一行默認(rèn)是super();
原因:子類繼承父類的成員使用,使用這些成員變量前必須初始化,而他們是父類的成員,所以必須通過父類進(jìn)行初始化,所以會(huì)先創(chuàng)建一個(gè)父類對(duì)象。
當(dāng)父類沒有無參構(gòu)造時(shí),必須使用this或者super調(diào)用其他的構(gòu)造方法。
(6)this和super的區(qū)別
this:代表本類對(duì)象的引用。
super:代表父類的存儲(chǔ)空間。
18、final關(guān)鍵字(重點(diǎn))
(1)最終的意思,可以用來修飾類,方法,變量。
(2)
- final修飾的類不能被繼承。
- final修飾的方法不能被重寫。
- final修飾的變量是一個(gè)常量。只能被賦值一次。
- 內(nèi)部類只能訪問final修飾的局部變量。
19、抽象類(重點(diǎn))
(1)對(duì)個(gè)類有相同的方法聲明,但是方法體不一樣。這個(gè)時(shí)候,我們考慮把方法聲明進(jìn)行抽取。
讓子類繼承后:自己去實(shí)現(xiàn)方法體。沒有方法體的方法,我們需要用抽象標(biāo)志下。
抽象類的關(guān)鍵字是:abstract
(2)抽象類:
該方法稱為抽象方法,包含抽象方法的類就是抽象類。
(3)抽象類的特點(diǎn):
A:抽象類和抽象方法都要用abstract進(jìn)行修飾。
B:抽象類不能被實(shí)例化。
C:抽象類中不能有抽象方法,但是有抽象方法的類一定是抽象類。
(4)抽象類中數(shù)據(jù)的特點(diǎn)
成員變量
抽象類中可以有變量,也可以有常量。成員方法
抽象類中可以有抽象方法,也可以有非抽象方法。-
構(gòu)造方法
- 抽象類是一個(gè)類,所以有構(gòu)造方法。
- 雖然本身不能實(shí)例化,但可以給子類實(shí)例化使用。
(5)抽象類中的問題
- A:抽象類中是否有構(gòu)造方法?能不能被實(shí)例化?如果不能,為什么有構(gòu)造方法?
抽象類有構(gòu)造方法,抽象類中的構(gòu)造方法供子類實(shí)例化調(diào)用。 - B:抽象關(guān)鍵字abstract不可以和哪些關(guān)鍵字共存?
1、private:
私有內(nèi)容子類繼承不到,所以不能重寫。但是abstract修飾的方法,要求被重寫,兩者沖突。
2、final
final修飾的方法不能被重寫。
而abstract修飾的方法,要求被重寫,兩者沖突。
3、static
假如一個(gè)抽象方法能通過static修飾,那么這個(gè)方法,就可以直接通過類名調(diào)用。而抽象方法是沒有方法體的,這樣的調(diào)用無意義,所以不能加static。
- C:抽象類中可以不可以沒有抽象方法?如果可以,這樣的類有什么用嗎?
答:抽象類可以沒有抽象方法,抽象類中沒有抽象方法的作用,只是味蕾不讓別的類建立該抽象類的對(duì)象。
20、接口Interface
(1)定義
當(dāng)一個(gè)類中的方法都是抽象的時(shí)候,java提供了另一種表示方法,叫接口。
(2)接口的成員特點(diǎn)
- 成員變量
是常量,默認(rèn)修飾 public static final - 成員方法
都是抽象的,默認(rèn)修飾 public abstract
(3)關(guān)系
- 類與類的關(guān)系
是繼承關(guān)系,類與類只能單繼承,可以多級(jí)繼承。 - 類與接口的關(guān)系
是實(shí)現(xiàn)關(guān)系,一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。類在繼承一個(gè)類的同時(shí)可以實(shí)現(xiàn)多個(gè)接口。 - 接口與接口的關(guān)系
是繼承關(guān)系,接口可以多繼承接口。
(4)接口的特點(diǎn)
- 是對(duì)外保留的規(guī)則
- 是功能的擴(kuò)展
- 接口的出現(xiàn)降低耦合性
- 耦合:類與類之間的關(guān)系
- 內(nèi)聚:類完成功能的能力
- 編程規(guī)范:低耦合,搞內(nèi)聚
- 接口可以多實(shí)現(xiàn)。
如:CPU和主板、筆記本的USB插口、插座。
(5)接口和抽象類的區(qū)別
抽象類只能被單繼承
接口可以多實(shí)現(xiàn),接口的出現(xiàn)避免了多繼承的局限性。-
抽象類中的數(shù)據(jù)特點(diǎn)
- 成員變量:可以是變量,也可以是常量。
- 成員方法:可以是抽象方法,也可以是非抽象方法。
- 構(gòu)造方法:有構(gòu)造方法。
-
接口中的數(shù)據(jù)特點(diǎn)
- 成員變量:是常量。默認(rèn)修飾 public static final
- 成員方法:都是抽象方法。都要默認(rèn)修飾 public abstract
- 構(gòu)造方法:沒有構(gòu)造方法。
抽象類中定義的是繼承體系中的共性功能
接口中定義的是繼承體系中的擴(kuò)展功能。抽象類被繼承是“ is a” 關(guān)系 :xx 是yy 的一種
接口被實(shí)現(xiàn)是“ like a” 關(guān)系:xx像yy的一種
21、多態(tài)
(1)同一個(gè)對(duì)象,在程序不同時(shí)刻的多種運(yùn)行狀態(tài)。
例如:動(dòng)物、狗是狗,狗是動(dòng)物。水(氣態(tài)、固態(tài)、液態(tài));
(2)多態(tài)的前提
- 存在繼承關(guān)系或者實(shí)現(xiàn)關(guān)系
- 有方法重寫
- 父類(接口)引用指向子類(實(shí)現(xiàn))對(duì)象
(3)多態(tài)的好處和弊端:
好處:多態(tài)的存在提高了程序的擴(kuò)展性和后期維護(hù)性。
弊端:雖然可以預(yù)先使用,但是只能訪問父類中已有的功能,運(yùn)行的是后期子類的功能內(nèi)容。不能預(yù)先使用子類中定義的特有功能。
(4)多態(tài)中對(duì)象調(diào)用成員的特點(diǎn)。
Fu f = new Zi();
- 成員變量
- 編譯看左邊,運(yùn)行看右邊。
- 成員方法
- 編譯看左邊,運(yùn)行看右邊。
- 靜態(tài)方法
- 編譯看左邊,運(yùn)行看左邊。
(5)多態(tài)的思想
只會(huì)同一批對(duì)象做事情,舉例:帶兵打仗,下課等等。
22、instance關(guān)鍵字
- 用于判斷某個(gè)對(duì)象是否是某種類型
- 格式
- 對(duì)象名 instance 子類(實(shí)現(xiàn))名
23、Object類
(1)概述
Object類是所有類的根類(超類,所有類都繼承或間接繼承Object類),java中提供的類以及我們自定義的類都直接或者間接的繼承自O(shè)bject類。
(2)Object類中的方法
void finalize();
當(dāng)垃圾回收器確定不存在該對(duì)象的更多引用時(shí),由于對(duì)象的垃圾回收器調(diào)用此方法。Class getClass();
獲取對(duì)象的子界面文件的描述類。
String name = s.getClass().getName();int hashCode();
獲取對(duì)象的哈希值。其實(shí)就是對(duì)象的內(nèi)存地址值十進(jìn)制表示。String toString();
返回對(duì)象的字符串表示
getClass().getName()+"@"+Integer.toHexString(hashCode());
一般我們輸出對(duì)象名的時(shí)候,其實(shí)底層調(diào)用的就是toString()方法。這種返回沒有意義,所以我們會(huì)重寫這個(gè)方法,顯示類的成員變量信息。boolean equals(Object obj);
用于比較兩個(gè)對(duì)象的地址值是否相同。
我們獲取對(duì)象后,比較它的地址值意義不大。所以也會(huì)用這個(gè)方法進(jìn)行重寫。
(4) == 和 equals的用法:
- ==怎么用?
- 可以用于比較基本數(shù)據(jù)類型,比較的就是基本數(shù)據(jù)類型的值是否相等。
- 可以用于比較引用數(shù)據(jù)類型,比較的是對(duì)象的地址值是否相等。
- equals怎么用?
- equals只能用于比較引用數(shù)據(jù)類型。
- Object提供的equals是用于比較對(duì)象地址值是否相同。
- 自定義類中,如果重寫equals方法,那么就是按照你自己的需求來比較。
24、package關(guān)鍵字
(1)概念
包:就是文件夾,用于區(qū)分不能包下的類名。
(2)好處
對(duì)類進(jìn)行分類管理
-
給類提供多層命名空間
- aaa.Demo
- bbb.Demo
寫在程序文件的第一行
包也是封裝的一種形式
25、import 關(guān)鍵字
(1)導(dǎo)入包的關(guān)鍵字
(2)格式
import 包名;
(3)注意
- 一個(gè)程序文件夾中只有一個(gè)package,可以有多個(gè)import。
- 用來導(dǎo)報(bào)中的類,不能導(dǎo)包中的包。
- 通常寫import mypacg.Demo
(4)關(guān)鍵字順序
類,包,導(dǎo)報(bào)這些關(guān)鍵字的順序
包 → 導(dǎo)包 → 類
26、不同的修飾符可以修飾哪些內(nèi)容
27、內(nèi)部類(次重點(diǎn))
(1)定義
把一個(gè)類定義在某個(gè)類中,這個(gè)類就被成為內(nèi)部類,內(nèi)置類,嵌套類。
(2)訪問特點(diǎn)
- 內(nèi)部類可以直接訪問外部類中的成員,因?yàn)閮?nèi)部類持有外部類的引用。
格式: 外部類名.this - 外部類要想訪問內(nèi)部類的成員,不想創(chuàng)建對(duì)象訪問。
(3)內(nèi)部類的訪問格式:
- 當(dāng)內(nèi)部類定義在外部類的成員位置,而且非私有,則可以在其他外部類中直接建立內(nèi)部類對(duì)象。
格式:外部類名.內(nèi)部類名 變量名 = new 外部類對(duì)象.內(nèi)部類對(duì)象
如: Outer.Inner in = new Outer().new Inner(); - 當(dāng)內(nèi)部類在外部類成員位置,且被static修飾時(shí)
- 外部類其他類可以直接訪問靜態(tài)內(nèi)部類的非靜態(tài)成員。
- 格式: new 外部類名.內(nèi)部類名().內(nèi)部類成員。
- 如:new Outer.Inner().function();
- 外部其他類可以直接訪問靜態(tài)內(nèi)部類的靜態(tài)成員。
- 格式:new 外部類.內(nèi)部類名.內(nèi)部類成員
- 如:new Outer.Inner.function();
- 外部類其他類可以直接訪問靜態(tài)內(nèi)部類的非靜態(tài)成員。
(4)什么時(shí)候使用內(nèi)部類
假如A類和B類,A類想直接訪問B類的成員,B類訪問A類的成員的時(shí)候,需要?jiǎng)?chuàng)建A類對(duì)象進(jìn)行訪問,這個(gè)時(shí)候,就可以把A類定義為B類的內(nèi)部類。
(5)內(nèi)部類的位置
- 成員位置
- 可以被private修飾(Body , Heart)
- 可以被static修飾(它訪問外部類的成員必須是靜態(tài)的。);
- 局部變量
- 可以直接訪問外部類中的成員,因?yàn)檫€持有外部類的引用。
- 可以可以直接訪問局部成員,但是局部成員要用final修飾。
- 如:new Outer.Inner.function();
(6)通過class文件我們就可以區(qū)分是否帶有內(nèi)部類,以及類的位置。
- Outer$Inner:成員內(nèi)部類
- Outer$1Inner:局部?jī)?nèi)部類
28、匿名內(nèi)部類(局部?jī)?nèi)部類的簡(jiǎn)寫)(重點(diǎn))
(1)前提
繼承一個(gè)類或者實(shí)現(xiàn)一個(gè)接口。
(注意:不要弄混內(nèi)部類的前提和多態(tài)的前提)
(2)格式
new 父類名或接口名(){
重寫父類方法或者實(shí)現(xiàn)接口中的方法。
也可以自定義其他方法。
};
(3)什么時(shí)候定義匿名內(nèi)部類?
匿名內(nèi)部類只是為了簡(jiǎn)化書寫,匿名內(nèi)部類有局限,通常定義匿名內(nèi)部類時(shí),該類不會(huì)超過三個(gè)方法。
(4)匿名內(nèi)部類的好處和弊端:
- 好處
- 簡(jiǎn)化代碼書寫
- 弊端
- 不能直接調(diào)用自己特有的方法
- 不能執(zhí)行強(qiáng)轉(zhuǎn)動(dòng)作
- 如果該類里面方法較多,不允許使用匿名內(nèi)部類。
29、模板設(shè)計(jì)模式:
在定義功能時(shí),功能的一部分是確定的,有一部分是不確定的,而且確定的部分在使用不確定的部分,可將不確定的部分暴露出去,由該類的子類去完成。
如:求一段程序的運(yùn)行時(shí)間。
30、異常
(1)定義
程序運(yùn)行過程中的不正?,F(xiàn)象叫異常。
(2)特點(diǎn)
導(dǎo)致程序運(yùn)行部正常的現(xiàn)象很多,所以就有很多的異常對(duì)象。而這些異常對(duì)象存在著共性的內(nèi)容,所以可以不斷進(jìn)行抽取。最終形成了異常的體系結(jié)構(gòu)。
異常體系的根類是:Throwable
Throwable:
|--Error:重大的問題,我們處理不了。也不需要編寫代碼處理,比如內(nèi)存溢出。
|--Exception:一般的錯(cuò)誤,是我們編寫代碼進(jìn)行處理的。
|--RunntimeException:運(yùn)行時(shí)異常,這個(gè)我們也不需要處理。其實(shí)就是為了讓他在運(yùn)行時(shí)出問題,然后我們?cè)倩貋硇薷拇a。
(3)異常分類
異常分類有兩種:
- 編譯時(shí)被檢測(cè)異常:
- 該異常在編譯時(shí),如果沒有處理(沒有拋出也沒有try),編譯失敗。
- 該異常被標(biāo)識(shí),代表這個(gè)可以被處理。
- 運(yùn)行時(shí)異常(編譯時(shí)不檢測(cè))
- 在編譯時(shí),不需要處理,編譯器不檢查。
- 該異常的發(fā)生,建議不處理。讓程序停止。需要對(duì)代碼進(jìn)行更改。
(4)異常體系的特點(diǎn):
異常體系中的所有類及其子類對(duì)象都具備可拋性,也就是說可以被throw和throws關(guān)鍵字操作。
(5)main方法是如何處理異常的。
- 在main里面編寫的代碼進(jìn)行處理。
- 交給jvm自己進(jìn)行處理。采用的是jvm的默認(rèn)處理方式(相當(dāng)于調(diào)用了異常對(duì)象的printStackTrace()方法)。
(6)Throwable類的學(xué)習(xí)。
- getMessage():獲取異常信息,返回字符串。
- toString():獲取異常類名和異常信息,返回字符串。
- printStackTrace():獲取異常類名和異常信息,以及異常出現(xiàn)在程序中的位置。返回值void。
(7)異常處理。
1)try...catch...finally
基本格式
try
{
可能出現(xiàn)異常的代碼
}
catch(異常對(duì)象)
{
異常處理代碼
}
finally
{
釋放資源
}
變形格式:
try...catch
try...catch...catch...
try...catch...catch...finally
多個(gè)異常被捕獲的時(shí)候,記住一個(gè)原則:
先捕獲小的,再捕獲大的。
finally:永遠(yuǎn)被執(zhí)行,除非退出jvm,Ststem.exit(0);
面試題:
1.final、finally、finalize的區(qū)別。
final是最終的意思,它可以用于修飾類,成員變量,成員方法。
它修飾的類不能被繼承,它修飾的變量是常量,它修飾的方法不能被重寫。
finally:是異常處理里面的關(guān)鍵字。
它其中的代碼永遠(yuǎn)被執(zhí)行,特殊情況:在執(zhí)行它之前jvm退出。System.exit(0);
finalize:是Object類中的一個(gè)方法。
它是垃圾回收器調(diào)用的方法。
2.假如chtch中有return語句,finally里中的代碼會(huì)執(zhí)行嗎?
在return前執(zhí)行finally里的代碼。
(8)Exception和RunntimeExpection的區(qū)別
Exception:一般性錯(cuò)誤,是需要我們編寫代碼進(jìn)行處理的。
-
RuntimeException:運(yùn)行時(shí)異常,這個(gè)我們需要處理。其實(shí)就是為了讓他在運(yùn)行時(shí)出現(xiàn)問題,然后我們回來修改代碼。
- 在用throws拋出異常的時(shí)候,如果這個(gè)異常屬于RuntimeException的體系的時(shí)候,我們?cè)谡{(diào)用的方法不可以處理(RuntimeException和RuntimeException的子類)。
- 在用throws拋出異常的時(shí)候,如果這個(gè)異常屬于Exception的體系時(shí),我們調(diào)用的地方必須進(jìn)行處理或者拋出。
(9)自定義異常
定義一個(gè)類繼承Exception或者RuntimeException。
為了讓該類自定義類具備可拋性。
讓該類具備操作異常的共性方法。
class MyExcepiton extends Exception
{
MyExcepiton(){}
MyExcepiton(String message)
{
super(message);
}
}
class MyException extends RuntimeException
{
MyExcepiton(){}
MyExcepiton(String message)
{
super(message);
}
}
(10)throws和throw的區(qū)別
- 有throws的時(shí)候可以沒有throw。
- 有throw的時(shí)候,如果throw拋的異常是Exception體系,那么必須有throws在方法上聲明。
- throws用于方法的聲明上,氣候跟的是異常類名,后面可以跟多個(gè)異常類,之間用逗號(hào)隔開。
- throw用于方法體中,其后跟的是一個(gè)異常對(duì)象名。