java面向對象筆記

**

類和對象

**
oop的三大特性;
封裝,繼承,多態
Java要素;類、對象、封裝、繼承、多態、抽象類、接口、java異常
面向對象程序設計object oriented programming (簡稱oop)
封裝;(把代碼通過類或方法包裝起來,不需要知道其具體的細節,通過對象重複調用使用)

  1. 開發方法
    a) 結構化開發(如c語言)
    i. 以功能來進行劃分區域
    ii. 從上向下開發
    iii. 最小的子系統是方法
    iv. 缺點是可維護性差,不便於系統升級
    b) 面向對象開發
    i. 以對象來進行劃分,把系統當做對象的集合
    ii. 系統結構穩定
    iii. 子系統相對獨立
    iv. 可重用性,可維護性,可擴展性較高

  2. 開發週期
    a) 需求確認
    b) 設計框架
    c) 軟件開發
    d) 週期維護

  3. 軟件要求
    a) 可擴展性
    b) 可重用性(無需重寫)
    c) 可維護性(便於維護)

  4. 什麼是對象(客觀描述事物的一個實體,由一組屬性和方法構成)
    a) 萬物皆對象
    b) 一個類別裏的具體的對象叫做對象(具體到某一個)
    c) 對象的屬性取決於類的類型
    類是對象的抽象,對象是類的具體

  5. 什麼是類(具有相同屬性和方法的一組對象的集合)
    a) 一些相同的對象組成的集合稱爲類(不能具體到某一個)

  6. 描述一個對象的特徵的時候我們稱之爲屬性(每一個屬性都有一個對應的屬性值)
    要求實現的效果不同對象執行的操作也會不同,對象的特徵也可能發生改變(理解對象的屬性與方法之間的關係)

  7. 描述一個對象的行爲的時候我們稱之爲方法(對象執行的操作)

  8. 書寫結構順序(先寫類在寫對象,由大到小)

  9. 每一個類也可稱之爲數據類型(自定義的數據類型)

  10. 語法要求

  11. 定義一個自定義的類

a) 定義類的屬性,不需要賦值
b) 定義一個方法(即對象的操作,執行的任務)
c) ShowInfo爲方法名,可以改變
d) return返回數據,賦予給showinfo方法,方便以後使用
e) info爲定義的字符串名,可以改變
12. 使用類圖(用於分析和設計類,特點容易理解)
a) 畫圖工具Visio、rose

b) 類圖分析
i. Dog爲類名
ii. Name、health、love、strain、爲dog的屬性
iii. Print爲方法名;void返回的值;

iv. +號代表public,(作用域)
13. 創建對象
a) 類名(創建的類名也是寫類的文件名)對象名(自己寫的名,跟變量名一樣)=new 類名(創建的類名也是寫類的文件名)();
14. 使用對象的屬性和方法

a) 對象名(自己寫的名,跟變量名一樣).(屬性)
b) 對象名(自己寫的名,跟變量名一樣).(方法)


**

構造與方法的重載

**

  1. 參數的類型(能通過 . 出來的都爲引用數據類型,不能的爲基本數據類型)
    a) 基本數據類型(int Boolean char等)
    b) 引用數據類型(自定義數據類型,數組,接口等)、
  2. 方法傳參(參數的傳遞)
    a) 數據爲基本數據類型時,參數的變化不保留(傳輸基本數據時傳輸的爲複製的數據,不是原數據,對象不同,數據的值不會改變)
    b) 數據爲引用數據類型時,參數的變化會保留(傳輸引用數據類型時傳輸的爲數據的地址,爲同一對象,數據的值會改變)
  3. Main方法調用方法必須要new(main方法爲靜態方法)
  4. 對象數組(存放對象的數組)
  5. 用構造方法對對象進行賦值
    public GoCoHanSuOopDemo1(){
    System.out.println();
    }(建立空的構造,在不需要用的情況下可以不建立)
    public GoCoHanSuOopDemo1(String name,int age){
    names=name;
    ages=age;
    }(建立需要賦值的構造且設置參數)
    a) 使用構造方法
    public static void main(String[] args) {
    GoCoHanSuOopDemo1 name=new GoCoHanSuOopDemo1(“賬上”,28);
    }新建對象且對對象設置參數
    b) 建立一個空的構造
    c) 利用架構對其賦值(public後面不需要加返回類型)
    d) 在建立對象的時候後面加上需要賦值的值(賦值的值必須與架構的參數的類型一樣,順序也要一樣)
  6. 方法名可以重複但在相同的方法名中方法的作用不能一樣不讓回導致方法重載
  7. 方法
    a) 有返回值無參數 有返回值有參數
    b) 有參數無返回值 無返回值無參數
  8. This應用
    a) 用於在當前方法的屬性(變量名重複時)
    b) 用於在當前包裏的方法(調用同一個包的方法)
    c) 語法
    i. (屬性)
    ii. (方法)
  9. 每個類都有一個默認的無參構造方法(如果加了有參的構造方法進類中,無參的構造方法將不在有需要使用時,必須自己寫)
  10. 方法重載
    a) 在同一類下可有多個同名不同參的方法
    b) 方法重載注意其方法名是否一樣和參數值是否不一樣
    c) 方法重載時,系統將會使用最適合的方法

