Java核心技術卷1——第四章下

  • 面向對象設計概述
    • 結構化程序設計
    • OOP
    • web瀏覽器的例子
    • 對象
    • 識別類
    • 類之間關係
  • 使用現有類
    • 對象和對象變量
    • Date類
    • GregorianCalendar類
    • 更改器方法和訪問器方法
  • 用戶自定義類
    • 一個Employee類
      • 最簡單的類
        • 構造器
        • 方法
    • 多個源文件的使用
      • 源文件
        • .java
        • 能夠包含多個class
        • 只能有一個public class
          • 且該class名與源文件名相同
        • 習慣性一個class一個源文件
          • 編譯源代碼
            • 通配符匹配
              • javac Employee*.java
            • 隱式編譯調用的class
              • javac EmployeeTest.java
              • 會自動從新編譯新的.java
    • 解析Employee類
      • 類方法
        • 構造器
        • 方法
        • 關鍵字public
          • 任何類的任何方法均可以調用這些方法
      • 實例域
        • 關鍵字private
          • 確保只有Employee類自身的方法可以訪問這些實例域
          • 封裝性好
        • 可包含屬於某個類的實例域
          • 好比String類
    • 從構造器開始
      • 與類同名
      • 構造類對象時被運行
        • 初始化實例域(初始狀態)
        • 伴隨new操做符的執行被調用
          • C++:Employee number007("Janes Bond",10000,1950,1,1);//可不用new
        • 不能對已存在的對象調用構造器
      • 沒有返回值
      • 不要定義與實例域重名的局部變量
    • 隱式參數和顯示參數
      • 隱式參數
        • 方法名前的對象名
        • this
          • 可明顯區分實例域和局部參數
      • 顯示參數
        • 方法名後的參數
    • 封裝的優勢
      • getxxx訪問器方法
        • 只返回實例域值
        • 域訪問器
      • 類應提供
        • 一個私有的數據域
        • 一個公有的域訪問器方法
        • 一個公有的域更改器方法
        • 比簡單的公有數據域複雜些
          • 好處:
            • 能夠改變內部實現,僅改變類方法
            • 更改器方法能夠執行錯誤檢查
      • 不要返回引用可變對象的訪問器方法
        • 會破壞封裝性
        • 返回的對象引用可改變引用同一對象的私有狀態
        • 應該返回其克隆
          • return (Object)obj.clone();//Object,obj看具體狀況
    • 基於類的訪問權限
      • 方法能夠訪問所調對象的私有數據
      • 方法能夠訪問所屬類的全部對象的私有數據
    • 私有方法
      • 公有數據危險——>私有數據
      • 方法
        • 絕大多數公有
        • 特殊狀況私有
          • 計算代碼劃分紅多個獨立的輔助方法
          • 輔助方法不該該成爲公有接口的一部分
          • 實現機制緊密/須要特別的調用次序
        • 私有方法不被外部類操做調用,可刪除
        • 公有方法不能隨意刪除
    • Final實例域
      • 構建對象時必須初始化
      • 構造器執行後,必須已被設置
      • 後面操做不能修改值
      • 可變類用final定義,其狀態仍是能夠改變
        • 僅對象引用爲常量
  • 靜態域與靜態方法
    • static修飾
    • 靜態域
      • 每一個類只有一份
      • 類域
    • 靜態常量
      • static final
    • 公有常量
      • public final
      • 不怕被類對象修改 
    • 靜態方法
      • 不能向對象實施操做的方法
      • 沒有隱式參數
      • 不能訪問實例域
      • 只能訪問自身類中的靜態域
      • 使用狀況
        • 一個方法不須要訪問對象狀態,其參數都是經過顯示參數提供
        • 一個方法只需訪問類的靜態域
    • factory方法
      • NumberFormat類
        • NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
        • NumberFormat percentFormatter = NumberFormat.getPercentIntence();
        • double x = 0.1;
        • System.out.println(currencyFormatter.format(x));//$0.10
        • System.out.println(percentFormatter.format(x));//10%
      • 使用factory方法產生不一樣風格的格式對象
      • 沒法命名構造器時使用
        • 須要不一樣名字
      • 須要改變構造器返回對象類型
    • main方法
  • 方法參數
    • 值傳遞
      • 接收的是調用者提供的值
    • 引用傳遞
      • 接收的是調用者提供的變量的地址
    • 一個方法能夠修改傳遞引用所對應的變量值,不能修改傳遞值調用所對應的變量值
    • Java程序設計語言老是採用值傳遞
      • 對象引用可調用方法改變值
      • 但依舊是值傳遞,對象引用的拷貝
  • 對象構造
    • 多種編寫構造器的方式
    • 重載
      • 特徵:
        1. 多個構造器
        2. 多個方法,相同方法名,不一樣參數類型
          1. 方法的簽名:方法名,參數類型
    • 默認域初始化
      • 自動賦默認值
      • 局部變量必須初始化
    • 默認構造器
      • 沒有參數的構造器
      • 沒有編寫構造器,提供默認構造器
      • 默認構造器將實例域設置默認值
      • 提供了至少一個構造器,沒有默認構造器,視爲不合法
    • 顯示域初始化
      • 不一樣構造器採用多種形式設置類的實例域的初始狀態
      • 執行構造器前先賦值,但願全部構造器對某一特定實例域賦相同的值
      • 初始值不必定是常量
    • 參數名
      • 前面加a區分
      • 一樣的名字屏蔽,用this區分
    • 調用另外一個構造器
      • this(...)
        • 放在構造器第一句,將調用同一類的另外一個構造器
        • 對公共構造器代碼部分只編寫一次便可
    • 初始化塊
      • 初始化數據域
        • 在構造器賦值
        • 聲明中賦值
        • 初始化塊
      • 靜態代碼塊在類加載的時候運行
      • 用static塊打印」Hello world「,結尾加System.exit(0),可不用main函數
      • int nextInt(int n);//返回0-n-1之間的隨機數
    • 對象析構和finalize方法
      • 析構器(C++)
        • 放置一些當對象再也不使用時須要執行的清理代碼
        • 好比回收分配給對象的存儲空間
        • Java不支持(有自動的垃圾回收器)
      • finalize方法
        • 在垃圾回收器清除對象前調用
        • System.runFinalizersOnExit(true)能確保finalize方法在Java關閉前調用(不安全)
        • 使用Runtime.addShutdownHook添加「關閉鉤」
        • 某個資源須要在使用完畢馬上被關閉——人工管理
          • 應用相似dispose或close的方法完成相應的清理操做
    • 組織類
      • 一個類能夠訪問
        • 所屬包全部類
        • 其餘包公有類
          • import java.util.*(訪問util包全部類)
    • 分隔代碼庫
    • 標準java包
      • java
      • javax
    • 使用包的主要緣由是確保類名的惟一性
    • 還需保證包名惟一
    • 靜態導入
      • import導入包
      • import導入靜態方法
      • import導入靜態域
      • import static java.lang.System.*;//可以使用System類的靜態方法和靜態域,不用加類前綴,out.print("hello");
      • import static java.lang.System.out;//導入特定方法或域
    • 將類放在包中
      • package com.aaa.bbb;//沒有寫,放默認包(defaulf package)
      • 包名
        • 會有與包名匹配的子目錄
        • 包中文件
          • 源文件.java
          • 類文件.class
        • 基目錄
          • .java(默認包)
          • .class
          • com/
            • core/
              • .java(包com.core)
              • .class
        • 從基目錄編譯和運行類
          • 編譯器——.java
          • 解釋器——.class
    • 包的做用域
      • 修飾符
        • public
          • 可被任意類使用
        • private
          • 只能被定義他們的類使用
        • 默認
          • 可被同一包中的全部方法訪問
      • 禁止加載用戶自定義的、包名以java.開始的類
        • 可用包密封機制解決自定義類的密封性
  • 類路徑
    • 類路徑必須與包名匹配
      • 類存儲在文件系統的子目錄
      • 類文件也能夠存儲到JAR文件(Java歸檔)中,
        • JAR文件中可包含多個壓縮形式的類文件和子目錄,既節省又改善性能
      • 程序用到第三方的庫文件時一般會給出一個或多個須要包含JAR文件
      • JDK也提供許多JAR文件,如jre/lib子目錄下有數千個類庫文件
      • JAR文件使用ZIP格式組織文件和子目錄。可使用全部ZIP實用程序查看內部rt.jar以及其餘的JAR文件
    • 使類被多個程序共享,須要:
      • 把類放到一個目錄
        • /home/user/classdir/包/類
      • 將JAR文件放在一個目錄
        • /home/user/archives
      • 設置類路徑class path(全部包含類文件的路徑的集合)
        • UNIX中,類路徑中的不一樣項目之間用分隔
          • Windows中,用分隔
          • .表示當前路徑
        • 類路徑包括
          • 基路徑/home/user/classdir或c:\classes;
          • 當前目錄.
          • JAR文件/home/suer/archives/archive.jar或c:\archives\archive.jar
          • JAVA SE 6
            • 可在JAR文件目錄中指定通配符
              • /home/user/classdir:.:/home/suer/archives/'*'或者c:\classdir;.;c:\archives\*
              • 但在UNIX中禁用*,以防止shell命令進一步擴展
    • 設定類路徑
  • 文檔註釋
    • javadoc
    • 由源文件生成一個HTML文檔
    • /**開始的註釋*/結束
    • 抽取信息
      • 公有類與接口
      • 公有的和受保護的方法
      • 公有的和受保護的域
    • 標記@
    • @自由格式文本
      • 第一句:概要性句子
      • 概要頁
      • 可使用html修飾符
        • 不要用<h1><hr>
        • 圖片放在doc-files中
    • 類註釋
      • 必須在import以後,類定義以前
      • /**
      • */
      • public class xxx{}
    • 方法註釋
      • 放在所描述的方法以前
      • 除通用標記,還能夠用
        • @param variable description
          • 對當前方法的param部分添加一個條目
          • 可佔據多行,可使用HTML標記
          • 一個方法的全部@param必須放一塊兒
        • @return description
          • 對方法添加return部分
          • 可佔據多行,可使用HTML標記
        • @throws class description
          • 添加一個註釋,用於表示這個方法有可能拋出異常
      • /**
      • *Raises the salary of an employee
      • *@param byPercent the percentage by which to raise the salary(e.g. 10 =10%)
      • *@return the amount of the raise
      • */
      • public double raiseSalary(double byPercent){
        • double raise = salsry*byPercent/100;
        • salary += raise;
        • return raise;
        • }
    • 域註釋
      • 只需對公有域(靜態常量)創建文檔
      • /**
      • *The "Hearts" card suit
      • */
      • public static final int HEARTS = 1;
    • 通用註釋
      • @author name
        • 產生一個做者條目
        • 可以使用多個@author
      • @version text
        • 產生一個「version」條目
        • text是對當前版本的任何描述
      • @deprecated text
        • 對類、方法、變量添加一個再也不使用的註釋
      • @see和@link
        • 可使用超級連接、連接到javadoc文檔的相關部分或外部文檔
      • @see reference
        • 在see also 部分增長一個超級連接
        • 能夠用於類中
        • 能夠用於方法
        • 連接到方法
          • @see com.core.Employee#raiseSalary(double)
          • @see <a href="www.baidu.com">baidu</a>
          • @see "Core Java 2 volume 2"
          • 指向其餘類或方法
            • {@link package.class#feature label}
      • 包與概述註釋
        • 能夠直接將類、方法和變量的註釋放置在Java源文件中
        • 包註釋要在每一個包目錄中添加一個單獨的文件
          • 方法一:以package.html命名的HTML文件,在<body>...</body>之間的全部文件都會被抽取出來
          • 方法二:以package-info.java命名的Java文件。以/**和*/界定,跟隨在一個包語句以後
        • 爲全部源文件提供一個概述性的註釋。
          • 放在名爲overview.html的文件中,位於包含全部源文件的父目錄中。標記<body>...</body>之間的全部文本將被抽取出來
          • 在導航欄選擇「Overview」時,就會顯示這些註釋內容
      • 註釋的抽取
        • 假設HTML文件將放在目錄docDirectory下
        • 執行如下步驟:
          • 切換到包含想要生成文檔的源文件目錄
          • 若是是一個包,運行
            • javadoc -d docDirectory nameOfPackage
          • 或對於多個包生成文檔,運行:
            • javadoc -d docDirectory nameOfPackage1 nameOfPackage2...
          • 若是文件在默認包中,運行
            • javadoc -d docDirectory *.java
          • 爲標準類添加超連接
          • 須要進一步定製
            • 非html文檔
              • 自定義doclet
            • 搜索一組源程序文件
              • DocCheck
  • 類設計技巧
    • 必定將數據設計爲私有
    • 必定對數據初始化
    • 不要在類中使用過多的基本數據類型
    • 不是全部的域都須要獨立的域訪問器和域更改器
    • 使用標準格式進行類的定義
      • 公有訪問特性部分
      • 包做用域訪問特性部分
      • 私有訪問特性部分
      • 每部分應該列出
        • 實例方法
        • 靜態方法
        • 實例域
        • 靜態域
    • 將職責過多的類進行分解
    • 類名和方法名要可以體現他們的職責
相關文章
相關標籤/搜索