JAVA知識基礎(六):抽象

1.概述

抽象類、抽象方法以及接口,這三個知識點是每個程序員必備的基礎,無論是在實際編程的時候,還是在面試的時候,都會出現這類問題,面試官很可能就會問你,interface和abstract的區別

當父類知道子類應該包含什么樣的方法,但無法確定子類如何實現這些方法;在分析事物時,會發現事物的共性,將共性抽取出,實現的時候,就會有這樣的情況:方法功能聲明相同,但方法功能主體不同,這時,將方法聲明抽取出,那么,此方法就是一個抽象方法。

2.抽象類小結

  1. 抽象類和抽象方法都必須用abstract修飾符來修飾,抽象方法不能有方法體
  2. 抽象類有構造器,但不能直接被實例化,要創建對象涉及向上轉型,主要是用于被其子類調用
  3. 抽象類中可以沒有抽象方法,但是有抽象方法的類必定是抽象類
  4. 抽象類中可以包含靜態方法
  5. 抽象類不能用final修飾
  6. 抽象類不能用private修飾
  7. 抽象類也是類,一樣是用來繼承的,接口與類才是實現關系
  8. 外部抽象類不能用Static修飾,但內部的抽象類可以使用static聲明
  9. 抽象類可以繼承抽象類,抽象派生類可以覆蓋基類的抽象方法,也可以不覆蓋。如果不覆蓋,則其具體非抽象派生類必須覆蓋它們
  10. 抽象類可以實現接口,可以把接口中方法映射到抽象類中作為抽象方法而不必實現,而在抽象類的子類中實現接口中方法

3.抽象類組成分析

普通類可以包含構造方法、普通方法、static方法、常量和變量等內容。而抽象類也是類,而且是一個特別的類,抽象類是指在普通類的結構里面選擇性的增加抽象方法并以abstract關鍵字將該類修飾,是的,每個抽象類不管有沒有抽象方法在其類結構中,abstract關鍵字非加不可。

1、抽象類必須使用abstract修飾符來修飾,抽象方法也必須使用abstract修飾符來修飾,抽象方法不能有方法體。
2、抽象類不能被實例化,無法使用new關鍵字來調用抽象類的構造器創建抽象類的實例。
3、抽象類可以包含成員變量、方法(普通方法和抽象方法都可以)、構造器、初始化塊、內部類(接 口、枚舉)5種成分。
4、抽象類的構造器不能用于創建實例,主要是用于被其子類調用。
5、抽象類中不一定包含抽象方法,但是有抽象方法的類必定是抽象類
6、abstract static不能同時修飾一個方法 (abstract方法沒有方法體不能直接調用,static方法可以直接調用,沖突)

4.不能共存的關鍵字

不能與抽象類(abstract)共存的關鍵字主要有三個,分別是final、private、static

1、final
final:抽象類不能用final修飾。因為抽象類一定要被abstract修飾,而且抽象類一定要被繼承否則該抽象類無意義。而被final修飾的類不能被繼承,也就是說不能有子類,所以二者沖突不能同時使用!

2、private
private: 抽象類不能用private修飾,只能用public或protected。首先要明確一點:被abstract修飾的類是為了讓非抽象子類看到并強制重寫。如果抽象類中有私有的抽象方法,那么該抽象方法不被子類所知,就無法被復寫。 而抽象方法出現的就是需要被復寫。

3、static
static:如果static可以修飾抽象方法,那么連對象都省了,直接類名調用就可以了。眾所周知,抽象方法是沒有方法體的,可見運行也就沒意義了。雖然外部抽象類不能用Static修飾,但內部的抽象類卻可以使用static聲明

