傳智播客自學筆記第9天(待編輯)

一、訪問修飾符

    訪問修飾符: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培訓、期待與您交流! ----------------------



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