黑馬程序員——java第九、十天:面向對象(內部類、異常和包)

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

內部類(嵌套類、內置類)

一、內部類的訪問規則:

1,內部類可以直接訪問外部類中的成員,包括私有。

         之所以可以直接訪問外部類中的成員,是因爲內部類中持有了一個外部類的引用,格式外部類名.this

2,外部類要訪問內部類,必須建立內部類對象。

class Outer

{

         privateint x = 3;

         classInner//內部類

         {

                   //intx = 4;

                   voidfunction()

                   {

                            //intx = 6;

                            System.out.println("innner:"+Outer.this.x);

                   }

         }

         voidmethod()

         {

                   Innerin = new Inner();

                   in.function();

         }

}

class InnerClassDemo

{

         publicstatic void main(String[] args) 

         {

                   Outerout = new Outer();

                   out.method();

                   //直接訪問內部類中的成員。

//               Outer.Innerin = new Outer().new Inner();

//               in.function();

         }

}


 

 

二、訪問格式:

1,當內部類定義在外部類的成員位置上,而且非私有,可以在外部其他類中。

可以直接建立內部類對象。

格式

         外部類名.內部類名  變量名 = 外部類對象.內部類對象;

         Outer.Innerin = new Outer().new Inner();

 

2,當內部類在成員位置上,就可以被成員修飾符所修飾。

         比如,private:將內部類在外部類中進行封裝。

                   static:內部類就具備static的特性。

                   當內部類被static修飾後,只能直接訪問外部類中的static成員。出現了訪問侷限。

 

                   在外部其他類中,如何直接訪問static內部類的非靜態成員呢?

                   newOuter.Inner().function();

 

                   在外部其他類中,如何直接訪問static內部類的靜態成員呢?

                   uter.Inner.function();

 

         注意:當內部類中定義了靜態成員,該內部類必須是static的。

                     當外部類中的靜態方法訪問內部類時,內部類也必須是static的。

 

 

 

        

當描述事物時,事物的內部還有事物,該事物用內部類來描述。

因爲內部事務在使用外部事物的內容。

 

class Body

{

         privateclass XinZang

         {

 

         }

 

         publicvoid show()

         {

                   newXinZang().

         }

         

}

 

*/

class Outer

{

         privatestatic  int x = 3;

 

         

         staticclass Inner//靜態內部類

         {

                   staticvoid function()

                   {

                            System.out.println("innner:"+x);

                   }

         }

 

         staticclass Inner2

         {

                   voidshow()

                   {

                            System.out.println("inner2show");

                   }

         }

 

         publicstatic void method()

         {

                   //Inner.function();

                   newInner2().show();

         }

 

}

 

 

class InnerClassDemo2

{

         publicstatic void main(String[] args) 

         {

                   Outer.method();

                   //Outer.Inner.function();

                   //newOuter.Inner().function();

                   //直接訪問內部類中的成員。

//               Outer.Innerin = new Outer().new Inner();

//               in.function();

         }

}

 



三、

內部類定義在局部時,

1,不可以被成員修飾符修飾

2,可以直接訪問外部類中的成員,因爲還持有外部類中的引用。

         但是不可以訪問它所在的局部中的變量。只能訪問被final修飾的局部變量。

class Outer

{

         intx = 3;

         voidmethod(final int a)

         {

                   finalint y = 4;

                   classInner

                   {

                            voidfunction()

                            {

                                     System.out.println(y);

                            }

                   }

                   newInner().function();    

         }

}

class InnerClassDemo3

{

         publicstatic void main(String[] args) 

         {

                   Outerout = new Outer();

                   out.method(7);

                   out.method(8);

         }

}


 

 

四、在內部類中:內部類局部變量訪問有x、內部類成員變量訪問用this.x、外部類成員變量訪問用外部類.this.x

五、匿名內部類:

1,匿名內部類其實就是內部類的簡寫格式。

2,定義匿名內部類的前提:

         內部類必須是繼承一個類或者實現接口。

3,匿名內部類的格式:  new 父類或者接口(){定義子類的內容}

4,其實匿名內部類就是一個匿名子類對象。而且這個對象有點胖。  可以理解爲帶內容的對象。

