Uczyłem się poprzez interfejsy, kiedy zauważyłem, że teraz możesz zdefiniować statyczne i domyślne metody w interfejsie.
public interface interfacesample2 {
public static void method() {
System.out.println("hello world");
}
public default void menthod3() {
System.out.println("default print");
}
}
Uprzejmie wyjaśnij różnicę między tymi dwoma, a także jeśli istnieje przykład, kiedy użylibyśmy tego, byłoby miło. Trochę zdezorientowany na interfejsach.
default implementation
metodą, która może zostać zastąpiona.Odpowiedzi:
Różnice między metodami statycznymi i domyślnymi w Javie 8:
1) Metody domyślne można zastąpić w implementacji klasy, podczas gdy statyczne nie mogą .
2) Metoda statyczna należy tylko do klasy Interface, więc metodę statyczną można wywołać tylko w klasie Interface, a nie w klasie implementującej ten interfejs, zobacz:
3) Zarówno klasa, jak i interfejs mogą mieć statyczne metody o takich samych nazwach i żadna z nich nie zastępuje innych!
źródło
purpose
( użyj wspólnej implementacji ), jak i rozwiązuje niejednoznacznośćimplementing the logic again in subclass
( przesłanianie, ukrywanie ). jedynym rozsądnym powodem byłby powód, dla którego [statyczne metody interfejsu nie są dziedziczone] ( stackoverflow.com/questions/25169175/… ) i dlatego nie możemy ich wywoływać przy użyciu instancji podklasy.Metoda statyczna to metoda, która odnosi się, że tak powiem, do „przestrzeni nazw” klasy. Więc a
static
metodafoo
interfejsuInterface
jest dostępna przezInterface.foo()
. Należy zauważyć, że wywołanie funkcji nie ma zastosowania do żadnej konkretnej instancji interfejsu.Z
bar
drugiej strony jest wywoływana implementacja domyślnastatic
Metoda interfejs nie może wiedzieć othis
zmiennej, ale domyślna implementacja może.źródło
Statyczne metody interfejsu są podobne do statycznych metod klasowych (tutaj należą tylko do interfejsu). Gdzie jako domyślne metody interfejsu udostępniają metody
default implementation
interfejsu (które mogą implementować klasyoverride
)Ale pamiętaj, jeśli klasa jest
implementing more than one interface with same default
sygnaturą metody, to klasa implementującaneeds to override the default method
Poniżej znajdziesz prosty przykład (można wykonać majsterkowanie w różnych przypadkach)
To zależy od twojego stwierdzenia problemu. Powiedziałbym, że metody domyślne są przydatne, jeśli potrzebujesz tej samej implementacji dla metody w swojej specyfikacji we wszystkich klasach w tym kontrakcie lub mogą być używane jak
Adapter
klasy.tutaj jest dobra lektura: /software/233053/why-were-default-and-static-methods-added-to-interfaces-in-java-8-when-we-alread
również poniżej oracle doc wyjaśnia domyślne i statyczne metody rozwijania istniejących interfejsów:
http://docs.oracle.com/javase/tutorial/java/IandI/nogrow.html
źródło
Oto mój pogląd:
metoda statyczna w interfejsie:
Możesz zadzwonić bezpośrednio (InterfacetA.staticMethod ())
Podklasa nie będzie mogła zastąpić.
Podklasa może mieć metodę o tej samej nazwie co staticMethod
domyślna metoda w interfejsie:
Nie możesz zadzwonić bezpośrednio.
Podklasa będzie mogła to zmienić
Korzyść:
Metoda statyczna: nie musisz tworzyć osobnej klasy dla metody narzędziowej.
Metoda domyślna: Zapewnij typową funkcjonalność w metodzie domyślnej.
źródło
Ten link zawiera przydatne spostrzeżenia, kilka z nich wymieniono tutaj.
Metody domyślne i statyczne zlikwidowały różnice między interfejsami a klasami abstrakcyjnymi .
Domyślne metody interfejsu :
Metody statyczne interfejsu :
Chciałbym zacytować inne przydatne odniesienie .
źródło
Domyślne metody interfejsu:
Pomaga to w unikaniu klas narzędzi, takich jak wszystkie metody klasy Collections, które można udostępnić w samych interfejsach.
Pomaga w rozszerzaniu interfejsów bez obawy o zerwanie klas implementacyjnych.
Metody statyczne interfejsu:
Są częścią interfejsu, nie możemy ich używać do obiektów klas implementacyjnych.
Pomaga w zapewnieniu bezpieczeństwa, ponieważ nie pozwala klasom implementacji ich zastępować.
Teraz jak statyczna metoda zapewniająca bezpieczeństwo. Zobaczmy przykład.
Tutaj
obj.newMethod();
logika implementacji klasy drukowania oznacza, że możemy zmienić logikę tej metody wewnątrz klasy implementacyjnej.Ale
obj.anotherNewMethod();
logika implementacji klasy drukowania, ale nie zmieniona implementacja interfejsu. Więc jeśli jakakolwiek logika szyfrowania-deszyfrowania zapisana w tej metodzie nie jest możliwa.źródło
Według Oracle Javadocs: http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html
Zwykle metoda statyczna w interfejsie jest używana jako metody pomocnicze, podczas gdy metoda domyślna jest używana jako domyślna implementacja dla klas, które implementują ten interfejs.
Przykład:
źródło
Zgodnie z dokumentem JLS Java14 :
Metoda domyślna:
Jest to metoda instancji zadeklarowana w interfejsie z domyślnym modyfikatorem
Dostęp do niego jest możliwy tylko przez instancję klasy implementującej
Jego treść jest zawsze reprezentowana przez blok, który zapewnia domyślną implementację lub zachowanie dla dowolnej klasy implementującej bez zastępowania metody
Nigdy nie może być statyczne ani prywatne
Metoda statyczna:
Może zostać wywołany przez interfejs bez odniesienia do konkretnego obiektu, tak jak metody statyczne klasy
Metoda statyczna może być prywatna
Klasa implementująca nie może uzyskać dostępu do metody statycznej
Zrozummy to za pomocą poniższego przykładowego kodu:
źródło
nie możemy wykonać,
Interfacesample2.menthod3();
ponieważ nie jest to metoda statyczna. Do wykonaniamethod3()
potrzebna jest instancjaInterfacesample2
interfejsu.Proszę znaleźć następujący praktyczny przykład:
źródło
Uruchomienie interfejsu Java 8 może mieć również metodę statyczną. Podobnie jak statyczna metoda klasy, statyczna metoda interfejsu może być wywołana przy użyciu nazwy interfejsu.
Przykład
Różnica między statyczną a domyślną metodą interfejsu polega na tym, że metoda domyślna obsługuje dziedziczenie, ale metoda statyczna nie. Domyślną metodę można zastąpić w dziedziczeniu interfejsu.
Oto dobra lektura o domyślnej metodzie interfejsu i metodzie statycznej. Domyślna metoda interfejsu w Javie 8
źródło
Wszystkie dobre odpowiedzi tutaj. Chciałbym dodać jeszcze jedno praktyczne zastosowanie funkcji statycznej w interfejsie. Wskazówka pochodzi z książki - Effective Java, 3rd Edition autorstwa Joshua Bloch w rozdziale 2: Creating and Destroying Object.
Statyczne metody fabryczne to metody zwracające obiekt. Pracują jak konstruktor. W określonych przypadkach statyczna metoda fabryki zapewnia bardziej czytelny kod niż użycie konstruktora.
Cytat z książki - Effective Java, 3rd Edition autorstwa Joshua Bloch
Autor podaje przykład kolekcji, w których zaimplementowano taką statyczną metodę fabryczną. Sprawdzając kod, Josh Bloch może być postrzegany jako pierwszy autor klasy Kolekcje. Chociaż Kolekcje to klasa, a nie interfejs. Ale koncepcja nadal obowiązuje.
Dalej wyjaśnia, że API jest nie tylko mniejsze, ale także pomaga w czytelności kodu i łatwości API.
Oto jedna z metod statycznych z klasy java.util.Collections:
źródło