java-物件導向(二),java-物件導向
這幾天正在看HeadFirst的時候,突然覺得物件導向的幾個特點,有點理解模糊不清,所以在這再次回顧一下,加深印象。
上篇部落格(http://blog.csdn.net/u010539352/article/details/39500455)中已經講解了3個物件導向的特點,下面講解剩下的。
多態:如果一個人想養一個寵物,想養狗就養一條狗,想養一隻貓就養一隻貓,該怎麼實現?那就用到了多態,可以隨機切換,不改動“人”這個類中的代碼,具有動態和靈活性。下面舉例:
class Animal { private String name; Animal(String name) {this.name = name;} public void enjoy(){ System.out.println("叫聲......"); }} class Cat extends Animal { private String eyesColor; Cat(String n,String c) {super(n); eyesColor = c;} public void enjoy() { System.out.println("貓叫聲......"); }}class Dog extends Animal { private String furColor; Dog(String n,String c) {super(n); furColor = c;} public void enjoy() { System.out.println("狗叫聲......"); }}class Lady { private String name; private Animal pet; //定義了一隻父類寵物,這樣可以是狗寵物,也可以是貓寵物,具有動態性,最靈活 Lady(String name,Animal pet) { this.name = name; this.pet = pet; } public void myPetEnjoy(){pet.enjoy();}}public class Test { public static void main(String args[]){ Cat c = new Cat("catname","blue"); Dog d = new Dog("dogname","black"); Lady l1 = new Lady("l1",c); Lady l2 = new Lady("l2",d); l1.myPetEnjoy(); //多態,實際New出來的對象的方法,所以是貓的enjoy()方法 l2.myPetEnjoy(); //狗的enjoy()方法 }} 顯示結果:
解釋:運行期間New出來那個對象,我們就調用誰的方法。運行期間我們New出來的是狗和貓的enjoy方法,所以調用的是貓和狗的enjoy方法。具有動態性。所以運行出來就是女孩養的貓高興了,所以貓的enjoy方法就運行了,結果:貓叫聲…..女孩養的狗高興了,所以貓的enjoy方法就運行了,結果:狗叫聲…..現在如果再加一個鳥,不用改變原來的代碼,直接添加一個類就可以,可擴充性。
總結如下:當使用多態方式調用方法時,首先檢查父類中是否有該方法,如果沒有則編譯錯誤,如果有再去調用子類的該同名的方法。所以多態必須具備3個條件:要有繼承,要有重寫,父類引用指向子類對象。
從多態例子可以看出,父類的enjoy方法沒有必要實現,因為子類必須要進行重寫,父類寫了還有點多餘,所以就用到了抽象。
抽象:用abstract關鍵字修飾。下面舉例:
abstract class Animal { //抽象類別 private String name; Animal(String name) {this.name = name;} public abstract void enjoy(); //抽象方法,只有定義沒有實現。} class Cat extends Animal { private String eyesColor; Cat(String n,String c) {super(n); eyesColor = c;} public void enjoy() { System.out.println("貓叫聲......"); }}class Dog extends Animal { private String furColor; Dog(String n,String c) {super(n); furColor = c;} public void enjoy() { System.out.println("狗叫聲......"); }}class Lady { private String name; private Animal pet; Lady(String name,Animal pet) { this.name = name; this.pet = pet; } public void myPetEnjoy(){pet.enjoy();}}public class Test { public static void main(String args[]){ Cat c = new Cat("catname","blue"); Dog d = new Dog("dogname","black"); Lady l1 = new Lady("l1",c); Lady l2 = new Lady("l2",d); l1.myPetEnjoy(); l2.myPetEnjoy(); }}
解釋:可以看出來帶有abstract關鍵字的類被定義為了抽象類別,方法被定義為了抽象方法。只有定義沒有實現。在子類中實現。
所以,抽象類別必須被繼承,抽象方法必須被重寫。
上面講了繼承,重寫,抽象,多態,用這幾個的結合體可以實現很完美的編程,但是美中不足的是Java裡不能實現多繼承,這裡我們就用到了介面。
介面:是一種特殊的抽象類別,只包含常量和方法的定義,沒有變數和方法的實現。。幾個不相關的類可以實現同一個介面。一個類可以實現多個介面。相當於多繼承。舉例:
interface Animal { //介面類public void call(); }interface Animal1 { //介面類public void run();}class Dog implements Animal { //狗類實現介面private String name;Dog(String name) {this.name = name;}public void call() { //實現了介面方法System.out.println("狗叫聲......");}public String getName() {return name;}public void run() { //實現了介面方法System.out.println("狗跑......");}}class Cat implements Animal { //貓類實現介面private String name;Cat(String name) {this.name = name;}public void call() { //實現了介面方法System.out.println("貓叫聲......");}public String getName() {return name;}public void run() { //實現了介面方法System.out.println("貓跑......");}}public class Interface { public static void main(String args[]){ Cat c = new Cat("cat"); Dog d = new Dog("dog"); c.call(); c.run(); d.call(); d.run(); }}顯示結果:
解釋:在介面類中沒有寫方法的實現,但是普通類必須對介面所有的方法進行重寫。
總結:重寫必須要有繼承。
多態必須要有繼承和重寫。
抽象必須要有繼承和重寫。用抽象來實現多態。
介面必須要有實現。
這樣總結一遍,思路一下子清晰多了。多多總結沒有壞處。
Java中的物件導向是什?
面對對象就是:
把資料及對資料的操作方法放在一起,作為一個相互依存的整體——對象。對同類對象抽象出其共性,形成類。類中的大多數資料,只能用本類的方法進行處理。類通過一個簡單的外部介面與外界發生關係,對象與對象之間通過訊息進行通訊。程式流程由使用者在使用中決定。
對象即為人對各種具體物體抽象後的一個概念,人們每天都要接觸各種各樣的對象,如手機就是一個對象。
在物件導向的編程方式中,對象擁有多種特性,如手機有高度、寬度、厚度、顏色、重量等特性,這些特性被稱為對象的屬性。對象還有很多功能,如手機可以聽音樂、打電話、發資訊、看電影等工作功能,這些功能被稱為對象的方法,實際上這些方法是一種函數。而對象又不是孤立的,是有父子關係的,如手機屬於電子產品,電子產品屬於物體等,這種父子關係稱為對象的繼承性。在編程中,把所有的問題看做對象,以人的思維方式解決。這種方式非常人性化,對象實際上就是一組資料的集合,並且資料都已經命名。這些資料根據就是對象的屬性,可以被程式訪問。對象還包括很多函數,這些函數被稱為對象的方法,也可以被程式訪問。不過在外部存取對象內的屬性或方法,必須先引用對象,然後用點號訪問對象的屬性和方法
面向過程就是:
自頂向下順序執行,逐步求精;其程式結構是按功能劃分為若干個基本模組,這些模組形成一個樹狀結構;各模組之間的關係儘可能簡單,在功能上相對獨立;每一模組內部均是由順序、選擇和迴圈三種基本結構組成;其模組化實現的具體方法是使用子程式。程式流程在寫程式時就已決定。
Java物件導向到底是為何?
面向過程、物件導向是電腦在解決實際問題時的兩種不同的思考方式
面向過程通俗的說就是第一步幹什麼,第二步幹什麼。。。最終目的是讓每一步變得高效,
物件導向就是第一部分幹什麼,第二部分幹什麼。。。最終目的是是把問題劃分為若干個對象,具體怎麼實現並不關心
算一個圓的面積,首先定義變數,然後寫計算方法,輸出結果。這就是面向過程的思想,而物件導向就是定義一個對象圓,它提供了一個方法計算面積