黑馬程序員 面向?qū)ο?/h1>
靜態(tài)代碼塊
格式:
static
{
狀態(tài)代碼塊的執(zhí)行語(yǔ)句
}
特點(diǎn):隨著類的加載而執(zhí)行,只執(zhí)行一次,優(yōu)先于主函數(shù)
用于給類進(jìn)行初始化
重點(diǎn):靜態(tài)的特性,執(zhí)行順序
?
Person p = new Person();
=>JVM
=>棧 main函數(shù)
=>棧生成P變量
=>堆加載Person類
=>靜態(tài)代碼塊執(zhí)行
=>堆開(kāi)辟空間存儲(chǔ)屬性
=>屬性默認(rèn)初始化
=>構(gòu)造代碼塊初始化
=>構(gòu)造函數(shù)初始化
=>P指向生成的Person類,成為對(duì)象
1.因?yàn)閚ew用到了Person,class所以會(huì)先找到Person.class文件并加載到內(nèi)存中
2.執(zhí)行該類的static代碼塊,如果有的話,給Person.class類進(jìn)行初始化
3.在堆內(nèi)存中開(kāi)辟空間,分配內(nèi)存地址
4.在堆內(nèi)存中劍靈對(duì)象的特有屬性,并進(jìn)行默認(rèn)初始化
5.對(duì)屬性進(jìn)行顯示初始化
6.對(duì)對(duì)象進(jìn)行構(gòu)造代碼塊初始化
7.對(duì)對(duì)象進(jìn)行對(duì)于的構(gòu)造函數(shù)初始化
8.將內(nèi)存地址賦值給棧內(nèi)存中P變量
?
擴(kuò)展====>>>>設(shè)計(jì)模式:解決某一類問(wèn)題最行之有效的方法
java中23種通用設(shè)計(jì)模式
單例設(shè)計(jì)模式:解決一個(gè)類在內(nèi)存中只存在一個(gè)對(duì)象
1.為了避免其他程序過(guò)多建立,先禁止其他程序建立該類對(duì)象
2.還為了讓其他程序可以訪問(wèn)到該類對(duì)象,只好在本類中.自定義一個(gè)對(duì)象
3.為了方便其他程序?qū)ψ远x對(duì)象的訪問(wèn),可以對(duì)外提供一些訪問(wèn)方式
具體實(shí)現(xiàn)??????????? (靈活使用static和private修飾符)
1.將構(gòu)造函數(shù)私有化
2.在類中創(chuàng)建一個(gè)本類對(duì)象
3.提供一個(gè)方法可以獲取到該對(duì)象
?
惡漢式>>>>對(duì)象靜態(tài)加載>>>>一般用這個(gè)
懶漢式>>>>對(duì)象延時(shí)加載>>>>存在BUG>>>與CPU處理機(jī)制相關(guān)
繼承:???????
java只支持單繼承,不支持多繼承
因?yàn)槎嗬^承容易帶來(lái)安全隱患:
當(dāng)多個(gè)父類中定義了功能相同內(nèi)容不同時(shí)子類無(wú)法確定運(yùn)行那個(gè)
java其實(shí)保留了多繼承,并用另一種表現(xiàn)形式來(lái)完成>>>多實(shí)現(xiàn)
java支持多層繼承
父類中的內(nèi)容是子類中的共性內(nèi)容
創(chuàng)建對(duì)象時(shí)只創(chuàng)建最子類的對(duì)象即可
>>>>>查閱父類功能,創(chuàng)建子類對(duì)象
super超類>>>父類對(duì)象的引用
this代表的是本類對(duì)象的引用
super代表父類對(duì)象的引用
?
當(dāng)子類出現(xiàn)和父類一模一樣的函數(shù)時(shí),子類的函數(shù)會(huì)覆蓋父類的函數(shù)
當(dāng)子類繼承父類,沿襲了父類的功能,到子類中
但是子類雖級(jí)別該功能,但是內(nèi)容卻和父類不一致
這時(shí),沒(méi)必要定義新功能,而是使用覆蓋,,保留父類的功能,并重寫(xiě)功能
在父類功能上添加內(nèi)容,可以在重寫(xiě)時(shí)使用super關(guān)鍵字保留原內(nèi)容
子類覆蓋父類,必須保證子類權(quán)限大于等于父類權(quán)限,才可以覆蓋
否則會(huì)造成語(yǔ)法上的錯(cuò)誤
靜態(tài)只能覆蓋靜態(tài)
public大于默認(rèn)大于private
重載:阻抗同名函數(shù)的參數(shù)列表
重寫(xiě):子父類方法要一模一樣
子父類構(gòu)造函數(shù)
在子類對(duì)象初始化時(shí),父類的構(gòu)造函數(shù)也會(huì)運(yùn)行
那是因?yàn)樽宇惖臉?gòu)造函數(shù)默認(rèn)第一行有一條隱式的語(yǔ)句 super()
super():會(huì)訪問(wèn)父類中空參數(shù)的構(gòu)造函數(shù)
而且子類中所有的構(gòu)造函數(shù)默認(rèn)第一行都是super()
子類肯定會(huì)訪問(wèn)父類的構(gòu)造函數(shù)
因?yàn)楦割愔械臄?shù)據(jù),子類可以直接獲取,所以子類對(duì)象在建立時(shí)
需要先查看父類是如何對(duì)這些數(shù)據(jù)進(jìn)行初始的
所以子類在對(duì)象初始化時(shí),要先訪問(wèn)下父類中的構(gòu)造函數(shù)
如果要訪問(wèn)父類中指定的構(gòu)造函數(shù),可以通過(guò)搜東定義super()語(yǔ)句的方式來(lái)指定
注意:super語(yǔ)句一定定義在子類構(gòu)造函數(shù)的第一行
this()和super()不能在同時(shí)在構(gòu)造函數(shù)當(dāng)中
因?yàn)樗麄兌急仨殞?xiě)在第一行
必須要先進(jìn)行初始
??? 子類所有的構(gòu)造函數(shù),默認(rèn)都會(huì)訪問(wèn)父類中空參數(shù)的構(gòu)造函數(shù)
??? 因?yàn)樽宇惷恳粋€(gè)構(gòu)造函數(shù)內(nèi)的第一行都有一句隱式的super()
??? 當(dāng)父類中沒(méi)有空參數(shù)的構(gòu)造函數(shù)時(shí)
??? 子類必須手動(dòng)通過(guò)super語(yǔ)句形式來(lái)指定要訪問(wèn)父類中的構(gòu)造函數(shù)
??? 子類中至少會(huì)有一個(gè)剛轉(zhuǎn)身會(huì)訪問(wèn)父類中的構(gòu)造函數(shù)
final關(guān)鍵字(修飾符)>>>>>>最終
可以修飾類,函數(shù),變量
被final修飾的類不可以被繼承
為了避免繼承后被子類復(fù)寫(xiě)
被final修飾的方法不能被復(fù)寫(xiě)
被final修飾的變量是一個(gè)常量,只能賦值一次
既可以修飾成員變量,也可以修飾局部變量
當(dāng)在描述事物時(shí),一些數(shù)據(jù)的出現(xiàn)值是固定的,那么這時(shí)為了增強(qiáng)閱讀性
都給這些值起個(gè)名字方便閱讀,而這個(gè)值不需要改變,所以加上final修飾
注意:常量手寫(xiě)規(guī)范,所有字母都大寫(xiě),如果多個(gè)單詞組成,單詞間_理解
內(nèi)部類定義在局部位置上時(shí),只能訪問(wèn)該局部被final修飾的局部變量
當(dāng)多個(gè)類中出現(xiàn)相同功能,但是功能內(nèi)容不同
這時(shí)可以進(jìn)行向上抽取
這時(shí)只抽取功能第一,而不抽取功能內(nèi)容
abstrace>>抽象
抽象方法一定定義在抽象類中
抽象方法和抽象類都必須被abstract關(guān)鍵字修飾
抽象類不可以用new創(chuàng)建對(duì)象,因?yàn)檎{(diào)用抽象方法沒(méi)意義
抽象類中的方法要被使用,必須由子類復(fù)寫(xiě)所有的抽象方法后,劍靈子類對(duì)象調(diào)用
如果只覆蓋了部分抽象方法,那么該子類還是一個(gè)抽象類
抽象類和一般類沒(méi)有太大的不同
抽象類可以不定義抽象方法,這樣做僅僅是不讓改類建立對(duì)象
模板方法設(shè)計(jì)模式
模板方法:在定義功能時(shí),功能的一部分是確定的,但是有一部分是不確定的
而確定的部分使用不確定的部分
那么就將不確定的部分抽象
由子類具像化
接口:interface
接口的格式特點(diǎn):
接口中常見(jiàn)定義:常量,抽象方法
常量:public static final
抽象方法:public abstract
接口中的成員都是public的(共有的)
接口不可以創(chuàng)建對(duì)象
需要子類將接口具象化
implements?? 具像化接口
接口可以被類多實(shí)現(xiàn),這也java是對(duì)多繼承不支持的轉(zhuǎn)換形式
一個(gè)類可以繼承一個(gè)類以及多個(gè)接口
class 子類名 extends 父類名 implements 接口名,接口名........
接口之間可以有繼承關(guān)系,且接口支持多繼承
接口的特點(diǎn):
對(duì)外暴露的規(guī)則
程序功能的擴(kuò)展
可以用來(lái)多實(shí)現(xiàn)
類與接口之間是實(shí)現(xiàn)關(guān)系,而且類可以繼承一個(gè)類的同時(shí)實(shí)現(xiàn)多個(gè)接口
接口與接口之間可以有繼承關(guān)系
多態(tài):可以理解為事物存在的多種體現(xiàn)形態(tài)
多態(tài)的體現(xiàn)
?父類的引用指向了自己的子類對(duì)象
?父類的引用也可以接收自己的子類對(duì)象
多態(tài)的前提
?必須是類與類之間有關(guān)系>>>>繼承,實(shí)現(xiàn)
?通常還有一個(gè)前提>>>>存在覆蓋
多態(tài)的好處
?多態(tài)的出現(xiàn)大大的提高了程序的擴(kuò)展性
多態(tài)的弊端
?提高了擴(kuò)展性的同時(shí),只能使用父類的引用訪問(wèn)父類中的成員
多態(tài)的應(yīng)用
多態(tài)的出現(xiàn)注意代碼的特點(diǎn)
?
可以向上轉(zhuǎn)型,類型提升
也可以強(qiáng)制將父類的引用轉(zhuǎn)換成子類類型
但是父類的對(duì)象不能強(qiáng)制轉(zhuǎn)換成子類對(duì)象
在多態(tài)的應(yīng)用中,始終是子類在變化
判斷某一類型引用指向的對(duì)象是什么類型>>>>>>>>>>instanceof
在多態(tài)中成員函數(shù)的特點(diǎn)
在編譯時(shí)期,參閱引用型變量所屬的類是否有調(diào)用的方法,如果有編譯通過(guò),沒(méi)有則失敗
在運(yùn)行時(shí)期,參閱對(duì)象所屬類中是否有調(diào)用方法
成員函數(shù)在多態(tài)調(diào)用時(shí),編譯看左邊,運(yùn)行看右邊
在多態(tài)中,成員變量的特點(diǎn)
無(wú)論編譯和運(yùn)行,都參考左邊(引用類型變量所屬的類)
在多態(tài)中,成員函數(shù)的特點(diǎn)
無(wú)論編譯和運(yùn)行都參考左邊
上帝>>>>>>>>>--------------Obhect
所有對(duì)象的超類(多有對(duì)象的直接或者間接父類)
該類中定義的肯定是所有對(duì)象都具備的功能
Object類中已經(jīng)提供了的方法,沒(méi)有必要重新定義
只要沿襲父類中的功能,建立自己特有內(nèi)容,即覆蓋
內(nèi)部類
將一個(gè)類定義在另一個(gè)類里面,對(duì)里面那個(gè)類就稱為內(nèi)部類(內(nèi)置類,箱套類)
訪問(wèn)特點(diǎn):
內(nèi)部類可以直接訪問(wèn)外部類中的成員,包括私有成員
而外部類要訪問(wèn)內(nèi)部類中的成員必須要建立內(nèi)部類的對(duì)象
訪問(wèn)格式:
?1 =>當(dāng)內(nèi)部類定義在外部類的成員位置上,而且非私有,可以在外部其他類中
可以直接建立內(nèi)部類對(duì)象,
格式:
?外部類名.內(nèi)部類名 變量名 = 外部類對(duì)象.內(nèi)部類對(duì)象;
?Outer.Inner in = new Outer().new Inner();
?2 =>單內(nèi)部類在成員位置上,就可以被成員修飾符所修飾
?比如:prinvate 將內(nèi)部類在外部類中進(jìn)行封裝
???? static 內(nèi)部類就具備static的特性
???? 當(dāng)內(nèi)部類被static修飾后,只能直接訪問(wèn)外部類中是static成員出現(xiàn)訪問(wèn)局限
???? 在外部類其他類中,如何直接訪問(wèn)static內(nèi)部類的非靜態(tài)成員
??new Outer.Inner().function()
???? 唉外部其他類中,如何直接訪問(wèn)static內(nèi)部類的靜態(tài)成員
??Outer.Inner.function()
注意:當(dāng)內(nèi)部類中定義了靜態(tài)成員,該內(nèi)部類必須是static的
?當(dāng)外部類中的靜態(tài)方法訪問(wèn)內(nèi)部類時(shí),內(nèi)部類也必須是static的
當(dāng)描述事物時(shí),事物的內(nèi)部還有事物,該事物用內(nèi)部類來(lái)描述
因?yàn)閮?nèi)部事物在使用外部事物的內(nèi)容
內(nèi)部類定義在局部時(shí)
不可以被成員修飾符修飾
可以直接訪問(wèn)外部類中的成員,因?yàn)檫€持有外部類的引用
但是不可以訪問(wèn)它所在的局部中的變量,只能訪問(wèn)被final修飾的局部變量(常量)
匿名內(nèi)部類
匿名內(nèi)部類其實(shí)就是內(nèi)部類的簡(jiǎn)寫(xiě)格式
定義匿名內(nèi)部類的前提:內(nèi)部類必須是繼承一個(gè)類或者實(shí)現(xiàn)一個(gè)借口
匿名內(nèi)部類的格式:new 父類或接口名(){子類內(nèi)容}
其實(shí)匿名內(nèi)部類就是一個(gè)匿名子類對(duì)象
異常
異常的體系
Throwable
|--Error:通常出現(xiàn)大問(wèn)題如:運(yùn)行的類不存在或者內(nèi)存溢出,無(wú)法編寫(xiě)針對(duì)代碼對(duì)其處理
|--Exception:在運(yùn)行時(shí)運(yùn)行出現(xiàn)的一起情況,可以通過(guò)try,catch,finally進(jìn)行針對(duì)處理
Error和Exception的子類名都是以父類名作為后綴
異常:就是程序在運(yùn)行時(shí)出現(xiàn)不正常情況
異常的由來(lái):java對(duì)不正常的情況的封裝
異常的處理(Exception):
try
{
可能出現(xiàn)異常的代碼
}
catch(Exception e)
{
出現(xiàn)異常時(shí)的處理代碼
(對(duì)捕獲到底異常進(jìn)行常見(jiàn)出方法操作:e.printStackTrace)
(String.getMessage(),獲取異常信息)
}
finally
{
一定會(huì)執(zhí)行的語(yǔ)句
}
在功能上通過(guò)throws關(guān)鍵字,在函數(shù)上聲明該功能有可能出現(xiàn)問(wèn)題,即聲明異常
便于提高安全性,強(qiáng)制讓調(diào)用處進(jìn)行處理,不處理編譯失敗
?
對(duì)多異常的處理
聲明異常時(shí),建議聲明更為具體的異常,這樣可以更具體的處理
聲明幾個(gè)異常,就應(yīng)該對(duì)應(yīng)有幾個(gè)catch處理方法
如果多個(gè)catch接手的異常出現(xiàn)繼承關(guān)系時(shí),父類要放最下面
每個(gè)catch應(yīng)該針對(duì)接手的異常進(jìn)行針對(duì)性處理
因?yàn)轫?xiàng)目中會(huì)出現(xiàn)特有的問(wèn)題
而這些問(wèn)題并未被Java所描述并封裝對(duì)象
所有對(duì)于這些特有的問(wèn)題可以按照J(rèn)ava的對(duì)問(wèn)題封裝的思想
將特有的問(wèn)題,進(jìn)行自定義的異常封裝
即自定義異常:
自定義異常需要繼承于父類異常(Exception類)
可以用throw拋出異常對(duì)象
那么就必須要給出對(duì)應(yīng)的處理動(dòng)作
一般函數(shù)類出現(xiàn)異常,函數(shù)上要聲明
自定義異常你可以自定義異常信息(重寫(xiě)getMessate函數(shù))
只有異常體系(Throwable)中的類和對(duì)象才可以被throws和throw拋出
shrows和shrow的區(qū)別
shrows使用在函數(shù)上,后面跟異常類,可以跟多個(gè),用,隔開(kāi)
shrow作用在函數(shù)內(nèi),后面跟的是異常對(duì)象
Exception中有一個(gè)特殊的子類異常RuntimeException運(yùn)行異常
如果函數(shù)內(nèi)容拋出該異常,函數(shù)上可以不用聲明,編譯一樣通過(guò)
如果在函數(shù)上聲明了異常,調(diào)用者可以不用進(jìn)行處理,編譯一樣通過(guò)
之所以不用再函數(shù)上聲明,是因?yàn)椴恍枰屨{(diào)用者處理
單該異常發(fā)生,希望程序停止因?yàn)樵谶\(yùn)行時(shí),出現(xiàn)了無(wú)法繼續(xù)運(yùn)算的情況
希望停止程序后,對(duì)代碼進(jìn)行修正
自定義異常時(shí),如果該異常的發(fā)生,無(wú)法再繼續(xù)運(yùn)算
就讓自定義異常繼承RuntimeException
對(duì)于異常可分為編譯時(shí)異常和運(yùn)行時(shí)異常(RuntimeException)
try
{
}
catch
{
處理異常后也可以拋出異常(用于被調(diào)用者識(shí)別)
}
finally
{
無(wú)論如何都會(huì)被執(zhí)行的代碼
(通常用于關(guān)閉資源.)
}
其他格式
try
{
}
finally
{
}
注:catch是用于處理異常的,如果沒(méi)有catch就代表異常沒(méi)有被處理過(guò),
如果該異常是檢測(cè) 時(shí)異常,那么必須聲明出去
異常在子父類覆蓋中的體現(xiàn)
子類在覆蓋父類時(shí),如果父類的方法拋出異常,
那么子類的覆蓋方法只能拋出父類的異常或該父類異常的子類(可以不拋異常)
如果父類方法拋出多個(gè)異常,子類在覆蓋該方法時(shí),只能拋出父類異常的子集
如果父類方法沒(méi)有異常拋出,子類在覆蓋方法是時(shí),不可以拋出異常
子類方法發(fā)生了異常,就必須用catch進(jìn)行處理,絕對(duì)不能拋出
包(package)
對(duì)類文件進(jìn)行分類管理
給類提供多層命名空間
寫(xiě)在文件的第一行
類名的全稱是? 包名.類名
包名所有字母小寫(xiě)
當(dāng)程序中使用packate時(shí)
在編譯時(shí)的格式為
javac -d 目錄名 類名.java
protected(保護(hù)權(quán)限)? 權(quán)限修飾符
?