java 介面,介面的特性,介面實現多型,面向介面程式設計

Noah_WB發表於2023-04-18
package cn.zy.cellphone;/**介面是一種引用資料型別。使用interface宣告介面,形式
 * 形式:public interface 介面名稱{}
 * 介面不能擁有構造方法,不能用於建立物件
 *介面可以多繼承。一個介面可以繼承多個其他介面
 *列如:public interface Broadcast extends Network,Picture{}
 *Broadcast介面就具備了A、B介面中定義的抽象方法。 */public interface Broadcast {     /**介面中可以宣告屬性。介面中定義的所有變數都是static final型別的。
      * public static final String version = "1.0";
         public int count = 10; // 預設是static final型別
         一般很少在介面中宣告屬性。      */

 





package cn.zy.cellphone;public interface Picture {public void picture();//照相}

 

package cn.zy.cellphone;public interface Network {public void network();//網路}

 

package cn.zy.cellphone;/**一個類只能繼承一個父類,同時實現多個介面。繼承在前,實現在後。
 * public class Photo2 extends Photo implements Network,Picture,Broadcast {}
 * 實現類實現介面,必須實現介面中定義的抽象方法。
 *方法即行為,表示一種功能,介面定義了一套功能,實現類必須實現這些功能 –> 實現類的能力得到擴充。 *///實現類(子類)public class Photo2 extends Photo implements Network,Picture,Broadcast {            private String name;          
            
            public String getName() {                return name;
            }            public void setName(String name) {                this.name = name;
            }             
            public Photo2(String brand, String type, String name) {                super(brand, type);                this.setName (name);
         } 
            /**介面中定義的一些系列方法表示的是一種種的能力。介面讓實現類實現這些能力,實現類的能力得到擴充和升級。
                                         實現類根據自身特性實現介面中定義的方法。
             * 特殊情況:如果一個抽象父類定義了和介面同名的抽象方法,實現類實現的是抽象父類的抽象方法。             */
            public void broadcast() {
                System.out.println(this.getName()+"的手機可以播放");
        }            public void picture() {
                System.out.println(this.getName()+super.getBrand()+super.getType()+"的手機可以照相");
                
            }            
            public void network() {
                
                System.out.println(this.getName()+super.getBrand()+super.getType()+"的手機可以播放上網");    
            }            /**實現類(子類)Photo2 手機原本只有下面幾個功能,透過介面增加了上面幾個功能
             * 實現類實現介面,必須實現介面中定義的抽象方法。
               *方法即行為,表示一種功能,介面定義了一套功能,實現類必須實現這些功能 –> 實現類的能力得到擴充。             */
            
            public void sendInfo() {
                System.out.println(super.getBrand()+super.getType()+"的手機發資訊");            
                
            }            
            public void call() {
                System.out.println(super.getBrand()+super.getType()+"的手機可以打電話");                
                
            }            
            public void info() {
                System.out.println(super.getBrand()+super.getType()+"的手機可以發簡訊");
                
            }
}

 







package cn.zy.cellphone; // 實現類(子類) public   class Photo1 extends Photo implements Broadcast {       private String name;         public String getName () {         return name;    }     public void setName (String name) {         this.name = name;    }     public Photo1 () {     super (); }     public Photo1 (String brand, String type,String name) {     super (brand,type);     this .setName(name); }     public void broadcast () {        System.out.println( this.getName()+ "的手機可以播放" ); }     public   void sendInfo (){        System.out.println( super.getBrand()+ super.getType()+ "的手機發資訊" );    }     public void call (){        System.out.println( super.getBrand()+ super.getType()+ "的手機可以打電話" );        }     public void info (){        System.out.println( super.getBrand()+ super.getType()+ "的手機可以發簡訊" );    } }

 




package cn.zy.cellphone;//父類public abstract class Photo {     private String brand;     private String type;    public String getBrand() {        return brand;
    }    public void setBrand(String brand) {        this.brand = brand;
    }    public String getType() {        return type;
    }    public void setType(String type) {        this.type = type;
    }    public Photo() {        super();
    }    public Photo(String brand, String type) {        super();        this.brand = brand;        this.type = type;
    }     public abstract void sendInfo();     public abstract void call();     public abstract void info();
}

 






package
cn.zy.cellphone; // 執行類 public class Test { public static void main (String[] args) {               // 同一引用型別    Broadcast broadcast1= new Photo1( "諾基亞", "a01", "張三" );            broadcast1.broadcast();                    Photo photo= new Photo1( "諾基亞", "a01", "張三" );            photo.sendInfo();            photo.call();            photo.info();             // 同一引用型別            Broadcast broadcast2= new Photo1( "蘋果X", "11S", "李四" );            broadcast2.broadcast();             // 例項不同, 對同一方法的執行結果不同            Picture picture1= new Photo2( "蘋果X", "11S", "李四" );            picture1.picture();            Network network1= new Photo2( "蘋果X", "11S", "李四" );            network1.network();           // 多型            Photo photo1= new Photo1( "蘋果X", "11S", "李四" );            photo1.sendInfo();            photo1.call();            photo1.info();             /**             * 介面實現多型: 介面型別 引用 實現類物件                                      繼 承實現多型: 父類型別 引用 子類物件                                     介面定義的方法被實現類實現,透過介面引用實現類時,呼叫介面中的方法時,執行的是實現類實現的方法。                                       實現類物件具備介面中定義的能力 是一種has a 關係                                           子類物件是一種父類型別 是一種is a 關係                                                                               現在的Photo1同Photo2既是實現類也是子類             */ } }



 

 

  面向 介面程式設計

