Java Bài 19: Package – Yellow Code Books

Thực Hành Tạo Mới Project Với Package

Bài thực hành hôm nay vẫn xoay quanh việc tính chu vi và diện tích các hình học, nhưng có nhiều điểm khác biệt. Thứ nhất, chúng ta cùng tạo mới project, với cái tên là PackageLearning để dễ làm việc. Thứ hai, chúng ta sẽ có nhiều lớp hơn để thử nghiệm việc tổ chức chúng theo package.

Đóng Project OOPLearning Lại

Nếu bạn còn đang mở Eclipse với project OOPLearning thì bạn nên đóng nó lại trước khi tạo mới PackageLearning. Đóng lại chứ không phải xóa đi nhé. Việc đóng một project lại giúp bạn có thể mở nó ra lại một cách nhanh chóng, vì nó vẫn nằm ở cửa sổ Package Explorer, có điều trạng thái của nó hơi khác thôi, ngoài ra khi đóng project lại, bạn sẽ dễ tập trung vào các project đang mở khác, trong trường hợp bạn có quá nhiều project cần quản lý.

Để đóng một project, bạn có thể click chuột phải vào project đó ở cửa sổ Package Explorer rồi chọn Close Project (như hình) hoặc chọn trên menu Project > Close Project. Thế là xong. Sau này bạn muốn mở project này lại thì lại click phải chuột vào nó, rồi chọn Open Project, hoặc tương tự với menu Project > Open Project.

Tùy chọn đóng một Project với EclipseTùy chọn đóng một Project với EclipseTùy chọn đóng một Project với Eclipse

Tạo Mới Project PackageLearning

Việc tạo mới project này không khác gì với các bài thực hành trước cả, các bạn cùng tạo một project với tên PackageLearning luôn nhé.

Hình sau là project PackageLearning mình mới tạo, bên cạnh project OOPLearning đã được đóng.

Project OOPLearning đã đóng, project PackageLearning vừa mới tạoProject OOPLearning đã đóng, project PackageLearning vừa mới tạoProject OOPLearning đã đóng, project PackageLearning vừa mới tạo

Tạo MainClass.java Nằm Trong Package main

Lần này bạn vẫn tạo một lớp chính chứa đựng phương thức main(), mình vẫn muốn đặt tên lớp chính này là MainClass.java. Tuy nhiên ở bài hôm nay, thay vì chỉ thiết lập thông số ở mục Name, và check vào public static void main(String[] args), thì bạn hãy thiết lập một cái tên cho mục Package (như hình dưới đây). Tên cho package bạn cũng đặt theo quy tắc đặt tên biến vậy, lần này mình đặt tên cho package chứa lớp MainClass này là main.

Tạo lớp MainClass đồng thời khai báo package có tên mainTạo lớp MainClass đồng thời khai báo package có tên mainTạo lớp MainClass đồng thời khai báo package có tên main

Sau khi nhấn Finish ở cửa sổ trên, bạn sẽ thấy một sự khác biệt, nơi mà với project OOPLearning hiển thị là “default package” thì nay lại là main.

Bạn đã thấy package main vừa được tạoBạn đã thấy package main vừa được tạoBạn đã thấy package main vừa được tạo

Một khác biệt nữa, là với các lớp nằm trong một package, chúng sẽ có thêm một dòng khai báo package ở trên cùng của file. Như bạn nhìn thấy code của MainClass.java sau. Dòng khai báo package này phải khớp với tên package hiển thị ở cửa sổ Package Explorernhé. Sở dĩ mình nhắc điều này vì nếu vì một lý do nào đó, bạn sửa lại cấu trúc của các lớp ở Package Explorer, hay sửa tên của package ở cửa sổ này, mà quên sửa dòng khai báo package tương ứng ở file .java, thì hệ thống sẽ báo lỗi.

package main;
 
public class MainClass {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
 
    }
 
}

Tạo Một Package Mới Với Tên shapes

Chúng ta tạm thời để một mình lớp MainClass vào bên trong package main thôi. Sau này nếu có các lớp khác với ý nghĩa dùng cho các mục đích quản lý chung chung thì sẽ thêm vào package này. Còn bây giờ là lúc chúng ta tạo ra các lớp hình học, mỗi hình như vậy sẽ có các thuộc tính và phương thức đặc thù. Và bởi vì các lớp hình học này có cùng một cấu trúc, nên chúng ta gom chúng vào chung một package, mình đặt tên package này là shapes.

Package shapes này sẽ ngang cấp với package main. Để tạo một package ngang cấp với main, bạn nên click chuột phải vào src/ (cha của main) và chọn New > Package. Hoặc đảm bảo vệt sáng ở thư mục src/ và chọn từ menu File > New > Package. Hình dưới là trường hợp click chuột phải vào src/.

Tùy chọn tạo mới một package với EclipseTùy chọn tạo mới một package với EclipseTùy chọn tạo mới một package với Eclipse

Ở hộp thoại xuất hiện, bạn gõ shapes vào trong mục Name như hình dưới đây. Lưu ý là nếu bạn muốn tạo package là con của một package khác, thì ở mục Name này bạn cứ gõ theo kiểu package_cha.package_con, trong đó package_cha đã tồn tại, là được.

Khai báo thông tin package mớiKhai báo thông tin package mớiKhai báo thông tin package mới

