//內部類(內置類/嵌套類) 就是類裏面的類。
內部類的訪問規則:
1、內部類可以直接訪問外部類中的成員,包括私有。外部類要訪問內部類,必須要建立內部類對象。
調用非靜態方法必須要現有對象。
外部類直接訪問內部類中的成員:因爲有可能有別的同類名。所以必須要有限制修飾。
格式:outer.inner in=new outer().new inner();
在類中,方法訪問變量的順序是,先局部變量,再成員變量。
內部類的方法中如何訪問外部類中的變量,在前面加修飾 outer。this。x
直接加this。x就只能訪問到內部類的成員變量。
之所以可以直接訪問外部類中的成員,是因爲內部類中持有了一個外部類的引用,
格式:“外部類名。this”。其實如果內部沒有重新定義,就可以直接訪問外部的是因爲前面省略了“outer.”。
訪問格式:當內部類定義在外部類的成員位置上,而且非私有,可以在外部其他類中。
可以直接建立內部類對象。
格式:外部類名.內部類名變量名=外部類對象,內部類對象;
outer.inner in=new outer().new inner();
當內部類在成員位置上,就可以被成員修飾符所修飾,比如私有,private,將內部類在外部類中進行封裝。static,內部類就具備了static的特性。
當內部類被靜態修飾後,只能直接訪問外部類中的靜態成員了。出現了訪問侷限。靜態內部類。不出現特有數據,全都是公有數據。
在外部其他類中,如何直接訪問靜態內部類的非靜態成員呢?
可以通過new outer. inner。function();
在外部其他類中,如何直接訪問靜態內部類的靜態成員呢?outer. inner。function();
注意,當內部類中定義了靜態成員,該內部類必須是靜態的。當外部類中的靜態方法訪問內部類時,內部類也必須是靜態的。
不作重點掌握。
靜態方法訪問靜態成員是一定可以的。
靜態成員是比非靜態成員先加載的。
//內部類的定義原則:
當描述事物時,事物的內部還有事物,該事物用內部類來描述,因爲內部事物在使用外部事務的內容。
屬性 行動 功能等。
屬性和行爲一多了就要進行對象封裝。找到了這個對象就可以找到功能和屬性了。
當一類事物直接訪問外部事物的內容時,直接把這個類定義在外部類中,這樣的代碼設計是最優的。當一個類需要訪問另一個類中的成員中,直接寫到那個類中,再對這個內部類進行封裝,對外提供方法既可以。
//匿名內部類
只有當內部類處於成員位置才能被靜態和私有修飾,一般是不會被公有修飾的。
內部類可以定義在任意位置上,成員或者局部。但是訪問規則沒有變。但是不能被靜態所修飾了。靜態只能修飾成員的。局部的內部類裏面也不能定義靜態成員。
非靜態,沒有對象,就不會執行。
先加載類,才能加載對象,因爲對象是依賴類而建立的。
內部類定義在局部時:
1、不可以被成員修飾符修飾;可以直接訪問外部類中的成員,因爲還持有外部類當中的引用,但是不可以訪問他所在的局部中的變量,只能訪問被final修飾的局部變量。
匿名內部類就是內部是的簡寫格式,
往往簡寫都是有前提,有其好處和弊端的。
2、定義匿名內部類的前提,內部類必須繼承一個類或者實現接口。
一個內部類可以直接繼承一個外部其他類。
對象帶着對象體,也是一個對象。
3、匿名內部類的格式:new 父類或者接口(){定義子類的內容}。
4、其實匿名內部類就是一個匿名子類對象。而且這個對象有點胖。可以理解爲帶內容的對象。匿名對象對方法只能調用一次。
寫匿名對象就是爲了簡化書寫,覆蓋方法。
匿名內部類有好處有弊端,
無法轉換類型,無法調用自己的方法,無法進行強轉動作,如果父類的方法非常多,不允許使用匿名內部類,因爲閱讀性非常多。
一般寫匿名內部類裏面的方法不會超過三個。兩個或者一個這樣調用方法比較方便。
5、匿名內部類中定義的方法最好不要超過3個。太多閱讀性非常差。一般不在內部類寫太複雜,因爲他是爲了簡化而存在,太複雜了匿名內部類就沒有意義了。
小練習:test.function().method();
什麼時候用到匿名內部類呢?
當使用的方法參數類型是一個接口類型時,而且該接口內的方法不超過3個,我們可以定義一個匿名內部類來進行操作。
這個裏面又是多態的繼承問題,搞不清楚。
//異常機制
程序出現了不正常現象時,程序就會停止運行並結束,不再執行下面的運算。
異常就是程序在運行時出現了不正常的情況,
異常的由來:
我們寫程序是爲了描述現實生活的事物,肯定是包含一些問題,問題也是現實生活中的事物,也可以通過java的類的形式進行描述,並封裝成對象,java就把對與問題的描述封裝成的對象成爲不正常情況,就叫異常。其實就是java對不正常情況進行描述後的對象體現。
有描述,就可以封裝成對象。
一個問題的產生既會有問題的原因,還會有現象以及一些其他信息,這個問題裏面有很多的內容,封裝成對象後,就可以通過對象內部定義的功能進行操作,這就是對象封裝,把問題封裝成對象就叫做異常。
萬物皆對象,異常就是用面向對象的思想把問題進行描述並進行對象的封裝而來的。。
對於問題的劃分有兩種,一種是嚴重的問題,一種非嚴重的問題。
對與嚴重的問題,java通過Error進行描述。對於Error一般我們不編寫針對性的代碼對其進行處理。
對於非嚴重的問題,java通過Exception類進行描述。對於Exception可以使用針對性的處理方式進行處理。
內存溢出,超出虛擬機制定內存的範圍。
無論Error或者Exception都具有一些共性的內容,比如,不正常的情況的信息,引發原因。
可以向上抽取,抽取完之後就可以形成一個基本的體系,抽取出來的父類就叫做throwable。下面就有上面兩類子類。
使用體系時要看父類定義,建立子類對象。
java在爲了讓代碼具有閱讀性,就用父類作爲子類取名的後綴,這樣就更容易閱讀,我們在編程中,也可以這麼來體現。
java內部有默認的異常處理機制。如果沒有被處理,jvm就啓動默認處理機制,這種機制會讓程序停止執行。等等。
2、//異常的處理:
java提供了特有的語句進行處理:格式是固定的(一共是三部分。)
try
{
需要被檢測的代碼;(用來檢測容易出錯的代碼塊)(檢測的功能)
}
catch(異常類 變量)
{
處理異常的代碼;(處理方式)
}
finally
(
一定會執行的語句;
)
由三部分代碼快組成。
3、對捕獲到的異常對象進行常見方法操作,
String get message()獲取異常的信息。
tostring 表示異常名稱,異常信息。
printstacktrace 異常名稱,異常信息,異常出現的位置。
其實jvm默認的異常處理機制就是在調用printstacktrace方法打印異常在堆棧中的跟蹤信息。
4、在函數後面用throws 關鍵字後面輸入Exception,表示在功能上通過throws的關鍵字聲明瞭該功能有可能會出現問題。——這是一種聲明。
其實我們一般不往外拋,是有情況的。
碰到可能有問題的方法是,就要預先給出問題的處理方式。
//對多異常的處理:
定義功能的時候,有可能會發生不只一個問題,那麼我們要在函數上要聲明的問題就不止一個問題了。
一般聲明的特點就是你聲明的越具體,我就處理的越具體,我們一般不會採用這種用exception來做聲明的對象的。你聲明瞭多個具體,我就處理多個具體。
在函數上聲明異常,便於提高安全性,讓調用者進行處理,不處理則編譯失敗。
1、聲明異常時,建議聲明更爲具體的異常,這樣處理的可以更具體。你拋個父類,我不知道發生什麼事情,只知發生事情了,不能採取針對性的處理方式。
函數當中,只要有異常發生,這個函數就停止結束了,不再進行下面的運算了。
catch裏面要有與之匹
配的處理。
2、對方聲明幾個異常,就對應有幾個catch塊,要進行針對性處理,不要定義多餘的catch塊。如果多個catch塊中的異常出現繼承關係,父類異常catch快放在最下面。
建議在進行catch處理時,catch中一定要定義具體的處理方式。不要簡單的定義一句
e.printstacktrace(),也不要簡單的就書寫一條輸出語句。
異常日誌文件。
//自定義異常
對本項目當中的特有問題也進行對象封裝。
因爲項目中會出現一些特有的問題,而這些問題並未被java所描述並封裝對象,所以對於這些特有的問題可以按照java的對問題封裝的思想,將特有的問題,進行自定義的異常封裝。
需求:在本程序中,對於除數爲負數,也視爲是錯誤的,是無法進行運算的。那麼就需要對這個問題進行自定義的描述。
當在函數內部出現了throw拋出異常對象,那麼就必須給出對應的處理動作,要麼在內部進行try catch處理,要麼在函數上聲明讓調用者處理。
一般情況下,函數內出現異常,函數上需要聲明。
發現打印的結果中只有異常的名稱,卻沒有異常的信息,因爲自定義的異常並未定義信息。
如何定義異常信息呢?
因爲父類中已經把異常信息的操作已經都完成了,所以子類只要在構造時,將異常信息傳遞給父類通過super語句,那麼就可以直接通過getmessage方法獲取自定義的異常信息了
自定義異常:
必須是自定義類繼承exception。
因爲異常體系有一個特點,即異常類和異常對象都可以被拋出。他們都具備可拋性,這個可拋性是throwable這個體系中的獨有特點。只有這個體系中的類和對象纔可以被throws和throw操作。
throw與throws的區別
throws使用在函數上,throw使用在函數內,
throws後面的跟的異常類,可以跟多個,用逗號隔開。throw後跟的是異常對象。
//RuntimeException
Exception中有一個特殊的子類異常RuntimeException運行時異常。
如果在函數內容拋出該異常,函數上可以不用聲明,編譯一樣通過。
如果在函數上聲明瞭該異常,調用者可以不用進行處理,編譯一樣通過;
之所以不用在函數聲明,是因爲不需要讓調用者處理。
當該異常發生,希望程序停止,因爲在運行時,出現了無法繼續運算的情況,希望停止程序後,對代碼進行修正。
自定義異常時,如果該異常的發生,無法在繼續進行運算,就讓自定義異常繼承RuntimeException。
對於異常通常分兩種:
1、 編譯時被檢測的異常,
2、編譯時不被檢測的異常,(運行時異常,RuntimeException以及其子類)