1. 程式人生 > >Java面向物件:封裝、繼承、多型

Java面向物件:封裝、繼承、多型

    為什麼要面向物件程式設計?

以前開發的過程通常是採用面向過程程式設計,面向過程是以過程為中心來進行程式設計設計,本質上是分析出需要哪些過程,在程式設計時一步步的對其實現,但是隨著軟體規模的擴大,這種面向過程的設計模式已經越來越不適應如此大規模的軟體。面向過程存在著諸多的缺點比如:
    1.軟體重用性差
重用性是指同一事物不經修改或稍加修改就可多次重複使用的性質。軟體重用性是軟體工程追求的目標之一。
    2.軟體可維護性差
軟體工程強調軟體的可維護性,強調文件資料的重要性,規定最終的軟體產品應該由完整、一致的配置成分組成。在軟體開發過程中,始終強調軟體的可讀性、可修改性和可測試性是軟體的重要的質量指標。實踐證明,用傳統方法開發出來的軟體,維護時其費用和成本仍然很高,其原因是可修改性差,維護困難,導致可維護性差。
    3.不能滿足使用者需要
    用傳統的結構化方法開發大型軟體系統涉及各種不同領域的知識,在開發需求模糊或需求動態變化的系統時,所開發出的軟體系統往往不能真正滿足使用者的需要。

舉例說明:將大象放進冰箱分幾步?三步:開啟冰箱、把大象放進去、關上冰箱

對於面向過程:

public class Test {

	// 1. 開啟冰箱
	public static void openFridge()
	{
		System.out.println("第一步:將冰箱門開啟!");
	}
	// 2. 開啟冰箱
	public static void putElepantIntoFridge()
	{
		System.out.println("第二步:將大象放進冰箱!");
	}
	// 3. 開啟冰箱
	public static void closeFridge()
	{
		System.out.println("將冰箱門關上!");
	}
	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		openFridge();
		putElepantIntoFridge();
		closeFridge();
	}

}
        面向物件的實現方式:
public class Test {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		// 冰箱物件
		Fridge fridge = new Fridge();
		fridge.setFridgeName("fridge");
		// 大象物件
		Elephant elephant = new Elephant();
		elephant.setElepantName("elephant");
		
		fridge.openTheDoor();
		fridge.putin(elephant);
		fridge.closeTheDoor();
	}
}

class Fridge
{
	private String fridgeName;

	public void openTheDoor()
	{
		System.out.println(this.fridgeName + "開啟門!");
	}
	public void closeTheDoor()
	{
		System.out.println(this.fridgeName + "關閉門!");
	}
	public void putin(Elephant elephant)
	{
		System.out.println(elephant.getElepantName()+"放進來了!");
	}
	
	public String getFridgeName() {
		return fridgeName;
	}

	public void setFridgeName(String fridgeName) {
		this.fridgeName = fridgeName;
	}
}
class Elephant
{
	private String elepantName;

	public String getElepantName() {
		return elepantName;
	}

	public void setElepantName(String elepantName) {
		this.elepantName = elepantName;
	}
}



什麼是面向物件?

面向物件的分析根據抽象關鍵的問題域來分解系統。面向物件的設計是一種提供符號設計系統的面向物件的實現過程,它用非常接近實際領域術語的方法把系統構造成“現實世界”的物件。面向物件程式設計可以看作一種在程式中包含各種獨立而又互相呼叫的物件的思想,這與傳統的思想剛好相反:傳統的程式設計主張將程式看作一系列函式的集合,或者直接就是一系列對電腦下達的指令。面向物件程式設計中的每一個物件都應該能夠接受資料、處理資料並將資料傳達給其它物件,因此它們都可以被看作一個小型的“機器”,即物件。

萬事萬物皆物件,這符合我們日常生活的認知,對於一個人來說,人會包含一些屬性,比如說:年齡、姓名、性別等等,那麼這樣的一個人我們要對他進行描述的話,就是將他作為一個整體,而這個整體本身又包含了上述所說的諸多的一些屬性,那麼我們把這個整體可以看做是物件,當然這在程式中是一個類,那麼這個整合的過程就是封裝。

面向物件與基於物件的區別?

面向物件三個特徵:封裝、繼承、多型。而基於物件的特徵是封裝,沒有實現繼承和多型。(沒有實現繼承那麼多型也就無從談起了,因為多型是建立在繼承的基礎上的。)區分這兩者的關鍵就是去看到底有沒有繼承和多型。有很多技術都是基於物件的,他們只是使用封裝好的物件,呼叫其中的方法,設定物件的屬性。比如我們web開發過程中會經常用到bean類,這個一般的是基於物件的,但是當你實現繼承之後那就是面向物件了。

面向物件的重要特性:封裝

