亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

java學習筆記8--接口總結

2019-11-14 22:11:04
字體:
來源:轉載
供稿:網友
java學習筆記8--接口總結

接著前面的學習:

java學習筆記7--抽象類與抽象方法

java學習筆記6--類的繼承、Object類

java學習筆記5--類的方法

java學習筆記4--對象的初始化與回收

java學習筆記3--類與對象的基礎

java學習筆記2--數據類型、數組

java學習筆記1--開發環境平臺總結

本文地址:http://www.49028c.com/archimedes/p/java-study-note8.html,轉載請注明源地址。

生活中的接口:

什么是接口?

一個Java接口是一些方法特征的集合,但沒有方法的實現。

在類中實現接口可以使用關鍵字implements,其基本格式如下:

[修飾符] class <類名> [extends 父類名] [implements 接口列表]{}修飾符:可選參數,用于指定類的訪問權限,可選值為public、abstract和final。

類名:必選參數,用于指定類的名稱,類名必須是合法的Java標識符。一般情況下,要求首字母大寫。

extends 父類名:可選參數,用于指定要定義的類繼承于哪個父類。當使用extends關鍵字時,父類名為必選參數。

implements 接口列表:可選參數,用于指定該類實現的是哪些接口。當使用implements關鍵字時,接口列表為必選參數。當接口列表中存在多個接口名時,各個接口名之間使用逗號分隔。

實現上面例子中的接口:

