Java - Khối Khởi Tạo Thể Hiện

Xin chào các nhà phép thuật Java tương lai! ? Hôm nay, chúng ta sẽ bắt đầu hành trình phiêu lưu vào thế giới của Khối Khởi Tạo Thể Hiện trong Java. Đừng lo lắng nếu bạn chưa từng nghe về chúng – đến cuối bài học này, bạn sẽ trở thành chuyên gia! Hãy bắt đầu với niềm đam mê như một cậu bé trong một cửa hàng bánh kẹo!

Java - Instance Initializer Block

Khối Khởi Tạo Thể Hiện là gì?

Hãy tưởng tượng bạn đang nướng bánh. Trước khi bạn đặt nó vào lò nướng, bạn phải trộn tất cả các nguyên liệu trong một chảo. Quá trình trộn đó tương tự như khối Khởi Tạo Thể Hiện trong Java – nó chuẩn bị mọi thứ trước khi sự kiện chính diễn ra!

Khối Khởi Tạo Thể Hiện là một khối mã sẽ chạy khi một đối tượng của lớp được tạo ra, ngay trước khi hàm khởi tạo được gọi. Nó giống như một buổi tiệc trước khi đối tượng của bạn bắt đầu!

Dưới đây là cách nó trông như thế nào:

public class Cake {
{
// Đây là Khối Khởi Tạo Thể Hiện
System.out.println("Trộn nguyên liệu...");
}

public Cake() {
System.out.println("Bánh đã sẵn sàng!");
}
}

Khi bạn tạo một đối tượng Cake mới, bạn sẽ thấy:

Trộn nguyên liệu...
Bánh đã sẵn sàng!

Đặc điểm của Khối Khởi Tạo Thể Hiện

Hãy phân tích các đặc điểm chính của những khối kỳ diệu này:

  1. Chúng chạy mỗi khi một đối tượng được tạo ra.
  2. Chúng chạy trước hàm khởi tạo.
  3. Chúng được bao bọc bởi dấu ngoặc móc {}.
  4. Chúng có thể truy cập các biến thể hiện và phương thức.
  5. Bạn có thể có nhiều Khối Khởi Tạo Thể Hiện trong một lớp.

Sử dụng Khối Khởi Tạo Thể Hiện

Bây giờ, bạn có thể tự hỏi, "Tại sao chúng ta cần các khối này khi chúng ta có các hàm khởi tạo?" Đây là câu hỏi tuyệt vời! Hãy để tôi giải thích bằng một ví dụ thú vị.

Hãy tưởng tượng bạn đang tạo một nhân vật trò chơi. Mỗi nhân vật cần một số thông số cơ bản, bất kể là họ thuộc lớp nào. Chúng ta có thể sử dụng Khối Khởi Tạo Thể Hiện cho điều này!

public class GameCharacter {
private int health;
private int mana;

{
// Thiết lập cơ bản cho tất cả các nhân vật
health = 100;
mana = 50;
System.out.println("Một nhân vật mới xuất hiện!");
}

public GameCharacter(String characterClass) {
System.out.println("Tạo một " + characterClass);
}
}

Khi chúng ta tạo một nhân vật mới:

GameCharacter warrior = new GameCharacter("Warrior");

Chúng ta sẽ thấy:

Một nhân vật mới xuất hiện!
Tạo một Warrior

Khối Khởi Tạo Thể Hiện đảm bảo mỗi nhân vật bắt đầu với cùng một mức sức khỏe và mana, bất kể lớp của họ. Nó như cung cấp mọi người cùng một gói khởi đầu trong một trò chơi!

Các ví dụ thêm về Khối Khởi Tạo Thể Hiện

Hãy khám phá thêm một số ví dụ để thực sự ciment thêm hiểu biết của chúng ta.

Ví dụ 1: Nhiều Khối Khởi Tạo Thể Hiện

Java cho phép nhiều Khối Khởi Tạo Thể Hiện, và chúng chạy theo thứ tự chúng xuất hiện trong mã.

public class MultiBlock {
{
System.out.println("Khối thứ nhất");
}

{
System.out.println("Khối thứ hai");
}

public MultiBlock() {
System.out.println("Khởi tạo");
}
}

// Sử dụng
MultiBlock mb = new MultiBlock();

Output:

Khối thứ nhất
Khối thứ hai
Khởi tạo

Ví dụ 2: Khởi tạo Đối Tượng Phức Tạp

Khối Khởi Tạo Thể Hiện rất tốt cho việc thiết lập các đối tượng phức tạp hoặc các tập hợp:

import java.util.ArrayList;
import java.util.List;

public class Bookshelf {
private List<String> books;

{
books = new ArrayList<>();
books.add("Lập trình Java");
books.add("Vương giả của Những Chiếc Nhẫn");
books.add("Harry Potter");
}

public Bookshelf() {
System.out.println("Kệ sách được tạo với " + books.size() + " cuốn sách");
}

public void listBooks() {
for (String book : books) {
System.out.println("- " + book);
}
}
}

// Sử dụng
Bookshelf myShelf = new Bookshelf();
myShelf.listBooks();

Output:

Kệ sách được tạo với 3 cuốn sách
- Lập trình Java
- Vương giả của Những Chiếc Nhẫn
- Harry Potter

Ví dụ 3: Khối Khởi Tạo Thể Hiện so với Khối Tĩnh

Quan trọng là hiểu sự khác biệt giữa Khối Khởi Tạo Thể Hiện và Khối Tĩnh. Hãy xem chúng trong hành động:

public class BlockComparison {
{
System.out.println("Khối Khởi Tạo Thể Hiện");
}

static {
System.out.println("Khối Tĩnh");
}

public BlockComparison() {
System.out.println("Khởi tạo");
}

public static void main(String[] args) {
System.out.println("Tạo đối tượng thứ nhất:");
BlockComparison obj1 = new BlockComparison();

System.out.println("\nTạo đối tượng thứ hai:");
BlockComparison obj2 = new BlockComparison();
}
}

Output:

Khối Tĩnh
Tạo đối tượng thứ nhất:
Khối Khởi Tạo Thể Hiện
Khởi tạo

Tạo đối tượng thứ hai:
Khối Khởi Tạo Thể Hiện
Khởi tạo

Nhận ra rằng Khối Tĩnh chỉ chạy một lần, trong khi Khối Khởi Tạo Thể Hiện chạy cho mỗi lần tạo đối tượng.

Kết luận

Và thế là, các bạn! Chúng ta đã đi qua hành trình trong thế giới của Khối Khởi Tạo Thể Hiện, từ cú pháp cơ bản đến các ví dụ phức tạp hơn. Những khối này như là tiệc khởi đầu của một buổi hòa nhạc – chúng thiết lập sân khấu trước khi sự kiện chính bắt đầu (hàm khởi tạo).

Nhớ rằng, mặc dù Khối Khởi Tạo Thể Hiện mạnh mẽ, chúng không luôn cần thiết. Sử dụng chúng khi bạn cần khởi tạo điều gì đó cho mỗi đối tượng, bất kể hàm khởi tạo nào được gọi. Chúng rất hữu ích cho các khởi tạo phức tạp hoặc khi bạn muốn giữ cho các hàm khởi tạo của bạn gọn gàng và tập trung.

Tiếp tục tập luyện, tiếp tục lập trình, và sớm bạn sẽ kịp thời các khối này như một nhà dẫn nhóm âm nhạc có kinh nghiệm! Chúc các bạn có những giờ lập trình thú vị! ??‍??‍?

Credits: Image by storyset