Java學習筆記16---抽象類與介面的淺顯理解

来源:http://www.cnblogs.com/chanchan/archive/2017/11/24/7888324.html
-Advertisement-
Play Games

抽象類是由abstract修飾的類,定義方式如public abstract class A{...}。 介面由interface修飾,定義方式如public interface B{...}。 抽象類與介面的具體特性見下文。 抽象類: (1).抽象類中由abstract修飾的方法稱為抽象方法,抽象 ...


抽象類是由abstract修飾的類,定義方式如public abstract class A{...}。

介面由interface修飾,定義方式如public interface B{...}。

抽象類與介面的具體特性見下文。

抽象類:

(1).抽象類中由abstract修飾的方法稱為抽象方法,抽象方法沒有具體實現,要等子類繼承後再實現;聲明方式如public abstract void run();。

(2).只要某類中有一個方法為抽象方法,該類就必須要定義為抽象類。

(3).抽象類不一定有抽象方法,也不一定沒有非抽象方法,或者說抽象類可以沒有抽象方法,也可以有非抽象方法;也就是說,一個類是不是抽象類,不是由類中是否有抽象方法決定的,而是在定義類時就確定了的,只要是由abstract修飾的類就是抽象類。對於抽象類中不含抽象方法這一點,如果不希望實例化某個類時,可以如此。

(4).非抽象的子類繼承抽象類後,必須實現父類的所有抽象方法;由於子類繼承了父類的所有方法,所以,如果還有未實現的抽象方法的話,該子類就應該定義為抽象類了。繼承抽象類時使用關鍵字extends。

(5).抽象的子類繼承抽象類後,可以不實現父類的抽象方法,也可以定義自己的抽象方法。

(6).抽象類有構造方法,可以有成員變數,但不能實例化;需要通過繼承它的子類來間接實例化。抽象類之所以叫抽象類,正是因為它比較抽象,不能具體化成某個對象,也就是說實例化的時候根本不知道要把它實例化成一個什麼東西,所以它沒法實例化;比如,有一個抽象類叫“生物”,實例化的時候這個“生物”長什麼樣呢,大家都不知道,而當“狗”這個子類繼承“生物”後,再實例化狗,就知道應該怎麼實例化了,狗是一個具象的概念,大體的輪廓大家都知道,至於再具體一點,哈皮狗啊吉娃娃啊,這又屬於“狗”的子類了。

 

介面:

(1).介面中的所有方法都是抽象方法。

(2).介面內的變數都是public static final的,而且必須是這樣的,即使沒有顯式聲明;也就是說,介面內的變數是靜態的、不能修改的;定義時要賦初值,通過介面名來訪問。一般不在介面中定義變數,我理解的是,介面可以由各種各樣的類來實現,這些類可以是完全不相干的類,如果在介面中定義了變數的話,這些變數就是由實現介面的所有類共用的,實際上這些類不一定有這麼些共同的屬性存在,所以最好不在介面中定義變數,有需要就在各個類中各自定義比較好。

(3).介面要由類來實現,所有方法都要實現;類只能繼承一個父類,但可以實現多個介面,介面之間用逗號分隔,如 class A implements interface1,interface2。我們可以把類想像成一塊軟軟的麵團,把介面當成各種各樣的豆子,花生豆是一種介面,紅豆是一種介面,綠豆也是一種介面;當類要實現介面時就把豆子嵌到麵團上,麵團上可以按上好多種類的豆子,也即類可以實現多個介面。

(4).介面沒有構造方法,不能實例化;從這也可以理解為什麼介面中的變數要是static、final的。可以把介面當成一種標準,一種固定的東西,不輕易改變,像上面的各種豆子一樣,有類需要實現介面就按上一種豆子,而這些豆子不需要自己生成新的豆子,只有麵團上要嵌入豆子時才拿來用,也就是說不需要生成一個介面對象,只有類需要它的時候才去實現它。

 

抽象類與介面都是為了繼承與多態,它們都需要子類來繼承才有意義,最終目的是為了多態;子類重寫了父類的方法,再通過向上轉型,由父類對象引用指向子類對象,達到運行時動態調用子類方法的目的。

抽象類是某一類事物的一種抽象,而介面不是類,它只定義了某些行為;如,“生物”類雖然抽象,但有“狗”類的雛形,介面中的run方法可以由狗類實現,也可以由汽車實現。

 

如有錯誤,歡迎指正。

另:如需轉載,請在標題註明(轉載),併在正文加上本文鏈接:http://www.cnblogs.com/chanchan/p/7888324.html

其他的話:

最近在不同的地方有兩次都是偶然間發現有其他人奉行“拿來主義”,在其自己的平臺上發表本人的學習筆記。我並沒有標榜自己寫得有多好或怎樣,但看到這樣的情況心裡不免有點不舒服。畢竟這是我認認真真、辛辛苦苦一個字一個字碼出來的,而且是犧牲自己的睡眠時間擠時間寫出來的,因為每天要等娃睡了我才有點時間乾點自己的事情。大家都不容易,還希望每個人都能尊重別人的勞動成果吧。

 

具體例子如下:

包animals中定義了Animal類、Mammal類、Dog類,其中Animal、Mammal都是抽象類,Mammal類繼承了Animal類,Dog類繼承了Mammal類;

還定義了兩個介面,Interface1和Interface2,Dog類分別實現了這兩個介面。

結果就不一一分析了。

附代碼:

package animals;

public abstract class Animal {

    public Animal() {
        System.out.println("Animal constructor");
    }
    
    public abstract void eat();
    public abstract void sleep();
}


package animals;

public abstract class Mammal extends Animal {

