---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ----------------------
面向對象
1 面向對象概念
2 類與對象的關係
3 封裝
4 構造函數
5this關鍵字
6static關鍵字
7 單例設計模式
面向對象就是把多個功能封裝到一個對象中,通過調用該對象獲取這些功能,稱爲面向對象。
面向對象和麪向過程的理解:
面向對象是相對面向過程而言。
面向對象和麪向過程都是一種思想。
面向過程
強調的是功能行爲。
面向對象
將功能封裝進對象,強調具備了功能的對象。
面向對象是基於面向過程的。
事例:人具有走,吃飯功能等等。這些功能都需要人來完成的,那麼就將這些功能封裝進人這個對象中,我們只要調用人這個對象,通過人就能使用這些功能。
開發的過程:其實就是不斷的創建對象,使用對象,指揮對象做事情。
設計的過程:其實就是在管理和維護對象之間的關係。
面向對象的特徵:封裝(encapsulation)、繼承(inheritance)和多態(polymorphism)
使用計算機語言就是不斷的在描述現實生活中的事物。
java中描述事物通過類的形式體現,類是一組相同屬性行爲的對象的抽象。
對象即是該類事物實實在在存在的個體。
舉例:人就是一個類(是把每一個相同屬性行爲的對象進行抽取)人的屬性:姓名,年齡,身高,體重等,人的行爲:吃飯,睡覺,說話,跑,跳等。
而我們就是對象(是實實在在存在的個體),具體每個人叫什麼名字,年齡多大,身高多高,體重多重等,吃飯怎麼吃,睡覺怎麼睡,說話怎麼說等。
描述任意一類事物就是在描述他的屬性和行爲。
類的定義:
生活中描述事物無非就是描述事物的屬性和行爲。如:人有身高,體重等屬性,有說話,打球等行爲。
Java中用類class來描述事物也是如此。
屬性:對應類中的成員變量。
行爲:對應類中的成員函數。
定義類其實在定義類中的成員(成員變量和成員函數)。
成員變量和局部變量的區別:
1.作用範圍。
成員變量:定義在類中,作用於整個類。
局部變量:只在它所屬的局部大括號中有效。比如函數上的參數,函數中的變量,語句中的變量。
public void function(int x){//x,y,z都是局部變量。
int y = 1;
for(int z=1; z<3; x++){
} //當循環結束時,z在內存中釋放。當function函數執行完畢,x和y在內存中釋放。
}
2.存儲情況。
成員變量:存儲在堆內存中,隨着對象的存在而存在。當對象變成垃圾被回收時,該該對象中的成員變量會消失。
局部變量:存儲在棧內存中,當方法被調用,或者語句被執行的時候,才存在。
當方法運行完畢,或者語句運行完畢時,局部會被自動釋放。所以成員變量也稱之爲實例(對象)變量.
3.初始化情況。
成員變量:在堆內存中有默認初始化值。
局部變量:必須手動初始化後,纔可以被使用。
匿名對象:
所謂的匿名對象,就是創建對象的時候沒有給對象起名字就直接使用。
使用方式:
1)使用方式一:當對對象的方法只調用一次時,可以使用匿名對象來完成,這樣寫比較簡化。
如果對一個對象進行多個成員調用,必須給這個對象起個名字
2)使用方式二:可以給匿名對象作爲實際參數進行傳遞,從而可以不用在main方法中創建一個變量,提高了編程效率,減少了代碼書寫。
但是這個對象實體在方法結束後,垃圾回收機制會將其作爲垃圾回收。而非匿名對象則不同,當不使用了,會在某一時刻被回收,或是隨着主函數的結束而被回收。
匿名對象常見錯誤理解:
如:
1:new Car().num = 8;
2: new Car().color = "red";
3:new Car().run(); //假設有run方法能調用num和color屬性
new三次就是三個匿名對象。3:方法打印出來的不是1,2所定義的屬性。因爲三者沒有關係。屬於三個對象了
封裝:是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。
好處:將變化隔離,便於使用,提高重用性,提高安全性。
封裝原則:將不需要對外提供的內容都隱藏起來,把屬性都隱藏,提供公共方法對其訪問。
1.private :私有,權限修飾符:用於修飾類中的成員(成員變量,成員函數)。
私有隻在本類中有效。
當成員私有後,提高了安全性。但是訪問權限降低了。這時可以通過對外提供公有方法的形式對其進行訪問。
好處:可以在方法中對成員變量的訪問進行控制。
注意:私有僅僅是封裝的一種體現形式而已。
常用之一:
將成員變量私有化,對外提供對應的set,get方法對其進行訪問。提高對數據訪問的安全性。
2.構造函數:
構造函數的特點:
1.構造方法的方法名必須與類名相同。
2.構造方法沒有返回類型,也不能定義爲void,在方法名前面不聲明方法類型。不用寫return語句。
3.構造方法不能由編程人員調用,而要系統調用。
4.一個類可以定義多個構造方法,也就是構造方法可以重載,以參數的個數,類型,或排列順序區分。
5.構造函數細節:如果在定義類時沒有定義構造方法,則編譯系統會自動插入一個無參數的默認構造器,這個構造器不執行任何代碼。
6.作用:構造方法的主要作用是完成對象的初始化工作,它能夠把定義對象 時的參數傳給對象的域。
構造函數和一般函數的區別:
1.從功能上的區別:
構造函數是給對象初始化的。
一般函數是因爲對象需要滿足某種功能定義的。
2.從執行上的區別:
構造函數,是對象創建的時候被執行,不用調用。
一般函數是什麼時候調用,就什麼時候執行,不調用就永遠不執行。
構造代碼塊:
作用:給對象進行初始化。
對象一建立就運行,而且優先於構造函數執行。
和構造函數的區別:
構造代碼塊是給所有對象進行統一初始化,而構造函數是給對應的對象初始化。
構造代碼塊中定義的是不同對象共性的初始化內容。
下面就是構造代碼塊:
{
System.out.println("personcode run");
cry();
}
3.局部代碼塊:
public void method(){
int x = 4;
System.out.println("x="+x);
}
這種寫法開發並不常見,但是面試可能會出現,它的作用就是可以限定變量的生命週期.
4.this關鍵字:
1.Java關鍵字this只能用於方法方法體內。
2.當一個對象創建後,Java虛擬機(JVM)就會給這個對象分配一個引用自身的指針,這個指針的名字就是this。
3.this只能在類中的非靜態方法中使用,靜態方法和靜態的代碼塊中絕對不能出現this,並且this只和特定的對象關聯,而不和類關聯,同一個類的不同對象有不同的this。
簡言之,哪個對象調用this所在的函數,this就代表哪個對象。
this關鍵字的應用:
第一、函數參數或者函數中的局部變量和成員變量同名的情況下,成員變量被屏蔽,此時要訪問成員變量則需要用“this.成員變量名”的方式來引用成員變量。當然,在沒有同名的情況下,可以直接用成員變量的名字,而不用this,用了也不爲錯.。
第二、在函數中,需要引用該函數所屬類的當前對象時候,直接用this。//比較兩個人的年齡。
第三、注意,如果我們想在一個構造函數中對另一個構造函數進行調用的時候,不能在其構造函數中直接類名(參數)這樣調用,而是通過this調用。
另一個構造方法,用法是this(參數列表),這個僅僅在類的構造方法中,別的地方不能這麼用。這叫this語句。
其實這些用法總結都是從對“this是指向對象本身的一個指針”這句話的更深入的理解而來的,死記不然容易忘記而且容易搞錯,要理解!
5.static 關鍵字:
1、static關鍵字:static 是一個修飾符,用於修飾成員(成員變量、成員方法)。
2、當成員被靜態修飾後,就多了一種調用方式,除了可以被對象調用外,還可以直接被類名調用。格式:類名.靜態成員。
3、static特點:
<1> 隨着類的加載而加載。 也就是說:靜態會隨着類的消失而消失,說明它生命週期最長。
<2> 優先於對象存在 。明確一點:靜態先存在對象後存在。
<3> 被所有對象共享。
<4> 可以被類名所調用。
4、實例變量和類變量的區別:
<1> 存在位置:
靜態變量隨着類的加載而存在於方法區中。
實例變量隨着對象的建立而存在於堆內存中。
<2> 生命週期:
靜態變量的生命週期最長,隨着類的消失而消失。
實例變量的生命週期隨着對象的消失而消失。
<3> 所屬不同:
靜態變量也稱之爲類變量,所屬於整個類,被整個類所共享。
實例變量是對象的特有數據,所屬於對象。
5、靜態使用注意事項:
<1> 靜態方法只能訪問靜態成員。
非靜態方法既可以訪問靜態也可以訪問非靜態。
<2> 靜態方法中不可以定義this,super關鍵字。
因爲靜態優先於對象存在。所以靜態方法中不可以出現this。
<3> 主函數是靜態的。
6、靜態的利弊端:
利處: <1>對對象的共享數據盡享單獨空間的存儲,節省空間,沒有必要每一個對象都存儲一份。
<2>可以直接被類名調用。
弊端: <1>生命週期過長。
<2> 訪問出現侷限性。(靜態雖好,但只能訪問靜態)
6.主函數:
1、定義:是一個特殊的函數,作爲程序入口,可以被jvm調用。
2、涵義:
public: 代表着該函數的訪問權限是最大的。
static: 代表主函數隨着類的加載就已經存在了。
void: 主函數沒有具體的返回值。
main:不是關鍵字,但是是一個特殊的單詞,可以被jvm識別。
(String[] args):函數的參數,參數類型是一個數組,該數組的元素是字符串。字符串類型數組。(arguments)
3、主函數是固定格式的,被jvm識別。jvm在調用主函數時,傳入的是new String[0];這裏的0代表的是0個元素。
什麼時候使用靜態?
要從兩方面下手:因爲靜態修飾的內容有成員變量和函數。
什麼時候定義靜態變量(類變量)呢?
當對象中出現共享數據時,該數據被靜態所修飾。對象中的特有數據要定義成非靜態存在於堆內存中。
什麼時候定義靜態函數呢?
當功能內部沒有訪問到非靜態數據(對象的特有數據),那麼該功能可以定義成靜態的。
靜態的應用:工具類
文檔註釋:
javadoc-d(指定文檔存儲的位置如果寫.代表當前目錄,也可以定義一個文件夾)
-author(提取作者內容)
-version(提取版本內容)
javadoc-d 指定的文件目錄-author -version ArrayTool.java
<1>每一個應用程序中都有共性的功能,可以將這些功能進行抽取,獨立封裝,以便複用。
<2>將方法都靜態後,可以方便於使用,但是該類還是可以被其他程序建立對象。
爲了更嚴謹,強制讓該類不能建立對象,可以通過將構造函數私有化完成(private)。
靜態代碼塊:
格式:
static{
靜態代碼塊中的執行語句。
}
特點:隨着類的加載而執行,只執行一次,並優先於主函數。用於給類進行初始化的。
局部代碼塊,構造代碼塊,靜態代碼塊:
1、局部代碼塊:
作用:控制變量的生命週期。
在程序中,當我們已經使用完 x後,並且在接下來的代碼中,不會再用到x,那麼就沒必要讓x在內存中佔用空間了,這用情況下,可以 使用局部代碼塊,將x及其所設計到的區域封裝爲局部代碼塊,他們在程序執行中順序不變,只是在執行完成後消失。
2、構造代碼塊:
作用:它可以給所有對象進行初始化。
存在於:類中。
當類中的構造方法以重載的形式存在時,並且有共同成員變量或共同的方法時,可以通過構造代碼塊對其進行初始化;這樣可以減少代 碼的重複!
3、靜態代碼塊:
作用:給類進行初始化。
當類中的方法都被靜態了化,並且構造方法被private了,這是我們不能,在將這個類實例化,然而又想讓類增加一些屬性,就可以使用 靜態代碼塊。
靜態代碼塊和構造代碼塊:
相同點:都是在JVM加載類時且在構造方法執行之前執行,在類中都可以定義多個, 一般在代碼塊中對一些static變量進行賦值。
不同點:靜態代碼塊在非靜態代碼塊之前執行(靜態代碼塊—>非靜態代碼塊—>構造方法)。靜態代碼塊只在第一次new執行一次,之後不再 執行,而非靜態代碼塊在每new一次就執行一次。
非靜態代碼塊可在普通方法中定義(不過作用不大);而靜態代碼塊不行。
---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ----------------------