1. Gói

Các chương trình Java thông thường liên quan đến một số lượng lớn các lớp. Bao nhiêu? Hàng nghìn, hàng chục nghìn. Và nếu bạn cũng tính đến thực tế là chương trình sử dụng nhiều thư viện khác nhau chứa các lớp được viết bởi các lập trình viên khác, thì số lượng lớp có thể dễ dàng được tính bằng hàng triệu!

Sẽ gần như không thể nghĩ ra những cái tên duy nhất cho tất cả hàng triệu, hoặc thậm chí chỉ hàng nghìn lớp này.

Tất nhiên, chúng ta có thể tưởng tượng những cái tên như A123B345, nhưng nếu chúng ta đang nói về việc chọn một tên lớp hay, một tên giúp lớp dễ hiểu hơn (ví Stringdụ như cho chuỗi), thì thậm chí việc tạo ra một nghìn tên duy nhất cũng là rất nhiều của công việc.

Đó là lý do tại sao trong Java, người ta thường nhóm các lớp thành các gói bằng cách sử dụng từ khóa gói.

Các lớp Java và các gói của chúng rất giống với các tệp và thư mục trên máy tính.

Ví dụ: nếu bạn cần lưu trữ 10 tài liệu trên máy tính của mình, bạn có thể chỉ giữ chúng trong một thư mục. Nhưng nếu bạn có hàng nghìn tài liệu (ví dụ: kho lưu trữ tất cả tài liệu của một công ty) thì sao?

Với hàng ngàn tài liệu được lưu trữ, một giải pháp là tạo nhiều cấp độ thư mục với tên mô tả tốt. Và sau đó trong một thư mục ở cấp cuối cùng, lưu trữ các tài liệu liên quan đến thư mục cụ thể đó. Tên mô tả tốt cho các tài liệu cũng không gây hại.

Trên thực tế, chúng tôi làm tất cả những điều này cho các lớp trong Java.

Các tệp chứa các lớp được lưu trữ trong các thư mục (thư mục) khác nhau và tên đầy đủ của thư mục của lớp cùng với tất cả các thư mục con của nó là tên của gói. Ví dụ:

Đường dẫn đến tệp Tên gói hàng Tên lớp
\com\codegym\tasks\Solution.java
com.codegym.tasks
Solution
\com\io\FileInputStream.java
com.io
FileInputStream
\java\util\ArrayList.java
java.util
ArrayList

Không giống như tên thư mục, tên gói sử dụng dấu chấm làm dấu phân cách. Nói cách khác, thư mục \com\codegym\tasks\tương ứng với com.codegym.tasksgói.


2. srcthư mục

Trong Java, thông thường lưu trữ tất cả các lớp của một chương trình trong một thư mục (và các thư mục con). Thư mục này thường được gọi là src(viết tắt của source ).

Thư mục này được gọi là thư mục gốc của dự án (hoặc gốc nguồn ) và tất cả các đường dẫn gói đều liên quan đến nó. Ví dụ:

Thư mục Tên gói hàng
c:\projects\data\my\src\com\codegym\tasks\
com.codegym.tasks
d:\files\git\data\project\src\com\codegym\tasks\
com.codegym.tasks

Trong tình huống này, các lập trình viên nói điều gì đó như "chúng tôi có một dự án có tên my, nằm trong c:\projects\datathư mục" hoặc "chúng tôi có một dự án có tên project, nằm trong d:\files\git\datathư mục"

Tốt nhất là luôn đặt các lớp trong các gói chứ không phải trực tiếp trong thư mục gốc ( src. Nếu bạn chỉ có một vài lớp thì điều này không có vấn đề gì. Nhưng khi có nhiều lớp thì rất dễ bị nhầm lẫn. Vì vậy , luôn chỉ tạo các lớp của bạn trong các gói.

Trong Java, thông lệ đặt tên có ý nghĩa cho các lớp và gói. Nhiều công ty phát hành thư viện của riêng họ (một tập hợp các lớp) và để tránh nhầm lẫn, họ kết hợp tên của công ty/trang web/dự án vào tên của gói:

Tên gói hàng Tên công ty/dự án
org.apache.common
org.apache.tomcat
org.apache.util
dự án apache
com.oracle.jdbc
công ty Oracle
java.io
javax.servlet
Công ty Oracle, dự án Java
com.ibm.websphere
Công ty IBM, dự án WebSphere
com.jboss
dự án JBoss

3. Nội dung tệp

Theo tiêu chuẩn ngôn ngữ Java, thông tin về tên lớp và tên gói của nó phải được đưa vào tệp có mã. Hình thức chung được hiển thị dưới đây:

package package-name;

public class ClassName
{

}

Tên gói phải khớp với tên thư mục và tên tệp phải khớp với tên lớp chung.

Nếu bạn có một tệp, thì nó phải chứa cái này:...\src\com\project\Service.java

package com.project;

public class Service
{

}

4. Nhập lớp học

Tên lớptên gói tạo thành cái được gọi là tên đầy đủ của lớp .

Ví dụ:

Tên đủ điều kiện Tên gói hàng Tên lớp
java.io.FileInputStream
java.io
FileInputStream
java.lang.String
java.lang
String
java.util.ArrayList
java.util
ArrayList
org.apache.tomcat.Servlet
org.apache.tomcat
Servlet
Cat
không có
Cat

Tin tốt:

Tên lớp đủ điều kiện luôn là duy nhất trong một dự án. Rốt cuộc, bạn không thể tạo hai tệp có cùng tên trong một thư mục.

Các tin xấu:

Tên lớp đầy đủ thường dài hoặc rất dài. Và viết ra một cái tên dài (ví dụ java.util.ArrayList) mỗi khi viết mã là điều cực kỳ bất tiện.

Đó là lý do tại sao Java thêm khả năng nhập các lớp .

Bạn có thể sử dụng tên viết tắt của lớp trong mã của mình, nhưng trước tiên bạn phải cho trình biên dịch biết tên lớp đủ điều kiện nào tương ứng với tên viết tắt đó . Điều gì sẽ xảy ra nếu bây giờ bạn có nhiều lớp có cùng tên trong dự án của mình? Hoặc ban đầu bạn có một cái, nhưng sau đó thêm 15 cái nữa...

Để sử dụng tên lớp ngắn trong mã của bạn, bạn cần thêm cấu trúc sau:

import fully-qualified-class-name;

Phần khai báo này phải được thêm vào đầu lớp, ngay sau phần packagekhai báo.

Ví dụ:

package com.codegym.tasks.task01;

import java.util.Scanner;
import com.test.helper.special.ArrayList;

public class Solution
{
   public static void main(String[] args)
   {
     Scanner console = new Scanner(System.in);
     ArrayList list = new ArrayList();
   }
}

Chúng tôi đã nhập hai lớp ( java.util.Scannercom.test.helper.special.ArrayList), vì vậy chúng tôi có thể sử dụng tên viết tắt của chúng trong mã của mình. Và trình biên dịch sẽ biết nên sử dụng những lớp nào.

Và đây là mã tương tự sẽ như thế nào nếu chúng ta không sử dụng import:

package com.codegym.tasks.task01;

public class Solution
{
   public static void main(String[] args)
   {
     java.util.Scanner console = new java.util.Scanner(System.in);
     com.test.helper.special.ArrayList list = new com.test.helper.special.ArrayList();
   }
}

Nhân tiện, nếu dự án của bạn có hai lớp có tên Scanner, bạn sẽ không thể nhập cả hai lớp vào cùng một tệp: bạn sẽ phải sử dụng tên dài cho một trong số chúng.

Giả sử bạn có Jen trong đội của mình. Không có vấn đề về giao tiếp, vì mọi người đều biết cô ấy là ai. Nhưng nếu có ba Jens, thì những cái tên đầy đủ sẽ phải được sử dụng để phân biệt chúng.

lưu ý 1

Nhân tiện, nếu bạn quá lười biếng để thêm nhiều câu lệnh nhập vào lớp của mình, bạn có thể sử dụng phiên bản lười biếng của nó: thay vì một tên lớp cụ thể, hãy đặt một dấu hoa thị:

import package-name.*;

Điều đó sẽ cho phép bạn sử dụng tên viết tắt của tất cả các lớp trong gói.

Lưu ý 2

Tất cả các lớp trong java.langgói được nhập tự động, vì vậy bạn không cần viết importcâu lệnh cho chúng. Bạn chắc chắn đã biết một trong những lớp này: java.lang.String. Vâng đúng vậy. Đây là Stringlớp mà chúng tôi đã sử dụng để làm việc với các chuỗi.