public interface PCI {  //java接口,相當于主板上的PCI插槽的規范    public void start();    public void stop();}

Java接口中定義的方法在不同的地方被實現,可以具有完全不同的行為:

//聲卡、網卡都實現了PCI插槽的規范,但行為完全不同 class SoundCard implements PCI {        public void start() {        System.out.

可以使用Java接口標識類型。運行時,根據實際創建的對象類型調用相應的方法實現:

public class javatest {    public static void main(String[] args) {        PCI nc = new NetworkCard();        PCI sc = new SoundCard();        nc.start();        sc.start();    }}

運行結果:

NetworkCard send...SoundCard start...

為什么需要Java接口?

例子:為學校各中心開發這樣一個小系統,包含類型:教員、中心、打印機,具體要求如下:

1、教員、以及中心都具有方法:輸出詳細信息

2、中心具有屬性:打印機,能夠通過中心的打印機打印教員或中心的詳細信息

3、系統要具備良好的可擴展性與可維護性

先看方案1:

public class Teacher {    //輸出教員的詳細信息    public String detail() {        return “I am a teacher!";    }}public class Printer {    public void print(String content) {          System.out.println("start printing:");                        System.out.println(content);    }}public class ggSchool {    private Printer printer = new Printer();    //輸出學校的詳細信息    public String detail() {        return “this is ggSchool";    }    //使用打印機打印教員信息    public void print(Teacher t){        printer.print(t.detail());    }    //使用打印機打印學院信息    public void print(ggSchool s){        printer.print(s.detail());    }}

那么,問題來了:

每增加一種新類型,都需要增加相應的print方法,程序的可擴展性及可維護性極差,這不符合系統的要求

先看方案2(使用接口):

教師、中心都存在一個共同的方法特征:detail,它們對detail方法有各自不同的實現——這完全符合Java接口的定義

代碼如下:

public interface Introduceable {    public String detail();}public class Teacher implements Introduceable {    //輸出教員的詳細信息    public String detail() {        return “I am a teacher!";    }}public class ggSchool implements Introduceable {    private Printer printer = new Printer();    //輸出學校的詳細信息    public String detail() {        return “this is ggSchool";    }        public void print(Introduceable intro) {    //使用print方法時,參數可以是任何Introduceable接口的實現類的對象,                                                //不必再為不同的類型建立不同的print方法了        printer.print(intro.detail());    }}public class Printer {    public void print(String content) {          System.out.println("start printing:");                        System.out.println(content);    }}

通過Java接口,我們同樣可以享受到多態性的好處,大大提高了程序的可擴展性及可維護性

什么是面向接口編程?

開發系統時,主體構架使用接口,接口構成系統的骨架,這樣就可以通過更換接口的實現類來更換系統的實現

升級上面的系統,要求:

打印機有多種類型,比如:黑白打印機、彩色打印機等

學院可能配備其中任意一款打印機,負責打印教員、或者學院的詳細信息

系統要具備良好的可擴展性與可維護性

第一步:抽象出Java接口

1、分析:

黑白、彩色打印機都存在一個共同的方法特征:print

黑白、彩色打印機對print方法有各自不同的實現

2、結論:

抽象出Java接口PrinterFace,在其中定義方法print

3、具體實現:

public interface PrinterFace {       public void print(String content);}
第二步:實現Java接口

1、分析:

已經抽象出Java接口PrinterFace,并在其中定義了print方法黑白、彩色打印機對print方法有各自不同的實現

2、結論:黑白、彩色打印機都實現PrinterFace接口,各自實現print方法

3、具體實現:

public class ColorPrinter implements PrinterFace {    public void print(String content) {        System.out.println("彩色打?。?);        System.out.println(content);    }}public class BlackPrinter implements PrinterFace {    public void print(String content) {        System.out.println("黑白打印:");        System.out.println(content);    }}

第三步:使用Java接口

1、分析:主體構架使用接口, 讓接口構成系統的骨架

2、結論:更換實現接口的類就可以更換系統的實現

3、具體實現:

public class ggSchool implements Introduceable{    private PrinterFace printer;  //打印機    public void setPrinter(PrinterFace p) {        this.printer = p;    }    public String detail() {        return "this is ggSchool!";    }    public void print(Introduceable intro){        printer.print(intro.detail());    }}public class Test {    public static void main(String[] args) {        // 創建學院實例        ggSchool school=new ggSchool();        //為該學院配備黑白打印機        school.setPrinter(new BlackPrinter());        school.print(school);         //為該學院配備彩色打印機        school.setPrinter(new ColorPrinter());        school.print(school);    }}
抽象類與接口

抽象類的子類必須覆蓋所有的抽象方法后才能被實例化,否則這個子類還是個抽象類。

如果一個抽象類中的所有方法都是抽象的,就可以將這個類用另外一種方式來定義,也就是接口定義。

抽象方法只需聲明,不需實現。

接口是抽象方法和常量值的定義的集合。

從本質上講,接口是一種特殊的抽象類。這種抽象類中包含常量和方法的定義,而沒有變量和方法的實現。例如

注意:在接口的定義中,所有的成員都是public訪問類型的,而不論是否用public關鍵字修飾;接口里的變量都是用public static final標識的,所以,接口中定義的變量就是全局靜

態常量。

我們可以定義一個新的接口,用extends關鍵字去繼承一個已有的接口。注意:只能接口繼承接口,類不能繼承接口。

一個類只能用implements關鍵字去實現一個接口中的所有方法

一個類可以在繼承一個父類的同時,實現一個或多個接口,extends關鍵字必須位于implements關鍵字之前,如我們可以這樣定義:

class classA {    //...}public interface Interface1{    //...}public interface Interface2{    //...}class classB extends classA implements Interface1 Interface2{    //...}
抽象類和接口的區別

1.語法層面上的區別

  1)抽象類可以提供成員方法的實現細節,而接口中只能存在public abstract 方法;

  2)抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是public static final類型的;

  3)接口中不能含有靜態代碼塊以及靜態方法,而抽象類可以有靜態代碼塊和靜態方法;

  4)一個類只能繼承一個抽象類,而一個類卻可以實現多個接口。

2.設計層面上的區別

