?? java(day09).txt
字號:
Java第九天 2007年5月9日
一、復(fù)習(xí)
1、Object 所有的類直接或間接的父類
finalize:垃圾收集的時候調(diào)用
toString:返回對象的字符串形式
equals:判斷兩個對象內(nèi)容是否相同
2、包裝類
8種基本類型各自提供了對象形式
3、異常處理
提高容錯性
異常的分類:Throwable
Error :錯誤,不可避免,不可處理
Exception:Runtime:未檢查:可處理可不處理,首先應(yīng)該努力避免異常(本可避免的)
非Runtime:已檢查:必須要處理
異常對象的產(chǎn)生:throw 拋出異常,沿著方法調(diào)用鏈反向傳遞
異常處理:throws 消極,聲明拋出
try-catch 捕獲異常
try-catch-finally
try-finally
方法覆蓋 :子類覆蓋方法不能比父類被覆蓋方法拋出更多的,范圍更寬的異常
4、自定義異常
二、斷言
在JDK1.4之后開始出現(xiàn),是一個調(diào)試工具
其后跟的是布爾類型的表達(dá)式,如果表達(dá)式結(jié)果為真不影響程序運行。如果為假系統(tǒng)出現(xiàn)低級錯誤(Error),在屏幕上出現(xiàn)assert信息。
assert a%2==0;
編譯器的默認(rèn)設(shè)置:把斷言語句忽律
javac -source 1.4 源文件名 //表示用1.4新特性編譯
java -enableassert(-ea) 類名 //打開斷言功能
assert a%2==0:"a必須是偶數(shù)"; //出現(xiàn)錯誤時的提示信息
assert只是用于調(diào)試。在產(chǎn)品編譯完成后上線assert代碼就被刪除了。
三、內(nèi)部類
內(nèi)部類也就是定義在類內(nèi)部的類。是編譯時語法。
內(nèi)部類的分類:
成員內(nèi)部類、
局部內(nèi)部類、
靜態(tài)內(nèi)部類、
匿名內(nèi)部類(圖形監(jiān)聽時要用到,要掌握)。
1、成員內(nèi)部類
四個訪問權(quán)限修飾符都可以修飾成員內(nèi)部類。
內(nèi)部類和外部類在編譯時是不同的兩個類,內(nèi)部類對外部類沒有任何依賴。
內(nèi)部類是一種編譯時語法,在編譯時生成的各自的字節(jié)碼文件(Outer.class和Outer$Inner.class),內(nèi)部類和外部類沒有關(guān)系。
內(nèi)部類中可以訪問外部類的私有成員。(與C++的友員相比,不破壞封裝)
作為外部類的一個成員存在,與外部類的屬性、方法并列。
內(nèi)部類和外部類的實例變量可以共存。
在內(nèi)部類中訪問實例變量:this.屬性
在內(nèi)部類訪問外部類的實例變量:外部類名.this.屬性。
在外部類的外部訪問內(nèi)部類,使用out.inner.
成員內(nèi)部類的特點:
(1)內(nèi)部類作為外部類的成員,可以訪問外部類的私有成員或?qū)傩浴#词箤⑼獠款惵暶鳛閜rivate,但是對于處于其內(nèi)部的內(nèi)部類還是可見的。)
(2)用內(nèi)部類定義在外部類中不可訪問的屬性。這樣就在外部類中實現(xiàn)了比外部類的private還要小的訪問權(quán)限。
注意:內(nèi)部類是一個編譯時的概念,一旦編譯成功,就會成為完全不同的兩類。
對于一個名為outer的外部類和其內(nèi)部定義的名為inner的內(nèi)部類。編譯完成后出現(xiàn)outer.class和outer$inner.class兩類。
(3)成員內(nèi)部類不能含有靜態(tài)成員。***
建立內(nèi)部類對象時應(yīng)注意:
在外部類的內(nèi)部可以直接使用inner s=new inner();(因為外部類知道inner是哪個類,所以可以生成對象。)
而在外部類的外部,要生成(new)一個內(nèi)部類對象,需要首先建立一個外部類對象(外部類可用),然后在生成一個內(nèi)部類對象。內(nèi)部類的類名是外部類類名.內(nèi)部類類名。
Outer o=new Outer();
Outer.Inner in=o.new.Inner()。
2、靜態(tài)內(nèi)部類
(注意:前三種內(nèi)部類與變量類似,所以可以對照參考變量)
靜態(tài)內(nèi)部類定義在類中,任何方法外,用static class定義。
靜態(tài)內(nèi)部類只能訪問外部類的靜態(tài)成員。
生成(new)一個靜態(tài)內(nèi)部類對象不需要外部類對象:這是靜態(tài)內(nèi)部類和成員內(nèi)部類的區(qū)別。
靜態(tài)內(nèi)部類的對象可以直接生成:
Outer.Inner in=new Outer.Inner();
而不需要通過生成外部類對象來生成。這樣實際上使靜態(tài)內(nèi)部類成為了一個頂級類。
靜態(tài)內(nèi)部類不可用private來進(jìn)行定義。
3、局部內(nèi)部類
在方法中定義的內(nèi)部類稱為局部內(nèi)部類。
與局部變量類似,在局部內(nèi)部類前不加修飾符public和private,其范圍為定義它的代碼塊。
注意:
局部內(nèi)部類不僅可以訪問外部類私有實例變量,還可以訪問外部類的局部常量(也就是局部變量必須為final的)
在類外不可直接訪問局部內(nèi)部類(保證局部內(nèi)部類對外是不可見的)。
在方法中才能調(diào)用其局部內(nèi)部類。
通過內(nèi)部類和接口達(dá)到一個強制的弱耦合,用局部內(nèi)部類來實現(xiàn)接口,并在方法中返回接口類型,使局部內(nèi)部類不可見,屏蔽實現(xiàn)類的可見性。
4、匿名內(nèi)部類
匿名內(nèi)部類是一種特殊的局部內(nèi)部類,它是通過匿名類實現(xiàn)接口,并只創(chuàng)建一次。
匿名內(nèi)部類的特點:
(1)一個類用于繼承其他類或是實現(xiàn)接口,并不需要增加額外的方法,只是對繼承方法的事先或是覆蓋。
(2)只是為了獲得一個對象實例,不許要知道其實際類型。
(3)類名沒有意義,也就是不需要使用到。
注:一個匿名內(nèi)部類一定是在new的后面,用其隱含實現(xiàn)一個接口或?qū)崿F(xiàn)一個類,沒有類名,根據(jù)多態(tài),我們使用其父類名。
因其為局部內(nèi)部類,那么局部內(nèi)部類的所有限制都對其生效。
匿名內(nèi)部類是唯一一種無構(gòu)造方法類。
大部分匿名內(nèi)部類是用于接口回調(diào)用的。
匿名內(nèi)部類在編譯的時候由系統(tǒng)自動起名Out$1.class。
如果一個對象編譯時的類型是接口,那么其運行的類型為實現(xiàn)這個接口的類。
因匿名內(nèi)部類無構(gòu)造方法,所以其使用范圍非常的有限。
當(dāng)需要多個對象時使用局部內(nèi)部類,因此局部內(nèi)部類的應(yīng)用相對比較多。匿名內(nèi)部類中不能定義構(gòu)造方法。
匿名內(nèi)部類的寫法:
interface A{
void ia();
}
class B{
public A bc(){
return new A(){ //匿名類實現(xiàn)了A接口
void ia(){……}
};
}
}
使用匿名內(nèi)部類:
B b=new B();
A a=b.bc();
a.ia();
注意:當(dāng)類與接口(或者是接口與接口)發(fā)生方法命名沖突的時候,此時必須使用內(nèi)部類來實現(xiàn)。
用接口不能完全地實現(xiàn)多繼承,用接口配合內(nèi)部類才能實現(xiàn)真正的多繼承。
對于兩個類,擁有相同的方法:
class People
{
run();
}
interface Machine{
run();
}
此時有一個robot類:
class Robot extends People implement Machine.
名為run()的方法有2個,不可直接實現(xiàn)。
interface Machine{
void run();
}
class Person{
void run(){System.out.println("run");}
}
class Robot extends People{
class Heart implements Machine{
public void run(){
System.out.println("發(fā)動機運行");
}
}
public Machine getHeart(){
return new Heart();
}
public void run(){
System.out.println("機器人跑");
}
}
public class Test{
public static void main(String[] args){
Robot r=new Robot();
r.run();
r.getHeart().run();
}
}
練習(xí):把前面石頭剪刀布的游戲改寫為:采用匿名內(nèi)部類來實現(xiàn)接口,并獲得對象去調(diào)用match方法
四、集合
集合(集合類的對象)是用來管理其他若干對象的。
集合中保存的是對象的引用,數(shù)組是最基本的集合
集合框架
1,接口
集合中用到的類,接口在java.util包中,在使用時注意將其引入import。
Collection 用來管理多個對象,集合中的每個元素都是對象。
1)List 一個List的實現(xiàn)類的對象在管理多個對象時會按順序組織對象(即按照將對象放入的順序存儲)
List實現(xiàn)類的對象是有順序的,List實現(xiàn)類對象中的內(nèi)容是可重復(fù)的。(注意,順序和排序的區(qū)別)
2)Set 一個Set的實現(xiàn)類表示一個數(shù)學(xué)概念上的集合,Set的實現(xiàn)類的對象中的元素是無順序的,也就是不會按照輸入順序來存放,Set的實現(xiàn)類對象中的元素是不重復(fù)的。
3)SortedSet,他是Set的子接口,他的實現(xiàn)類會對集合中的元素進(jìn)行排序。但是要指定排序規(guī)則,他會按排序規(guī)則進(jìn)行排序。
Map,Map中沒有對象,而是鍵值對,由Key,value組成的鍵值對
Key是沒有順序,不可重復(fù)的。
value是可以相同的,一個Key和一個value一一對應(yīng)。
Map 接口(以下介紹其子接口)
SortedMap,這個接口的實現(xiàn)類同樣可以實現(xiàn),不過是對鍵值對中的Key進(jìn)行排序,這個接口的實現(xiàn)類也是要指定排序規(guī)則的。
1> ArrayList是接近于功能的集合類,ArryList的實質(zhì)就是一個會自動增長的數(shù)組,ArrayList是用封裝的數(shù)組來實現(xiàn)的List接口的。
Collection的實現(xiàn)類對象的遍歷方式是用迭代來實現(xiàn)的。
在使用迭代器時先要獲得一個迭代器的對象,Iterator(迭代器接口)這是一個接口,迭代器是在集合類中實現(xiàn)的,也就是說,他是一個內(nèi)部類(匿名內(nèi)部類)實現(xiàn)的。
Iterator接口中定義的常用方法方法hasNext(),next()。
hasNext(),這個方法會使用一個游標(biāo),并通過判斷游標(biāo)指向的位置是否存放有對象。
next()方法也是Iterator接口中定義好的方法,這個方法會使游標(biāo)指向下一個元素的位置,游標(biāo)會跳過第一個元素,并返回其中的內(nèi)容。
Collections 這是一個工具類,也是java.util包中的,這個類中的sort(list接口的實現(xiàn)類的對象)方法,其參數(shù)是一個集合類的對象,這個方法使用來對集合類的對象進(jìn)行排序的。以后,我將以集合這個名字來稱呼集合類的對象。,對于字符串對象內(nèi)容的集合來說會按字典順序排序(升序),對于數(shù)字內(nèi)容的集合排序也會按照升序排序。
排序可分為兩部分內(nèi)容,一個是排序的規(guī)則,也就是按照什么來進(jìn)行排序,并且排成什么樣的順序。
第二個就是排序的算法,他決定了排序的效率。
在對自定義的集合內(nèi)容排序時,需要先定義那個類型的排序規(guī)則。
Comparable接口,這個接口中只定義了一個compareTo(Object o),方法的返回類型是整型,如果當(dāng)前對象大于參數(shù)對象就返回正數(shù),當(dāng)前對象等于參數(shù)對象是就返回0,當(dāng)前對象小于參數(shù)對象時就返回負(fù)值,這樣寫就是升序排列,反之則是進(jìn)行降序排列,在實現(xiàn)這個接口中的方法時,返回值定義方式,只有這兩種。
根據(jù)指定類型的排序規(guī)則實現(xiàn)了Comparable接口,那么就可以對存有這個類型的集合進(jìn)行整體排序。Comparable接口,也叫做可比較接口。這個接口在java.lang包下。只要實現(xiàn)了這個接口,就是可排序的。
接下來介紹另外一種對自定義類型對象的集合整體排序的方法,也就是實現(xiàn)比較器接口(Comparator),這個接口中定義了一個compare(Object o1,Object o2)方法來比較兩個對象,這個方法的返回值定義和上面介紹的那個方法是一樣。
注意:在API,幫助文檔中以上兩個方法的參數(shù)類型是T,這代表的模板類型,也就是集合中存放的內(nèi)容的類型,在JDK1.4中其參數(shù)就是Object類型,模板類型的詳細(xì)內(nèi)容會在最后的JDK5.0新特性中講到。
Comparator接口可以在匿名內(nèi)部類中實現(xiàn),Collections 中的sort(集合了的對象,比較器)方法,可以對自定義類型內(nèi)容的集合進(jìn)行整體排序。
2> LinkedList,它是List接口的實現(xiàn)類,其底層是用雙向循環(huán)鏈表來實現(xiàn)的。
注意:ArrayList的查詢效率比較高,增刪動作的效率比較差,適用于查詢比較頻繁,增刪動作較少的元素管理的集合。
LinkedList的查詢效率低,但是增刪效率很高。適用于增刪動作的比較頻繁,查詢次數(shù)較少的元素管理集合。
ArrayList,LinkedList都是線程不安全的。
實現(xiàn)堆棧 1,數(shù)組(ArrayList,增刪效率比較低,不適合)
2,LinkedList(實現(xiàn)堆棧的好方法)
3,java.util.Stack類,Stack是Vector的子類,Vector類是一個線程安全的(是一個重量級的類),并繼承了Vector的方法,Verctor類(這個類也是List接口的實現(xiàn)類)和ArrayList的功能近乎相同。(不推薦使用Stack類來實現(xiàn)堆棧)。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -