Trong ngôn ngữ lập trình Java, Package là một trong những điều quan trọng bạn cần biết và sử dụng thành thạo. Vậy Package là gì và chúng được định nghĩa như thế nào? Cùng tìm hiểu qua bài viết dưới đây.
Package là gì?
Package Java là một nhóm các loại class, interface (giao diện) và các gói con tương tự nhau.
Package trong Java được phân loại thành hai nhóm:
- Package đã được dựng sẵn.
- Package do người dùng định nghĩa.
Những lưu ý khi sử dụng Java Package
Sau đây là một số lưu ý bạn cần nắm rõ để làm việc với các Package hiệu quả:
- Cách đặt tên Package: Bạn nên đặt tên Package theo thứ tự ngược lại với tên miền. Ví dụ: Các trường đại học thường đặt tên theo dạng college.tech.ee, college.art.history,…
- Các Package khác nhau nhưng class vẫn có thể trùng tên nhau. Trong trường hợp này, người sử dụng phải Import đầy đủ tên Package và tên class để phân biệt.
- 4 cách truy cập vào các Java Package: private, protected, public và default.
- Private: Với cách làm này, bạn chỉ có thể truy cập vào Package với chính class đó.
- Protected: Người sử dụng có thể truy cập Package bởi các class trong cùng một Package, các class chính là sub-class của class này.
- Public: Bạn có thể truy cập bằng tất cả các class khác nhau, không cần ở trong cùng một Package.
- Default: Người dùng truy cập bởi các class trong cùng một Package.
- Thêm một class vào một Package: Người sử dụng có thể thêm nhiều class vào một Package cực đơn giản bằng cách sử dụng tên Package ở phần đầu chương trình và lưu chúng ở trong thư mục Package. Để xác định một class công khai, bạn sẽ cần một tệp Java mới. Hoặc bạn có thể thêm một class mới vào tệp hiện có và chỉnh sửa lại chúng.
- Các Package con: Các Package nhỏ bên trong một Package lớn được gọi là subpackage hay Package con. Bạn bắt buộc phải nhập chúng một cách rõ ràng. Đặc biệt, các thành phần trong Package con được coi như các Package khác nhau đối khi mặc định và chúng được bảo vệ.
Ưu điểm của Java Package
Sau đây là những ưu điểm của Package trong Java:
- Package Java được tổ chức theo một hệ thống rõ ràng, giúp người dùng phân loại các class và interface để quá trình bảo trì trở nên dễ dàng hơn. Khi thực hiện một dự án, bạn có thể dễ dàng quan sát cấu tạo của chúng, thậm chí biết được ai là người viết dự án này.
- Package Java được trang bị tính năng bảo mật quyền truy cập cao, bạn có thể yên tâm về tính an toàn khi sử dụng.
- Package Java giúp hạn chế tối đa tình trạng xung đột khi đặt tên. Các class trùng tên nhau nhưng nằm trong các Package khác nhau thì vẫn được hệ thống chấp nhận.
Ví dụ về Java Package
Để sử dụng một Package trong Java, bạn cần sử dụng từ khóa Package.
//save as Simple.java
package mypack;
public class Simple{
public static void main(String args[]){
System.out.println("Welcome to package");
}
}
- Cách biên dịch Package Java: Nếu bạn không sử dụng bất kỳ IDE nào, bạn cần thực hiện theo cú pháp dưới đây:
javac -d directory javafilename
Ví dụ:
javac -d . Simple.java
Thành phần -d chỉ định nơi đặt tệp class đã tạo. Bạn có thể sử dụng bất kỳ tên thư mục nào như / home (trong trường hợp Linux), d: / abc (trong trường hợp Windows),… Nếu bạn muốn giữ Package trong cùng một thư mục, bạn có thể sử dụng dấu chấm.
Phân loại Java Package
Như đã nói ở trên, Package Java được chia thành 2 loại:
- Built-in Packages (Package được dựng sẵn hay còn gọi là các Package từ Java API).
- User-defined Packages (Package do người dùng định nghĩa).
1. Package được dựng sẵn
Java API là một thư viện chứa các class miễn phí được viết sẵn và được đưa vào Môi trường phát triển Java.
Các Package này chứa các thành phần giúp quản lý dữ liệu đầu vào, lập trình cơ sở dữ liệu và hơn thế nữa. Bạn có thể tìm thấy danh sách đầy đủ tại trang web của Oracles: https://docs.oracle.com/javase/8/docs/api/
Thư viện được chia thành các Package và các class. Người dùng có thể nhập một class duy nhất (cùng với phương thức và thuộc tính của chúng) hoặc toàn bộ các Package chứa tất cả các class có trong Package đã được chỉ định.
Để sử dụng một Package hoặc một class từ thư viện, bạn cần sử dụng từ khóa sau:
- import package.name.Class; // Import a single class
- import package.name.*; // Import the whole package
Cách Import một class:
Nếu bạn muốn sử dụng một class, ví dụ như lớp Scanner class dùng để lấy thông tin nhập vào của người dùng, hãy dùng mã sau:
import java.util.Scanner;
Trong ví dụ bạn vừa thấy, java.util là một Package, trong khi Scanner là một class của Package java.util đó.
Cách Import một Package:
Bạn có thể có nhiều Package để lựa chọn. Trong ví dụ phần trước, chúng ta đã sử dụng class Scanner từ Package java.util. Package này chứa các cơ sở như ngày và giờ, trình tạo số ngẫu nhiên và các lớp tiện ích khác.
Để nhập toàn bộ dữ liệu của Package, bạn hãy kết thúc câu bằng dấu (*). Ví dụ:
import java.util.*;
2. Package do người dùng định nghĩa
Trước khi tạo lập Package do chính người dùng định nghĩa, bạn cần hiểu rằng Java sẽ sử dụng một thư mục hệ thống tệp để lưu trữ các Package này. Việc này cũng giống như các thư mục trên máy tính của bạn:
└── root
└── mypack
└── MyPackageClass.java
Để tạo một Package, hãy sử dụng từ khóa Package như sau:
package mypack;
class MyPackageClass {
public static void main(String[] args) {
System.out.println("This is my package!");
}
}
Sau đó, hãy lưu tệp dưới dạng MyPackageClass.java và biên dịch chúng:
C:\Users\Your Name>javac MyPackageClass.java
Biên dịch Package:
C:\Users\Your Name>javac -d . MyPackageClass.java
Người dùng có thể sử dụng bất kỳ cái tên nào cho thư mục, chẳng hạn như c: / user (Windows). Hoặc nếu muốn giữ Package trong cùng một thư mục, bạn có thể sử dụng dấu chấm “.” như trong ví dụ bên trên.
Lưu ý: Tên Package nên được tạo bằng chữ thường để tránh xung đột với tên class.
Sau khi biên dịch Package trong ví dụ trên, một thư mục mới đã được tạo có tên là “mypack”. Để chạy tệp MyPackageClass.java, bạn có thể viết như sau:
C:\Users\Your Name>java mypack.MyPackageClass
Output thu được sẽ là:
This is my package!
>> Xem thêm: 5 Cách sửa lỗi Error: Could not find or load main class
Làm thế nào để truy cập Package từ một Package khác?
Để truy cập Package từ một Package khác, bạn có thể sử dụng 1 trong 3 cách sau:
- import package.*
- import package.classname
- fully qualified name
1. Dùng packagename.*
Nếu bạn sử dụng package.* thì tất cả các class và giao diện của Package này có thể được truy cập nhưng nó không phải là các Package con. Từ khóa import được sử dụng để làm cho các class và giao diện của một Package khác có thể truy cập được vào Package hiện tại. Ví dụ:
//save by A.java
package pack;
public class A{
public void msg(){System.out.println("Vietnix");}
}
/save by B.java
package mypack;
import pack.A;
class B{
public static void main(String args[]){
A obj = new A();
obj.msg();
}
}
>> output: Vietnix
2. Dùng packagename.classname
Nếu bạn nhập package.classname thì chỉ các class đã khai báo của Package này mới có thể có quyền truy cập. Ví dụ:
//save by A.java
package pack;
public class A{
public void msg(){System.out.println("Vietnix");}
}
//save by B.java
package mypack;
import pack.A;
class B{
public static void main(String args[]){
A obj = new A();
obj.msg();
}
}
>> output: Vietnix
3. Dùng fully qualified name (Dùng tên đủ điều kiện)
Với cách làm này, người sử dụng cần dùng tên đủ điều kiện để truy cập Package. Tuy nhiên, chỉ các class được khai báo của Package này mới có thể truy cập được. Bạn cần sử dụng tên đầy đủ điều kiện mỗi khi truy cập vào class hoặc giao diện.
Cách làm này thường được sử dụng khi Package có cùng tên class, ví dụ: Các gói java.util và java.sql chứa lớp Ngày.
Ví dụ:
//save by A.java
package pack;
public class A{
public void msg(){System.out.println("Vietnix");}
}
//save by B.java
package mypack;
class B{
public static void main(String args[]){
pack.A obj = new pack.A();//using fully qualified name
obj.msg();
}
}
>> output: Vietnix
Lưu ý: Nếu bạn nhập một Package, tất cả các class và giao diện của Package đó sẽ được nhập vào, ngoại trừ các class và giao diện của các subpackage . Vì vậy người sử dụng cũng cần nhập thêm các subpackage.
>> Trình tự nhập: package > import > class.
Subpackage trong Java là gì?
Package bên trong Package khác gọi là subpackage. Các subpackage được tạo ra để phân loại các Package rõ hơn.
Ví dụ về subpackage:
package com.javatpoint.core;
class Simple{
public static void main(String args[]){
System.out.println("Subpackage Vietnix");
}
}
Để biên dịch: javac -d. Simple.java
Để chạy: java com.javatpoint.core.Simple
>> output: Subpackage Vietnix
Làm thế nào để gửi class file đến một thư mục hoặc ổ đĩa khác?
Trường hợp ví dụ bạn muốn đặt class file của file nguồn A.java trong thư mục class của ổ đĩa c:
//save as Simple.java
package mypack;
public class Simple{
public static void main(String args[]){
System.out.println("Welcome to Vietnix");
}
}
- Để biên dịch: e:\sources> javac -d c:\classes Simple.java.
- Để chạy chương trình này từ thư mục e:\source directory, bạn cần đặt classpath của thư mục chứa class file.
- e:\sources> set classpath=c:\classes;
- e:\sources> java mypack.Simple
Làm thế nào để đặt hai public classes trong một Package?
Nếu bạn muốn đặt hai public classes trong một Package, bạn cần có hai source files (tệp nguồn) java chứa một public classes , nhưng giữ nguyên tên Package.
Ví dụ:
//save as A.java
package javatpoint;
public class A{}
//save as B.java
package javatpoint;
public class B{}
Kết luận
Trên đây, Vietnix đã cùng bạn tìm hiểu Package là gì, phân loại Package và cách truy cập Package từ một Package khác. Mong rằng qua bài viết này, bạn sẽ có thêm các thông tin hữu ích về Package, giúp quá trình làm việc của bạn trở nên hiệu quả hơn!