Java學習歷程-3(基於聖思園視頻教程)

 Java網絡編程
        URL類是網絡編程的入口點,所以基於網絡的編程首先創建一個URL對象,然後對象調用openConnection方法獲得一個URLConnection對象,URLConnection對象可以通過getInputStream方法獲得輸入流,然後就轉向IO編程。其實URL對象可以直接調用openStream方法獲得InputStream對象,看到源代碼中openStream方法就是調用openConnection().getInputStream而實現的,本質上都是一樣的。
        在URL類的構造器URL(String url),url字符串是有嚴格的格式的,url中的協議必須填上,這不同於瀏覽器:瀏覽器可以爲我們補上默認的協議和端口。url的格式如:"http://www.baidu.com",不能寫成:"www.baidu.com"。
InetAddress類是一個表示IP地址的類,它沒有提供public的構造方法,不能通過new的方式生成它的對象,只能通過它提供的靜態方法獲得InetAddress對象,它提供了3個常用的可以生成其對象的靜態方法:getLocalHost()、getByName(String host)、getAllByName(String host),我們一般用第二個用得比較多。InetAddress的toString方法返回字符串格式爲:The string returned is of the form: hostname / literal IP address.第一部分是主機名,通過斜線分隔IP地址。例如“www.baidu.com/65.34.25.110”、“Phoenix-PC/192.168.1.2”等。
        TCP通信主要用到ServerSocket、Socket兩個類。
        服務器端:1、創建ServerSocket對象sc,2、sc調用accept()方法準備生成Scoket對象;前兩步準備建立連接;(3、啓動讀寫線程,while循環,多線程使得服務器可以和多個客服端建立連接)
客戶端:1、創建Socket對象sc,;前一步準備建立連接;2、(啓動讀寫線程)
       UDP通信主要用到DatagramSocket、DatagramPacket類。
       服務器端:1、創建DatagramSocket對象ds,2、創建DatagramPacket對象dp1,3、dc調用send方法發送dp1,4、構造一個DatagramPacket對象dp2給receive方法用,5、ds調用receive方法接受到dp2中。
UDP通信完全沒有用到IO編程,完全基於packet。因爲UDP是無連接的,所以就沒有流,所以就沒有IO。這完全是因爲協議不同而不同。
2011/9/10
JDK5.0新特性
泛型(Generic)
        策略模式就是我們所說的面向接口編程,它最本質的思想是多態來實現的。
       抽象策略類定義爲:接口或者抽象類。具體策略類實現抽象策略類。環境類中定義一個抽象策略類的引用。
集合中一定會遇到泛型,所以在使用集合時一定要使用泛型。
增強型for循環
        for(type element : 要遍歷數組/集合名字){};type爲數組/集合元素的具體類型。
注意二維數組使用增強的for循環,同樣要使用兩個enhanced for循環。
對於集合遍歷就有三種方式:1、舊式for循環,2、Iterator迭代器遍歷,3、增強for循環。
對於包裝類Integer,它提供了一個緩存,緩存介於-128 - 127之間的整數,所以當使用Integer i1 = 100;Integer i2 = 100;時 i1 == i2爲true,因爲緩存的機制。但是當i1 = 128;i2 = 128時,i1 == i2爲false,因爲它超過了緩存的範圍。
可變參數(Varargs)
        可變參數本質上是一個數組,所以方法在接受參數時可以用實際參數的形式,也可以用數組的形式。可變參數用三個點“...”來表示。
