Java - Gói

Các gói được sử dụng trong Java để ngăn xung đột đặt tên, kiểm soát quyền truy cập, giúp tìm kiếm / định vị và sử dụng các lớp, giao diện, liệt kê và chú thích dễ dàng hơn, v.v.

A Package có thể được định nghĩa là một nhóm các kiểu liên quan (lớp, giao diện, liệt kê và chú thích) cung cấp khả năng bảo vệ truy cập và quản lý vùng tên.

Một số gói hiện có trong Java là:

  • java.lang - gói các lớp cơ bản

  • java.io - các lớp cho chức năng đầu vào, đầu ra được đóng gói trong gói này

Lập trình viên có thể xác định các gói của riêng họ để nhóm các lớp / giao diện, v.v. Bạn nên nhóm các lớp liên quan do bạn triển khai để lập trình viên có thể dễ dàng xác định rằng các lớp, giao diện, liệt kê và chú thích có liên quan với nhau.

Vì gói tạo một không gian tên mới nên sẽ không có bất kỳ xung đột tên nào với các tên trong các gói khác. Sử dụng các gói, việc cung cấp kiểm soát truy cập dễ dàng hơn và định vị các lớp liên quan cũng dễ dàng hơn.

Tạo một gói

Trong khi tạo một gói, bạn nên chọn tên cho gói và bao gồm package cùng với tên đó ở đầu mỗi tệp nguồn chứa các lớp, giao diện, kiểu liệt kê và chú thích mà bạn muốn đưa vào gói.

Câu lệnh gói phải là dòng đầu tiên trong tệp nguồn. Chỉ có thể có một câu lệnh gói trong mỗi tệp nguồn và nó áp dụng cho tất cả các loại trong tệp.

Nếu một câu lệnh gói không được sử dụng thì lớp, giao diện, kiểu liệt kê và chú thích sẽ được đặt trong gói mặc định hiện tại.

Để biên dịch các chương trình Java với các câu lệnh gói, bạn phải sử dụng tùy chọn -d như hình dưới đây.

javac -d Destination_folder file_name.java

Sau đó, một thư mục với tên gói đã cho được tạo ở đích được chỉ định và các tệp lớp đã biên dịch sẽ được đặt trong thư mục đó.

Thí dụ

Chúng ta hãy xem một ví dụ tạo một gói có tên animals. Một thực tiễn tốt là sử dụng tên của các gói với các chữ cái thường để tránh bất kỳ xung đột nào với tên của các lớp và giao diện.

Ví dụ gói sau chứa giao diện có tên động vật :

/* File name : Animal.java */
package animals;

interface Animal {
   public void eat();
   public void travel();
}

Bây giờ, chúng ta hãy triển khai giao diện trên trong cùng một gói động vật -

package animals;
/* File name : MammalInt.java */

public class MammalInt implements Animal {

   public void eat() {
      System.out.println("Mammal eats");
   }

   public void travel() {
      System.out.println("Mammal travels");
   } 

   public int noOfLegs() {
      return 0;
   }

   public static void main(String args[]) {
      MammalInt m = new MammalInt();
      m.eat();
      m.travel();
   }
}

Bây giờ biên dịch các tệp java như được hiển thị bên dưới:

$ javac -d . Animal.java 
$ javac -d . MammalInt.java

Bây giờ một gói / thư mục có tên animals sẽ được tạo trong thư mục hiện tại và các tệp lớp này sẽ được đặt trong đó như hình dưới đây.

Bạn có thể thực thi tệp lớp trong gói và nhận được kết quả như hình dưới đây.

Mammal eats
Mammal travels

Từ khoá nhập

Nếu một lớp muốn sử dụng một lớp khác trong cùng một gói thì không cần sử dụng tên gói. Các lớp trong cùng một gói tìm thấy nhau mà không cần bất kỳ cú pháp đặc biệt nào.

Thí dụ

Ở đây, một lớp có tên Boss được thêm vào gói tính lương đã chứa Nhân viên. Sau đó, Sếp có thể tham chiếu đến lớp Nhân viên mà không cần sử dụng tiền tố bảng lương, như được chứng minh bởi lớp Sếp sau đây.

package payroll;
public class Boss {
   public void payEmployee(Employee e) {
      e.mailCheck();
   }
}

Điều gì xảy ra nếu lớp Nhân viên không có trong gói trả lương? Sau đó, lớp Boss phải sử dụng một trong các kỹ thuật sau để tham chiếu đến một lớp trong một gói khác.

  • Tên đủ điều kiện của lớp có thể được sử dụng. Ví dụ -
payroll.Employee
  • Gói có thể được nhập bằng từ khóa nhập và ký tự đại diện (*). Ví dụ -

import payroll.*;
  • Bản thân lớp có thể được nhập bằng từ khóa import. Ví dụ -
import payroll.Employee;

Note- Một tệp lớp có thể chứa bất kỳ số lượng câu lệnh nhập nào. Các câu lệnh nhập phải xuất hiện sau câu lệnh gói và trước phần khai báo lớp.

