
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. 😉
intellij nie przepuszcza takiego przeciążania już