第1章 對象導論
l 面向對象特性:萬物皆爲對象;程序是對象的集合,它們通過發送消息來告知彼此所要做的;每個對象都有自己的由其他對象所構成的存儲;每個對象都擁有其類型;某一特定類型的所有對象都可以接收同樣的消息。(對象具有狀態、行爲和標識)
第2章 一切都是對象
l Javadoc用以註釋,輸出爲html,命令以/**開始,以**/結束。獨立文檔標籤以@開頭,置於註釋行最前面。註釋中可以用html標籤以方便查看。Javadoc標籤:1、@see引用其他類;2、{@link package.class#member label}用於行內;3、{@docRoot}文檔根目錄相對路徑;4、{@inheritDoc}繼承文檔;5、@version版本信息;6、@author作者信息;7、@since最早Java版本;8、@param方法參數列表;9、@return返回值;10、throws異常;11、@deprecated過時。
第3章 操作符
第4章 控制執行流程
l 逗號操作符:for循環中隔開。
l 吸血鬼數字
第5章 初始化與清理
l static就是沒有this的方法。
l finalize():對象可能不被垃圾回收,垃圾回收並不等於“析構”,垃圾回收只與內存有關。之所以有finalize()方法是因爲在分配內存的時候可能採用了類似C語言中的做法,而非Java的通常做法,主要是Native Method的非Java代碼。finalize()相當於只是標記爲可以被回收。
l 垃圾回收器:引用計數,停止-複製,標記-清掃,分代,自適應。
l 可變參數列表,void print(Object... args);原先是用數組的方式來做的。只在重載方法的一個版本上使用可變參數列表,或者壓根不用它。
l 枚舉:toString()顯示enum實例的名字,ordinal()表示聲明順序,values()返回enum常量的數組。
第6章 訪問權限控制
l 起因:變動的事物與不變的事物區分開來。
l public、protected、private、包訪問權限。類庫設計員儘量都private。
第7章 複用類
l 組合,繼承,代理(繼承和組合的中庸),同時使用組合和繼承。
l 向上轉型,final變量,final方法。
第8章 多態
l 多態通過分離做什麼和怎麼做,從另一個角度將接口和實現分離開來。
l 子類基類的初始化構造問題。
l 當使用現有類來建立新類時,應該首先考慮組合,尤其是不能十分確定應該使用哪一種方式時,過多的繼承可能會加重設計負擔變得複雜。
第9章 接口
l 接口和內部類爲我們提供了一種將接口與實現分離的更加結構化的方法。
l 接口與其方法默認且必須是public的。
l 使用接口的核心原因:爲了能夠向上轉型爲多個類型(以及由此帶來的靈活性)。使用接口的第二個原因:(同抽象類)防止客戶端程序員創建該類的對象並確保這僅僅是建立一個接口。
l 通過繼承來擴展接口。
l 應該優先選擇類而不是接口,
第10章 內部類
l 將一個類的定義放在另一個類的定義內部,稱爲內部類。可以把一些邏輯相關的的類組織在一起,並控制內部類的可見性。
l 內部類擁有外圍類所有元素的訪問權。內部類如果需要生成對外部類對象的引用,可以使用外部類名字後加.this。創建內部類對象則需要外部類對象.new後加內部類名字。
l 在方法和作用域內的內部類。
l 匿名內部類。
l 嵌套類:static內部類。可放在接口中。
l 使用內部類最吸引人的原因:每個內部類都能獨立繼承自一個(接口的)實現,所以無論外圍類是否已經繼承了某個(接口的)實現,對於內部類都是沒有影響的。使得多重繼承的方案變得完整。
l 閉包closure是一個可調用的對象,它記錄了一些信息,這些信息來自於創建它的作用域。內部類是面向對象的閉包。
l 繼承類不會覆蓋內部類,但可以明確地繼承某個內部類。
l 局部內部類,不能有訪問說明符。
第11章 持有對象
l Java容器類庫的用途是“保存對象”,分爲Collection(獨立元素序列)和Map(一組成對的鍵值對對象)。
l List:ArrayList,LinkedList。迭代器:Iterator,ListIterator。Stack。Set:HashSet,TreeSet,LinkedHashSet。Map:HashMap、TreeMap、LinkedHashMap。Queue:PriorityQueue。
l 新程序中不應該使用過時的Vector、Hashtable、Stack。
第12章 通過異常處理錯誤
l Java的基本理念是“結構不佳的代碼不能運行”。
l 使用異常處理能夠降低錯誤處理代碼的複雜度。
l 異常處理理論上有兩種基本模式:Java支持終止模式,恢復模式(調用方法修正或者把try放在while循環中直到滿意,但是會時耦合性過高)。
l 創建自定義異常。
l 棧軌跡printStackTrace()的信息可以用getStackTrace()來獲取。Catch塊中可以重新拋出異常。
l RuntimeException是特例,代表編程錯誤。
l Finally塊用來關閉釋放等操作。Finally總是會執行。
l 異常限制。
l 構造器中的異常。
l 原則:只有在你知道如何處理的情況下才捕獲異常。
l 應該在以下情況使用異常:1、在恰當的級別處理問題(在知道如何處理的地方纔捕獲異常);2、解決問題並重新調用產生異常的方法;3、進行少許修補,然後繞過異常發生的地方繼續執行;4、用別的數據進行計算,以代替方法預計會返回的值;5、把當前運行環境下能做的事情儘量做完,然後把相同的異常重拋到更高層;6、把當前運行環境下能做的事情儘量做完,然後把不同的異常重拋到更高層;7、終止程序;8、進行簡化;9、讓類庫和程序更安全。
第13章 字符串
l String。Formatter。
l 正則表達式:需要着重動手嘗試一下。
第14章 類型信息,需要重看
l 運行時類型信息使得你可以在程序運行時發現和試用類型信息。
l 向下轉型,instanceof。多種Pet隨機生成不同Pet。
l 反射。
l 動態代理。
第15章 泛型
l 一次調用返回多個值,使用泛型創建元組。
l EnumSet。
l 在泛型代碼內部,無法獲取任何有關泛型參數類型的信息。(被java擦除了)
l 使用<T extends HasF>方式
l 泛型通配符,如List<? extends Fruit> list = new ArrayList<Apple>();或<? Super MyClass>或<? Super T>
l 無界通配符<?>
l 使用帶有泛型類型參數的轉換或instanceof不會有任何效果,但是可以使用Object來存儲然後再轉型爲T。
l 自限定的類型:class SelfBound<T extends SelfBound<T>>。古怪的循環泛型(指類相當古怪地出現在它自己的基類中)。自限定類型的價值在於它們可以產生協變參數類型(方法參數類型會隨子類而變化)。
l 混型。
第16章 數組
l 數組與其他類的容器之間的區別:效率、類型和保存基本類型的能力。在Java中,數組是一種效率最高的存儲和隨機訪問對象引用序列的方式。缺點是大小被固定了。
l Arrays實用功能:equals()比較兩個數組是否相等(deepEquals()用於多維數組),fill(),sort()用於對數組排序,binarySearch()用於在已排序的數組中查找元素,toString()產生數組的String表示,asList()接受任意的序列或數組轉換爲List容器。System.arraycopy()用來複制數組(比for循環複製快得多且對所有類型做了重載,不執行自動裝包拆包)。
第17章 容器深入研究
l Java容器類包括如上圖所示,以及Java Se5新添加:Queue接口,ConcurrentMap和ConcurrentHashMap,CopyOnWriteArrayList和CopyOnWriteArraySet,EnumMap和EnumSet。以及WeakHashMap等保存WeakReference的特殊Map。
第18章 Java I/O系統
l File類,既能代表一個特定文件的名稱,又能代表一個目錄下的一組文件的名稱。File.list()方法獲取目錄列表。
l InputStream:ByteArrayInputStream、StringBufferInputStream、FileInputStream、PipedInputStream、SequenceInputStream、FilterInputStream(DataInputStream、BufferedInputStream、LineNumberInputStream、PushbackInputStream)。
l OutputStream:ByteArrayOutputStream、FileOutputStream、PipedOutputStream、FilterOutputStream(DataOutputStream、PrintStream、BufferedOutputStream)。
l InputStreamReader->Reader,OutputStreamWriter->Writer,FileReader,FileWriter,StringReader、StringWriter,CharArrayReader,CharArrayWriter,PipedReader,PipedWriter,FilterReader、FilterWriter、BufferedReader、BufferedWriter、PrintWriter、LineNumberReader、StreamToken、PushbackReader。
l RandomAccessFile:適用於由大小已知的記錄組成的文件,需要知道文件排版才能知道如何操作。
l 標準I/O重定向,重定向到文件。
l 緩衝器:ByteBuffer、MappedByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、ShortBuffer。
l 文件加鎖。壓縮:CheckedInputStream、CheckedOutputStream、DeflaterOutputStream、ZipOutputStream、GZipOutputStream、InflaterInputStream、ZipInputStream、GZipInputStream。
l 序列化:trsndient關鍵字防止被序列化。
l XML:javax.xml.*;以及ElliotteRusty Harold的開源庫XOM類庫www.xom.nu。
l Preferences API相對於對象序列化爲更小的數據集合的存儲。
第19章 枚舉類型
l enum將一組具名的值的優先級和創建爲一種新的類型。
l 基本上可以看做一個類,有origin()values()compareTo()。
l EnumSet、EnumMap。
l enum可以與其他功能如多態反省反射結合使用。
第20章 註解
l 註解爲我們在代碼中添加信息提供了一種形式化的方法,使我們可以在稍後某個時刻非常方便地使用這些數據。
l Java內置註解:@Override、@Deprecated、@SuppressWarnings。四種元註解:@Target、@Retention、@Documented、@Inherited。
l 自定義註解。
第21章 併發
l java.util.concurrent包中的Executor。FixedThreadPool、ChchedTHreadPool、SingleThreadExecutor。
l 線程優先級setPriority(),後臺線程setDeamon()。
l 方法:run()、yield()、join()、interrupt()、stop()、wait()、notify()、notifyAll()。
l 原子類:AtomicInteger、AtomicLong、AtomicReference。(鎖更安全一些synchronized或者顯示的Lock對象)
l 使用顯式的Lock和Condition對象。BlockingQueue,CountDownLatch,CyclicBarrier,DelayQueue,PriorityBlockingQueue,ScheduledExecutor,Semaphore,Exchanger。
第22章 圖像化用戶界面
l 略