Sau khi nhấn Finish, bạn sẽ thấy package shapes xuất hiện trong cửa sổ quản lý Package Explorer. Tạm thời package shapes chưa có bất kỳ lớp nào bên trong đó, nên Eclipse mới dùng icon hơi khác với package main chút xíu.

Package shapes vừa mới tạoPackage shapes vừa mới tạoPackage shapes vừa mới tạo

Tạo Các Lớp Hình Học Bên Trong Package shapes

Chúng ta sẽ tạo môt lớp HinhTron, một lớp HinhChuNhat bên trong package shapes này. Bạn tự tạo nhé. Source code của hai hình mình để ở dưới, còn đây là hình ảnh khi mà bạn tạo đúng cấu trúc của bài thực hành hôm nay.

Các lớp được tạo hoàn chỉnh vào các packageCác lớp được tạo hoàn chỉnh vào các packageCác lớp được tạo hoàn chỉnh vào các package

Nội dung của lớp HinhTron như sau. Bạn chú ý là mình có thêm các từ khóa public vào trước các phương thức trong các lớp, tạm thời bạn đừng quan tâm vội, đó là khả_năng_truy_cập của phương thức, mà mình sẽ nói cụ thể ở bài học sau.

package shapes;
 
import java.util.Scanner;
 
public class HinhTron {
 
    final float PI = 3.14f;
 
    float r;    // Bán kính
    float cv;   // Chu vi
    float dt;   // Diện tích
 
    public void nhapBanKinh() {
        System.out.println("Hãy nhập vào Bán kính Hình tròn: ");
        Scanner scanner = new Scanner(System.in);
        r = scanner.nextFloat();
    }
 
    public void tinhChuVi() {
        cv = 2 * PI * r;
    }
 
    public void tinhDienTich() {
        dt = PI * r * r;
    }
 
    public void inChuVi() {
        System.out.println("Chu vi Hình tròn: " + cv);
    }
 
    public void inDienTich() {
        System.out.println("Diện tích Hình tròn: " + dt);
    }
}

Nội dung của lớp HinhChuNhat như sau. Tương tự, các phương thức ở lớp này cũng được gán khả năng truy cập là public.

package shapes;
 
import java.util.Scanner;
 
public class HinhChuNhat {
 
    float dai;  // Chiều dài
    float rong; // Chiều rộng
    float cv;   // Chu vi
    float dt;   // Diện tích
 
    public void nhapChieuDai() {
        System.out.println("Hãy nhập vào Chiều dài Hình chữ nhật: ");
        Scanner scanner = new Scanner(System.in);
        dai = scanner.nextFloat();
    }
 
    public void nhapChieuRong() {
        System.out.println("Hãy nhập vào Chiều rộng Hình chữ nhật: ");
        Scanner scanner = new Scanner(System.in);
        rong = scanner.nextFloat();
    }
 
    public void tinhChuVi() {
        cv = 2 * (dai + rong);
    }
 
    public void tinhDienTich() {
        dt = dai * rong;
    }
 
    public void inChuVi() {
        System.out.println("Chu vi Hình chữ nhật: " + cv);
    }
 
    public void inDienTich() {
        System.out.println("Diện tích Hình chữ nhật: " + dt);
    }
}

Sử Dụng Các Lớp HinhTron Và HinhChuNhat Từ MainClass

Vấn đề đến đây là khá dễ dàng với chúng ta. Bạn hãy thử quay lại phương thức main() của MainClass để yêu cầu người dùng nhập lần lượt các giá trị của hình tròn và hình chữ nhật thông qua khai báo các đối tượng từ hai lớp HinhTron và HinhChuNhat mà chúng ta vừa định nghĩa ra, rồi gọi đến các phương thức tính chu vi và diện tích, sau cùng thì gọi các phương thức in kết quả của chúng.

Có một điều khác biệt mà các bạn cần chú ý ở lớp MainClass này, đó là bởi vì MainClass ở khác package so với HinhTron và HinhChuNhat, nên khi gọi đến các lớp này, MainClass buộc phải import chúng ở đầu file, nếu không bạn sẽ thấy hệ thống báo lỗi. Kinh nghiệm để mà hệ thống tự động import các lớp từ các package khác thì mình đã nói ở Bài 7 khi mà chúng ta cần sử dụng lớp Scanner từ package java.util rồi nhé.

package main;
 
import shapes.HinhChuNhat;
import shapes.HinhTron;
 
public class MainClass {
 
    public static void main(String[] args) {
        // Khai báo các đối tượng bằng từ khóa new
        HinhTron hinhTron = new HinhTron();
        HinhChuNhat hinhChuNhat = new HinhChuNhat();
 
        // Nhập dữ liệu vào cho hinhTron, tính chu vi, diện tích, và in ra
        hinhTron.nhapBanKinh();
        hinhTron.tinhChuVi();
        hinhTron.tinhDienTich();
        hinhTron.inChuVi();
        hinhTron.inDienTich();
 
        // Ngăn cách các hình cho người dùng đỡ nhầm lẫn
        System.out.println("\n\n");
 
        // Nhập dữ liệu vào cho hinhChuNhat, tính chu vi, diện tích, và in ra
        hinhChuNhat.nhapChieuDai();
        hinhChuNhat.nhapChieuRong();
        hinhChuNhat.tinhChuVi();
        hinhChuNhat.tinhDienTich();
        hinhChuNhat.inChuVi();
        hinhChuNhat.inDienTich();
    }
 
}