可變參數只能作爲方法參數的最後一個參數,即一個方法不可能具有兩個或者兩個以上的可變參數。
枚舉(Enum)
        可以把枚舉理解爲類層次上的一個概念。用enum關鍵字來聲明一個枚舉類型。switch後面除了byte、short、int、char,還可以接受枚舉,這點記住。
         自定義的枚舉類型都繼承自java.lang.Enum類,枚舉中的每個成員默認都是public、static、final的,所以可以通過枚舉名.成員名直接直接調用,因爲是static的,在外部可以直接使用,因爲是public的。因爲是final的,所以在case中可以使用。
         枚舉中的每個成員就是所定義的枚舉類型的一個實例。
        枚舉中同樣可以定義成員變量、構造方法、普通方法、main方法等。
        EnumSet是一個處理枚舉的Set集合。EnumMap中的鍵必須是一個枚舉類型,值沒有限制。
        枚舉最本質的特點就是實例個數是特定的。在定義枚舉時就限制了枚舉元素(枚舉對象)的個數,在使用枚舉時不能new出新的枚舉對象。在編譯時就已經確定枚舉對象的個數,而類在使用可以動態生成不限個數的對象。
靜態導入(Static Import)
       舊式導入是導入到類名級別;靜態導入則要導入到靜態成員變量、靜態方法級別。靜態導入就好像導入的成員變量、方法定義在當前類中。
       靜態導入格式:import static com.lzh.common.People.Age;import static com.lzh.common.People.output;注意output爲方法,導入方法時直接寫方法名字即可。
反射(Reflection)
        反射是很多Java Web框架的基礎。反射是發生在運行時(Runtime)。反射是一種運行時行爲。
        Java中一個類對應一個Class對象,一個類無論生成多少個對象都對應同一個Class對象。通過這個Class對象可以獲得當前類的概括信息,比如:類名、屬性、方法、構造器等。
        獲取一個類的Class對象方法:1、Class.forName("帶包名的類名字"),2、類.class,每個類都提供了一個“類名.class”方式獲得當前類的Class對象,可以理解爲class屬性。3、該類的對象調用getClass()方法。
對於原生類型也可以是Class類的對象,如byte.class、int.class等。
        Class對象是JVM生成的,我們無法手動Class對象。Class has no public constructor. Instead Class objects are constructed automatically by the Java Virtual Machine as classes are loaded and by calls to the defineClass method in the class loader. //根據API中表述可知,每個類的Class對象是在該類被加載到JVM中時由JVM自動生成的。
         通過反射來生成對象的方式:1、可以通過該類的Class對象調用newInstance()方法,2、通過Class對象獲得Constructor對象,然後通過Constructor對象的newInstance()方法獲得。對於方法1只能通過默認構造方法或者無參構造方法來生成對象,如果是想通過有參構造方法生成對象只能通過方法2。
2011/9/11   22:41:31
         對於包裝類,如Integer.TYPE返回的是int,而Integer.class返回的是Integer類所對應的Class對象。
         通過反射就可以打破private限制類使得在類外也可訪問類的private成員和方法。//但是默認下反射時會強制Java語言訪問檢查,可以通過AccessibleObject類中的setAccessible(true)方法來設置抑制訪問檢查,只有這樣才能真正做到類外訪問類中私有屬性和私有方法。
        運用反射的流程:1、獲得類的Class對象,2、有了類的Class對象後可以生成類的對象、對象生成後可以獲得對象的屬性和方法。
        Class提供了一個靜態getSuperclass方法獲得一個類的父類的Class對象。
        設計模式1:單例模式、2:策略模式、設計模式3:代理模式(Proxy Patten)
        靜態代理:抽象代理角色(抽象類、接口)、代理角色、真實角色。
        動態代理的思想是在運行時裝載一個類,然後生成該類的對象。
        動態代理的類必須實現InvocationHandler接口,該接口中只有一個方法invoke方法,實現該方法即可。
        Proxy類即是動態生成類的類,用它所提供的靜態方法來生成運行時類。該類都是在運行時生成,並且實現了真實角色所實現的接口的方法。
