Bỏ qua điều hướng
EN
Tất cả bài viết

Java cơ bản #1: Java là gì, cài JDK 25 và chạy chương trình đầu tiên

Bắt đầu học Java đúng cách năm 2026: Java chạy thế nào (mã nguồn → bytecode → JVM), cài JDK 25 LTS, chọn IDE, viết Hello World theo kiểu mới của Java 25 và kiểu truyền thống, thử code nhanh bằng JShell — kèm lộ trình 12 bài của loạt.

8 phút đọc

Ôn tập bài nàyThẻ ghi nhớ & câu hỏi ôn tập6 thẻ ghi nhớ · 5 câu trắc nghiệm
Mục lục

Java ra đời năm 1995 và sau 30 năm vẫn là một trong những ngôn ngữ được dùng nhiều nhất: hệ thống ngân hàng, thương mại điện tử, ứng dụng Android, công cụ dữ liệu lớn như Kafka, Spark, Elasticsearch, và vô số dịch vụ backend viết bằng Spring Boot. Ở Việt Nam, "Java developer" luôn nằm trong nhóm vị trí tuyển nhiều nhất.

Loạt bài này đưa bạn từ con số 0 tới viết được một ứng dụng Java hoàn chỉnh có kiểm thử. Bài đầu tiên: hiểu Java chạy thế nào, cài đặt môi trường và chạy chương trình đầu tiên.

Lộ trình 12 bài

BàiNội dung
1Giới thiệu, cài JDK, chương trình đầu tiên (bài này)
2Biến, kiểu dữ liệu, toán tử
3Rẽ nhánh và vòng lặp
4Mảng và chuỗi
5Phương thức (hàm)
6Lớp và đối tượng
7Kế thừa, đa hình, interface
8Record, enum và các phương thức của Object
9Collections và Generics
10Ngoại lệ và đọc ghi file
11Lambda, Stream API, Optional
12Dự án cuối: Maven, JUnit, ứng dụng quản lý chi tiêu

Mỗi bài có code chạy được, bài tập, thẻ ghi nhớ và câu hỏi trắc nghiệm ở trang ôn tập.

Java chạy như thế nào

Khác với C/C++ biên dịch thẳng ra mã máy, Java đi qua một bước trung gian:

Từ mã nguồn tới chương trình chạy

Đang vẽ sơ đồ…

flowchart LR
  A["Hello.java<br/>(mã nguồn)"] -->|javac biên dịch| B["Hello.class<br/>(bytecode)"]
  B --> C["JVM trên Windows"]
  B --> D["JVM trên macOS"]
  B --> E["JVM trên Linux"]
  1. Bạn viết mã nguồn trong file .java.
  2. Trình biên dịch javac dịch thành bytecode (file .class) — một dạng lệnh không phụ thuộc hệ điều hành.
  3. JVM (Java Virtual Machine) đọc bytecode và chạy. Trong lúc chạy, bộ biên dịch JIT dịch những đoạn code chạy nhiều thành mã máy để chạy nhanh.

Đây là ý nghĩa của khẩu hiệu "Write once, run anywhere": cùng một file .class chạy được trên mọi máy có JVM.

Ba thuật ngữ hay gặp:

Thuật ngữLà gì
JVMMáy ảo chạy bytecode
JREJVM + thư viện chuẩn — đủ để chạy chương trình
JDKJRE + công cụ phát triển (javac, jshell, jar…) — cần để viết chương trình

Người học lập trình luôn cài JDK.

Cài đặt JDK 25

Java ra phiên bản mới mỗi 6 tháng; cứ 2 năm có một bản LTS (hỗ trợ dài hạn) mà doanh nghiệp dùng. Bản LTS mới nhất là Java 25 (9/2025) — loạt bài dùng bản này.

Có nhiều bản phân phối JDK miễn phí, cùng mã nguồn OpenJDK. Gợi ý: Eclipse Temurin (adoptium.net).

cai-dat-jdk.sh
# Windows (PowerShell)
winget install EclipseAdoptium.Temurin.25.JDK
 
# macOS (Homebrew)
brew install --cask temurin@25
 
# Ubuntu / Debian
sudo apt install openjdk-25-jdk
 
# Hoặc dùng SDKMAN! (macOS/Linux), tiện khi cần nhiều phiên bản
sdk install java 25-tem

Mở terminal mới và kiểm tra:

kiem-tra.sh
java -version     # openjdk version "25..." 
javac -version    # javac 25...

