久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

面向?qū)ο螅嫦驅(qū)ο笳娴碾y嗎,,你只不過沒有理清思路而已)

 精品唯居 2021-08-06

面向?qū)ο笳娴碾y嗎,?其實我看不然,,只不過我們學習的時候比較雜論,,并且也沒有真正領(lǐng)悟到他內(nèi)部的強大,。那么開始進入正題,,眾所周知面向?qū)ο笕蟾拍睿悍庋b,,繼承,多態(tài),。封裝中又可以實現(xiàn)構(gòu)造方法,,方法的重載。繼承又體現(xiàn)出方法的重寫,,從而演變出abstract(抽象類)和interface(接口),,而從繼承中保留出來的代碼的泄露問題又演變出final和static,最后體現(xiàn)出多態(tài),。從這一句話中,,我們會發(fā)現(xiàn)原來我們學過的面向?qū)ο笏且粋€環(huán)環(huán)相扣的過程。(小編之前對面向?qū)ο笠彩抢斫獾牟皇翘貏e的糊涂,,自從聽了一位北京的大佬講過之后,,發(fā)現(xiàn)面向?qū)ο笃鋵嵅]有想象中那么難,希望可以幫助大家)

這是我畫的一張面向?qū)ο笏葑儓D:

 

                                                                          

由此我們來一步一步的學習面向?qū)ο?/p>

 

1.封裝

      1)   封裝其實面向?qū)ο笾袘撌亲詈唵蔚囊徊糠?,get和set方法,,但是封裝到底是什么呢,講一個例子,,我們都有手機,,我們只需要知道他能干嗎,,能拍照打電話,上網(wǎng),,不需要知道這個手機是哪個廠家生產(chǎn)的,,

也不需要手機金屬殼是在哪個工廠鍛造出來的,,這就是封裝,。

概念: 封裝,隱藏對外內(nèi)容,,不許外部直接去操作,,必須都在我們控制之下以普通類,把成員變量私有化,,改成private要訪問這個屬性或者設(shè)置這個屬性怎么辦呢,?提供gettersetter方法。

 

public class Person {
private Integer Id;
private String Name;
private Boolean Sex;

public Integer getId() {
return Id;
}

public void setId(Integer id) {
Id = id;
}

public String getName() {
return Name;
}

public void setName(String name) {
Name = name;
}

public Boolean getSex() {
return Sex;
}

public void setSex(Boolean sex) {
Sex = sex;
}

}

 這個就是一個簡單的封裝,,這些其實大家應該都不陌生,。也不算是難點。那我們等一會去調(diào)用這個類,,現(xiàn)在問題來了,,既然這個對象有這些屬性,對象是不是也能干一些事情啊,,比如說人說sayhello方法,,那么我們就在封裝下邊寫一個sayhello方法。

public void sayhello(Integer id,String name,Boolean sex) {
this.Id=id;
this.Name=name;
this.Sex=sex;
System.out.println("大家好,,我叫" + Name + "我的編號是" + Id); }

  這時候我們就可以做一個測試類去調(diào)用他這個類了吧,,這時候我們就在新建一個類

public class TestPerson {
public static void main(String[] args) {
Person person =new Person();
person.sayhello(007, "渣渣輝", true);
}
}

  這里呢輸出的時候我們加上性別的屬性,在項目開發(fā)中,,性別屬性通常都是用boolean類型去定義,,上邊的輸出我要是加上sex屬性,它輸出的就是一個boolean類型的值,,那么我們完全可以在上邊定義一個字符串,,在進行if判斷把,根據(jù)真假值把性別

給字符串,,然后在對字符串進行輸出就可以吧,。

