成員內部類不能夠有靜態屬性。(爲何?)

成員內部類不能夠有靜態屬性。(爲何?)程序員

 

若是在外部類的外部訪問內部類,使用out.inner.工具

 

創建內部類對象時應注意:指針

在外部類的內部能夠直接使用inner s=new inner();(由於外部類知道inner是哪一個類,因此能夠生成對象。)調試

而在外部類的外部,要生成(new)一個內部類對象,須要首先創建一個外部類對象(外部類可用),而後在生成一個內部類對象。對象

Outer.Inner in=Outer.new.Inner()繼承

錯誤的定義方式:教程

Outer.Inner in=new Outer.Inner()接口

注意:當Outer是一個private類時,外部類對於其外部訪問是私有的,因此就沒法創建外部類對象,進而也沒法創建內部類對象。資源

 

①  局部內部類:在方法中定義的內部類稱爲局部內部類。開發

與局部變量相似,在局部內部類前不加修飾符publicprivate,其範圍爲定義它的代碼塊。

 

注意:局部內部類不只能夠訪問外部類實例變量,還能夠訪問外部類的局部變量(但此時要求外部類的局部變量必須爲final)??

在類外不可直接生成局部內部類(保證局部內部類對外是不可見的)。

要想使用局部內部類時須要生成對象,對象調用方法,在方法中才能調用其局部內部類。

 

②  靜態內部類:(注意:前三種內部類與變量相似,因此能夠對照參考變量)

靜態內部類定義在類中,任何方法外,用static定義。

靜態內部類只能訪問外部類的靜態成員。

生成(new)一個靜態內部類不須要外部類成員:這是靜態內部類和成員內部類的區別。靜態內部類的對象能夠直接生成:

Outer.Inner in=new Outer.Inner()

而不須要經過生成外部類對象來生成。這樣實際上使靜態內部類成爲了一個頂級類。

靜態內部類不可用private來進行定義。例子:

對於兩個類,擁有相同的方法:

People

{

  run();

}

Machine{

   run();

}

此時有一個robot類:

class Robot extends People implement Machine.

此時run()不可直接實現。

注意:當類與接口(或者是接口與接口)發生方法命名衝突的時候,此時必須使用內部類來實現。

用接口不能徹底地實現多繼承,用接口配合內部類才能實現真正的多繼承。

 

③  匿名內部類(必須掌握):

匿名內部類是一種特殊的局部內部類,它是經過匿名類實現接口。

IA被定義爲接口。

IA I=new IA(){};

注:一個匿名內部類必定是在new的後面,用其隱含實現一個接口或實現一個類,沒有類名,根據多態,咱們使用其父類名。

因其爲局部內部類,那麼局部內部類的全部限制都對其生效。

匿名內部類是惟一一種無構造方法類。

匿名內部類在編譯的時候由系統自動起名Out$1.class

 

若是一個對象編譯時的類型是接口,那麼其運行的類型爲實現這個接口的類。

因匿名內部類無構造方法,因此其使用範圍很是的有限。

