The types that comprise a package are known as the package members.
To use a public
package member from outside its package, you must do one of the following:
Each is appropriate for different situations, as explained in the sections that follow.
So far, most of the examples in this
tutorial
have referred to types by their simple names, such as Rectangle
and StackOfInts
. You can use a package member's simple name if the code you are writing is in the same package as that member or if that member has been imported.
However, if you are trying to use a member from a different package and that package has not been imported, you must use the member's fully qualified name, which includes the package name. Here is the fully qualified name for the Rectangle
class declared in the graphics
package in the previous example.
graphics.Rectangle
You could use this qualified name to create an instance of graphics.Rectangle
:
graphics.Rectangle myRect = new graphics.Rectangle();
Qualified names are all right for infrequent use. When a name is used repetitively, however, typing the name repeatedly becomes tedious and the code becomes difficult to read. As an alternative, you can import the member or its package and then use its simple name.
To import a specific member into the current file, put an import
statement at the beginning of the file before any type definitions but after the package
statement, if there is one. Here's how you would import the Rectangle
class from the graphics
package created in the previous section.
import graphics.Rectangle;
Now you can refer to the Rectangle
class by its simple name.
Rectangle myRectangle = new Rectangle();
This approach works well if you use just a few members from the graphics
package. But if you use many types from a package, you should import the entire package.
To import all the types contained in a particular package, use the import
statement with the asterisk (*)
wildcard character.
import graphics.*;
Now you can refer to any class or interface in the graphics
package by its simple name.
Circle myCircle = new Circle(); Rectangle myRectangle = new Rectangle();
The asterisk in the import
statement can be used only to specify all the classes within a package, as shown here. It cannot be used to match a subset of the classes in a package. For example, the following does not match all the classes in the graphics
package that begin with A
.
// does not work import graphics.A*;
Instead, it generates a compiler error. With the import
statement, you generally import only a single package member or an entire package.
import
allows you to import the public nested classes of an enclosing class. For example, if the graphics.Rectangle
class contained useful nested classes, such as Rectangle.DoubleWide
and Rectangle.Square
, you could import Rectangle
and its nested classes by using the following two statements.
import graphics.Rectangle; import graphics.Rectangle.*;
Rectangle
.import
, the static import statement, will be discussed at the end of this section.
For convenience, the Java compiler automatically imports two entire packages for each source file: (1) the java.lang
package and (2) the current package (the package for the current file).
At first, packages appear to be hierarchical, but they are not. For example, the Java API includes a java.awt
package, a java.awt.color
package, a java.awt.font
package, and many others that begin with java.awt
. However, the java.awt.color
package, the java.awt.font
package, and other java.awt.xxxx
packages are not included in the java.awt
package. The prefix java.awt
(the Java Abstract Window Toolkit) is used for a number of related packages to make the relationship evident, but not to show inclusion.
Importing java.awt.*
imports all of the types in the java.awt
package, but it does not import java.awt.color
, java.awt.font
, or any other java.awt.xxxx
packages. If you plan to use the classes and other types in java.awt.color
as well as those in java.awt
, you must import both packages with all their files:
import java.awt.*; import java.awt.color.*;
If a member in one package shares its name with a member in another package and both packages are imported, you must refer to each member by its qualified name. For example, the graphics
package defined a class named Rectangle
. The java.awt
package also contains a Rectangle
class. If both graphics
and java.awt
have been imported, the following is ambiguous.
Rectangle rect;
In such a situation, you have to use the member's fully qualified name to indicate exactly which Rectangle
class you want. For example,
graphics.Rectangle rect;
There are situations where you need frequent access to static final fields (constants) and static methods from one or two classes. Prefixing the name of these classes over and over can result in cluttered code. The static import statement gives you a way to import the constants and static methods that you want to use so that you do not need to prefix the name of their class.
The java.lang.Math
class defines the PI
constant and many static methods, including methods for calculating sines, cosines, tangents, square roots, maxima, minima, exponents, and many more. For example,
public static final double PI = 3.141592653589793; public static double cos(double a) { ... }
Ordinarily, to use these objects from another class, you prefix the class name, as follows.
double r = Math.cos(Math.PI * theta);
You can use the static import statement to import the static members of java.lang.Math so that you don't need to prefix the class name, Math
. The static members of Math
can be imported either individually:
import static java.lang.Math.PI;
or as a group:
import static java.lang.Math.*;
Once they have been imported, the static members can be used without qualification. For example, the previous code snippet would become:
double r = cos(PI * theta);
Obviously, you can write your own classes that contain constants and static methods that you use frequently, and then use the static import statement. For example,
import static mypackage.MyConstants.*;