Java là hai thứ mang chung một cái tên: một ngôn ngữ lập trình, và một platform để chạy chương trình. Gần như mọi tranh cãi quanh Java — nhanh hay chậm, miễn phí hay không, đang chết hay không — đều bắt nguồn từ việc gộp hai thứ đó làm một.
Mọi con số và thông báo lỗi trong bài đều được kiểm chứng trực tiếp trên OpenJDK 21.0.6, macOS/aarch64. Không có dòng output nào được viết theo trí nhớ.
![]()
Thứ tự của bài: Java là gì, đến từ đâu, có gì đặc trưng, đang được dùng ở đâu trong production, so với các ngôn ngữ láng giềng thì hơn kém chỗ nào, và những lời phàn nàn quen thuộc có bao nhiêu phần đúng.
Java là gì?
Java là một ngôn ngữ lập trình statically typed, object-oriented, đa mục đích, compile ra bytecode chứ không ra machine code. Bytecode đó được thực thi bởi Java Virtual Machine (JVM) — một chương trình đã được port sang mọi hệ điều hành và kiến trúc CPU phổ biến.
Sự tách bạch giữa ngôn ngữ và platform quan trọng hơn vẻ ngoài của nó. Ngôn ngữ là syntax và type system bạn viết. Platform là JVM, standard library, và định dạng class file mà cả hai thống nhất với nhau. Hai thứ này tách rời được theo cả hai chiều: Kotlin, Scala, Clojure, Groovy đều compile ra cùng loại bytecode và chạy trên cùng JVM mà không cần một dòng Java nào; ngược lại, source Java có thể được compile ahead-of-time thành file thực thi native, không cần JVM thông thường.
| Khái niệm | Thực chất là gì |
|---|---|
| Java (ngôn ngữ) | Syntax, type system và ngữ nghĩa bạn viết trong file .java |
| Bytecode | Một tập instruction portable, lưu trong file .class |
| JVM | Chương trình load bytecode và chạy nó trên một hệ điều hành và CPU cụ thể |
| Java SE | Đặc tả gắn ba thứ trên lại: ngôn ngữ, virtual machine, và standard library API |
Vì vậy "học Java" thực ra là học ba thứ cùng lúc: ngôn ngữ, standard library, và bộ tooling. Series này đi theo đúng thứ tự đó.
Lịch sử Java qua các mốc thời gian
Java không sinh ra để làm web hay server. Nó sinh ra để điều khiển đầu thu truyền hình.

Những bản release đáng nhớ, và chỗ nhịp sáu tháng bắt đầu:
| Năm | Sự kiện |
|---|---|
| 1991 | Green Team tại Sun Microsystems, dẫn dắt bởi James Gosling, bắt đầu một ngôn ngữ tên Oak, nhắm tới thiết bị gia dụng và set-top box |
| 1995 | Oak đổi tên thành Java vì tên cũ đã bị đăng ký, và ra mắt công khai ngày 23/05/1995 cùng trình duyệt HotJava |
| 1996 | JDK 1.0 phát hành ngày 23/01/1996 |
| 1998 | J2SE 1.2, được gọi là "Java 2": Swing và Collections Framework |
| 2004 | J2SE 5.0: generics, annotation, enum, vòng lặp for mở rộng |
| 2006–2007 | Sun mở source phần implementation thành OpenJDK, theo GPLv2 kèm Classpath Exception |
| 2010 | Oracle mua lại Sun Microsystems và tiếp quản Java |
| 2014 | Java 8: lambda, stream, API date/time mới. Bản được deploy rộng rãi nhất từ trước tới nay |
| 2017 | Java 9: module system, và mở màn chu kỳ release sáu tháng một lần |
| 2018 | Java 11, bản LTS đầu tiên theo chu kỳ mới |
| 2021 | Java 17 LTS: sealed class, record, pattern matching cho instanceof |
| 2023 | Java 21 LTS: virtual thread, record pattern, pattern matching cho switch |
| 2025 | Java 25, bản LTS kế tiếp sau 21, phát hành tháng 9 |
Trước 2017, mỗi bản Java lớn cách nhau hai đến năm năm. Từ Java 9 trở đi, cứ sáu tháng có một feature release vào tháng 3 và tháng 9, và phần lớn các bản đó chỉ được hỗ trợ đến khi bản kế tiếp xuất hiện. Hai năm một lần, một bản được chọn làm LTS (long-term support) và tiếp tục nhận update bảo mật trong nhiều năm. Dòng LTS là 8, 11, 17, 21, 25.
Trên thực tế, Java 21 là bản LTS mà hầu hết dự án mới nhắm tới hiện nay. Java 25 mới hơn và tỉ lệ áp dụng đang tăng, nhưng 21 vẫn là lựa chọn an toàn cho một service làm mới; Java 17 có mặt ở khắp nơi trong code viết từ 2021; và Java 8 vẫn đang chạy một khối lượng khổng lồ phần mềm production mà không ai có ngân sách để migrate. Khi một tài liệu nói "Java" mà không nói rõ version, cứ hiểu là 17 hoặc 21.
Write once, run anywhere: thực tế diễn ra thế nào?
Khẩu hiệu này là thật, và cơ chế đằng sau nó khá đơn giản. javac không sinh ra machine code. Nó sinh ra file .class chứa bytecode — tập instruction dành cho một cỗ máy trừu tượng không tồn tại về mặt vật lý. Một JVM được build riêng cho hệ điều hành và CPU của bạn sẽ load file đó và dịch sang instruction thật trong lúc chương trình chạy.

