Site icon Java blog

Java #21: przeciążanie metod

java overload vs override

W poprzedniej lekcji pisałem o tym jak przesłaniać metody za pomocą dziedziczenia i adnotacji @Override. Teraz dowiesz się, jaka jest różnica między przesłanianiem (ang. override) a przeciążaniem (ang. overload) metody. Nie jest to wbrew pozorom to samo i często przeciążanie metod jest mylnie utożsamiane jako synonim przesłaniania. Przypatrz się klasom Worker i Lawyer.

public class Worker {
  private String name;
  
  public void showName() {
    System.out.println("Worker name " + name);
  }
}

Teraz napiszę klasę Lawyer dziedziczącą po Worker.

public class Lawyer extends Worker{
  private String name;
  
  public Lawyer(String name) {
    this.name = name;
  }

  @Override
  public void showName() {
    System.out.println("Lawyer name is " + name);
  }
  
  public void workOnCase() {
    System.out.print("Work on case number..");
  }
  
  public void workOnCase(int caseNumber) {
    System.out.println();
    workOnCase();
    System.out.println(" " + caseNumber);
  }
}

Przeciążanie metod a ich przesłanianie

Jak widzisz jest tu zastosowane zwykłe dziedziczenie i przesłonienie z użyciem adnotacji override. Nic ciekawe się tu nie dzieje. To teraz zobacz na dodatkowe metody workOnCase bez i z parametrem. Sygnatury są niemal identyczne, jedyną różnicą jest parametr caseNumber występujący w drugim przypadku. Ponad to zamiast duplikować kod z pierwszej metody można go wykorzystać w metodzie drugiej poprzez jej deklarację. Dzięki temu unikasz duplikacji kodu (wyobraź sobie, że masz tysiąc takich metod i się gdzieś pomyliłeś. Taka pomyłka byłaby bardzo czasochłonna.) zgodnie z zasadą: „Don’t repeat yourself„.

public class JobMain {

  public static void main(String[] args) {
    Lawyer lawyer = new Lawyer("Adam Kowalski");
    lawyer.showName();
    lawyer.workOnCase();
    lawyer.workOnCase(10);
  }
}

Teraz wywołaj powyższy main() i zobacz na efekty..

Lawyer name is Adam Kowalski
Work on case number..
Work on case number.. 10

W podobny sposób można przeciążać konstruktory, dodając im kolejne parametry w sygnaturze.

To wszystko na dziś. Lekcja jest bardzo prosta: To wszystko na dziś. Lekcja jest bardzo prosta: przeciążanie metod powinno kojarzyć Ci się z unikaniem duplikacji kodu w metodach o podobnych sygnaturach, przesłanianie za to używasz, w momencie dziedziczenia lub implementacji interfejsu.

Link do lekcji: https://github.com/developeronthego/java-middle/tree/master/src/main/java/middle/lesson4

Link do lekcji o przesłanianiu: https://developeronthego.pl/java-srednio-zaawansowane-3-przeslanianie-metod-override/

Exit mobile version