JAVA中的介面和抽象類

来源:http://www.cnblogs.com/VioletLove/archive/2016/08/03/5734490.html
-Advertisement-
Play Games

Java中抽象類指的是,對一些具有公共屬性和行為的對象的一種高層次抽象,抽象類定義了一個“模板”,繼承它的子類只要實現自己的特有屬性和行為即可,因此,抽象類不可以被實例化。 Java中的介面,相當於抽象類的進一步抽象,給類定義一些固定不變的“行為”,類只需要去實現介面就可以享用特殊的操作了,Java... ...


在面向對象的概念中,我們知道所有的對象都是通過類來描繪的,但是並不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。
  抽象類往往用來表徵我們在對問題領域進行分析、 設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象,我們不能把它們實例化(拿不出一個具體的東西)所以稱之為抽象。
  比如:我們要描述“水果”,它就是一個抽象,它有質量、體積等一些共性(水果有質量),但又缺乏特性(蘋果、橘子都是水果,它們有自己的特性),我們 拿不出唯一一種能代表水果的東西(因為蘋果、橘子都不能代表水果),可用抽象類來描述它,所以抽象類是不能夠實例化的。當我們用某個類來具體描述“蘋果” 時,這個類就可以繼承描述“水果”的抽象類,我們都知道“蘋果”是一種“水果”。

  在面向對象領域,抽象類主要用來進行類型隱藏。我們可以構造出一個固定的一組行為的抽象描述,但是這組行為卻能夠有任意個可能的具體實現方式。這個抽象描述就是抽象類,而這一組任意個可能的具體實現則表現為這個抽象類的所有派生類。

介面和抽象類中的所有抽象方法不能有具體實現,而應在它們的子類中實現所有的抽象方法(要有函數體,哪怕{ }里是空的),Java的設計者可能為抽象方法的靈活性考慮,每個子類可根據自己的需要來實現抽象方法。

抽象類(abstract class)的定義方式如下:

public abstract class AbstractClass             //裡面至少有一個抽象方法
{
   public int t;  //普通數據成員
   public abstract void method1();   //抽象方法,抽象類的子類在類中必須實現抽象類中的抽象方法
   public abstract void method2(); 
   public void method3();   //非抽象方法
   public int method4();
   publi int method4 (){
        …… //抽象類中可以賦予非抽象方法方法的預設行為,即方法的具體實現
   }

       public void method3(){
        …… //抽象類中可以賦予非抽象方法方法的預設行為,即方法的具體實現
   } 

}  

介面(interface)的定義方式如下:

public interface Interface
{ 
   static final int i;  //介面中不能有普通數據成員,只能夠有靜態的不能被修改的數據成員,static表示全局,final表示不可修改,可以不用static final 修飾,會隱式的聲明為static和final
   

   public void method1();  //介面中的方法一定是抽象方法,所以不用abstract修飾
   

   public void method2();  //介面中不能賦予方法的預設行為,即不能有方法的具體實現
}

  

  簡言之抽象類是一種功能不全的類,介面只是一個抽象方法聲明和靜態不能被修改的數據的集合,兩者都不能被實例化。
  從某種意義上說,介面是一種特殊形式的抽象類,在java語言中抽象類表示的是一種繼承關係,一個類只能繼承繼承一個抽象類,而一個類卻可以實現多個介面。在許多情況下,介面確實可以代替抽象類,如果你不需要刻意表達屬性上的繼承的話。

 

進一步理解,關於Java引入抽象類、介面的目的,向高手請教得到的答覆如下:

1、從類的層次結構上看,抽象類是在層次的頂端,但在實際的設計當中,一般來說抽象類應當是後面才會出現。為什麼?實際上抽象類的獲取有點像數學中 的提取公因式:ax+bx,x就是抽象類,如果你沒有前面的式子,你怎麼知道x是不是公因式呢?在這點上,也符合人們認識世界的過程,先具體後抽象。因此 在設計過程中如果你得到大量的具體概念並從當中找到其共性時,這個共性的集合就是抽象類應當是沒錯的。
2、interface從錶面上看,和抽象類很相似,但用法完全不同。它的基本功能就是把一些毫不相關的類(概念)集合在一起形成一個新的、可集中操作的 “新類”。我給學生的一個典型例子就是“司機”。誰可以當司機?誰都可以,只要領取了駕照。所以我不管你是學生,白領、藍領還是老闆,只要有駕照就是司 機。

interface DriverLicence {
Licence getLicence();
}

class StudentDriver extends Student implements DriverLicence {
}
class WhtieCollarEmployeeDriver extends WhtieCollarEmployee implements DriverLicence {
}
class BlueCollarEmployeeDriver extends BlueCollarEmployee implements DriverLicence {
}
class BossDriver extends Boss implements Driver {
} 

 

當我定義了“汽車”類後,我就可以指定“司機”了。

class Car {
setDriver(DriverLicence driver);
} 


這時候,Car的對象並不關心這個司機到底是乾什麼的,他們的唯一共同點是領取了駕照(都實現了DriverLicence介面)。這個,應當是介面最強大的地方也是抽象類無法比擬的。
     

總結:抽象類是提取具體類的公因式,而介面是為了將一些不相關的類“雜湊”成一個共同的群體。通常我們平時養成良好的習慣就是多用介面,畢竟java是單繼承,不像C++,但是在需要使用抽象類的時候一定還是要用的(有點類似goto的用法),呵呵。


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

-Advertisement-
Play Games
更多相關文章
  • NSoup是一個開源框架,是JSoup(Java)的.NET移植版本 1、直接用起來 NSoup的強大之處在於可以用類似js的方法來獲取節點元素 通過元素類型獲取元素GetElementByTag("p") 2、做了一個winform的小demo 關鍵代碼: 下麵以提取一個html代碼中211大學名 ...
  • Redis是一個用的比較廣泛的Key/Value的記憶體資料庫,也是最快的key-value分散式緩存之一。 Redis官網:http://redis.io/ Redis快速入門教程:http://www.yiibai.com/redis/redis_quick_guide.html 解壓版下載地址: ...
  • 度娘的思路 Action() { //實現1-2+3-4+5……+99-100的值 //20160802 int i,tag,sum; sum=0; tag=1; for(i=1;i<=100;i++) { sum+=i*tag; tag=-tag; } lr_output_message ("%d ...
  • 一、集群容錯 技術選型:hystrix。(就是上圖中熔斷器) 熔斷的作用: 第一個作用: 假設有兩台伺服器server1(假設可以處理的請求閾值是1W請求)和server2,在server1上註冊了三個服務service1、service2、service3,在server2上註冊了一個服務serv ...
  • windows-->preference-->myeclipse-->files and editors-->jsp 右側 Encoding 選擇 ISO 10646/Unicode(UTF-8)。 ...
  • 第一種:指定Method屬性(Action比較多) <!-- 聲明包 --> <package name="user" extends="struts-default"> <!-- 定義action --> <action name="first" class="com.sxt.action.Use ...
  • Java記憶體分配和回收的機制概括的說,就是:分代分配,分代回收。 對象將根據存活的時間被分為:年輕代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation,也就是方法區)。 java中每新new一個對象所占用的記憶體空間就是年輕代 ...
  • 一、IPython 簡介 IPython 是一個互動式的 Python 解釋器,而且它更加高效。 它和大多傳統工作模式(編輯 -> 編譯 -> 運行)不同的是, 它採用的工作模式是:執行 -> 探索 ,而大部分和數據分析相關的代碼都含有探索式操作(比如試誤法和迭代法),所以 IPython 能大大提 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...