對象Object
對象有2個特征:「狀态state和行為behavior」。我們可以用真實世界的對象來做類比,這樣有助于了解面向對象程式設計,比如狗的狀态(名字、顔色、品種)和行為(叫、抓、搖尾巴),自行車的狀态(目前檔位、目前踏闆節奏、目前速度)和行為(切換檔位、切換踏闆節奏、踩刹車)。
軟體對象也是由狀态和行為組成:
狀态,在軟體對象中,叫做字段fields,或變量variables。
行為,在軟體對象中,叫做方法methods,或函數functions。
所謂的資料封裝data encapsulation,就是字段隻在内部,不對外暴露,僅由方法進行操作,對象與對象之間通過方法來互相通路。
Java是「純粹的」面向對象程式設計語言。
類Class
類,可以視為對象的「模版」,基于類來創造出同一類對象。
比如自行車的類:
class Bicycle {
int cadence = 0;
int speed = 0;
int gear = 1;
void changeCadence(int newValue) {
cadence = newValue;
}
void changeGear(int newValue) {
gear = newValue;
}
void speedUp(int increment) {
speed = speed + increment;
}
void applyBrakes(int decrement) {
speed = speed - decrement;
}
void printStates() {
System.out.println("cadence:" +
cadence + " speed:" +
speed + " gear:" + gear);
}
}
類也是有2個特征:字段和方法。比如Bicycle類有字段cadence、speed、gear和方法changeCadence()、changeGear()、speedUp()等。
你可能會發現這個類裡面沒有main方法,因為Bicycle類隻是定義了對象的模版,可以建立一個類來實作Bicycle類對象的建立和使用:
class BicycleDemo {
public static void main(String[] args) {
// Create two different
// Bicycle objects
Bicycle bike1 = new Bicycle();
Bicycle bike2 = new Bicycle();
// Invoke methods on
// those objects
bike1.changeCadence(50);
bike1.speedUp(10);
bike1.changeGear(2);
bike1.printStates();
bike2.changeCadence(50);
bike2.speedUp(10);
bike2.changeGear(2);
bike2.changeCadence(40);
bike2.speedUp(10);
bike2.changeGear(3);
bike2.printStates();
}
}
運作輸出:
cadence:50 speed:10 gear:2
cadence:40 speed:20 gear:3
繼承Inheritance
自行車有很多種,自行車的共同點可以用父類來表示,自行車的不同點可以用子類「繼承」父類,然後添加自己的差異點:
圖中的Bicycle是父類,MountainBike、RoadBike和TandemBike是子類。父類的字段和方法會同步給所有的子類,而子類可以繼續添加自己的字段和方法。
繼承使用
extends
來定義:
class MountainBike extends Bicycle {
// new fields and methods defining
// a mountain bike would go here
}
Java的子類隻能有1個父類,但是父類可以有無限多個子類。
接口Interface
就像電視機開關一樣,你跟電視機互動,隻需要按開關就可以,電視機暴露出來的是方法。接口就是一組方法,隻有方法聲明,沒有具體實作。比如:
interface Bicycle {
// wheel revolutions per minute
void changeCadence(int newValue);
void changeGear(int newValue);
void speedUp(int increment);
void applyBrakes(int decrement);
}
類使用
implements
來實作接口方法:
class ACMEBicycle implements Bicycle {
int cadence = 0;
int speed = 0;
int gear = 1;
// The compiler will now require that methods
// changeCadence, changeGear, speedUp, and applyBrakes
// all be implemented. Compilation will fail if those
// methods are missing from this class.
void changeCadence(int newValue) {
cadence = newValue;
}
void changeGear(int newValue) {
gear = newValue;
}
void speedUp(int increment) {
speed = speed + increment;
}
void applyBrakes(int decrement) {
speed = speed - decrement;
}
void printStates() {
System.out.println("cadence:" +
cadence + " speed:" +
speed + " gear:" + gear);
}
}
Java為什麼要發明接口呢?我們知道對象與對象隻能通過方法來互相通路,而接口其實就是一種「契約」,編譯器會在編譯時強制執行這份契約。就像文章的大綱一樣。
實作接口的類,必須實作接口中的所有方法。
包Package
包相當于檔案夾,用來組織接口和類。
Java API,也叫做Java類庫,内置了很多包:
https://docs.oracle.com/javase/8/docs/api/index.html
包清單:
包裡面的接口、類:
❝
參考資料:
Objects, Classes, Interfaces, Packages, and Inheritance https://dev.java/learn/oop/
❞