(1)、多型:可以理解為事物存在的多種體現形式。 例如:
人:男人、女人。 動物:貓、狗。
eg:
貓 x = new 貓 () ;
動物 x = new 貓 () ;
(2)、特徵
輸出結果:
吃魚
吃骨頭吃魚
吃骨頭飼料
吃魚
前例中的 animal a = new cat(); 我們稱為型別提公升,也叫向上轉型。
如果想要呼叫貓的特有方法時,如何操作? 強制將父類的引用,轉成子類型別,稱作向下轉型。 例如:
cat c = (cat) a ;
c.catchmouse;
但如果這樣的話,錯誤:
animal a = new animal();
cat c = (cat) a;
千萬不要出現以上這樣的操作,就是將父類物件轉成子類型別,我們能轉換的是父類應用指向了自己的子類物件時,該應用可以被提公升,也可以被強制轉換,多型自始至終都是子類物件在做著變化。
eg:
class fu
void method_2()
}class zi extends fu
void method_3()
}class duotaidemo4
}
在多型中成員函式的特點:
(1)在編譯時期:參閱引用型變數所屬的類中是否有呼叫的方法,如果有,編譯通過,如果沒有編譯失敗。
(2)在執行時期:在參閱物件所閱的類中是否有呼叫的方法。
簡單總結就是:成員函式在多型呼叫時,編譯看左邊,執行看右邊。
另乙個例子:
class fu
class zi extends fu
class duotaidemo4
}
輸出結果:
5
8
在多型中,成員變數的特點:無論編譯和執行,都參看左邊(引用型變數所屬的類)
例:
class fu
}class zi extends fu
}class duotaidemo4
}
程式結果:
fu method_1
zi method_1
實際小應用
/*
* 需求:
* 電腦執行示例。電腦執行基於主機板*/
//未運用多型機制編寫的**,即未改善的**
class mainboard //主機板
public void usenetcard(netcard c) //主機板上的功能,使用網絡卡(網絡卡插入)
}class netcard //網絡卡
public void close() //關閉網絡卡
}class duotaidemo5
}
程式輸出結果:
mainboard run
netcard open
netcard close
但以上**類與類之間耦合性太強。實際中電腦主機板與各硬體之間聯絡的藕帶還有乙個關鍵的介面(pci),如圖:
改善後的**: eg:
inte***ce pci //pci介面
class mainboard //主機板類
public void usepci(pci p) //pci p = new newcard(); 這是介面型引用指向自己的子類物件
}}class netcard implements pci //網絡卡實現pci介面
public void close() //功能覆蓋,關閉網絡卡
}class soundcard implements pci //音效卡實現pci介面
public void close() //功能覆蓋,關閉音效卡
}class duotaidemo5
}
程式結果:
mainboard run!
netcard open!
netcard close!
soundcard open!
soundcard close!
/*
*需求:資料庫的操作
*1、連線資料庫。jdbc、hibernate
*2、運算元據庫:creat、read、update、delete
*3、關閉資料庫連線。
* */
class userinfobyjdbc
public void delete(user user)
}class dboperate
通過觀察以上的偽**我們可以發現問題:若我們不想用jdbc連線資料庫,而是hibernate連線,那麼我們又要定義乙個新的userinfobyhibernate類,麻煩,這樣設計程式耦合性太強,沒考慮到程式的擴充套件性。
如圖:
然而,我們考慮一種新的方法來解決程式類之間的耦合性差問題,增加程式的擴充套件性。 我們引用乙個dao(date access object)方法,如圖:
以下是偽**: eg:
inte***ce userinfodao
class userinfobyjdbc implements userinfodao
class userinfobyhibernate implements userinfodao
class dboperate
}
object類:是所有物件的直接或者間接父類,傳說中的上帝,該類中定義的肯定是所有物件都具備的功能。
eg:
class demo //extends object
class objectdemo
}
程式結果:false
object類中已經提供了對物件是否相同的比較方法equal (),如果自定義類中也有比較相同的功能,沒有必要重新定義, 只要沿襲父類中的功能,建立自己特有比較內容即可,也就是覆蓋。 eg:
class demo
public boolean equals(object obj) //複寫
else
}}class person
class objectdemo
}
程式結果:
true
false
Java基礎 物件導向
1.理解物件導向 強調的是功能行為 將功能封裝進物件,強調具備了功能的物件。1.1 物件導向的好處 先要去找具有所需的功能的物件來用。如果該物件不存在,那麼建立乙個具有所需功能的物件。這樣簡化開發並提高復用。1.2 物件導向開發,設計,特徵 開發的過程 其實就是不斷的建立物件,使用物件,指揮物件做事...
java基礎 物件導向
面向過程的思想 一步一步去實現,而具體的每一步都需要我們去實現和操作,這些步驟相互協作完成我們的需求 面向思想 將步驟和功能進行封裝,用的時候,找對應的類 物件導向不關注過程 物件導向就相當於指揮者 面向過程相當於員工 物件導向是基於面向過程 特點 是一種更符合人們思考習慣的思想。可以將複雜的事情簡...
Java基礎 物件導向
可以拿生活中的例項來理解面向過程與物件導向,例如五子棋。封裝 encapsulation 繼承 inheritance 多型 polymorphism 1.定義 隱藏物件的屬性和實現細節,僅對外公開介面,控制在程式中屬性的讀取和修改的訪問級別。2.封裝途徑4.好處3.原則4.成員變數和區域性變數 成...