This is a simple question, but I am really bugged by it. I was trying to find a duplicate, and googled it, but I was more surprised when I couldn't find a satisfying answer.
import java.util.Scanner;
In this statement .Scanner
is the class,
.util
is the name of the package
What is java
or javax
or whatever would stand before the first period in general?
UPDATE:
I also found this picture:
http://www.javatpoint.com/package
Is it true?
the import statement represent a hierarchy
java
is the packageutil
is the subpackage (inside java)Scanner
is the class (inside util)import java.util.*;
The class name could be subtituited with an asterisk,
and that means import all classes in the mentioned subpackage.
java
andutil
are names of nested packages.java.util
is a path to final package.They are directories inside
rt.jar
file.rt.jar
file is azip
archive, you can view it with7-zip
program.Scanner
is aScanner.class
file insidejava/util
directory insidert.jar
import java.util.Scanner
directive just allows you to useScanner
class name in code without specifying full path to it.import java.util.*
directive allows you to use ALL class names injava.util
without a path.import static java.util.Scanner.*
directive allows you to use ALL static members insideScanner
, without a paths. But there are none.List of all packages in JRE are here: http://docs.oracle.com/javase/7/docs/api/overview-summary.html
A few points:
java.util
, notutil
. "java" is just part of the package name.AbC123.XYZ.foo
is a valid package namejava
are part of the JDK (plus extensions). There is nothing in the language that specifies this or enforces it1) java is a package. (also represents a folder in file system).
It is directly in the classpath, so it is referenced by your program as 'java'. (subfolder in java folder)
2) util is a package inside java package (hence referenced as 'java.util').
3) Scanner is a class inside util package (hence 'java.util.Scanner')
You can have as many nested packages as you want like 'mypackage1.mypackage2.mypackage3. ...' and so on, as long as mypackage1 is in the classpath.
Hope this helps
import java.util.Scanner
says.Scanner s = new Scanner()
) then the class found by the import will be used.Alternatively you could not do the import and do
java.util.Scanner s = new java.util.Scanner()
but you can see how that would quickly become unwieldy, especially if you use it in a lot of places within your file. Imports are just a handy way to reduce repeatedly specifying which version of theScanner
class you mean when you refer toScanner
.Per the JLS 7.1:
So you can glean from that:
java
is a package with no classes, only subpackages.util
is a subpackage ofjava
whose fully qualified name isjava.util
.util
does not denote a package,java.util
does."I also found this picture: ... Is it true?"
Yes,
util
is a subpackage ofjava
. However,util
is not a package.java.util
is a package.You can think of packages as a directory structure, if you wish, where each subpackage is a folder inside its outer package. So there would be a "folder" java and, inside that, another "folder" util. A package is denoted by its fully qualified name ("full path") so
java
is a package andjava/util
is a package./util
is not a package. But packages represented by a directory structure is not a spec. It is only a common implementation. It is up to the host system to decide how packages are stored (JLS 7.2).