**

封裝

**
封裝一

  1. 局部變量
    a) 局部變量是在一個方法內(或更小的語句)聲明的變量(作用域爲整個方法)
  2. 全局變量(成員變量,全局變量大於局部變量)
    a) 一個方法由成員變量和成員方法組成
    b) 全局變量是聲明在一個類的範圍內的變量(作用域爲整個類)

c) 全局變量在其他的類裏能通過創建對象進行調用
3. Java會給成員變量一個初始值而局部變量不會有,在使用局部變量時必須給它賦值且局部變量可以與全局變量同名(如果同名,在使用時會就近原則使用最近的變量即局部變量將全局變量值覆蓋),在不同的方法裏可以有同名的變量,但在一個方法裏不能有同名的兩個變量
4. 封裝的用處(解決一些屬性值範圍不明確,用戶可以對其隨意賦值卻又不可理的bug)
5. 封裝的定義;將類的一些信息隱藏在類的內部,不允許直接訪問而是通過類的方法來對其進行訪問和操作從而達到數據的合理性,安全性
6. 封裝的兩大基本原則
a) 儘可能的把所有屬性隱藏
b) 儘可能多的隱藏,對外提供便捷的接口
7. 基本的思路

a) 將屬性修改爲私有的
b) 對隱藏的屬性建立一對(setter(賦值,一般寫法爲set(屬性名)set不需要返回值,用於對屬性賦值)/getter(讀取一般寫法爲get(屬性名)get需要返回值,返回類型與屬性類型一樣,用於用戶訪問隱藏的屬性)可以修改屬性的方法,通過方法裏的判斷來對屬性進行修改(方法必須是公開的)
8. 語法

  1. 在類裏面不能直接書寫功能塊(邏輯塊),類裏只能有屬性和方法
  2. 權限修飾符(通過修飾符來對屬性進行隱藏,從而對其進行封裝)
    a) 屬性和方法默認情況下在別的包中不能調用
    b) Public;公有的,用public修飾的屬性和方法在整個項目中度都可以使用
    c) Protected;受保護的。只能在本包中使用,繼承關係下子類能使用
    d) 默認;只能在本包中使用
    e) Private;私有的,private修飾的屬性和方法只能這本類中使用。
  3. 封裝的優點
    a) 有助於用戶正確的使用,防止錯誤的修改屬性
    b) 有助於系統之間的鬆耦合(耦合,指的是系統間的小模塊粘連在一起,不好分割),提高系統的獨立性
    c) 提高軟件的可重用性
    d) 降低了構建大型系統的風險
    **

封裝二

**

  1. 包機制
    a) 包相當於目錄,可以放多個類
    b) 不同包的可以存放相同的類名
  2. 命名規範
    a) 包名命名必須是小寫

b) 包前加前綴,通常用網絡域名
c) 包後續部分自定義
3. 引用不同包下的類;import .(包名).(類名)
4. Package在一個人類裏只能出現一次,import可以出現多次,除註釋外,package必須聲明在第一句,import在class前面聲明
5. 自己建立的爲用戶包,java自帶稱爲系統包
6. 使用多個不同包裏的相同類名的類需要指定那個包即在建立對象時寫上包名(不同於導包,只是聲明加載的對象累的完整限定名)


**

繼承(繼承最頂層一般爲抽象類)

**

  1. 繼承;將一些具有相同特性的屬性寫在同一個父類中,讓其餘的子類繼承父類特性的屬性,在java中只支持單根繼承即就只有一個直接父類(直接父類即它的上一級),在具有is—a的關係的時候就可以用繼承來編寫代碼,
  2. 父類(也稱爲基類)將所有相同的屬性放在一起,給其他類繼承用
  3. 父類與子類是is—a的關係(is—a意思是必須是同一種類別)
  4. 繼承關鍵字extends(extends前面寫子類名,後面寫父類名)
    a) 書寫繼承語法順序

b) 語法
i. 創建新的類,將其成爲父類,將公共的屬性特性寫在這個公共的父類中(class pet{ (公共的屬性和方法) })
ii. 編寫子類,將獨有的特性屬性和方法寫在子類中(class dog extends pet{ 子類的特有屬性和方法})
5. Protected修飾符的方法和屬性在同類、同一包、子類中都能訪問,在不同的包中只要是父子關係也能進行訪問
6. 子類繼承的了父類被public、protected修飾的所有方法和屬性(不管在不在同一個包下)、還繼承了在同一包下的默認修飾的屬性和方法,不能繼承被private修飾的屬性和方法、不在同一個包下被protected修飾的屬性和方法和所有的構造方法
7. Super只能寫在第一句並出現在子類的方法和構造中,代表的是父類對象
8. 繼承的缺點;系統的獨立性降低,不利於以後的修改,修改後的影響較大


**

類的方法

**

  1. 類的方法分類
    a) 帶參方法(方法名後的括號不爲空,main(String[]args))
    b) 無參方法(方法名後的括號爲空, study ( ))
  2. 類的方法結構
    a) Public 返回值的類型 方法名(){
    //書寫方法的主體即方法體(實現的效果,要做的操作)
    }
  3. 類的方法的返回值類型
    a) Return;返回一個方法相同的數據類型,在後面的代碼不會再運行,不能寫,
    i. 作用
  4. 返回結果
  5. 跳出方法
    ii. return返回的變量類型必須與方法的數據類型相同(聲明有返回值是必須寫,返回的類型要一樣)
    iii. return只能返回一個值或者是一個表達式,不能返回多個

b) Void;
i. 在沒有返回值得情況下使用(沒有返回值時方法結構的返回值的數據類型不能不寫)
ii. 沒有返回值時,在調用方法時不需要定義數據類型去接收
c) 方法有沒有返回值和方法有沒參數沒有關係
4. 調用類的方法
a) 在方法裏調用方法(兩個類方法相互調用)

必須創建另一個新類的對象,通過對象再來調用另一個方法
b) 在自定義的方法裏調用自定義的另一個方法
i. 在同一包下,直接調用,直接書寫方法。
5. 在方法裏定義的變量稱爲局部變量(this代表當前對象的引用,即全局變量(同一方法裏的最大的作用域))局部變量與全局變量重名時必須要用this。
6. 帶參方法(設置參數是用來與方法裏的元素進行傳輸或者在方法裏進行輸出,設置參數時必須定義類型)

a) 方法定義
i. Public String zhazhi(String fruit){ (定義參)

}
String furit帶參方法必有的,稱爲形式參數,也稱爲形參,只約束參數的類型(furit可以改變,爲定義的形參名字,一般用於方法體中)
ii. String zhi = ji1.zhaZhi ( shuiGuo )(傳參)
iii. shuiGuo稱爲實際參數,也稱爲實參,可以給變,類型必須與形參一樣。
iv. 形參和實參的數據類型必須一樣,名字可以一樣,也可以不一樣
v. 參數可以有多個,用逗號隔開,形參和實參的數量必須要一樣(定義了多個參數就需要寫多個參數)
b) 語法

c) 調用參數時不要聲明數據類型


**

方法重寫(又稱方法的覆蓋)

**

  1. Super