    int mam = 3;
    
    public Mammal() {
        System.out.println("Mammal constructor");
    }

    public abstract void run(int a);
    public abstract void run();
    
    public void breathe() {
        System.out.println("Mammal:breathe");
    }
}


package animals;

public interface Interface1 {
    int infc1 = 2;
    public abstract void run();
}


package animals;

public interface Interface2 {
    public abstract void swim();
}


package animals;

public class Dog extends Mammal implements Interface1,Interface2 {

    public Dog() {
        System.out.println("Dog constructor");
    }
    
    //animal
    public void eat() {
        System.out.println("eat");
    }
    
    //animal
    public void sleep() {
        System.out.println("sleep");
    }
    
    //mammal
    public void run(int a) {
        System.out.println("a=" + a);
        System.out.println("run(a)");
    }

    //interface1
    public void run() {
        System.out.println("run");
    }
    
    //interface2
    public void swim() {
        System.out.println("swim");
    }

    public static void main(String[] args) {
        Dog dogT = new Dog();
        Mammal mal = dogT;//向上轉型
        Animal ani = dogT;//向上轉型
        Interface1 infc1 = dogT;//向上轉型
        Interface2 infc2 = dogT;//向上轉型
        
        System.out.println(dogT.mam);
        System.out.println(dogT.infc1);
        System.out.println(Dog.infc1);
        
        System.out.println("dogT.eat():");
        dogT.eat();
        System.out.println("dogT.sleep():");
        dogT.sleep();
        System.out.println("dogT.run(8):");
        dogT.run(8);
        System.out.println("dogT.run():");
        dogT.run();
        System.out.println("dogT.swim():");
        dogT.swim();
        
        System.out.println("mal.eat():");
        mal.eat();
        System.out.println("mal.sleep():");
        mal.sleep();
        System.out.println("mal.run(9):");
        mal.run(9);
        System.out.println("mal.run():");
        mal.run();
        
        System.out.println("ani.eat():");
        ani.eat();
        System.out.println("ani.sleep():");
        ani.sleep();
        
        System.out.println("infc1.run():");
        infc1.run();
        System.out.println("infc2.swim():");
        infc2.swim();
    }
}

輸出結果如下:

 1 Animal constructor
 2 Mammal constructor
 3 Dog constructor
 4 3
 5 2
 6 2
 7 dogT.eat():
 8 eat
 9 dogT.sleep():
10 sleep
11 dogT.run(8):
12 a=8
13 run(a)
14 dogT.run():
15 run
16 dogT.swim():
17 swim
18 mal.eat():
19 eat
20 mal.sleep():
21 sleep
22 mal.run(9):
23 a=9
24 run(a)
25 mal.run():
26 run
27 ani.eat():
28 eat
29 ani.sleep():
30 sleep
31 infc1.run():
32 run
33 infc2.swim():
34 swim

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 工作中我們會使用到各種各樣的文檔,其中,PPT起著不可或缺的作用。一份PPT文檔里可能包含重要商業計劃、企業運營資料或者公司管理資料等。因此,在競爭環境里,企業重要資料的保密工作就顯得尤為重要,而對於重要資料我們可以選擇添加密碼的形式來進行文檔保護。本文將介紹如何通過C#來給PPT添加密碼,當然你也 ...
  • 關於web變數配置問題 webservice裡面介面完成時考慮到介面可能用在不同的伺服器,不同的資料庫所以將鏈接地址修改成變數,在webconfig裡面去修改它更加的容易方便 假始根據在同一個伺服器裡面,訪問不同的資料庫裡面的數據首先可以將資料庫名申明成為一個變數,在web裡面調用介面時,可以自由填 ...
  • 在看過一篇文章 WPF自定義控制項之列表滑動特效 PowerListBox http://www.cnblogs.com/ShenNan/p/4993374.html#3619585 實現了滑動的特效(就是動畫)之後 ,覺得很有趣 也想在 UWP裡面實現。最好效果如下 接下來就說說是怎麼實現的吧: 一 ...
  • 代碼如下: //複製文件 private void btnCopy_Click(object sender, EventArgs e) { try { if (!File.Exists(this.txtFileName.Text)) { MessageBox.Show("文件不存在"); } els ...
  • Orchard Core 是Orchard CMS的ASP.NET Core版本。 Orchard Core是全新一代的ASP.NET Core CMS。 官方文檔介紹:http://orchardcore.readthedocs.io/en/latest/GitHub: https://githu ...
  • 【返回導航】 在簡單瞭解了Orleans 之後我們可以通過幾個例子去加深印象 一、快速入門示例 這個例子也是跟著《Microsoft Orleans 之 入門指南》(https://www.cnblogs.com/endv/p/6147976.html)這篇文章做的 上篇筆記中的連個例子說明瞭開發的 ...
  • 1、介紹 FSLIB.NETWORK 是一款開源HTTP的高性能高易用性網路庫,是對HttpWebRequest/HttpWebResponse的包裝,目的是為了用起來更簡單明瞭。設計的時候就為了提供更高的可用性和擴展性。每天由它發現的請求數過億。 源碼:https://github.com/icc ...
  • 問題 1072: 汽水瓶 時間限制: 1Sec 記憶體限制: 128MB 題目描述 有這樣一道智力題:“某商店規定:三個空汽水瓶可以換一瓶汽水。小張手上有十個空汽水瓶,她最多可以換多少瓶汽水喝?”答案是5瓶, 方法如下:先用9個空瓶子換3瓶汽水,喝掉3瓶滿的,喝完以後4個空瓶子,用3個再換一瓶,喝掉這 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...