java抽象類和接口知識總結

一.抽象類

1.啥是抽象類

用專業語言描述就是:如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類

當然這話說的也很抽象,所以我們來用人話來解釋一下抽象類

拋開編程語言這些,就以現實舉例,我說貓的話,你頭腦能馬上浮現一只貓的具象,我說狗的話,你頭腦能馬上浮現一條狗的具象,但是當我說動物的時候,你頭腦是不能浮現動物的具象,或許頭腦里一會閃過雞鴨魚這些動物的樣子,過一會又會閃過牛馬羊這些動物的樣子,也就是說,你找不到一個具象能夠說動物具象化的樣子就是這個具象,所以我們稱動物就是一個抽象類。當然我們也可以繼續往下再抽象,比如狗,又分為各種各樣的狗,哈士奇,柴犬,斗牛犬等等,這時狗又可以被稱為抽象類,如此類推,可以繼續細分抽象類。所以在實際開發中,我們將什么看作為抽象類,注意還是要以實際情況為準

2.抽象類的構成結構

3.抽象類知識點

1.抽象類不能直接實例化對象,也就是說不能通過new 類名()來創建對象

2.被abstract修飾的類就是抽象類,因為是類,所以抽象類跟普通類的基本結構沒什么區別,唯一的區別就是多了抽象方法區

3.抽象類的訪問修飾符不能用private,抽象方法也是一樣不能用private

4.抽象方法也就是被abstract修飾的方法,所以abstract不僅可以修飾類,還可以修飾方法

5.抽象方法是不能被實現的,也就是說只能在這里寫個:修飾符? 返回類型? ?方法名(參數);

6.抽象方法不能被final和static修飾

7.抽象類中不一定要有抽象方法,但有抽象方法的一定是抽象類

8.抽象類必須被繼承,如果子類不重寫抽象類中的抽象方法,否則子類也是抽象類,必須用abstract修飾

現在我們來理解一下這些知識

1.為什么不能實例化對象?原因就如我們剛剛解釋什么是抽象類里一樣,我說動物,你不能夠找出一個具象說它就是動物的具象化,因為動物是有能跑能飛的,你如果說狗,但是狗不會飛,所以狗不能把動物這個抽象類全部描繪清楚,相當于數學里的包含關系,如圖

2.抽象類生來就是為了被繼承而誕生的,抽象類的作用就是將許多對象的共性集合起來,然后將這些共性變成抽象方法,比如吃飯,但是不同動物吃的不一樣,狗吃狗糧,貓吃貓糧,牛吃草,虎吃肉,但它們這些行為整體歸納起來還是就兩個字:吃飯。所以我們將這些共性放在抽象類里,繼承給某個具體對象時,它能根據自身情況實現里面的方法,這也是多態的概念——即不同對象去完成時會產生不同的狀態

3.所以抽象類天生就是當父親的料,也就是說它是父類圣體,幾乎可以看到抽象類就知道它是父類了,所以要想使用父類里的東西,那么它的訪問權限符肯定不能是private,那不然子類怎么去實現父類的抽象方法,就相當于一個人把遺產設置為private私人的,活的時候這遺產誰都不給用,那么他就算是死了,這遺產也要連著他一起都燒了,那還怎么讓子孫去繼承這個遺產,所以不能用private修飾抽象類(用重寫規則里的“子類重寫方法的訪問權限不能比父類中被重寫方法的訪問權限更低”也說得通,因為private是最低的訪問權限了,沒有比private更低的訪問權限了)

4.因為抽象方法在抽象類里是不能被實現的,所以它注定是要子類被重寫的,既然要被重寫了,就不能再加final(final修飾變量或字段,表示變為了常量;修飾類,表示此類不能被繼承;修飾方法,表示該方法不能被重寫),static也是修飾方法表示此方法不能被重寫,就好比嘴上說一套,私底下又一套,嘴上說大家快來重寫我的抽象方法,結果私底下又給自己的抽象方法加上final或static不讓這個抽象方法被重寫

5.子類繼承了抽象類后,子類可以重寫父類中的方法,也可以不重寫父類中的方法,如果不重寫,那么子類也就變成了抽象類,于是又開始新的一輪繼承,就相當于從祖先傳下來了一個未解的秘密,如果這一代人沒把這個秘密解出來,那么就傳給下一代人解,直到這個秘密被解出來為止,所以會出現不同情況,一種是一開始有許多抽象方法,但每一代都實現幾個抽象方法,如此類推,另一種是一開始有許多抽象方法,但每一代不僅不實現抽象方法,還在自己這一代再添加一些抽象方法,總的概括來說,就是父債子償,出來混總該要還的