a) 使用super關鍵字,super代表父類對象
b) 在子類構造方法中調用必須在第一句
c) 不可以訪問父類中被private修飾的方法和屬性
d) 通過super . (方法名或屬性名)調用方法或屬性(必須不是private修飾的纔可以進行調用)
e) 調用父類構造方法;通過super (構造的參數)進行調用調用時就只能調用一種,不能有參無參構造一起調用且必須是寫在第一句調用
f)
g)
2. 方法重寫時用super對需要的方法進行調用,(構造方法不能被重寫)
3. 只有普通方法可以重寫
4. 方法重寫的要求
a) 方法名必須一樣
b) 參數列表必須一樣
c) 返回的類型相同或是其子類(即返回值是父類中的一個子類)
d) 訪問權限不能小於父類的訪問權限
e) 靜態方法不能重寫爲非靜態的,非靜態的也不能重寫爲靜態的方法
f)
5. 方法重載與方法重寫的區別


**

Object類

**

  1. Object類
    a) Object是所有類的父類
    b) To String返回的對象信息

  2. Super與this的區別

  3. Object的方法重寫;

  4. 重寫equalss
    a) 默認情況下equalss與==一樣都是比較兩個對象是否一樣
    b) 語法
    i.

  5. 先建立父類,書寫父類的屬性並寫出相應的set get有參和無參方法

  6. 重寫object類(object默認爲所有類的父類)中的equals方法

  7. 比較object的對象與當前對象是否是同一個地址,然後在比較兩個對象是否是同一種類型,在比較兩個對象的屬性是否一樣(或者將object的對象向下轉型爲當前對象的類型在比較兩個對象的屬性是否一樣)一樣返回爲true不一樣返回爲flash

  8. toString()方法重寫
    a) 語法

b) Alt+shift+s鍵選擇to string 系統自動生成重寫tostring的方法
c) Tostring方法的使用
i.
ii. 利用syso進行輸出,輸出的爲對象中的值
iii. 數組不能用tostring進行輸出數組中的值(用arrays進行輸出)
7. instanceof 操作符判斷某一個對象是否是某一個類型


**

靜態

**

  1. 訪問權限控制(只作用當前的範圍內,在範圍之外無法進行訪問)

  2. 訪問控制修飾符
    Public 默認 protected private
    默認情況下什麼都不寫

  3. 類的訪問控制(只有兩種訪問控制來修飾)
    a) Public(公有訪問級別,誰都可以進行訪問)
    i. 在不同的包下面訪問需要導進去相應的包
    b) 默認 (包級私有訪問級別,在本包下可以進行訪問,在其他包中不能進行訪問)

  4. 類成員的訪問控制(四種都可以)

  5. Static修飾符(不屬於訪問修飾符)

  6. 沒有被static修飾的變量爲實例變量,存儲空間爲多個,每一次調用都是在不同的空間上進行,會對其值進場初始化,
    被static修飾的變量稱爲靜態變量(類變量),可以通過類名直接調用,它只有一個存儲的空間,在每一次調用的時候不會對其初始化依舊保留上次賦予的值,
    被static修飾的方法稱爲靜態方法,可以通過類名直接調用方法
    被static修飾的代碼塊稱爲靜態代碼塊

  7. 靜態方法
    a) static靜態方法(靜態方法必須要有大括號,不能在實例方法裏定義靜態變量,只可以在類裏面定義靜態變量)
    b) 靜態方法;不能用this和super,在靜態方法裏不能訪問實例變量和實例方法,只能訪問靜態的方法和變量
    c) 實例方法;通過實例進行訪問,可以訪問靜態變量、靜態方法、實例變量和實例方法,

  8. 靜態塊
    a) 語法書寫

b) 多個靜態塊在一起的時候按順序加載
c) 每一個靜態代碼塊就只會加載一次
Static{ (代碼) }
Static{ (代碼) }


**

多態

