Java中抽象類別和介面的區別(abstract class VS interface)

來源:互聯網
上載者:User

標籤:通用   靜態   不完全   function   size   需要   方法體   final   obj   

前言:本文解決的問題

  • 什麼是抽象類別
  • 抽象類別的應用情境
  • 介面可以有方法實現嗎
  • 介面和抽象類別的區別
1 什麼是抽象類別

在聲明時含有關鍵字abstract就是抽象類別,抽象類別它可以看作具體類的一個模板,繼承它的子類可以從抽象類別中共用一些方法(可能是不完整的)和屬性。

A class which is declared with the abstract keyword is known as an abstract class in Java. It can have abstract and non-abstract methods (method with the body). n abstract class represents an abstract concept or entity with partial or no implementation. Therefore, Abstract classes act as parent classes from which child classes are derived so that the child class will share the incomplete features of the parent class and functionality can be added to complete them.

注意事項有:

  • 抽象類別不可以被執行個體化
  • 抽象類別從本質上說還是一個類,因此可以有構造器和靜態方法
  • 抽象類別可以有抽象方法和非抽象方法
  • 抽象類別可以有final方法,子類不可以更改
2 抽象類別的使用情境2.1 使用例子1
//定義抽象類別    public abstract class AbstractClass {    int age;    String gender;        public AbstractClass() {//構造器        System.out.println("I‘m abstract class.");    }       public void nonAbstract() {        System.out.println("I am non abstract method in the abstract class.");    }       abstract public void print();//抽象方法}public class AbstractClassTest extends AbstractClass {//繼承了抽象類別        public void print() {  //實現了抽象類別的方法        System.out.println("I override from abstract class");        }        public static void main(String[] args) {        AbstractClassTest test = new AbstractClassTest();        test.nonAbstract();//繼承自抽象類別的方法        test.print();    }}

結果
I‘m abstract class.
I am non abstract method in the abstract class.
I override from abstract class

從上面的例子可以看到,抽象類別可以有構造器,有抽象方法和非抽象方法,可以有變數。非抽象方法,子類可以直接繼承;而抽象方法子類必須實現。

2.2 使用情境1
abstract class Shape{    abstract void draw();}class Circle extends Shape{    public void draw() {        System.out.println("draw a circle.");    }}class Rectangel extends Shape{    public void draw() {        System.out.println("draw a rectangel.");    }}class Dimond extends Shape{    public void draw() {        System.out.println("draw a dimond.");    }}public class AbstractTest2 {        public static void main(String[] args) {        Shape shape = new Circle();        shape.draw();                shape = new Rectangel();        shape.draw();                shape = new Dimond();        shape.draw();    }}

運行結果
draw a circle.
draw a rectangel.
draw a dimond.

可以把抽象當作模板,聲明抽象類別,引用任一具體的子類。

3 什麼是介面

介面也是一種參考型別,定義時使用interface關鍵字,它時抽象方法的集合。介面可以定義final類型的變數。在jkd1.8以前,介面不能有具體方法的實現,jkd1.8後介面中可以有defaul方法體和static 方體。

An interface is an abstract type that is used to specify a contract that should be implemented by classes, which implement that interface. The interface keyword is used to define an interface and Implements keyword is used for implementing an interface by a class (in Java programming language).

4 介面實現時的注意點4.1 介面中的default方法

為什麼加入default關鍵字
以往當我們想在介面中新增加方法時,所有已經實現了該介面的方法都必須改寫,重新實現新增的方法。為了應對這個問題,引入了default關鍵字。default不強制要求實現該介面的類重新實現含有default簽名的方法。

例子

public interface Interface1 {    void method1(String str);//方法簽名        default void log(String str){ //default 方法        System.out.println("logging::"+str);    }}public class InterfaceTest1 implements Interface1 {    @Override    public void method1(String str) {        System.out.println("implement the method in interface1 "+str);    }    public static void main(String[] args) {        InterfaceTest1 test = new InterfaceTest1();        test.log("abc"); //介面中的default方法        test.method1("abc");    }}

運行結果

logging::abc
implement the method in interface1 abc

分析:log方法是介面中的default方法,不強制要求實現它的子類InterfaceTest1實現該方法,但是改方法可以被繼承。關於default方法的總結如下:

  • 介面中的default方法可以協助擴充介面,而不用擔心改變原來類的實現
  • default方法其實縮小了介面和抽象類別的區別
  • 如果類中有與default方法具有相同給的簽名,那麼default方法將會被忽略,也就是調用的時類中的方法
4.2 介面中的static方法

JAVA8以後,介面中可以有static方法,但是它不能被覆蓋,不能被實現它的子類中繼承。

例子

    public interface Interface2 {    default void print(String str) {        if (!isNull(str))            System.out.println("MyData Print::" + str);    }    static boolean isNull(String str) {//static 方法        System.out.println("Interface Null Check");        return str == null ? true : "".equals(str) ? true : false;    }}public class InterfaceTest2 implements Interface2{        public boolean isNull(String str) { //僅僅是簡單的類方法,不是override介面裡面的isNull        System.out.println("Impl Null Check");        return str == null ? true : false;    }    public static void main(String[] args) {        InterfaceTest2 obj = new InterfaceTest2();        obj.print("");        obj.isNull("abc");            }}

運行結果
Interface Null Check
Impl Null Check

分析:obj.print()會調用介面中的default方法,而介面中的print方法首先會調用介面中的static方法isNull,所以輸出Interface Null Check;然後執行obj.isNull("abc"),此時由於實作類別中有與介面中籤名一樣的方法,簽名中的該default方法被覆蓋了,調用的是類方法中的isNull,輸出Impl Null Check。如果介面中的方法isNull是default類型,那會輸出什麼呢?如下:
Impl Null Check
MyData Print::
Impl Null Check

關於介面中static方法總結如下:

  • 介面中的static方法是介面中的一部分,在外面不可以被使用
  • 介面中的靜態方法可以用來提供一些 utinity方法,如檢查非空,排序等
5 抽象類別和介面的區別5.1文法不同
  • 最容易想到的是文法不同,抽象類別聲明時使用的abstract class;而介面使用的是interface;
  • 繼承二者時使用的關鍵字不同,abstract 用extends;而介面用implments;
  • 繼承數量不同,JAVA中類是單繼承的,一個類只能繼承一個抽象類別;但是可以實現多個介面;
  • 繼承的方法不完全相同,子類繼承抽象類別,必需要實現抽象類別中的方法,否則該子類也必須聲明為抽象類別,要不然編譯出錯;子類實現介面,也必須實現實現介面中的方法簽名,否則編譯出錯。子類中沒有實現介面的方法,這時可以把子類變成子介面;或者把子類變成抽象類別。
  • 內部結構不同,抽象類別裡面可以各種變數,構造器,方法體,方法聲明;介面中的變數只能是final,方法體在JAVA8後只能由static或者default修飾
  • 介面中的方法不能說是private
5.2使用情境不同

抽象類別
抽象類別一般用來提供一些基礎通用的行為或者說方法,對於架構應用,抽象類別是更好的選擇。
介面
如果後期可能會更改設計,或者改的頻率較高,用介面更合適,更容易擴充。



參考閱讀
https://www.javatpoint.com/abstract-class-in-java
https://www.differencebetween.com/difference-between-abstract-class-and-vs-interface/
https://www.javaworld.com/article/2077421/learn-java/abstract-classes-vs-interfaces.html

Java中抽象類別和介面的區別(abstract class VS interface)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.