Java抽象類和接口的區(qū)別詳情
1、抽象類 vs 接口?
- 方法類型: 接口只能有抽象方法。抽象類可以有抽象和非抽象方法。從 Java 8 開(kāi)始,它也可以有默認(rèn)和靜態(tài)方法。
- 最終變量: 在 Java 接口中聲明的變量默認(rèn)是最終的。抽象類可能包含非最終變量。
- 變量類型: 抽象類可以有final、
non-final
、靜態(tài)和非靜態(tài)變量。接口只有靜態(tài)和最終變量。 - 實(shí)現(xiàn): 抽象類可以提供接口的實(shí)現(xiàn)。接口不能提供抽象類的實(shí)現(xiàn)。
- 繼承 vs 抽象:? Java 接口可以使用關(guān)鍵字“
implements
”來(lái)實(shí)現(xiàn),抽象類可以使用關(guān)鍵字“extends
”進(jìn)行擴(kuò)展。 - 多重實(shí)現(xiàn): 一個(gè)接口只能擴(kuò)展另一個(gè)Java接口,一個(gè)抽象類可以擴(kuò)展另一個(gè)Java類并實(shí)現(xiàn)多個(gè)Java接口。
- 數(shù)據(jù)成員的可訪問(wèn)性: 默認(rèn)情況下,Java 接口的成員是公共的。Java 抽象類可以具有私有、受保護(hù)等類成員。
import java.io.*; abstract class Shape { String objectName = " "; Shape(String name) { this.objectName = name; } public void moveTo(int x, int y){ System.out.println(this.objectName + " " + "已移至" + " x = " + x + " and y = " + y); } abstract public double area(); abstract public void draw(); } class Rectangle extends Shape { int length, width; Rectangle(int length, int width, String name){ super(name); this.length = length; this.width = width; } @Override public void draw(){ System.out.println("矩形已繪制"); } @Override public double area(){ return (double)(length * width); } } class Circle extends Shape { double pi = 3.14; int radius; Circle(int radius, String name){ super(name); this.radius = radius; } @Override public void draw(){ System.out.println("圓形已繪制"); } @Override public double area(){ return (double)((pi * radius * radius) / 2); } } class HY { public static void main(String[] args){ Shape rect = new Rectangle(2, 3, "Rectangle"); System.out.println("矩形面積:" + rect.area()); rect.moveTo(1, 2); System.out.println(" "); Shape circle = new Circle(2, "Circle"); System.out.println("圓的面積:" + circle.area()); circle.moveTo(2, 4); } }
輸出:
矩形面積:6.0
矩形已移至 x = 1 和 y = 2
圓的面積:6.28
圓已移至 x = 2 和 y = 4
如果我們?cè)诰匦魏蛨A形之間沒(méi)有任何通用代碼,請(qǐng)使用界面。
import java.io.*; interface Shape { void draw(); double area(); } class Rectangle implements Shape { int length, width; Rectangle(int length, int width){ this.length = length; this.width = width; } @Override public void draw(){ System.out.println("矩形已繪制"); } @Override public double area(){ return (double)(length * width); } } class Circle implements Shape { double pi = 3.14; int radius; Circle(int radius) { this.radius = radius; } @Override public void draw(){ System.out.println("圓形已繪制"); } @Override public double area(){ return (double)((pi * radius * radius) / 2); } } class HY { public static void main(String[] args){ Shape rect = new Rectangle(2, 3); System.out.println("矩形面積:" + rect.area()); Shape circle = new Circle(2); System.out.println("圓的面積:" + circle.area()); } }
輸出:
矩形面積:6.0
圓的面積:6.28
什么時(shí)候用什么?
如果以下任何陳述適用于您的情況,請(qǐng)考慮使用抽象類:??
- 在
java
應(yīng)用程序中,有一些相關(guān)的類需要共享一些代碼行,那么你可以將這些代碼行放在抽象類中,并且這個(gè)抽象類應(yīng)該由所有這些相關(guān)類進(jìn)行擴(kuò)展。 - 您可以在抽象類中定義非靜態(tài)或非最終字段,以便您可以通過(guò)方法訪問(wèn)和修改它們所屬的對(duì)象的狀態(tài)。
- 您可以期望擴(kuò)展抽象類的類具有許多公共方法或字段,或者需要除
public
之外的訪問(wèn)修飾符(例如protected
和private
)。
如果以下任何陳述適用于您的情況,請(qǐng)考慮使用接口:??
- 它是一個(gè)完全的抽象,接口中聲明的所有方法都必須由實(shí)現(xiàn)此接口的類來(lái)實(shí)現(xiàn)。
- 一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。它被稱為多重繼承。
- 您想指定特定數(shù)據(jù)類型的行為,但不關(guān)心誰(shuí)實(shí)現(xiàn)其行為。
到此這篇關(guān)于Java抽象類和接口的區(qū)別詳情的文章就介紹到這了,更多相關(guān)Java抽象類和接口的區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java 判斷一個(gè)數(shù)是否為2的整數(shù)次冪方法
今天小編就為大家分享一篇java 判斷一個(gè)數(shù)是否為2的整數(shù)次冪方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07Mybatis查詢方法如何實(shí)現(xiàn)沒(méi)有返回值
這篇文章主要介紹了Mybatis查詢方法如何實(shí)現(xiàn)沒(méi)有返回值,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10Netty的Handler鏈調(diào)用機(jī)制及如何組織詳解
這篇文章主要為大家介紹了Netty的Handler鏈調(diào)用機(jī)制及如何組織示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03修改idea的這些啟動(dòng)參數(shù),令你的idea健步如飛
這篇文章主要介紹了修改idea的這些啟動(dòng)參數(shù),令你的idea健步如飛~具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01Spring?Boot?MQTT?Too?many?publishes?in?progress錯(cuò)誤的解決方
本文介紹Spring?Boot?MQTT?Too?many?publishes?in?progress錯(cuò)誤的解決方案,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-07-07