Różnice między przeciążaniem metod a zastępowaniem metod w Javie są następujące:
Przeciążenie metody | Zastępowanie metody |
|---|---|
| Przeciążanie metod jest polimorfizmem występującym w czasie kompilacji. | Nadpisywanie metod jest polimorfizmem wykonywanym w czasie wykonywania. |
| Przeciążanie metod pomaga zwiększyć czytelność programu. | Nadpisywanie metod służy do zapewnienia konkretnej implementacji metody, która jest już zapewniona przez jej klasę nadrzędną lub nadklasę. |
| Dzieje się to w ramach zajęć. | Jest ona wykonywana w dwóch klasach z relacjami dziedziczenia. |
| Przeciążanie metod może, ale nie musi, wymagać dziedziczenia. | Przesłonięcie metody zawsze wymaga dziedziczenia. |
| W przypadku przeciążania metod metody muszą mieć tę samą nazwę i różne podpisy. | W przypadku przesłaniania metod metody muszą mieć tę samą nazwę i ten sam podpis. |
| W przypadku przeciążenia metody typ zwracany może być taki sam lub nie, ale wystarczy zmienić parametr. | W przypadku przesłaniania metody typ zwracany musi być taki sam lub współwariantowy. |
| W przypadku metod przeciążonych używane jest wiązanie statyczne. | Do przesłaniania metod używane jest wiązanie dynamiczne. |
| Niska wydajność z powodu polimorfizmu czasu kompilacji. | Daje lepszą wydajność. Dzieje się tak dlatego, że wiązanie przesłoniętych metod odbywa się w czasie wykonywania. |
| Metody prywatne i końcowe mogą być przeciążone. | Nie można zastąpić metod private i final. |
| Lista argumentów powinna być inna podczas przeciążania metody. | Lista argumentów powinna być taka sama w przypadku przesłaniania metody. |
Przeciążanie metod w Javie
Przeciążenie metody jest Polimorfizm czasu kompilacji . W przypadku przeciążania metod więcej niż jedna metoda ma tę samą nazwę metody z innym podpisem w klasie. W przypadku przeciążania metod typ zwracany może być taki sam lub nie, ale musimy zmienić parametr, ponieważ w Javie nie możemy osiągnąć przeciążenia metody, zmieniając jedynie typ zwracany przez metodę.
Przykład przeciążenia metody:
Jawa
// Java Program to Implement // Method Overloading import java.io.*; class MethodOverloadingEx { static int add(int a, int b) { return a + b; } static int add(int a, int b, int c) { return a + b + c; } // Main Function public static void main(String args[]) { System.out.println('add() with 2 parameters'); // Calling function with 2 parameters System.out.println(add(4, 6)); System.out.println('add() with 3 parameters'); // Calling function with 3 Parameters System.out.println(add(4, 6, 7)); } }> Wyjście
add() with 2 parameters 10 add() with 3 parameters 17>
Przesłonięcie metody w Javie
Zastępowanie metody jest Polimorfizm czasu wykonania . W przypadku przesłaniania metody klasa pochodna zapewnia specyficzną implementację metody, która jest już zapewniona przez klasę bazową lub klasę nadrzędną. W przypadku przesłaniania metody typ zwracany musi być taki sam lub współwariantowy (typ zwracany może różnić się w tym samym kierunku co klasa pochodna).
Przykład przesłaniania metody:
Jawa // Java Program to implement // Method Overriding import java.io.*; // Base Class class Animal { void eat() { System.out.println('eat() method of base class'); System.out.println('eating.'); } } // Inherited Class class Dog extends Animal { void eat() { System.out.println('eat() method of derived class'); System.out.println('Dog is eating.'); } } // Driver Class class MethodOverridingEx { // Main Function public static void main(String args[]) { Dog d1 = new Dog(); Animal a1 = new Animal(); d1.eat(); a1.eat(); // Polymorphism: Animal reference pointing to Dog object Animal animal = new Dog(); // Calls the eat() method of Dog class animal.eat(); } }> Wyjście
eat() method of derived class Dog is eating. eat() method of base class eating. eat() method of derived class Dog is eating.>
Wyjaśnienie powyższego Programu:
Tutaj widzimy, że metoda eat() została nadpisana w nazwie klasy pochodnej Pies która jest już zapewniona przez nazwę klasy bazowej Zwierzę . Kiedy tworzymy instancję klasy Dog i wywołujemy metodę eat(), widzimy, że zamiast metody eat() klasy bazowej uruchamiana jest tylko metoda eat() klasy pochodnej, a gdy tworzymy instancję klasy Animal i wywołujemy metodę eat() ), widzimy, że uruchamiana jest tylko metoda eat() klasy bazowej, a nie metoda eat() klasy pochodnej.