Đây là chương trình nhỏ nhất đủ để thấy điều đó — nó hỏi chính platform đang chạy nó:
public class WhereAmI {
public static void main(String[] args) {
System.out.println("Java version: " + System.getProperty("java.version"));
System.out.println("Running on: " + System.getProperty("os.name")
+ " / " + System.getProperty("os.arch"));
}
}
Compile và chạy trên máy dùng để viết bài này:
Java version: 21.0.6
Running on: Mac OS X / aarch64
Phần thú vị là khi một JVM khác load đúng file đó. Compile một lần cho Java 17, rồi chạy file .class thu được trên hai virtual machine khác nhau mà không compile lại:
$ java -cp out17 WhereAmI
Java version: 21.0.6
Running on: Mac OS X / aarch64
$ /opt/homebrew/.../openjdk@17/.../bin/java -cp out17 WhereAmI
Java version: 17.0.14
Running on: Mac OS X / aarch64
Một artifact, hai runtime, không build lại. Mở rộng ra hệ điều hành khác và CPU khác thì đó chính là toàn bộ ý tưởng.
Tính tương thích chỉ đi theo một chiều. File .class do JDK 21 compile với target mặc định sẽ không load được trên JVM cũ hơn, và thông báo lỗi nói rõ lý do:
Error: LinkageError occurred while loading main class WhereAmI
java.lang.UnsupportedClassVersionError: WhereAmI has been compiled by a more recent version of the Java Runtime (class file version 65.0), this version of the Java Runtime only recognizes class file versions up to 61.0
Bytecode cũng không phải phép màu. Bất cứ thứ gì chạm ra ngoài JVM — native library, ký tự phân tách đường dẫn, character encoding mặc định của hệ thống, API riêng của từng hệ điều hành — vẫn có thể khác nhau giữa các máy. "Write once, run anywhere" là lời hứa về bytecode, không phải về mọi dòng code bạn viết lên trên nó.
Những đặc điểm định hình Java
Compile ra bytecode, chạy trên virtual machine. Đã nói ở trên. Đây là quyết định thiết kế gốc mà mọi thứ còn lại đi theo: tính portable, JIT compiler, garbage collector, và việc bốn ngôn ngữ phổ biến khác cũng nhắm tới cùng runtime này.
Statically typed và strongly typed. Mọi variable đều có type cố định và được kiểm tra trước khi chương trình chạy. Lỗi type là lỗi compile, không phải bất ngờ lúc 3 giờ sáng trên production. Gán một String cho int thì không bao giờ tới được JVM:
Typed.java:3: error: incompatible types: String cannot be converted to int
int count = "twelve";
^
1 error
Đây là cái giá Java chọn trả: nhiều thủ tục hơn lúc viết, đổi lại loại bỏ hẳn một nhóm bug mà ngôn ngữ dynamically typed chỉ phát hiện được lúc runtime. Nó có lãi tỉ lệ thuận với kích thước codebase và số người cùng đụng vào codebase đó.
Quản lý bộ nhớ tự động. Bạn tạo object và không bao giờ phải giải phóng chúng. Garbage collector thu hồi những gì không còn được tham chiếu tới. Java 21 mặc định dùng collector G1 — chính JVM ghi lại điều đó trong log — và còn kèm sẵn vài collector khác (Parallel, Serial, ZGC, Shenandoah) cho các mục tiêu latency và throughput khác nhau. Cái giá là pause khi thu gom bộ nhớ trở thành thứ phải cân nhắc trong hệ thống nhạy latency; đổi lại, bug use-after-free và double-free không tồn tại trong code Java thông thường.
[0.006s][info][gc] Using G1
Object-oriented, rất ít lối thoát. Mọi method và mọi field đều nằm trong một class hoặc một interface. Không có function tự do và không có biến toàn cục. Những giá trị duy nhất không phải object là tám primitive type (int, long, double, boolean và vài loại nữa). Đây là ràng buộc có chủ đích — nó làm codebase lớn trở nên dễ đoán, và làm script nhỏ dài dòng hơn mức cần thiết.
Multithreaded ngay từ bản đầu tiên. Thread, lock và một memory model đã nằm trong ngôn ngữ và standard library từ bản 1.0, không phải gắn thêm bằng thư viện ngoài. Java 21 bổ sung virtual thread: thread nhẹ do JVM lập lịch thay vì hệ điều hành, cho phép một server phục vụ rất nhiều thao tác blocking đồng thời mà không cần một thread riêng cho mỗi kết nối.
Tương thích ngược ở mức hiếm thấy. Bytecode cũ vẫn chạy trên JVM mới. Compile cho Java 8 bằng compiler của Java 21 vẫn được, cho ra class file version 52.0, và file đó chạy nguyên vẹn trên JVM hiện đại:
$ javac --release 8 -d out8 WhereAmI.java
warning: [options] source value 8 is obsolete and will be removed in a future release
warning: [options] target value 8 is obsolete and will be removed in a future release
warning: [options] To suppress warnings about obsolete options, use -Xlint:-options.
3 warnings
$ file out8/WhereAmI.class
out8/WhereAmI.class: compiled Java class data, version 52.0 (Java 1.8)
$ java -cp out8 WhereAmI
Java version: 21.0.6
Running on: Mac OS X / aarch64
Gần như không hệ sinh thái nào khác coi trọng tương thích ngược đến mức này. Đó là lý do chính khiến các doanh nghiệp chuẩn hóa trên Java, và cũng là lý do chính khiến ngôn ngữ này tiến hóa chậm hơn đối thủ.
Standard library lớn, hệ sinh thái còn lớn hơn. Runtime image của Java 21 gồm 69 module, phủ collection, I/O, networking, HTTP, cryptography, concurrency, date/time, XML và JDBC. Bên ngoài đó, Maven Central là một trong những kho package lớn nhất ngành, và bộ build tool, test framework, profiler, debugger quanh JVM trưởng thành ở mức hiếm có.
Java được dùng ở đâu trong thực tế
| Lĩnh vực | Hệ thống thật |
|---|---|
| Backend doanh nghiệp | Spring Boot, Jakarta EE, Quarkus, Micronaut — stack mặc định cho service REST và gRPC trong doanh nghiệp |
| Android | Framework API của Android là API Java; code ứng dụng viết bằng Java hoặc Kotlin, compile ra bytecode DEX và chạy bởi runtime ART |
| Big data và streaming | Hadoop, Spark, Kafka, Flink, Elasticsearch/OpenSearch, Cassandra, HBase đều là dự án chạy trên JVM |
| Fintech và ngân hàng | Core banking, chuyển mạch thanh toán, bù trừ, giao dịch — hệ thống sống lâu, bị audit nhiều, cực kỳ nhạy với tương thích |
| Desktop và game | Minecraft: Java Edition; bộ IDE của JetBrains, gồm IntelliJ IDEA và Android Studio |
| Tooling test và build | JUnit, Selenium, Maven, Gradle, Jenkins, SonarQube |
Hai quy luật giải thích danh sách trên. Java thống trị ở nơi mà một process chạy liên tục hàng tuần và throughput quan trọng hơn thời gian khởi động — đúng hình dạng của một backend service, một stream processor hay một search cluster. Và nó thống trị ở nơi code phải sống được cả thập kỷ, vì tương thích ngược là thứ người ta chỉ biết quý sau khi đã trả giá vì thiếu nó. Netflix, LinkedIn, Uber và Alibaba đều đã công bố rất nhiều tài liệu về việc vận hành hạ tầng JVM quy mô lớn.
Java vs Python vs JavaScript vs C#
| Java | Python | JavaScript | C# | |
|---|---|---|---|---|
| Type system | Static, strong, khai báo tường minh (var suy diễn cho biến cục bộ) | Dynamic, strong; type hint không được kiểm tra lúc runtime | Dynamic, weak, có ép kiểu ngầm; TypeScript thêm static type lúc build | Static, strong, khai báo tường minh |
| Cách thực thi | Bytecode, JIT compile bởi JVM | Bytecode, thông dịch bởi CPython | JIT compile bởi V8 / SpiderMonkey / JavaScriptCore | IL, JIT compile bởi CLR |
| Startup | Chậm nhất trong bốn; vài chục mili giây trước khi main chạy | Nhanh | Nhanh | Nhanh, và AOT đã trưởng thành |
| Throughput đỉnh | Rất cao sau khi warm up | Thấp nhất; phần nặng đẩy sang C extension | Cao với những tác vụ engine được tối ưu | Rất cao, ngang ngửa Java |
| Độ dài dòng | Dài dòng nhất | Ngắn gọn nhất | Ngắn gọn | Nằm giữa Java và Python |
| Lĩnh vực điển hình | Backend, Android, hạ tầng dữ liệu | Scripting, data science, ML, tự động hóa | Trình duyệt, backend Node.js | Phần mềm Windows và doanh nghiệp, game Unity, backend |
| Độ khó khi bắt đầu | Trung bình; nhiều thủ tục trước khi thấy được lợi ích | Dễ | Dễ lúc đầu, khó về sau | Trung bình, rất giống Java |
Những chỗ Java thực sự thua:
- Dài dòng. In một dòng chữ cũng cần một class, một method
mainvới signature cố định, và type tường minh cho gần như mọi thứ. Python làm điều đó trong một dòng. Các bản gần đây đã cắt bớt boilerplate đáng kể, nhưng mức sàn vẫn cao hơn. - Thời gian khởi động. Đo trên chính máy viết bài: 25 lần chạy một chương trình Java tối giản sau 5 lần warm up cho 24,6 ms ở lần tốt nhất và 25,9 ms ở trung vị, so với 1,8 ms và 2,2 ms của một file thực thi C tương đương. Tắt class-data sharing bằng
-Xshare:offthì con số Java lên 35,7 ms. Với một server chạy cả tháng, con số này vô nghĩa. Với một CLI tool gọi trong vòng lặp shell, hay một serverless function tính tiền theo lượt gọi, nó là chi phí lớn nhất. - Bộ nhớ. Một JVM lúc rảnh vẫn tốn nhiều RAM hơn process Go hoặc Python tương đương, vì nó mang theo heap, metaspace, code đã JIT compile và stack của các thread riêng.
- Tốc độ đổi mới. Record tới ở Java 16, pattern matching cho
switchtới ở Java 21 — những thứ các ngôn ngữ khác đã có từ nhiều năm trước. Tương thích ngược có giá của nó, và đây là cái giá.
Những lầm tưởng về Java vẫn còn tồn tại
Lầm tưởng: Java chậm
Đúng một nửa, và nửa đúng lại không phải nửa mà người ta nghĩ.
JVM khởi đầu bằng cách thông dịch bytecode, sau đó JIT compiler quan sát xem method nào chạy nhiều và compile những method đó sang machine code ngay trong lúc chương trình đang chạy. Cùng một vòng lặp, chạy tám lượt trong một process trên OpenJDK 21.0.6, cho thấy cả giai đoạn warm up lẫn phần thưởng sau đó:
| Chế độ chạy | Lượt 1 | Lượt 2 | Lượt 3 | Lượt 6–8 |
|---|---|---|---|---|
| Mặc định (bật JIT) | 13,6 ms | 13,5 ms | 8,1 ms | ~9,2 ms |
-Xint (chỉ thông dịch) | 129,0 ms | 121,8 ms | 128,8 ms | — |
Số liệu chỉ mang tính tham khảo từ một máy, nhưng hình dạng mới là điều đáng chú ý: tắt JIT thì cùng khối lượng công việc chậm hơn trên 13 lần, và ngay cả khi bật JIT, hai lượt đầu vẫn chậm hơn rõ rệt vì quá trình compile chưa xong. Một Java server chạy dài hạn dành gần như toàn bộ thời gian sống ở cột bên phải, với tốc độ so được với native code.
Các tier transition đứng sau những con số đó có thể thấy bằng -XX:+PrintCompilation: interpreter trước, rồi C1 ở tier 3, rồi C2 ở tier 4.

