是的,它們是不同的。
有了一個接口,客戶端可以實現它藏漢作爲擴展類:
class ClientType implements YourInterface, SomeOtherInterface { //can still extend other types
}
有了一個類,客戶將能夠擴展它,但不能擴展任何其他類型的:
class ClientType extends YourClass { //can no longer extend other types
}
當interface
或abstract class
只有一個抽象方法聲明並且它與匿名函數(lambdas)有關時,會出現另一個區別。
正如@AlexanderPetrov說,一個方法的接口可以被用作一個功能接口,使我們能夠創建函數「上即時」過的位置的功能的接口類型被指定:
//the interface
interface Runnable {
void run()
}
//where it's specified
void execute(Runnable runnable) {
runnable.run();
}
//specifying argument using lambda
execute(() -> /* code here */);
這不能用abstract class
完成。 所以你不能互換使用它們。差異在於客戶端如何使用它的限制,這由JVM的語義強制實施。
至於資源使用方面的差異,不要擔心,除非它導致您的軟件問題。 使用內存管理語言的想法是不擔心這種事情,除非你有問題。不要預先優化,我敢肯定,差異是可以忽略的。即使存在差異,只要它可能導致您的軟件出現問題就應該重要。
如果您的軟件存在資源問題,請對您的應用程序進行配置。如果確實會導致內存問題,您將能夠看到它,以及每個人消耗多少資源。在此之前,你不應該擔心。您應該更喜歡使您的代碼更易於管理的功能,而不是那些佔用最少資源的功能。
這個問題只是問關於類的內存表示還是更廣泛的問題關於抽象類和接口之間的區別? –
@AlexanderPetrov我知道這兩個類之間的區別。顯然,如果你需要使用上面列出的兩個之一,你將使用第一個。我只是問,如果我需要更多的存儲空間,會稍微快一點或者在運行時使用更少的內存等。 –
@VinceEmigh謝謝我忘記了一些事情,如果我不使用IDE。 –