6.既然核心就是要重寫父類里的方法,那么為什么一定要用抽象類呢,普通類也能被重寫呀,確實如此,用普通類也能實現上述一切要求,但是使用抽象類相當于多了一重編譯器的校驗,如果有一天腦袋突然糊涂了,把該重寫的方法沒有進行重寫,那么運行出來結果就會出錯,這時候又要在所有的代碼里面找錯誤,如果我們使用抽象類,就可以在我們這種犯糊涂的時候進行報錯,讓我們盡早發現問題。很多語法存在的意義就是為了“預防出錯”,像之前的final也是類似,如果我們給不想被修改的變量加上final,那么當我們不小心修改這個變量時,編譯器就會報錯,及時提醒我們。

所以充分利用編譯器的校驗,在實際開發中是非常有意義的

4.抽象類的例子
abstract class Animal{//抽象方法區abstract public void eat();abstract void speak();//其他區public String name;
}
class Dog extends Animal{public Dog(String name){this.name=name;}@Override  //利用注解也能利用編譯器的檢查優勢,提高開發效率public void eat(){System.out.println(name+"吃狗糧");}@Overridepublic void speak(){System.out.println(name+"汪汪汪");}
}
class Cat extends Animal{public Cat(String name){this.name=name;}@Overridepublic void eat(){System.out.println(name+"吃貓糧");}@Overridepublic void speak(){System.out.println(name+"喵喵喵");}
}
public class Test {public static void main(String[] args) {Dog dog=new Dog("旺財");Cat cat=new Cat("小貓");dog.eat();dog.speak();cat.eat();cat.speak();}
}

二.接口

1.啥是接口

用專業語言解釋:多個類的公共規范,是一種引用數據類型

用人話來說,其實和抽象類非常相似,也是將許多對象的共性放在接口里,然后每個對象重寫接口里的抽象方法,實現多態。那么它存在的意義是什么呢?就要說回抽象類了,因為抽象類是用extends來繼承,變成父類子類的關系,但是在Java里面,只能實現單繼承,不支持多繼承,所以為了解決這個問題,接口就誕生了。所以就是為了一個類可以實現多個接口。

2.接口的構成結構

3.接口知識點

1.同抽象類一樣,接口也是不能被new()創建對象的,即使接口類型是一種引用類型

2.被interface修飾的就是接口,因為接口屬于引用類型,不屬于類,所以前面沒有class了

3.如上圖所示,接口中的方法都是抽象方法,即系統默認都是public abstract修飾的,也就是說,接口中的方法是不能在接口里面實現的,同時因為public abstract是系統默認修飾的,所以提高代碼簡潔性,一般都是不寫的(例如阿里的編碼規范中就要求不寫public abstract)

4.如果一定要實現接口中的方法,用default或static修飾,那么可以有具體的實現(這也是與抽象類不同的地方,抽象類即使加了default和static也不能被實現)

5.同抽象類一樣,接口不能被private修飾,里面的抽象方法也不能被private修飾

6.重寫接口中的方法不能使用默認的訪問權限,因為重寫規則里的“子類重寫方法的訪問權限不能比父類中被重寫方法的訪問權限更低”可得,接口中的方法默認是public,所以也只能用public來重寫接口中的方法

7.如上圖所示,接口中的變量系統默認用public static final修飾,所以即使不寫,也是被隱式指定的

8.接口中不能有靜態代碼塊和構造方法

9.接口雖然不是類,但是接口編譯完成后字節碼文件的后綴格式也是.class

10.與繼承extends不同,類連接接口用implements

11.同抽象類一樣,如果一個類連接接口后,如果不想實現接口里的抽象方法,那么這個類就要定義為抽象類,然后繼承給其他類,如此循環繼承,直到抽象方法全部被實現才可以不變為抽象類

12.接口名一般以大寫i為首字母命名

13.如果一個類既需要繼承又需要連接接口,那么必須先extends再implements

4.接口的例子
class Animal{protected String name;public Animal(String name){this.name=name;}
}
interface IFlying{void fly();  //省略public abstract,提高代碼簡潔性
}
interface IRunning{void run();
}
interface ISwimming{void swim();
}
class Cat extends Animal implements IRunning{  //先extends再implementspublic Cat(String name){super(name);  //子類實例化前必須先初始化父類}@Override  //添加注解,利用編譯器的檢查優勢,提高開發效率public void run(){  //必須用public才能重寫System.out.println(this.name+"正在用四條腿跑");}
}
class Duck extends Animal implements IRunning,IFlying,ISwimming{  //實現多接口public Duck(String name){super(name);   //子類實例化前必須先初始化父類}@Overridepublic void run(){System.out.println(this.name+"正在用兩條腿跑");}@Overridepublic void fly(){System.out.println(this.name+"正在用翅膀飛");}@Overridepublic void swim(){System.out.println(this.name+"正在漂在水上");}
}
public class Test {public static void main(String[] args) {Cat cat=new Cat("neko");Duck duck=new Duck("唐老鴨");cat.run();duck.run();duck.fly();duck.swim();}
}

三.抽象類和接口的區別

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

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

相關文章

每日練習之排序——鏈表的合并;完全背包—— 兌換零錢

鏈表的合并 題目描述 運行代碼 #include<iostream> #include<algorithm> using namespace std; int main() { int a[31];for(int i 1;i < 30;i)cin>>a[i];sort(a 1,a 1 30);for(int i 1;i < 30;i)cout<<a[i]<<" ";cout&…

Mysql之Innodb存儲引擎

1.Innodb數據存儲 innodb如今能夠做到mysql的默認數據存儲引擎&#xff0c;肯定有著其好處的&#xff0c;那么innodb有什么好處呢? 1. 當意外斷電或者重啟&#xff0c; InnoDB 能夠做到奔潰恢復&#xff0c;撤銷沒有提交的數據 2.InnoDB 存儲引擎維護自己的緩沖池&#xff0c…

UDS(ISO 14229)學習筆記

文章目錄 名詞縮寫Vector視頻筆記$10$27Fault Memory物理尋址和功能尋址UDS服務分類0x19服務0x14DTC汽車控制器(ECU)中DTC的狀態位物理尋址和功能尋址單幀 多幀 首幀 連續幀名詞縮寫 DTC Diagnostic Trouble Code FTB Fault Type Byte SID Service Identifier SF Subfunctio…

DML(Data Manipulation Language)數據操作語言

一、增加 insert into -- 寫全所有列名 insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);-- 不寫列名&#xff08;所有列全部添加&#xff09; insert into 表名 values(值1,值2,...值n);-- 插入部分數據 insert into 表名(列名1,列名2) values(值1,值2); 舉…

醫院掛號就診系統的設計與實現

前端使用Vue.js 后端使用SpiringBoot MyBatis 數據使用MySQL 需要項目和論文加企鵝&#xff1a;2583550535 醫院掛號就診系統的設計與實現_嗶哩嗶哩_bilibili 隨著社會的發展&#xff0c;醫療資源分布不均&#xff0c;患者就診難、排隊時間長等問題日益突出&#xff0c;傳統的…

軟考備考三

操作系統 操作系統概述 功能&#xff1a;組織和管理軟件&#xff0c;硬件資源以及計算機系統中的工作流程&#xff0c;控制程序的執行&#xff0c;向用戶提供接口。 分類&#xff1a; 1.批處理操作系統 單道批 多道批&#xff08;宏觀上并行&#xff0c;微觀上串行&#xff09…

Hadoop3:HDFS的Fsimage和Edits文件介紹

一、概念 Fsimage文件&#xff1a;HDFS文件系統元數據的一個永久性的檢查點&#xff0c;其中包含HDFS文件系統的所有目 錄和文件inode的序列化信息。 Edits文件&#xff1a;存放HDFS文件系統的所有更新操作的路徑&#xff0c;文件系統客戶端執行的所有寫操作首先 會被記錄到Ed…

K8s 身份認證和權限

文章目錄 K8s 身份認證和權限認證Service AccountsService Account Admission ControllerToken ControllerService Account Controller 授權(RBAC)RoleClusterRoleRoleBindingClusterRoleBinding K8s 身份認證和權限 Kubernetes 中提供了良好的多租戶認證管理機制&#xff0c;…

二叉樹的鏈式結構

1.二叉樹的遍歷 2.二叉樹鏈式結構的實現 3.解決單值二叉樹題 1.二叉樹的遍歷 1.1前序&#xff0c;中序以及后序遍歷 二叉樹的遍歷是按照某種特定的規則&#xff0c;依次對二叉樹的結點進行相應的操作&#xff0c;并且每個結點只操作一次。 二叉樹的遍歷有這些規則&#xff…

主流電商平臺商品實時數據采集API接口||抖音電商數據分析實例|可視化