5,匿名內部類中定義的方法最好不要超過3個。

 

abstract class AbsDemo

{

         abstractvoid show();

         

}

 

 

class Outer

{

         intx = 3;

 

         /*

         classInner extends AbsDemo

         {

                   intnum = 90;

                   voidshow()

                   {

                            System.out.println("show:"+num);

                   }

                   voidabc()

                   {

                            System.out.println("hehe");

                   }

         }

         */

 

         publicvoid function()

         {

                   //AbsDemoa = new Inner();

//               Innerin = new Inner();

//               in.show();

//               in.abc();

         

 

                   AbsDemod = new AbsDemo()

                   {

                            intnum = 9;

                            voidshow()

                            {

                                     System.out.println("num==="+num);

                            }

                            voidabc()

                            {

                                     System.out.println("haha");

                            }

                   };

 

                   d.show();

                   //d.abc();//編譯失敗;

 

                   

 

 

 

         }

}

 

 

 

class InnerClassDemo4 

{

         publicstatic void main(String[] args) 

         {

                   newOuter().function();

         }

}


 

 

異常

對於問題的劃分:兩種:一種是嚴重的問題,一種非嚴重的問題。

 

對於嚴重的,java通過Error類進行描述。

         對於Error一般不編寫針對性的代碼對其進行處理。

 

對與非嚴重的,java通過Exception類進行描述。

         對於Exception可以使用針對性的處理方式進行處理。

 

無論Error或者Exception都具有一些共性內容。

比如:不正常情況的信息,引發原因等。

 

Throwable

         |--Error

         |--Exception

 

2,異常的處理

 

java 提供了特有的語句進行處理。

try

{

         需要被檢測的代碼;

}

catch(異常類變量)

{

         處理異常的代碼;(處理方式)

}

finally

{

         一定會執行的語句;

}

 

3,對捕獲到的異常對象進行常見方法操作。

         StringgetMessage():獲取異常信息。

*/

 

class Demo

{

         intdiv(int a,int b)throws Exception//在功能上通過throws的關鍵字聲明瞭該功能有可能會出現問題。

         {

                   returna/b;

         }

}

 

 

class ExceptionDemo

{

         publicstatic void main(String[] args) 

         {

                   Demod = new Demo();

                   try

                   {

                            intx = d.div(4,1);

                            System.out.println("x="+x);

                   }

                   catch(Exception e)//Exception e = new ArithmeticException();

                   {

                            System.out.println("除零啦");

                            System.out.println(e.getMessage());//  / by zero;

                            System.out.println(e.toString());//異常名稱:異常信息。

 

                            e.printStackTrace();//異常名稱,異常信息,異常出現的位置。

                                                                 //其實jvm默認的異常處理機制,就是在調用printStackTrace方法。

                                                                 //打印異常的堆棧的跟蹤信息。

 

 

                   }                 

                   

 

                   System.out.println("over");

 

         }

}


 

 

對多異常的處理。

 

1,聲明異常時,建議聲明更爲具體的異常。這樣處理的可以更具體。

2,對方聲明幾個異常,就對應有幾個catch塊。不要定義多餘的catch塊。

         如果多個catch塊中的異常出現繼承關係,父類異常catch塊放在最下面。

 

 

建立在進行catch處理時,catch中一定要定義具體處理方式。

不要簡單定義一句 e.printStackTrace(),

也不要簡單的就書寫一條輸出語句。

 

*/

 

class Demo

{

         intdiv(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException//在功能上通過throws的關鍵字聲明瞭該功能有可能會出現問題。

         {

 

                   int[]arr = new int[a];

 

                   System.out.println(arr[4]);

 

                   returna/b;

         }

}

 

 

class ExceptionDemo2

{

         publicstatic void main(String[] args) //throws Exception