註解註釋(Annotation)
        JDK5.0開始,纔有的註解。註解可以用在任何地方:類、成員、方法上。Override註解表示子類要重寫或者實現父類方法。註解都是以“@”符號開始。@Override、@Deprecated註解表示方法是不建議被使用的。@SuppressWarning註解表示抑制警告,該註解一般要加括號,@SuppressWarning("unchecked")。
        註解和類、接口、枚舉一樣,是同一個層次上的概念。
        自定義註解用“@interface”符號標識。
         當我們使用@interface自定義註解類型時,實際上是自動(extends)繼承了java.lang.annotation.Annotation接口由編譯器自動完成的,這跟Enum一樣,當我們定義一個枚舉時,其實是自動繼承了java.lang.Enum抽象類。
2011/9/12
         “all annotation types are also interfaces.”也就是說所有的註解都是接口。
         RetentionPolicy爲保留策略,是一個枚舉類型,有三個枚舉值:SOURCE、CLASS、RUNTIME,只有當保留策略爲運行時,纔可以通過反射讀取到方法或者類上定義的註解。
         RUNTIME-“Annotations are to be recorded in the class file by the compiler and retained by the VM at run time, so they may be read reflectively.” SOURCE策略只是在源碼中有效,CLASS策略能夠在編譯後保留在class文件中。
         Retention必須搭配RetentionPolicy,Target必須搭配ElementTarget。這兩組枚舉有相似用法。Target定義註解只能放在類上、方法上、構造器上、局部變量...
        @Retention、@Target、@Documented(用於在生成DOC文檔時將註解一同寫入幫助文檔中,默認下註解是不會寫入幫助文檔中的)。
        JUnit單元測試3.8是基於反射,4.x是基於反射和註解實現的。3.8版本中方法命名必須以test開頭,因爲反射的機制,首先帶測試類的Class對象,然後獲取Class對象的public所有Method對象數組,再遍歷該數組並且調用getName判斷是否以test開頭。
2011/9/17
內部類(Inner Class)
         Java中的內部類分爲4種。1、靜態內部類(Static Inner Class),如果要想讓static關鍵字修飾一個類,則這個類一定是內部類。普通類是不能被static關鍵字修飾的。
         內部類在編譯後也會生成一個完全獨立的class文件,class文件命名規則爲:“外部類$內部類”。2、成員內部類(Member Inner Class),靜態內部類去掉static關鍵字後就是成員內部類。3、局部內部類(Local Inner Class),他不能被public、protected、private、static關鍵字修飾,這和局部變量相似,同樣不能被上述關鍵字修飾。局部內部類只能在定義該類的方法中使用。在外部內和其它類中是無法局部內部類的。局部內部類只能訪問方法中聲明的final類型變量,也就是隻能訪問方法中的常量。
         4、匿名內部類(Anonymous Inner Class),它是一種局部內部類,它是沒有名字的內部類,所以也就沒有關鍵字,沒有構造器,它會隱式的繼承一個父類或者是實現一個接口。它通常是作爲方法參數。
         對於匿名內部類在編譯後生成的class文件命名規則又不一樣了,規則爲:“外部類$.n.class”,n=1、2、...。
         設計模式1:單例模式、2:策略模式、設計模式3:代理模式(Proxy Patten)、4:觀察者模式(Observer Pattern)。
觀察者模式(Observer Pattern)
         抽象主題角色(抽象類、接口)、抽象觀察者角色(抽象類、接口)、具體主題角色(實現抽象主題角色中的方法,持有具體觀察者角色的引用)、具體觀察者角色(實現抽象觀察者角色)。
         Swing是基於AWT,也就是繼承自AWT。
        JDK對觀察者模式內置支持,java.util.Observable類,java.util.Observer接口就是對觀察者模式開放的API。
        AWT中事件處理都是利用觀察者模式來實現的,在IO中低級流向高級流轉變都是利用裝飾模式來實現的。
在Observable中changed變量默認下爲false,所以在調用notifyObservers方法前一定要注意先調用setChanged方法,該方法爲protected,子類可以調用。
        被觀察者的狀態發生變化時,就可以選擇是否通知觀察者來調用update方法。
2011/9/17
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章