天天看點

Java官方筆記2面向對象程式設計基本概念

對象Object

對象有2個特征:「狀态state和行為behavior」。我們可以用真實世界的對象來做類比,這樣有助于了解面向對象程式設計,比如狗的狀态(名字、顔色、品種)和行為(叫、抓、搖尾巴),自行車的狀态(目前檔位、目前踏闆節奏、目前速度)和行為(切換檔位、切換踏闆節奏、踩刹車)。

軟體對象也是由狀态和行為組成:

Java官方筆記2面向對象程式設計基本概念

狀态,在軟體對象中,叫做字段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

自行車有很多種,自行車的共同點可以用父類來表示,自行車的不同點可以用子類「繼承」父類,然後添加自己的差異點:

Java官方筆記2面向對象程式設計基本概念

圖中的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

包清單:

Java官方筆記2面向對象程式設計基本概念

包裡面的接口、類:

參考資料:

Objects, Classes, Interfaces, Packages, and Inheritance https://dev.java/learn/oop/