**

  1. 多態;同一個引用類型,使用不同的實例而執行不同的操作(多個對象進行操作後呈現多個不同的結果)
  2. 多態的應用
    a) 使用父類作爲方法的形參(主要形式)
    b) 使用父類作爲方法的返回值(另一種主要形式)
  3. 父類引用指向子類對象(向上轉型)
    a) (父類類名)(父類對象)=new(子類類名)
    b)
  4. 方法重寫是實現多態的基礎
  5. 抽象方法(沒有方法體的方法)
    a) Public abstract void pet();
    i. Abstract爲抽象關鍵字,必須寫
    b) 抽象方法在必須要有共同的行爲,卻又沒有去實現的時候才能使用(有共同的行爲方式又不能用父類去統一實現)
  6. 抽象類(有抽象方法的類就是抽象類,抽象類不一定有抽象方法)
    a) 普通方法裏不能寫抽象方法必須改爲抽象類
    b) 普通類改爲抽象類
    i. Public abstract class Pet{ }
    ii. Abstract爲普通類的轉換爲抽象類的關鍵字,必須要有
    c) 抽象類不能被實例化(即不能Pet pet=new Pet())
    i. 在抽象類中不能建立本身的對象,但可以作爲引用類型建立具體子類(子類是普通類的情況下)的對象
    d) 抽象類的子類可以是普通類也可以是抽象類
    i. 在普通子類裏必須要實現(重寫)抽象類中的抽象方法
    ii. 在抽象子類裏可以不實現(重寫)抽象類中的抽象方法
  7. 向上轉型(父類引用指向子類對象)

a) 通過轉型後對象引用的是繼承或覆蓋後的父類方法(也是具體的子類的方法)而不是引用原來父類的方法
b) 轉型後的對象無法再調用子類特有的方法,只能調用父類和子類所公有的方法
8. 向下轉型

a) 通過轉型後父級引用指向子類對象能調用子類中特有的方法(即將父級引用指向子類的對象強制轉換成子類的對象)
b) 利用instanceof進行向下轉換可以降低轉換錯誤,提高運行時的正確率
9. 父類裏面是抽象類的時候,子類不能顯示寫出super方法只能給非抽象的方法
10. 工廠模式
a) 簡單工廠模式(在工廠類中根據用戶傳進來的數據進行生產對應的產品,返回一個抽象產品類型給客戶)一般是寫成static方法(方便在調用時不要創建實例)

i. 工廠類(就是調用者也是生產的生產者)
ii. 抽象商品類(就是對象的父類,客戶返回的類型)、
iii. 具體產品類(就是子類,抽象類的子類)
iv. 客戶(測試類)


**

抽象類

**

  1. 在普通類class前加abstract進行聲明爲抽象類

  2. 抽象方法沒有方法體

  3. 抽象類不能被實例化但可以作爲引用類似進行引用(即父類類型引用指向子類類型)

  4. 抽象類可以沒有抽象方法,有抽象方法一定要是抽象類

  5. 如果子類沒有實現父類的抽象方法,子類必須要是抽象類

  6. 沒有抽象的構造方法,也沒有抽象的靜態方法

  7. 抽象類中可有非抽象類的構造方法,方便子類使用

  8. Main方法必須寫在公共類中,一個類只能有一個public 修飾的類,但可以有多個非public類(寫在public類的外面,有class加類名叫括號表示即( class pet( ){ } ) )公共類名必須與文件名一致

  9. 抽象父類裏有無參構造方法,子類繼承父類,通過父類類型引用子類對象先走父類的構造方法,在走子類的構造方法
    接口(interface)
    (一個對象具有兩種屬性,且兩種屬相不是同一個類)
    系統對外提供的所有服務且用interface修飾的稱爲接口

  10. 功能模塊最小化(儘可能的把所有的相同功能的代碼放在一起,減少代碼的冗餘,加強系統的可擴展性)

  11. 接口;(解決子類要繼承多個父類的方法,而又不能用繼承來完成的時候使用,滿足has - a 的關係)
    a) 寫法;將類的class去掉給成interface,其餘不變(即 public interface Pet)
    i. Interface爲接口關鍵字、Pet爲接口名
    b) 實現接口(public class 類名 interface 接口名)
    i. Interface爲關鍵字不能缺少
    c) 在接口裏面可以寫變量也可以寫方法
    d) 接口裏的方法沒有普通方法,都爲抽象方法且爲公共的抽象方法(可以手動聲明也可以不寫默認爲公共的抽象方法)
    e) 接口中的變量都是靜態的常量(建議手動聲明爲靜態的常量,默認情況下也是靜態的常量)
    f) 接口不能被實例化(一般作爲類型引用即和抽象類一樣)
    g) 實現類(是實現接口的類叫做實現類,是接口叫子接口)必須實現接口的所有方法
    h) 實現類可以實現多個接口(實現接口關鍵字implements 用逗號隔開每一個接口名)

  12. 使用接口
    a) 在測試類中通過父類類型引用指向子類對象(即接口類和實現接口類)的方法進行創建一個對象,通過調用實現接口類的方法來使用接口
    b) 在接口中只能與方法和變量(方法都是抽象方法)
    c) 接口中可以只有變量也可以只有抽象方法
    d) 接口不能有構造方法,不能被實例化
    e) 接口不能實現接口,只有在類中才能實現接口
    f) 接口可以繼承接口,繼承後的接口稱爲複合接口,接口可以多個繼承
    g) 實現接口的類如果是普通類,接口的抽象方法必須實現,除非該類爲抽象類,但在該類的子類中(子類也爲普通類)也必須實現,如果是抽象類可以選擇部分接口中的抽象方法實現,可以不必要實現所有接口中的抽象類
    h) 接口中可以就只有接口名

  13. 接口也被稱爲一種約定

  14. Java裏能在繼承父類的情況下通過接口實現更多的接口類具有的方法功能我們稱爲接口(即實現接口)

  15. 在編寫程序的時候用接口來進行編寫,方便擴展,利於維護(面向接口編程)

  16. 接口不是類型,在不同的類型中可以使用同一個接口,一個類裏只能實現一次同一個接口
    抽象類vs接口
    相同點

    1. 都是在系統的抽象層
    2. 都不能被實例化
    3. 都包含抽象方法(用於提供系統的服務,不必提供具體實現)
      不同點
    4. 在抽象類中可以爲部分方法提供默認實現(實現父類中的方法也就是普通方法),而接口中 只能包含抽象方法和靜態常量
    5. 一個類只能繼承一個父類,但可以有多個接口
    6. 已存在的繼承樹,可以方便抽取接口,但抽取抽象類不容易

