簡體   English   中英

沒有方法的接口

[英]Interface with no methods

為什么Java引入了一些沒有定義方法的接口? 例如CloneableSerializableType等等。

第二件事:在Class.class包中有一個方法定義了registerNatives()沒有body,從靜態塊調用,但Class.class不是抽象的,而是final 為什么這樣? 為什么Java需要一些沒有body的方法來從靜態塊中調用。

為什么Java引入了一些沒有定義方法的接口?

這稱為標記或標記接口 這些不用於任何用途或操作。 這些方法用於標記或標記類。 這樣您就可以確定某些類是否是這些類的子類。

關於第二個問題

仔細觀察,您可以看到聲明

 private static native void registerNatives();

所以registerNatives是一種原生方法。

那么什么是原生方法。 如果你看到這樣的問題

該方法以“本機”代碼實現。 也就是說,代碼不能在JVM中運行。 它通常用C或C ++編寫。

本機方法通常用於與系統調用或用其他編程語言編寫的庫進行交互。

所以這些方法是從本機代碼加載的。 因此,您不需要聲明方法的主體,但它們仍然不是抽象的,因為它們是從本機代碼實現的。

標記接口用作標記以將消息通知給java編譯器,以便它可以向實現它的類添加特殊行為。 Java標記接口中沒有成員。

Marker接口的目的是通過在類實現標記接口時為類提供某些功能來強制類中的某種功能。

閱讀Java Marker Interface還看看Java中標記接口 的用途是什么?

對於第一個,您實際上要求標記接口。 標記接口在設計上不應該向行為添加任何內容,而只支持對象的多態轉換。 例如,Serializable使對象能夠跨JVM邊界進行流式傳輸。 標記接口遵循“通用類型替換”理念。

對於第二個,你實際上是在要求JNI。 Java不會以Java形式實現其所有代碼。 我的意思是遵循Java語法的類和代碼。 您需要深入了解本機平台API以實現該API的某些時間。 例如套接字和TCP通信。 Java的這個特性實際上使它與平台無關。 JVM運行時依賴於平台,因為它使用基於平台的本機方法和dll或.so庫來實現和集成平台。 我們作為程序員調用高級Java SDK API調用。

registerNatives()

本機方法在JVM本身中實現。 registerNatives()方法有什么作用?

Why Java need some method without body to be called from static block.?

這是從靜態塊調用的,因為我們需要在加載類時調用此方法,而不是在創建實例時調用此方法。

Java編程語言的一個“干凈”特性是它要求在接口(純行為)和類(狀態和行為)之間進行分離。 接口在Java中用於指定派生類的行為。 通常,您會遇到沒有行為的Java接口。 換句話說,它們只是空接口定義。 這些被稱為標記接口。 Java API中的標記接口的一些示例包括:

  • java.lang.Cloneable
  • 的java.io.Serializable
  • java.util.EventListener的

標記接口也稱為“標記”接口,因為它們根據其目的將所有派生類標記為類別。 例如,可以克隆實現Cloneable接口的所有類(即,可以在它們上調用clone()方法)。 Java編譯器檢查以確保在類上調用clone()方法並且該類實現Cloneable接口。 例如,考慮以下對對象o的clone()方法的調用:

SomeObject o = new SomeObject();
SomeObject ref = (SomeObject)(o.clone());

如果類SomeObject沒有實現Cloneable接口(並且Cloneable不是由SomeObject繼承的任何超類實現的),則編譯器會將此行標記為錯誤。 這是因為clone()方法只能由“Cloneable”類型的對象調用。 因此,即使Cloneable是一個空接口,它也是一個重要的目的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM