1. Package trong Java là gì?

Package trong Java hay còn được gọi là gói trong Java. Nó là một cơ chế để phân loại và nhóm các class (lớp) và API (giao diện) sử dụng trong chương trình Java. Hay ta có thể hiểu nó là một nhóm các kiểu tương tự của các lớp, giao diện và các package con.

Để có được sự quản lý các class trong Java một cách tối ưu nhất ta cần phải phân loại, chia nhỏ và gộp nhóm chúng để dễ sử dụng. Khi đã phân loại chúng trong các group rồi, chúng ta có thể sử dụng các class với cùng tên nhau miễn là chúng thuộc các group khác nhau. Và từng group chứa các class đã được phân loại này được gọi là package trong Java.

Việc phân loại các class vào các package về bản chất là chia nhỏ một file chứa mã nguồn chương trình Java thành các file nhỏ hơn và lưu vào các thư mục khác nhau trong thư mục chứa mã nguồn chương trình Java.

Nói cách khác, package thực chất là một thư mục (folder) nằm bên trong thư mục gốc chứa chương trình Java chứa các file nhỏ, với mỗi file đó sẽ được dùng để lưu mã nguồn của class cần đóng gói bên trong package.

2. Các loại Package trong Java

Package trong Java cũng tương tự như class cũng có 2 loại. Đó là:

  • Package được xây dựng sẵn
  • Package do người dùng định nghĩa

Package được xây dựng sẵn là package được tích hợp sẵn từ Java API (Built-in packages). Có rất nhiều package được xây dựng sẵn nhưng ta sẽ tìm hiểu về một số loại hay được sử dụng như:

  • java.lang : Chứa các lớp hỗ trợ ngôn ngữ (ví dụ: lớp được định nghĩa các kiểu dữ liệu nguyên thủy, các phép toán). Package này được import tự động.
  • java.io : Chứa lớp để hỗ trợ input / output (I/O)
  • java.util : Chứa các lớp tiện ích thực hiện các cấu trúc dữ liệu như danh sách liên kết, dictionary và hỗ trợ cho các hoạt động date / time.
  • java.applet : Chứa các lớp để tạo Applet.
  • java.awt : Chứa các class để triển khai các thành phần cho giao diện người dùng đồ họa (ví dụ như button, menu,…).
  • java.net : Chứa các lớp để hỗ trợ các thao tác trong mạng (network).

Ngoài các package được xây dựng sẵn, chúng ta cũng có thể tự tạo ra các package để chứa các class, giúp tái sử dụng các class nhiều lần trong chương trình và tiết kiệm công sức viết code.

3. Tạo Package trong Java

Khi tạo một package trong Java, ta nên chọn tên cho package và đặt câu lệnh khai báo package ở trên cùng của source file. Lệnh package nên đặt tại dòng code đầu tiên. Ta chỉ có thể khai báo lệnh package này một lần trong một source file, và nó áp dụng tới tất cả các kiểu trong file.

Cú pháp:

package package_name;

public class ClassName {
    //code
}

Trong đó:

  • package là từ khóa dùng để khai báo package trong Java
  • package_name là tên package cần khai báo. Tên package được đặt theo tên của các thư mục chứa nó (không bao gồm thư mục gốc) cách nhau bởi dấu chấm, ví dụ như là lang.ulti.hello chẳng hạn. Lưu ý là tên các folder nên đặt dưới dạng chữ thường.
  • public class ClassName{} dùng để khai báo nội dung class cần đóng gói. Và ClassName là tên của class cần đóng gói, cũng được sử dụng làm tên file dùng để lưu các nội dung này.

Ví dụ:

File HelloJava.java chứa mã nguồn class HelloJava như sau:

//Khai báo package hello
package lang.ulti.hello;

//Khai báo class HelloJava cần đóng gói vào package hello
public class HelloJava {
    public void msg() {
        System.out.println("Hello Java!");
    }
}

File HelloPHP.java chứa mã nguồn class HelloPHP như sau:

//Khai báo package hello
package lang.ulti.hello;