— 1 — 抖音電商數據【抖音電商API數據采集】分析場景 1. 這里&#xff0c;我們選擇“伊利”這個品牌作為案例進行分析&#xff0c;在短短的4個月里&#xff0c;從最初每月營收17.07萬&#xff0c;到6月份達到了2485.54 萬&#xff0c;伊利的牛奶&#xff0c;有點牛&#xff…

Spring 對 Junit4,Junit5 的支持上的運用

1. Spring 對 Junit4,Junit5 的支持上的運用 文章目錄 1. Spring 對 Junit4,Junit5 的支持上的運用每博一文案2. Spring對Junit4 的支持3. Spring對Junit5的支持4. 總結&#xff1a;5. 最后&#xff1a; 每博一文案 關于理想主義&#xff0c;在知乎上看到一句話&#xff1a;“…

在Windows下訪問WSL(Windows Subsystem for Linux)文件夾

在Windows下訪問WSL&#xff08;Windows Subsystem for Linux&#xff09;文件夾&#xff0c;可以按照以下步驟操作&#xff1a; 通過Windows文件資源管理器訪問&#xff1a; 打開文件資源管理器。在地址欄中輸入\\wsl$&#xff0c;然后按回車鍵。這將打開一個顯示WSL可用發行版…

kafka配置消費者重要參數

文章目錄 fetch.min.bytesfetch.max.wait.msfetch.max.bytesmax.poll.recordsmax.partition.fetch.bytessession.timeout.ms和heartbeat.interval.msmax.poll.interval.msrequest.timeout.msauto.offset.resetenable.auto.commitpartition.assignment.strategy區間(range)輪詢(…

Xline社區會議Call Up|在 CURP 算法中實現聯合共識的安全性

為了更全面地向大家介紹Xline的進展&#xff0c;同時促進Xline社區的發展&#xff0c;我們將于2024年5月31日北京時間11:00 p.m.召開Xline社區會議。 歡迎您屆時登陸zoom觀看直播&#xff0c;或點擊“閱讀原文”鏈接加入會議&#xff1a; 會議號: 832 1086 6737 密碼: 41125…

通過cmd命令行使用用3dmax自帶的vray渲染

有時調試需要使用vray渲染vrscene文件看效果&#xff0c;只裝有3dmax下可以使用自帶vray渲染&#xff0c;在3dmax的渲染日志里面看自帶引擎路徑 使用命令行進入到此目錄 執行命令指定vr文件即可看到效果&#xff0c;如&#xff1a;vray.exe -sceneFile“C:\test15\202405241…

pip安裝報錯解決之后,手動安裝太麻煩,怎么辦

在使用pip install package_name安裝公共庫的時候,經常會報錯: Microsoft Windows [版本 6.1.7601] 版權所有 (c) 2009 Microsoft Corporation。保留所有權利。C:\Users\Administrator>pip install hatch WARNING: Ignoring invalid distribution -ip (d:\soft\python\py…

記一次成功的性能調優

環境&#xff1a;mysql8&#xff0c;表A大小10G&#xff0c;dbeaver24.0.5 現象&#xff1a;查詢頁面加載數據慢 操作&#xff1a; 第一步&#xff1a;新建sql編輯器&#xff0c;把sql貼到編輯器&#xff0c;帶參數&#xff1b; 第二步&#xff1a;在sql前加explain空一個并…

Cesium與Three相機同步(2)

之前實現了將Three相機同步到Cesium相機Cesium與Three相機同步(1)-CSDN博客 現在是將Cesium相機同步到Three相機,從而實現了相機雙向同步。 <!DOCTYPE html> <html lang="en"><head><title>three.js webgl - orbit controls</title&g…

【教學類-58-03】黑白三角拼圖03(4*4宮格)總數算不出+隨機抽取10張

背景需求&#xff1a; 【教學類-58-01】黑白三角拼圖01&#xff08;2*2宮格&#xff09;256種-CSDN博客文章瀏覽閱讀318次&#xff0c;點贊10次&#xff0c;收藏12次。【教學類-58-01】黑白三角拼圖01&#xff08;2*2宮格&#xff09;256種https://blog.csdn.net/reasonsummer/…

【Jmeter】使用Jmeter進行接口測試、跨線程組獲取參數

Jmeter接口測試 Jmeter設置成中文實操練習-跨線程組提取參數&#xff0c;使用值HTTP請求默認值&HTTP信息頭管理器 相信打算從事測試工程師的同學們&#xff0c;肯定對Jmeter是耳熟能詳的。使用Jmeter可以進行接口測試、性能測試、壓力測試等等&#xff1b;這個章節介紹如何…