1.Java中的抽象類 用最簡單的話來說, 一個抽象類就是使用keyword聲明為abstract的 。它可能包含也可能不包含任何抽象方法。JVM將抽象類標識為 不完整類 , 該類 尚未定義其完整行為。聲明一個類 僅強制執行一件事:您不能創建此類的實例,僅此而已。那麼,為什麼還要費心創建一個根本無法 ...
1.Java中的抽象類
用最簡單的話來說,一個抽象類就是使用keyword聲明為abstract的abstract
。它可能包含也可能不包含任何抽象方法。JVM將抽象類標識為不完整類,該類尚未定義其完整行為。聲明一個類abstract
僅強制執行一件事:您不能創建此類的實例,僅此而已。
那麼,為什麼還要費心創建一個根本無法實例化的類呢?答案在於解決某些關鍵設計問題的方法。我們將在本文後面介紹這一部分。
1.1抽象類的語法
abstract class TestAbstractClass
{
public abstract void abstractMethod();
public void normalMethod()
{
//method body
}
}
在這裡,我們TestAbstractClass
有兩種方法,一種是抽象方法,第二種是普通方法。抽象方法。在類中使用抽象方法將迫使您將類聲明為抽象本身。
1.2抽象方法
一個抽象方法,是未取代實施的方法。抽象方法給類增加了不完整性,因此編譯器希望將整個類聲明為抽象。
在應用程式中使用抽象類的唯一方法是擴展此類。如果不abstract
再次聲明其子類,則可以實例化。子類繼承了超類的行為,並且超類可以保留對子類的引用的功能在很多方面增加了抽象類的重要性。
2.Java介面
介面是大多數Java API的另一個基本構建塊。您將其命名為collection,I / O或SWT,您可以在任何地方看到它們的運行情況。
介面定義合同,實現類需要遵守這些合同。
這些合同本質上是未實現的方法。Java已經有一個未實現方法的關鍵字,即_abstract_。Java規定任何類都可以實現任何介面,因此在介面中聲明的所有方法僅需是公共的。
2.1 介面語法
public interface TestInterface
{
void implementMe();
}
對於上述介面,任何實現類都需要重寫implementMe()
方法。
2.2抽象類實現介面
當實現一個介面並且不重寫該方法即聲明實現類本身時,只有一種情況abstract
。
抽象類
public abstract class TestMain implements TestInterface
{
//No need to override implement Me
}
否則,您必須implementMe()
在您的類中實現該方法,而沒有任何其他例外。
非抽象類
public class TestMain implements TestInterface
{
@Override
public void implementMe() {
// TODO Auto-generated method stub
}
}
3.抽象類與介面
讓我們記下抽象類和介面之間的差異以便快速查看:
- 介面具有固有的所有公共方法和_抽象_方法。您不能通過嘗試減少方法的可訪問性來覆蓋此行為。您甚至不能聲明靜態方法。僅公開和抽象。另一方面,抽象類可以靈活地聲明方法。您還可以定義受保護的可訪問性的抽象方法。此外,還可以定義靜態方法,只要它們不是抽象的即可。允許使用非抽象靜態方法。
- 介面不能具有完全定義的方法。根據定義,介面旨在提供唯一的合同。抽象類可以具有非抽象方法,沒有任何限制。您可以將任何關鍵字與非抽象方法一起使用,就像在其他任何類中一樣。
- 任何要使用抽象類的類都可以使用關鍵字擴展抽象類
extends
,而為了實現介面關鍵字是implements
。一個類只能擴展一個類,但可以實現任何數量的介面。在Java中,此屬性通常稱為多重繼承的模擬。 - 介面是絕對的
abstract
,不能實例化;Java抽象類也無法實例化,但是如果存在main()則可以調用它。
接下來,如果我們既有抽象方法又有主類,可能會有一個問題,我們可以嘗試從中調用抽象方法main()
。但是這種嘗試將失敗,因為main()
方法始終是靜態的,而抽象方法永遠不會是靜態的,因此您永遠無法訪問靜態方法內部的任何非靜態方法。
4.何時使用抽象類以及何時使用介面
始終記住,在介面或抽象類之間進行選擇既不是/也不是方案,在這種情況下,選擇未經適當分析的任何人都會產生相同的結果。瞭解當前問題後,必須非常明智地做出選擇。讓我們嘗試在這裡添加一些智慧。
4.1抽象類的部分行為
抽象類使您可以定義一些行為。它使它們成為應用程式框架內的優秀候選人。
讓我們以HttpServlet為例。如果要使用Servlets技術開發Web應用程式,則必須繼承該類。眾所周知,每個servlet都有明確的生命周期階段,即初始化,服務和破壞。如果我們創建了每個servlet,我們必須一次又一次地編寫關於初始化和銷毀的同一段代碼。當然,這將是一個很大的痛苦。
JDK設計人員通過製作HttpServlet
抽象類來解決此問題。它具有為初始化Servlet和銷毀Servlet而編寫的所有基本代碼。您只需要重寫某些方法即可在其中編寫與應用程式處理相關的代碼。有道理吧!
可以使用界面添加上述功能嗎?不,即使可以,對於大多數無辜的程式員來說,設計也將是一個地獄。
4.2僅合約介面
現在,讓我們看一下介面的用法。介面僅提供合同,實現類的責任是實現提供給它的每個合同。
如果只想定義class的特征,並且要強制所有實現實體實現這些特征,那麼介面是最合適的。
4.3demo
我想以Map
集合框架中的介面為例。它僅提供規則,以及map在實踐中應如何表現。例如,它應存儲鍵值對,應使用鍵等訪問該值。這些規則在介面中採用抽象方法的形式。
所有實現類(例如HashMap,HashTable,TreeMap或WeakHashMap)均以不同方式實現所有方法,因此與其他方法相比具有不同的功能。
同樣,介面可用於定義職責分離。例如,HashMap
實現3個介面:Map
,Serializable和Cloneable。每個介面定義了各自的職責,因此實現類選擇要實現的對象,因此將提供有限的功能。
5.介面中的Java 8預設方法
使用Java 8,您現在可以在介面中定義方法。這些稱為預設方法。預設方法使您可以向庫的介面添加新功能,並確保與為這些介面的較早版本編寫的代碼二進位相容。
顧名思義,Java 8中的預設方法就是預設的。如果不重寫它們,則它們是調用方類將調用的方法。
預設方法
public interface Moveable {
default void move(){
System.out.println("I am moving");
}
}
在上面的示例中,Moveable
介面定義了一種方法,move()
並且還提供了預設實現。如果有任何類實現此介面,則無需實現它自己的move()
方法版本。它可以直接調用instance.move()
。
public class Animal implements Moveable{
public static void main(String[] args){
Animal tiger = new Animal();
tiger.move(); //I am moving
}
}
並且,如果類願意定製行為,那麼它可以提供自己的定製實現並重寫該方法。現在將調用它自己的自定義方法。
public class Animal implements Moveable{
public void move(){
System.out.println("I am running");
}
public static void main(String[] args){
Animal tiger = new Animal();
tiger.move(); //I am running
}
5.1Java 8中抽象類和介面之間的區別
如果您看到了,我們現在也可以提供帶有介面的部分實現,就像抽象類一樣。因此,從本質上說,介面與抽象類之間的界限變得非常狹窄。它們現在提供幾乎相同的功能。
現在,只有一個很大的不同,即您不能擴展多個類,而可以實現多個介面。除了這種差異之外,您還可以通過介面實現任何可能的功能,這些介面可以使抽象類成為可能,反之亦然。
希望您在Java中找到有關介面和抽象類的足夠信息。
學習愉快!
更多精彩請關註公眾號【lovepythoncn】