Lưu ý: báo 'java' is not recognized trên Windows → biến môi trường PATH chưa có thư mục bin của JDK. Trình cài Temurin có tuỳ chọn "Set JAVA_HOME / Add to PATH" — tích vào, hoặc thêm thủ công rồi mở lại terminal.

Chọn công cụ viết code

Công cụNhận xét
IntelliJ IDEA (bản Community miễn phí)IDE mạnh nhất cho Java, gợi ý code và sửa lỗi rất tốt — khuyên dùng
VS Code + Extension Pack for JavaNhẹ, quen thuộc nếu bạn đã dùng cho web
Eclipse, NetBeansLâu đời, vẫn được dùng ở trường học

Giai đoạn đầu, hãy thử gõ lệnh javac/java bằng tay ít nhất một lần để hiểu IDE đang làm gì sau nút ▶.

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

Cách mới của Java 25

Từ Java 25, một file Java có thể ngắn như thế này:

Hello.java
void main() {
    IO.println("Xin chào, Java!");
}

Chạy thẳng file mã nguồn, không cần biên dịch riêng:

chay.sh
java Hello.java
# Xin chào, Java!

Đây là compact source file (JEP 512): không cần khai báo lớp, main không cần public static, và lớp IO có sẵn để in ra màn hình (IO.println, IO.print) và đọc dữ liệu (IO.readln). Cách viết này được tạo ra để người mới tập trung vào logic trước, học về lớp sau.

Cách truyền thống

Bạn sẽ gặp cách này trong 99% code và tài liệu hiện có — cần đọc hiểu được:

HelloTruyenThong.java
public class HelloTruyenThong {
    public static void main(String[] args) {
        System.out.println("Xin chào, Java!");
    }
}
Thành phầnÝ nghĩa (sẽ học kỹ ở các bài sau)
public class HelloTruyenThongKhai báo một lớp; tên lớp public phải trùng tên file
public static void main(String[] args)Điểm bắt đầu chương trình; args là tham số dòng lệnh
System.out.println(...)In ra màn hình rồi xuống dòng
{ } và ;Khối lệnh và kết thúc câu lệnh

Biên dịch và chạy theo hai bước:

bien-dich.sh
javac HelloTruyenThong.java    # tạo ra HelloTruyenThong.class
java HelloTruyenThong          # chạy (không ghi đuôi .class)

Trong loạt bài, các ví dụ ngắn dùng cách mới (void main(), IO.println) cho gọn; từ bài 6 về lớp và đối tượng, ta dùng cả hai và giải thích rõ public, static.

Đọc dữ liệu từ bàn phím

ChaoTen.java
void main() {
    String ten = IO.readln("Bạn tên gì? ");
    IO.println("Chào " + ten + ", chúc học Java vui vẻ!");
}

Cách cũ, vẫn rất phổ biến, dùng Scanner:

ChaoTenScanner.java
import java.util.Scanner;
 
public class ChaoTenScanner {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Bạn bao nhiêu tuổi? ");
        int tuoi = sc.nextInt();
        System.out.println("Năm sau bạn " + (tuoi + 1) + " tuổi.");
    }
}

JShell: thử code trong vài giây

JDK có sẵn JShell — gõ lệnh Java và thấy kết quả ngay, không cần tạo file. Rất hợp để thử một ý nhỏ:

jshell
$ jshell
jshell> 7 / 2
$1 ==> 3
jshell> 7 / 2.0
$2 ==> 3.5
jshell> "java".toUpperCase()
$3 ==> "JAVA"
jshell> /exit

(Vì sao 7 / 2 ra 3? Bài 2 sẽ giải thích.)

Đọc lỗi biên dịch

Lỗi là chuyện hằng ngày. Thử bỏ dấu ;:

loi-bien-dich
Hello.java:2: error: ';' expected
    IO.println("Xin chào, Java!")
                                 ^
1 error

Cách đọc: tên file : số dòng : mô tả lỗi, dấu ^ chỉ vị trí. Ba lỗi người mới hay gặp nhất:

LỗiNguyên nhân
';' expectedThiếu dấu chấm phẩy cuối câu lệnh
cannot find symbolGõ sai tên biến/phương thức, sai chữ hoa–thường (system.out thay vì System.out), hoặc thiếu import
class X is public, should be declared in a file named X.javaTên lớp public không trùng tên file

