2.11. Java File Structure
This chapter has taken us from the
smallest to the largest elements of Java syntax, from individual
characters and tokens to operators, expressions, statements, and
methods, and on up to classes and packages. From a practical
standpoint, the unit of Java program structure you will be dealing
with most often is the Java file. A Java file is the smallest unit of
Java code that can be compiled by the Java compiler. A Java file
consists of:
- An optional package directive
- Zero or more import or import
static directives - One or more type definitions
These elements can be interspersed with comments, of course, but they
must appear in this order. This is all there is to a Java file. All
Java statements (except the package and
import directives, which are not true statements)
must appear within methods, and all methods must appear within a type
definition.Java files have a couple of other
important restrictions. First, each file can contain at most one
class that is declared public. A
public class is one that is designed for use by
other classes in other packages. This restriction on public classes
only applies to top-level classes; a class can contain any number of
nested or inner classes that are declared public.
We'll see more about the public
modifier and nested classes in Chapter 3.The
second restriction concerns the filename of a Java file. If a Java
file contains a public class, the name of the file
must be the same as the name of the class, with the extension
.java appended. Thus, if
Point is defined as a public
class, its source code must appear in a file named
Point.java . Regardless of whether your classes
are public or not, it is good programming practice
to define only one per file and to give the file the same name as the
class.When
a Java file is compiled, each of the classes it defines is compiled
into a separate class file that contains Java
byte codes to be interpreted by the Java Virtual Machine. A class
file has the same name as the class it defines, with the extension
.class appended. Thus, if the file
Point.java defines a class named
Point, a Java compiler compiles it to a file named
Point.class . On most systems, class files are
stored in directories that correspond to their package names. Thus,
the class com.davidflanagan.examples.Point is
defined by the class file
com/davidflanagan/examples/Point.class .The Java interpreter knows where the
class files for the standard system classes are located and can load
them as needed. When the interpreter runs a program that wants to use
a class named com.davidflanagan.examples.Point, it
knows that the code for that class is located in a directory named
com/davidflanagan/examples/ and, by default, it
"looks" in the current directory
for a subdirectory of that name. In order to tell the interpreter to
look in locations other than the current directory, you must use the
-classpath option when invoking the interpreter or
set the CLASSPATH environment variable. For
details, see the documentation for the Java interpreter,
java , in Chapter 8.