一、訪問修飾符
訪問修飾符:public protected default private
public protected default private
同一個類中 ok ok ok ok
同一個包中 ok ok ok
子父類 ok ok
不同包中 ok
二、靜態(static)
1、靜態修飾的內容有成員變量和函數。當對象中出現共享數據時,該數據被靜態所修飾。
對象中的特有數據要定義成非靜態存在於堆內存中。
2、 當成員被靜態修飾後,就多了一個調用方式,除了可以被對象調用外,還可以直接被類名調用。
類名.靜態成員。
3、 static特點:
1,隨着類的加載而加載。
也就說:靜態會隨着類的消失而消失。說明它的生命週期最長。
2,優先於的對象存在
靜態是先存在。對象是後存在的。
3,被所有對象所共享
4,可以直接被類名所調用。
4、 實例變量和類變量(靜態變量)的區別:
1,存放位置。
類變量隨着類的加載而存在於方法區中。
實例變量隨着對象的建立而存在於堆內存中。
2,生命週期:
類變量生命週期最長,隨着類的消失而消失。
實例變量生命週期隨着對象的消失而消失。
5、靜態使用注意事項:
1,靜態方法只能訪問靜態成員。
非靜態方法既可以訪問靜態也可以訪問非靜態。
2,靜態方法中不可以定義this,super關鍵字。
因爲靜態優先於對象存在。所以靜態方法中不可以出現this。
3,主函數是靜態的。
6、靜態有利有弊
利處:對對象的共享數據進行單獨空間的存儲,節省空間。沒有必要每一個對象中都存儲一份。
可以直接被類名調用。
弊端:生命週期過長。
訪問出現侷限性。(靜態雖好,只能訪問靜態。)
7、靜態代碼塊。
格式:
static{
靜態代碼塊中的執行語句。
}
特點:隨着類的加載而執行,只執行一次,並優先於主函數。用於給類進行初始化的。
三、內部類
當描述事物時,事物的內部還有事物,該事物用內部類來描述。因爲內部事務在使用外部事物的內容。
1、內部類的訪問規則:
1,內部類可以直接訪問外部類中的成員,包括私有。之所以可以直接訪問外部類中的成員,是因爲內
部類中持有了一個外部類的引用,格式 外部類名.this
2,外部類要訪問內部類,必須建立內部類對象。
2、訪問格式:
1,當內部類定義在外部類的成員位置上,而且非私有,可以在外部其他類中。
可以直接建立內部類對象。
格式
外部類名.內部類名 變量名 = 外部類對象.內部類對象;
Outer.Inner in = new Outer().new Inner();
2,當內部類在成員位置上,就可以被成員修飾符所修飾。
比如,private:將內部類在外部類中進行封裝。
static:內部類就具備static的特性。
當內部類被static修飾後,只能直接訪問外部類中的static成員。出現了訪問侷限。
在外部其他類中,如何直接訪問static內部類的非靜態成員呢?
new Outer.Inner().function();
在外部其他類中,如何直接訪問static內部類的靜態成員呢?
uter.Inner.function();
注意:當內部類中定義了靜態成員,該內部類必須是static的。
當外部類中的靜態方法訪問內部類時,內部類也必須是static的。
當描述事物時,事物的內部還有事物,該事物用內部類來描述。因爲內部事物在使用外部事務的內容。
局部內部類不能定義靜態成員非靜態,沒對象不運行。
3、內部類定義在局部時,
1,不可以被成員修飾符修飾
2,可以直接訪問外部類中的成員,因爲還持有外部類中的引用。
但是不可以訪問它所在的局部中的變量。只能訪問被final修飾的局部變量。
4、匿名內部類:
1,匿名內部類其實就是內部類的簡寫格式。
2,定義匿名內部類的前提:
內部類必須是繼承一個類或者實現接口。
3,匿名內部類的格式: new 父類或者接口(){定義子類的內容}
4,其實匿名內部類就是一個匿名子類對象。而且這個對象有點胖。 可以理解爲帶內容的對象。
5,匿名內部類中定義的方法最好不要超過3個。
黑馬程序員_異常_學習筆記
---------------------- android培訓、java培訓、期待與您交流! ----------------------
異常:就是程序在運行時出現不正常情況。
異常由來:問題也是現實生活中具體的事物,也可以通過java類的形式
描述,封裝成對象。 其實就是java對不正常情況描述後的對象
體現。
對於問題的劃分:一種是嚴重的問題,一種是非嚴重的問題
對於嚴重的,java通過Error類進行描述。
對於Error,一般不編寫針對性的代碼對其進行處理。
對於非嚴重的,java通過Exception類進行描述。
對於Exception可以使用針對性的處理方式進行處理。
無論Error或者Exception都具有一些共性內容。
比如:不正常情況的信息,引發原因等。
抽取出的父類:Throwable
---Error
---Exception
1,異常的處理:
java提供了特有的語句(可不全寫)進行處理
try
{
需要被檢測的代碼
}
catch(異常類 變量)
{
處理異常的代碼;(處理方式)
}
finally
{
一定會執行的語句;
}
2,對捕獲到的異常對象進行常見方法操作。
String getMessage();
------------------------------------------------------
throws Exception:在功能上通過throws的關鍵字聲明瞭該功能有可能
出現問題。
------------------------------------------------
對多異常的處理。
1,聲明異常時,建議聲明更爲具體的異常,這樣可以處理得更具體。
2,對方聲明幾具異常,就對應有幾個catch塊。
如果多個catch塊中的異常出現繼承關係,父類異常catch塊放在最
下面。不要定義多於的catch塊。
在進行catch處理時,catch中一定要定義具體處理方式。
不要簡單定義一句 e.printStackTrace(),
也不要簡單的就書寫一條輸出語句。
PS:java爲了增強閱讀性,把父類名作爲子類後綴名
函數中只要有異常發生,則程序立即結束,所以異常一次只能處理一個
因爲項目中會出現特有的問題,
而這些問題並未被java所描述並封裝對象。
所以對於這些特有的問題可以按照java的對問題封裝的思想,將特有的
問題進行自定義的異常封裝。
---------------------------------
自定義異常。
需求:在本程序中,對於除數是負,也視爲是錯誤的是無法進行運算的。
那麼,就需要對這個問題進行自定義描述。
當在函數內部出現了throw拋出異常對象,就必須要給對應的處理動作。
要麼在內部try catch處理
要麼在函數上聲明讓調用者處理。
一般情況下,函數內出現異常,函數上需要聲明。
發現打印的結果中只有異常的名稱,卻沒有異常的信息。是因爲自定義
異常並未定義信息。
@@@@@@@@@@@@@@@@@@
如何定義異常信息呢?
因爲父類中已經把異常信息的操作都完成了。
所以子類只要在構造時,將異常信息傳遞給父類通過super語句
即可。這樣就可以直接通過getMessage方法獲取自定義的異常信息。
自定義異常:
必須是自定義類繼承Exception.
繼承Exception的原因:
異常體系有一個特點,因爲異常類和異常對象都被拋出。
他們都具備可拋性,這個可拋性是Throwable體系中獨有的特點。
只有這個體系中的類和對象纔可以被throws和throw操作。
---------------------------
throw 和 throws 的區別:
1,throws使用在函數上(函數名後)。
2,throw使用在函數內(看09ExceptioDemo)。
throw 後跟的是異常對象。
throws 後面跟的異常類(名),可以跟多個,用逗號隔開。
------------------------------
------------------------------
Exception 中有一個特殊的子類異常RuntimeException 運行時異常。
如果在函數內容中拋出該異常,函數上可以不用聲明,編譯一樣
通過。
如果在函數上聲明瞭該異常,調用都可以不用進行處理,編譯
一樣通過。
之所以不用在函數上聲明,是因爲不需要讓調用者處理。
當該異常發生,希望程序停止,因爲在運行時,出現了無法繼續
運算的情況,希望停止程序上,對代碼進行修正。
____________________________________________
自定義異常時,如果該異常發生時,無法再繼續進行運算,就讓自定義
異常繼承RuntimeException
對於異常分兩種:
1,編譯時被檢測的異常。
2,編譯時不被檢測的異常(運行時異常,RuntimeException以及
其子類)
例子:畢老師用電腦上課
開始思考上課中出現的問題
比如:電腦藍屏,電腦冒煙
要對問題進行描述,封裝成對象。
當冒煙發生後,出現講課進度無法繼續。
出現了講師的問題:課時計劃無法完成。
PS:throw出現時,下面不能再寫語句,因爲拋出時,程序就結束
--------------------------------------------------------------
自定義異常練習程序:
class LanPingException extends Exception
{
LanPingException(String message)
{
super(message);
}
}
class MaoYanException extends Exception
{
MaoYanException(String message)
{
super(message);
}
}
class NoPlanException extends Exception
{
NoPlanException(String msg)
{
super(msg);
}
}
//---------------------------------
class Computer
{
private int state = 3;
public void run() throws LanPingException,MaoYanException
{
if(state==2)
throw new LanPingException("藍屏了");
if(state==3)
throw new MaoYanException("冒煙了");
System.out.println("電腦運行");
}
public void reset()
{
System.out.println("電腦重啓");
}
}
//--------------------------------
class Teacher
{
private String name;
private Computer cmpt;
Teacher(String name)
{
this.name = name;
cmpt = new Computer();
}
public void prelect() throws NoPlanException
{
try
{
cmpt.run();
}
catch (LanPingException e)
{//處理
cmpt.reset();
}
catch (MaoYanException e)
{
test();
throw new NoPlanException("課時無法繼續"+e.getMessage());
}
System.out.println("講課");
}
public void test()
{
System.out.println("練習");
}
}
//------------------------------------------
class ExceptionTest
{
public static void main(String[] args)
{
Teacher t = new Teacher("畢老師");
try
{
t.prelect();
}
catch (NoPlanException e)
{
System.out.println(e.toString());
System.out.println("換老師,或者放假!");
}
}
}
----------------------
android培訓、java培訓、期待與您交流! ----------------------