         {

                   Demod = new Demo();

                   try

                   {

                            intx = d.div(5,0);

                            System.out.println("x="+x);

                   }

                   

                   catch(Exceptione)

                   {

                            System.out.println("hahah:"+e.toString());

                   }

                  catch (ArithmeticException e)

                   {

                            System.out.println(e.toString());

                            System.out.println("被零除了!!");

 

                   }

                   catch(ArrayIndexOutOfBoundsException e)

                   {

                            System.out.println(e.toString());

                            System.out.println("角標越界啦!!");

                   }

                   

                   /**/

                   

 

                   System.out.println("over");

 

         }

}


 

 

因爲項目中會出現特有的問題,

而這些問題並未被java所描述並封裝對象。

所以對於這些特有的問題可以按照java的對問題封裝的思想。

將特有的問題。進行自定義的異常封裝。

 

自定義異常。

 

需求:在本程序中,對於除數是-1,也視爲是錯誤的是無法進行運算的。

那麼就需要對這個問題進行自定義的描述。

 

當在函數內部出現了throw拋出異常對象,那麼就必須要給對應的處理動作。

要麼在內部try catch處理。

要麼在函數上聲明讓調用者處理。

 

一般情況在,函數內出現異常,函數上需要聲明。

 

 

發現打印的結果中只有異常的名稱,卻沒有異常的信息。

因爲自定義的異常並未定義信息。

 

如何定義異常信息呢?

因爲父類中已經把異常信息的操作都完成了。

所以子類只要在構造時,將異常信息傳遞給父類通過super語句。

那麼就可以直接通過getMessage方法獲取自定義的異常信息。

 

 

 

自定義異常:

必須是自定義類繼承Exception

 

 

繼承Exception原因:

異常體系有一個特點:因爲異常類和異常對象都被拋出。

他們都具備可拋性。這個可拋性是Throwable這個體系中獨有特點。

 

只有這個體系中的類和對象纔可以被throwsthrow操作。

 

 

throwsthrow的區別

throws使用在函數上。

throw使用在函數內。

 

throws後面跟的異常類。可以跟多個。用逗號隔開。

throw後跟的是異常對象。

 

 

 

*/

class FuShuException extends Exception//getMessage();

{

         privateint value;

 

         FuShuException()

         {

                   super();

         }

         FuShuException(Stringmsg,int value)

         {

                   super(msg);

                   this.value= value;

         }

 

         publicint getValue()

         {

                   returnvalue;

         }

 

}

 

 

 

class Demo

{

         intdiv(int a,int b)throws FuShuException

         {

                   if(b<0)

                            thrownew FuShuException("出現了除數是負數的情況------ / by fushu",b);//手動通過throw關鍵字拋出一個自定義異常對象。

 

                   returna/b;

         }

}

 

 

class ExceptionDemo3

{

         publicstatic void main(String[] args) 

         {

                   Demod = new Demo();

                   try

                   {

                            intx = d.div(4,-9);

                            System.out.println("x="+x);              

                   }

                   catch(FuShuException e)

                   {

                            System.out.println(e.toString());

                            //System.out.println("除數出現負數了");

                            System.out.println("錯誤的負數是:"+e.getValue());

                   }

                   

                   

 

                   System.out.println("over");

 

         }

}


 

 

 

/*

class Throwable

{

         privateString message;

         Throwable(Stringmessage)

         {

                   this.message= message;

         }

 

         publicString getMessage()

         {

                   returnmessage;

         }

}

 

class Exception extends Throwable

{

         Exception(Stringmessage)

         {

                   super(message);

         }

}

 

 

class Person

{

         Stringname;

         Person(Stringname)

         {

                   this.name= name;

         }

         publicString getName()

         {

                   returnname;

                   }

}

 

class Student extends Person

{

         Student(String name)

         {

                   super(name);

         }

}

 

new Sttdent("lisi").getName();

 

 

 

/*


 

 

Exceptoin中有一個特殊的子類異常RuntimeException運行時異常。

 

如果在函數內容拋出該異常,函數上可以不用聲明,編譯一樣通過。

 

如果在函數上聲明瞭該異常。調用者可以不用進行處理。編譯一樣通過;

 

之所以不用在函數聲明,是因爲不需要讓調用者處理。

當該異常發生,希望程序停止。因爲在運行時,出現了無法繼續運算的情況,希望停止程序後,

對代碼進行修正。

 

 

 

 

自定義異常時:如果該異常的發生,無法在繼續進行運算,

就讓自定義異常繼承RuntimeException

 

 

對於異常分兩種:

1,編譯時被檢測的異常。

        

2,編譯時不被檢測的異常(運行時異常。RuntimeException以及其子類)

 

*/

 

class FuShuException extendsRuntimeException

{