**

異常

**

  1. 異常;就是程序中存在的各種沒有預料到的情況,導致程序的錯誤運行錯誤從而導致程序中斷運行
  2. in . hasNextInt ( ) 比較下一個輸入的是不是整數,返回值是布爾類型;一般用於if比較中
  3. system . exit (1 );退出java虛擬機,exit爲退出;括號中的值必須爲非0的正整數
  4. 錯誤流;System . err . printin()輸出錯誤流;括弧內的字體以比較醒目的形式打印出來
  5. 異常處理機制(java提供的錯誤處理能力)
  6. Java中處理異常機制的關鍵字
    a) 捕獲異常
    i. Try執行可能產生異常的代碼(通常與catch一起使用)
    ii. Catch捕獲異常(通常與try一起使用)
    iii. Finally無論是否發生異常代碼總能執行
    b) 聲明異常
    i. Throw手動拋出異常
    c) 拋出異常
    i. Throws聲明方法可能拋出的各種異常
  7. 所有的異常都是Exception類型,在運行中報錯的類型都是Exception的子類,
  8. 異常的書寫規範及語法

a) try – catch捕獲異常
i. 語法public void method(){
try{
代碼塊1
}catch(exception ex){
當代碼塊1發生異常時對代碼塊1 的處理代碼塊2
ex . printStackTrace ( ) ;
}
不在try-catch中的代碼塊3
}

  1. Exception爲錯誤類型,java中所有的錯誤類型都是exception可以更改爲對應錯誤的類型(更改之後能清楚的找到錯誤的原因)
  2. 使用Exception做爲異常的類型好處是沒有漏洞,壞處是不能明確的知道是什麼錯誤
  3. ex爲錯誤對象,可以更改
  4. ex . printStackTrace ( ) ;打印異常堆棧信息(ex爲變量名,printStackTrace爲方法,不可改)告訴發生錯誤的詳細內容
  5. ex . getMessage ( );打印異常的字符串提示(即打印堆棧的一部分信息)放在輸出語句中(不是所有的異常都有字符串提醒)
  6. 代碼詳情

