|
Java offers four access specifiers, listed below in decreasing accessibility:
We look at these access specifiers in more detail.publicpublic 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
}
protectedprotected 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.
privateprivate 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.