.java
chứa mã nguồn JAVA.java
chứa ít nhất một classmain
// file HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
public class HelloWorld
: Định nghĩa một class có tên HelloWorldpublic static void main(String[] args)
: Phương thức main - điểm bắt đầu của chương trìnhSystem.out.println()
: Lệnh in ra màn hìnhHelloWorld
, StudentManager
studentName
, calculateTotal
MAX_SIZE
, PI_VALUE
javac
để biên dịch mã nguồn thành bytecodejava
để chạy chương trìnhjavac HelloWorld.java # Biên dịch
java HelloWorld # Chạy chương trình
Hello, World!
.java
và nhấn Ctrl + F5
để biên dịch và chạy chương trình.Scanner
từ package java.util
để đọc dữ liệu đầu vào:import java.util.Scanner;
public class InputExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Nhập tên: ");
String name = scanner.nextLine();
System.out.print("Nhập tuổi: ");
int age = scanner.nextInt();
System.out.println("Tên bạn là: " + name);
System.out.println("Tuổi bạn là: " + age);
scanner.close(); // Đóng Scanner để giải phóng tài nguyên
}
}
Kết quả:
Nhập tên: Nguyen Van A
Nhập tuổi: 25
Tên bạn là: Nguyen Van A
Tuổi bạn là: 25
Phương thức | Kiểu dữ liệu | Mô tả |
---|---|---|
nextInt() |
int |
Đọc số nguyên |
nextDouble() |
double |
Đọc số thực |
nextBoolean() |
boolean |
Đọc giá trị logic (true/false) |
next() |
String |
Đọc một từ (đến khoảng trắng) |
nextLine() |
String |
Đọc một dòng hoàn chỉnh |
Vấn đề buffer line feed:
Khi sử dụng nextInt()
, nextDouble()
hoặc các phương thức tương tự, ký tự xuống dòng (\n
) vẫn còn trong buffer đầu vào. Nếu sau đó gọi nextLine()
, nó sẽ đọc ký tự xuống dòng này thay vì đọc đầu vào mới.
int number = scanner.nextInt(); // Nhập số
scanner.nextLine(); // Đọc ký tự xuống dòng còn lại
String text = scanner.nextLine(); // Nhập văn bản mới
Đọc nhiều giá trị trên một dòng:
// Phương pháp 1: Nhập chuỗi và phân tách
String input = scanner.nextLine(); // Ví dụ: "10 20 30"
String[] values = input.split(" "); // Tách chuỗi thành mảng
int a = Integer.parseInt(values[0]); // 10
int b = Integer.parseInt(values[1]); // 20
// Phương pháp 2: Sử dụng next() liên tiếp
int x = scanner.nextInt(); // Đọc số đầu tiên
int y = scanner.nextInt(); // Đọc số tiếp theo
Xử lý ngoại lệ:
Khi người dùng nhập không đúng định dạng, cần xử lý để tránh chương trình bị crash:
try {
int number = scanner.nextInt();
} catch (InputMismatchException e) {
System.out.println("Vui lòng nhập số nguyên!");
scanner.nextLine(); // Xóa đầu vào không hợp lệ
}
Phương pháp nhập liệu an toàn:
Scanner scanner = new Scanner(System.in);
int number = 0;
boolean validInput = false;
while (!validInput) {
System.out.print("Nhập số nguyên: ");
try {
number = Integer.parseInt(scanner.nextLine());
validInput = true;
} catch (NumberFormatException e) {
System.out.println("Lỗi: Vui lòng nhập một số nguyên hợp lệ!");
}
}
Lưu ý quan trọng: Luôn đóng Scanner bằng phương thức close()
khi không còn sử dụng để tránh rò rỉ tài nguyên.
Java cung cấp nhiều cách để hiển thị dữ liệu ra màn hình console:
// In và xuống dòng
System.out.println("Hello World"); // In "Hello World" và xuống dòng mới
// In không xuống dòng
System.out.print("Hello "); // In "Hello " và không xuống dòng
System.out.print("World"); // In "World" tiếp tục sau "Hello "
// In theo định dạng (giống printf trong C)
System.out.printf("Xin chào %s, bạn %d tuổi", "Nam", 25);
int age = 25;
double height = 1.75;
String name = "Nguyen Van A";
// Nối chuỗi với dấu +
System.out.println("Tên: " + name + ", Tuổi: " + age + ", Chiều cao: " + height + "m");
// Sử dụng String.format
String info = String.format("Tên: %s, Tuổi: %d, Chiều cao: %.2fm", name, age, height);
System.out.println(info);
// Sử dụng printf
System.out.printf("Tên: %s, Tuổi: %d, Chiều cao: %.2fm\n", name, age, height);
Định dạng | Mô tả | Ví dụ |
---|---|---|
%d |
Số nguyên | %d → 123 |
%f |
Số thực | %f → 123.456000 |
%.2f |
Số thực (giới hạn chữ số thập phân) | %.2f → 123.46 |
%s |
Chuỗi | %s → Hello |
%c |
Ký tự | %c → A |
%b |
Boolean | %b → true |
%n |
Xuống dòng | %n → newline |
%% |
Dấu phần trăm | %% → % |
// Định dạng số
System.out.printf("Số nguyên: %d\n", 1234); // 1234
System.out.printf("Số nguyên (căn lề phải 8 ký tự): %8d\n", 1234); // " 1234"
System.out.printf("Số nguyên (căn lề trái 8 ký tự): %-8d\n", 1234); // "1234 "
System.out.printf("Số nguyên (thêm số 0): %08d\n", 1234); // "00001234"
// Định dạng số thực
System.out.printf("Số thực: %f\n", 12.34); // 12.340000
System.out.printf("Số thực (làm tròn 2 chữ số): %.2f\n", 12.34567); // 12.35
System.out.printf("Tiền tệ: %,.2f đ\n", 1234567.89); // 1,234,567.89 đ
// Định dạng chuỗi
System.out.printf("Chuỗi: %s\n", "Hello"); // Hello
System.out.printf("Chuỗi (viết hoa): %S\n", "Hello"); // HELLO
System.out.printf("Chuỗi (căn lề phải 10 ký tự): %10s\n", "Hello"); // " Hello"
System.out.printf("Chuỗi (căn lề trái 10 ký tự): %-10s\n", "Hello"); // "Hello "
Java cũng cung cấp class Formatter
để định dạng chuỗi:
String formatted = String.format("Chào %s, bạn đã đạt %.1f điểm", "Nam", 8.5);
System.out.println(formatted); // Chào Nam, bạn đã đạt 8.5 điểm
// Định dạng ngày tháng
import java.util.Date;
System.out.printf("Hôm nay là: %tD\n", new Date()); // MM/dd/yy format
Lưu ý: Từ Java 15 trở đi, bạn có thể sử dụng text blocks (chuỗi nhiều dòng) với cú pháp """..."""
:
// Từ Java 15+
String html = """
<html>
<body>
<h1>Xin chào!</h1>
</body>
</html>
""";
System.out.println(html);
int age = 25; // Số nguyên
double salary = 5000.50; // Số thực
char grade = 'A'; // Ký tự
boolean isActive = true; // Giá trị logic
String name = "Nguyen Van A"; // Chuỗi ký tự
int[] numbers = {1, 2, 3, 4}; // Mảng số nguyên
Đối với kiểu nguyên thủy, giá trị được lưu trực tiếp trong biến. Đối với kiểu tham chiếu, biến lưu địa chỉ trỏ đến dữ liệu thực.
┌─────────────┐
│ Biến: age │
├─────────────┤
│ 25 │ ◄── Giá trị được lưu trong ô nhớ
└─────────────┘
┌───────────────┐
│ Biến: salary │
├───────────────┤
│ 5000.50 │
└───────────────┘
┌───────────────┐
│ Biến: name │
├───────────────┤
│ 0x12AB34CD │ ◄── Địa chỉ (tham chiếu) đến vùng nhớ khác
└───────────────┘
│
▼
┌───────────────────────┐
│ "Nguyen Van A" │ ◄── Dữ liệu thực tế nằm ở vùng nhớ khác
└───────────────────────┘
// Khai báo và khởi tạo sau
int count;
count = 10;
// Khai báo và khởi tạo cùng lúc
double price = 19.99;
// Khai báo nhiều biến cùng kiểu
int x = 1, y = 2, z = 3;
// Ép kiểu ngầm định (mở rộng) - không mất dữ liệu
int num = 10;
double numDouble = num; // 10.0
// Ép kiểu tường minh (thu hẹp) - có thể mất dữ liệu
double pi = 3.14;
int wholePi = (int) pi; // 3
+
, -
, *
, /
, %
==
, !=
, >
, <
, >=
, <=
&&
, ||
, !
int a = 10, b = 3;
int sum = a + b; // 13
int difference = a - b; // 7
int product = a * b; // 30
int quotient = a / b; // 3 (phần nguyên)
int remainder = a % b; // 1 (phần dư)
// Toán tử tăng/giảm
int i = 5;
i++; // i = 6 (tăng sau)
++i; // i = 7 (tăng trước)
i--; // i = 6 (giảm sau)
--i; // i = 5 (giảm trước)
int x = 10;
x += 5; // x = x + 5 = 15
x -= 3; // x = x - 3 = 12
x *= 2; // x = x * 2 = 24
x /= 4; // x = x / 4 = 6
x %= 4; // x = x % 4 = 2
int p = 10, q = 20;
boolean isEqual = (p == q); // false
boolean isNotEqual = (p != q); // true
boolean isGreater = (p > q); // false
boolean isLess = (p < q); // true
boolean isGreaterOrEqual = (p >= q); // false
boolean isLessOrEqual = (p <= q); // true
boolean condition1 = true;
boolean condition2 = false;
boolean andResult = condition1 && condition2; // false
boolean orResult = condition1 || condition2; // true
boolean notResult = !condition1; // false
++
, --
), phủ định (!
)*
, /
, %
)+
, -
)<
, >
, <=
, >=
)==
, !=
)&&
)||
)=
, +=
, -=
, *=
, /=
, %=
)int result = 5 + 3 * 2; // 5 + 6 = 11 (nhân trước, cộng sau)
int result2 = (5 + 3) * 2; // 8 * 2 = 16 (dấu ngoặc ưu tiên cao nhất)
int age = 18;
// Câu lệnh if đơn
if (age >= 18) {
System.out.println("Bạn đã đủ tuổi bầu cử");
}
// Câu lệnh if-else
if (age >= 18) {
System.out.println("Bạn đã đủ tuổi bầu cử");
} else {
System.out.println("Bạn chưa đủ tuổi bầu cử");
}
// Câu lệnh if-else if-else
int score = 75;
if (score >= 90) {
System.out.println("Xuất sắc");
} else if (score >= 80) {
System.out.println("Giỏi");
} else if (score >= 70) {
System.out.println("Khá");
} else if (score >= 60) {
System.out.println("Trung bình");
} else {
System.out.println("Yếu");
}
int day = 3;
String dayName;
switch (day) {
case 1:
dayName = "Chủ nhật";
break;
case 2:
dayName = "Thứ hai";
break;
case 3:
dayName = "Thứ ba";
break;
case 4:
dayName = "Thứ tư";
break;
case 5:
dayName = "Thứ năm";
break;
case 6:
dayName = "Thứ sáu";
break;
case 7:
dayName = "Thứ bảy";
break;
default:
dayName = "Ngày không hợp lệ";
}
System.out.println("Hôm nay là " + dayName); // Hôm nay là Thứ ba
int day = 3;
String dayType = switch (day) {
case 1, 7 -> "Cuối tuần";
case 2, 3, 4, 5, 6 -> "Ngày làm việc";
default -> "Ngày không hợp lệ";
};
int age = 25;
boolean hasID = true;
boolean isResident = true;
// Sử dụng AND (&&)
if (age >= 18 && hasID) {
System.out.println("Bạn có thể bỏ phiếu");
}
// Sử dụng OR (||)
if (isResident || age >= 65) {
System.out.println("Bạn được giảm giá vé");
}
// Kết hợp nhiều điều kiện
if ((age >= 18 && hasID) || (isResident && age >= 65)) {
System.out.println("Bạn có đặc quyền");
}
int age = 20;
String status = (age >= 18) ? "Đã trưởng thành" : "Chưa trưởng thành";
System.out.println(status); // Đã trưởng thành
// In các số từ 1 đến 5
for (int i = 1; i <= 5; i++) {
System.out.println(i);
}
// Tính tổng các số từ 1 đến 10
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += i;
}
System.out.println("Tổng: " + sum); // Tổng: 55
// Vòng lặp for cải tiến (for-each) - duyệt mảng/collection
int[] numbers = {1, 2, 3, 4, 5};
for (int num : numbers) {
System.out.println(num);
}
// In các số từ 1 đến 5
int i = 1;
while (i <= 5) {
System.out.println(i);
i++;
}
// Tìm số đầu tiên chia hết cho cả 3 và 5
int num = 1;
// Kiểm tra điều kiện trước rồi mới thực hiện
while (num <= 100) {
if (num % 3 == 0 && num % 5 == 0) {
System.out.println("Số đầu tiên chia hết cho cả 3 và 5: " + num);
break;
}
num++;
}
// In các số từ 1 đến 5
int i = 1;
do {
System.out.println(i);
i++;
} while (i <= 5);
// Mô phỏng menu lựa chọn
int choice;
// Thực hiện ít nhất một lần rồi mới kiểm tra điều kiện
do {
System.out.println("\nMenu:");
System.out.println("1. Xem danh sách");
System.out.println("2. Thêm mới");
System.out.println("3. Xóa");
System.out.println("0. Thoát");
choice = 1; // Giả sử người dùng chọn 1
switch (choice) {
case 1:
System.out.println("Đang hiển thị danh sách...");
break;
case 2:
System.out.println("Đang thêm mới...");
break;
case 3:
System.out.println("Đang xóa...");
break;
case 0:
System.out.println("Đang thoát...");
break;
default:
System.out.println("Lựa chọn không hợp lệ!");
}
} while (choice != 0);
// Sử dụng break để thoát khỏi vòng lặp
for (int i = 1; i <= 10; i++) {
if (i == 5) {
break; // Thoát khỏi vòng lặp khi i = 5
}
System.out.println(i); // In: 1, 2, 3, 4
}
// Sử dụng continue để bỏ qua lần lặp hiện tại
for (int i = 1; i <= 5; i++) {
if (i == 3) {
continue; // Bỏ qua lần lặp khi i = 3
}
System.out.println(i); // In: 1, 2, 4, 5
}
// Vòng lặp lồng nhau với nhãn (label)
outerLoop: for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (i * j > 5) {
break outerLoop; // Thoát khỏi cả vòng lặp ngoài
}
System.out.println(i + " * " + j + " = " + (i * j));
}
}
Viết chương trình cho phép người dùng:
CHƯƠNG TRÌNH QUẢN LÝ ĐIỂM SINH VIÊN
-----------------------------------
Nhập tên sinh viên: Nguyễn Văn A
Nhập điểm Toán: 8.5
Nhập điểm Lý: 7.5
Nhập điểm Hóa: 9.0
KẾT QUẢ XẾP LOẠI
-----------------------------------
Sinh viên: Nguyễn Văn A
Điểm Toán: 8.5
Điểm Lý: 7.5
Điểm Hóa: 9.0
Điểm trung bình: 8.33
Xếp loại: Giỏi
⬅️ Trở lại: INTRODUCTION.md | 🏠 Home | ➡️ Tiếp theo: JAVA/Part2.md