• Chào bạn, hãy đăng ký hoặc đăng nhập để tham gia cùng bọn mình và sử dụng được đầy đủ chức năng của diễn đàn :).
anhcraft

Java Java cơ bản #3: Gói (Package)

anhcraft

Thành viên BQT
DEVELOPER
THÀNH VIÊN
Tham gia
18/09/2016
Bài viết
3,165
Wait... Trước khi tiếp tục, mình sẽ chỉ rõ một vài khái niệm về thư mục trong Java đã:
- Working directory (directory = folder). Cụm từ này có nghĩa là thư mục làm việc, là nơi mà chương trình Java đang chạy/làm việc
Ví dụ với cái máy chủ Minecraft. Working directory của máy chủ chính là thư mục chứa tệp spigot.jar/bukkit.jar/paper.jar :D

- Source directory: là thư mục chứa các tệp Java trong chương trình của bạn.
dyxVBGW.png

Ví dụ trong Intellij (ảnh trên), thư mục màu xanh là Source directory.
Ngoài ra còn có thư mục khác là Resource directory (thư mục chứa tài nguyên), mình sẽ giới thiệu sau.


Mỗi dự án Java sẽ có rất nhiều thư mục. Vì sao ư? Để dễ quản lý code.
Nếu bạn nhét hết tệp tin Java vào cùng một thư mục sẽ vô cùng rắc rối, khó tìm kiếm :|

Mỗi thư mục trong Source directory là Package.
Ví dụ ảnh sau:
Bv2MctV.png

Trong Java, người ta quy ước cấu trúc dự án như sau:
src
> main: các thành phần chính trong chương trình
> > java: chứa code java
> > resource: chứa tệp tin khác (ví dụ: plugin.yml, config.yml, vi-vn.yml,vvv)
> test: các thành phần dành cho việc test (thử nghiệm, kiểm tra, vvv)
> > java: chứa code java
> > resource: chứa tệp tin khác (ví dụ: plugin.yml, config.yml, vi-vn.yml,vvv)
Chỉ cần bạn nhìn folder nào có tên java sẽ biết là Source directory

Đường dẫn của Package:
Đường dẫn của một package được tính từ Package ngoài cùng cho đến Package hiện tại. Ngăn cách từng tên Package là một dấu chấm.

Ví dụ:
aYQcEZI.png


Khi mình chạy chương trình trong IDE thì LearnJava1 sẽ là working directory.
Mình đặt mọi tệp, Package vào trong thư mục tên là src, vì thế src source directory.
Các thư mục a, package1 sẽ là Package ngoài cùng (vì nó nằm ngay trong src)
Như vậy,
Đường dẫn tới package1 trong Java sẽ là package1
Đường dẫn tới package3 trong Java sẽ là package1.package2.package3
Đường dẫn tới b trong Java là a.b
Đường dẫn tới c trong Java là a.b.c

Sử dụng Package trong Java

Package phải được chỉ ra tại dòng đầu tiên trong mỗi tệp tin Java
Cú pháp:
Java:
package <đường dẫn của Package hiện tại>;

Ví dụ mình tạo một Class tên là D:
oktJLQO.png


OK ez nhé :D

Có một quy tắc trong Java là khởi tạo Package cho chương trình trước.
Đó chính là email/tên trang web của bạn viết ngược lại.
Ví dụ email là [email protected] thì sẽ tạo trước một Package là ooo.khonglo.concu.
Mọi tệp Java, Package sau này sẽ nằm trong Package đó.


Ví dụ:
7oI7Npq.png

Vậy vì sao phải sắp xếp như vậy? Để dễ quản lý code!

Hết bài 3.
 
Hỏi về Plugin  Mythicmobs
Wait... Trước khi tiếp tục, mình sẽ chỉ rõ một vài khái niệm về thư mục trong Java đã:
- Working directory (directory đồng nghĩa với folder/thư mục nhé). Cụm từ này có nghĩa là thư mục làm việc, là nơi mà chương trình Java đang chạy/làm việc
Ví dụ quen thuộc nhất là cái máy chủ Minecraft. Working directory của máy chủ chính là thư mục chứa tệp spigot.jar/bukkit.jar/paper.jar :D
Nếu bạn chạy mấy tệp .jar đó từ nơi khác thì cái Working directory vẫn không đổi nhé.
- Source directory: là thư mục chứa các tệp Java. Mọi tệp Java phải đặt trong đây.
Hai thư mục ở trên có thể thay đổi được nhé (tùy IDE của các bạn)
Ngoài ra còn có thư mục khác là Resource directory (thư mục chứa tài nguyên), mình sẽ giới thiệu sau.

Mỗi dự án Java sẽ có rất nhiều thư mục. Vì sao ư? Để dễ quản lý code. Nếu bạn nhét hết tệp tin Java vào cùng một thư mục sẽ vô cùng rắc rối, khó tìm kiếm :| Ngoài ra người ta còn làm vậy để tránh xung đột tên tệp Java.
Mỗi thư mục con trong Source directory là Package.
Chú ý: Source directory không phải là Package nhé
Trích từ một trang dạy Java (tutorials.jenkov.com)

Một Package có thể chứa nhiều Package con và tệp tin Java. Và vì thư mục có khả năng lồng vào nhau nên Package cũng có thể lồng vào nhau.

Đường dẫn của Package:
Đường dẫn của một package được tính từ Package ngoài cùng cho đến Package hiện tại. Ngăn cách từng tên Package là một dấu chấm.

Ví dụ:
aYQcEZI.png


OK trong ảnh trên working directory của mình là LearnJava1. Vì thế khi mình chạy chương trình trong IDE thì chương trình sẽ coi đó là working directory.
Mình đặt mọi tệp, Package vào trong thư mục tên là src, vì thế src là source directory. Các thư mục a, package1 sẽ là Package ngoài cùng.
Như vậy:
Đường dẫn tới package1 sẽ là package1 (yep, y chang tên của nó luôn)
Đường dẫn tới package3 sẽ là package1.package2.package3
Đường dẫn tới b là a.b

Sử dụng Package trong Java

Package phải được chỉ ra tại dòng đầu tiên trong mỗi tệp tin Java (ngoại trừ các tệp bên trong source directory)
Vậy các tệp trong source directory có phải là tệp Java không? Nó vẫn là tệp Java bình thường nhé, chẳng qua là nó không nằm trong Package thôi :D Nhưng sẽ có một số vấn đề với các tệp như vậy (ở dưới mình có đề cập)
Và vì sao mình nói là tệp tin Java mà không phải Class (như ở bài trước)? Vì ngoài Class ra còn nhiều đơn vị khác nữa như Interface và Enum mà bạn vẫn cần phải khai báo Package.


Cú pháp:
Java:
package <đường dẫn của Package hiện tại>;

Ví dụ mình tạo một Class tên là D:
oktJLQO.png


Chú ý: trong Windows, tên thư mục không có dấu chấm nhé nên cái a.b.c mà mình khoanh đỏ ở góc bên trái thực chất là ba thư mục a, b, c lồng vào nhau (như cái ảnh đầu tiên ở trên), cái này do IDE cuả mình hiển thị vậy thôi :P
Nếu các bạn để ý, class SachGiaoKhoa mình đã tạo ở bài trước không hề khai báo package vì nó nằm trong Soruce directory (thư mục tên src có màu xanh)

Liên hệ giữa đường dẫn Package và tên tệp Java
Các tệp Java có thể truy cập lẫn nhau (thông thường là vậy nhé, nhưng còn tùy code nữa). Để truy cập một tệp nào đó, chỉ cần ghi tên tệp đó là xong.
Liên hệ với class SachGiaoKhoa ở bài trước..........

Java:
public class SachGiaoKhoa {
    public class SachToan {
        public class SachToanLop1 {
          
        }

        public class SachToanLop2 {

        }

        public class SachToanLop3 {

        }
    }

    public class SachVan {
        public class SachToanLop1 {

        }
        public class SachToanLop2 {

        }
    }
}

Có một vấn đề sẽ xảy ra. Giả sử bạn tạo tệp SachToanLop2 trong Package a.b.c và bạn muốn truy cập nó từ cái class SachToanLop1. Giờ nếu chỉ viết mỗi SachToanLop2 thôi thì Java sẽ chọn cái class SachToanLop2 ở dưới rồi :| Vậy cần giải quyết thế nào? Đó chính là viết đường dẫn đầy đủ của tệp Java đó.
Đường dẫn đầy đủ của tệp Java là: <package>.<đường dẫn tệp>

PackageTên tệpĐường dẫn đầy đủ của tệp
a.b.cSachToanLop2a.b.c.SachToanLop2

Ảnh:
4NTF7U2.png


(*) Như đã nói ở bài trước, tên của tệp chính là tên Class ngoài cùng trong tệp đó. Vì ngoài Class ra còn nhiều đơn vị khác như Interface, Enum cũng có chung quy tắc là tên của nó trùng với tên tệp, nên mình gọi chung là đường dẫn của tệp cho các bạn dễ nhớ :D

Tên đầy đủ của class/interface/enum
Mặc dù không liên quan tới chủ đề Package nhưng mình cũng muốn mở rộng một chút cho cái mục ở trên.
Một tệp Java có thể có nhiều class/interface/enum được lồng với nhau (1 cái ngoài cùng và nhiều cái ở bên trong). Vậy nếu muốn truy cập các class/interface/enum ở bên trong thì cần làm thế nào? Đó chính là viết tên đầy đủ của nó.
Đường dẫn đầy đủ của class/interface/enum: <package>.<đường dẫn bên trong tệp Java>
OK tưởng tượng cái tệp Java đó là cái Package, đường dẫn Package như nào thì đường dẫn trong tệp cũng y vậy.
Ví dụ từ Class SachGiaoKhoa:

Đường dẫn tới class SachToan sẽ là SachGiaoKhoa.SachToan
Đường dẫn tới class SachToanLop3 sẽ là SachGiaoKhoa.SachToan.SachToanLop3

Các class/interface/enum cùng chung một package, thì khi truy cập, bạn không cần viết Package. Chẳng hạn:
6D08a6X.png


Ví dụ khác mà có class con:
Tf3WNjf.png

(Trước đó, mình đã tạo thêm class SachToanLop2Tap1 ở trong class SachToanLop2 :v)

Giờ từ package a.b.c mình truy cập một Class con trong package package1.package2 nhé:
NSz7nlZ.png


Màu xanh chính là tên của Package chứa tệp tin/class ngoài cùng tên là TuDien.
Bên trong TuDien sẽ có hai class nhỏ hơn là TuDienTiengAnh và TuDienTiengViet (các bạn thấy IDE của mình nó đang gợi ý tên hai class đó :v)
Đường dẫn tới hai class con đó là: package1.package2.TuDien.TuDienTiengAnhpackage1.package2.TuDien.TuDienTiengViet

Rất đơn giản phải không? :D

Tuy nhiên, bạn chỉ cần ghi cái đường dẫn đầy đủ khi trong một tệp Java cần truy cập hai Class/Interface/Enum cùng tên thôi :v Nếu chỉ có một cái thì sẽ dùng import để viết ngắn lại (bài sau sẽ biết :|)

Chú ý: Các bạn không thể truy cập tệp Java nằm ngoài Package, như vậy mình không thể truy cập tệp SachGiaoKhoa từ các tệp khác như TuDien,v... (nhưng ngược lại vẫn được)

Vì thế có một quy tắc nữa trong Java là khởi tạo Package cho chương trình trước. Đó chính là email/tên trang web của bạn viết ngược lại.
Ví dụ email là [email protected] thì sẽ tạo trước một Package là ooo.khonglo.concu. Mọi tệp Java sau này sẽ nằm trong Package đó.

Hết bài 3.
Co ai nhu minh khong? doc hong hieu gi het ~
 
vc sax vậy :|
Có ba dòng in đậm chứ mấy
 
Wait... Trước khi tiếp tục, mình sẽ chỉ rõ một vài khái niệm về thư mục trong Java đã:
- Working directory (directory đồng nghĩa với folder/thư mục nhé). Cụm từ này có nghĩa là thư mục làm việc, là nơi mà chương trình Java đang chạy/làm việc
Ví dụ quen thuộc nhất là cái máy chủ Minecraft. Working directory của máy chủ chính là thư mục chứa tệp spigot.jar/bukkit.jar/paper.jar :D
Nếu bạn chạy mấy tệp .jar đó từ nơi khác thì cái Working directory vẫn không đổi nhé.
- Source directory: là thư mục chứa các tệp Java. Mọi tệp Java phải đặt trong đây.
Hai thư mục ở trên có thể thay đổi được nhé (tùy IDE của các bạn)
Ngoài ra còn có thư mục khác là Resource directory (thư mục chứa tài nguyên), mình sẽ giới thiệu sau.

Mỗi dự án Java sẽ có rất nhiều thư mục. Vì sao ư? Để dễ quản lý code. Nếu bạn nhét hết tệp tin Java vào cùng một thư mục sẽ vô cùng rắc rối, khó tìm kiếm :| Ngoài ra người ta còn làm vậy để tránh xung đột tên tệp Java.

Mỗi thư mục con trong Source directory là Package.
Chú ý: Source directory không phải là Package nhé
Trích từ một trang dạy Java (tutorials.jenkov.com)

Một Package có thể chứa nhiều Package con và tệp tin Java. Và vì thư mục có khả năng lồng vào nhau nên Package cũng có thể lồng vào nhau.

