面向?qū)ο蟾呒?jí)(05)-抽象類和接口的使用、工廠設(shè)計(jì)模式_第1頁
面向?qū)ο蟾呒?jí)(05)-抽象類和接口的使用、工廠設(shè)計(jì)模式_第2頁
面向?qū)ο蟾呒?jí)(05)-抽象類和接口的使用、工廠設(shè)計(jì)模式_第3頁
面向?qū)ο蟾呒?jí)(05)-抽象類和接口的使用、工廠設(shè)計(jì)模式_第4頁
面向?qū)ο蟾呒?jí)(05)-抽象類和接口的使用、工廠設(shè)計(jì)模式_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、17. 面向?qū)ο蟾呒?jí)(05) 本季要點(diǎn):抽象類和接口的實(shí)際應(yīng)用。本季作為上一講的后續(xù)內(nèi)容,詳細(xì)講解了Java中的抽象類和接口的使 用,并講解了工廠設(shè)計(jì)模式。 blog: 零基礎(chǔ)學(xué)JAVAJava SE面向?qū)ο蟛糠?17.面向?qū)ο蟾呒?jí)(05) 2009-02-07上季內(nèi)容回顧:1、對(duì)象的多態(tài)性 2、抽象類和接口本季主要知識(shí)點(diǎn):抽象類和接口的實(shí)際應(yīng)用1、子類對(duì)象可以為父類對(duì)象實(shí)例化,之后調(diào)用的方法都是子類中已經(jīng)被覆寫過的方法。 2、就可以利用此特性,觀察抽象類的使用,因?yàn)樵诔橄箢愔杏泻芏嗟某橄蠓椒ā3橄箢恆bstract class A  

2、;              public abstract void fun();        class B extends A               

3、60;public void fun()                                System.out.println("B => Hello World");    &#

4、160;               class C extends A                public void fun()        

5、60;                       System.out.println("C => Hello World");                  

6、;  public class Demo01                public static void main(String args)                  

7、60;             A a = new B();                    a.fun();           &

8、#160;    abstract class A                public abstract void fun();        class B extends A    

9、60;           public void fun()                                System.out.p

10、rintln("B => Hello World");                    class C extends A                public 

11、void fun()                                System.out.println("C => Hello World");       

12、;             public class Demo01                public static void main(String args)       

13、60;                        A a = new C();                    a.fun();&

14、#160;               抽象類是可以實(shí)例化的,通過對(duì)象的多態(tài)性來實(shí)例化抽象類的主要作用是什么呢?抽象類就是類似于一個(gè)模板操作 =>JAVA WEB Servlet程序,提供的就是一個(gè)模板。把上面的實(shí)際的例子變?yōu)槌绦騛bstract class Err             &

15、#160;  public void printInfo()                                System.out.println("姓名:"+this.getName(); &#