封裝是把過程和資料包圍起來,對資料的訪問只能通過已定義的介面。面向物件計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的物件,這些物件通過一個受保護的介面訪問其他物件。封裝是一種資訊隱藏技術,在java中通過關鍵字private實現封裝。什麼是封裝?封裝把物件的所有組成部分組合在一起,封裝定義程式如何引用物件的資料,封裝實際上使用方法將類的資料隱藏起來,控制使用者對類的修改和訪問資料的程度。

那麼,有些剛剛學習或者外行的人會問,我為什麼要封裝?你看我這些屬性直接使用public的我就可以直接訪問了,而且程式碼還很少,寫起來很簡單的呀。那麼我要問一下,你的這個類是不是其他的任何人對裡面的任何的屬性值都可以任意的修改了對嗎?當然是對的。如果你作為這個類的角度去想,我的東西憑什麼你就想用就用,這個屬性是我的,作為一個類而言,我覺得我有許可權去管管的呀對吧。再者呢,就是說我們通過封裝的話可以在這些類中設定屬性值的時候進行檢測,控制一部分的傳入的屬性值使其符合標準的形式。

面向物件的重要特性:繼承與多型

 繼承是面向物件最顯著的一個特性。繼承是從已有的類中派生出新的類,新的類能吸收已有類的資料屬性和行為,並能擴充套件新的能力。Java繼承是使用已存在的類的定義作為基礎建立新類的技術,新類的定義可以增加新的資料或新的功能,也可以用父類的功能,但不能選擇性地繼承父類。這種技術使得複用以前的程式碼非常容易,能夠大大縮短開發週期,降低開發費用。比如可以先定義一個類叫車,車有以下屬性:車體大小,顏色,方向盤,輪胎,而又由車這個類派生出轎車和卡車兩個類,為轎車新增一個小後備箱,而為卡車新增一個大貨箱。

(1)繼承關係是傳遞的。若類C繼承類B,類B繼承類A(多繼承),則類C既有從類B那裡繼承下來的屬性與方法,也有從類A那裡繼承下來的屬性與方法,還可以有自己新定義的屬性和方法。繼承來的屬性和方法儘管是隱式的,但仍是類C的屬性和方法。繼承是在一些比較一般的類的基礎上構造、建立和擴充新類的最有效的手段。

(2)繼承簡化了人們對事物的認識和描述,能清晰體現相關類間的層次結構關係。

(3)繼承提供了軟體複用功能。若類B繼承類A,那麼建立類B時只需要再描述與基類(類A)不同的少量特徵(資料成員和成員方法)即可。這種做法能減小程式碼和資料的冗餘度,大大增加程式的重用性。

(4)繼承通過增強一致性來減少模組間的介面和介面,大大增加了程式的易維護性。

(5)提供多重繼承機制。從理論上說,一個類可以是多個一般類的特殊類,它可以從多個一般類中繼承屬性與方法,這便是多重繼承。Java出於安全性和可靠性的考慮,僅支援單重繼承,而通過使用介面機制來實現多重繼承。

 多型的好處:

1.可替換性(substitutability)。多型對已存在程式碼具有可替換性。例如,多型對圓Circle類工作,對其他任何圓形幾何體,如圓環,也同樣工作。

2.可擴充性(extensibility)。多型對程式碼具有可擴充性。增加新的子類不影響已存在類的多型性、繼承性,以及其他特性的執行和操作。實際上新加子類更容易獲得多型功能。例如,在實現了圓錐、半圓錐以及半球體的多型基礎上,很容易增添球體類的多型性。

3.介面性(interface-ability)。多型是超類通過方法簽名,向子類提供了一個共同介面,由子類來完善或者覆蓋它而實現的。

4.靈活性(flexibility)。它在應用中體現了靈活多樣的操作,提高了使用效率。

5.簡化性(simplicity)。多型簡化對應用軟體的程式碼編寫和修改過程,尤其在處理大量物件的運算和操作時,這個特點尤為突出和重要。

舉例說明:

public class Test2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Man man = new Man();
		man.setPersonName("陽仔");
		man.setPersonSex("男");
		man.setHeight("64");
		man.eat();// 輸出的是:吃月餅
		System.out.println(man.toString());
	}

}
class Person
{
	private String personName;
	private String personSex;
	
	public void eat()
	{
		System.out.println("eat food!");
	}
	
	public String getPersonName() {
		return personName;
	}
	public void setPersonName(String personName) {
		this.personName = personName;
	}
	public String getPersonSex() {
		return personSex;
	}
	public void setPersonSex(String personSex) {
		this.personSex = personSex;
	}
}
class Man extends Person
{
	private String Height;

	public String getHeight() {
		return Height;
	}

	public void setHeight(String height) {
		Height = height;
	}
	public void eat()
	{
		System.out.println("吃月餅");
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return  "姓名:" + this.getPersonName() + ",性別:" + this.getPersonSex() + ",身高:" + this.Height;
	}
	
}