Cấu trúc thư mục của các gói

Hai kết quả chính xảy ra khi một lớp được đặt trong một gói:

  • Tên của gói sẽ trở thành một phần của tên của lớp, như chúng ta vừa thảo luận trong phần trước.

  • Tên của gói phải phù hợp với cấu trúc thư mục nơi cư trú của mã bytecode tương ứng.

Đây là cách đơn giản để quản lý các tệp của bạn trong Java -

Đặt mã nguồn cho một loại lớp, giao diện, liệt kê hoặc chú thích trong tệp văn bản có tên là tên đơn giản của loại và có phần mở rộng là .java.

Ví dụ -

// File Name :  Car.java
package vehicle;

public class Car {
   // Class implementation.   
}

Bây giờ, hãy đặt tệp nguồn vào một thư mục có tên phản ánh tên của gói mà lớp thuộc về -

....\vehicle\Car.java

Bây giờ, tên lớp đủ điều kiện và tên đường dẫn sẽ như sau:

  • Tên lớp → xe.Car
  • Tên đường dẫn → xe \ Car.java (trong cửa sổ)

Nói chung, một công ty sử dụng tên miền Internet đảo ngược cho các tên gói của mình.

Example- Tên miền Internet của một công ty là apple.com, sau đó tất cả các tên gói của nó sẽ bắt đầu bằng com.apple. Mỗi thành phần của tên gói tương ứng với một thư mục con.

Example - Công ty có một gói com.apple.computers chứa tệp nguồn Dell.java, nó sẽ được chứa trong một loạt các thư mục con như thế này -

....\com\apple\computers\Dell.java

Tại thời điểm biên dịch, trình biên dịch tạo một tệp đầu ra khác nhau cho mỗi lớp, giao diện và kiểu liệt kê được xác định trong đó. Tên cơ sở của tệp đầu ra là tên của loại và phần mở rộng của nó là.class.

Ví dụ -

// File Name: Dell.java
package com.apple.computers;

public class Dell {
}

class Ups {
}

Bây giờ, hãy biên dịch tệp này như sau bằng cách sử dụng tùy chọn -d -

$javac -d . Dell.java

Các tập tin sẽ được biên dịch như sau:

.\com\apple\computers\Dell.class
.\com\apple\computers\Ups.class

Bạn có thể nhập tất cả các lớp hoặc giao diện được xác định trong \ com \ apple \ computer \ như sau:

import com.apple.computers.*;

Giống như các tệp nguồn .java, các tệp .class đã biên dịch phải nằm trong một loạt các thư mục phản ánh tên gói. Tuy nhiên, đường dẫn đến tệp .class không nhất thiết phải giống với đường dẫn đến tệp nguồn .java. Bạn có thể sắp xếp các thư mục nguồn và thư mục lớp của mình một cách riêng biệt, như:

<path-one>\sources\com\apple\computers\Dell.java

<path-two>\classes\com\apple\computers\Dell.class

Bằng cách này, có thể cấp quyền truy cập vào thư mục lớp cho các lập trình viên khác mà không tiết lộ nguồn của bạn. Bạn cũng cần quản lý tệp nguồn và tệp lớp theo cách này để trình biên dịch và Máy ảo Java (JVM) có thể tìm thấy tất cả các kiểu chương trình của bạn sử dụng.

Đường dẫn đầy đủ đến thư mục lớp, <path-two> \ các lớp, được gọi là đường dẫn lớp và được đặt bằng biến hệ thống CLASSPATH. Cả trình biên dịch và JVM đều xây dựng đường dẫn đến tệp .class của bạn bằng cách thêm tên gói vào đường dẫn lớp.

Giả sử các lớp <path-two> \ là đường dẫn lớp và tên gói là com.apple.computers, sau đó trình biên dịch và JVM sẽ tìm kiếm các tệp .class trong các máy tính <path-two> \ class \ com \ apple \.

Một đường dẫn lớp có thể bao gồm một số đường dẫn. Nhiều đường dẫn phải được phân tách bằng dấu chấm phẩy (Windows) hoặc dấu hai chấm (Unix). Theo mặc định, trình biên dịch và JVM tìm kiếm thư mục hiện tại và tệp JAR chứa các lớp nền tảng Java để các thư mục này tự động nằm trong đường dẫn lớp.

Đặt biến hệ thống CLASSPATH

Để hiển thị biến CLASSPATH hiện tại, hãy sử dụng các lệnh sau trong Windows và UNIX (Bourne shell):

  • Trong Windows → C: \> đặt CLASSPATH
  • Trong UNIX →% echo $ CLASSPATH

Để xóa nội dung hiện tại của biến CLASSPATH, hãy sử dụng -

  • Trong Windows → C: \> đặt CLASSPATH =
  • Trong UNIX →% không đặt CLASSPATH; xuất CLASSPATH

Để đặt biến CLASSPATH -

  • Trong Windows → đặt CLASSPATH = C: \ users \ jack \ java \ class
  • Trong UNIX →% CLASSPATH = / home / jack / java / class; xuất CLASSPATH