0

[Java Backend Zero to Hello] BÀI 1.5: PHƯƠNG THỨC & TÁI SỬ DỤNG CODE

Java Backend Zero to Hello

📚 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ẵn
  • isPrime(int n) - kiểm tra số nguyên tố
  • sumArray(int[] arr) - tính tổng mảng
  • findMax(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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí