When overriding a method, you should declare the visibility of overridden method as the the one in the base class or wider.
Here is a note about the overriding rules I wrote it myself as a reference to me:
/* Access Modifiers */
1- Access modifier in child should be same or greater (the sequence:
public - protected - default (package-private) - private). Access
modifier in parent should not be private. If a child don't have access
to the parent's method, then overriding the method without the
@Override annotation will consider it as a new method.
/* Return Types */
2- Return type in child should be the same class or sub-class.
/* Exceptions */
3- If the parent's method throws checked exception, then the child's
method can: a- throw the same exception or sub-class. b- not to
throw any exceptions. c- throw runtime exceptions.
4- If the parent's method throws unchecked exception, then the child's
method can: a- not to throw any exceptions. b- throw runtime
exceptions.
5- If the parnet's method does not throw exception, then the child's
method can: a- not to throw any exceptions. b- throw runtime
exceptions.