Пример того, почему это предупреждение или ошибка важны, рассмотрим следующий пример:
package a;
public class Animal {
// Note: no visibility modifier therefore package-private
String makeNoise() {
return "no noise defined";
}
}
package b;
import a.Animal;
public class Cat extends Animal {
// Note: Eclipse will show the warning that it doesn't override
public String makeNoise() {
return "meow";
}
}
package b;
import a.Animal;
public class Dog extends Animal {
// Note: Eclipse will show the warning that it doesn't override
public String makeNoise() {
return "bark";
}
}
package a;
import java.util.ArrayList;
import java.util.List;
import b.Cat;
import b.Dog;
public class Main {
public static void main(String[] args) {
// Make a list of Animals
List<Animal> animals = new ArrayList<>();
animals.add(new Cat());
animals.add(new Dog());
// Loop through the animals making their noises
for (Animal animal : animals) {
System.out.println(animal.makeNoise());
}
}
}
Скопируйте и вставьте все это в Eclipse, и он отсортирует классы и пакеты. Затем запустите класс Main
. Вы можете ожидать, что это напечатает
meow
bark
Но вместо этого он печатает
no noise defined
no noise defined
Это запутанное поведение, которое неожиданно нарушает полиморфизм. Это объясняется тем, что подклассы Animal
Cat
и Dog
на самом деле не переопределяют метод makeNoise
, поэтому, когда makeNoise
вызывается для Animal
, он использует реализацию Animal
.
Чтобы исправить этот код, добавьте модификаторы public
или protected
к методу Animal
makeNoise
, затем повторно запустите код, который теперь будет работать, как и ожидалось. В этом простом примере совершенно ясно, что происходит, но в более сложной ситуации это поведение может быть крайне запутанным и, возможно, неправильным, поэтому к предупреждению следует относиться серьезно.