(下午:)Exception(例外/異常)(教程上的MODEL7

對於程序可能出現的錯誤應該作出預案。

例外是程序中全部出乎意料的結果。(關係到系統的健壯性)

 

JAVA會將全部的錯誤封裝成爲一個對象,其根本父類爲Throwable

Throwable有兩個子類:ErrorException

一個Error對象表示一個程序錯誤,指的是底層的、低級的、不可恢復的嚴重錯誤。此時程序必定會退出,由於已經失去了運行所必須的物理環境。

對於Error錯誤咱們沒法進行處理,由於咱們是經過程序來應對錯誤,但是程序已經退出了。

咱們能夠處理的Throwable對象中只有Exception對象(例外/異常)。

Exception有兩個子類:Runtime exception(未檢查異常)

Runtime exception(已檢查異常)

(注意:不管是未檢查異常仍是已檢查異常在編譯的時候都不會被發現,在編譯的過程當中檢查的是程序的語法錯誤,而異常是一個運行時程序出錯的概念。)

Exception中,全部的非未檢查異常都是已檢查異常,沒有另外的異常!!

 

未檢查異常是由於程序員沒有進行必要的檢查,由於他的疏忽和錯誤而引發的異常。必定是屬於虛擬機內部的異常(好比空指針)。

 

應對未檢查異常就是養成良好的檢查習慣。

已檢查異常是不可避免的,對於已檢查異常必須實現定義好應對的方法。

已檢查異常確定跨越出了虛擬機的範圍。(好比「未找到文件」)

 

如何處理已檢查異常(對於全部的已檢查異常都要進行處理):

首先了解異常造成的機制:

當一個方法中有一條語句出現了異常,它就會throw(拋出)一個例外對象,而後後面的語句不會執行返回上一級方法,其上一級方法接受到了例外對象以後,有可能對這個異常進行處理,也可能將這個異常轉到它的上一級。

對於接收到的已檢查異常有兩種處理方式:throwstry方法。

 

注意:出錯的方法有多是JDK,也多是程序員寫的程序,不管誰寫的,拋出必定用throw

 

例:public void print() throws Exception.

 

對於方法a,若是它定義了throws Exception。那麼當它調用的方法b返回異常對象時,方法a並不處理,而將這個異常對象向上一級返回,若是全部的方法均不進行處理,返回到主方法,程序停止。(要避免全部的方法都返回的使用方法,由於這樣出現一個很小的異常就會令程序停止)。

 

若是在方法的程序中有一行throw new Exception(),返回錯誤,那麼其後的程序不執行。由於錯誤返回後,後面的程序確定沒有機會執行,那麼JAVA認爲之後的程序沒有存在的必要。

 

對於try……catch格式:

try  {可能出現錯誤的代碼塊}   catch(exception e){進行處理的代碼}

                                對象變量的聲明

 

用這種方法,若是代碼正確,那麼程序不通過catch語句直接向下運行;

若是代碼不正確,則將返回的異常對象和e進行匹配,若是匹配成功,則處理其後面的異常處理代碼。(若是用exception來聲明e的話,由於exception爲全部exception對象的父類,全部確定匹配成功)。處理完代碼後這個例外就徹底處理完畢,程序會接着從出現異常的地方向下執行(是從出現異常的地方仍是在catch後面呢?利用程序進行驗證)。最後程序正常退出。

 

Try中若是發現錯誤,即跳出try去匹配catch,那麼try後面的語句就不會被執行。

一個try能夠跟進多個catch語句,用於處理不一樣狀況。當一個try只能匹配一個catch

咱們能夠寫多個catch語句,可是不能將父類型的exception的位置寫在子類型的excepiton以前,由於這樣父類型確定先於子類型被匹配,全部子類型就成爲廢話。JAVA編譯出錯。

 

trycatch後還能夠再跟一子句finally。其中的代碼語句不管如何都會被執行(由於finally子句的這個特性,因此通常將釋放資源,關閉鏈接的語句寫在裏面)。

 

若是在程序中書寫了檢查(拋出)exception可是沒有對這個可能出現的檢查結果進行處理,那麼程序就會報錯。

而若是隻有處理狀況(try)而沒有相應的catch子句,則編譯仍是通不過。

如何知道在編寫的程序中會出現例外呢

1.  調用方法,查看API中查看方法中是否有已檢查錯誤。

2.  在編譯的過程當中看提示信息,而後加上相應的處理。

 

Exception有一個message屬性。在使用catch的時候能夠調用:

Catch(IOException e){System.out.println(e.message())};

Catch(IOException e){e.printStackTrace()};

上面這條語句回告訴咱們出錯類型所歷經的過程,在調試的中很是有用。

 

開發中的兩個道理:

①如何控制try的範圍:根據操做的連動性和相關性,若是前面的程序代碼塊拋出的錯誤影響了後面程序代碼的運行,那麼這個咱們就說這兩個程序代碼存在關聯,應該放在同一個try中。

①  對已經查出來的例外,有throw(積極)和try catch(消極)兩種處理方法。

對於try catch放在可以很好地處理例外的位置(即放在具有對例外進行處理的能力的位置)。若是沒有處理能力就繼續上拋。

 

當咱們本身定義一個例外類的時候必須使其繼承excepiton或者RuntimeException。

Throw是一個語句,用來作拋出例外的功能。

而throws是表示若是下級方法中若是有例外拋出,那麼本方法不作處理,繼續向上拋出。

Throws後跟的是例外類型。

斷言是一種調試工具(assert)

其後跟的是布爾類型的表達式,若是表達式結果爲真不影響程序運行。若是爲假系統出現低級錯誤,在屏幕上出現assert信息。

Assert只是用於調試。在產品編譯完成後上線assert代碼就被刪除了。

 

方法的覆蓋中,若是子類的方法拋出的例外是父類方法拋出的例外的父類型,那麼編譯就會出錯:子類沒法覆蓋父類。

結論:子類方法不可比父類方法拋出更多的例外。子類拋出的例外或者與父類拋出的例外一致,或者是父類拋出例外的子類型。或者子類型不拋出例外。

若是父類型無throws時,子類型也不容許出現throws。此時只能使用try catch

 

練習:寫一個方法:int add(int a,int b)

{

  return a+b

}

a+b=100;拋出100爲異常處理。

相關文章
相關標籤/搜索