Cái thực sự chậm là đoạn mở đầu. JVM phải khởi động, load và verify class, rồi warm up trước khi đạt tốc độ đầy đủ — khoảng 25 ms khởi động đo ở trên, cộng thêm thời gian để các đường code nóng được compile. "Java chậm" và "Java nhanh" đều đúng; áp dụng câu nào phụ thuộc hoàn toàn vào việc process của bạn sống bao lâu.
Lầm tưởng: Java và JavaScript có liên quan
Không hề. Hai cái tên chung nhau bốn chữ cái, chung kiểu syntax dấu ngoặc nhọn và dấu chấm phẩy học từ C, và hết.
JavaScript ra đời tại Netscape năm 1995 do Brendan Eich viết, được đổi tên từ LiveScript thành JavaScript như một quyết định marketing trong giai đoạn Netscape hợp tác với Sun. Từ đó hai ngôn ngữ tách hẳn: type system khác, mô hình bộ nhớ và concurrency khác, standard library khác, mô hình object khác (class so với prototype), và cơ chế quản trị khác — quy trình JDK Enhancement Proposal so với Ecma TC39.
Biết cái này không giúp bạn biết cái kia. Thứ chuyển giao được là tư duy lập trình chung, không phải ngôn ngữ.
Lầm tưởng: Java đang chết
Java bị tuyên bố sắp chết từ khoảng năm 2005. Trong khi đó: cứ sáu tháng lại có một feature release đều đặn kể từ 2017, hai bản LTS đã ra mắt từ 2021 tới nay, framework API của Android là Java, và phần lớn hạ tầng dữ liệu của thế giới chạy trên JVM.
Phiên bản trung thực hơn thì hẹp hơn nhiều. Java không còn là lựa chọn mặc định cho một startup mới, nó đã rơi khỏi vị trí đầu bảng trong các chỉ số phổ biến, và nó mất hẳn mảng scripting và data science vào tay Python. Nhưng khối lượng code đang chạy là khổng lồ, chi phí migrate rất đắt, và nhu cầu tuyển dụng bám theo khối lượng code đó chứ không bám theo xu hướng. "Không còn thời thượng" và "đang chết" là hai chuyện hoàn toàn khác nhau.
Lầm tưởng: Java không miễn phí
Bản thân Java miễn phí. OpenJDK — bản implementation tham chiếu mà gần như mọi bản phân phối đều dựng lên từ đó — là mã nguồn mở theo GPLv2 kèm Classpath Exception, giấy phép này cho phép bạn deploy ứng dụng mã nguồn đóng trên nó.
Thứ có thể tốn tiền là một bản build cụ thể của một nhà cung cấp cụ thể, kèm hỗ trợ thương mại. Bản JDK của Oracle được phát hành theo điều khoản riêng của Oracle, và toàn bộ sự nhầm lẫn bắt nguồn từ tháng 1/2019, khi Oracle ngừng cung cấp update công khai miễn phí cho Oracle JDK 8 dùng cho mục đích thương mại. Đó là thay đổi license với bản binary của một nhà cung cấp, không phải với ngôn ngữ.
Các bản build miễn phí và dùng được cho production gồm Eclipse Temurin (Adoptium), Amazon Corretto, Azul Zulu, Microsoft Build of OpenJDK, bản của Red Hat, SapMachine, và chính các bản GPL của Oracle trên jdk.java.net.
⚠️ License gắn với bản build bạn tải về, không gắn với chữ "Java". Trước khi deploy, hãy kiểm tra xem trong container image của bạn thực sự là JDK của nhà cung cấp nào.
Có nên học Java không?
Nên, với điều kiện biết rõ là học để làm gì.
Hãy học Java nếu bạn nhắm tới backend quy mô lớn, Android, hạ tầng dữ liệu, hoặc fintech — đó là những chỗ Java không chỉ có mặt mà còn thống trị. Static type system và bộ tooling dựng trên nó (refactor đáng tin cậy, điều hướng chính xác, lỗi bắt được từ lúc compile) trả lại xứng đáng cái giá thủ tục khi codebase và team lớn dần. Và kiến thức JVM chuyển giao được: Kotlin, Scala, Clojure dùng lại đúng runtime đó, đúng thư viện đó, đúng công cụ debug đó.
Đừng bắt đầu bằng Java nếu bạn muốn có một website chạy được trong cuối tuần này, nếu bạn hướng tới data science và machine learning, hoặc nếu mục tiêu của bạn là những process sống rất ngắn mà thời gian khởi động chiếm phần lớn chi phí.
Có một điểm cần đính chính ngay từ đầu: Java hiện đại không phải là ngôn ngữ mà người ta hay chê. Record, var, text block, switch expression, sealed type và virtual thread đều đã xuất hiện từ 2018 trở lại đây. Những lời chê trích dẫn giáo trình năm 2010 đang mô tả một ngôn ngữ không còn tồn tại.
FAQ
Java có phải là JavaScript không?
Không, và hai thứ này cũng không họ hàng gì. Java là ngôn ngữ statically typed, compile ra bytecode chạy trên JVM, chủ yếu dùng cho backend và Android. JavaScript là ngôn ngữ dynamically typed chạy trong trình duyệt và trong Node.js. Cái tên giống nhau chỉ là một quyết định marketing năm 1995.
Nên học Java version nào?
Java 21. Đây là bản LTS mà hầu hết dự án mới nhắm tới, và mọi thứ bạn học trên nó đều áp dụng được cho 17 và 8 — phần nền tảng không đổi, chỉ có syntax bổ sung phía trên là khác. Học bản cũ rồi nâng cấp sau khó hơn làm theo chiều ngược lại.
Java có miễn phí không?
Có. OpenJDK dùng license GPLv2 kèm Classpath Exception, và các bản build miễn phí từ Adoptium, Amazon, Azul, Microsoft đều dùng được cho production. Chỉ một số bản build thương mại có hỗ trợ trả phí — điển hình là của Oracle — mới có điều khoản cần đọc kỹ trước khi deploy.
Học Java mất bao lâu?
Syntax và phần object-oriented cơ bản mất vài tuần luyện tập đều đặn. Làm việc được trên một codebase Spring Boot thật thì mất vài tháng, vì hệ sinh thái — build tool, dependency injection, ORM, testing, deploy — lớn hơn ngôn ngữ rất nhiều. Ngôn ngữ mới là phần ngắn.
Java có phù hợp làm ngôn ngữ đầu tiên không?
Chấp nhận được, nhưng không phải lựa chọn dễ chịu nhất. Static type và thông báo lỗi rõ ràng của compiler thực sự giúp người mới, vì lỗi hiện ra ngay lập tức kèm lời giải thích cụ thể. Đổi lại, ngay dòng đầu tiên bạn đã gặp class, access modifier và public static void main trước khi hiểu chúng nghĩa là gì. Nếu đích đến của bạn là backend thì bắt đầu bằng Java là lựa chọn hợp lý.
Có cần biết Java để làm Android không?
Kotlin là lựa chọn mặc định cho dự án Android mới, nhưng framework API của Android là API Java, một lượng rất lớn tài liệu và code Android sẵn có được viết bằng Java, và Kotlin được thiết kế để tương tác với Java. Kiến thức Java chuyển giao trực tiếp; làm Android mà hoàn toàn không đụng tới Java là chuyện hiếm.
Kết luận
Java là một ngôn ngữ statically typed, object-oriented, compile ra bytecode, cộng với một virtual machine chạy bytecode đó ở mọi nơi. Nó khởi đầu là Oak tại Sun năm 1991, phát hành JDK 1.0 năm 1996, về tay Oracle năm 2010, và ra bản mới sáu tháng một lần kể từ 2017, với Java 21 là bản LTS mà phần lớn dự án mới nhắm tới. Nó dài dòng và khởi động chậm, đồng thời cực nhanh khi đã warm up, cực ổn định giữa các version, và bám rễ sâu trong backend, Android lẫn hạ tầng dữ liệu. Tất cả những điều đó đều đúng cùng một lúc.
Bài tiếp theo sẽ cài đặt Java và mổ xẻ đám từ viết tắt: JDK thực sự chứa những gì, JRE là gì, JVM làm gì, và bạn cần cái nào trên máy của mình.