16、160;                  System.out.println("班級(jí):"+this.getCls();                    System.out.println(

17、"事由:"+this.getCau();                        /得到姓名,由具體的子類去做            public abstract String getName

18、();            /得到班級(jí),由具體的子類去做            public abstract String getCls();            /得到事由   &#

19、160;        public abstract String getCau();        class ZhangSan extends Err                public String ge

20、tName()                                return "張三"            

21、60;           public String getCls()                                return 

22、"小五班"                        public String getCau()                   

23、             return "因?yàn)樯险n吃東西,所以被老師抓住了,所以要填寫違紀(jì)卡。 "                    class LiSi extends Err  &#

24、160;             public String getName()                               

25、0;return "李四"                        public String getCls()                 

26、;               return "大五班"                        public String getCau()  

27、;                              return "因?yàn)樯险n睡覺,所以被老師抓住了,所以要填寫違紀(jì)卡。 "           

28、60;        public class Demo02                public static void main(String args)            &

29、#160;                   Err e = new ZhangSan();                    e.printInfo();  &#

30、160;             我們改成李四看看效果哈abstract class Err                public void printInfo()        &#

31、160;                       System.out.println("姓名:"+this.getName();                  

32、  System.out.println("班級(jí):"+this.getCls();                    System.out.println("事由:"+this.getCau();           

33、0;            /得到姓名,由具體的子類去做            public abstract String getName();            /得到班級(jí),由具體的子類去做  

34、;          public abstract String getCls();            /得到事由            public abstract String getCau(); 

35、       class ZhangSan extends Err                public String getName()               

36、60;                return "張三"                        public String getCls()

37、0;                               return "小五班"              &

38、#160;         public String getCau()                                return "因?yàn)樯险n

39、吃東西,所以被老師抓住了,所以要填寫違紀(jì)卡。 "                    class LiSi extends Err                public String

40、 getName()                                return "李四"            

41、            public String getCls()                                return

42、60;"大五班"                        public String getCau()                  

43、60;             return "因?yàn)樯险n睡覺,所以被老師抓住了,所以要填寫違紀(jì)卡。 "                    public class Demo02   &#

44、160;            public static void main(String args)                             

45、;   Err e = new LiSi();                    e.printInfo();                調(diào)用模板成功了哈 (模板設(shè)計(jì))場景

46、:        假設(shè)Person分為Worker和Student,工人的屬性包括:姓名、年齡、工資,學(xué)生的屬性包括:姓名、年齡、成績,那么現(xiàn)在人都可以說話,但是工人和學(xué)生說的話肯定不一樣。此時(shí),肯定人中的說話方法是固定的,肯定是一個(gè)普通方法,只是說話的內(nèi)容不一樣。abstract class Person                priva

47、te String name;            private int age;            public Person(String name,int age)           

48、                      = name;                    this.age = age;   

49、0;                    public String getName()                         

50、       return ;                        public int getAge()          

51、60;                     return this.age;                        public

52、 void talk()                                /這是要說,內(nèi)容都在此方法中            

53、        System.out.println(this.getContent();                        public abstract String getContent();    &

54、#160;   class Student extends Person                private float score;            public Student(String name,int&

55、#160;age,float score)                                super(name,age);           

56、         this.score = score;                        public String getContent()        

57、0;                       return "學(xué)生說 -> 姓名="+super.getName()                  

58、;                  +",年齡="+super.getAge()                          

59、60;         +",成績="+this.score;                    class Worker extends Person        

60、0;       private float salary;            public Worker(String name,int age,float salary)               &

61、#160;                super(name,age);                    this.salary = salary;       

62、                 public String getContent()                            

63、;    return "工人說 -> 姓名="+super.getName()                                    +"

64、;,年齡="+super.getAge()                                    +",工資="+this.salary;    

65、0;               public class Demo03                public static void main(String args)     &#

66、160;                          Person p1 = new Student("張三",20,90.0f);             

67、60;      Person p2 = new Worker("李四",30,900.0f);                    p1.talk();            

68、        p2.talk();                接口的實(shí)際應(yīng)用分布式代碼中最重要的就是要規(guī)定好操作的接口。接口就是定義了一個(gè)標(biāo)準(zhǔn),只要按照此標(biāo)準(zhǔn)代碼都可以正常使用。interface A            

69、    public String getInfo();        class B implements A                public String getInfo()      

70、0;                         return "B -> Hello World"                 

71、60;  class C implements A                public String getInfo()                     

72、           return "C -> Hello World"                    public class Demo04       

73、         public static void main(String args)                                A a

74、 = new B();                    System.out.println(a.getInfo();                證明接口對(duì)象可以實(shí)例化,通過對(duì)象多態(tài)性進(jìn)行向上轉(zhuǎn)型,接口是可以實(shí)

75、例化的。我們改成C看看效果interface A                public String getInfo();        class B implements A          

76、60;     public String getInfo()                                return "B -> Hello World"

77、0;                   class C implements A                public String getInfo()    &

78、#160;                           return "C -> Hello World"               

79、     public class Demo04                public static void main(String args)               

80、0;                A a = new C();                    System.out.println(a.getInfo();    

81、60;           我們發(fā)現(xiàn)都可以利用對(duì)象多態(tài)性完成操作接口是一個(gè)標(biāo)準(zhǔn)。   USB接口  -> 只要是實(shí)現(xiàn)了USB接口的設(shè)備就都可以向USB接口上插。 舉例:   假設(shè)現(xiàn)在設(shè)計(jì)一個(gè)USB接口,里面只有開始工作和停止工作的操作。主板上有USB接口,表示可以插入任意的USB設(shè)備。interface USB        

82、60;       /表示開始工作            public void start();            /表示停止工作           &

83、#160;public void stop();        class MainBoard                /只要是USB設(shè)備就可以插            public stati

84、c void plugIn(USB usb)                                usb.start();          

85、0;         usb.stop();                    class MP3 implements USB            &#

86、160;   public void start()                                System.out.println("MP3開始工作");   

87、;                     public void stop()                        &

88、#160;       System.out.println("MP3停止工作");                    class Print implements USB        

89、0;       public void start()                                System.out.println("打印機(jī)開始工作&qu

90、ot;);                        public void stop()                    

91、60;           System.out.println("打印機(jī)停止工作");                    public class Demo05       

92、         public static void main(String args)                                USB

93、 u = new MP3();                    MainBoard.plugIn(u);                現(xiàn)在看下效果如果是打印機(jī)呢?interface USB &

94、#160;              /表示開始工作            public void start();            /表示停止工作    

95、;        public void stop();        class MainBoard                /只要是USB設(shè)備就可以插       

96、60;    public static void plugIn(USB usb)                                usb.start();   &#

97、160;                usb.stop();                    class MP3 implements USB     

98、           public void start()                                System.out.pr

99、intln("MP3開始工作");                        public void stop()                 

100、;               System.out.println("MP3停止工作");                    class Print implements USB &#

101、160;              public void start()                              

102、60; System.out.println("打印機(jī)開始工作");                        public void stop()             &

103、#160;                  System.out.println("打印機(jī)停止工作");                    public class Demo

104、05                public static void main(String args)                         &

105、#160;      USB u = new Print();                    MainBoard.plugIn(u);               

106、; 這就是一個(gè)典型的操作,一切以接口標(biāo)準(zhǔn)進(jìn)行操作。接口規(guī)定什么,其就可以完成什么樣的工作哈舉例:   聽我講課,聽我講課,我說的是中文,你聽的是中文,所以你能聽懂,如果你再說話,你肯定也說中文,我聽的也是中文。接口在實(shí)際中可以作為一種標(biāo)準(zhǔn),那么這種標(biāo)準(zhǔn)在使用的時(shí)候就可以讓類之間進(jìn)行解耦合操作。   接口的重要目的是解耦合:   A -> Bclass A            &#

107、160;   public void fun(B b)                                b.print();       

108、0;            class B                public void print()               

109、;                 System.out.println("Hello World!");                    public class Demo06

110、60;               public static void main(String args)                          

111、      new A().fun(new B();                此代碼存在的問題:   如果現(xiàn)在B類的功能不能直接滿足A類的要求了, 需要對(duì)B進(jìn)行擴(kuò)充或是把B類徹底替換成另外一個(gè)C類,那么此時(shí)要完成以下步驟:修改A類、增加C類,那么問有沒有這樣一種可能:修改功能的時(shí)候我可以不動(dòng)類A呢?可以使用接口。class 

112、;A                public void fun(X x)                            

113、0;   x.print();                    interface X                public void print(); &#

114、160;      class B implements X                public void print()                

115、0;               System.out.println("Hello World!");                    class C implements X &#

116、160;              public void print()                              

117、60; System.out.println("Hello Java!");                    public class Demo06                pu

118、blic static void main(String args)                                X x = new C();      

119、;              new A().fun(x);                問題:   在實(shí)際的代碼中main方法實(shí)際上應(yīng)該是作為一個(gè)客戶端出現(xiàn)的。 此時(shí)客戶端與接口和其接口的子類是直接有關(guān)的。代碼中肯定不能這樣編寫,因?yàn)闀?huì)造成客戶端(main

120、)與具體的子類耦合。  JVM的工作原理:*.class ->JVM ->OS :程序可移植性高。class A                public void fun(X x)                 

121、               x.print();                    interface X          

122、0;     public void print();        class B implements X                public void print()     

123、                           System.out.println("Hello World!");               

124、60;    class C implements X                public void print()                   

125、;             System.out.println("Hello Java!");                    /中間再加入一個(gè)過渡端    class Factory

126、0;               public static X getInstance(String str)                          

127、60;     X x = null;                    if ("B".equals(str)                &

128、#160;                               /認(rèn)為操作的是B類                

129、0;           x = new B();                                   

130、     if ("C".equals(str)                                       &#

131、160;        x = new C();                                     

132、0;  return x;                    public class Demo06                public static voi

133、d main(String args)                                X x = Factory.getInstance("B");       &

134、#160;            new A().fun(x);                現(xiàn)在在客戶端就看不到接口了現(xiàn)在換成C標(biāo)記class A            

135、60;   public void fun(X x)                                x.print();        

136、;            interface X                public void print();        class B implements X&#

137、160;               public void print()                             

138、60;  System.out.println("Hello World!");                    class C implements X              &

139、#160; public void print()                                System.out.println("Hello Java!");    

140、                /中間再加入一個(gè)過渡端    class Factory                public static X getInstance(String str) 

141、                               X x = null;                &#

142、160;   if ("B".equals(str)                                        

143、0;       /認(rèn)為操作的是B類                            x = new B();         

144、60;                              if ("C".equals(str)              

145、;                                  x = new C();            &

146、#160;                           return x;                    

147、;public class Demo06                public static void main(String args)                    

148、60;           X x = Factory.getInstance("C");                    new A().fun(x);        &#

149、160;       此時(shí)客戶端并沒有一個(gè)具體的子類出現(xiàn)。class A                public void fun(X x)                &#

150、160;               x.print();                    interface X          

151、      public void print();        class B implements X                public void print()    &#

152、160;                           System.out.println("Hello World!");               

153、;     class C implements X                public void print()                  &

154、#160;             System.out.println("Hello Java!");                    /中間再加入一個(gè)過渡端    class Factory

155、                public static X getInstance(String str)                          

156、;      X x = null;                    if ("B".equals(str)               

157、60;                                /認(rèn)為操作的是B類                

158、            x = new B();                                  &#

159、160;     if ("C".equals(str)                                      

160、0;         x = new C();                                     

161、   return x;                    public class Demo06                public static 

162、;void main(String args)                                if (args.length!=1)         &#

163、160;                                      System.out.println("程序參數(shù)錯(cuò)誤,程序無法運(yùn)行!");   

164、60;                        System.exit(1);                       

165、                 X x = Factory.getInstance(args0);                    new A().fun(x);                   以后如果假設(shè)要增加新的子類的時(shí)候,只需要修改工廠類即可,其他地方不用做太大的修改,即: 某一個(gè)代碼的修改不影響被調(diào)用處的代碼就是好的設(shè)計(jì)。上面的例子中執(zhí)行java Demo06 D出現(xiàn)NullPointerException錯(cuò)誤,我們可以這樣修改,加個(gè)判斷if(x!=null)。class

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論