Do czego służy adnotacja Override, co zyskujemy korzystając z niej?

Dzięki wykorzystaniu adnotacji @Override kompilator otrzymuje od nas informację, że dana metoda będzie przysłaniać inną metodę. W przypadku, gdy żadna metoda do przysłonięcia nie zostanie odnaleziona (np. w interfejsie, w klasie rodzica) to kompilator zwróci nam błąd.

Wykorzystując tą adnotację mamy pewność, że przysłonimy istniejącą metodę. Nie ma możliwości, aby się pomylić w sygnaturze funkcji.

Przykład

Przypuśćmy, że jest klasa Parent z prostą metodą getInfo:

package org.pr;

public class Parent {
    protected String name;
    protected int age;

    public Parent(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getInfo(String text) {
        return name + " powiedział: " + text;
    }
}

Tworzę klasę dziedziczącą Child, w której chcę przysłonić metodę getInfo.

package org.pr;

public class Child extends Parent {
    private double height;


    public Child(String name, int age, double height) {
        super(name, age);
        this.height = height;
    }

    public String getInfo(Object obj) {
        return name + ", który ma " + height + " cm wzrostu powiedział: " + obj.toString();
    }
}

Działanie można przetestować w taki sposób:

package org.pr;

public class Main {

    public static void main(String[] args) {
      Child child = new Child("Pablo", 21, 182);
        String info = child.getInfo("Hello world!");

        System.out.println(info);
    }
}

W konsoli otrzymujemy taki rezultat?

Pablo powiedział: Hello world!

Pomimo tego, że próbowaliśmy przysłonić metodę to się to nie udało. Pomyłka wystąpiła przy typie argumentu. Zobaczmy co się stanie, gdy użyjemy adnotacji @Override.

package org.pr;

public class Child extends Parent {
    private double height;


    public Child(String name, int age, double height) {
        super(name, age);
        this.height = height;
    }

    @Override
    public String getInfo(Object obj) {
        return name + ", który ma " + height + " cm wzrostu powiedział: " + obj.toString();
    }
}

Kompilator od razu nas informuje, że nie znalazł takiej samej sygnatury metody, którą mógłby przysłonić.

Error:(12, 5) java: method does not override or implement a method from a supertype

Gdy zmienimy typ argumentu na Stringa:

package org.pr;

public class Child extends Parent {
    private double height;


    public Child(String name, int age, double height) {
        super(name, age);
        this.height = height;
    }

    @Override
    public String getInfo(String obj) {
        return name + ", który ma " + height + " cm wzrostu powiedział: " + obj.toString();
    }
}

Tym razem przesłonięcie zadziała, ponieważ kompilator nie daje nam żadnych informacji.

Pablo, który ma 182.0 cm wzrostu powiedział: Hello world!

Pomimo tego, że przykład jest trochę abstrakcyjny to z pewnością adnotacja Override może czasami uratować nam stracony czas na debugowanie. 😉