Giới thiệu
Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu một số khái niệm cơ bản nhất trong Java, cách xây dựng và chạy một chương trình Java đơn giản. Việc hiểu các nội dung và tổng quan về một chương trình là tiền đề để tiếp cận các kiến thức phức tạp hơn và sự kết hợp giữa chúng sau này.
Bắt đầu một chương trình đơn giản
Trong phần này ta sẽ cùng nhau giải quyết một bài toán đơn giản, từ đó hiểu được cách xây dựng một chương trình sử dụng ngôn ngữ Java. Viết một chương trình tức là ta đang sử dụng ngôn ngữ lập trình để xây dựng giải pháp cho một vấn đề thực tế. Cụ thể hơn, ta cần phải xây dựng các thuật toán liên quan, các thuật toán này trước hết cần được phác thảo dưới dạng ngôn ngữ tự nhiên hay dạng mã giả (pseudocode). Với cách này, ta có thể nhanh chóng đánh giá được tính đúng đắn của thuật toán, phân tích độ phức tạp thời gian, độ phức tạp bộ nhớ, từ đó đưa ra được quyết định rằng có nên sử dụng thuật toán này không, có nên cài đặt chúng trong chương trình hay không.
Giả sử, ta có một yêu cầu sau: Xây dựng chương trình để tính toán thể tích của một khối lập phương. Độ dài cạnh của khối lập phương được nhập từ console.
Từ bài toán trên, ta xây dựng một tập các thao tác cần thực hiện như sau:
- Đọc input là độ dài cạnh của khối lập phương.
- Tính toán thể tích theo công thức:
volume = edge * edge * edge
- Hiển thị kết quả
Ta đã có thuật toán cơ bản cần thực hiện. Tiếp theo, ta cần chuyển thuật toán trên sang "dạng" các dòng code Với Java, để bắt đầu, ta cần định nghĩa một class sử dụng keyword class
cùng với tên của class đó, cụ thể:
public class ComputeVolume { // Algorithm
}
Tiếp theo, ta cần định nghĩa một hàm main để nói với rằng chương trình sẽ được thực thi từ đâu. ta sẽ có:
public class ComputeVolume { public static void main(String[] args) { // Algorithm }
}
Tiếp theo, chương trình cần đọc độ dài cạnh của hình lập phương từ input được nhập từ bàn phím. Ở đây, ta sẽ có 2 vấn đề chính:
- Đọc độ dài cạnh của hình lập phương
- Lưu dữ liệu độ dài cạnh hình lập phương vào đâu đó trong chương trình để thực hiện tính toán trong các bước tiếp theo
Để lưu dữ liệu độ dài cạnh hình lập phương ta cần khai báo một ký tự được gọi là biến (variable). Một biến này sẽ đại diện cho giá trị được lưu trong bộ nhớ máy tính. Ta có thể sử dụng các kí tự để đặt tên biến, tên biến cần tuân thủ một số quy tắc về syntax và cần đặt sao cho dễ nhớ, dễ hiểu (một người nhìn vào chương trình là biết được ý nghĩa, vai trò của biến đó). Trong chương trình này, ta sử dụng tên biến là edge cho độ dài cạnh hình lập phương và volume cho thể tích của khối lập phương đó. Chi tiết hơn về biến sẽ được đề cập trong phần sau của bài viết.
Trong chương trình, ta sử dụng biến để lưu các giá trị là số thực hay còn gọi là floating-point trong máy tính. Trong Java, ta sử dụng double để khai báo một biến floating. Chương trình hiện tại sẽ như sau:
public class ComputeVolume { public static void main(String[] args) { double edge; double volume; // Algorithm }
}
Cuối cùng, ta thực hiện tính toán thể tích khối lập phương và in ra kết quả:
public class ComputeVolume { public static void main(String[] args) { double edge; double volume; // Gan do dai canh la 18 edge = 18; // Tinh the tich volume = edge * edge * edge; // Hien thi ket qua System.out.println("The volume of cube is " + volume); }
}
Khi được khai báo ban đầu, hai biến edge
và volume
chưa có giá trị gì. Sau đó, biến edge
được gán giá trị là 18, còn biến volume
được tính toán ngay sau đó (có giá trị 18 * 18 * 18 = 5832.
Trong phần hiển thị kết quả thông qua đoạn code System.out.println
, việc in ra xâu thì dễ hiểu rồi nhưng dấu +
ở đây mang ý nghĩa gì? Dấu +
ngoài mang ý nghĩa cộng hai số, nó còn sử dụng để nối (concat) hai string lại với nhau. Nếu một string được nối với một số thì số đó được tự động biến đổi thành một string và nối với các string còn lại. Lưu ý rằng, việc nối string này phải được code trên cùng 1 dòng, nếu thực hiện xuống dòng thì chương trình sẽ báo lỗi.
Đọc dữ liệu đầu vào từ Console
Trong ví dụ trên, ta gán biến edge
bằng một giá trị cố định. Điều này trên thực tế lại không ổn nếu như giả sử ta viết một chương trình tính thể tích khối lập phương tổng quát với các độ dài cạnh khác nhau. Do vậy, cần một cách nào đó để ta có thể linh hoạt nhập độ dài cạnh và chương trình sẽ trả về kết quả. Trong Java, ta sẽ sử dụng Scanner
để nhập đầu vào từ console. Java sử dụng System.out
để chỉ thiết bị đầu ra tiêu chuẩn, mặc định là màn hình, còn System.in
để chỉ thiết bị đầu vào tiêu chuẩn, thường là bàn phím. Để nhập đầu vào từ console, ta cần lớp Scanner
để tạo một object đọc input từ System.in
như sau:
Scanner input = new Scanner(System.in);
new Scanner(System.in)
có nhiệm vụ tạo một object có type là Scanner
. input
có vai trò là một biến có type là Scanner
. Cả dòng code trên có ý nghĩa là tạo một object Scanner
và gán tham chiếu vào biến input
. Từ bây giờ, ta có thể gọi method của object vừa tạo. Ví dụ, ta có thể gọi method nextDouble()
để đọc một giá trị có type là double
như sau:
double edge = input.nextDouble();
Ta sẽ áp dụng vào trong chương trình tính thể tích khối lập phương như sau:
import java.util.Scanner; public class ComputeVolume { public static void main(String[] args) { Scanner input = new Scanner(System.in); // Nhap gia tri edge tu ban phim double edge = input.nextDouble(); double volume = edge * edge * edge; // Hien thi ket qua System.out.println("The volume of cube is " + volume); }
}
Ở trong chương trình trên, ta bổ sung thêm phần import class Scanner
từ package java.util
. Phần import này cần được đặt ở đầu chương trình. Ở đây, ta import một class cụ thể (Scanner
) từ java.util
. Nếu muốn import tất cả các class từ package java.util
, ta sử dụng dấu *
như sau import java.util.*;
. Hai cách import này không khác biệt nhiều về hiệu suất do chúng chỉ đơn giản thông báo với compiler rằng vị trí các class ở đâu.
Trong chương trình trên, ta thực hiện đọc đầu vào có type là Double từ bàn phím và gán cho biến edge
thông qua dòng code double edge = input.nextDouble();
Để đọc nhiều giá trị từ bàn phím, ta có thể code tương tự. Ví dụ:
double number1 = input.nextDouble();
double number2 = input.nextDouble();
double number3 = input.nextDouble();
Tuy nhiên, nếu đầu vào không phải là giá trị số, ta có thể gặp lỗi runtime error. Trong các bài viết tiếp theo, ta sẽ bàn về cách xử lý các ngoại lệ trong chương trình.
Lời kết
Trong bài viết này, chúng ta đã có cái nhìn tổng quan về một chương trình Java. Chúng ta đã tìm hiểu về cấu trúc cơ bản của một chương trình Java và các thành phần chính của nó. Điều này sẽ giúp xây dựng nền tảng vững chắc để khám phá những khía cạnh phức tạp hơn của ngôn ngữ lập trình Java trong các bài viết tiếp theo. Ngôn ngữ Java không chỉ dừng lại ở mức cơ bản. Nó có rất nhiều tính năng và thư viện mạnh mẽ cho phép bạn xây dựng các ứng dụng phức tạp, từ ứng dụng máy tính đơn giản đến các hệ thống phân tán và ứng dụng di động. Trong các bài viết tiếp theo, chúng ta sẽ đi sâu hơn vào các chủ đề như đối tượng và lập trình hướng đối tượng, xử lý ngoại lệ, đọc và ghi dữ liệu, và nhiều khía cạnh khác của ngôn ngữ Java.