Java基礎:Java抽象接口

在Java中,一個沒有方法體的方法應該定義為抽象方法,而如果一個類中含有抽象方法,則該類必須定義為一個抽象類。接口是功能的集合,同樣可看做是一種特殊的數據類型,是比抽象類更為抽象的類,接口只描述所應該具備的方法,并沒有具體實現,具體的實現由接口的實現類(相當于接口的子類)來完成。這樣將功能的定義與實現分離,優化了程序設計

本篇主要記錄內容包括:抽象類、接口、抽象類和接口的差異、接口的新特性——默認方法和靜態方法、 標記接口等相關內容


  • 上一篇內容:Java基礎:Java面向對象
  • 下一篇內容:Java基礎:Java異常機制
  • 更多知識學習:全網最全的 Java 技術棧內容梳理(持續更新中)

文章目錄

    • 一、抽象類
        • 1、抽象類概述
        • 2、抽象類特點
    • 二、接口
        • 1、接口概述
        • 2、接口特點
    • 三、抽象類和接口的差異
        • 1、相同點
        • 2、不同點
    • 四、接口的新特性——默認方法和靜態方法(jdk8之后)
        • 1、默認方法
        • 2、靜態方法
        • 3、注意事項
    • 五、標記接口(標簽接口)


一、抽象類

1、抽象類概述

在Java中,一個沒有方法體的方法應該定義為抽象方法,而如果一個類中含有抽象方法,則該類必須定義為一個抽象類

抽象類通常作為一個框架,把子類將實現的抽象方法組織起來,簡化或限制子類的設計

抽象方法定義的格式:public abstract 返回值類型 方法名(參數);

抽象類定義的格式:abstract class 類名 {}

2、抽象類特點

  • 抽象類和抽象方法都需要被 abstract 修飾。抽象方法一定要定義在抽象類中;
  • static、final、private 不能與 abstract 同時出現;
  • 抽象類不一定有抽象方法,但是含有抽象方法的類必須是抽象類;
  • 構造方法,類方法(用 static 修飾的方法),不能聲明為抽象方法;
  • 抽象類本身不能實例化(但是多態機制可以用子類實例化),不可以直接創建對象,原因:調用抽象方法沒有意義;
  • 只有覆蓋了抽象類中所有的抽象方法后,其子類才可以創建對象。否則該子類還是一個抽象類;
  • 抽象類只定義了類的部分行為(包含具體行為), 這些行為是 子類共有的,其它行為由子類實現的抽象方法提供
  • 抽象類的成員變量:既可以變量,又可以是常量;
  • 抽象類的構造方法:用于父類數據的初始化
  • 子類繼承抽象類時,構造方法不會被覆蓋。 而且,在實例化子類對象時首先調用的是抽象類中的構造方法再調用子類中的

二、接口

1、接口概述

接口是功能的集合,同樣可看做是一種特殊的數據類型,是比抽象類更為抽象的類,接口只描述所應該具備的方法,并沒有具體實現,具體的實現由接口的實現類(相當于接口的子類)來完成。這樣將功能的定義與實現分離,優化了程序設計

接口的聲明:使用interface代替了原來的class其他步驟與定義類相同

接口的實現類:使用implements關鍵字實現接口,當類實現接口的時候,類要實現接口中所有的方法。否則,類必須聲明為抽象類

2、接口特點

接口中方法的修飾符:public abstract(默認不寫)

  • 接口是隱式抽象的,當聲明一個接口的時候,不必使用 abstract 關鍵字;
  • 接口中定義的變量,固定的修飾符為 public static final (默認不寫,也可以選擇性寫)所以接口中的變量也稱之為常量,其值不能改變;
  • 接口中定義的方法,固定的修飾符為 public abstract(默認不寫,也可以選擇性寫),不能指定其它的訪問控制修飾符;
  • 接口中的成員變量必須顯式初始化;
  • 接口中成員方法定義的固定格式:public abstract 返回值類型 方法名字(參數列表)
  • 子類必須覆蓋接口中所有的抽象方法后,子類才可以實例化,否則子類是一個抽象類;
  • 接口的重載條件和普通類沒有任何區別,只是重載的方法沒有方法體;
  • 接口中的方法也可以覆蓋(Override),但沒有實際的意義,因為接口中不提供方法的實現;
  • 一個接口能繼承另一個接口,和類之間的繼承方式比較相似。接口的繼承使用extends關鍵字,子接口繼承父接口的方法。在Java中,類的多繼承是不合法,但接口允許多繼承。