ii. 代碼正常時

  1. 程序進入try中通過運行沒有發現異常,系統不進入catch中,直接進入try-catch後面的代碼中進行執行
    iii. 代碼出現問題

  2. 程序進入try中通過運行發現異常,系統進入catch中,通過對比catch括號中的錯誤類型,類型一致時運行catch中的代碼,然後進入try-catch後面的代碼中進行執行
    iv. 代碼出現異常但捕獲的類型與異常類型不一致時

  3. 程序進入try中通過運行發現異常,系統進入catch中,通過對比catch括號中的錯誤類型,類型不一致,系統中斷(等同於沒有進行異常處理)

  4. 常見異常的類型

  5. try-catch-finally
    a) 語法書寫
    i. 語法public void method(){
    try{
    代碼塊1
    }catch(exception ex){
    當代碼塊1發生異常時對代碼塊1 的處理代碼塊2
    ex . printStackTrace ( ) ;
    }
    不在try-catch中的代碼塊3
    }finally{
    需要釋放的代碼塊4(必須要執行的代碼)
    }
    b) 不管發不發生異常,在finally中的代碼都會被執行(在finally中一般放必須要釋放的資源,如輸入輸出流,數據庫等)
    c) 執行順序
    i. 有異常情況先執行try語句塊中的代碼然後在走catch中的代碼最後走finally中的代碼
    ii. 無異常情況先執行try中的代碼然後進入finally中執行finally的代碼塊
    iii. 存在return的情況下;程序先走try通過對比發生了異常,進入catch進行異常處理,然後進入finally中執行finally中的代碼塊最後返回到catch中(或者try中)執行return語句
    iv. 唯一的不進入finally的情況;在catch語句塊中加入了system . exit ( 1 )時,finally不會被執行,

  6. 多重catch
    a) 語法try { } catch(){ } catch(){ } finally { }
    b) 多重catch使用需要遵循先子類再父類,當程序執行到第一個匹配的類型與catch類型一致的時候結束異常排查,後面的catch語句塊不會被執行

  7. try-catch-finally組合;catch與finally可以不要書寫,但try必須要有且try不能單獨出現

  8. 聲明異常throws
    a) throws可以聲明方法可能拋出的各種異常,多個異常之間用逗號隔開(throws可以聲明多個異常)
    b) throws聲明異常用於當方法無法解決異常時,通過throws把異常拋出,目的是通過調用進行處理或者調用時再進行聲明
    c) Main方法的異常由java虛擬機進行處理
    d) throws聲明的異常可以通過調用方法,然後使用try-catch-finally的組合進行處理,也可以通過在main方法的小括號後面繼續聲明異常交給java虛擬機處理(不推薦使用交給虛擬機處理)

  9. throw拋出異常(真正意義上的拋出異常)
    a) 通過throw進行拋出異常,必須處理或者用throws去聲明其異常(throw只能拋出一個異常)
    b) 書寫throw new (異常類型)( (異常聲明) )

i. 異常聲明的內容爲在處理異常時堆棧後面提示的內容
ii. throw拋出的異常與普通的異常處理一樣
iii. 拋出異常及處理代碼

  1. throw與throws的區別

  2. java的異常體系結構

a) 所有的異常的祖先類是Throwable
i. Throwable分爲兩類

  1. Error(中文意思爲錯誤)
    a) 程序無法恢復的錯誤,嚴重錯誤,通常建議中斷程序
  2. Excoption(程序可以恢復的錯誤,需要進行處理程序,希望程序不會受到錯誤的影響)
    a) Runtime Excoption運行時異常
    i. 有Runtime Excoption異常時,java不會報錯,能通過編譯(java希望避免這類異常)
    b) Checked異常,也稱爲檢查時異常
    i. 有Checked異常時,java會進行報錯,無法通過編譯
  3. 自定義異常
    a) 語法
    i. 定義異常類
    ii. 繼承異常父類Excoption(或者Runtime Excoption)或者祖先類Throwable(不常繼承祖先類,一般繼承父類)
    iii. 編寫自定義異常類的構造方法,繼承父類實現
    iv. 實例化自定義異常對象
    v. 使用throw拋出異常

vi. 捕捉異常並處理
b) 使用自定義異常能更好的反映異常情況,更具體,更針對
18. 異常鏈(當A方法拋出了異常,B方法繼承A方法時,既要A方法的異常,又要B方法的新異常時使用)
19. 異常鏈創建了新的異常但還保留了原有的異常信息(jdk1.4以後的版本纔有 具體實現方法,需要自己去查!)
20. 異常處理規則
a) 異常只能用於非正常的情況下
b) 不要將過於龐大的代碼放在try中
c) 在catch中指定異常類型(實在不知道可以寫exception)
d) 需要對捕獲的異常進行處理

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