Backend

99 Ngày Java — Ngày 02: Hello World & cấu trúc chương trình

SSite Admin
30 tháng 07, 2026 4 phút đọc 335 lượt xem
99 Ngày Java — Ngày 02: Hello World & cấu trúc chương trình

Hôm qua bạn đã biết Java biên dịch ra bytecode và chạy trên JVM. Hôm nay chúng ta tự tay viết, biên dịch và chạy chương trình đầu tiên — rồi mổ xẻ từng từ trong câu thần chú public static void main(String[] args) mà mọi lập trình viên Java đều gõ hàng nghìn lần.

Sketchnote Ngày 02: Hello World và cấu trúc chương trình Java

Chương trình đầu tiên

Tạo file Hello.java với nội dung sau (gõ tay, đừng copy — ngón tay cũng cần học Java):

public class Hello {
    public static void main(String[] args) {
        System.out.println("Xin chào, 99 Ngày Java!");
    }
}

Một quy tắc bắt buộc phải nhớ: tên file phải trùng tên public class. Class Hello thì file phải là Hello.java — sai một chữ hoa/thường là compiler từ chối ngay.

Mổ xẻ từng thành phần

Dòng public static void main(String[] args) trông như bùa chú, nhưng mỗi từ đều có lý do tồn tại:

  • public — ai cũng gọi được, kể cả JVM từ bên ngoài class. Nếu để private, JVM không thấy hàm main.

  • static — thuộc về class, không cần tạo object. JVM gọi Hello.main(...) trực tiếp mà không cần new Hello().

  • void — không trả về gì. Muốn báo mã lỗi cho hệ điều hành thì dùng System.exit(code).

  • main — tên quy ước JVM tìm kiếm làm điểm khởi đầu (entry point). Viết Main hay start đều không chạy.

  • String[] args — mảng tham số dòng lệnh người dùng truyền vào khi chạy chương trình.

Còn System.out.println(...) nghĩa là: lấy luồng xuất chuẩn out của class System, gọi method println để in một dòng ra màn hình.

Biên dịch và chạy

javac Hello.java   # sinh ra Hello.class (bytecode)
java Hello         # JVM nạp class Hello và gọi main

# Từ Java 11: chạy thẳng file nguồn, khỏi javac thủ công
java Hello.java

Để thấy String[] args hoạt động, thử chương trình chào hỏi này:

public class Greet {
    public static void main(String[] args) {
        for (String name : args) {
            System.out.println("Xin chào " + name + "!");
        }
    }
}
$ javac Greet.java
$ java Greet Nam Mai
Xin chào Nam!
Xin chào Mai!

Mỗi từ đứng sau tên class trở thành một phần tử của mảng args. Nhân tiện: Java 21 có JEP 445 (preview) cho phép viết void main() gọn hơn nhiều — nhưng vì còn là tính năng preview nên series này vẫn dùng dạng đầy đủ.

Màn hình code — nơi mọi hành trình lập trình bắt đầu

Classpath cơ bản

Classpath là danh sách nơi JVM tìm các file .class. Mặc định là thư mục hiện tại (.), nên nãy giờ mọi thứ chạy êm. Khi project lớn dần, ta tách bytecode ra thư mục riêng:

javac -d out Hello.java   # .class được ghi vào thư mục out/
java -cp out Hello        # bảo JVM: tìm class trong out/

Lỗi kinh điển Error: Could not find or load main class gần như luôn do classpath sai — gặp nó, hãy kiểm tra bạn đang đứng ở đâu và -cp trỏ đi đâu. Sau này Maven/Gradle và IDE sẽ quản lý classpath hộ bạn, nhưng hiểu bản chất hôm nay sẽ cứu bạn nhiều lần về sau.

IDE hay terminal?

  • Terminal + editor — cách của tuần đầu tiên: thấy rõ hai bước biên dịch → chạy, hiểu lỗi từ gốc.

  • IntelliJ IDEA Community — IDE phổ biến nhất giới Java, miễn phí, tự gợi ý code và bắt lỗi ngay khi gõ.

  • VS Code + Extension Pack for Java — nhẹ, quen thuộc nếu bạn từng làm web.

Lời khuyên của series: tuần đầu chạy bằng terminal để hiểu chuyện gì xảy ra dưới nắp capo, sau đó chuyển sang IntelliJ để tăng tốc. IDE là công cụ tuyệt vời — miễn là bạn biết nó đang làm gì thay mình.

Bài tập nhỏ

  • Viết và chạy Hello.java bằng đúng hai lệnh javacjava.

  • Chạy java Greet <tên bạn> <tên bạn thân> và giải thích vì sao in ra hai dòng.

  • Cố tình đổi main thành Main, chạy lại và đọc kỹ thông báo lỗi — làm quen với lỗi là kỹ năng quan trọng nhất tuần này.

Kết luận

Bạn đã viết chương trình Java đầu tiên và hiểu tường tận từng từ khóa trong hàm main, biết bytecode nằm đâu và JVM tìm nó thế nào qua classpath. Ngày 03, chúng ta bắt đầu lập trình thật sự: biến và 8 kiểu dữ liệu nguyên thủy — những viên gạch nhỏ nhất của mọi chương trình Java. Hẹn gặp lại!

S

Site Admin

Engineer and writer. Building things with TypeScript and distributed systems.

Bình luận (0)

Bạn cần đăng nhập bằng Google để bình luận.

Hãy là người bình luận đầu tiên.

Bài viết liên quan

99 Ngày Java — Ngày 58: Optional

Optional là công cụ cho kiểu trả về — không field, không tham số, không bọc collection; chuỗi map/flatMap/filter thay kim tự tháp if; orElse luôn tính tham số còn orElseGet lười, orElseThrow cho “không có là lỗi” — và các anti-pattern isPresent + get, orElse(null).

23 thg 9, 20269 phút9
99 Ngày Spring — Ngày 58: Spring Boot Actuator

Boot 3 mặc định chỉ lộ health; bản đồ endpoint an toàn và nguy hiểm; HealthIndicator tự viết với liveness tách khỏi readiness cho Kubernetes, info từ build và git, metrics Micrometer với tag hữu hạn — và ba lớp khóa: cổng riêng, SecurityFilterChain với EndpointRequest, exclude env/heapdump/threaddump.

23 thg 9, 202610 phút5
So sánh EasyExcel và Apache Fesod: khác biệt thật nằm ở đâu?

Fesod là hậu duệ của EasyExcel, cùng engine SAX/SXSSF. Khác biệt kiểm chứng được: vòng đời dự án, POI 5.2.5 vs 5.5.1, các API mới (numRows, csv(), headerMergeStrategy) và độ bền với file xấu — không phải hiệu năng gấp nhiều lần.

23 thg 9, 20268 phút1