標籤:特徵 print img src bsp 命名法 簡化 初始化 pre
Java物件導向類
具有相同屬性和方法的一系列對象的集合,是對對象的一個描述。類的內部包括屬性和方法兩個部分。
類是建立對象的一個模板。
命名規範:帕斯卡命名法類的聲明:
class Dog{ //屬性 private String name; private int age; private float height; //構造方法 public Dog() { } public Dog(String name, int age, float height) { super(); this.name = name; this.age = age; this.height = height; } //方法 public void eat() { System.out.println("這隻狗會吃飯..."); } //Getter & Setter public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public float getHeight() { return height; } public void setHeight(float height) { this.height = height; } }屬性
一般情況下,所有屬性設定為private(只能在本類進行訪問)
屬性是對對象特徵的一個描述。在描述對象時,不需要對對象的所有特徵都進行描述,只需用到什麼就描述什麼。
方法
方法包括五部分:限定詞+傳回值類型+方法名+參數+方法體
方法在定義時的參數為形參,只起到佔位作用。形參是一個局部變數,範圍僅僅限於方法體內有效,出了方法體,便被銷毀。
方法在被調用的時候傳入的參數稱為實參,它的值被賦給形參,通過形參參與方法體中的運算。這種值的傳遞是單向的,只有從實參傳遞給形參,方法執行完畢之後,形參的值並不會被傳遞給實參。
方法重載
- 方法名相同
- 方法參數列表不同
- 與傳回值和限定修飾符無關
- 發生在同一個類當中
public class Calc{ //被重載的方法 public int add(int num1, int num2) { return num1+num2; } //參數列表不同,方法名相同 public int add(int num1, int num2, int num3) { return add(num1, num2)+num3; } //參數名與傳回值都不同,方法名相同 public float add(float num1, float num2) { return num1+num2; } }構造方法
每個類都有自己的構造方法。如果沒有顯式地為類定義構造方法,Java編譯器將會為該類提供一個預設的無參構造方法。
構造方法的幾個特點:
- 方法名與類名相同
- 沒有傳回值
- 建立對象時自動被調用
- 一個類至少有一個到多個構造方法
對象
對象是系統中用來描述客觀事物的一個實體,它是構成系統的一個基本單位。一個對象由一組屬性和對這組屬性進行操作的一組服務組成。
對象是類所描述的一個實體,是類的一個執行個體化。
建立對象
- 聲明:聲明一個對象,包括對象名、物件類型、
- 執行個體化:使用關鍵字new來建立一個對象
- 初始化:使用new建立對象時,會調用建構函式來對對象進行初始化
樣本:
//調用無參構造方法執行個體化對象Dog dog1 = new Dog();//調用帶參構造方法執行個體化對象,同時對對象進行初始化Dog dog2 = new Dog("大黃", 2, 12.9f);訪問對象
由於對象的屬性被設定為私人的,所以只能通過set和get方法來訪問。
通過已建立的對象來訪問成員變數和成員方法,如下所示:
Dog dog2 = new Dog("大黃", 2, 12.9f);System.out.println("狗的名字是:"+dog2.getName());System.out.println("狗的年齡是:"+dog2.getAge()+"歲");System.out.println("狗的體重是:"+dog2.getHeight()+"kg");
列印結果如下:
狗的名字是:大黃狗的年齡是:2歲狗的體重是:12.9kg
物件導向基本特徵
物件導向的特點
- 一種常見的思想,符合人們的思考習慣
- 將複雜問題簡單化
- 從執行者變為指揮者
設計過程
設計的原則:關注所需要的屬性和方法
Java 封裝優點:
- 良好的封裝可以減少耦合
- 類內部結構可以自由修改
- 可以對成員變數進行更精確的控制
- 隱藏資訊,實現細節
存取權限
一般情況下,將屬性值全部設定為private,通過set和get方法來對屬性進行訪問:
public class Person{ private String name; private int age;? public int getAge(){ return age; }? public String getName(){ return name; }? public void setAge(int age){ this.age = age; }? public void setName(String name){ this.name = name; }}
將類的某些資訊隱藏在類內部,不允許外部程式直接存取,而是通過該類提供的方法實現對隱藏資訊的訪問和操作。
Java 繼承
繼承就是子類繼承父類的特徵和行為,使得子類對象(執行個體)具有父類的執行個體域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。同時,子類可以在父類的基礎上進行擴充,加入自己專屬的屬性和方法。
- Java中通過extends關鍵字來表明一個類與其父類的繼承關係
- 子類將會繼承父類除私人以外所有的屬性和方法(個人認為私人的仍然被繼承,但是由於範圍的原因無法被使用)
- 子類可以在父類的基礎上進行擴充
- 繼承關係中方法的執行順序:先從子類中尋找該方法,如果在子類中找不到該方法則再去父類中尋找
- Java中屬於單繼承,一個子類只能擁有一個父類,一個父類可以擁有N個子類
- 構造方法不能也無需被繼承,因為在調用子類的構造方法時會預設先調用父類的構造方法
- 繼承的初始化順序:父類構造方法 --> 父類屬性初始化 --> 子類構造方法 -->子類屬性初始化
- Java中super關鍵字代表父類,子類中可以使用super來調用父類的共有屬性和方法
- Java中this關鍵字代表當前類,通過this關鍵字可訪問本類中所有屬性和方法
class Animals{ private String name; //父類構造方法 public Animals(String name) { this.name = name; } public void eat() { System.out.println("動物吃東西"); }}class Dogs extends Animals{ //子類構造方法。父類沒有無參構造方法,子類執行個體化時必須調用父類構造方法 public Dogs(String name) { super(name); } public void run() { System.out.println("狗會跑"); }}
上面例子中,Animals為父類,而Dogs作為子類。
Animals中只有一個Animals(String name)的構造方法。子類構造方法中,如果沒有使用super來調用父類構造方法,編譯器會預設調用一個super()的方法,但由於父類中不存在這個構造方法,所以編譯器會報錯。此時要求我們調用父類唯一的帶參構造方法。
子類構造方法中必須且只能一次地調用父類的構造方法,並且位置是在構造方法所有操作之前。
run方法是Dogs類在Animals類的基礎上所進行的擴充,eat方法將在Dogs類中被繼承。
繼承後對Dogs對象的使用樣本:
Dogs dogs = new Dogs("大黃");dogs.eat();dogs.run();
列印結果如下:
動物吃東西狗會跑
方法的重寫
子類中可以對從父類繼承的方法進行重寫(Alt+Shift+s, v),重寫後子類對象在調用時會優先調用子類中被重寫的方法
class Dogs extends Animals{ public Dogs(String name) { super(name); } //對父類方法進行重寫,通過@verride標識 @Override public void eat() { System.out.println("狗會吃骨頭"); }}
這裡調用dogs.eat()方法時,會列印“狗會吃骨頭”,而不是“動物吃東西”。
super、this關鍵字
super代表的是父類,this代表的是本類
class Dogs extends Animals{ public Dogs(String name) { super(name); } @Override public void eat() { System.out.println("狗會吃骨頭"); } public void animalEat() { super.eat(); this.eat(); }}
調用animalEat方法後列印的結果為:
動物吃東西狗會吃骨頭
final關鍵字
final,意為最後的,最終的。
- 被final修飾的類不能被繼承
- 被final修飾的方法不能被重寫
- 被final修飾的屬性被能被修改(常量)
繼承與組合的區別
B extends A : 從邏輯上來說,是 “B is a A” 的關係。例如狗繼承自動物,說明狗是一種動物;衣服繼承自商品,說明衣服是一種商品。
組合:是一種 “A has B” 的關係。在一個類中,可以用別的對象來作為自己的屬性。例如人有名字,而這個名字本身是一個String類型的對象,我們可以同過它來描述一個人。
Java 多態
- 多態即父類的引用執行子類對象
- 多態必須建立在繼承的基礎上(對介面的實現上)
- 多態中方法調用時現在子類尋找該方法,沒有找到則再去父類中尋找
所為多態,即多種形態。
多態是同一個行為具有多個不同表現形式或形態的能力。
比如說兩台印表機,一台為黑白印表機,一台為彩色印表機。當我們使用黑白印表機時,它將給我們列印黑白的材料,而使用彩色印表機時列印的卻是彩色的。
abstract class Printer { //父類的列印方法 public abstract void print();}class BWPrinter extends Printer { @Override public void print() { System.out.println("列印了一份黑白材料"); }}class ColorfulPrinter extends Printer { @Override public void print() { System.out.println("列印了一份彩色材料"); }}public class Main { public static void print(Printer printer) { printer.print(); } public static void main(String[] args) { BWPrinter bwPrinter = new BWPrinter(); ColorfulPrinter colorfulPrinter = new ColorfulPrinter(); //使用黑白印表機進行列印 print(bwPrinter); //使用彩色印表機進行列印 print(colorfulPrinter); }}
列印結果為:
列印了一份黑白材料列印了一份彩色材料
多態的優點
- 消除類型之間的耦合
- 可替換性
- 可擴充性
- 介面性
- 靈活性
- 簡化性
多態存在的三個必要條件
第5篇 Java物件導向