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 Jenny và Anja 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