黑馬程序員 java面向對象(二)

 -------android培訓 、java培訓、期待與您交流! ----------

繼承  extends

將共性內容提取出來單獨描述 只要讓學生和工人與單獨描述的這個類有關係就可以了 
繼承
·提高了代碼的複用性
·讓類於類之間產生了關係,有了這個關係纔有了多態的特性

注意 :

千萬不要爲了獲取其他類的功能,簡化代碼而繼承,必須是類與類之間有所屬關係

java中只支持單繼承 不支持多繼承 
因爲多繼承能帶來安全隱患
當多個父類中定義了相同功能但 功能內容不同時 子類不確定要運行哪一個
 但是java保持了這種機制,並用來另一種體現形式來完成表示多實現。
java支持多層繼承。
也就是一個繼承體系 
如何使用一個繼承體系中的內容呢

想要使用體系 ,先查閱體系中父類的描述,因爲父類中定義的是該體系中的共性功能,

通過了解共性功能就可以知道該體系的基本功能,那麼這個體系已經可以基本使用。

那麼在具體調用時要創建最子類的對象, 

爲什麼呢 一是因爲有可能父類不能創建對象,如抽象類,二是創建子類對象可以使用更

多的功能 包括基本的也包括特有的。簡單一句話就是查閱父類功能,創建子類對象使用功能。

聚合
球員是球隊中的一個 球員跟球隊的關係
 組合關係
組個比聚合聯繫更緊密 比如器官跟身體的關係
聚集關係
當繼承出現後子父類之間的這些成員會出現什麼變化呢

父類也叫超類
super 代表的是父類的引用,
子父類出現後 類成員的特點
類中的成員
1變量
2函數
3構造函數

1 變量
如果子父類中出現了非似有的成員變量時 子類要風聞本類中的
變量用this
子類要訪問父類中的同名變量用super 
這倆詞的使用幾乎相同,this代表的是子類引用。
super代表的是父類的引用。

2  子父類中的函數
當子類出現和父類一模一樣的函數時
當子類對象調用該函數,會運行子類函數的內容。
如同父類的函數被覆蓋一樣。
這種情況是函數的另一個特性:重寫
當子類繼承了父類,沿襲了父類的功能到子類中但是
子類隨具備該功能,但是功能的內容卻和父類不一致,這時
沒有必要定義新功能 而是使用覆蓋特性,保留父類的功能定義
並重寫功能內容。

爲了提高程序的擴展性 可以利用重寫 擴展功能
不改動源碼,繼承之,在重寫的方法裏面添加功能
覆蓋 
1 子類覆蓋父類,必須保證子類權限大於父類權限,纔可以
覆蓋,否則編譯失敗
2 靜態只能覆蓋靜態, 不能覆蓋非靜態,涉及加載內存的先後
默認權限介於似有和共有權限之間 

注意 :
重載 只看同名函數的參數列表
重寫 子父類方法要一模一樣 包括返回值類型
子父類中的構造函數
在對子類對象進行初始化的時候 父類的構造函數也回運行 那是因爲子類的構造函數 第一行有一條隱式的語句 super();
這個super() 語句會訪問父類中空參數的構造函數,而且子類中所有的構造函數默認第一行都是super();

爲什麼子類中必然會訪問到父類中的構造函數呢 
當父類中的構造函數時隱式的時 子類中必須把super顯示出來。

因爲父類中的數據子類可以直接獲取,所以子類對象在建立時候,需要先查詢父類如何對這些數據進行初始化的,所以子

類在對象初始化的時候,要先訪問以下父類中的構造函數

若果要訪問父類中指定的構造函數,可以手動動super方式來指定。

注意 super語句一定定義在子類構造函數的第一行。

構造函數裏面要麼有this 要麼有super 

結論  
子類的所有的構造函數默認都會訪問父類中空參數的構造函數 因爲子類每一個構造函數內的第一行都會有一個隱式的super函數。

當父類中沒有空參數的構造函數時子類鼻血手動通過super或者this語句形式來指定要訪問的構造函數 當然子類的構造函數第一行

也可以手動的指定this語句來訪問本類的構造函數,子類中至少會有一個構造函數會訪問父類的構造函數 

