Creating and Using Packages
To organise a class into a package we use the package
keyword. The package corresponds with the directory name relative to the parent folder.
Example
Here is an example of the Main class defined in the package edu.self
package :
package edu.self;
public class Main {
public static void main(String[] args) {
}
}
and here is the folder structure on the operating system :
Directory Structure
src
is the parent directoryedu
is the parent packageself
is the sub package defined in theedu
package.
Packages can be nested as in the above case by using a dot, (.
). The directory structure will have to correspond.
Using Packages Members
To use a class or interface defined in the package they will need to be imported. The members are imported using the import
keyword. Members in the java.lang
package do not need to be imported, they are available automatically.
The import
statement should come after the package statement and before any class definitions.
Importing a Class
After adding the Socket.IO library to our project we will have access to the classes and interfaces of the library.
To use the Socket class, defined in the package, package io.socket.client
, we can import it as follows :
import io.socket.client.Socket;
Now we have access to the Socket
class in our code.
Instead of imported we can also refer to the member by its fully qualified name as follows :
io.socket.client.Socket socket;
Importing Entire Package
Or we can import the whole package by using the asterisk, *
.
import io.socket.client.*;
Apparent Hierarchies of Packages
Packages appear to be hierarchical but they are not. Package naming is used to show relationships but not show inclusion.
Importing io.socket.*
imports all the types in the io.socket
package, but does not import io.socket.emmiter
or io.socket.client
packages.
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.
In our chat application, they are two Socket classes, one is defined in the io.socket.engineio.client
and another in the io.socket.client
. To use both in our class, the Socket
class will need to be fully qualified as follows :
io.socket.client.Socket clientSocket;
io.socket.engineio.client.Socket engineSocket;
Static Import
Static methods and fields can be imported so that they can be used without their class or interface prefix by using the import static
keyword.
We can import the static abs
method in the java.lang.Math
class as follows :
import static java.lang.Math.abs;
Now we can use the abs
method anywhere without prefixing it with the Math
class as follows :
import static java.lang.Math.abs;
public class Main {
public static void main(String[] args) {
int a = abs(-10); //now we can use without typing Math.abs()
}
}