         FuShuException(Stringmsg)

         {

                   super(msg);

         }

}

class Demo

{

         intdiv(int a,int b)throws Exception//throws ArithmeticException

         {

                   

                   if(b<0)

                            thrownew Exception("出現了除數爲負數了");

                   if(b==0)

                            thrownew ArithmeticException("被零除啦");

                   returna/b;

         }

}

 

class ExceptionDemo4 

{

         publicstatic void main(String[] args) 

         {

                   

                   Demod = new Demo();

                   

                   intx = d.div(4,-9);

                   System.out.println("x="+x);              

                   

                   System.out.println("over");

         }

}

 

/*

class Person

{

         publicvoid checkName(String name)

         {

                   

                   //if(name.equals("lisi"))//NullPointerException

                   if("lisi".equals(name))//if(name!=null&& name.equals("lisi"))

                            System.out.println("YES");

                   else

                            System.out.println("no");

         }

}

 

main()

{

         Personp = new Person();

         p.checkName(null);

}

*/


 

 

 

異常:

是什麼?是對問題的描述。將問題進行對象的封裝。

------------

異常體系:

         Throwable

                   |--Error

                   |--Exception

                            |--RuntimeException

 

異常體系的特點:異常體系中的所有類以及建立的對象都具備可拋性。

                                     也就是說可以被throwthrows關鍵字所操作。

                                     只有異常體系具備這個特點。

 

 

--------------

throwthrows的用法:

 

throw定義在函數內,用於拋出異常對象。

throws定義在函數上,用於拋出異常類,可以拋出多個用逗號隔開。

 

 

當函數內容有throw拋出異常對象,並未進行try處理。必須要在函數上聲明,都在編譯失敗。

注意,RuntimeException除外。也就說,函數內如果拋出的RuntimeExcpetion異常,函數上可以不用聲明。

--------------

 

 

如果函數聲明瞭異常,調用者需要進行處理。處理方法可以throws可以try

 

異常有兩種:

         編譯時被檢測異常

                   該異常在編譯時,如果沒有處理(沒有拋也沒有try),編譯失敗。

                   該異常被標識,代表這可以被處理。

         運行時異常(編譯時不檢測)

                   在編譯時,不需要處理,編譯器不檢查。

                   該異常的發生,建議不處理,讓程序停止。需要對代碼進行修正。

 

 

 

--------------

異常處理語句:

try

{

         需要被檢測的代碼;

}

catch ()

{

         處理異常的代碼;

}

finally

{

         一定會執行的代碼;

}

 

有三個結合格式:

1.      try

         {

                  

         }

         catch()

         {

         }

 

2.      try

         {

                  

         }

         finally

         {

        

         }

 

 

3.      try

         {

                  

         }

         catch()

         {

         }

         finally

         {

        

         }

 

 

 

注意:

1finally中定義的通常是關閉資源代碼。因爲資源必須釋放。

2finally只有一種情況不會執行。當執行到System.exit(0);fianlly不會執行。

 

--------------

 

自定義異常:

         定義類繼承Exception或者RuntimeException

         1,爲了讓該自定義類具備可拋性。

         2,讓該類具備操作異常的共性方法。

 

         當要定義自定義異常的信息時,可以使用父類已經定義好的功能。

         異常異常信息傳遞給父類的構造函數。

         classMyException extends Exception

         {

                   MyException(Stringmessage)

                   {

                            super(message);

                   }

         }

 

自定義異常:按照java的面向對象思想,將程序中出現的特有問題進行封裝。

--------------

 

 

異常的好處:

         1,將問題進行封裝。

         2,將正常流程代碼和問題處理代碼相分離,方便於閱讀。

 

 

異常的處理原則:

         1,處理方式有兩種:try 或者 throws

         2,調用到拋出異常的功能時,拋出幾個,就處理幾個。

                   一個try對應多個catch