String ssex;
if(Sex){
ssex="男";
}else ssex="女";

  其實這些都是簡單的封裝和調(diào)用方法,并沒有難點,,下面我們介紹構(gòu)造方法

 2)構(gòu)造方法:什么是類:屬性+方法+構(gòu)造方法 ,,利用這個方法來創(chuàng)建對象,如果沒有創(chuàng)建java.exe會 進行優(yōu)化,,簡單的理解為就是編譯器自動給我們這個類增加了一個構(gòu)造方法,。創(chuàng)建類時,,會自動調(diào)用默認構(gòu)造方法

                              (所有的類創(chuàng)建必須通過構(gòu)造方法)那我們就根據(jù)上邊person類對他寫一個構(gòu)造方法:

public class Person {
private Integer Id;
private String Name;
private Boolean Sex;

public Person() {

}

public Integer getId() {
return Id;
}

  注意:底下的代碼我沒有加上(節(jié)省空間),只需要知道在哪里創(chuàng)建就行(默認的構(gòu)造方法創(chuàng)建的位置),。

構(gòu)造方法規(guī)定:必須和類名一致

上邊的我創(chuàng)建的就是一個默認的無參構(gòu)造方法,既然有無參的構(gòu)造方法,,那就有有參數(shù)的構(gòu)造方法

 

 

public class Person {
    private Integer Id;
    private String Name;
    private Boolean Sex;

    public Person() {
        System.out.println("這里是無參構(gòu)造");
    }
    
    public Person(Integer id,String name){
        System.out.println("帶參數(shù)的構(gòu)造方法,進行初始化");
        this.Id=id;
        this.Name=name;
    }

    public Integer getId() {
        return Id;
    }

    public void setId(Integer id) {
        Id = id;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public Boolean getSex() {
        return Sex;
    }

    public void setSex(Boolean sex) {
        Sex = sex;
    }

    public void sayhello(Integer id, String name, Boolean sex) {
        this.Id = id;
        this.Name = name;
        this.Sex = sex;
        System.out.println("大家好,,我叫" + Name + "我的編號是" + Id);
    }

}
public class TestPerson {
public static void main(String[] args) {
    Person person =new Person();
    person.sayhello(007, "渣渣輝", true);
    Person person1=new Person(007,"古天樂");
}
}

 

 

這里是無參構(gòu)造
大家好,,我叫渣渣輝我的編號是7
帶參數(shù)的構(gòu)造方法,進行初始化

  

 那上邊就是兩個構(gòu)造方法,,一個是默認的一個是我們后來自己定義的,,在測試類里邊我們進行調(diào)用可看見person1就是調(diào)用的帶參數(shù)的構(gòu)造方法,而在上邊的帶參數(shù)的構(gòu)造方法中我并沒有輸出出傳過去的值,。如果想輸出值,,可以再構(gòu)造方法里邊加上你要輸出的

輸出語句就可以了。那么我們既然可以定義兩個參數(shù)的構(gòu)造方法,,那我們可不可以定義一個,,或者三個參數(shù)的構(gòu)造方法呢,這個是完全可以的,。

    public Person() {
        System.out.println("這里是無參構(gòu)造");
    }
    
    public Person(Integer id,String name,Boolean sex){
        System.out.println("帶參數(shù)的構(gòu)造方法,,進行初始化");
        this.Id=id;
        this.Name=name;
    }
    public Person(Integer id,String name){
        System.out.println("帶參數(shù)的構(gòu)造方法,進行初始化");
        this.Id=id;
        this.Name=name;
    }
    public Person(Integer id){
        System.out.println("帶參數(shù)的構(gòu)造方法,,進行初始化");
        this.Id=id;
    }

 

 這個就是三個帶參數(shù)的構(gòu)造方法和一個不帶參數(shù)的構(gòu)造方法,,其實到這里你已經(jīng)把封裝中重載已經(jīng)學完了,當我們定義構(gòu)造方法時,,每一個構(gòu)造方法的參數(shù)個數(shù)不一樣的時候,,我們就成他為重載。

 

重載,,方法名稱相同,,參數(shù)個數(shù)不同
public Person() {}
public Person(Integer id) {}
public Person(Integer id, String name) {}

 

 