三、抽象類和接口的差異

1、相同點

  • 抽象類和接口都位于繼承的頂端,用于被其他類實現或繼承.
  • 都不能直接實例化對象.
  • 都包含抽象方法,其子類都必須覆蓋這些抽象方法.

2、不同點

  • 抽象類中的方法可以有方法體,就是能實現方法的具體功能,但是接口中的方法不行
  • 抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是public static final類型的
  • 接口中不能含有靜態代碼塊以及靜態方法(用static修飾的方法),而抽象類是可以有靜態代碼塊和靜態方法;
  • 一個類只能繼承一個抽象類,而一個類卻可以實現多個接口;

總的來說,優先選用接口,盡量少用抽象類,需要定義子類的行為,又要為子類提供共性功能時才選用抽象類

四、接口的新特性——默認方法和靜態方法(jdk8之后)

1、默認方法

  • 可以在不影響已有類的情況下,修改接口;
  • 可以有方法實現;
  • 父類中的默認方法可以被子接口繼承;
  • 子接口可以覆蓋父接口中的默認方法,甚至還可以把父接口中的默認方法覆蓋為抽象方法;
  • 實現接口后,因為默認方法不是抽象方法,所以可以不重寫,但是如果開發需要,也可以重寫;
  • 默認方法使用default關鍵字,只能通過接口實現類的對象來調用;
  • 注意:默認方法的訪問權限也是默認public

2、靜態方法

  • 可以有方法實現;
  • 可以直接通過接口名來訪問;
  • 靜態方法沒有方法覆蓋,因為靜態方法沒有運行時多態
interface Test{//這個是默認方法default String get(String aa){System.out.println("我是jdk1.8默認實現方法...");return "";}   //這個是靜態方法    static void staticmethod(){System.out.println("我是靜態方法");}
}

3、注意事項

  • 接口默認方法、靜態方法可以有多個;
  • 默認方法通過實例調用,靜態方法通過接口名調用;
  • default默認方法關鍵字只能用在接口中;
  • 默認方法可以被繼承,如果繼承了多個接口,多個接口都定義了多個同樣的默認方法,實現類需要重寫默認方法不然會報錯;
  • 靜態方法不能被繼承及覆蓋,所以只被具體所在的接口調用

五、標記接口(標簽接口)

Java中的標記接口(Marker Interface),又稱標簽接口(Tag Interface),是沒有任何方法和屬性的接口,它不對實現它的類有任何語義上的要求,它僅僅表明實現它的類屬于一個特定的類型

在Java中很容易找到標記接口的例子,比如JDK中Serialzable接口就是一個標記接口

標記接口并不是Java語言獨有的,而是計算機科學中的一種通用的設計理念。

The tag/marker interface pattern is a design pattern in computer science, used with languages that provide run-time type information about objects. It provides a means to associate metadata with a class where the language does not have explicit support for such metadata.

具體說的就是,標記接口是計算機科學中的一種設計思路,用于給那些面向對象的編程語言描述對象。因為編程語言本身并不支持為類維護元數據,而標記接口可以用作描述類的元數據,彌補了這個功能上的缺失。對于實現了標記接口的類,我們就可以在運行時通過反射機制去獲取元數據。

Serializable接口為例,如果一個類實現了這個接口,則表示這個類可以被序列化。因此,我們實際上是通過了Serializable這個接口給該類標記了【可被序列化】的元數據,打上了【可被序列化】的標簽。這也是標記/標簽接口名字的由來。