         3,多個catch,父類的catch放到最下面。

         4catch內,需要定義針對性的處理方式。不要簡單的定義printStackTrace,輸出語句。

                   也不要不寫。

                   當捕獲到的異常,本功能處理不了時,可以繼續在catch中拋出。

                   try

                   {

                            thrownew AException();

                   }

                   catch(AException e)

                   {

                            throwe;

                   }

 

                   如果該異常處理不了,但並不屬於該功能出現的異常。

                   可以將異常轉換後,在拋出和該功能相關的異常。

 

                   或者異常可以處理,當需要將異常產生的和本功能相關的問題提供出去,

                   當調用者知道。並處理。也可以將捕獲異常處理後,轉換新的異常。

                   try

                   {

                            thrownew AException();

                   }

                   catch(AException e)

                   {

                            //AException處理。

                            thrownew BException();

                   }

 

                   比如,匯款的例子。

 

        

異常的注意事項:

         在子父類覆蓋時:

         1,子類拋出的異常必須是父類的異常的子類或者子集。

         2,如果父類或者接口沒有異常拋出時,子類覆蓋出現異常,只能try不能拋。

 

(類類型的對象在堆內存中默認值爲空(null)。)

class 

{

         publicstatic void main(String[] args)

         {

                   intx = 0;

                   try

                   {

                            x= 4;

                   }

                   catch()

                   {

                   }

                   finally

                   {

                            System.out.println("x="+x);

                   }

                  

         }

}

package

特點:對類文件分類管理。

                   給類提供多種命名空間。

                   寫在程序文件首行。

定義包格式:package pack//包名要小些;

 

javac –d file ClassName.java:把編譯出來的class文件放進去當前文件夾下file文件夾中(當然也可以寫絕對路徑c:/name/file等等放在這些包中),如果ClassName .java文件中寫package a,那麼還會在file文件夾中中創建a包並把編譯出來的文件放進去。

 

如果寫成javac –d . ClassName.java: 把編譯出來的class文件放進去當前文件夾(.代表當前),如果ClassName.java文件中寫package a,那麼還會在當前文件夾中創建a包並把編譯出來的文件放進去。

第一種:運行時要cd 進入到file文件夾下運行,運行時要用java 包名.類名;

第二種:運行時在當前文件夾下要用java 包名.類名;

注意:當出現包時類的全名就是——包名.類名。

包與包之間的訪問

包與包之間的訪問,被訪問的類和成員要有public修飾。

 

protected//保護權限。

當不在同一個包的父類和子類,子類可以訪問到父類protected修飾的成員,包與包訪問可以使用的權限只有兩種——publicprotected

 

訪問控制

private成員

缺省的成員

protected成員

public成員

同一類中成員

Ö

Ö

Ö

Ö

同一包中其他類

×

Ö

Ö

Ö

不同包中子類 

×

×

Ö

Ö

不同包中非子類 

×

×

×

Ö

 

 

 

 

 

 

 

同一個文件夾下不能存在兩個以上的公有類或接口。

如果同一個包中的兩個類都要被別的包裏的類訪問,那麼這兩個類要放在不同文件中。因爲在一個文件中不可以有兩個public修飾的類。

導入(import

importpackage*//導入package包中的是所有類。

當導入不同包中類出現重名時要用——包名.類。

定義包名不要重名,可以用url格式來寫:package cn.itcast.demo;

                                                                                     package cn.itcast.test;

導包只爲簡化類名的書寫。

jar

工具:jar.exe

例子:將Foo.class Bar.class類文件歸檔到一個名爲class.jar的歸檔文件中:

jar cvfclass.jar Foo.class Bar.class(當然包也可以歸檔)

 

jar –t class.jar:可以列出並查看class.jar下的目錄文件。其中有個配置文件目錄,其中有配置文件可以改動。

 

jar –tf a.jar >c:\2.txt:把輸出的信息寫在2.txt文件中。

 

jar –tvf a.jar只是在dos中顯示

 

例子:dir >c:\2.txt:2.txt中列出當前目錄結構。

 ------- android培訓java培訓、期待與您交流! ----------詳細請查看:http://edu.csdn.net

 

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