Java Reference
In-Depth Information
void printMessage() {
System.out.println("Click");
}
}
Solution 70: Package Deal
This puzzle appears straightforward. The main method in hack.TypeIt instantiates the class
TypeIt.ClickIt and invokes its doIt method, which is inherited from CodeTalk . This method, in
turn, calls printMessage , which is declared in TypeIt.ClickIt to print Hack . And yet, if you run
the program, it prints Click . How can this be?
This analysis incorrectly assumes that hack.TypeIt.ClickIt.printMessage overrides
click.CodeTalk.printMessage . A package-private method cannot be directly overridden by a
method in a different package [JLS 8.4.8.1]. The two printMessage methods in this program are
unrelated; they merely have the same name. When the program calls printMessage from within the
package hack , the package-private method hack.TypeIt.ClickIt.printMessage is run. This
method prints Click , which explains the observed behavior.
If you want the printMessage method in hack.TypeIt.ClickIt to override the method in
click.CodeTalk , you must add the protected or public modifier to the method declaration in
click.CodeTalk . To make the program compile, you must also add a modifier to the overriding
declaration in hack.TypeIt.ClickIt . This modifier must be no more restrictive than the one you
placed on the declaration for printMessage in hack.TypeIt.ClickIt [JLS 8.4.8.3]. In other words,
both printMessage methods may be declared public , both may be declared protected, or the
superclass method may be declared protected and the subclass method public . If any of these
three changes is made, the program will print Hack , indicating that overriding is taking place.
In summary, package-private methods cannot be directly overridden outside the package in which
they're declared. Although the combination of package-private access and overriding can lead to
some confusion, Java's current behavior enables packages to support encapsulation of abstractions
larger than a single class. Package-private methods are implementation details of their package, and
reuse of their names outside the package should have no effect inside the package.
< Day Day Up >
 
 
Search WWH ::




Custom Search