Xem thêm

Cách sử dụng Constructor để khởi tạo các đối tượng

Huy Erick
Trong bài viết dưới đây, chúng tôi sẽ hướng dẫn bạn cách sử dụng Constructor để khởi tạo đối tượng. Trước khi tìm hiểu cách khai báo hàm và khai báo đối tượng thông qua...

Trong bài viết dưới đây, chúng tôi sẽ hướng dẫn bạn cách sử dụng Constructor để khởi tạo đối tượng. Trước khi tìm hiểu cách khai báo hàm và khai báo đối tượng thông qua Constructor, chúng tôi sẽ giới thiệu nhanh các kiến thức chung về hàm tạo Constructor để các bạn hiểu rõ hơn.

Tìm hiểu chung về Constructor trong Java

Trước khi đi vào tìm hiểu chi tiết cách sử dụng Constructor, chúng tôi sẽ giới thiệu cho bạn một số kiến thức cơ bản về hàm Constructor trong Java.

Khái niệm

Constructor trong Java (một phương thức khởi tạo trong Java) là một khối code được gọi khi một thể hiện của một đối tượng được tạo ra và bộ nhớ được cấp phát cho đối tượng.

Constructor là một loại phương thức đặc biệt được sử dụng để khởi tạo một đối tượng. Bạn cũng có thể sử dụng các bổ trợ truy cập khi khai báo hàm tạo.

Thực chất thì hàm tạo này cũng là một phương thức, nhưng điểm đặc biệt của nó là chỉ cần bạn khởi tạo một đối tượng bằng từ khóa new thì ngay lập tức hàm tạo của đối tượng đó sẽ được gọi. Có nghĩa là, nếu bạn sử dụng một phương thức thông thường, bạn phải gọi nó thông qua toán tử dấu chấm ("."). Và sau đó phương thức sẽ được thực thi và với hàm tạo, miễn là từ khóa new được biên dịch, hệ thống sẽ thực thi đối tượng phương thức khởi tạo tương ứng. Nó phụ thuộc vào phương thức khởi tạo mà bạn chỉ định.

Mục đích chính của Constructor là khởi tạo đối tượng, làm cho đối tượng mới được tạo để khởi tạo các giá trị cho các thuộc tính bên trong của nó. Hoặc bạn có thể giúp đối tượng đó gọi các phương thức tương ứng khác để khởi tạo logic bên trong của đối tượng.

Tìm hiểu chung về Constructor trong Java Tìm hiểu chung về Constructor trong Java

Quy tắc tạo hàm Constructor trong Java

Trước khi tìm hiểu cách sử dụng Constructor, bạn cần nắm các quy tắc sau:

  • Hàm Constructor trong Java phải có kiểu trả về rõ ràng
  • Nó có thể là trừu tượng, tĩnh hoặc đồng bộ
  • Tên của hàm Constructor phải giống với tên lớp của nó

Các kiểu Constructor trong Java

Trong Java, có hai loại hàm Constructor:

  • Hàm tạo mặc định hoặc hàm tạo no-arg (hàm tạo mặc định): Hàm tạo mặc định là một hàm tạo không có tham số. Đây là lý do tại sao nó còn được gọi là một hàm tạo không tham số. Cú pháp chung của hàm tạo mặc định trong Java là: ClassName(){}
  • Parameterized Constructor (Hàm khởi tạo có tham số): Bất kỳ hàm tạo nào chấp nhận các tham số được gọi là một hàm tạo tham số hóa. Mặc dù một Parameterized Constructor thường được sử dụng để cung cấp các giá trị khác nhau cho các đối tượng Java khác nhau, nhưng nó cũng có thể cung cấp cùng một giá trị cho các đối tượng Java khác nhau.

Cách sử dụng Constructor để khởi tạo các đối tượng

Khai báo Constructor

Trước khi hiểu rõ hơn về cách sử dụng các hàm tạo, chúng ta hãy xem cách khai báo chúng. Cú pháp của hàm Constructor như sau:

[khả_năng_truy_cập] tên_phương_thức () { // Các dòng code }

  • Trước hết, phương thức khởi tạo không có kiểu_trả_về như các phương thức thông thường.
  • tên_phương_thức: Không giống như các phương thức thông thường, tên của phương thức khởi tạo phải giống với tên lớp, giúp phân biệt giữa các hàm tạo và các phương thức thông thường.
  • các_tham_số_truyền_vào: Phần này cũng giống như phương pháp bình thường nên chúng ta sẽ không bàn luận thêm.

Sau đây, chúng tôi sẽ đưa ra ví dụ về thực hành khai báo các Constructor cho lớp HinhTron để các bạn hiểu rõ hơn.

public class HinhTron {

    /** 
     * Demo cách khai báo các constructor,
     * các thuộc tính và phương thức vẫn được giữ nguyên như bài 19,
     * bạn hãy chú ý các constructor được comment
     */

    final float PI = 3.14f;

    float r;
    float cv;
    float dt;

    // Một constructor, chú ý không có kiểu trả về,
    // và constructor này không có tham số truyền vào
    public HinhTron() {
        // Chúng ta khởi tạo gì đó sau
    }

    // Một constructor khác, cũng không có kiểu trả về,
    // nhưng có một tham số truyền vào
    public HinhTron(float r) {
        // Chúng ta khởi tạo gì đó sau
    }

    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);
    }
}