 2.繼承:

              什么是繼承呢,我們之前理解的時候都是兒子繼承父親的屬性,,這個說法其實我感覺不能體現(xiàn)程序,,下面我來分享下我對繼承的另一種理解,在封裝中我們看到了方法的調(diào)用就是sayhello方法,,那么現(xiàn)實生活中,,比如動物,不可能就一個動物會叫,,會吃,,但是會有一些屬性不同,

例如老虎和老鷹,,他們兩個都可以叫,,都吃肉類,,但是他們的行走的方式不同,一個是奔跑,,一個是飛,。那他們兩個是不是有共同的屬性啊,吃和叫,,如果在我們開發(fā)過程中以一百個共同的屬性,,我們難道就要每個類都寫一百個嗎,就算每個類寫了一百了,,后期維護的時候加入要修改,,

難道我們還一個一個的修改嗎,我們?yōu)槭裁床粚懸粋€類定義這些他們共有的方法,,讓老虎和老鷹兩個類去連接他,去他那里拿那些方法呢,,這樣不就節(jié)省了大量的時間和空間嗎,。那么就演變出來了繼承 extends 。

n面我們就來創(chuàng)建老虎和鷹這兩個類,,和他們共有的吃的一個特性類,,和一個測試類。

 

 

 首先是老虎和鷹兩個公用類的共有特性

public class Animal {
 public void eat() {
   System.out.println("吃");
}
}

 

其次是老虎和鷹的行動方式類:這里我們可以看到在建立tiger類后我們在tiger類后邊加上了我們繼承關(guān)鍵字extends ,,在extends在加上要繼承的類,,這樣我們就能把被繼承的類的方法拿過來用了。但是并不在這里體現(xiàn),,要在我們建立測試類

后再測試類里邊調(diào)用

public class Tiger extends Animal {
    public void run(){
        System.out.println("跑");
    }
}

 

 

public class Eagle extends Animal {
public void fly(){
    System.out.println("飛");
}
}

 

 下面就是我們的測試類:這里我們可以看待雖然我們tiger中沒有eat這個方法,,但是因為我們繼承了Animal類,Animal中的類我們就可以拿來用了,,并沒有報錯,,證明這種方法時完全可以行的通的

public class test {
public static void main(String[] args) {
    Tiger tiger =new Tiger();
    Eagle eagle =new Eagle();
    tiger.eat();
    tiger.run();
    eagle.eat();
    eagle.fly();
    
}
}

 

 這是我們的運行結(jié)果:

吃
跑
吃
飛

補充:在我們面向?qū)ο笾校绻阏{(diào)用一個類,,對他做toString操作,,默認的是不是打印的地址啊,但是如果我們在聲明變量時,,在source上選擇添加一個tostring,,我們在去執(zhí)行toString是不是打印的就不是地址了,而是你的屬性,,那么其實這個就是一個重寫toString方法,。

 

 

 那在我們實際的項目中經(jīng)常呢有些系統(tǒng)會二次開發(fā),新增加一些功能或者對之前的某一個功能進行修改,,就假如我們上邊父類中定義的吃的方法,,我現(xiàn)在進行二次開發(fā),,我要修改,對吃進行更細化的變更,,老鷹吃兔子,,

老虎吃肉呢不變,這時候就演變出了我們的重寫,。其實能重寫是非常簡單只需要重寫父類中的方法,,這時候能輸出的東西會以子類中的方法進行優(yōu)先輸出。

這時候我們開始對老鷹類進行重寫eat方法

public class Eagle extends Animal {
public void fly(){
    System.out.println("飛");
}
public void eat() {
    System.out.println("我是重寫父類的eat()方法,,我是老鷹我吃兔子");
}
}

這時候我們測試代碼不變在執(zhí)行測試

吃
跑
我是重寫父類的eat()方法,,我是老鷹我吃兔子
飛

這個時候我們和上邊對比就發(fā)現(xiàn)eat在老鷹類中輸出的參數(shù)就變了。這就是我們重寫父類的方法,,對父類進行覆蓋,,下面對繼承我們來在練習一個,眾所周知java但是單繼承機制,,子類繼承父類之后,,那么我們父類可不可以在繼承一個類呢,這樣就解決了我們

java單繼承機制,,我用一張圖來解釋一下

兒子繼承父親的,,那么父親繼承爺爺?shù)模敲催@樣我門是不是就可以拿到了爺爺?shù)膶傩粤?。那么我們就根?jù)這個來寫一個例子,。

