Why can't you reduce the visibility of a method in a Java subclass?
Solution 1
Because every instance of the subclass still needs to be a valid instance of the base class (see Liskov substitution principle).
If the subclass suddenly has lost one property of the base class (namely a public method for example) then it would no longer be a valid substitute for the base class.
Solution 2
Because if this was allowed, the following situation would be possible:
Class Sub inherits from class Parent. Parent has a public method foo
, Sub makes that method private. Now the following code would compile fine, because the declared type of bar
is Parent:
Parent bar = new Sub();
bar.foo();
However it is not clear how this should behave. One possibility would be to let it cause a runtime error. Another would be to simply allow it, which would make it possible to call a private method from outside, by just casting to the parent class. Neither of those alternatives are acceptable, so it is not allowed.
Solution 3
Because subtypes have to be usable as instances of their supertype.
ria
Updated on June 06, 2022Comments
-
ria almost 2 years
Why does the compiler give an error message when you reduce the visibility of a method while overriding it in the subclass?
-
Pacerier over 9 yearsBut why are we not allowed to override a protected method and change it to private? Since the public interface is still the same, it doesn't break LSP this way.
-
Elazar over 8 yearsThe public interface does not change, but the protected does. Code in the parent class cannot access the methods of its own flesh and blood :(