爲什麼this和super不能再同一行 
因爲都是要寫在第一行,爲什麼第一行 因爲初始化動作要先做

final 關鍵字 
最終,作爲一個修飾符 
1 可以修飾類 變量,函數,
2 被final修飾的類 不可以被繼承 
爲了避免被繼承 被子類複寫功能
3 被final修飾的方法不可以被複寫

4 被final修飾的變量時一個常量 只能賦值一次,既可以修飾成員變量有可以修飾局部變量。當在描述事物時

一些數據的出現值是固定的,那麼這是爲了增強閱讀星,都給這些值起個名字,方便閱讀,而這個值不需要改

變所以加上final修飾 作爲常量,常量的書寫範圍所有字母都大寫,如果由多個單詞組成,單詞間通過下劃線 _ 鏈接

5 內部類 定義在類中的局部位置時,只能訪問該局部被final修飾的局部變量 
抽象類 
當多個類中出現相同的共能但是功能出題不同,這時可以進行向上抽取,這時只抽取功能定義,而不抽取主體 
修飾 abstract 抽象方法必須存在於抽象類中 
抽象類的特點,
1 抽象方法一定在抽象類中
2抽象方法和抽象類都必須被abstract關鍵字修飾

3抽象類不可以用new創建對象,因爲調用抽象方法沒意義,抽象類中的方法要被使用必須由子類複寫其所有的抽象方

法後 建立子類對象調用,如果子類只覆蓋了部分抽象方法,那麼該子類還是一個抽象類  


抽象類與一般類沒有太大的不同 該如何描述事物就如何描述事物,只不過,該事物出現了一些看不懂的東西,這些不確

定的部分也是該事物的苟能,需要明確出來,但是無法定義主體。

抽象類比一般類多了抽象函數,就是在類中可以定義抽象方法,抽象類不可以實例化 
特殊,抽象類中可以不定義抽象方法,這樣做僅僅是不讓該類建立對象。
模板方法模式
 

在定義功能的時候 功能的一部分是確定的,但是有一部分是不確定的,而確定的部分在使用不確定的部分,那麼這時就將

不確定的部分暴露出去,由子類完成 

接口 
接口 初期理解可以認爲是一個特殊的抽象類,當抽象類中的方法都是抽象的 那麼該類可以通過接口的形式表示
class用於定義類
interface 用於定義接口 。 
接口定義時格式特點
1 接口衝常見定義,常量, 抽象方法
2 接口中的成員都有固定的修飾符 
常量 public static final 
方法 public abstract 
記住 接口中的成員都是public的  
接口與接口之間是實現關係
implements
接口是不能創建抽象類的,因爲有抽象方法,需要被子類實現,子類對接口中的抽象方法全部覆蓋後,子類纔可以實例化。否則子類是一個抽象類
接口可以被類多實現 也是對多繼承不支持的轉換形式,java支持多實現。
一個類在繼承一個類還能實現多個接口 
接口與接口之間是繼承關係  還存在多繼承 
類與接口是實現
類與類是繼承
找到組織了 繼承
組織裏面乾點副業 擴展了 

組織外面 接口來實現   

多態 
可以理解爲 事物存在的多種體現形態 
1 多態的基本體現 
Animal c = new Cat();
多態在程序中的表現,父類的引用指向了自己的子類對象
父類的引用也可以接受子類的對象

2 多態的前提
必須是類於類之間有關係 要麼是繼承要麼是實現;存在覆蓋

3 多態的好處
大大的提高了程序的擴展性
弊端 
提高了擴展性  但是 只能使用父類的引用訪問父類中的成員 

4 多態的應用

animal a = new cat();//向上轉型 

cat c =(cat)a;// 強制將父類的引用轉成子類類型 
千萬不要出現這種情況 就是父類對象轉成子類類型。
animal a = new animal(); cat c=(cat)a;
多態自始至終都是在子類做着變化
如果 a 是 cat 型的  if(a instanceof cat)
多態使用的注意事項
Fu f = new Zi()
f.method1;
f2.method2;
這個的運行結果是子類中的 1 2 倆方法,這個是父類指向了子類,但是運行的其實是子類的對象,相當於畢老師穿了畢姥爺的衣服但是講的還是java
---
父類指向子類對象的時候
注意 

