PACKAGE
Creating and Using Packages
To make types easier to find and use, to avoid naming conflicts, and to control access, programmers bundle groups of related types into packages.
The types that are part of the Java platform are members of various packages that bundle classes by function: fundamental classes are in
Definition: A package is a grouping of related types providing access protection and name space management. Note that types refers to classes, interfaces, enumerations, and annotation types. Enumerations and annotation types are special kinds of classes and interfaces, respectively, so types are often referred to in this lesson simply as classes and interfaces.java.lang, classes for reading and writing (input and output) are injava.io, and so on. You can put your types in packages too.
Suppose you write a group of classes that represent graphic objects, such as circles, rectangles, lines, and points. You also write an interface,Draggable, that classes implement if they can be dragged with the mouse.
You should bundle these classes and the interface in a package for several reasons, including the following://in the Draggable.java file public interface Draggable { . . . } //in the Graphic.java file public abstract class Graphic { . . . } //in the Circle.java file public class Circle extends Graphic implements Draggable { . . . } //in the Rectangle.java file public class Rectangle extends Graphic implements Draggable { . . . } //in the Point.java file public class Point extends Graphic implements Draggable { . . . } //in the Line.java file public class Line extends Graphic implements Draggable { . . . }
- You and other programmers can easily determine that these types are related.
- You and other programmers know where to find types that can provide graphics-related functions.
- The names of your types won't conflict with the type names in other packages because the package creates a new namespace.
- You can allow types within the package to have unrestricted access to one another yet still restrict access for types outside the package.
Creating a Package
To create a package, you choose a name for the package (naming conventions are discussed in the next section) and put apackagestatement with that name at the top of every source file that contains the types (classes, interfaces, enumerations, and annotation types) that you want to include in the package.The package statement (for example,package graphics;) must be the first line in the source file. There can be only one package statement in each source file, and it applies to all types in the file.
If you put the graphics interface and classes listed in the preceding section in a package called
Note: If you put multiple types in a single source file, only one can bepublic, and it must have the same name as the source file. For example, you can definepublic class Circlein the fileCircle.java, definepublic interface Draggablein the fileDraggable.java, definepublic enum Dayin the fileDay.java, and so forth.You can include non-public types in the same file as a public type (this is strongly discouraged, unless the non-public types are small and closely related to the public type), but only the public type will be accessible from outside of the package. All the top-level, non-public types will bepackage private.
graphics, you would need six source files, like this:If you do not use a//in the Draggable.java file package graphics; public interface Draggable { . . . } //in the Graphic.java file package graphics; public abstract class Graphic { . . . } //in the Circle.java file package graphics; public class Circle extends Graphic implements Draggable { . . . } //in the Rectangle.java file package graphics; public class Rectangle extends Graphic implements Draggable { . . . } //in the Point.java file package graphics; public class Point extends Graphic implements Draggable { . . . } //in the Line.java file package graphics; public class Line extends Graphic implements Draggable { . . . }packagestatement, your type ends up in an unnamed package. Generally speaking, an unnamed package is only for small or temporary applications or when you are just beginning the development process. Otherwise, classes and interfaces belong in named packages.
Naming a Package
With programmers worldwide writing classes and interfaces using the Java programming language, it is likely that many programmers will use the same name for different types. In fact, the previous example does just that: It defines aRectangleclass when there is already aRectangleclass in thejava.awtpackage. Still, the compiler allows both classes to have the same name if they are in different packages. The fully qualified name of eachRectangleclass includes the package name. That is, the fully qualified name of theRectangleclass in thegraphicspackage isgraphics.Rectangle, and the fully qualified name of theRectangleclass in thejava.awtpackage isjava.awt.Rectangle.This works well unless two independent programmers use the same name for their packages. What prevents this problem? Convention.
Naming Conventions
Package names are written in all lowercase to avoid conflict with the names of classes or interfaces.Companies use their reversed Internet domain name to begin their package names—for example,com.example.orionfor a package namedorioncreated by a programmer atexample.com.
Name collisions that occur within a single company need to be handled by convention within that company, perhaps by including the region or the project name after the company name (for example,com.company.region.package).
Packages in the Java language itself begin withjava.orjavax.
In some cases, the internet domain name may not be a valid package name. This can occur if the domain name contains a hyphen or other special character, if the package name begins with a digit or other character that is illegal to use as the beginning of a Java name, or if the package name contains a reserved Java keyword, such as "int". In this event, the suggested convention is to add an underscore. For example:
Legalizing Package Names Domain Name Package Name Prefix clipart-open.org org.clipart_open free.fonts.int int_.fonts.free poetry.7days.com com._7days.poetry
Using Package Members
The types that comprise a package are known as the package members.To use apublicpackage 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.
- Refer to the member by its fully qualified name
- Import the package member
- Import the member's entire package
Referring to a Package Member by Its Qualified Name
So far, most of the examples in this tutorial have referred to types by their simple names, such asRectangleandStackOfInts. 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 theRectangleclass declared in thegraphicspackage in the previous example.
You could use this qualified name to create an instance ofgraphics.Rectanglegraphics.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.graphics.Rectangle myRect = new graphics.Rectangle();Importing a Package Member
To import a specific member into the current file, put animportstatement at the beginning of the file before any type definitions but after thepackagestatement, if there is one. Here's how you would import theRectangleclass from thegraphicspackage created in the previous section.Now you can refer to theimport graphics.Rectangle;Rectangleclass by its simple name.This approach works well if you use just a few members from theRectangle myRectangle = new Rectangle();graphicspackage. But if you use many types from a package, you should import the entire package.Importing an Entire Package
To import all the types contained in a particular package, use theimportstatement with the asterisk(*)wildcard character.Now you can refer to any class or interface in theimport graphics.*;graphicspackage by its simple name.The asterisk in theCircle myCircle = new Circle(); Rectangle myRectangle = new Rectangle();importstatement 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 thegraphicspackage that begin withA.Instead, it generates a compiler error. With theimport graphics.A*; //does not workimportstatement, you generally import only a single package member or an entire package.For convenience, the Java compiler automatically imports three entire packages for each source file: (1) the package with no name, (2) the
Note: Another, less common form ofimportallows you to import the public nested classes of an enclosing class. For example, if thegraphics.Rectangleclass contained useful nested classes, such asRectangle.DoubleWideandRectangle.Square, you could importRectangleand its nested classes by using the following two statements.Be aware that the second import statement will not importimport graphics.Rectangle; import graphics.Rectangle.*;Rectangle.Another less common form ofimport, the static import statement, will be discussed at the end of this section.
java.langpackage, and (3) the current package (the package for the current file).Apparent Hierarchies of Packages
At first, packages appear to be hierarchical, but they are not. For example, the Java API includes ajava.awtpackage, ajava.awt.colorpackage, ajava.awt.fontpackage, and many others that begin withjava.awt. However, thejava.awt.colorpackage, thejava.awt.fontpackage, and otherjava.awt.xxxxpackages are not included in thejava.awtpackage. The prefixjava.awt(the Java Abstract Window Toolkit) is used for a number of related packages to make the relationship evident, but not to show inclusion.Importingjava.awt.*imports all of the types in thejava.awtpackage, but it does not importjava.awt.color,java.awt.font, or any otherjava.awt.xxxxpackages. If you plan to use the classes and other types injava.awt.coloras well as those injava.awt, you must import both packages with all their files:
import java.awt.*; import java.awt.color.*;Name Ambiguities
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, thegraphicspackage defined a class namedRectangle. Thejava.awtpackage also contains aRectangleclass. If bothgraphicsandjava.awthave been imported, the following is ambiguous.In such a situation, you have to use the member's fully qualified name to indicate exactly whichRectangle rect;Rectangleclass you want. For example,graphics.Rectangle rect;The Static Import Statement
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.Thejava.lang.Mathclass defines thePIconstant and many static methods, including methods for calculating sines, cosines, tangents, square roots, maxima, minima, exponents, and many more. For example,
Ordinarily, to use these objects from another class, you prefix the class name, as follows.public static final double PI 3.141592653589793 public static double cos(double a)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,double r = Math.cos(Math.PI * theta);Math. The static members ofMathcan be imported either individually:or as a group:import static java.lang.Math.PI;Once they have been imported, the static members can be used without qualification. For example, the previous code snippet would become:import static java.lang.Math.*;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,double r = cos(PI * theta);import static mypackage.MyConstants.*;
Note: Use static import very sparingly. Overusing static import can result in code that is difficult to read and maintain, because readers of the code won't know which class defines a particular static object. Used properly, static import makes code more readable by removing class name repetition.
Managing Source and Class Files
Many implementations of the Java platform rely on hierarchical file systems to manage source and class files, although The Java Language Specification does not require this. The strategy is as follows.Put the source code for a class, interface, enumeration, or annotation type in a text file whose name is the simple name of the type and whose extension is.java. For example:
Then, put the source file in a directory whose name reflects the name of the package to which the type belongs://in the Rectangle.java file package graphics; public class Rectangle { . . . }The qualified name of the package member and the path name to the file are parallel, assuming the Microsoft Windows file name separator backslash (for Unix, use the forward slash)......\graphics\Rectangle.javaAs you should recall, by convention a company uses its reversed Internet domain name for its package names. The Example company, whose Internet domain name is
class name graphics.Rectanglepathname to file graphics\Rectangle.javaexample.com, would precede all its package names withcom.example. Each component of the package name corresponds to a subdirectory. So, if the Example company had acom.example.graphicspackage that contained aRectangle.javasource file, it would be contained in a series of subdirectories like this:
When you compile a source file, the compiler creates a different output file for each type defined in it. The base name of the output file is the name of the type, and its extension is....\com\example\graphics\Rectangle.java.class. For example, if the source file is like this
then the compiled files will be located at://in the Rectangle.java file package com.example.graphics; public class Rectangle { . . . } class Helper{ . . . }Like the\com\example\graphics\Rectangle.class \com\example\graphics\Helper.class .javasource files, the compiled.classfiles should be in a series of directories that reflect the package name. However, the path to the.classfiles does not have to be the same as the path to the.javasource files. You can arrange your source and class directories separately, as:
By doing this, you can give the\sources\com\example\graphics\Rectangle.java \classes\com\example\graphics\Rectangle.class classesdirectory to other programmers without revealing your sources. You also need to manage source and class files in this manner so that the compiler and the Java Virtual Machine (JVM) can find all the types your program uses.The full path to theclassesdirectory,, is called the class path, and is set with the\classes CLASSPATHsystem variable. Both the compiler and the JVM construct the path to your.classfiles by adding the package name to the class path. For example, if
is your class path, and the package name is\classes then the compiler and JVM look forcom.example.graphics,.class filesinA class path may include several paths, separated by a semicolon (Windows) or colon (Unix). By default, the compiler and the JVM search the current directory and the JAR file containing the Java platform classes so that these directories are automatically in your class path.\classes\com\example\graphics.
Setting the CLASSPATH System Variable
To display the currentCLASSPATHvariable, use these commands in Windows and Unix (Bourne shell):To delete the current contents of theIn Windows: C:\> set CLASSPATH In Unix: % echo $CLASSPATHCLASSPATHvariable, use these commands:To set theIn Windows: C:\> set CLASSPATH= In Unix: % unset CLASSPATH; export CLASSPATHCLASSPATHvariable, use these commands (for example):In Windows: C:\> set CLASSPATH=C:\users\george\java\classes In Unix: % CLASSPATH=/home/george/java/classes; export CLASSPATH
0 comments:
Post a Comment