要求:爺爺:在北京有一套房子,爺爺今年80歲了 

           父親:有一輛寶馬車

            兒子:啥也沒有,,我只有玩

顯然可見,,爺爺有兩個屬性,父親這里只有一個屬性,,然后我們兒子繼承他們,,拿到他們的屬性,房子和車子,,但是爺爺有一個屬性是年齡八十歲了,,難道我們那了爺爺?shù)姆孔樱鸵兂砂耸畾q嗎,,顯然是不能的,,那么就要我們重寫爺爺?shù)哪挲g的方法

public class Son extends Father {
public void play() {
    System.out.println("我啥都沒有,我只會玩");
}

}
public class Father extends Grandfa {
     public void Car() {
         System.out.println("我有一輛寶馬車");
     } 

}
public class Grandfa {
    public void house() {
        System.out.println("我在北京二環(huán)有一套四合院");
    }
    public void Age() {
        System.out.println("我今年八十歲了");
    }
}
public class PersonTest {
    public static void main(String[] args) {
        Son son =new Son();
        son.play();
        son.Car();
        son.house();
        son.Age();
    }

}
我啥都沒有,,我只會玩
我有一輛寶馬車
我在北京二環(huán)有一套四合院
我今年八十歲了

那么現(xiàn)在我們可以看到兒子拿到了父親和爺爺?shù)乃械膶傩?,但是又一條是年齡,那豈不是兒子也變成了八十歲,那么解決這個問題有兩種方法,,第一種,,我們重寫這個年齡的方法就可以了,第二種,,我們直接將他定義成私有的,,不讓你兒子訪問,你調(diào)用不了

我年齡的屬性是不是就可以了,。那么這兩種方法我都演示一下:

        A:重寫年齡方法:那們我們直接在年齡上重寫就可以了,,其他的方法是不是不用動啊。

public class Son extends Father {
    public void play() {
        System.out.println("我啥都沒有,,我只會玩");
    }

    public void Age() {
        System.out.println("我是兒子,,但是我今年才二十歲");
    }
}

這時候我們再來執(zhí)行測試類:

我啥都沒有,我只會玩
我有一輛寶馬車
我在北京二環(huán)有一套四合院
我是兒子,,但是我今年才二十歲

唉,,年齡是不是就變過來了。這就是我們重寫父類的父類的方法,,接下來演示第二種

