老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)

Java中接口的存在有什么作用

這篇“Java中接口的存在有什么作用”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Java中接口的存在有什么作用”文章吧。

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供新密網(wǎng)站建設(shè)、新密做網(wǎng)站、新密網(wǎng)站設(shè)計、新密網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、新密企業(yè)網(wǎng)站模板建站服務(wù),10多年新密做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。

1. 什么是抽象類

在講解接口之前,抽象類是繞不過去的一個概念,接口可以認(rèn)為是一個比抽象類還要抽象的類。

什么是抽象類?「包含一個或多個抽象方法的類就是抽象類,抽象方法即沒有方法體的方法」,抽象方法和抽象類都必須聲明為 abstract。例如:

// 抽象類
public abstract class Person {
    // 抽象方法
 public abstract String getDescription();
}

切記!「除了抽象方法之外,抽象類還可以包含具體數(shù)據(jù)和具體方法」。例如, 抽象類 Person 還保存著姓名和一個返回姓名的具體方法:

public abstract class Person{
    private String name;
    public Person(String name){
     this.name = name ;
    }
    public abstract String getDescription();
    public String getName(){
     return name;
    }
}
?  

許多程序員都會「錯誤」的認(rèn)為,在抽象類中不能包含具體方法。其實這也是接口和抽象類的不同之處,接口中是不能包含具體方法的。

?  

「抽象類不能被實例化」。也就是說,如果將一個類聲明為 abstract, 就不能創(chuàng)建這個類的對象。

new Person("Jack"); // Error

可以定義一個抽象類的對象變量, 但是它只能引用非抽象子類的對象。假設(shè) Student 類是 Person 的非抽象子類:

Person p = new Student("Jack"); // Right

所謂非抽象子類就是說,如果創(chuàng)建一個繼承抽象類的子類并為之創(chuàng)建對象,那么就「必須為父類的所有抽象方法提供方法定義」。如果不這么做(可以選擇不做),子類仍然是一個抽象類,編譯器會強(qiáng)制我們?yōu)樾骂惣由?nbsp;abstract 關(guān)鍵字。

下面定義擴(kuò)展抽象類 Person 的具體子類 Student

public class Student extends Person { 
    private String major; 
    public Student(String name, String major) { 
        super(name); 
        this.major = major; 
    } 
    @Override
    public String getDescription(){ // 實現(xiàn)父類抽象方法
     return "a student majoring in " + major; 
    } 

在 Student 類中實現(xiàn)了父類中的抽象方法 getDescription 。因此,「在 Student類中的全部方法都是非抽象的, 這個類不再是抽象類」

???? 調(diào)用如下:

Person p = new Student("Jack","Computer Science");
p.getDescription();
 

由于不能構(gòu)造抽象類 Person的對象, 所以變量 p 永遠(yuǎn)不會引用 Person 對象, 而是引用諸如 Student這樣的具體子類對象, 而這些對象中都重寫了 getDescription方法。 

2. 什么是接口

接口的本質(zhì)其實也是一個類,而且是一個比抽象類還要抽象的類。怎么說呢?抽象類是能夠包含具體方法的,而接口杜絕了這個可能性,「在 Java 8 之前,接口非常純粹,只能包含抽象方法,也就是沒有方法體的方法」。而 Java 8 中接口出現(xiàn)了些許的變化,開始允許接口包含默認(rèn)方法和靜態(tài)方法,這個下文會講解。

Java 使用關(guān)鍵字 interface 而不是 class 來創(chuàng)建接口。和類一樣,通常我們會在關(guān)鍵字 interface 前加上 public 關(guān)鍵字,否則接口只有包訪問權(quán)限,只能在接口相同的包下才能使用它。

public interface Concept {
    void idea1();
    void idea2();
}
 

同樣的,接口中既然存在抽象方法,那么他就需要被擴(kuò)展(繼承)。使用 implements 關(guān)鍵字使一個類擴(kuò)展某個特定接口(或一組接口),通俗來說:接口只是外形,現(xiàn)在這個擴(kuò)展子類要說明它是如何工作的。

class Implementation implements Concept {
    @Override
    public void idea1() {
        System.out.println("idea1");
    }
    
    @Override
    public void idea2() {
        System.out.println("idea2");
    }
}
 

這里需要注意的是,你可以選擇顯式地聲明接口中的方法為 public,但是「即使你不這么做,它們也是 public 的」。所以當(dāng)實現(xiàn)一個接口時,來自接口中的方法必須被定義為 public。否則,它們只有包訪問權(quán)限,這樣在被繼承時,它們的可訪問權(quán)限就被降低了,這是 Java 編譯器所不允許的。

另外,接口中是允許出現(xiàn)常量的,與接口中的方法都自動地被設(shè)置為 public—樣,「接口中的域?qū)⒈蛔詣颖辉O(shè)置為 public static final 類型」,例如:

public interface Concept {
 void idea1(); // public void idea1();
    // 靜態(tài)屬性
 double item = 95; // a public static final constant
}
 
?  

可以將接口方法標(biāo)記為 public,將域標(biāo)記為 public static final。有些程序員出于習(xí)慣或提高清晰度的考慮, 愿意這樣做。但 Java 語言規(guī)范卻「建議不要書寫這些多余的關(guān)鍵字」

?  

3. 接口的特性

接口和類其中不同的一點就是,我們「無法像類一樣使用 new 運(yùn)算符來實例化一個接口」

x = new Concept(. . .); // ERROR 

原因也很簡單,接口連具體的構(gòu)造方法都沒有,肯定是無法實例化的。

當(dāng)然, 盡管不能構(gòu)造接口的對象,聲明接口的變量還是可以的:

Concept x; // OK 

接口變量必須引用實現(xiàn)了接口的類對象:

x = new Implementation(. . .); // OK provided Implementation implements Concept 

接下來, 如同使用 instanceof 檢查一個對象是否屬于某個特定類一樣, 也可以使用 instanceof檢查一個對象是否實現(xiàn)了某個特定的接口:

if(x instanceof Concept){
 ...
}
 

另外,與可以建立類的繼承關(guān)系一樣,「接口也可以被繼承」

public interface Concept1 {
    void idea1();
    void idea2();
}

-------------------------------------------
    
public interface Concept2 extends Concept1{
 double idea3();
}
 

當(dāng)然,讀到這里大家可能依然無法理解,既然有了抽象類,為什么 Java 程序設(shè)計語言還要不辭辛苦地引入接口這個概念?

很重磅!因為「一個類可以實現(xiàn)多個接口,但是一個類只能繼承一個父類」。正是接口的出現(xiàn)打破了 Java 這種單繼承的局限,為定義類的行為提供了極大的靈活性。

class Implementation implements Concept1, Concept2 // OK 

有一條實際經(jīng)驗:在合理的范圍內(nèi)盡可能地抽象。顯然,接口比抽象類還要抽象。因此,一般更傾向使用接口而不是抽象類。

4. Java 8 接口新特性

上文提過一嘴,「在 Java 8 中,允許在接口中增加靜態(tài)方法和默認(rèn)方法」。理論上講,沒有任何理由認(rèn)為這是不合法的,只是這有違于將接口作為抽象規(guī)范的初衷。舉個例子:

public interface Concept {
    // 靜態(tài)方法
 public static void get(String name){
     System.out.println("hello " + name);
    }
    // 默認(rèn)方法
    default void idea1(){
        System.out.println("this is idea1");
    };
}
 

用 default 修飾符標(biāo)記的方法就是默認(rèn)方法,這樣子類就不需要去實現(xiàn)這個方法了。

不過,引入默認(rèn)方法后,就出現(xiàn)了一個「默認(rèn)方法沖突」的問題。如果先在一個接口 A 中將一個方法 idea 定義為默認(rèn)方法, 然后又在另一個接口 B 或者超類 C 中定義了同樣的方法  idea,然后類 D 實現(xiàn)了這兩個接口 A 和 B(或超類 C)。于是類 D 中就有了方法 idea 的兩個默認(rèn)實現(xiàn),出現(xiàn)了沖突,為此,Java 制定了一套規(guī)則來解決這個二義性問題:

1 )  「超類優(yōu)先」。如果超類提供了一個具體方法,接口中的同名且有相同參數(shù)類型的默認(rèn)方法會被忽略。

2 )  「接口沖突」。如果一個父類接口提供了一個默認(rèn)方法,另一個父類接口也提供了一個同名而且參數(shù)類型相同的方法,子類必須覆蓋這個方法來解決沖突。例如:

interface A {
 default void idea(){
  System.out.println("this is A");
 }
}

interface B {
 default void idea(){
  System.out.println("this is B");
 }
}

// 需要在 D 類中覆蓋 idea 方法
class D implements A, B{
    public void getName(){
     System.out.println("this is D");
    }
}
 

現(xiàn)在假設(shè) B接口沒有為 idea 提供默認(rèn)實現(xiàn):

interface B {
 void idea();
}
 

那么 D 類會直接從 A 接口繼承默認(rèn)方法嗎?這好像挺有道理, 不過,Java 設(shè)計者更強(qiáng)調(diào)一致性。兩個接口如何沖突并不重要,「只要有一個接口提供了一個默認(rèn)實現(xiàn),編譯器就會報告錯誤, 我們就必須解決這個二義性」

當(dāng)然,如果兩個接口都沒有為共享方法提供默認(rèn)實現(xiàn), 那么就與 Java 8 之前的情況一樣,這里不存在沖突。

5. 接口存在的意義

在我自己早期學(xué)習(xí)編程的時候,對接口存在的意義實在困惑,我自己亂寫代碼的時候基本上不可能意識到需要去寫接口,不知道接口到底有什么用,為什么要定義接口,感覺定義接口只是提前做了個多余的工作。

其實不是,定義接口并非多余,「接口是用來提供公用的方法,規(guī)定子類的行為的」。舉個例子,讓大家直觀的感受下接口的作用:

比如有個網(wǎng)站, 需要保存不同客戶的信息, 有些客戶從 Web 網(wǎng)站來, 有些客戶從手機(jī)客戶端來, 有些客戶直接從后臺管理系統(tǒng)錄入。假設(shè)不同來源的客戶有不同的處理業(yè)務(wù)流程, 這個時候我們定義接口來提供一個保存客戶信息的方法,然后不同的平臺實現(xiàn)我們這個保存客戶信息的接口,以后保存客戶信息的話, 我們只需要知道這個接口就可以了,具體調(diào)用的方法被封裝成了黑盒子,這也就是 Java 的多態(tài)的體現(xiàn),「接口幫助我們對這些有相同功能的方法做了統(tǒng)一管理」

以上就是關(guān)于“Java中接口的存在有什么作用”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


文章標(biāo)題:Java中接口的存在有什么作用
文章起源:http://www.xueling.net.cn/article/jdescs.html

其他資訊

在線咨詢
服務(wù)熱線
服務(wù)熱線:028-86922220
TOP
主站蜘蛛池模板: 97porm国内自拍视频 | 蜜桃视频在线视频 | 91网站免费在线观看 | 中文字幕亚洲无线码在一区 | 日本护士吞精囗交gif | 网站一区二区三区 | 午夜影院福利视频 | 国产hsck在线亚洲 | 国产精品成人无码A片免费网址 | 粉嫩国产15xxxxx | 日韩av综合网 | 人妻中文字幕无码2020 | 欧美成人免费草草影院视频 | 亚洲AV无码专区在线观看成人 | 浴室洗澡偷拍一区二区 | 日本三级排行榜 | 网友自拍区视频精品 | p影院永久免费p视频 | 粗大猛烈进出高潮视频大全 | 一本一道久久a久久综合精品 | 亚洲成国产人片在线观看 | 一区视频在线免费观看 | 97国产精品 | 免费看一级黄色 | 78摸在线观看 | 亚洲AV无码一区二区三区在线播放 | 福利看片盒子永久国产 | 国产亚洲高清一区 | 张雨绮被揉到高潮下不了床 | 免费一级a毛片夜夜看 | 四虎精品久久 | 国产精品自在拍视频首页 | 乱子伦xxxxvideos | 亚洲美女视频在线 | 一区二区三区免费看 | 91久久久久久久久久久久 | 国产在线无码不卡影视影院 | yyyy11111少妇影院 | 国产精品久久久久久久久久久久人四虎 | 中文字幕一区二区三区在线视频 | 91精品国产综合久久小仙女图片 |