Gọi phương thức là cách thực thi mã lệnh trong phương thức đó.
Trong định nghĩa phương thức, bạn định định nghĩa thứ mà phương thức đó làm. Để thực thi phương thức, bạn phải call hoặc invoke nó. Có 2 cách để gọi một phương thức, tuỳ thuộc vào phương thức đó có trả về giá trị hay không.
Nếu phương thức trả về một giá trị, phương thức được gọi thường xem như một giá trị. Ví du:
int larger = max(3, 4);
Gọi max(3, 4) và gán kết quả trả về của phương thức cho biến larger.
Một ví dụ khác
System.out.println(max(3, 4));
Lệnh trên in giá trị trả về khi gọi phương thức max(3, 4).
Nếu phương thức trả về void, gọi phương thức phải là một câu lệnh. Ví dụ phương thức println trả về void. Dưới đây là minh hoạ:
System.out.println("Welcome to Java!");
Chú ý
Phương thứ trả về giá trị cũng có thể được gọi như một câu lệnh trong Java. Trong trường hợp này, nơi gọi bỏ qua giá trị trả về. Điều này thường không được thực hiện nhưng nó được phép nếu nơi gọi không quan tâm đến giá trị trả về.
Khi một chương trình gọi một phương thức, luồng điều khiển chương trình sẽ được chuyển sang cho phương thức được gọi. Phương thức được gọi trả quyền điều khiển cho nơi gọi nó khi câu lệnh return được thực thi hoặc khi gặp dấu } kết thúc phương thức.
Chương trình sử dụng phương thức max:
“`public class TestMax {
public static void main(String[] args) {
int i = 5;
int j = 2;
int k = max(i, j);
System.out.println(“The maximum of ” + i + ” and ” + j + ” is ” + k);
}
public static int max(int num1, int num2) {
int result;
if (num1 > num2) {
result = num1;
} else {
result = num2;
}
return result;
}
}“`
Chương trình này chứa phương thức main() và phương thức max(). Phương thức main() cũng giống như các phương thức thông thường khác, ngoại trừ một điểm khác biệt là nó được gọi bởi JVM để bắt đầu chương trình.
Nguyên mẫu của phương thức main: public static void main(String []args). Trong ví dụ này, nguyên mẫu của phương thức main gồm: các bổ từ public và static, kiểu dữ liệu trả về: void, tên phương thức main, và tham số truyền cho phương thức có kiểu mảng chuỗi: String []
Các lệnh trong main có thể gọi các phương thức khác được định nghĩa ngay trong chính lớp chứa phương thức main hoặc từ các lớp khác. Trong ví dụ này, phương thức main gọi phương thức max(i, j) được định nghĩa trong cùng một lớp với phương thức main.
Khi phương thức max được gọi, giá trị của biến i là 5 được chuyển đến biến num1, giá trị của biến j là 2 được chuyển đến biến num2 trong phương thức max. Quyền điều khiển được truyền sang cho phương thức max và phương thức max được thực thi. Khi gặp câu lệnh return trong phương thức max, phương thức max trả quyền điều khiển về cho nơi gọi nó (trong trường hợp này phương thức gọi nó là phương thức main). Quá trình này được minh hoạ trong hình sau:
Hình. Khi phương thức max được gọi, luồng điều khiển được chuyển đến nó. Sau khi thực thi gặp câu lệnh return sẽ trả quyền điều khiển về nơi đang gọi nó.
Lưu ý
Lệnh return là cần thiết cho một phương thức trả về giá trị. Phương thức được hiển thị bên dưới trong (a) là chính xác về mặt logic, nhưng nó có lỗi biên dịch vì trình biên dịch Java nghĩa rằng phương thức này có thể không trả lại giá trị.
Để khắc phục vấn đề này, xoá if (n < 0) trong (a), do đó, trình biên dịch sẽ thấy lệnh return bất kỳ lệnh if được đánh giá thế nào
Chú ý
Các phương thức cho phép chia sẻ mã lệnh và tái sử dụng lại. Phương thức max có thể được gọi từ bất kỳ lớp nào, không chỉ trong lớp TestMax. Nếu bạn tạo một lớp mới, bạn có thể gọi phương thức max bằng cách sử dụng ClassName.methodName (Ví dụ: TestMax.max).
Mỗi lần một phương thức được gọi, hệ thống sẽ tạo một bản ghi kích hoạt (activation record) chứa các tham số và các biến cho phương thức và đặt activation record vào một vùng bộ nhớ gọi la call stack. Một call stack cũng được biết đến như một execution stack, runtime stack hoặc machine stack, và nó thường được rút gọi thành stack. Khi một phương thức gọi một phương thức khác, activation record của phương thức gọi được giữ nguyên, và một activation record mới được tạo cho phương thức được gọi Khi một phương thức kết thúc công việc của nó và trả quyền điều khiển về cho nơi gọi nó, activation record của nó sẽ bị xoá khỏi call stack.
Một call stack chứa các activation record tại lần cuối cùng, lần đầu tiền được đưa ra: activation record cho phương thức được gọi cuối cùng bị xoá ngay lúc đầu từ stack. Ví dụ, giả sử phương thức m1 gọi phương thức m2, và phương thức m2 gọi phương thức m3. Khi hệ thông thực thi đẩy activation record của m1 vào stack, tiếp theo đến m2 và cuối cùng là m3. Sau khi m3 thực thi xong, activation record của nó được xoá khỏi stack. Sau khi m2 thực thi xong, activation record của nó được xoá khỏi stack. Sau khi m1 thực thi xong, activation record của nó được xoá khỏi stack.
Hiểu call stack giúp bạn hiểu rõ cách phương thức được gọi ra. Biến được định nghĩa trong phương thức main là i, j và k. Các biến được định nghĩa trong phương thức max là num1, num2 và result. Các biến num1 và num2 được định nghĩa trong method signature (tham số hình thức) và là các tham số của phương thức max. Giá trị của chúng được truyền qua lời gọi phương thức. Hình sau minh hoạ các activation record cho lời gọi phương thức trong stack.
Hình. Khi phương thức max được gọi, quyền điều khiển chuyển sang phương thức max. Khi việc thực thi phương thức max kết thúc, quyền điều khiển này sẽ trả lại cho nơi gọi nó.