Qua ví dụ trên, bạn cần lưu ý một số điều sau đây để tránh nhầm lẫn khi viết code:

  • Trong một lớp, bạn chắc chắn có thể có nhiều Constructor, mỗi Constructor đó phải khác với tham số được truyền vào (nhưng không thể có tên khác, như đã nói ở trên, hàm tạo phải trùng tên với tên lớp, vì vậy hàm tạo phải trùng tên). Bạn có thể kiểm tra ví dụ trên để thấy rằng có hai hàm tạo, nhưng bạn cũng có thể tạo nhiều hàm tạo hơn.
  • Đối với một lớp có nhiều Constructor, bạn hoàn toàn có thể gọi một hàm khác từ Constructor này, lệnh gọi này sẽ không tạo ra một thể hiện mới của lớp mà mục đích chính của việc này là sử dụng lại các dòng code và chỉ khởi tạo Constructor.
  • Cho dù lớp có bao nhiêu Constructor, khi khai báo một đối tượng, bạn phải chỉ định một và chỉ một Constructor. Điều này khác với các phương thức thông thường khác ở chỗ bạn có thể gọi bao nhiêu phương thức tùy ý.
  • Constructor chỉ được thực thi một lần khi từ khóa mới được gọi. Bạn không thể thực hiện lại hàm tạo trong vòng đời của đối tượng. Nếu bạn muốn thực thi lại một Constructor, bạn phải sử dụng lại từ khóa mới, như vậy bạn đã tạo một đối tượng mới. Điều này cũng khác với các phương pháp thông thường khác với khả năng gọi lại. Đây là lý do tại sao nếu bạn cần khởi tạo các giá trị, bạn chỉ cần khởi tạo tất cả chúng trong một hàm tạo.
  • Nếu bạn quên khai báo một phương thức khởi tạo cho lớp, hệ thống sẽ luôn ngầm định tạo một Constructor không có tham số và không có nội dung trong đó, giống như Constructor đầu tiên của lớp HinhTron trong ví dụ trên.

Khai báo đối tượng thông qua Constructor

Nếu bạn chưa khai báo bất kỳ Constructor nào cho các lớp HinhTron và HinhChuNhat, hệ thống đã thực sự khai báo các Constructor của mỗi lớp cho bạn, như đoạn code dưới đây:

public HinhTron() {
}

public HinhChuNhat() {
}

Do đó, khi bạn khai báo hai đối tượng này, bạn sẽ gọi chúng thông qua phương thức khởi tạo mặc định, đó là new HinhTron(), và new HinhChuNhat(). Quay trở lại với lớp HinhTron mà bạn đã thực hành ở trên, chúng ta đã khai báo hai Constructor trong lớp. Như đã nói ở trên, bạn chỉ có thể thực thi một và chỉ một Constructor, vì vậy bạn sẽ có một trong hai phương thức để khởi tạo HinhTron, như sau:

// Cách khai báo HinhTron dựa vào constructor thứ nhất
HinhTron hinhTron1 = new HinhTron();

// Cách khai báo HinhTron dựa vào constructor thứ hai
HinhTron hinhTron2 = new HinhTron(10);

Với hai cách khởi tạo này, HinhTron1 và HinhTron2 có gì khác nhau, chúng ta cùng nhau thực hành nhé!

public class MainClass {

    public static void main(String[] args) {
        // Cách khai báo HinhTron dựa vào constructor thứ nhất
        HinhTron hinhTron1 = new HinhTron();

        // Cách khai báo HinhTron dựa vào constructor thứ hai
        HinhTron hinhTron2 = new HinhTron(10);

        // Tính toán và in ra kết quả cho HinhTron1
        System.out.println("======== Kết quả HinhTron1 ========");
        hinhTron1.tinhChuVi();
        hinhTron1.tinhDienTich();
        hinhTron1.inChuVi();
        hinhTron1.inDienTich();

        // Tính toán và in ra kết quả cho HinhTron2
        System.out.println("======== Kết quả HinhTron2 ========");
        hinhTron2.tinhChuVi();
        hinhTron2.tinhDienTich();
        hinhTron2.inChuVi();
        hinhTron2.inDienTich();
    }
}

Điều này có nghĩa là chúng ta đã tạo hai đối tượng HinhTron1 và HinhTron2 từ lớp HinhTron. Trong lớp HinhTron, chúng ta có hai Constructor: HinhTron1 được tạo bởi một Constructor không có tham số và HinhTron2 được tạo bởi hàm float.

Bây giờ, nếu bạn thực hiện chương trình này, bạn sẽ thấy bảng điều khiển yêu cầu bán kính của hình tròn một lần. Khi HinhTron1 được khai báo qua HinhTron HinhTron1 = new HinhTron(), Constructor tương ứng (hàm tạo không tham số) sẽ được thực hiện ngay lập tức.

Tương tự, với HinhTron2 được khai báo bằng HinhTron HinhTron2 = new HinhTron(10), có nghĩa đối tượng này đã lựa chọn constructor có một tham số float truyền vào để khởi tạo. Khi bạn gọi tinhChuVi() và tinhDienTich() trên đối tượng HinhTron2 này, thì giá trị 10 sẽ được sử dụng. Kết quả được in ra bảng điều khiển.

Image

Trên đây là những kiến ​​thức về cách sử dụng Constructor để khởi tạo các đối tượng. Bạn nên hiểu rằng Constructor cũng là một phương thức, tuy nó có một số khác biệt. Việc sử dụng Constructor là rất phổ biến, nó cung cấp giá trị ban đầu cho đối tượng ngay sau khi đối tượng được khởi tạo. Hy vọng bài viết có ích với bạn và chúc bạn học tốt!

Phạm Thị Thanh Ngọc

1