Java抽象類和接口的區別詳情
1、抽象類 vs 接口
- 方法類型: 接口隻能有抽象方法。抽象類可以有抽象和非抽象方法。從 Java 8 開始,它也可以有默認和靜態方法。
- 最終變量: 在 Java 接口中聲明的變量默認是最終的。抽象類可能包含非最終變量。
- 變量類型: 抽象類可以有final、
non-final
、靜態和非靜態變量。接口隻有靜態和最終變量。 - 實現: 抽象類可以提供接口的實現。接口不能提供抽象類的實現。
- 繼承 vs 抽象: Java 接口可以使用關鍵字“
implements
”來實現,抽象類可以使用關鍵字“extends
”進行擴展。 - 多重實現: 一個接口隻能擴展另一個Java接口,一個抽象類可以擴展另一個Java類並實現多個Java接口。
- 數據成員的可訪問性: 默認情況下,Java 接口的成員是公共的。Java 抽象類可以具有私有、受保護等類成員。
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
如果我們在矩形和圓形之間沒有任何通用代碼,請使用界面。
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
什麼時候用什麼?
如果以下任何陳述適用於您的情況,請考慮使用抽象類:
- 在
java
應用程序中,有一些相關的類需要共享一些代碼行,那麼你可以將這些代碼行放在抽象類中,並且這個抽象類應該由所有這些相關類進行擴展。 - 您可以在抽象類中定義非靜態或非最終字段,以便您可以通過方法訪問和修改它們所屬的對象的狀態。
- 您可以期望擴展抽象類的類具有許多公共方法或字段,或者需要除
public
之外的訪問修飾符(例如protected
和private
)。
如果以下任何陳述適用於您的情況,請考慮使用接口:
- 它是一個完全的抽象,接口中聲明的所有方法都必須由實現此接口的類來實現。
- 一個類可以實現多個接口。它被稱為多重繼承。
- 您想指定特定數據類型的行為,但不關心誰實現其行為。
到此這篇關於Java抽象類和接口的區別詳情的文章就介紹到這瞭,更多相關Java抽象類和接口的區別內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!