Java

Package in Java

Xin chào, trong bài viết này chúng ta sẽ tìm hiểu về Package trong Java.


HIỂU VỀ PACKAGE

Hãy tưởng tượng đến một cái giá đựng sách gồm nhiều ngăn ở thư viện, mỗi ngăn chứa những cuốn sách về một chủ đề cụ thể. Nếu không có các ngăn này thì sẽ rất khó để quản lý và truy xuất sách khi cần.

Trong Java, package cũng tương tự với các ngăn của cái giá sách. Nó là một cơ chế cho phép chúng ta quản lý name space, nhờ đó mà sẽ không còn hiện tượng xung đột tên giữa các class khác nhau khi được sử dụng trong cùng một chương trình. Ngoài ra package còn cho phép kiểm soát truy cập vào các class.


TẠO MỘT PACKAGE

Đầu tiên, chúng ta tạo một folder có tên myPackage (tất nhiên tên gì là do chúng ta chọn). Trong folder myPackage, chúng ta tạo một file có tên myClass_1.java.

Source code: file myClass_1.java

package myPackage;

public class myClass_1 {
    public myClass_1() {
        System.out.println("myClass_1 constructor.");
    }
}

Giải thích:
– câu lệnh package myPackage được dùng để khai báo rằng class myClass_1 thuộc về package myPackage.

Một package có thể chứa nhiều file class:

Source code: file myClass_2.java

package myPackage;

public class myClass_2 {
    public myClass_2() {
        System.out.println("myClass_2 constructor.");
    }
}

Source code: file test.java

package myPackage;

class test {
    public static void main(String[] args) {
        myClass_1 c1 = new myClass_1();
        myClass_2 c2 = new myClass_2();
    }
}

Compile & Execution:
Mở Command-Line và di chuyển đến folder myPackage, để compile cho các file java trong folder này chúng ta sử dụng lệnh:
$ javac *.java

Sau đó di chuyển đến directory phía trên folder myPackage, vì class test thuộc myPackage nên tự nó không thể thực thi (lệnh java test sẽ báo lỗi Error: Could not find or load main class test)
$ cd ..

Để chạy chương trình chúng ta cần gọi tên class kèm với tên package theo cú pháp packageName.className
$ java myPackage.test

Output:
myClass_1 constructor.
myClass_2 constructor.


KIỂM SOÁT TRUY CẬP VÀO CLASS

Java cung cấp các mức độ bảo vệ khác nhau đối với thành viên của class (biến và method). Cả class và package đều thể hiện tính “Bao đóng” (Encapsulation) của dữ liệu, trong đó có name space và scope của class’s members.

Package là nơi chứa các class, trong khi đó class chứa dữ liệu và method. Trong Java, class chính là đơn vị trừu tượng (unit of abstraction) nhỏ nhất. Java đưa ra năm trường hợp truy cập đến class’s members sau:

  1. Truy cập từ chính class đó;
  2. Truy cập từ subclass ở cùng package;
  3. Truy cập từ non-subclass ở cùng package;
  4. Truy cập từ subclass ở khác package;
  5. Truy cập từ non-subclass ở khác package.

Có ba keyword được dùng để quy định mức độ truy cập đến class’s members, gồm: public, privateprotected.

  • Bất cứ biến hay method nào được khai báo public đều có thể được truy cập từ bất cứ đâu.
  • Nếu được khai báo private thì chỉ có thể được truy cập từ chính class đó.
  • Nếu được khai báo protected thì chỉ có thể được truy cập từ các class ở package đó và từ các subclass của nó, không quan tâm là ở cùng hay khác package.
  • Nếu không được khai báo rõ ràng thì mặc định các class’s members này chỉ có thể được truy cập từ các class và subclass ở cùng package.

Các tính chất trên được tóm tắt trong Table 1.

Capture

Table 1 – Class’s member access

Cần chú ý rằng các access level trên chỉ áp dụng cho class’s members (biến và method). Đối với class chỉ có hai access level, gồm: defaultpublic. Nếu một class có default access, nó chỉ có thể được sử dụng từ bên trong package chứa nó. Nếu một class được khai báo public, nó có thể được sử dụng ở bất cứ đâu, tuy nhiên, nó phải là class duy nhất trong file được khai báo public (nếu trong file có nhiều class) và tên file phải trùng với tên của public class đó.


IMPORTING PACKAGE

Để import các class từ một package, chúng ta sử dụng import statement:

import packageName.(className|*);

Trong đó dấu * được dùng để import tất cả class có trong package.

Nếu có hai class cùng tên nằm trong hai package khác nhau được import với cú pháp *, thì khi chúng ta sử dụng một trong hai class đó sẽ sinh ra lỗi compile-time error. Để tránh điều này chúng ta buộc phải gọi class kèm với tên package chứa nó.

Cần biết rằng import stament chỉ giúp cho lập trình viên thuận tiện hơn trong việc tái sử dụng code, chúng ta có thể sử dụng fully qualified name để thay thế cho import.

// sử dụng import statement
import java.util.*;
class myDate extends Date {
}
// sử dụng fully qualified name
class myDate extends java.util.Date {
}

Khi một package được import, chỉ những class, method và biến nào được khai báo public mới có thể được truy cập.

Example: Importing package
Tạo một file bên ngoài folder myPackage với tên demo.java

import myPackage.*;

class demo {
    public static void main(String[] args) {
        myClass_1 c1 = new myClass_1();
        myClass_2 c2 = new myClass_2();
    }
}

Compile & Execution
$ javac demo.java
$ java demo

Output
myClass_1 constructor.
myClass_2 constructor.


SUMMARY

Như vậy chúng ta đã tìm hiểu về cách tạo package, cách import package và các access level có trong Java. Cảm ơn các bạn đã theo dõi bài viết.

Thân ái và quyết thắng.

Reference:
[1] Java The Complete Reference – Ninth Edition.

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s