Java面向對象(OOP)概念
在本節中,將瞭解面向對象(OOP)的基礎知識。面向對象編程只是一個模式,它提供許多概念,如繼承,數據綁定,多態等等。
Simula
是第一種面向對象的編程語言。而一切都可表示爲對象的編程模式被稱爲真正的面向對象的編程語言。Smalltalk
是第一個真正的面向對象的編程語言。
1. 面向對象編程
對象表示真實的單詞實體,如:筆,椅子,表等。面向對象編程是一種使用類和對象來設計程序的方法或模式。它通過提供一些概念簡化了軟件開發和維護:
- 對象
- 類
- 繼承
- 多態性
- 抽象
- 封裝
- 組合
1.1. 對象
任何具有狀態和行爲的實體都稱爲對象。例如:椅子,鋼筆,桌子,鍵盤,自行車等。它可以是物理和邏輯的。
1.2. 類
對象的集合稱爲類,它是一個邏輯實體。
1.3. 繼承
當一個對象獲取父對象的所有屬性和行爲時,稱爲繼承。它提供代碼可重用性,它用於實現運行時多態性。
繼承是面向對象的編程概念,一個對象基於另一個對象構建。繼承是代碼重用的機制, 被繼承的類稱爲超類,繼承超類的類稱爲子類。
在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();
}
}
1.4. 多態性
當一個任務通過不同的方式執行時,稱爲多態性。例如:以不同的方式說服客戶,畫一些東西,如:形狀或矩形等。在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
的實現類,因此運行時多態性。
1.5. 抽象
隱藏內部細節和顯示功能稱爲抽象。例如:電話,但我們不知道內部是如何處理通話/通信的。
抽象是隱藏內部細節和用簡單的術語描述事物的概念。例如,添加兩個整數的方法。該方法的內部處理對外界是隱藏的。有許多方法可以在面向對象的程序中實現抽象,例如封裝和繼承。
Java程序也是抽象的一個很好的例子。這裏java負責將簡單語句轉換爲機器語言,並隱藏外部世界的內部實現細節。
1.6. 封裝
將代碼和數據綁定(或包裝)在一起成爲單個單元稱爲封裝。例如:膠囊,它包裹着不同的藥物。
一個java類是封裝的例子。Java bean是完全封裝的類,因爲所有的數據成員在這裏是私有的。
封裝是用於在面向對象編程中實現抽象的技術。封裝用於對類成員和方法的訪問限制。
訪問修飾符關鍵字用於面向對象編程中的封裝。例如,java中的封裝是使用private
,protected
和public
關鍵字實現的。
1.7. 組合
組合是聚合的特例。組合是一種更具限制性的聚合形式。當「HAS-A」關係中包含的對象不能獨立存在時,那就是組合的情況。例如,房子裏有房間。沒有房子,這裏的房間不可能存在。
2. 面向對象編程的優點
OOP使開發和維護變得更容易,因爲在面向過程的編程語言中,如果代碼隨着項目規模的增長而增長,則不容易管理。
OOP提供數據隱藏,而在面向過程的編程語言中,可以從任何地方訪問全局數據。
OOP提供更有效地模擬真實世界事件的能力。如果使用面向對象的編程語言,我們可以提供真實世界裏的問題的解決方案。