在本節中,將了解物件導向(OOP)的基礎知識。物件導向程式設計只是一個模式,它提供許多概念,如繼承,資料系結,多型等等。
Simula
是第一種物件導向的程式設計語言。而一切都可表示為物件的程式設計模式被稱為真正的物件導向的程式設計語言。Smalltalk
是第一個真正的物件導向的程式設計語言。
物件表示真實的單詞實體,如:筆,椅子,表等。物件導向程式設計是一種使用類和物件來設計程式的方法或模式。它通過提供一些概念簡化了軟體開發和維護:
任何具有狀態和行為的實體都稱為物件。例如:椅子,鋼筆,桌子,鍵盤,自行車等。它可以是物理和邏輯的。
物件的集合稱為類,它是一個邏輯實體。
當一個物件獲取父物件的所有屬性和行為時,稱為繼承。它提供程式碼可重用性,它用於實現執行時多型性。
繼承是物件導向的程式設計概念,一個物件基於另一個物件構建。繼承是程式碼重用的機制, 被繼承的類稱為超類,繼承超類的類稱為子類。
在java中使用extends
關鍵字來實現繼承。下面是java中繼承的一個簡單範例。
class SuperClassA {
public void foo(){
System.out.println("SuperClassA");
}
}
// 繼承 SuperClassA 類
class SubClassB extends SuperClassA{
public void bar(){
System.out.println("SubClassB");
}
}
public class Test {
public static void main(String args[]){
SubClassB a = new SubClassB();
a.foo();
a.bar();
}
}
當一個任務通過不同的方式執行時,稱為多型性。例如:以不同的方式說服客戶,畫一些東西,如:形狀或矩形等。在java中,使用方法過載和方法重寫來實現多型性。另一個例子是說話,人說人話,貓說話可以是:「喵喵」,而狗說話可能是「旺旺」等,說話時表示和聲音也不太一樣。
參考以下程式碼 -
public class Circle {
public void draw(){
System.out.println("繪製圓形,預設顏色為黑色,直徑為1厘米。");
}
public void draw(int diameter){
System.out.println("繪製圓形,預設顏色為黑色,直徑為 "+diameter+" 釐米。");
}
public void draw(int diameter, String color){
System.out.println("繪製圓形,顏色為 "+color+" ,直徑為 "+diameter+" 釐米。");
}
}
這裡有多種draw()
方法,它們都有不同的行為。這是方法過載的一種情況,因為所有方法名稱都相同且引數不同。這裡編譯器將能夠識別在編譯時呼叫的方法,因此這也稱為編譯時多型。
當在物件之間具有「IS-A」關係時,實現執行時多型性。這也稱為方法重寫,因為子類必須覆蓋超類方法。
如果在超類中,實際的實現類是在執行時決定的。編譯器無法決定將呼叫哪個類方法。此決定在執行時完成,因此這也叫作執行時多型或動態方法分派。
方法重寫範例
類:Shape.java
public interface Shape {
public void draw();
}
類:Circle.java
public class Circle implements Shape{
@Override
public void draw(){
System.out.println("繪製圓形");
}
}
*類:Square.java*
public class Square implements Shape {
@Override
public void draw() {
System.out.println("繪製長方形");
}
}
Shape
是超類,它有兩個子類Circle
和Square
,下面是執行時多型性的範例。
類:PolymorphismTest.java
public class PolymorphismTest {
public static void main(String args[]){
Shape sh = new Circle();
sh.draw();
Shape sh1 = getShape(); //一些確定形狀的第三方邏輯
sh1.draw();
}
}
在上面的範例中,java編譯器不知道在執行時使用的是哪個Shape
的實現類,因此執行時多型性。
隱藏內部細節和顯示功能稱為抽象。例如:電話,但我們不知道內部是如何處理通話/通訊的。
抽象是隱藏內部細節和用簡單的術語描述事物的概念。例如,新增兩個整數的方法。該方法的內部處理對外界是隱藏的。有許多方法可以在物件導向的程式中實現抽象,例如封裝和繼承。
Java程式也是抽象的一個很好的例子。這裡java負責將簡單語句轉換為機器語言,並隱藏外部世界的內部實現細節。
將程式碼和資料系結(或包裝)在一起成為單個單元稱為封裝。例如:膠囊,它包裹著不同的藥物。
一個java類是封裝的例子。Java bean是完全封裝的類,因為所有的資料成員在這裡是私有的。
封裝是用於在物件導向程式設計中實現抽象的技術。封裝用於對類成員和方法的存取限制。
存取修飾符關鍵字用於物件導向程式設計中的封裝。例如,java中的封裝是使用private
,protected
和public
關鍵字實現的。
組合是聚合的特例。組合是一種更具限制性的聚合形式。當「HAS-A」關係中包含的物件不能獨立存在時,那就是組合的情況。例如,房子裡有房間。沒有房子,這裡的房間不可能存在。
OOP使開發和維護變得更容易,因為在程序導向的程式設計語言中,如果程式碼隨著專案規模的增長而增長,則不容易管理。
OOP提供資料隱藏,而在程序導向的程式設計語言中,可以從任何地方存取全域性資料。
OOP提供更有效地模擬真實世界事件的能力。如果使用物件導向的程式設計語言,我們可以提供真實世界裡的問題的解決方案。