在多態中 非靜態  成員函數的特點:
在編譯時期參與應用性變量所屬的類中是否有調用的方法,如果有編譯通過,如果沒有編譯失敗,在運行時期 參閱的是對象所屬的類中是否有調用的方法

。(上題中編譯的時候看父類是否有 1 2 3 方法都有則編譯通過,有一個沒有則不通過, 運行的時候是運行子類中的對應方法0)
簡單總結就是,成員函數在多態調用時 編譯看左邊,運行看右邊。
涉及到面試的環節
在多態中成員變量的特點,無論編譯或者運行都參考左邊(引用型變量所屬的類型)
在多態中靜態成員函數的特點,無論是編譯還是巡行,都參考左邊。

object

是所有對象的直接或者間接父類,傳說中的上帝該類中定義的是所有對象都具備的功能。
     
object類中已經提供了對對象是否相同的比較方法,如果自定義類中也有比較相同的功能,

沒有必要重新定義,只要沿襲父類中的功能,建立自己特有的比較內容即可,這就是覆蓋。 
複寫的時候如果用到了對象中的特殊句的話 要注意轉型 向下轉

內部類

常見情況 
 當你使用的方法中所使用的參數類型是一個藉口類型時該藉口中的方法不超過三個可以定義一個匿名內部類,

把該類做爲參數傳進去也行。(在 innerClassTest裏面)
 內部類訪問規則
1 內部類可以直接訪問外部類中的成員,包括私有。這是因爲內部類中持有了一個外部類的引用,格式 外部類名.this.  ;
2 外部類要訪問內部類,必須要建立內部類對象。

訪問格式,當內部類定義在外部類的成員上位置上,而且非私有,可以再外部其他類中。可以直接建立內部類對象格式

是 外部類名.內部類名 變量名 = 外部類對象.內部類對象;{Outer.Inner in = new Outer().new Inner;} 

3 當內部類在成員位置上,就可以被成員修飾符所修飾。
比如,private 將內部類在外部類中進行封裝。
static 內部類就具備static的特性。當內部類被static修飾後,只能直接訪問外部類中static的成員,出現了訪問侷限。
在外部其他類中如何直接訪問非靜態內部類呢?
可以通過這種形式訪問
new Outer.Inner().function();
在外部其他類中如何直接訪靜態內部類呢?這樣 
Outer.Inner().function();
注意 當內部類中定義了靜態成員,該內部類必須是靜態的。
當外部類中的靜態方法,訪問內部類時,內部類也必須是靜態的。

 內部類定義的原則
 當描述事物時,事物的內部還有事物,該事物用內部類來描述,因爲內部事物在使用外部事物的內容
 匿名內部類 
靜態是成員修飾符,不能定義在局部。
【非靜態,沒對象,不運行 】
內部類定義在局部時 
1 不能被成員修飾
2 可以直接訪問外部類中的成員,因爲還持有外部類中的引用。 但是不可以訪問它所在的局部中的變量。

只能訪問被final修飾的局部變量。
1 匿名內部類其實就是內部類的簡寫格式。
2定義匿名內部類的前提,內部類必須繼承一個類或者實現接口
3 匿名內部類的格式 
new 父類或者接口(){定義子類的內容}
4 其實匿名內部類就是一個匿名子類對象。而且這個對象有點胖可以理解爲帶內容的對象 
匿名對象只能對方法調用一次
5 匿名內部類中調用的方法最好不要超過三個
沒有父類,也沒有接口能用內部類不?


異常概述
程序在運行時出現的不正常情況 
異常的由來,問題可以使現實生活中一個具體事務,也可以通過java的類的形式進行描述,並封裝成對象, 其實就是java對不正常情況進行描述後的對象體現。
對於問題的劃分,有兩種,一種是眼中的問題,一種是非嚴重的問題,對於嚴重的java通過error類進行描述,
對於error一般不編寫針對性的代碼進行處理
對於非嚴重的java通過exception類進行描述。對於exception可以使用使用針對性的處理方式進行處理。
無論error或者exception都具有一些共性內容,比如 不正常情況的信息,引發的原因的等
try
{
要執行的語句
}
catch(Exception e)
{
 提示語句
}

