Jaka jest różnica między przeciążeniem metody a nadpisaniem jej w Javie?

10

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.?

użytkownik63948
źródło
3
W PHP przeciążanie ma zupełnie inne znaczenie .
lortabac,

Odpowiedzi:

41

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.

superM
źródło
@scarfridge, dzięki za edycję.
Dawno
1
Dziękujemy za wzmiankę o adnotacjach @Override i fakt, że posiadanie tylko różnych typów zwracanych znaków nie powoduje przesłonięcia metody, ale przeciążenie.
Daniel Dinnyes,
13

Przeciążenie metody mają tę samą nazwę, ale różne parametry.

Przesłanianie, implementacja podana w klasie bazowej zostaje zastąpiona implementacją w podklasie.

Nim Chimpsky
źródło
1
nie edytuj / rozwiń tego. Zwięzłość jest istotna.
NimChimpsky
7

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 metody draw, 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.

komar
źródło
2

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.

KeithS
źródło