1.1 面向對象的理解:
1.2 面向對象的特點:
a.它本身就是一種符合人們思考習慣思想;
b.將複雜事情簡化;
c.角色上的轉變,執行者--->指揮者;
d.可維護性好。
1.3 類和對象之間的關係
類:是對事物的描述。
對象:是該類事物具體的實體。
1.4 面向對象的基本概念:面向對象=對象+類+繼承+消息
a.對象:在面向對象的系統中,對戲那個是基本的運行時的實體,它包括數據屬性,也包括作用於數據的操作。所以一個對象把屬性和行爲密封成一個整體。從程序設計者的角度來看,對象是一個程序模塊;從用戶的角度來看,對象爲他們提供了所希望的行爲。在對象內的操作通常叫做方法。
b.類:一個類定義了一組大體上相似的對象。一個類所包含的方法和數據描述一組對象的共同行爲屬性。把一組對象的共同特性加以抽象並存儲在一個類中的能力,是面嚮對象的技術最重要的一點;是否建立了一個豐富的類庫是衡量一個面向對象程序設計語言成熟與否的重要標誌。
c.繼承:類之間的繼承關係是現實世界中遺傳關係的直接模擬,他表示類之間的內在聯繫以及對屬性和操作的共享,即子類可以沿用父類的某些特徵。當然,子類也可以具有自己獨立的屬性和操作。繼承性數面向對象程序設計語言的最主要的特點,是其他語言所沒有的。
d.消息:對象之間進行通信的一種構造叫做消息。當一個消息發送給某個對象時,包含要求接收對象去執行某些活動的信息。接收到消息的對象經過解釋,然後予以響應。這種通信機制叫做消息傳遞,發送消息的對象不需要知道接收消息的對象如何請求予以響應。
1.5 成員變量和局部變量的區別
a.定義的位置:局部變量定義在函數中,語句內; 成員變量定義在類中;
b.內存中的位置:成員變量存儲在棧內存中; 成員變量存儲在堆內存中;
c.初始化值:局部變量沒有默認初始化值,必須賦值纔可以使用; 成員變量有默認初始化值;
d.生命週期:局部變量一旦作用區域結束,就立即被釋放; 成員變量也稱爲實例(對象)變量,隨着對象的出現而出現,隨着對象的被回收而釋放;
1.7 匿名對象的作用
a.匿名對象(沒有名字的對象),可以作爲實際參數進行傳遞。
b.匿名對象另一個使用:當對對象的方法僅進行一次調用的時候,可以簡化成匿名對象完成。
1.8 封裝:是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。
封裝原則:將不需要對外提供的內容都隱藏起來; 把屬性都隱蔽,提供公共方法對其訪問。
好處:
a.將變化隔離
b.便於使用
c.提高重用性
d.提高安全性
1.9 private 關鍵字 私有
讓成員變量私有化,也就是說,訪問權限變到最低,私有隻在本類中有效。
通常將類中的成員變量私有化,對外提供方法進行訪問,提供的目的是對成員數據進行控制,讓其具備可控性。
定義set get方法對成員變量進行訪問。
注意:私有僅僅是封裝的表現形式之一。 私有隻能修飾成員
1.10 構造函數:
特點:a.函數名與類名相同 b.不用定義返回值類型 c.沒有具體的返回值。
作用:給對象進行初始化。
注意:a.默認構造函數的特點。 b.多個構造函數是以重載的形式存在的。
構造函數在對象創建時就已經被調用了
如果一個類中沒有定義過構造函數,編譯器在編譯時,就給類添加一個默認的構造函數(空的構造函數)。一旦在類中明確了自定義的構造函數時,該默認構造函數就沒有了。
當一個類中有多個構造函數時,它們是以重載形式體現的。
構造函數和一般函數的區別:
構造函數用於對象初始化。初始化動作只能執行一次。而一般函數可以被執行多次。
1.11 this:代表的是對象,其實就是一個對象的引用。
哪個對象調用了this所在的函數,this就代表哪個對象。
this的使用之一:當成員變量和局部變量同名時,可以用this來區分
this的使用之二:使用this(參數列表)的方式就可以實現構造函數之間的調用。
注意:構造函數之間調用時,this語句只能定義在構造函數的第一行。構造函數裏面只能調用一次構造函數
1.12 靜態關鍵字:static
a.修飾符,修飾成員(成員變量,成員函數);
特點:
a.被靜態修飾的內容可以實現被所有對象共享;
b.靜態數據隨着類的加載而加載,隨着類的消失而消失,生命週期過長,優先於對象存在;
c.靜態數據因爲所屬於類,又多了一種調用方式,出了可以被對象調用以外,還可以直接被類名所調用。
什麼時候用靜態呢?
變量:當類中的屬性的數據是所有對象都共享的,就用static修飾。
方法:當方法中沒有訪問過非靜態數據時,該方法用static修飾
使用注意
靜態方法只能訪問靜態成員,不能訪問非靜態成員
靜態方法中不可以寫this,super關鍵字
主函數是靜態的
1.13 成員變量和靜態變量的區別?
a.生命週期:
成員變量又叫實例變量,是隨着對象的出現(消失)而出現(消失)。
靜態變量又叫類變量,是隨着類的加載(消失)而出現(消失)。
b.內存中的存儲位置:
成員變量存儲在內存的對象區
靜態變量存儲在方法區的靜態區中。
c.存儲的數據特點:
成員變量存儲的數據數據對象的特有數據;
靜態變量存儲的數據是對象的共享數據
d.調用方式:
成員變量,只能被對象所調用
靜態變量,能被對象調用,也可以被類調用。
1.14 強制不讓其他類創建該對象,把該類私有化,當類中成員都是靜態時,記得將構造函數私有化,因爲創建對象是沒有意義的。
設計模式:就是解決問題行之有效的方法,是一種思想。
單例設計模式:解決問題就是保證一個類在內存中只有一個對象。
如何保證一個類在內存中的對象唯一性?
a.不讓其他程序創建該類對象。
b.在本類中自己定義一個本類對象
c.對外還提供一個獲取該對象的方法。
分爲:餓漢式 懶漢式
2.1 繼承:
好處:1.提高了代碼的複用性;
2.讓類與類之間產生了關係,爲多態特徵提供了前提。
子類可以直接訪問父類中的非私有的成員,間接訪問私有成員,通過方法的形式。
Java中繼承的特點:
Java中只支持單繼承。並不直接支持多繼承。
單繼承:一個子類只能有一個父類
多繼承:一個子類可以有多個父類。不直接支持,通過改良
Java中還支持多層繼承。
class A{}
class B extends A{}
class C extends B{}
繼承層次多了,就形成了繼承體系。 體系就是不斷向上抽取而來的。
在使用一個體系的時候,先參閱最頂層類,瞭解體系的最基本功能。
使用時,創建該體系最底層的類的對象。
看頂層,用底層
2.2 繼承中子父類成員的特點:
a.成員變量;
super:代表的就是父類。
super的用法和this很相似
用法super.父類成員。super(實際參數);
this:代表的是本類型對象的引用。
super:代表的是父類的內存空間。
子類中的super作用爲了給父類中的成員變量初始化
字父類中出項同名成員變量時用super區分出父類變量。但是這種情況很少出現
b.成員函數;
當子父類中出現一模一樣的函數時。
出現了另一個函數特性:覆蓋 或 複寫、重寫。
overload(重載):只關注本類中同名函數的參數列表,不關注返回值類型。
override(覆蓋):子父類中函數出現一模一樣的函數,纔會覆蓋
覆蓋的應用:保留父類功能聲明,建立子類功能內容,這就是覆蓋;
覆蓋注意事項:
●子類覆蓋父類方式,必須要保證子類方法權限大於等於父類方法權限。
●靜態只能覆蓋靜態,或者被靜態覆蓋。
c.構造函數
子類的實例化過程:子類中的所有構造函數中第一行都有一條默認的隱式語句super();
super():用來調用父類中的空參數的構造函數。
爲什麼子類中都有默認super語句呢?
因爲子類對象中會存在父類中的屬性數據,必須要子類對象初始化時,先執行父類的初始化動作,看看父類是如何對自己的屬性數據進行初始化的。
所以呢。子類的所有構造函數默認第一行(因爲初始化動作要先執行,所以定義在第一行)都有一條默認的super()語句。
如果父類中沒有定義空參數的構造函數,子類構造函數必須通過super或this語句指定要訪問的父類的構造函數。
2.3 final關鍵字:
a.修飾符,修飾類,方法,各種變量。
b.final修飾類不可以被繼承。
c.final修飾的方法不可以被覆蓋。
d.final修飾的變量是一個常量,只能賦值一次。
對固定不變的值進行名稱定義,提高其閱讀性,
final修飾的常量 命名規則 所有字母都大寫,多個單詞,單詞間用_連接。
2.4 抽象:
類是用來描述事物,當沒有足夠的信息去描述一個事物時,這個描述就是抽象的。
抽象類的特點:
a.抽象方法只有聲明,沒有方法體。
b.抽象方法一定定義在抽象類中,都需要被abstract關鍵字修飾。
c.抽象類不可以用new創建對象。
d.抽象類必須有自己的子類覆蓋了所有的抽象方法後,該子類纔可以被實例化,否則,該子類還是一個抽象類。
2.5 如果一個抽象類的方法都是抽象的,這時可以將抽象類用另一種形式來體現,就是接口
接口定義的關鍵字就是 interface
接口中成員的定義:
常見成員有兩種:1.全局常量; 2.抽象方法。
接口的好處:是將多繼承進行改良,用多實現進行體現。
一個類只能繼承一個類,但是一個類可以實現多個接口。
一個類繼承類的同時,還可以實現多個接口。
接口的出現避免了單繼承的侷限性。
2.6 接口與抽象類的區別:
共性:
抽象類和接口都是不斷向上抽取而來的;
區別:
1.抽象類中可以定義抽象方法,也可以定義非抽象方法,非抽象方法可以直接提供給子類使用;
接口只能定義抽象方法。
2.類與類之間是繼承關係,is a關係。
類與接口之間是實現關係,like a關係
3.類與類之間只能單繼承。
類與接口之間可以多實現
3.1 多態:多種形態。
對象的多態性。
class 動物{}
class 貓 extends 動物{}
貓 x=new 貓();
動物 y =new 貓();//貓這個實體具備着兩種形態,一個是貓另一個是動物。這就是多態性。
多態在程序中的體現:父類或者接口的引用指向了自己的子類對象。
動物 y= new 貓();//向上轉型(類型提升),子類對象提升爲父類型。
提升的好處:就是提高了擴展性。隱藏了子類型。
提升的侷限性:只能使用父類中的方法。如果子類有覆蓋,運行的是子類的內容。
貓 c=(貓)y;//向下轉型(強制類型轉換),好處:可以使用具體子類型的特有方法。
向下轉型需要注意:父類型向下轉成子類型,因爲子類型不唯一,所以,需要進行判斷。
判斷用:instanceof關鍵字
對象 instanceof 類or接口...
記住:對於子父類型轉換動作,自始自終都是子類對象在做着類型的轉換而已。
多態的前提:
a.必須有繼承或者實現的關係。
b.通常都有覆蓋的操作。
多態的好處:
提高了程序的擴展性; 在思想上也有不同,以前面對一個對象調用,對象多了調用麻煩。
相當於指揮一批對象做事情,將複雜事情簡單化。
多態的弊端:
多態的出現,雖然可以讓前期的程序使用後期的內容。
不可以使用子類特有的內容。
3.2 多態調用時的特性:
a.成員變量:
多態調用時,對於成員變量,無論是編譯還是運行,結果只參考引用型變量所屬的類中的成員變量。參考等號左邊。
b.成員方法:
多態調用時,對於成員函數
編譯時,參考引用型變量所屬的類中是否有被調用的方法。有,編譯通過,沒有,編譯報錯。
運行時,參考的是對象所屬的類中是否有調用的方法。
簡單說:編譯看左邊,運行看右邊.
c.靜態函數:
簡單說:編譯和運行都看左邊。
3.3 object:所有類的超類。
所有對象都具備的方法定義在該類中。
3.4 getClass(); Class c1 = p1.getClass();//獲取person對象所屬的字節碼文件對象。這個對象的類型Class.
3.5 內部類:將類定義在另一個類的內部,內部類的就稱爲內部類。
內部類編譯後,在內部類的class文件前有一個$符號
訪問方式:內部類可以直接訪問外部類中的成員。
外部類要訪問內部類中的成員,必須要創建內部類中的對象。
注意:當內部類中定義可靜態成員,該內部類必須被靜態修飾。
非靜態內部類能直接訪問外部成員的原因,是他持有一個外部成員的索引this
3.6 內部類定義在局部中,只能訪問被final修飾的局部變量。
3.7 匿名內部類:
匿名內部類的形式。
其實就是對內部類進行簡化書寫。
必須有前提:
內部類必須繼承或者實現類或接口。
格式:
new 父類名或者接口名(){定義內部類的內容;}
匿名內部類其實就是一個子類匿名對象。