[Java Backend Zero to Hello] BÀI 1.5: PHƯƠNG THỨC & TÁI SỬ DỤNG CODE
📚 Bài viết thuộc series Java Backend Zero to Hello 📌 Phần: Phase 1: Java Core Cơ Bản | Bài 7/86
BÀI 1.5: PHƯƠNG THỨC & TÁI SỬ DỤNG CODE
Mục tiêu
- Khai báo và gọi phương thức
- Phân biệt tham số và giá trị trả về
- Nắm vững overloading và recursion
- Hiểu pass-by-value trong Java
1. PHƯƠNG THỨC (METHOD)
Phương thức là khối code thực hiện một chức năng cụ thể, giúp tái sử dụng code.
1.1 Cú pháp
[access modifier] [static] <return type> <tên phương thức>([parameters]) {
// thân phương thức
return <giá trị>; // nếu return type khác void
}
1.2 Ví dụ cơ bản
public class Calculator {
// Phương thức không trả về (void)
public static void sayHello() {
System.out.println("Hello!");
}
// Phương thức có tham số
public static void greet(String name) {
System.out.println("Hello, " + name);
}
// Phương thức có giá trị trả về
public static int add(int a, int b) {
return a + b;
}
public static void main(String[] args) {
sayHello(); // Hello!
greet("Nguyễn Văn A"); // Hello, Nguyễn Văn A
int sum = add(5, 3); // 8
System.out.println(sum);
}
}
2. CÁC THÀNH PHẦN
2.1 Access Modifier (Phạm vi truy cập)
| Modifier | Cùng class | Cùng package | Subclass | Khác package |
|---|---|---|---|---|
private |
✅ | ❌ | ❌ | ❌ |
| (default) | ✅ | ✅ | ❌ | ❌ |
protected |
✅ | ✅ | ✅ | ❌ |
public |
✅ | ✅ | ✅ | ✅ |
2.2 Tham số (Parameters) vs Đối số (Arguments)
public static int multiply(int a, int b) { // a, b là parameters
return a * b;
}
int result = multiply(5, 3); // 5, 3 là arguments
2.3 Return statement
public static int max(int a, int b) {
if (a > b) {
return a; // Trả về và thoát method
}
return b; // Trả về b
}
// Return sớm để thoát method
public static void checkAge(int age) {
if (age < 0) {
System.out.println("Tuổi không hợp lệ");
return; // Thoát method
}
System.out.println("Tuổi: " + age);
}
3. METHOD OVERLOADING (Nạp chồng phương thức)
Nhiều phương thức cùng tên nhưng khác tham số (số lượng hoặc kiểu).
public class MathUtil {
public static int add(int a, int b) {
return a + b;
}
public static int add(int a, int b, int c) { // Khác số tham số
return a + b + c;
}
public static double add(double a, double b) { // Khác kiểu tham số
return a + b;
}
public static String add(String a, String b) { // Khác kiểu
return a + b;
}
}
⚠️ Không thể overload chỉ bằng cách đổi kiểu trả về.
4. VARARGS (Java 5+)
Cho phép truyền số lượng tham số không xác định.
public static int sum(int... numbers) {
int total = 0;
for (int num : numbers) {
total += num;
}
return total;
}
sum(1, 2); // 3
sum(1, 2, 3, 4, 5); // 15
sum(); // 0
Varargs phải là tham số cuối cùng và chỉ có một varargs.
5. PASS-BY-VALUE TRONG JAVA
Java luôn truyền tham chiếu bằng giá trị (pass-by-value).
Với primitive
public static void changeValue(int x) {
x = 100; // Chỉ thay đổi bản sao
}
int a = 10;
changeValue(a);
System.out.println(a); // 10 - không đổi
Với object
public static void changeArray(int[] arr) {
arr[0] = 99; // Thay đổi phần tử → ảnh hưởng object gốc
}
int[] numbers = {1, 2, 3};
changeArray(numbers);
System.out.println(numbers[0]); // 99 - đã đổi
Tham chiếu bị thay đổi
public static void reassign(int[] arr) {
arr = new int[]{99, 99, 99}; // Tạo object mới, tham chiếu cục bộ thay đổi
}
int[] numbers = {1, 2, 3};
reassign(numbers);
System.out.println(numbers[0]); // 1 - không đổi
6. ĐỆ QUY (RECURSION)
Phương thức gọi lại chính nó.
6.1 Ví dụ: Giai thừa
public static int factorial(int n) {
if (n <= 1) return 1; // Base case - điều kiện dừng
return n * factorial(n - 1); // Recursive case
}
factorial(5); // 5 * 4 * 3 * 2 * 1 = 120
6.2 Ví dụ: Fibonacci
public static int fibonacci(int n) {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
6.3 Ví dụ: Tính tổng mảng
public static int sumArray(int[] arr, int index) {
if (index >= arr.length) return 0;
return arr[index] + sumArray(arr, index + 1);
}
6.4 Lưu ý khi dùng đệ quy
- Phải có base case để tránh vòng lặp vô hạn
- Có thể gây StackOverflowError nếu đệ quy quá sâu
- Một số bài toán có thể dùng vòng lặp thay thế (hiệu quả hơn)
7. PHƯƠNG THỨC STATIC vs INSTANCE
Static method
- Thuộc về class, không cần tạo object
- Gọi qua
ClassName.method() - Không thể truy cập biến instance
public class MathHelper {
public static int square(int x) {
return x * x;
}
}
// Gọi
int result = MathHelper.square(5); // 25
Instance method
- Thuộc về object, cần tạo object mới gọi được
- Có thể truy cập biến instance
public class User {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
// Gọi
User user = new User();
user.setName("An");
user.getName();
8. MAIN METHOD
public static void main(String[] args) {
// args là tham số dòng lệnh
if (args.length > 0) {
System.out.println("Tham số đầu tiên: " + args[0]);
}
}
Chạy với tham số:
java MyProgram hello world
9. BÀI TẬP THỰC HÀNH
Bài 1: Phương thức tiện ích
Viết các phương thức static:
isEven(int n)- kiểm tra số chẵnisPrime(int n)- kiểm tra số nguyên tốsumArray(int[] arr)- tính tổng mảngfindMax(int[] arr)- tìm phần tử lớn nhất
Bài 2: Overloading
Viết phương thức area() cho hình tròn, hình chữ nhật, hình tam giác.
Bài 3: Đệ quy
- Tính tổng các chữ số của số nguyên
- Tính lũy thừa
a^n - Tìm UCLN bằng đệ quy (Euclid)
Bài 4: Varargs
Viết phương thức average(double... numbers) tính trung bình cộng.
10. TÓM TẮT
| Khái niệm | Điểm chính |
|---|---|
| Method | Khối code có tên, có thể tái sử dụng |
| Overloading | Cùng tên, khác tham số |
| Varargs | int... numbers - số lượng tham số linh hoạt |
| Pass-by-value | Java luôn truyền bản sao giá trị |
| Recursion | Method gọi chính nó, cần base case |
| Static method | Thuộc class, gọi qua Class.method() |
| Instance method | Thuộc object, cần new |
Bài tiếp theo: 1.6 Lập trình hướng đối tượng (OOP)
🧭 Điều Hướng Series
⬅️ Bài trước: BÀI 1.4: MẢNG & STRING
📋 Lộ trình tổng quan: Xem Toàn Bộ Series
➡️ Bài tiếp theo: BÀI 1.6: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG (OOP) - CƠ BẢN
All rights reserved