B:將Age定義成私有:這時候我們只需要改變父類的Age方法就可以了

                  這時候我是不是就像Age方法從public公用的改成了私有的private,,然后我們在把兒子中年齡方法刪除(千萬別忘記這一步哦!?。。?/strong>

public class Grandfa {
    public void house() {
        System.out.println("我在北京二環(huán)有一套四合院");
    }
    private void Age() {
        System.out.println("我今年八十歲了");
    }
}

這時候我們清楚的看見當son調(diào)用Age方法時報錯了,。這樣第二種方法我們就演示完成了,。

 那么接下來就出現(xiàn)一個問題,我怎么知道,,哪個是父類,,哪個是子類呢,即使我子類繼承了父類,,但是在某一個父類的方法我就是想調(diào)用它,,我不想要調(diào)用子類重寫的方法,這個時候怎么辦呢,,這個java.exe其實早就為我們準備好了,,就是下邊要說的super關(guān)鍵字。super關(guān)鍵字可能在大家之前學的時候,,老師舉一些構(gòu)造的方法來驗證他,,但是這次,我用一個方法的方式去驗證super關(guān)鍵字,。請看下邊例子,。

        定義一個類 ,里邊寫一個show方法。

public class father {
    public  String show(String name){
        System.out.println("父類"+name);
        return name;
    }

}

再寫一個子類去繼承父類重寫父類的show方法,,ex是我寫的一個調(diào)用的方法,。

public class Son extends father {
    public String show(String name){
        System.out.println("子類:"+name);
        return name;
    }
public void ex(){
    show("兒子");
    
    
}
public static void main(String[] args) {
    Son son =new Son();
    son.ex();
}
}

我們來運行程序,這時候系統(tǒng)默認調(diào)用的是子類重寫父類的show方法,。

子類:兒子

現(xiàn)在正式來說明我們的問題,,我們不想調(diào)用子類的show方法,調(diào)用父類的show方法:

public class Son extends father {
    public String show(String name){
        System.out.println("子類:"+name);
        return name;
    }
public void ex(){
    show("兒子");
    super.show("父親");
    
}
public static void main(String[] args) {
    Son son =new Son();
    son.ex();
}
}

只需要在show方法前邊加上我們的關(guān)鍵字super,,我們看下程序的運行結(jié)果:

子類:兒子
父類:父親

     繼承是非常好的,,但是也有不好的地方,破壞父類結(jié)構(gòu),,父類中暴露公用,,可以通過子類重寫父類方法,惡意代碼,。

那么現(xiàn)在又出現(xiàn)一個問題:我想規(guī)定繼承方法必須子類去實現(xiàn),。(

舉例:就好比說在我們工作中,我們都會有一個小組長,,小組長在收到上邊的項目后,,安排組員做東西,做一塊是不是就是一個方法啊,,現(xiàn)在我們的小組長規(guī)定是我的組員,,你就必須把這個活給我干

了。那么就演變出我們的抽象類抽象類,。

首先我們創(chuàng)建抽象類,,抽象類的關(guān)鍵字abstract,(抽象類定義:抽象方法必須在抽象類中,,抽象類中可以沒有抽象方法       學過的人自然就理解,,如果沒有學過的也不用著急,下邊我們會具體的體現(xiàn))

 

這是我定義的抽象類 在public后邊加上abstract,,這樣我們這個類就是抽象類(或者在創(chuàng)建項目的時候選擇創(chuàng)建抽象類) abstract這個關(guān)鍵字放在public前后都是可以的,,都不會報錯,只不過默認的是放在public后邊的

下邊的代碼我加上之后如果你放到編譯器中,,在project2哪里就會給你報錯,,為什么報錯呢?我們看一下 :鼠標放上去后提示英文的意思為,,將這個peoject2方法加上 abstract,,如果我們不加abstract的方法是不是就是普通的方法

加上abstract 就變成了抽象方法了, 

 

public abstract class Group {
    public void peoject1(){
        System.out.println("項目一比較重要,,我是組長我來干");
    }
    public abstract  void project2(); }

那么到現(xiàn)在我們還不足以驗證上邊抽象的結(jié)論:下面我們講Group方法的修飾詞abstract關(guān)鍵字去掉:

 

我們看見又報錯了,,這時候我們的方法中是不是有一個抽象方法?。簆roject2 ,我們把鼠標放在Group上選擇第一個系統(tǒng)提示的,,整個程序就會恢復正常了

這樣就驗證我們的抽象類的定義,,抽象方法必須定義在抽象類中

下面來進行我們的操作,做抽象,,所謂抽象只不過是一種定義,,他的主要規(guī)則是,我在抽象類中定義的抽象方法,,子類必須實現(xiàn),,大家呢不要把他想的太過復雜,他其實也是一個父類,,只不過加上來規(guī)范

下面我們來創(chuàng)建一個類來繼承我們得抽象類,。

現(xiàn)在我們看,我這個組員這個類怎么又報錯了呢,,鼠標放在紅線上選擇第一個,,哎,系統(tǒng)是不是幫我們創(chuàng)建了一個方法啊,。哎這個方法的名字是不是就是和我繼承的父類的抽象方法一樣啊,,這樣就體現(xiàn)了我們的抽象類了

定義的抽象方法,子類必須去實現(xiàn),。

 

public class Crew extends Group{

    @Override
    public void project2() {
        System.out.println("我是組員,,我干簡單的活");
        
    }

}

下面是測試類和輸出的結(jié)果

public class Test {
    public static void main(String[] args) {
        Crew crew =new Crew();
        crew.project2();
    }
}
我是組員,我干簡單的活

 

現(xiàn)在問題又來了,,抽象類是不是里邊有可以自己的方法,,就好比我們上邊的例子,小組長是不是也有自己的活啊,,那么現(xiàn)在我的要求變了,我現(xiàn)在是項目經(jīng)理,,我就啥也不相干,,我就管分配任務,哎,,我們的接口就這里演變出來了

接口是一種變相的繼承,,繼承定義父類,讓子類去繼承,,接口是我們定義一個接口,,讓其他的類去接入他。

首先我們創(chuàng)建接口的時候就不是創(chuàng)建類了,,在選擇創(chuàng)建的時候在與class下邊第二個會有一個interface詞,,我們選擇這個創(chuàng)建我們的接口:現(xiàn)在我是項目經(jīng)理,我定制了一個項目,我讓我的組員去做,;

public interface manager {
    public void pro1();

    public void pro2();

    public void pro3();
}

 

 下面我們?nèi)ソ尤虢涌冢?/p>

 定義一個員工類,,那么我們接入的時候就用到我們的關(guān)鍵字了implement,我們接入后會發(fā)現(xiàn),,哎又報錯了,,我們說接口是從抽象類演變過來的,是實現(xiàn)我項目經(jīng)理規(guī)定項目,,組員去實現(xiàn)項目的過程,,

我們把鼠標放在紅線上選擇第一個,這樣就不錯了,,讓我的實現(xiàn)類去必須去實現(xiàn)這些方法

public class Crew implements manager {

    @Override
    public void pro1() {
        System.out.println("做的是項目1");

    }

    @Override
    public void pro2() {
        System.out.println("做的是項目2");
    }

    @Override
    public void pro3() {
        System.out.println("做的是項目3");
    }

}

 

 

這樣之后我們建立測試類:哎,,我們發(fā)現(xiàn)又報錯了,這個時候我們先不看報錯信息,,我們看你調(diào)用的是manager,,manager接口他里邊只有一些方法,并沒有實現(xiàn)這些方法,,就是說,,項目并不是項目經(jīng)理做的,而是他的手下做的,。

那么怎么解決呢:講我們后邊new的后邊不去newmanager,,我去new真正實現(xiàn)這些項目的類啊:

public class test {
    public static void main(String[] args) {
          manager m =new Crew();
    }
}

 

這樣之后我是不是就不報錯了,,然后我們在去調(diào)用那些方法:

public class test {
    public static void main(String[] args) {
          manager m =new Crew();
          m.pro1();
          m.pro2();
          m.pro3();
    }
}
做的是項目1
做的是項目2
做的是項目3

 

這就是我們的接口實現(xiàn),。

在我們現(xiàn)實中,經(jīng)常會有一些項目會二次的開發(fā),,那么之前呢,,美國發(fā)生過一個案件,在銀行,,有一個程序員在給銀行的系統(tǒng)做開發(fā)之后,,做了一些修改,什么修改呢,,每個用戶存錢之后都會給他這個程序員的賬戶轉(zhuǎn)賬一美分,,那我們知道一美分并不多,

但是有無數(shù)的人在往銀行存錢啊,,這樣他就獲取了當量錢財,,那么他在開發(fā)的時候,是不是就是重寫了系統(tǒng)的加密算法啊,,這樣子類的方法就覆蓋了父類的方法,,這樣就實現(xiàn)了給他賺錢的目的,,那么我們?yōu)榱朔乐惯@種現(xiàn)象的發(fā)生,我想定義一個一個類

我讓一些方法可以去讓子類重寫,,一些加密的類我不讓你去重寫,,或者整個類我都不讓你去繼承,這時候就演變出來我們的final關(guān)鍵來,,final關(guān)鍵字,,不允許去繼承和重寫。

我現(xiàn)在就把上邊繼承的案例爺爺,,父親和兒子的案例做了一下修改,,我吧Grandfa類加上final ,哎我們看父親的類和兒子的類還有測試類都報錯了,,一旦定義了是不是就不讓他們繼承了,,那測試調(diào)用爺爺?shù)姆椒ㄊ遣皇且簿筒怀闪⒘耍?/p>

 

 

 

3.多態(tài)

       多態(tài)是面向?qū)ο笾凶铍y的一塊,為什么難呢,,小編之前也是在CSDN,,博客園上看了眾多的案例,是當時的案例理解了,,但是我感覺別人問我,,多態(tài)是什么,我還是回答不上來,,為什么會這樣,,你這個案例你雖然懂了,但是多態(tài)的本質(zhì)你并沒有理解,,

我們先不看多態(tài),,我們先看上邊的封裝和繼承,我們發(fā)現(xiàn)最后我們的測試的時候啊,,是不是直接調(diào)動的方法,,而方法里邊的東西是不是都寫死了,對把,,你在現(xiàn)實的開發(fā)中你寫死的東西有哪些不好,,是不是不利于維護啊,這樣才演變出來我們的多態(tài),,下面我