具體在Java中,標記接口主要有以下兩種目的:

  • 建立一個公共的父接口:
    例如,EventListener接口,一個由幾十個其它接口擴展的Java API,當一個接口繼承了EventListener接口,Java虛擬機(JVM)就知道該接口將要被用于一個事件的代理方案。同樣的,你可以使用一個標記接口來建立一組接口的父接口。
  • 向一個類添加數據類型:
    這是標記接口最初的目的,實現標記接口的類不需要定義任何接口方法(因為標記接口根本就沒有方法),但是該類通過Java的多態性可以變成一個接口類型。

java.awt.event 包中的 MouseListener 接口繼承的 java.util.EventListener 接口定義如下:

package  java.util; 
public  interface  EventListener  {}

Java源碼中幾個標記接口的優秀例子:

  • java.io.Serializable:未實現此接口的類將無法使其任何狀態序列化或反序列化。為保證serialVersionUID值跨不同Java編譯器實現的一致性,序列化類必須聲明一個明確的 serialVersionUID值。
  • java.lang.Cloneable:表明Object.clone()方法可以合法地對該類實例進行按字段復制。實現此接口的類應該使用公共方法重寫Object.clone(它是受保護的)。如果在沒有實現 Cloneable接口的實例上調用Object的clone()方法,則會導致拋出CloneNotSupportedException異常。
  • java.util.RandomAccess:用來表明其支持快速(通常是固定時間)隨機訪問。此接口的主要目的是允許一般的算法更改其行為,從而在將其應用到隨機或連續訪問列表時能提供良好的性能。
  • java.rmi.Remote:Remote接口用于標識其方法可以從非本地虛擬機上調用的接口。任何遠程對象都必須直接或間接實現此接口。只有在遠程接口(擴展java.rmi.Remote的接口)中指定的這些方法才可遠程使用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535456.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535456.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535456.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

13 張圖帶你學懂 Kubernetes Service(轉載)

在 Kubernetes 中 Service 主要有4種不同的類型,其中的 ClusterIP 是最基礎的,如下圖所示: 當我們創建一個 NodePort 的 Service 時,它也會創建一個 ClusterIP,而如果你創建一個 LoadBalancer,它就會創建一…

Java基礎:Java異常機制

異常是程序運行過程中出現的錯誤。Java 把異常當作對象來處理,把異常信息封裝成了一個類,并定義一個基類java.lang.Throwable作為所有異常的超類。Throwable : 它是所有錯誤與異常的超類(祖宗類),有兩個子類 Error 和 Exception。…

JavaWeb:Servlet的應用及接口介紹

廣義的 Servlet 泛指在服務器上運行的 Java 程序,但是這個 Java 程序,并不能獨立運行(因為 Servlet 沒有 main 方法),需要部署在相應的 Servlet 容器中,比如 Tomcat 和 Jetty。Servlet 主要功能在于交互式地…

DOCKERFILE參數注解

Dockerfile由一行行命令語句組成,并且支持以#開頭的注釋行。 一般的,Dockerfile 分為四部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令。 Dockerfile的指令是忽略大小寫的,建議使用大寫,使用 # 作為…

Zookeeper:分布式過程協同技術

Zookeeper 是一個高性能的分布式一致系統,在分布式系統中有著廣泛的應用。基于它,可以實現諸如“分布式同步”、“配置管理”、“命名空間管理”等眾多功能,是分布式系統中常見的基礎系統。Zookeeper 主要用來解決分布式集群中應用系統的一致…

面試題2021-2-24

給某CentOs6慮擬機添加了新的數據盤,設備名為/de/sdd.寫命令格式化滿加的效的并掛載到指定目錄/opt fdisk -l mkfs.ext4 /de/sdd mount /de/sdd /opt 如何查看與RabbtMQ服務器之間的establish狀態連接數?netstat -an |grep ESTABLISHED |grep tcp |wc -l…

Zookeeper:在三種模式下的部署

zookeeper 安裝模式有三種:單機模式:單機單 server;集群模式:多機多 server,形成集群;偽集群模式:單機多 server,形成偽集群。 ~ 本篇內容包括:Zookeeper 官網下載、Zook…

Linux namespace概述