finally{一定要執行的語句}


3 對捕獲的異常進行常見方法操作。
String getMessage()獲取一場信息 
在函數上聲明異常,便於提高安全性,讓調用出進行處理,不處理編譯失敗。
對多異常的處理
1 聲明異常的時候建議聲明更爲具體的異常這樣處理的更具體。
2 對方聲明幾個異常,就對應有幾個catch塊,不要定義多餘的catch塊
如果多個catch塊中的一場出現繼承關係,父類一場catch塊放在下面
建議在進行catch處理時,catch中一定要定有具體飛處理方式,不要簡單一句e.ptintStackTrace();也不要簡單的就書寫一條輸出語句。
自定義異常 
什麼是自定義異常?

  因爲項目中會出現特有的問題,而這些問題並未被java所描述,並封裝對象,所以對這些特有的問題,可以按照java的對問題封裝的思想,

將特有的問題,進行定義的一場封裝,
當在函數內部出現了throw拋出異常對象,那麼就必須要給對應的處理動作,要麼在內部try catch 處理,要麼在函數上聲明讓調用者處理
函數內出現異常,主函數一般要聲明。
如何定義異常信息?
父類中已經把異常信息的操作都完成了,所以子類在構造時將異常信息傳遞給父類,通過super語句那麼就可以直接通過getMassage信息獲取一場信息了。 
自定義異常
必須是自定義類繼承exception
繼承exption的原因,
異常體系內有一個特點,異常類和異常對象都要拋出。他們都具備可拋性,這個可拋性是throwable這個體系中獨有特點。只有這個體系中的成員才能被throw和throws這兩個關鍵字操作。
throw 使用在函數內
throws使用在函數上
throws後面跟的一場類可以跟多個,用逗號隔開,
throw後面跟的是異常對象。
exception中有一個特殊的子類異常runtimeexception 運行時異常,如果在函數內容拋出該異常,函數上可以不用聲明,編譯一樣通過,如果在函數上聲明瞭異常,調用者可以不用進行處理,編譯一樣通過。
之所以不用在函數上聲明,是因爲不需要讓調用者處理,當該異常發生的時候,希望程序停止,因爲在運行時,出現了無法繼續運算的情況,希望停止程序後,對代碼進行修正。
自定義異常是,如果該異常的發生,無法繼續進行運算,就讓自定義異常繼承runtimeexception 
對於異常分兩種 
第一是編譯時被檢測的一場 
第二是編譯時不被檢測的異常 (運行時異常)runtimeException以及子類。
throw 單獨出現的時候它下面的語句 執行不到的

異常 finally 
這裏面存在的是一定被執行的句子 
當你程序裏面有必須要執行的語句的時候可以用try和 finally來執行
finally啥用呢,
比如斷開數據庫的鏈接。對資源進行關閉
finally代碼塊,定義一定執行的代碼,通常用於關閉資源。 
try 可以單獨跟catch在一起,
try 可以跟catch 和finally在一起,
try 可以和finally  在一起
【問題再內部被解決了,就可以不用再函數上聲明】
啥叫問題被解決, 有catch抓住就行。
注意一點,catch是用於處理異常,如果沒有catch就代表異常沒有處理過,如果該異常是檢測異常,那麼必須聲明。

異常 覆蓋時異常
異常在子類父類覆蓋中的體現。
1子類在覆蓋父類時 如果父類的方法,拋出異常,那麼子類的覆蓋方法只能拋出父類的異常或該異常的子類,或者不拋。
2如果父類方法拋出多個異常,那麼子類在覆蓋該方法時,只能拋出父類異常的子集。
3 如果父類湖綜合接口的方法中,沒有異常拋出,那麼子類在覆蓋方法時 也不可以拋出異常,如果子類方法發生了異常,就必須要try處理,絕對不能拋
A是父異常 B子異常 C是其他異常
如果在子類中出現了一個C異常,那必須try
異常的產生能讓正常流程和問題處理代碼相分離。
異常 總結 
異常是什麼 
是對問題的描述 將問題進行對象的封裝
異常體系
throwable
  |--error
  |--Exception
     |--RuntimeException
