java筆記3-面向物件
目錄
資料封裝
方法封裝了訪問例項欄位的邏輯
例項欄位修飾符:
- public:外部程式碼可以訪問該欄位
- private:外部程式碼無法訪問該欄位
方法修飾符:
- public:外部程式碼可以訪問該方法
- private:外部程式碼無法訪問該方法
方法是一組執行語句,遇到return返回
void表示不返回任何值(注意區分null)
方法命名規範
方法內部的隱式變數this
構造方法
構造方法Constructor
構造方法可以在new操作時初始化例項物件
構造方法名就是類名
構造方法沒有返回值
編譯器會為沒有定義構造方法的類自動生成預設構造方法
初始化順序:
- 1. 初始化欄位
- 2. 執行構造方法程式碼
可以定義多個構造方法,編譯器根據引數自動判斷使用哪個
可以在一個構造方法中通過this()呼叫另一個構造方法
方法過載
指方法名相同,但引數不同:
- 型別不同
- 數量不同
方法過載的目的是方便呼叫
過載方法應該完成相同的功能
不要去交換引數順序
過載方法返回值型別應該相同
繼承
繼承 In
繼承是面向物件程式設計的程式碼複用方式
Java使用extends繼承
被繼承類:超類,父類,基類 繼承類:子類,派生類
Java只允許繼承一個類
Object是所有類的根類
protected修飾的欄位和方法可以被子類訪問
super表示父類
沒有呼叫super()時編譯器會自動生成super()語句
如果父類沒有預設構造方法就必須顯示呼叫super()
向上轉型與向下轉型 Upcasting Downcasting
子類型別可以安全地向上轉型為父類型別
父類型別可以強制向下轉型為子類型別(可能報錯ClassCastException)
Person p=new Person();
Student s=(Student)p;//ClassCastException
可以用instanceof判斷型別
Person p=new Student();
if(p instanceof Student){
Student s=(Student) p;
}
多型
多型 Polymorphic
方法覆寫:子類覆寫父類的方法,Override
多型:
針對某個型別的方法呼叫,其真正執行的方法取決於執行時實際型別的方法
對某個型別呼叫方法,執行的方法可能是某個子類的覆寫方法
允許新增更多型別的子類來擴充套件功能
final
用final修飾的方法不能被Override
用final修飾的類不能被繼承
用final修飾的欄位初始化後不能重新賦值
抽象類
抽象類 Abstract Class
抽象方法:用abstract定義了方法簽名,但沒有語句
含有抽象方法的類稱為抽象類
抽象類的作用:
- 被繼承
- 強迫子類實現抽象方法
- 抽象方法相當於定義“規範”
面向抽象程式設計的本質:
- 上層程式碼只定義規範
- 不需要子類即可編譯
- 具體邏輯由不同子類實現,呼叫者不關心
介面
介面 interface
使用interface宣告一個介面,介面只有抽象方法
實現interface使用implements
一個class可以實現多個interface
介面:
- 不能定義例項欄位
- 不能定義普通方法
- 可以定義default方法
一個介面可以extends另一個介面,相當於擴充套件介面方法
介面層次代表抽象程度
介面也是資料型別,適用於向上轉型和向下轉型
靜態欄位和方法
靜態欄位和方法
用static修飾的欄位:靜態欄位,屬於class不屬於例項
訪問靜態欄位使用:類名.靜態欄位 不推薦使用例項變數.靜態欄位
用static修飾的方法:靜態方法,屬於class不屬於例項
訪問靜態方法使用:類名.靜態方法 不推薦使用例項變數.靜態方法
靜態方法不能訪問this變數,但可以訪問靜態欄位
靜態方法常用於工具類和輔助方法
包 Package
package用於解決類名衝突:
Java完整類名=包名+類名 JVM只看完整類名 編譯器編譯後的class只含完整類名
包可以有多層結構 包沒有父子關係
包作用域
位於同一個包的類,可以訪問包作用域的欄位和方法:
不用public、protected、private修飾的欄位和方法就是包作用域。
引用其他類的方法
使用完整類名 先import,再使用類名
static import可以匯入一個類的靜態欄位和靜態方法,很少使用
查詢class
編譯器查詢class完整類名的步驟:
- 1. 根據完整類名查詢
- 2. 查詢當前package
- 3. 查詢import的class
- 4. 查詢java.lang的class
- 5. 編譯錯誤
作用域
訪問許可權
訪問許可權指一個類內部,能否引用另一個類以及它的欄位和方法
訪問許可權有public、protected、private和package四種
final不是訪問許可權
最佳實踐:最小化暴露對外方法
public
定義為public的class,interface可以被其他類訪問
private
定義為private的field,method無法被其他類訪問
private訪問許可權限定在class的內部,與方法宣告順序無關
定義在一個class內部的class稱為內部類(inner class)
protected
protected作用與繼承關係
定義為protected的欄位和方法可以被子類訪問
package
包作用域是指一個類允許訪問同一個package的:
- 沒有public,private修飾的class
- 沒有public,protected,private修飾的欄位和方法
- 包名必須完全一致
區域性變數
方法內部定義的變數是區域性變數(包括方法引數名)
區域性變數作用域由所在語句塊{...}決定
classpath和jar
classpath
classpath是環境變數,指示JVM如何搜尋class,路徑和作業系統相關
classpath設定方法:
- 在系統環境中設定(不推薦)
- 啟動JVM時用-classpath或-cp設定(推薦)
Eclipse自動傳入當前工程bin目錄作為classpath
jar
jar包是zip格式的壓縮檔案,包含若干class檔案
jar包相當於目錄
使用jar包來避免大量目錄和class檔案
建立jar包:
- JDK的jar命令
- Maven等工具
- 壓縮為zip然後改名為jar
jar包可以有一個特殊的/META-INF/MANIFEST.MF檔案來指定Main-Class