  1)抽象類是對一種事物的抽象,即對類抽象,而接口是對行為的抽象。抽象類是對整個類整體進行抽象,包括屬性、行為,但是接口卻是對類局部(行為)進行抽象。舉個簡單的例子,飛機和鳥是不同類的事物,但是它們都有一個共性,就是都會飛。那么在設計的時候,可以將飛機設計為一個類Airplane,將鳥設計為一個類Bird,但是不能將 飛行 這個特性也設計為類,因此它只是一個行為特性,并不是對一類事物的抽象描述。此時可以將 飛行 設計為一個接口Fly,包含方法fly( ),然后Airplane和Bird分別根據自己的需要實現Fly這個接口。然后至于有不同種類的飛機,比如戰斗機、民用飛機等直接繼承Airplane即可,對于鳥也是類似的,不同種類的鳥直接繼承Bird類即可。從這里可以看出,繼承是一個 "是不是"的關系,而接口實現則是 "有沒有"的關系。如果一個類繼承了某個抽象類,則子類必定是抽象類的種類,而接口實現則是有沒有、具備不具備的關系,比如鳥是否能飛(或者是否具備飛行這個特點),能飛行則可以實現這個接口,不能飛行就不實現這個接口。

  2)設計層面不同,抽象類作為很多子類的父類,它是一種模板式設計。而接口是一種行為規范,它是一種輻射式設計。什么是模板式設計?最簡單例子,大家都用過PPT里面的模板,如果用模板A設計了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,如果它們的公共部分需要改動,則只需要改動模板A就可以了,不需要重新對ppt B和ppt C進行改動。而輻射式設計,比如某個電梯都裝了某種報警器,一旦要更新報警器,就必須全部更新。也就是說對于抽象類,如果需要添加新的方法,可以直接在抽象類中添加具體的實現,子類可以不進行變更;而對于接口則不行,如果接口進行了變更,則所有實現這個接口的類都必須進行相應的改動。

下面看一個網上流傳最廣泛的例子:門和警報的例子:門都有open( )和close( )兩個動作,此時我們可以定義通過抽象類和接口來定義這個抽象概念:

abstract class Door {    public abstract void open();    public abstract void close();}

或者:

interface Door {    public abstract void open();    public abstract void close();}

但是現在如果我們需要門具有報警alarm( )的功能,那么該如何實現?下面提供兩種思路:

1)將這三個功能都放在抽象類里面,但是這樣一來所有繼承于這個抽象類的子類都具備了報警功能,但是有的門并不一定具備報警功能;

2)將這三個功能都放在接口里,需要用到報警功能的類就需要實現這個接口中的open( )和close( ),也許這個類根本就不具備open( )和close( )這兩個功能,比如火災報警器。

從這里可以看出,Door的open() 、close()和alarm()根本就屬于兩個不同范疇內的行為,open()和close()屬于門本身固有的行為特性,而alarm()屬于延伸的附加行為。因此最好的解決辦法是單獨將報警設計為一個接口,包含alarm()行為,Door設計為單獨的一個抽象類,包含open和close兩種行為。再設計一個報警門繼承Door類和實現Alarm接口。

interface Alram {    void alarm();} abstract class Door {    void open();    void close();} class AlarmDoor extends Door implements Alarm {    void oepn() {      //....    }    void close() {      //....    }    void alarm() {      //....    }}
抽象類和接口在Java中的應用

例子:假設有若干 (如1000)個Circle,Rectangle以及若干個其他形狀,希望計算它們的總面積,直截了當的做法是將它們分別放到多個數組中,分別循環求出各形狀的面積,然后累加,這種做法是不漂亮的。如果還有其它形狀:triangle,ellipses等,上述方法顯得“累贅”。希望有一種統一的表示,例如用一個數組shape[],接受所有的形狀,然后用:

 for (i=0; i<shape.length; i++)        area_total += shape[i].area();

用抽象類實現多種形狀面積的累加:

首先看看Circle和Rectangle兩個類,如何完成相關參數的計算 :

class Circle {    public float r;     Circle(float r) {          this.r = r;          }    public float area() {        return 3.14 * r * r;    }}class Rectangle {    public float width, height;     Rectangle (float w, float h) {        width = w;         height = h;    }    public float area() {        return width * height;    }}

現在要利用抽象類實現多種形狀面積的累加,確保每種形狀分別用不同的方法來計算它們的面積和周長。因此,超類Shape包含抽象方法computeArea,然后在不同的子類中實現和覆蓋這個方法,同時添加toString方法來顯示幾何形狀的一些基本屬性?,F在聲明了1000個Shape對象的數組,然后循環1000次隨機產生1000個平面圖形對象,形狀為圓、矩形、正方形三種之一。

abstract class Shape {    abstract float computeArea();}class Circle extends Shape {    public float r;    public Circle(float r) {        this.r = r;    }    public float computeArea() {        return (float)3.14 * r * r;    }}class Rectangle extends Shape {    public float width, height;     Rectangle (float w, float h) {        width = w; //這里不需"this"        height = h;    }    public float computeArea() {        return width * height;    }}

用接口實現多種形狀面積的累加:

用接口的方式實現多種形狀面積的累加,需要將用抽象類表示的Shape類改成接口。由于接口的語法定義要求,我們要把原來抽象類中的成員變量去掉,成員方法改成抽象方法computeArea(),該方法返回一個double類型。所以,這個接口定義為:

public interface Shape2 {       public abstract double computeArea();}

接口實現如下:

interface Shape2{      public double computeArea();}class Circle2 implements Shape2{    protected double radius;    public Circle2(double _radius) {        radius = _radius;    }    public double computeArea() {         return Math.PI * radius * radius;     }}class Rect2 implements Shape2{      protected double width, height;    public Rect2(double w, double h) {          width = w;        height = h;    }    public double computeArea() {           return width * height;      }}

用一個object數組實現多種形狀面積的累加:

定義一個數組,它可以同時存儲矩形、圓和正方形,每個Java類都是由Object擴展而來的。因此,所有的類都屬于Object類型,我們可以創建一個Object類型的數組來存儲任何類型的對象,也就可以存儲矩形、圓和正方形對象

完整代碼如下:

package javatest;import java.util.*;import java.io.*;interface Shape2 {      public double computeArea();}class Circle2 implements Shape2 {     protected double radius;     public Circle2(double _radius) {         radius = _radius;     }     public double computeArea() {          return Math.PI * radius * radius;      }}class Rect2 implements Shape2 {      protected double width, height;    public Rect2(double w, double h) {          width = w;        height = h;    }    public double computeArea() {           return width * height;      }}public class javatest {      public static void main(String args[ ]) {           Shape2 s[] = { new Circle2(4),  new Rect2(4, 4),                          new Circle2(10),  new Rect2(20, 2), new Rect2(8, 10)          };          double total = 0;          for(int i = 0; i < s.length; i++)              total = total + s[i].computeArea();          System.out.println("totalArea = " + (int)total);            }}
參考資料

《java接口講義》--siyuan學院

《java課程講義》--東華大學計算機學院

http://www.49028c.com/dolphin0520/p/3811437.html#top


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产丝袜精品第一页| 国产精品91久久| 欧美日韩一区免费| 欧美不卡视频一区发布| 曰本色欧美视频在线| 日韩视频永久免费观看| 欧美日韩中文字幕在线| 亚洲国产日韩欧美综合久久| 9.1国产丝袜在线观看| 日韩亚洲欧美中文高清在线| 日韩电影大全免费观看2023年上| 日韩高清电影免费观看完整版| 一个人www欧美| 国内免费久久久久久久久久久| 久久国产精品久久精品| 国产午夜精品全部视频播放| 亚洲资源在线看| 亚洲免费视频一区二区| 中文字幕亚洲欧美一区二区三区| 中文字幕久热精品视频在线| 国产精品综合网站| 亚洲国产欧美一区二区丝袜黑人| 欧美成aaa人片在线观看蜜臀| 国产精品极品美女粉嫩高清在线| 欧美不卡视频一区发布| 亚洲美女av黄| 久久久国产成人精品| 精品中文字幕在线2019| 欧美色道久久88综合亚洲精品| 欧美丝袜第一区| 日韩精品视频在线观看免费| 国产精品日本精品| 欧美乱大交xxxxx另类电影| 欧美视频第一页| 日韩欧美成人区| 欧美激情va永久在线播放| 一区二区三区久久精品| 成人午夜一级二级三级| 国产精品久久久久久久久久东京| 中文字幕亚洲第一| 精品国产视频在线| 国产欧美精品一区二区三区-老狼| 亚洲欧洲国产伦综合| 国产亚洲精品日韩| 狠狠躁夜夜躁久久躁别揉| 欧美激情极品视频| 精品久久久久久电影| 欧美在线视频网站| 国产免费观看久久黄| 亚洲一区久久久| 久久亚洲春色中文字幕| 国产有码一区二区| 亚洲一区二区三区毛片| 国产精品毛片a∨一区二区三区|国| 国产精品久久久久久av福利| 国产视频丨精品|在线观看| 欧美夫妻性生活xx| 自拍偷拍亚洲区| 亚洲国产精品va在线看黑人动漫| 国产一区二区av| 成人福利网站在线观看| 久久久久久国产精品三级玉女聊斋| 欧美激情视频免费观看| 色妞欧美日韩在线| 中文字幕精品国产| 欧美一区三区三区高中清蜜桃| 国产一区二区黄| 国产精品三级在线| 国产97在线|日韩| 欧美另类老肥妇| www.日韩免费| 国产精品视频色| 亚洲第一男人av| 久久全球大尺度高清视频| 国产精品美女www爽爽爽视频| 日韩精品在线观看一区二区| 在线日韩精品视频| 欧美日本精品在线| 欧美性xxxxhd| 亚洲综合小说区| 欧美性生活大片免费观看网址| 亚洲精品成人免费| 久久久精品一区| 国模视频一区二区三区| 91久久久在线| 欧美日韩国产精品一区二区不卡中文| 久久久99久久精品女同性| 26uuu日韩精品一区二区| 欧美激情视频在线免费观看 欧美视频免费一| 国产在线观看精品| 美日韩在线视频| 国产一区欧美二区三区| 韩剧1988免费观看全集| 久久中文精品视频| 色无极亚洲影院| 亚洲乱码国产乱码精品精| 日韩一级黄色av| 亚洲美女中文字幕| 欧美亚洲另类制服自拍| 亚洲国产欧美一区二区三区同亚洲| 国产精品国产自产拍高清av水多| 亚洲国产欧美久久| 亚洲第五色综合网| 久青草国产97香蕉在线视频| 日韩成人在线视频观看| 45www国产精品网站| 亚洲а∨天堂久久精品9966| 亚洲国产精彩中文乱码av在线播放| 不卡中文字幕av| 国产亚洲欧洲高清| 91福利视频网| 亚洲国产精品va在线看黑人| 日韩av免费在线播放| 国产精欧美一区二区三区| 色阁综合伊人av| 国产成人精品免费久久久久| 69久久夜色精品国产7777| 欧美午夜丰满在线18影院| 亚洲综合日韩在线| 久久影视电视剧免费网站清宫辞电视| 国产盗摄xxxx视频xxx69| 亚洲一区制服诱惑| 久久久久久国产免费| 中文字幕亚洲在线| 不卡av在线播放| 亚洲成在人线av| 国产在线观看不卡| 亚洲精品国产福利| 国产精品美女免费视频| 日韩激情av在线播放| 色婷婷成人综合| 91视频国产精品| 91色中文字幕| 国产精品久久久久久久久久尿| 亚洲韩国欧洲国产日产av| 国产精品电影观看| 亚洲精品乱码久久久久久按摩观| 欧美日韩国产成人在线观看| 久久精品久久精品亚洲人| 日韩精品中文字幕在线观看| 欧美大片免费观看在线观看网站推荐| 色婷婷综合成人| 国自在线精品视频| 一区二区三区国产在线观看| 亚洲国产日韩欧美综合久久| 欧美伊久线香蕉线新在线| 最近更新的2019中文字幕| 国产一级揄自揄精品视频| 7m第一福利500精品视频| 日韩精品视频在线观看免费| 日韩在线免费观看视频| 欧美成人网在线| 538国产精品视频一区二区| 亚洲美女又黄又爽在线观看| 亚洲国产成人精品久久久国产成人一区| 国产日韩欧美成人| 高潮白浆女日韩av免费看| 国产精品天天狠天天看| 亚洲影院色无极综合| 一区二区三区视频免费| 日韩欧美在线国产| 国产亚洲欧美视频| 成人a视频在线观看| 国模精品视频一区二区三区|