Jaka jest różnica między przeciążeniem metody a nadpisaniem jej w Javie?
Czy istnieje różnica w podpisie metody, specyfikatorze dostępu, typie zwrotu itp.?
Jaka jest różnica między przeciążeniem metody a nadpisaniem jej w Javie?
Czy istnieje różnica w podpisie metody, specyfikatorze dostępu, typie zwrotu itp.?
Odpowiedzi:
Aby przeładować metodę nową metodą, nowa metoda powinna mieć inną sygnaturę. Tzn. Dwie przeciążone metody mają tę samą nazwę, ale różne parametry. Oto przykład dwóch przeciążonych metod:
boolean isOdd(int number) { ... };
boolean isOdd(float number) { ... };
Na podstawie typów parametrów zostanie wywołana odpowiednia metoda. Pamiętaj, że zmiana typu zwrotu nie wystarczy (choć możesz to zrobić dodatkowo).
Gdy metoda zostanie zastąpiona, nowa metoda ma ten sam podpis i w niektórych przypadkach zastępuje zastąpioną metodę. Oto przykład zastąpionej metody:
public class A
{
public void someMethod() { ... }
}
public class B extends A
{
public void someMethod() { ... }
}
Wyboru dokonuje się na podstawie typu obiektu. Na przykład,
A someA = new B();
someA.someMethod();
wywoła someMethodz B. Możesz (i należy) dodać adnotację @Override:
public class B extends A
{
@Override
public void someMethod() { ... }
}
Teraz, jeśli przypadkowo zmienisz parametry w B, kompilator poinformuje cię, że nie przesłaniasz metodyMethod (), ale ją przeciążasz.
Przeciążenie metody mają tę samą nazwę, ale różne parametry.
Przesłanianie, implementacja podana w klasie bazowej zostaje zastąpiona implementacją w podklasie.
Pojęcia, o które pytasz, są omówione w samouczkach Java.
Wyjaśnienie zastępowania podano w następujący sposób:
Metoda instancji w podklasie o tej samej sygnaturze (nazwa, liczba i typ jej parametrów) oraz typ zwracany jako metoda instancji w nadklasie zastępuje metodę nadklasy.
Zdolność podklasy do przesłonięcia metody pozwala klasie dziedziczyć po nadklasie, której zachowanie jest „wystarczająco blisko”, a następnie modyfikować zachowanie w razie potrzeby. Metoda przesłaniająca ma taką samą nazwę, liczbę i typ parametrów oraz typ zwracany, jak metoda zastępująca. Metoda przesłonięcia może również zwrócić podtyp typu zwróconego przez przesłoniętą metodę. Jest to nazywane kowariancyjnym typem zwrotu .
Podczas
@Overrideprzesłonięcia metody możesz użyć adnotacji, która instruuje kompilator, że zamierzasz przesłonić metodę w nadklasie. Jeśli z jakiegoś powodu kompilator wykryje, że metoda nie istnieje w jednej z nadklas, wygeneruje błąd. Aby uzyskać więcej informacji@Override, zobacz Adnotacje ...
Przeciążenie wyjaśniono w samouczku w następujący sposób:
Język programowania Java obsługuje metody przeciążania, a Java może rozróżniać metody z różnymi sygnaturami metod. Oznacza to, że metody w klasie mogą mieć tę samą nazwę, jeśli mają różne listy parametrów (istnieją pewne kwalifikacje, które zostaną omówione w lekcji zatytułowanej „Interfejsy i dziedziczenie”.
Załóżmy, że masz klasę, która może używać kaligrafii do rysowania różnych typów danych (ciągów, liczb całkowitych itp.) I która zawiera metodę rysowania każdego typu danych. Jest to kłopotliwe w użyciu nowej nazwy dla każdej metody, na przykład
drawString,drawInteger,drawFloat, i tak dalej. W języku programowania Java można używać tej samej nazwy dla wszystkich metod rysowania, ale do każdej metody przekazać inną listę argumentów. Dlatego klasa rysująca dane może zadeklarować cztery nazwane metodydraw, z których każda ma inną listę parametrów ...Przeciążone metody różnią się liczbą i rodzajem argumentów przekazanych do metody ...
Nie można zadeklarować więcej niż jednej metody o tej samej nazwie i tej samej liczbie i typie argumentów, ponieważ kompilator nie może ich rozróżnić.
Kompilator nie bierze pod uwagę typu zwracanego przy różnicowaniu metod, więc nie można zadeklarować dwóch metod o tej samej sygnaturze, nawet jeśli mają one inny typ zwracany.
Uwaga: przeciążonych metod należy używać oszczędnie, ponieważ mogą one znacznie zmniejszyć czytelność kodu.
Powyższe wyjaśnienie dotyczące przeciążenia wymienia kwalifikacje omówione w lekcji zatytułowanej „Interfejsy i dziedziczenie” :
W podklasie można przeciążać metody odziedziczone po nadklasie. Takie przeciążone metody nie ukrywają ani nie zastępują metod nadklasy - są to nowe metody, unikalne dla podklasy.
Przeciążenie metody jest zwykle definiowane jako „zapewnianie wielu dostępnych metod o tej samej nazwie, różniących się liczbą i rodzajem wejść i wyjść”. Pomysł polega zazwyczaj na tym, że chcesz mieć możliwość wykonania tej samej podstawowej operacji przy różnych zestawach danych wejściowych: możesz na przykład „dodać” dowolne dwie wartości typu liczbowego, jednak zazwyczaj ważne jest, aby wiedzieć, jaki dokładnie typ wartość jest taka, że możesz skorzystać lub zaplanować określone zachowania tego typu. Jako taki, zdefiniowałbyś metodę dla każdej kombinacji typów numerycznych (i / lub kolekcji), które chcesz obsługiwać. Wszystkie te metody mają tę samą nazwę, ale różne „podpisy”; w czasie kompilacji
Przesłanianie metody jest zwykle definiowane jako „zapewnienie innej implementacji w klasie pochodnej metody o określonej sygnaturze zdefiniowanej w klasie bazowej”. Istnieje wiele powodów, aby przesłonić metodę; praktycznie wszystkie mają wspólny fakt, że klasa pochodna ma dodatkową wiedzę o tym, co należy zrobić, czego klasa podstawowa nie może poznać. Istnieją dwa warianty nadpisywania w większości języków OO; przesłonięcie może zastąpić metodę klasy bazowej lub rozszerzyćmetoda klasy bazowej. Różnica polega zwykle na tym, że klasa pochodna, która rozszerza implementację klasy podstawowej, wywoła przesłoniętą wersję metody klasy bazowej w pewnym momencie podczas wykonywania metody przesłaniającej. Pozwala to na przesłonięcie klas w celu „ponownego użycia” wspólnych obszarów operacji zawartych w klasie podstawowej.