//Khai báo class HelloPHP cần đóng gói vào package hello
public class HelloPHP {
    public void msg() {
        System.out.println("Hello PHP!");
        System.out.println("Java "+"PHP");
    }
}

Khi sử dụng NetBeans ta chỉ cần chuột phải vào thư mục src trong project của bạn, chọn New -> Package

Gõ vào ô name tên package bạn muốn đặt (nên đặt có ý nghĩa chút nha) rồi click Finish là xong. Sau đó ta sẽ New các class, interface,… có liên quan đến nhau trong package vừa đặt để gõ code.

Một package này có thể nằm trong một package khác, nên trong package, ta cũng có thể New một package mới.

4. Truy cập package từ package khác trong Java

4.1. Sử dụng packagename

Nếu ta sử dụng packagename thì tất cả các lớp và các interface của các gói này sẽ có thể truy cập, nhưng gói con của gói này thì không được truy cập. Từ khóa import được sử dụng để truy cập các lớp và interface của gói khác từ gói hiện tại.

Ví dụ:

package pack;
public class A {
    public void msg() {
        System.out.println("Hello");
    }
}
package mypack;  
import pack.*;  
   
class B {
    public static void main(String args[]) {
        A obj = new A();
        obj.msg();
    }
}

Kết quả

Hello

4.2. Sử dụng packagename.classname

Nếu ta khai báo import package.classname thì chỉ được truy cập tới lớp đã được khai báo của package này.

package pack;  
public class A {
    public void msg() {
        System.out.println("Hello");
    }
}
package mypack;  
import pack.A;  
   
class B {
    public static void main(String args[]) {
        A obj = new A();
        obj.msg();
    }
}

Kết quả

Hello

5. Import Package trong Java

5.1. Tên lớp đủ đủ điều kiện trong Java

Sau khi đã đóng gói một class trong một Package, chúng ta có 2 phương pháp để sử dụng nó trong chương trình chính, đó là sử dụng tên lớp đủ điều kiện của nó, hoặc là nạp package chứa nó vào trong chương trình bằng lệnh import .

Tên lớp đủ điều kiện trong Java hay còn gọi là fully-qualified class name là tên gọi đầy đủ của một class, bao gồm cả tên của package chứa nó.

Ví dụ, với package hello mà chúng ta đã tạo ở trên, thì tên lớp đủ điều kiện của nó sẽ là lang.ulti.hello

Để lấy tên lớp đủ điều kiện trong Java, chúng ta sẽ dùng đến một phương thức gọi là getName() .

Ví dụ:

public class Main {
  public static void main(String[] argv) throws Exception {

    Class cls = java.lang.String.class;
    String name = cls.getName(); 
    System.out.println(name);

  }
}

Kết quả

java.lang.String

Để sử dụng class HelloJava trong package hello đã tạo ở trên trong chương trình chính Main.java , chúng ta có thể viết như sau:

import lang.ulti.hello.HelloJava;
import lang.ulti.hello.HelloPython;
 
public class Main {
 
    public static void main(String[] args) {
        lang.ulti.hello.HelloJava hello1 = new lang.ulti.hello.HelloJava();
        hello1.msg();

        lang.ulti.hello.HelloJava hello2 = new lang.ulti.hello.HelloJava();
        hello2.msg();
    }
}

Kết quả

Hello Java!
Hello Java!

5.2. Import package trong Java

Sau khi tạo package, chúng ta có thể sử dụng tới tên lớp đủ điều kiện của các class trong nó khi cần thiết trong chương trình. Tuy nhiên người ta thường dùng từ khóa Improt để nạp một package vào chương trình.

Ví dụ:

import lang.ulti.hello.HelloJava;
import lang.ulti.hello.HelloPHP;
 
public class Main {
 
    public static void main(String[] args) {
        HelloJava hello1 = new HelloJava();
        hello1.msg();

        HelloPython hello2 = new HelloPHP();
        hello2.msg();
    }
}

Kết quả

Hello Java!
Hello PHP!
Java PHP