Java phân biệt chữ hoa, chữ thường: Main, main, MAIN là ba tên khác nhau.

Quy ước đặt tên

LoạiQuy ướcVí dụ
Lớp, interface, recordPascalCaseSinhVien, TaiKhoanNganHang
Biến, phương thứccamelCasediemTrungBinh, tinhTong()
Hằng sốUPPER_SNAKE_CASESO_NGAY_TRONG_TUAN
Packagechữ thường, tên miền đảo ngượcvn.dtcode.chitieu

Tên biến có thể viết tiếng Việt có dấu, nhưng nên dùng tiếng Việt không dấu hoặc tiếng Anh để tránh lỗi mã hoá ký tự khi làm việc nhóm.

Bài tập

  1. Cài JDK 25, chạy java -version và chụp lại kết quả.
  2. Viết GioiThieu.java in ra 3 dòng: tên, trường/công ty, lý do học Java.
  3. Viết lại bài 2 theo cách truyền thống (public class, System.out.println), biên dịch bằng javac và chạy bằng java.
  4. Cố tình gây ba lỗi trong bảng trên, đọc thông báo lỗi của trình biên dịch.

Tài liệu tham khảo cho cả loạt

  • dev.java/learn — trang học Java chính thức của Oracle, cập nhật theo phiên bản mới.
  • Java Programming MOOC — Đại học Helsinki (java-programming.mooc.fi), miễn phí, rất nhiều bài tập có chấm tự động.
  • Head First Java (bản 3) — sách nhập môn dễ đọc.
  • Effective Java (bản 3) — Joshua Bloch, đọc sau khi xong loạt này để viết Java "chuẩn nghề".
  • Tài liệu API Java 25 (docs.oracle.com) — tra cứu mọi lớp trong thư viện chuẩn.

Tổng kết

  • Java biên dịch ra bytecode, chạy trên JVM → cùng một chương trình chạy trên mọi hệ điều hành.
  • Cài JDK (không chỉ JRE); dùng bản LTS 25.
  • Java 25 cho phép viết gọn void main() { IO.println(...); } và chạy bằng java File.java; cách truyền thống public class + public static void main vẫn là thứ bạn gặp nhiều nhất.
  • JShell để thử code nhanh; đọc lỗi biên dịch theo file : dòng : mô tả.
  • Bài tiếp theo: biến, kiểu dữ liệu và toán tử.

Nguồn tham khảo: OpenJDK — JEP 512: Compact Source Files and Instance Main Methods; dev.java/learn; tài liệu Eclipse Temurin (adoptium.net); Java Programming MOOC — University of Helsinki.

Đang tải câu hỏi luyện tập…

Bài này thế nào?

Bài viết có hữu ích với bạn?

Đánh giá giúp mình biết nên viết thêm về chủ đề nào.

Đang tải đánh giá…
Chọn số sao từ 1 đến 5

Bình luận

Đăng nhập để bình luận không cần nhập tên và được duyệt nhanh hơn.

0/2000
Đang tải bình luận…

Đọc tiếp

Bài số № 55

Java cơ bản #12: dự án cuối — ứng dụng quản lý chi tiêu với Maven và JUnit

Gom toàn bộ kiến thức vào một dự án thật: cấu trúc Maven và pom.xml, chia lớp model–kho dữ liệu–service–giao diện, lưu file CSV, thống kê bằng Stream, cảnh báo ngân sách, viết kiểm thử JUnit 5, đóng gói file jar chạy được — và lộ trình học tiếp sau Java cơ bản.

19 phút đọc

Bài số № 54

Java cơ bản #11: lambda, tham chiếu phương thức, Stream API và Optional

Lập trình kiểu hàm trong Java: lambda và functional interface (Predicate, Function, Consumer, Supplier), tham chiếu phương thức ::, Stream với filter–map–reduce, sorted, collect, groupingBy, Optional thay cho null — cùng lời khuyên khi nào vòng lặp vẫn tốt hơn stream.

14 phút đọc

Bài số № 53

Java cơ bản #10: xử lý ngoại lệ và đọc ghi file với java.nio.file

Khi chương trình gặp lỗi: đọc stack trace, try/catch/finally, checked và unchecked exception, throw và throws, tự định nghĩa ngoại lệ nghiệp vụ, try-with-resources tự đóng tài nguyên; đọc ghi file văn bản và CSV bằng Files, Path, UTF-8 — kèm các thói quen xử lý lỗi nên tránh.

15 phút đọc