Đường dẫn của Package:
Đường dẫn của một package được tính từ Package ngoài cùng cho đến Package hiện tại. Ngăn cách từng tên Package là một dấu chấm.

Ví dụ:
aYQcEZI.png


OK trong ảnh trên working directory của mình là LearnJava1. Vì thế khi mình chạy chương trình trong IDE thì chương trình sẽ coi đó là working directory.
Mình đặt mọi tệp, Package vào trong thư mục tên là src, vì thế src là source directory. Các thư mục a, package1 sẽ là Package ngoài cùng.
Ví dụ:
Đường dẫn tới package1 sẽ là package1 (yep, y chang tên của nó luôn)
Đường dẫn tới package3 sẽ là package1.package2.package3
Đường dẫn tới b là a.b

Sử dụng Package trong Java

Package phải được chỉ ra tại dòng đầu tiên trong mỗi tệp tin Java (ngoại trừ các tệp bên trong source directory)
Cú pháp:
Java:
package <đường dẫn của Package hiện tại>;

Ví dụ mình tạo một Class tên là D:
oktJLQO.png


Chú ý: trong Windows, tên thư mục không có dấu chấm nhé nên cái a.b.c mà mình khoanh đỏ ở góc bên trái thực chất là ba thư mục a, b, c lồng vào nhau (như cái ảnh đầu tiên ở trên), cái này do IDE cuả mình hiển thị vậy thôi :P
Nếu các bạn để ý, class SachGiaoKhoa mình đã tạo ở bài trước không hề khai báo package vì nó nằm trong Soruce directory (thư mục tên src có màu xanh)

[MỞ RỘNG] Tên đầy đủ của class/interface/enum
Mặc dù không liên quan tới chủ đề Package nhưng mình cũng muốn mở rộng một chút cho cái mục ở trên.
Một tệp Java có thể có nhiều class/interface/enum được lồng với nhau (1 cái ngoài cùng và nhiều cái ở bên trong). Vậy nếu muốn truy cập các class/interface/enum ở bên trong thì cần làm thế nào? Giải pháp là viết tên đầy đủ của nó.
Tên đầy đủ: <package>.<đường dẫn tới class/interface/enum bên trong tệp Java>

Ví dụ từ Class SachGiaoKhoa:
Tên đầy đủ của class SachToan sẽ là SachGiaoKhoa.SachToan
Tên đầy đủ của class SachToanLop3 sẽ là SachGiaoKhoa.SachToan.SachToanLop3

1. Khi truy cập class/interface/enum khác ngang hàng, chỉ cần ghi tên đơn giản của nó:

A7EJa45.png


Vì TuDienTiengAnh ngang hàng với TuDienTiengViet nên chỉ cần ghi TuDienTiengAnh

2. Khi truy cập class/interface/enum khác có level bé hơn

jpakOIP.png


3. Khi truy cập class/interface/enum khác có level lớn hơn
soxMblU.png


4. Khi truy cập class/interface/enum con ngang hàng
k9bwIlE.png


5. Các class/interface/enum cùng chung một package
6D08a6X.png


Ví dụ khác mà có class con:
Tf3WNjf.png

(Trước đó, mình đã tạo thêm class SachToanLop2Tap1 ở trong class SachToanLop2 :v)

6. Truy cập khác package
NSz7nlZ.png


Bên trong TuDien sẽ có hai class nhỏ hơn là TuDienTiengAnh và TuDienTiengViet. Đường dẫn tới hai class con đó là: package1.package2.TuDien.TuDienTiengAnhpackage1.package2.TuDien.TuDienTiengViet

Chú ý:

- Tuy nhiên, bạn chỉ cần ghi cái đường dẫn đầy đủ khi trong một tệp Java cần truy cập hai Class/Interface/Enum cùng tên thôi :v Nếu chỉ có một cái thì sẽ dùng import để viết ngắn lại (bài sau sẽ biết :|)
- Các bạn không thể truy cập tệp Java nằm ngoài Package, như vậy mình không thể truy cập tệp SachGiaoKhoa từ các tệp khác như TuDien,v... (nhưng ngược lại vẫn được)

Có một quy tắc nữa trong Java là khởi tạo Package cho chương trình trước.
Đó chính là email/tên trang web của bạn viết ngược lại.
Ví dụ email là [email protected] thì sẽ tạo trước một Package là ooo.khonglo.concu.
Mọi tệp Java/Package khác sau này sẽ nằm trong Package đó.


Hết bài 3.
nếu email mình là [email protected] mà viết là com.justapiedev.helloplayer dc ko
 
Similar content Most view Xem thêm
Back
Top Bottom