Method

Duy Văn | 10/03/2025


Ở phía Java, mọi thứ đều thuộc về class, nên tất cả các hàm đều sẽ là method, chứ không như Python có thể có function nằm ngoài class

Định nghĩa method

Một method cần phải được định nghĩa trong class, có một tên và lấy vào biến hoặc không

public class Main{
  static void myMethod(){
    // do something
  }
}

Gọi method

Sau khi đã có method được tạo ra thì chúng ta có thể gọi nó ở dưới trong method main

public class Main{
  static void myMethod(){
    // do something
  }
  public static void main(String[] args){
    myMethod();
  }
}

Param và argument

Param là các biến mà method lấy vào, argument là giá trị mà chúng ta truyền vào method khi cho gọi các method

public class Main {
    static void printNumber(int num){ //num là param
        System.out.println("Number is: " + num);
    }
    public static void main(String[] args){
        printNumber(5); //5 là argument
    }
}

Việc định nghĩa param trên method sẽ yêu cầu phải nêu cả loại dữ liệu và tên biến, còn khi gọi method thì chỉ cần truyền giá trị vào

Lưu ý là arg truyền vào phải đúng với loại dữ liệu của param, nếu không thì Java sẽ báo lỗi error incompatible types

Ngoài ra, method cũng có thể lấy vào nhiều param, ví dụ ở dưới sẽ lấy vào một param dạng String và một dạng số

public class Main {
    static void printNumber(int num, String pronounce){
        System.out.println("Number is: " + num + " and pronounce is: " + pronounce);
    }
    public static void main(String[] args){
        printNumber(5, "Five");
    }
}

Đồng thời chúng ta cũng có thể truyền vào cả một array

```java
public class Main {
    static void printArray(int[] arr){
        for(int i = 0; i < arr.length; i++){
            System.out.println(arr[i]);
        }
    }
    public static void main(String[] args){
        int[] arr = {1, 2, 3, 4, 5};
        printArray(arr);
    }
}

Return

Khi làm việc với các method, chúng ta sẽ phải để các method này trả về giá trị, nếu không trả về thì mặc định hiểu trả về void, vậy thì cú pháp sẽ là

public class Main {
    static void myMethod(){
        // do something
    }
    public static void main(String[] args){
        myMethod();
    }
}

Nhưng nếu chúng ta cần một method trả ra tổng của 2 số nguyên

public class Main {
    static int sum(int a, int b){
        return a + b;
    }
    public static void main(String[] args){
        System.out.println(sum(5, 10));
    }
}

Ở định nghĩa method chúng ta cần nêu rõ kiểu dữ liệu trả ra là gì, trong tình huống này thì tổng 2 số nguyên là một số nguyên nên chúng ta sẽ dùng int, trong method sẽ có return để trả ra giá trị

Overloading

Trong Java, vì chúng ta định nghĩa rõ kiểu dữ liệu truyền vào và trả ra nên Java cho phép Overloading các method

Các method có thể trùng tên nhưng nếu signature của chúng khác nhau thì vẫn được phép cùng tồn tại, ví dụ

public class Main {
    static int sum(int a, int b){
        return a + b;
    }
    static double sum(double a, double b){
        return a + b;
    }
    public static void main(String[] args){
        System.out.println(sum(5, 10));
        System.out.println(sum(5.5, 10.5));
    }
}

Khi method được gọi, thì Java sẽ kiểm tra signature của nó trong khâu compile time, nếu không tìm thấy thì sẽ báo lỗi error: no suitable method found

Scope

Một biến khi được khai báo bên trong method sẽ có thể được sử dụng ở bất kỳ đâu trong method nhưng không phải bên ngoài

Recursion

Đệ quy - hay còn gọi là recursion - là một kỹ thuật lập trình mà một method gọi chính nó, ví dụ

public class Main {
    static int factorial(int n){
        if(n == 0){
            return 1;
        }
        return n * factorial(n - 1);
    }
    public static void main(String[] args){
        System.out.println(factorial(5));
    }
}

Khi sử dụng recursion, cần chú ý để tránh trường hợp gọi method vô hạn bằng cách sử dụng các điều kiện dừng - halting condition, ở phần code trên thì mình đã sử dụng nếu n = 0 thì trả về 1