黑马程序员---面向对象笔记总结
------- android培訓(xùn)、java培訓(xùn)、期待與您交流! ----------
?
????????
??封裝
????????????????匿名函數(shù)??
?
2--匿名對(duì)象使用方式一,當(dāng)對(duì)象的方法只調(diào)用一次時(shí),可以用匿名對(duì)象完成,這樣寫比較簡單,如果對(duì)一個(gè)對(duì)象進(jìn)行多個(gè)成員必須個(gè)這個(gè)對(duì)象起個(gè)名字
3--匿名對(duì)象使用方式二,可以將匿名對(duì)象作為實(shí)際參數(shù)進(jìn)行傳遞
4--void是一種返回類型,代表沒有具體返回類型的結(jié)果,而構(gòu)造函數(shù)根本不需要定義返回類型?????????????????????
???????????????????????構(gòu)造函數(shù)
構(gòu)造函數(shù)作用可以給對(duì)象初始化
因?yàn)楝F(xiàn)在任意一個(gè)對(duì)象,就具有基本的屬性
??6--構(gòu)造函數(shù)小細(xì)節(jié):當(dāng)一個(gè)類沒有定義構(gòu)造函數(shù)是,那么系統(tǒng)會(huì)給類加一個(gè)空值,擋在類中自定義了構(gòu)造函數(shù)后,默認(rèn)的函數(shù)就沒有
7--構(gòu)造函數(shù)在寫法上有不同,在運(yùn)行上也不同構(gòu)造函數(shù)在對(duì)象已建立就運(yùn)行,對(duì)象初始化、而一般方法是對(duì)象調(diào)用才執(zhí)行,給對(duì)象添加對(duì)象具備的功能
一個(gè)對(duì)象建立,構(gòu)造函數(shù)只運(yùn)行一次,而一般方法可被對(duì)象調(diào)用多次。
?
構(gòu)造函數(shù)不可以使用return
?
8--什么時(shí)候該定義構(gòu)造函數(shù),當(dāng)分析事務(wù),具備以下特性或行為,那么將這些類容定義在構(gòu)造函數(shù)中
????????????????????????構(gòu)造代碼塊
{
System.out.println("dddddddddddddddddd");
}
構(gòu)造代碼塊,就是沒構(gòu)造函數(shù)名
作用,給對(duì)象進(jìn)行初始化
對(duì)象一建立就運(yùn)行,優(yōu)先于構(gòu)造函數(shù)
構(gòu)造代碼塊,是給所有對(duì)象進(jìn)行統(tǒng)一初始化
二構(gòu)造函數(shù)式給對(duì)應(yīng)的對(duì)象初始化
??構(gòu)造函數(shù)是可以私有化的
?????????????????????This
This代表他所在函數(shù)所屬對(duì)象的引用
那個(gè)對(duì)象調(diào)用this,this就代表那個(gè)對(duì)象
就單說:那個(gè)對(duì)象在調(diào)用this所在的函數(shù),this就代表那個(gè)對(duì)象
什么時(shí)候用this當(dāng)定義類中功能時(shí),該函數(shù)內(nèi)都要調(diào)用該函數(shù)的對(duì)象時(shí),這是用this來表示這個(gè)對(duì)象。但凡本類功能使用本類對(duì)象用this表示
構(gòu)造函數(shù)之間調(diào)用只能用this語句
初始化的?動(dòng)作要先執(zhí)行
This語句只能定義子啊構(gòu)造函數(shù)的第一行,因?yàn)槌跏蓟葓?zhí)行
???????????????????????Static
是一個(gè)靜態(tài)?static???是一個(gè)修飾符修飾成員變量和方法
?特點(diǎn)
隨著類的加載而加載,也就是靜態(tài)隨類的消失而消失?說明他的生命周期最長
優(yōu)先于對(duì)象的存在被所有對(duì)象共享可以直接被類名所共享,
實(shí)例變量生命周期歲對(duì)象消失而消失
靜態(tài)方法只能訪問靜態(tài)成員?包括方法和變量非靜態(tài)可以訪問靜態(tài)成員靜態(tài)方法中不可以定義this和super關(guān)鍵字
因?yàn)殪o態(tài)優(yōu)先于對(duì)象存在,所以靜態(tài)方法中不可以出現(xiàn)this
靜態(tài)有利有弊,利:對(duì)對(duì)象共享的數(shù)據(jù)進(jìn)行單獨(dú)空間存儲(chǔ)節(jié)省內(nèi)存空間,沒有必要每個(gè)對(duì)象都存儲(chǔ)一份
可以直接被類名調(diào)用
弊端:聲明周期太長,訪問出現(xiàn)局限性,靜態(tài)只能范文靜態(tài)
?
????
?
?
什么時(shí)候定義靜態(tài)變量或類呢?
當(dāng)對(duì)象中出現(xiàn)共享數(shù)據(jù)時(shí),該數(shù)據(jù)被靜態(tài)所修飾,該對(duì)象中的特有數(shù)據(jù)也就是說不是共享的要定義成非靜態(tài)存在于堆內(nèi)存中
?????什么時(shí)候定義靜態(tài)函數(shù)呢?
當(dāng)功能內(nèi)部沒有訪問到非靜態(tài)數(shù)據(jù)或?qū)ο蟮奶赜袛?shù)據(jù),那么該功能可以定義靜態(tài)的
?
?
?
????????????????????????主函數(shù)定義
Public?代表該函數(shù)局限最大
Static?代表主函數(shù)隨類的加載存在
Void?主函數(shù)沒有具體的返回值
main?不是關(guān)鍵字,是一個(gè)特殊的單詞?可以被jvm識(shí)別
????????????????????工具類
通常情況下,工具類都是定義的靜態(tài)方法
下面我們就制作這個(gè)工具欄的?說明書,通過文檔注釋來說明
?在類文件中/**
?這是一個(gè)可以對(duì)數(shù)組進(jìn)操作的工具類,該類中提供了,獲取最值,排序等功能;
?
*/
要想把一個(gè)類生存幫助文檔的話,這個(gè)類必須是?公用的,也就是說必須被public所修飾
?
?如?public?ArrayTool?class
?
?
?
????????????????靜態(tài)代碼塊
Static?{
?
}
對(duì)象初始化過程
先執(zhí)行類中的?static代碼塊,?如果有的haunted,給類進(jìn)行初始化
在堆內(nèi)存中開辟空間,分配內(nèi)存地址
在堆內(nèi)存中建立對(duì)象的特有屬性,并默認(rèn)初始化
對(duì)屬性進(jìn)行顯示初始化
?對(duì)對(duì)象進(jìn)行構(gòu)造代碼塊的初始化
對(duì)對(duì)象進(jìn)行對(duì)應(yīng)的,構(gòu)造函數(shù)初始化
將內(nèi)存地址賦給棧內(nèi)存中的變量
????????設(shè)計(jì)模式
??
單列設(shè)計(jì)模式?:解決一個(gè)類在內(nèi)存只存在一個(gè)對(duì)象
保證對(duì)象唯一性
1,為了避免其他程序過多的建立該類對(duì)象。先禁止頭程序建立該類的對(duì)象
2,我了讓其他程序訪問該類對(duì)象,只好在本類中,自定義一個(gè)對(duì)象
3,我了方便其他程序?qū)ψ远x對(duì)象的訪問,可以對(duì)外提供一些訪問方式
對(duì)象存在堆里面
以上三步用代碼體現(xiàn)
1,將構(gòu)造函數(shù)私有化
2,在類中創(chuàng)建一個(gè)本類對(duì)象
3,提供一個(gè)方法可以獲取該對(duì)象
?
對(duì)于事物該怎么描述就怎么描述
當(dāng)需要將該事物,的對(duì)象保證在內(nèi)存中唯一是,就將以上三步都加上
列如代碼:
//單列設(shè)計(jì)模式一:餓漢式
?private?static?Student?s=new?Student();
?private?student(){}
?public?static?Student?getStudent()
?{
return?s;
?}
單列設(shè)計(jì)模式二:懶漢式
class?single
{
private?static?single?s=null;
private?single(){}
if(s==null)
{
//這表示只能有一個(gè)程序進(jìn)來,如果其他程序進(jìn)來,這就判斷s不等于空,
其他程序就進(jìn)不來
//如果A進(jìn)來
??synchronized?(single.class);//這句換是要求同步執(zhí)行程序
public?static?singlg?getInstance()
{
if?(s==null)
--》A//A就在這里,其他的就進(jìn)不來,對(duì)多走到synchronized這里
s=new?single();
return?s;
}
}
}
記住?定義單列時(shí),最好使用餓漢式。
?
???????????繼承
1,提高代碼的復(fù)用性
2,讓類與類之間產(chǎn)生的關(guān)系,有了這個(gè)關(guān)系,才有了多態(tài)的特性
注意
千萬不要為了獲取其他類的功能。為了簡化代碼而產(chǎn)生繼承
必須是類與類之間有所屬關(guān)系才可以繼承;
?
在java語言中,java只支持單繼承,不支持多繼承。因?yàn)槎嗬^承容易帶來安全隱患:當(dāng)父類中定義了相同功能,當(dāng)功能相同時(shí)子類不確定應(yīng)用哪一個(gè)
但是java保留了這種機(jī)制,并用了另一種體現(xiàn)形式來完成表示,多實(shí)現(xiàn)、
Java支持多層繼承,也就是一個(gè)繼承體系,如何使用一個(gè)繼承體系中的功能呢
想要使用體系,先查詢體系父類的描述,因?yàn)楦割愔卸x的是該體系中共性的功能,通過了解共性功能,就可以知道該體系的基本功能,那么這個(gè)體系就已經(jīng)基本可以使用了。
在具體調(diào)用時(shí)要?jiǎng)?chuàng)建子類的對(duì)象,為什么?
1,因?yàn)楦割愑锌赡懿荒軇?chuàng)建對(duì)象,
2,創(chuàng)建子類對(duì)象,可以使用跟多的?功能,包括基本的也有特性的。
簡單一句話,就是查閱父類功能,創(chuàng)建子類對(duì)象的使用功能
?
??????????????組合--聚集關(guān)系、
?
???????子父類中變量的特點(diǎn)
??1變量
???1.如果,父類中出現(xiàn)非私有的成員變量時(shí),子類要訪問本類中的變量,用this
子類要訪問父類中的同名變量,用super
Super和this使用幾乎是一致的,this代表是本類對(duì)象的引用,super的代表父類對(duì)象的引用
?
????????子父類中的函數(shù)的特點(diǎn)=覆蓋
當(dāng)子類出現(xiàn)和父類一樣的函數(shù)時(shí),但子類對(duì)象調(diào)用該對(duì)象函數(shù),
會(huì)運(yùn)行子類函數(shù)的類容;
如同父類函數(shù)被覆蓋一樣。這種情況是函數(shù)的另一個(gè)特性,:重寫(覆蓋)
?
但子類繼承父類,沿襲了父類的功能,到子類中
但子類雖然具備該功能,但是功能的內(nèi)容卻和父類不一致
這時(shí),沒有必要定義新功能,而是使用覆蓋特殊,
保留父類的功能的定義,并重寫功能類容
?
?覆蓋?注意:
子類覆蓋父類,必須保證子類權(quán)限大于等于父類權(quán)限,才可以覆蓋,否則編譯失敗
覆蓋必須要加關(guān)鍵之public
2,靜態(tài)只能覆蓋靜態(tài)
記住
重載:只看同名函數(shù)的參數(shù)列表
重寫:子父類方法一模一樣,
???????????子父類中的構(gòu)造函數(shù)特點(diǎn),子類實(shí)例化過程
?
在子類中有一個(gè)隱藏的用法就是
zi
{
?
Super();調(diào)用父類構(gòu)造函數(shù)
Zi()
{
}
在對(duì)子類對(duì)象進(jìn)行初始化是,父類?的構(gòu)造函數(shù)也會(huì)運(yùn)行,那是因?yàn)樽宇惖臉?gòu)造函數(shù)默認(rèn)第一行有一天隱藏的語句super();
Super會(huì)訪問父類的空參數(shù)的構(gòu)造函數(shù),子類所有的構(gòu)造函數(shù)都有一個(gè)默認(rèn)的?super();
?????????????為什么子類一定要訪問父類的構(gòu)造函數(shù),
因?yàn)?#xff1a;父類中數(shù)據(jù)子類可以獲取,所以子類在建立是,需先查看父類如何對(duì)這些數(shù)據(jù)進(jìn)行初始化的所以子類初始化時(shí),要先訪問父類的構(gòu)造函數(shù)
如果要訪問父類指定的構(gòu)造函數(shù),可以通過手動(dòng)定義super語句的方式來指定
?
Super一定要定義在子類的構(gòu)造函數(shù)的第一行
???子類實(shí)例化過程
結(jié)論:子類的所有的構(gòu)造函數(shù)默認(rèn)都會(huì)訪問父類中空參數(shù)的構(gòu)造函數(shù)
因?yàn)樽宇惷恳粋€(gè)構(gòu)造函數(shù)的第一句都有一個(gè)隱藏的super()當(dāng)父類中沒有空參數(shù)的構(gòu)造函
數(shù)是,子類必須手動(dòng)通過super或者this語句形式來指定訪問父類中的構(gòu)造函數(shù),類的構(gòu)造函數(shù)第一行也可以手動(dòng)指定this語句來訪問本類的構(gòu)造函數(shù),
子類中至少會(huì)有一個(gè)構(gòu)造函數(shù)會(huì)訪問父類的構(gòu)造函數(shù)
?
?
}
?
?
??????????????????????????????Final?
???
修飾類,修飾的類不可以被繼承,修飾的函數(shù)不可以被覆蓋
修飾的變量是一個(gè)常量,只能賦值一次
被final修飾的類不可以被繼承,是為了避免被子類覆蓋功能
Final?class?demo{
Void?show();
}
//這是錯(cuò)誤的繼承
Class?sub?extends?demo{
?
}
?
被final修飾的變量時(shí)一個(gè)常量只能賦值一次,既可以修飾成員變量又可以修飾局部變量
?Final?int?x=9;
這是x終生為9了,不能改變
注意:當(dāng)在描述事物一些數(shù)據(jù)的?出現(xiàn)值是固定的,這是為了增強(qiáng)閱讀,都給這些值加上final
?????Final就是為了要鎖定常量值
?????如果要共享,就在final前加static?被final定義的就必須要大寫
???????????????????????????????抽象類
?
當(dāng)多個(gè)類中出現(xiàn)相同功能,但功能主體不同,這是可以向上抽取,這只抽取聲明的方法(定義的),不
抽取功能主體
抽象就是看不懂
??抽象類的特點(diǎn),
1,抽象方法,一定在抽象類中
2.抽象方法和抽象類必須被abstract所修飾
3.抽象類不可以用new創(chuàng)建對(duì)象,因?yàn)檎{(diào)用抽象方法沒意義
4.抽象類方法要被使用,必須由子類復(fù)寫所有抽象方法后,建立子類對(duì)象調(diào)用
5.如果子類只覆蓋部分抽象方法,那么該子類還是一個(gè)抽象類
6.??抽象類可以強(qiáng)迫子類做一些事情
7.抽象類和一般類沒有太大不同
8.該如何描述事物,就如何描述,這是在事物出現(xiàn)了看不懂的東西
9.這些事物功能需要明確出現(xiàn),但無法定義主體,就通過抽象方法來表示,
10.抽象類比一般類多了一個(gè)抽象方法,就是在類中可以定義抽象方法,也只能定義抽象方法
11.抽象類不可以實(shí)例化,
12.特點(diǎn):?抽象類中可以不定義抽象方法,這樣做只是不讓改類建立對(duì)象
????????????????????????模板方法模式???
獲取時(shí)間?system.currenttimemillis();
當(dāng)代嗎完成優(yōu)化后,就可以解決這類問題
這種方式,模板方法設(shè)計(jì)模式
?
什么是模板方法
定義功能是,功能的一部分確定,但有一部分不確定,而確定的部分在使用不確定的部分那么著時(shí)就將不不確定的部分暴露了,有該類子類去完成
?????????????????????接口
接口:初期理解,可以理解為一個(gè)特殊的抽象類
抽象類的方法都是抽象的,那么該類可以通過接口的形式來表示
?接口里面成員:全是抽象的
接口在定義時(shí),格式
1,接口中常見定義:常量,抽象方法
接口中成員都有固定修飾符
常量:public?static?final
方法,public?abstract
接口中的成員都是?public的
?
接口是不可以常見對(duì)象的,因?yàn)槎际浅橄蠓椒?/span>
需要被子類實(shí)現(xiàn),??子類要把接口里的抽象方法全都覆蓋后,才能實(shí)例化
否則子類是個(gè)抽象類
接口可以被類多實(shí)現(xiàn),
一個(gè)類在繼承一個(gè)類時(shí),還可以實(shí)現(xiàn)多個(gè)接口
類與接口之間的關(guān)系式實(shí)現(xiàn)關(guān)系
?
????????接口的特點(diǎn)
?
基本功能實(shí)現(xiàn)在類中,擴(kuò)展功能實(shí)現(xiàn)在接口中
?
?
??????????????????????多態(tài)
多態(tài)可也理解為事物存在的?多種形態(tài)
?
函數(shù)也具有多態(tài)
1?多態(tài)的體系
?父類的引用指向了自己的類中對(duì)象
?2,多太的前提
??必須是類與類之間的關(guān)系,要么繼承,要么實(shí)現(xiàn)
?通常還有一個(gè)就是存在覆蓋
3?多態(tài)弊端,?
?提高擴(kuò)展性?但是只能使用父類的引用訪問父類的成員
不能使用子類的特有屬性
?
3,多態(tài)的好處
???大大的提高了程序的擴(kuò)展性
多太的擴(kuò)展性
abstract?class?Animal
{
public?abstract?void?eat();
}
?
class?Cat?extends?Animal
{
public?void?eat()
{
System.out.println("吃魚");
}
public?void?catchMouse()
{
System.out.println("抓老鼠");
?
}
?
}
class?Dog?extends?Animal
{
public?void?eat()
{
System.out.println("吃骨頭");
}
public?void?kanjia()
{
System.out.println("看家");
?
}
?
}
public?static?void?main(String[]?args)?
{
//Cat?c=new?Cat();
//c.eat();
function(new?Cat());
function(new?Dog());
function(new?Cat());
?
}
public?static?void?function(Animal?a)
{
a.eat();
}
?
?
如果想要調(diào)用貓的?特有方法是,如何操作
強(qiáng)制將父類的引用,轉(zhuǎn)換成子類類型
?列如
Cat?c=?(Cat)a;
c.catchMouse();
前往不要出現(xiàn)將父類對(duì)象轉(zhuǎn)換成子類的類型
我們能轉(zhuǎn)換的是父類應(yīng)指向自己的子類對(duì)象時(shí),gia可以被提升,也可以
強(qiáng)制轉(zhuǎn)換
多態(tài)始終都是子類對(duì)象在變化
???多態(tài)成員函數(shù)非靜態(tài)的特點(diǎn)
?
在編譯時(shí):引用變量所屬的類中是否所有調(diào)用的方法,
如果有?編譯通過,沒有則,編譯失敗
在運(yùn)行時(shí),參閱對(duì)象所屬的類中是否有調(diào)用的方法
總結(jié):成員函數(shù)在多態(tài)調(diào)用時(shí),編譯看左邊,運(yùn)行看右邊
?在多態(tài)中,靜態(tài)成員函數(shù)的特點(diǎn),無論編譯和運(yùn)行都參考左邊
?
??
Object?是所有對(duì)象的:根類
Object?類中已經(jīng)提出對(duì)對(duì)象是否相同的比較方法
??????????????????????????
?????????內(nèi)部類
?
非靜態(tài)內(nèi)部類不能定義靜態(tài)函數(shù)
?
內(nèi)部類的訪問規(guī)則,可以直接訪問外部類的成員,包括私有
2外部類要訪問內(nèi)部類,必須建立內(nèi)部類對(duì)象
內(nèi)部類可以被私有化,外部類覺得不能被私有化
之所以,可以直接訪問外部類的成員,是因?yàn)閮?nèi)部類有一個(gè)外部類的引用
格式?外部類名、this
?
訪問格式,當(dāng)內(nèi)部類定義在外部類的成員位置上,而且私有,可以再外部其他類中
可以直接建立?對(duì)象,
格式,外部類名,內(nèi)部類名,?變量名=外部類對(duì)象,內(nèi)部類對(duì)象
outer.inner?in=new?outer.inner();
?in.function();
當(dāng)內(nèi)部類在成員位置上,就可以被成員修飾符所修飾
Private?將內(nèi)部類在外部類的進(jìn)行封裝。
當(dāng)內(nèi)部類被靜態(tài)修飾后,只能直接訪問外部類中的靜態(tài)成員,出現(xiàn)了訪問局限
在外部其他類,如何直接訪問靜態(tài)內(nèi)部類呢?
new?outer.inner().function();來直接訪問內(nèi)部類的非靜態(tài)成員
在外部其他類,如何直接訪問非靜態(tài)成員呢?
outer.inner().function();
注意,:當(dāng)內(nèi)部類中定義靜態(tài)成員,該內(nèi)部類必須是靜態(tài)的
當(dāng)外部類中的靜態(tài)方法訪問內(nèi)部類是內(nèi)部類也必須是靜態(tài)的
內(nèi)部類的作用就是能直接訪問外部類的事物
內(nèi)部類定義局部是,不可以被成員修飾
可以直接訪問外部類中的成員,因?yàn)檫€持有外部類中的引用
?
但是不可一訪問他所在的局部中的變量,只能訪問被final修飾的局部變量
class?Outer?{
int?x?=?9;
void?method(final?int?a)?{
final?int?y=4;
class?inner?{
void?function()?{
System.out.println(a+y);
?
}
?
}
new?inner().function();
}
}
?class?innerobject?{
public?static?void?main(String[]?args)?{
new?Outer().method(5);
new?Outer().method(6);
?
}
?
}
匿名內(nèi)部類,就是內(nèi)部類,的public?void?run(){
for(int?x=0;x<100;x++)
{
System.out.println(Thread.currentThread().getName()+".."+x);
}
}式
?
2,定義匿名內(nèi)部類的前提,內(nèi)部類必須繼承一個(gè)類,
或者實(shí)現(xiàn)一個(gè)接口
匿名類?的格式寫法?new?父類或者借口(){定義子類內(nèi)容}
class
{
public?static?void?main(String[]?args)
{
System.out.println("Hello?World!");
}
}
abstract?class?Absdemo
{
abstract?void?show();
}
?
class?outer
{
int?x=3;
?
public?void?function()
{
?
//這就是創(chuàng)建匿內(nèi)部名類
new?AbsDemo()
{
void?show()
{
System.out.println("x="+x);
}.show();//調(diào)用成員方法
}
}
?
}
5.匿名內(nèi)部類中定義的方法最好不要超過三個(gè)。?
轉(zhuǎn)載于:https://www.cnblogs.com/anxianjie/archive/2013/03/07/2948145.html
總結(jié)
以上是生活随笔為你收集整理的黑马程序员---面向对象笔记总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uiswitch样式_iOS - UIS
- 下一篇: 电子商务小结