Đây đã là ngôn ngữ lập trình thứ N
trong hành trình tự học code mà mình đang chia sẻ tại nền tảng blog Viblo ở đây, vì vậy nên chúng ta sẽ thu gọn các điểm căn bản vào mục yêu cầu trước khi bắt đầu Sub-Series này như sau:
Nếu bạn đã đồng hành từ Series Tự Học Lập Trình Web đầu tiên thì chỉ cần đảm bảo rằng đã đi qua thêm Sub-Series Imperative + C
của Series Một Số Mô Hình Lập Trình Phổ Biến này. Và nếu như bạn cũng đã đi qua Sub-Series Procedural + Ada
nữa thì sẽ là rất tuyệt bởi vì ngoại trừ nhóm công cụ Functional
thì tất cả các khía cạnh khác của Java
được giới thiệu ở đây chỉ khác với Ada
về mặt cú pháp biểu thị.
Trong trường hợp bạn gặp bài viết này từ một nguồn tìm kiếm như Google hay Bing và chưa từng đọc bài viết nào mà mình đã chia sẻ tại đây thì... khả năng cao là bạn hiểu Java
rõ hơn so với một người mất gốc mới mò mẫm học lại như mình. Và mình rất hy vọng sẽ nhận được các bình luận từ bạn để hiệu chỉnh lại những kiến thức đã chia sẻ nếu có sơ xuất hoặc do mình chưa hiểu đúng trọng tâm.
Hello, Java !
Do đã mặc định phần kiến thức nền ở trên nên chúng ta sẽ không quay lại các vấn đề như các khái niệm OOP
căn bản, ví dụ như: object
là cái gì? Hay, class
là cái gì? Mà thay vào đó thì sẽ chỉ tập trung giới thiệu các yếu tố về mặt cú pháp do Java
cung cấp. Và bây giờ chúng ta sẽ khởi đầu ngay với code Hello, World!
thể hiện bằng ngôn ngữ Java
.
package app; import java.io.*; class Main { public static void main (String[] $args) { System.out.println ("Hello, Java !"); } } // -- end Main
Để chạy code này ngay trên máy tính đang sử dụng thì chúng ta sẽ cần phải cài đặt một bộ công cụ tạo môi trường phát triển ứng dụng dành riêng cho Java
có tên gọi là JDK - Java Development Kit
. Bộ công cụ này bao gồm:
JVM (Java Virtual Machine)
- một máy ảo tạo môi trường vận hành code đã được biên dịch từ các tệp mã nguồnJava
mà chúng ta viết.javac (java compiler)
- một trình biên dịch giúp chuyển đổi codeJava
mà chúng ta viết sang ngôn ngữ trung gian để có thể thực thi được bởi máy ảoJVM
.
Các liên kết tải về JDK 19
(phiên bản mới nhất hiện tại 02/2023):
Và với việc Oracle
- nhà phát triển ngôn ngữ Java
- có cung cấp các bộ cài đặt cho đầy đủ các nền tảng hệ điều hành khác nhau thì chúng ta có thể yên tâm rằng: "Viết code một lần, mang tới đâu cũng chạy được." Code xử lý logic phần mềm mà chúng ta xây dựng sẽ tương tác với máy ảo JVM
qua giao diện lập trình trong tài liệu được cung cấp, còn máy ảo JVM
sẽ phải chuyển tải logic đó sang dạng phù hợp để tương tác với hệ điều hành đang sử dụng.
Sau khi đã cài đặt xong JDK
thì chúng ta cần mở cửa sổ dòng lệnh để chạy lệnh biên dịch javac
và lệnh thực thi java
.
cd Documents/learn-java
find -name "*.java" > src.txt
javac @src.txt
java app/Main
cd Documents\learn-java
dir /s /B *.java > src.txt
javac @src.txt
java app\Main
Trong số các câu lệnh phía trên thì có lệnh thứ hai là để tìm và liệt kê toàn bộ các tệp mã nguồn .java
mà chúng ta viết vào một tệp văn bản thuần src.txt
, sau đó trình biên dịch javac
sẽ có thể sử dụng danh sách này để tự động biên dịch toàn bộ tất cả các tệp mã nguồn .java
sang các tệp .class
chứa code vận hành mà máy ảo JVM
có thể hiểu được.
Cuối cùng là lệnh chạy tệp .class
có chứa một hàm main
khởi động chương trình trong thư mục learn-java/app
. Trong lệnh này chúng ta có thể sử dụng tên đầy đủ của tệp là Main.class
hoặc ngầm định yếu tố định dạng tệp cũng được, bởi vì JVM
sẽ không chạy trực tiếp các tệp code .java
cùng tên có mặt trong thư mục đó.
Java có thể làm được những gì?
Cái máy ảo JVM
mà chúng ta nói ở trên sẽ tương tác với hệ điều hành ở cấp độ mà gần như không có giới hạn nào về mặt tài nguyên, trừ khi là do chúng ta thiết lập ở phía hệ điều hành đang sử dụng. Vì vậy nên bạn có thể sử dụng Java
để viết bất kỳ dạng ứng dụng nào với sự hỗ trợ của thư viện tiêu chuẩn cho javac
cung cấp, bao gồm cả những ứng dụng làm việc cục bộ trong máy offline app
hoặc các ứng dụng mạng network app
.
Những yếu tố quen thuộc
Java
là một ngôn ngữ Imperative
sử dụng các cấu trúc lệnh điều kiện và vòng lặp tương tự như C
. Để tránh lặp lại các bài viết về những chi tiết Imperative
đã quá quen thuộc sau khi sử dụng C
và JavaScript
thì chúng ta sẽ liệt kê lướt qua tại đây:
Định kiểu tĩnh
Java
là một ngôn ngữ định kiểu tĩnh static-typing
với cú pháp định kiểu tương đồng với C
99.99%. Tên của các kiểu dữ liệu được sử dụng làm tiền tố ở các vị trí khai báo các biến và các tham số đầu vào của các phương thức method
.
int $integer = 9;
double $floatNumber = 10.01;
boolean $coin = true;
char $character = 'j'; char[] $charArrayTen = new char[10];
char[] $charArray = { 'j', 'a', 'v', 'a' }; String $string = "A sequence of characters";
Như vậy là ở đây chúng ta thấy Java
vay mượn luôn cả cú pháp khởi tạo mảng đơn thuần literal array
của C
. Mặc dù là ngôn ngữ lập trình OOP
phổ biến nhất và thậm chí không hỗ trợ viết code bên ngoài các khối định nghĩa của OOP
, nhưng so với môi trường JavaScript
thì logic thực thi code OOP
ở đây sẽ có phần kém linh động hơn một chút. Chúng ta sẽ không thể gọi một phương thức trực tiếp từ một giá trị primitive
như thế này:
String $infinity = (1001).toString(); // error
Và như vậy thì chúng ta đã có thể mặc định phương thức xử lý đối với các giá trị primitive
trong Java
là giống với C
. Tuy nhiên có một điểm đặc biệt khác với C
đó là ở đoạn String
và cấu trúc mảng ký tự đơn thuần char[]
:
Chúng ta có cấu trúc mảng đơn thuần char[]
vẫn được hiểu tương tự như mảng các ô nhớ liền kề nhau trong C
và biến đại diện cho mảng đang trỏ tới địa chỉ của ô đầu tiên. Ở đây Java
không hỗ trợ làm việc với các con trỏ ở cấp độ quản lý bộ nhớ thủ công như C
, mà chúng ta chỉ đang nói tới bản chất của cấu trúc dữ liệu này để so sánh với String
. Như vậy char[]
sẽ bao gồm các ô nhớ lưu trữ các ký tự đơn liền kề nhau, không phải là Object
, và không có khả năng gọi các phương thức ví dụ như charArray.toString()
.
Còn String
thì lại là kiểu Object
trong môi trường Java
. Cú pháp khởi tạo với nội dung chuỗi đơn thuần literal string
như trên sẽ được Java
ngầm định cho đi qua một trình khởi tạo và tạo ra một object
, không phải là một mảng đơn thuần chứa các ký tự như char[]
. Và như vậy, đôi khi chúng ta sẽ có thể gọi một phương thức từ một chuỗi ví dụ như oneString.length()
. Bên cạnh đó thì tại các vị trí mà chúng ta gọi phương thức trực tiếp từ literal string
ví dụ như "Just a string".length()
thì Java
sẽ xử lý giống với JavaScript
bằng cách tạo ra một object
vỏ bọc tạp thời để thực hiện phương thức, và object
này sẽ được xóa đi ngay sau khi phương thức được thực thi xong.
Chuyển kiểu dữ liệu
Đối với các kiểu primitive
thì thao tác chuyển từ kiểu dữ liệu có độ rộng nhỏ hơn sang kiểu có độ rộng lớn hơn sẽ được Java
tự động xử lý ngầm định, và ở chiều ngược lại thì chúng ta sử dụng cú pháp tương tự với C
.
int $integer = 9;
double $floatNumber = $integer; System.out.println ($floatNumber); // 9.0
double $floatNumber = 9.1;
int $integer = (int) $floatNumber; System.out.println ($integer); // 9
Cú pháp điều kiện
if (A_isPossible) { doPlanA();
}
else if (B_isPossible) { doPlanB();
}
else { doPlanZ();
}
switch ($letter) { case 'A': doPlanA(); break; case 'B': doPlanB() break; default: doPlanZ()
}
Cú pháp vòng lặp
int $i = 0; while ($i < 9) { System.out.println ($i); $i += 1;
} // 9 times
int $i = 0; do { // once System.out.println ($i); $i += 1;
} while ($i <= 0);
for (int $i = 0; $i < 9; $i += 1) { System.out.println ($i);
} // 9 times
String $stringArray = { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; for (int $i : $stringArray) { System.out.println ($i);
} // 9 times
Ok.. chúng ta đã điểm qua hết những yếu tố Imperative
căn bản và kể từ bài viết tiếp theo chúng ta sẽ tập trung vào các yếu tố hỗ trợ OOP
mà Java
cung cấp.
[Object-Oriented + Java] Bài viết #2 - Class Members & Inheritance