操作系統通過虛擬內存技術,使得每個用戶進程都認為自己擁有所有的物理內存,這是操作系統對內存的虛擬化。操作系統通過分時調度系統,每個進程都能被【公平地】調度執行,即每個進程都能獲取到CPU,使得每個進程都認為自己…

Zookeeper:Zookeeper的主從選舉機制

ZAB 協議,全稱 Zookeeper Atomic Broadcast(Zookeeper 原子廣播協議),是為分布式協調服務 ZooKeeper 專門設計的一種支持崩潰恢復的一致性協議。基于該協議,ZooKeeper 實現了一種主從模式的系統架構來保持集群中各個副…

Linux namespace之:uts namespace

理解uts namespace uts(UNIX Time-Sharing System) namespace可隔離hostname和NIS Domain name資源,使得一個宿主機可擁有多個主機名或Domain Name。換句話說,可讓不同namespace中的進程看到不同的主機名。 例如,使用unshare命令(較新版本L…

Zookeeper:事件監聽和通知機制

Zookeeper 允許客戶端向服務端的某個 Znode 注冊一個 Watcher 監聽,當服務端的一些指定事件觸發了這個 Watcher,服務端會向指定客戶端發送一個事件通知來實現分布式的通知功能,然后客戶端根據 Watcher 通知狀態和事件類型做出業務上的改變。 …

Linux namespace之:mount namespace

理解mount namespace 用戶通常使用mount命令來掛載普通文件系統,但實際上mount能掛載的東西非常多,甚至連現在功能完善的Linux系統,其內核的正常運行也都依賴于掛載功能,比如掛載根文件系統/。其實所有的掛載功能和掛載信息都由內…

Linux namespace之:network namespace

理解network namespace network namespace用來隔離網絡環境,「在network namespace中,網絡設備、端口、套接字、網絡協議棧、路由表、防火墻規則等都是獨立的」。 因network namespace中具有獨立的網絡協議棧,因此每個network namespace中都…

Kubernetes 的原理

kubernetes 已經成為容器編排領域的王者,它是基于容器的集群編排引擎,具備擴展集群、滾動升級回滾、彈性伸縮、自動治愈、服務發現等多種特性能力。 本文將帶著大家快速了解 kubernetes ,了解我們談論 kubernetes 都是在談論什么。 kuberne…

Zookeeper:實現“分布式鎖”的 Demo

Zookeeper 能保證數據的強一致性,用戶任何時候都可以相信集群中每個節點的數據都是相同的。一個用戶創建一個節點作為鎖,另一個用戶檢測該節點,如果存在,代表別的用戶已經鎖住,如果不存在,則可以創建一個節…

JavaIO流:案例

java.io 包下需要掌握的流有 16 個,本篇內容包括:java.io包下需要掌握的流、Java IO 案例。 文章目錄一、java.io包下需要掌握的流二、Java IO 案例1、Demo 1(FileInputStream)2、Demo 2(FileInputStream)3…

比對excel數據

#!/usr/bin/env pythonimport openpyxl from openpyxl.styles import PatternFill from openpyxl.styles import colors from openpyxl.styles import Font, Color aD:/測算單位設置/比對/吉林/tmp001.xlsx bD:/測算單位設置/比對/吉林/國網吉林電力.xlsx cD:/測算單位設置/比對…

CPU 是如何執行任務的

前言 你清楚下面這幾個問題嗎? 有了內存,為什么還需要 CPU Cache? CPU 是怎么讀寫數據的? 如何讓 CPU 能讀取數據更快一些? CPU 偽共享是如何發生的?又該如何避免? CPU 是如何調度任務的&a…

Ansible 的自動化運維

1、Ansible 特點 Ansible 自 2012 年發布以來,很快在全球流行,其特點如下: Ansible 基于 Python 開發,運維工程師對其二次開發相對比較容易; Ansible 豐富的內置模塊,幾乎可以滿足一切要求; …

Shell 信號發送與捕捉

1、Linux信號類型 信號(Signal):信號是在軟件層次上對中斷機制的一種模擬,通過給一個進程發送信號,執行相應的處理函數。 進程可以通過三種方式來響應一個信號: 1)忽略信號,即對信…