說一下我對多態(tài)的理解,就一句話,,

不到最后調(diào)用,,我永遠不知道我要干什么。

這句話現(xiàn)在看的話肯定是看不懂的,,具體的我們要在例子中去體現(xiàn),,那么之前我們做某些方法的時候是不是就是傳就是參數(shù),,固定的參數(shù),固定的方法,,固定的去執(zhí)行這個方法,,對不對,那么現(xiàn)在我在傳的參數(shù)的時候我不傳固定值了,,我就去傳一個能代表的

參數(shù)去替代他,,到時候我們調(diào)用的時候我們再去說我是誰,我要干嘛對不對,。就好比我們4s店,,眾多的車,不同的價格,,對不對,,你見那個買車的人去直接買固定的車,是不是都是相中那個了,,我再去選擇去購買那個車,。好下面我就以買車為例:

先來分析一下:

                         A:我們是不是得有一個車得類:Car(接口和抽象類都可以)小編這里呢我就定義一個接口。

                         B:車的類里邊只不過是車的方法,,車的價格,,但是具體哪個車就得體現(xiàn)來:我們來定義兩個類:一個叫寶馬(BM)一個叫奔馳(BC)

                         C:現(xiàn)在萬事俱備只欠東風了,車,,車的品牌價格都有了,,我們是不是得有一個人去賣車啊:是不是的又一個sellCar的類去賣車啊

                         D:測試類

好我們按照步驟一步一步的來創(chuàng)建:兩個方法一個品牌,,一個價格

public interface  Car {
    public   String getname();
    public  Integer getprice();
}

 

兩輛車

public class BM implements Car {

    @Override
    public String getname() {
        return "寶馬";
    }

    @Override
    public Integer getprice() {
        return 300000;
    }

}

 

 

public class BC implements Car {

    @Override
    public String getname() {
        return "奔馳";
    }

