Java offers four access specifiers, listed below in decreasing accessibility:
We look at these access specifiers in more detail.public
public
classes, methods, and fields can be accessed from
everywhere. The only constraint is that a file with Java source code
can only contain one public
class whose name must also match
with the filename. If it exists, this public
class represents
the application or the applet, in which case the
public
keyword is necessary to enable your
Web browser or appletviewer to show the applet.
You use public
classes, methods, or fields only
if you explicitly want to offer access to these entities and if this access
cannot do any harm. An example of a square determined by the position of
its upper-left corner and its size:
public class Square { // public class public x, y, size; // public instance variables }
protected
protected
methods and fields can only be accessed within the same
class to which the methods and fields belong, within its subclasses,
and within classes of the same package,
but not from anywhere else.
You use the protected
access level when it is
appropriate for a class's subclasses to have access to the method or field,
but not for unrelated classes.
geometry
package that contains
Square
and Tiling
classes, may be easier and cleaner
to implement if the coordinates of the upper-left corner of a
Square
are directly available to the Tiling
class
but not outside the geometry
package.
private
private
methods and fields can only be accessed within the same
class to which the methods and fields belong. private
methods
and fields are not visible within subclasses and are not inherited by
subclasses. So, the private
access specifier is opposite to the public
access specifier.
It is mostly used for encapsulation: data
are hidden within the class and accessor methods are provided.
An example, in which the position of the upper-left corner of a square
can be set or obtained by accessor methods, but individual coordinates are not
accessible to the user.
public class Square { // public class private double x, y // private (encapsulated) instance variables public setCorner(int x, int y) { // setting values of private fields this.x = x; this.y = y; } public getCorner() { // setting values of private fields return Point(x, y); } }
Situation | public
|
protected
|
default | private
|
---|---|---|---|---|
Accessible to class
from same package? |
yes | yes | yes | no |
Accessible to class
from different package? |
yes | no, unless it is a subclass | no | no |
protected
access.
Without access specifier (the default choice), methods and variables
are accessible only within the class that defines them and
within classes that are part of the same package.
They are not visible to subclasses unless these are in the same package.
protected
methods and variables are visible to subclasses
regardless of which package they are in.