1. Giới thiệu về tham số trong Java

Tham số của phương thức là những là những biến được khai báo trong khai báo phương thức. Nó đóng vai trò là một giá trị đầu vào cho phương thức. Trong Java có 2 cách để truyền tham số

  • Tham trị – By Value : Khi các đối số được truyền bằng giá trị cho một method, nó có nghĩa là một bản sao của biến ban đầu đang được truyền đến method và đó không phải là bản gốc, do đó bất kỳ thay đổi nào được áp dụng bên trong method thực ra là nó đang ảnh hưởng đến bản sao.
  • Tham chiếu – By Reference : Khi các đối số được truyền bằng tham chiếu, nó có nghĩa là một tham chiếu hoặc một con trỏ đến biến ban đầu đang được truyền đến method chứ không phải là dữ liệu biến ban đầu.

Chú ý

Ngôn ngữ Java không có khái niệm con trỏ (pointer) như trong C để tránh các trường hợp không kiểm soát tốt việc truy xuất trực tiếp đến bộ nhớ dẫn đến gây lỗi chương trình. Điều này cũng giúp lập trình viên cảm thấy Java dễ hiểu, dễ học hơn C. Và do Java không hỗ trợ con trỏ nên không có cách truyền địa chỉ cho phương thức như trong C.

2. Truyền tham số cho phương thức trong Java

Thông tin có thể được truyền cho các phương thức dưới dạng tham số. Các tham số hoạt động như các biến bên trong phương thức. Vì thế mà tham số được chỉ định sau tên phương thức, bên trong dấu ngoặc đơn. Ta có thể thêm bao nhiêu tham số tùy thích, chỉ cần phân tách chúng bằng dấu phẩy.

Ví dụ: phương thức lấy một tham số String được gọi là fname. Khi phương thức được gọi truyền một tên đầu tiên, được sử dụng bên trong phương thức để in tên đầy đủ:

class Main {
  static void myMethod(String fname) {
    System.out.println(fname + " Refsnes");
  }

  public static void main(String[] args) {
    myMethod("Thành");
    myMethod("Nam");
    myMethod("Sơn");
  }
}

Kết quả

Thành Refsnes
Nam Refsnes
Sơn Refsnes

Khi một tham số được truyền cho phương thức, nó được gọi là một đối số . Vì vậy, từ ví dụ trên: fname là một tham số của Liam, trong khi JennyAnja là các đối số.

Ta cũng có thể truyền nhiều tham số tùy thích

public class Main {
  static void myMethod(String fname, int age) {
    System.out.println(fname + " is " + age);
  }

  public static void main(String[] args) {
    myMethod("Thành", 19);
    myMethod("Nam", 20);
    myMethod("Sơn", 22);
  }
}

Kết quả

Thành is 19
Nam is 20
Sơn is 22

Lưu ý

Khi ta đang làm việc với nhiều tham số, lời gọi phương thức phải có cùng số đối số vì có tham số và các đối số phải được truyền theo cùng một thứ tự.

3. Truyền tham trị trong Java

Trong Java, khi gọi một phương thức và truyền một giá trị cho phương thức, được gọi là truyền tham trị. Việc thay đổi giá trị chỉ có hiệu lực trong phương thức được gọi, không có hiệu lực bên ngoài phương thức. Bởi vì nó chỉ tác động đến bản sao giá trị chứ không phải địa chỉ bên trong bộ nhớ.

Kiểu này dành cho các biến, các tham số khai báo kiểu dữ liệu cơ bản nguyên thủy gồm : byte , short , int , long , float , double , char .

Ví dụ:

class Main {
    /*Hoán đổi 2 biến*/
    public static void swap(int n1, int n2) {
        System.out.println("\tGia tri cac bien ben trong ham swap");
        System.out.println("\t\tTruoc khi swap, n1 = " + n1 + " va n2 = " + n2);
        // Swap n1 with n2
        int temp = n1;
        n1 = n2;
        n2 = temp;
        System.out.println("\t\tSau khi swap, n1 = " + n1 + " va n2 = " + n2);
    }
    public static void main(String[] args) {
        int num1 = 1;
        int num2 = 2;
        System.out.println("Truoc khi goi ham swap, num1 = " + num1 + " va num2 = " + num2);
        swap(num1, num2);
        System.out.println("Sau khi goi ham swap, num1 = " + num1 + " va num2 = " + num2);
    }
}

Kết quả

Truoc khi goi ham swap, num1 = 1 va num2 = 2
    Gia tri cac bien ben trong ham swap
        Truoc khi swap, n1 = 1 va n2 = 2
        Sau khi swap, n1 = 2 va n2 = 1
Sau khi goi ham swap, num1 = 1 va num2 = 2

4. Truyền tham chiếu trong Java

Trong Java, khi gọi một phương thức và truyền một tham chiếu cho phương thức, được gọi là truyền tham chiếu. Việc thay đổi giá trị của biến tham chiếu bên trong phương thức làm thay đổi giá trị gốc của nó.

Trong Java, tất các phương thức có tham số là biến có kiểu là các lớp (class) đều là kiểu tham chiếu.

Ví dụ:

class Main {
    int data;
    Main(int dataValue){
        data = dataValue;
    }
    /*Hoán đổi 2 biến*/
    public static void swap(Main n1, Main n2) {
        System.out.println("\tGia tri cac bien ben trong ham swap");
        System.out.println("\t\tTruoc khi swap, n1.data = " + n1.data + " va n2.data = " + n2.data);
        // Swap n1.data with n2.data
        int temp = n1.data;
        n1.data = n2.data;
        n2.data = temp;
        System.out.println("\t\tSau khi swap, n1.data = " + n1.data + " va n2.data = " + n2.data);
    }
    public static void main(String[] args) {
        Main n1 = new Main(1);
        Main n2 = new Main(2);
        System.out.println("Truoc khi goi ham swap, n1.data = " + n1.data + " va n2.data = " + n2.data);
        swap(n1, n2);
        System.out.println("Sau khi goi ham swap, n1.data = " + n1.data + " va n2.data = " + n2.data);
    }
}

Kết quả

Truoc khi goi ham swap, n1.data = 1 va n2.data = 2
    Gia tri cac bien ben trong ham swap
        Truoc khi swap, n1.data = 1 va n2.data = 2
        Sau khi swap, n1.data = 2 va n2.data = 1
Sau khi goi ham swap, n1.data = 2 va n2.data = 1

5. Giá trị trả về

Nếu không muốn có giá trị trả về thì từ khóa void cho phép chúng ta tạo các phương thức mà không trả về giá trị nào.

Còn nếu ta muốn phương thức trả về một giá trị, ta có thể sử dụng kiểu dữ liệu nguyên thủy (chẳng hạn như int, char,…) thay vì void và sử dụng từ khóa return bên trong phương thức

Ví dụ:

public class Main {
  static int myMethod(int x) {
    return 5 + x;
  }

  public static void main(String[] args) {
    System.out.println(myMethod(3));
  }
}

Kết quả

8

Ví dụ này trả về tổng của hai tham số của một phương thức :

public class Main {
  static int myMethod(int x, int y) {
    return x + y;
  }

  public static void main(String[] args) {
    System.out.println(myMethod(5, 3));
  }
}

Kết quả

8

Cũng có thể lưu trữ kết quả trong một biến (được khuyến nghị, vì nó dễ đọc và dễ bảo trì hơn):

public class Main {
  static int myMethod(int x, int y) {
    return x + y;
  }

  public static void main(String[] args) {
    int z = myMethod(5, 3);
    System.out.println(z);
  }
}

Kết quả

8