1. 程式人生 > >java筆記3-面向物件

java筆記3-面向物件

目錄

 

資料封裝

構造方法

方法過載

繼承

多型

抽象類

介面

靜態欄位和方法

包 Package

作用域

classpath和jar


資料封裝

方法封裝了訪問例項欄位的邏輯
例項欄位修飾符:

  • 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