異常體系的特點,異常體系中所有類以及建立的對象都具有可拋性,也就是說可以被throw和throws關鍵字操作,只有異常體系具備這個特點
throw和throws的用法
throw定義在函數內,用於拋出異常對象。
throws定義在函數上,用於拋出異常類,可以拋出多個用逗號隔開。
當函數內容有throw拋出異常對象,並未進行try處理,必須要在函數上聲明,否則編譯失敗,注意runtimeexception除外,也就是函數內如果拋出的runtimeexception異常,函數上可以不用聲明。如果函數聲明瞭異常,調用者需要進行處理,處理方式可以拋出可以try
異常有兩種
編譯時被檢測異常
 該異常在編譯時,如果沒有處理(沒有拋也沒有try)編譯失敗 該異常被標示,代表可以被處理
運行時異常(編譯時不檢測)
 在編譯時不需要處理,編譯器不檢查,該異常發生,建議不處理,讓程序停止,讓代碼進行修正。
異常語句
try
{需要被檢測的代碼}
catch(){處理異常的代碼}
finally
{一定會執行的代碼}
三種結合方式 
1try
{}
catch(){}
finally
{}
2 try
{}
catch(){}
3
try
{}
finally
{}
注意finally中通常定義的是 關閉資源代碼,因爲資源必須要釋放。
finally只有一種情況不會執行,當執行到system.exit(0);finally不會執行
自定義異常
  定義類繼承exception或者runtimeexception
1 爲了讓該自定義類具備可拋性
2讓該類具備操作異常的共性方法
當要定義自定義異常的信息時,可以使用父類已經定義好的功能。
將異常信息傳遞給父類的構造函數 
自定義異常是 按照java的面向對象思想將程序中出現的特有問題進行封裝。
異常的好處
1 將問題進行封裝,
3 將正常流程代碼和問題處理代碼分離,方便於閱讀
異常的處理原則 
1 處理方式有兩種,try或者trowes
2 調用到拋出異常的功能時,如果拋出幾個,就處理幾個。 一個try對應多個catch。
3多個catch父類的catch放到最下面
4 catch需要定義針對性的處理放肆,不要簡單行醫輸出語句,也不要不寫
當捕獲到異常本功能處理不了時,可以繼續在catch中拋出
try{
 throw new Aexception();
}
catch (AException e)
{
  throw e ;
 }
如果該異常處理不了,但並不屬於該功能出現的異常,可以講異常轉換後再拋出,和該功能相關的異常
或者異常可以處理,當需要將異常產生的和本功能相關的問題提供出去,讓調用者知道並處理,也可以講捕獲異常處理後,轉換新異常拋出
異常的 注意事項
 在子父類覆蓋時
1 子類拋出的異常必須是父類的異常的子類或者子類集
2 如果父類或者接口沒有異常拋出時,子類覆蓋出現一場,只能try不能拋。
 
this 關鍵字的含義,final有哪些特點
this 代表本類對象,哪個對象調用this所在函數,this就代表哪個對象。
final
1 修飾類,變量(成員變量,靜態變量,局部變量),函數。
2修飾的類不可以被繼承,
3修飾的函數不可以被覆蓋
4修飾的變量時一個常量,只能賦值一次
5 內部類只能訪問局部中的final類型的變量
千萬記住 throw單獨存在的時候下面一定不要有語句 執行不到
包 總結
包與包之間進行訪問,被訪問的包中的類以及類中的成員,需要public修飾
 不同包中的子類可以訪問父類中被protected權限修飾的成員。
 包與包之間能夠使用的權限有兩種, public 和protectd
權限問題
public protectd default private 
同一個類中
都可以
同一個包中
private不行其他三個都行
子類
public protectd 可以
不同包中
public可以 其他的不可以
一個java文件中不可以同時出現兩個共有(public)類或者接口
爲了簡化類名的書寫,使用一個關鍵字 import
import導入的是包中的類 
再用的時候不同包中有同名類必須得加上包名
建立包名不要重複,可以使用url來完成定義,url是唯一的
 -------android培訓 、java培訓、期待與您交流! ----------
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章