    @Override
    public Integer getprice() {
        // TODO Auto-generated method stub
        return 5000;
    }

}

 

 這樣我們的車就搞好了,,該賣車了,首先定義他的屬性,,沒有什么可說的,。

public class SellCar {
    private Integer money=0;
    private Integer sum=0;
    public Integer getSum() {
        return sum;
    }
    public void setSum(Integer sum) {
        this.sum = sum;
    }
    public Integer getMoney() {
        return money;
    }
    public void setMoney(Integer money) {
        this.money = money;
    }

}

 

 下面的才是重點,我定義一個sellcar方法:但是大家注意我傳的參數(shù)是什么是不是接口的參數(shù)啊,,這個才是真正體現(xiàn)面向?qū)ο蟮母拍?/p>

public void sellcar(Car car) {//動態(tài)體現(xiàn)   
        System.out.println("型號"+car.getname()+"價格        "+car.getprice());
        money+=car.getprice();
        sum+=1;

    }

 

 測試類:這里是不是到了最后我才說我要買奔馳車,,之前是不是不知道,這樣就體現(xiàn)了那句話:

不到最后調(diào)用,,我永遠不知道我要干什么,。

public class testcar {
    public static void main(String[] args) {
        SellCar sellCar =new SellCar(); 
        Car car;//體現(xiàn)多態(tài)
         car=new BC();
         sellCar.sellcar(car);
         System.out.println("銷售總額為:"+sellCar.getMoney()+"    銷售車的數(shù)量為"+sellCar.getSum());
         
    }
}

 

運行結(jié)果:

型號奔馳價格        5000
銷售總額為:5000    銷售車的數(shù)量為1

 

 其實這只不過是一個簡單的例子:因為就一個接口,我們也可以定義兩個接口的項目,,來一個小動物喂食的例子,,那么多態(tài)體現(xiàn)的方法有很多很多種,

需求分析:動物:小貓,。小豬

                 食物:魚          米飯

   兩個接口就在這里了,,是不是就是上邊我們的車啊,,然后在創(chuàng)建四個類去體現(xiàn)他

下面就是飼養(yǎng)員了,最后是測試類

動物接口類:

public interface Animal {
    public String GetAnimalName();
}

 

動物具體類:

public class Cat implements Animal{

    @Override
    public String GetAnimalName() {
        return "";
    }

}

 

 

public class Pig implements Animal {

    @Override
    public String GetAnimalName() {
        // TODO Auto-generated method stub
        return "";
    }

}

 

 食物接口類:

public interface Food {
       public  String getname();
}

 

食物具體類:

 

public class Fish implements Food {

    @Override
    public String getname() {
        return "";
        
    }

}

 

 

public class Rice implements Food {

    @Override
    public String getname() {
        return "米飯";
    }

}

 

 上邊這些都沒有什么技術(shù)可言,,真正體現(xiàn)的還是后邊的:這里定義喂食方法,,里邊的參數(shù)是不是活的,不是死的,,和上邊的賣車一樣最后我測試調(diào)用的時候,,才能或取到參數(shù)。

public class Feeder {
public void feed(Animal animal,Food food) {
    System.out.println(animal.GetAnimalName()+""+food.getname());
}
}

 

 測試類:

public class test {
    public static void main(String[] args) {
        Feeder feeder = new Feeder();
        Animal animal;
        Food food;
        animal=new Cat();
        food =new Fish();
        feeder.feed(animal, food);
        animal=new Pig();
        food =new Rice();
        feeder.feed(animal, food);
    }

}

 

 

貓吃魚
豬吃米飯

 

 

整體的到這里就結(jié)束來,,小編感覺如果能把這些案例理解,,就算你不能真正的理解面向?qū)ο螅遣皇菍γ嫦驅(qū)ο蟪橄笥辛艘粋€系統(tǒng)的概念,,感覺他并不是那么抽象,,那么難以理解。希望可以幫到大家?。,。?/p>

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多