//定義一個抽象類A
abstract class A{//定義一個內部抽象類Bstatic abstract class B{  //static定義的內部類屬于外部類public abstract void saoMethod();}
}
class C extends A.B{public void saoMethod(){System.out.println("======saoMethod方法執行了======");}
}
public class StaticDemo {public static void main(String[] args) {A.B ab = new C();//向上轉型ab.saoMethod();}
}

運行結果: saoMethod方法執行了

說白了抽象類的功能就是一個類定義模板的功能。

5.關于接口(interface)

接口(interface)可以說成是抽象類的一種特例,接口中的所有方法都必須是抽象的。

接口中的方法定義默認為public abstract類型,接口中的成員變量類型默認為public static final。

6.抽象類與接口的區別

下面比較一下兩者的語法區別:

1.抽象類可以有構造方法,接口中不能有構造方法。
2.抽象類中可以有普通成員變量,接口中沒有普通成員變量
3.抽象類中可以包含非抽象的普通方法,接口中的可以有非抽象方法,比如deaflut方法
4.抽象類中的抽象方法的訪問類型可以是public,protected和(默認類型,雖然 eclipse下不報錯,但應該也不行),但接口中的抽象方法只能是public類型的,并且默認即為public abstract類型。
5.抽象類中可以包含靜態方法,接口中不能包含靜態方法
6.抽象類和接口中都可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型,并且默認即為public static final類型。
7.一個類可以實現多個接口,但只能繼承一個抽象類。

注意
有抽象方法不一定是抽象類,也可能是接口。抽象類不一定有抽象方法,可以有非抽象的普通方法。

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

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

相關文章

MIP開發教程(三) 使用MIP-CLI工具調試組件

一 . 在 mip-extensions 倉庫中創建新的組件二 . 預覽調試組件 三 . 在 MIP 頁中引用自己編寫的 MIP 組件 四 . 組件提交到 GitHub 倉庫時需要進行校驗 站長開發的非通用組件,使用 組件上線平臺 提交,上線后代碼位于 GitHub/mip-extension-platform 倉…

JAVA知識基礎(七):封裝

1.概述 封裝(Encapsulation)是指一種將抽象性函式接口的實現細節部分包裝、隱藏起來的方法。 封裝可以被認為是一個保護屏障,防止該類的代碼和數據被外部類定義的代碼隨機訪問。 要訪問該類的代碼和數據,必須通過嚴格的接口控制…

MIP開發教程(二) 使用MIP-CLI工具調試MIP網頁

初始化 MIP 配置 新建一個 MIP 網頁 編寫 MIP 網頁代碼 校驗 MIP 網頁 調試 MIP 網頁 1. 初始化 MIP 配置 首先在html目錄下進行初始化 MIP 配置: $ mip init 此時會創建mip.config文件: 2. 新建一個 MIP 網頁 在mip-project/html文件夾下輸入如下…

Nginx(五):動靜分離

1、概念基礎 Nginx動靜分離簡單來說就是把動態請求和靜態請求分開,不能理解成只是單純的把動態頁面靜態頁面的物理分離。嚴格意義上說應該是動態請求跟靜態請求的分開,可以理解成使用Nginx處理靜態頁面,Tomcat處理動態頁面。動靜分離從目前實…

Nginx(六):配置nginx高可用集群

我們知道在我們使用nginx代理多態tomcat服務器時,如果某臺tomcat服務器發生宕機,那么nginx的分配機制可以自動將其剔除。但是如果發生了nginx的宕機狀況,又該如何解決呢。 1、配置高可用的集群 1.1、什么是高可用 高可用HA(Hig…

MIP開發教程(一) MIP-CLI工具安裝與環境部署

依賴安裝 安裝 MIP-CLI 創建開發文件結構 1. 依賴安裝 MIP-CLI 使用 NPM 安裝,依賴 node 環境: node 安裝-windowsnode 安裝-mac MIP-CLI 開發組件需要 git: git 安裝-windowsgit 安裝-mac 2. 安裝 MIP-CLI MIP-CLI:mip 開…

JAVA知識基礎(八):繼承

1.概述 1.1、繼承的由來 至于由來簡單一句話:多個類中存在相同屬性和行為時,將這些內容抽取到單獨一個類中,那么多個類無需再定義這些屬性和行為。 繼承描述的是事物之間的所屬關系,這種關系是 is-a 的關系。 1.2、繼承的定義 …

MIP 2016年終總結

MIP 項目組成立至今已經有一年多的時間,在過去的一年里,感謝各位的關注。 1. MIP JS 迭代 MIP JS 運行環境是 MIP 頁面和 MIP 組件運行的基石。在 2016 年 4 月,MIP JS 發布了 mipmain-v0.0.1.js, 隨后經過多次迭代,在 2016 年 …

JAVA知識基礎(九):this、super 關鍵字總結

1.this關鍵字 this有三種常見用法 1.this調用本類中的屬性,也就是類中的成員變量 2.this調用本類中的其他方法 3.this調用本類中的其他構造方法,調用時要放在構造方法的首行。 2.super關鍵字 在java里面,對于super關鍵字通常有兩種用法 …

向MIP開源項目提交Issues

Issues 是 GitHub 管理需求,討論技術方案的方式,附:官方解釋。MIP 是在 GitHub 上的開源項目,也使用 Issues 來做任務管理。 一、Issues 在 MIP 項目中的應用 MIP 項目中的 Issues 主要有兩種用法: 1. * 記錄 bug,…

Nginx(七):nginx原理解析

前面我們講到了nginx的反向代理、負載均衡、動靜分離以及高可用,本篇我們來了解一下nginx的原理,看一下nginx是怎么執行的。 1、mater和worker 2、worker是如何進行工作的 3、相關問題 3.1、一個 master 和多個 woker 有好處 (1&#xff0…

為什么MIP-Cache存在

在去年十月的一篇 博客文章 提到 MIP 加速器是由 MIP-HTML, MIP-JS 和 MIP-Cache 三個模塊共同產生加速效果的。MIP-HTML 和 MIP-JS 都是開源的,在 GitHub 上可以訪問。但 MIP-Cache 是百度提供的,所有從百度搜索結果頁打開的頁面都是 MIP-Cache 的頁面。…

JAVA知識基礎(十):多態

1.概述 1.1多態的定義 多態是同一個行為具有多個不同表現形式或形態的能力。 多態就是同一個接口,使用不同的實例而執行不同操作。 多態性是對象多種表現形式的體現。 1.2多態的優點 消除類型之間的耦合關系可替換性可擴充性接口性靈活性簡化性 1.3多態存在的三個…

MIP技術交流分享(3月9日)

3月9日上周四下午,MIP 團隊工程師與去哪兒酒店云、眾薈的 Web 前端工程師進行了一次面對面的技術交流。 在這次交流中,MIP 工程師主要分享了 MIP 技術原理,MIP 加速原理,以及 MIP 為開發者提供的工具集。去哪兒的工程師也提出了通…

JAVA知識基礎(十一):異常

1.異常的概念 簡單說就是不正常運行,最終導致JVM的非正常停止。 在Java等面向對象的編程語言中,異常本身是一個類,產生異常就是創建異常對象并拋出了一個異常對象。Java處理異常的方式是中斷處理。 異常指的并不是語法錯誤,語法錯了,編譯不…

SpringBoot基礎篇(一):Spring Boot入門

我們今天開始對SpringBoot的學習,本篇主要是Spring Boot的入門部分。 1、SpringBoot簡介 引用SpringBoot在百度百科中的含義: Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使…

SpringBoot基礎篇(二):HelloWorld細節探究

1、場景啟動器 1.1依賴 <!--Hello World項目的父工程是org.springframework.boot--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.1.RELEASE</versio…

MIP 與 AMP 合作進展(3月7日)

“到目前為止&#xff0c;全網通過 MIP 校驗的網頁已超10億。除了代碼和緩存&#xff0c; MIP 還想做更多來改善用戶體驗移動頁面。” 3月7日&#xff0c;MIP 項目負責人在首次 AMP CONF 上發言。 那么 MIP 和 AMP 的關系是什么呢&#xff1f; AMP 是一個開源性項目&#xff…

SpringBoot番外篇(一):使用Spring Initializer快速創建Spring Boot項目(IDEA版)

IDE都支持使用Spring的項目創建向導快速創建一個Spring Boot項目&#xff1b; 選擇我們需要的模塊&#xff1b;向導會聯網創建Spring Boot項目&#xff1b; ps:需要聯網 1、創建新項目時選擇Spring Initializ&#xff0c;選擇好java版本&#xff0c;點擊next。r 2、填寫項…

開發教程(四) MIP組件平臺使用說明

組件審核平臺用于上傳 MIP 組件。經過自動校驗之后&#xff0c;提交審核&#xff0c;通過審核的組件會定時推送到線上&#xff0c;供網站使用。 平臺地址&#xff1a;https://www.mipengine.org/platform/ 1. 使用說明 MIP 組件審核平臺用于提交開發完成的組件&#xff0c;如…