介面 表示一約定 ( 協議 ),  約定  ( 規範 )  了 實現類應該具備 (has a)  的 能力。

 

理解:

=> 實現 類必須實現介面中所有的方法,所以介面規範了實現類的行為

=>  介面 約定了實現類應該具備的行為。

 

面向 介面程式設計

所謂 面向介面程式設計,程式設計時,只關心 實現類具備 什麼能力,而不關心實現類如何實現這個能力。面向 介面程式設計時,面向介面的約定而不考慮介面的具體實現。

 

也就是 說,面向介面程式設計時,介面的定義方只關係實現類是否具備介面 所定義的能力,而實現類如何被的該能力介面定義方 一點都不關心

 

 

 


//介面實現多型 電腦類(透過介面把3種零件組成電腦,而且零件隨時可以更換)(cpu介面  4Hz  5Hz  。。。。(隨時更換大小不同的cpu)  )

                                                           (硬碟介面  3000GB  4000Gb(隨時更換大小不同的硬碟))
(記憶體介面  30GB  40Gb(隨時更換大小不同的記憶體))
package cn.computer;//電腦public class Computer {  private Cpu cpu;                       //  預留cpu介面
  private Caliche caliche;                 // 預留硬碟介面
  private InternalStroage internalStroage;   //預留記憶體介面public Cpu getCpu() {    return cpu;
}public void setCpu(Cpu cpu) {    this.cpu = cpu;
}public Caliche getCaliche() {    return caliche;
}public void setCaliche(Caliche caliche) {    this.caliche = caliche;
}public InternalStroage getInternalStroage() {    return internalStroage;
}public void setInternalStroage(InternalStroage internalStroage) {    this.internalStroage = internalStroage;
}public Computer() {    super();
}public Computer(Cpu cpu, Caliche caliche, InternalStroage internalStroage) {    super();    this.cpu = cpu;                         
    this.caliche = caliche;                    
    this.internalStroage = internalStroage;       
}  //把各個部件透過介面組裝成一個完整的電腦public void print(String name) {
    System.out.println(name+"計算機");
    System.out.println("cpu:"+getCpu().Hz());
    System.out.println("硬碟容量:"+getCaliche().big2());
    System.out.println("記憶體容量:"+this.getInternalStroage().big());
}
    
}

 






package cn.computer;//cpu介面public interface Cpu {    public String Hz();  //這是介面實現多型的形式:  public 你要返回的變數型別   方法名()    
        
    }

 




package
cn.computer; // 實現類 public class Realize1 implements Cpu{   public String Hz (){             // public 你要返回的變數型別   方法名()       return "3.8GHz";               // 返回值  } }

 


package cn.computer;//記憶體介面public interface InternalStroage {  public String big();
}

 





package
cn.computer; // 實現類 public class Realize2 implements InternalStroage{     public String big (){         return "4GB" ;    } }

 





package cn.computer;//硬碟介面public interface Caliche {    public String big2();
}

 





package
cn.computer; // 實現類 public class Realize2 implements InternalStroage{     public String big (){         return "4GB" ;    } }

 





package
cn.computer; public class Test { public static void main (String[] args) {    Cpu cpu= new Realize1();     // 把一種3.8Hz的cpu賦予給cpu介面    Caliche caliche= new Realize3();   // 把3000GB的硬碟賦予給硬碟介面    InternalStroage internalStroage= new Realize2();     // 把4GB的記憶體賦予給記憶體介面    Computer computer= new Computer(cpu,caliche,internalStroage);     // 把cpu,硬碟,記憶體給電腦類組合(地址)     computer.print( "華碩");                 // 最後得到了完整的電腦     } }



1.1.1.1  抽象 類和介面的異同比較

  • 抽象類和介面都是引用資料型別,他們都不能建立物件。
  • 他們都可以定義抽象方法,都可以實現多型。但是抽象類可以定義非抽象方法,而介面中定義的都是抽象方法。
  • 抽象類和介面都具有傳遞性。抽象類是單根性(單繼承),而介面是多繼承。
  • 在概念上,都可以重寫抽象方法。子類重寫抽象類,實現類實現介面
  • 抽象類和子類解決的是模組內的問題(程式碼重用 ,  重寫  ,  多型)而介面解決的是模組間的問題  =>  高內聚,低耦合。介面可以用 解耦模組。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70026910/viewspace-2946577/,如需轉載,請註明出處,否則將追究法律責任。

相關文章