Menu

Phương thức trong Java: cách khai báo và gọi phương thức

Phương thức trong Java là gì, cách khai báo và gọi phương thức, giá trị trả về và void, phương thức static main, và cách phương thức giúp code gọn gàng, dùng lại được.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

Vì sao cần phương thức

Phương thức (method) là một khối code có tên mà bạn chạy mỗi khi gọi tên nó. Thay vì viết đi viết lại cùng những dòng code, bạn viết chúng một lần trong một phương thức rồi gọi bao nhiêu lần tùy ý. Nhờ vậy chương trình ngắn hơn, dễ đọc hơn và dễ sửa hơn rất nhiều: sửa logic ở một chỗ, mọi nơi gọi đều được cập nhật.

Bạn thật ra đã gọi phương thức từ trước: System.out.println(...) là một lời gọi phương thức, list.size() cũng vậy. Giờ bạn sẽ tự viết phương thức của mình.

Khai báo và gọi phương thức

Phần khai báo phương thức gồm bốn phần: kiểu trả về, tên, cặp ngoặc tròn (cho tham số) và phần thân trong ngoặc nhọn. Đây là ví dụ hữu ích nhỏ nhất, một phương thức làm một việc và không trả về gì:

Hãy đọc từng phần của static void printGreeting():

  • static: cho phép main gọi trực tiếp mà không cần tạo đối tượng (nói thêm ở phần dưới).
  • void: phương thức này không trả về giá trị.
  • printGreeting: tên bạn dùng để gọi nó.
  • (): cặp ngoặc trống nghĩa là nó không nhận đầu vào.

Bạn gọi một phương thức bằng cách viết tên của nó kèm cặp ngoặc tròn. Hai lời gọi trong main chạy phần thân hai lần, nên lời chào được in ra hai lần.

Trả về một giá trị

Phần lớn phương thức tính ra một thứ gì đó và trao lại bằng return. Kiểu trả về đặt trước tên cho biết loại giá trị nào sẽ đi ra, ở đây là int:

square(5) cho ra 25, giá trị bạn có thể lưu vào một biến, in ra hoặc dùng trong một biểu thức lớn hơn: lời gọi phương thức đứng thay cho giá trị mà nó trả về. Ngay khi return chạy, phương thức kết thúc và quyền điều khiển quay về bên gọi. Mọi dòng code nằm sau return trên cùng nhánh đó sẽ không bao giờ được thực thi.

Kiểu trả về và giá trị được trả về phải khớp nhau: kiểu dữ liệu bạn khai báo là loại giá trị mà phương thức hứa sẽ trao lại. Khai báo int mà lại return "text"; là lỗi biên dịch: trình biên dịch buộc bạn giữ đúng cam kết.

void hay kiểu trả về

Cách chia rất đơn giản: dùng kiểu trả về thật sự khi bên gọi cần nhận lại một giá trị, và dùng void khi phương thức chỉ làm một việc gì đó (in ra, lưu lại, cập nhật trạng thái).

void logMessage(String msg)   // does work, hands nothing back
int  add(int a, int b)        // computes a value the caller uses

Một lỗi hay gặp ở người mới là cố dùng "kết quả" của một phương thức void:

int x = printGreeting();   // compile error: printGreeting() returns void

Không có giá trị nào để gán, nên đoạn code này không biên dịch được. Nếu bạn thấy mình muốn lấy kết quả của một phương thức void, đó là dấu hiệu nó nên trả về một giá trị.

Phương thức rẽ nhánh và trả về sớm

Bạn có thể return từ nhiều chỗ. Trả về sớm, ngay khi đã biết đáp án, thường dễ đọc hơn so với lồng mọi thứ trong else:

Vì mỗi return thoát ra ngay lập tức, điều kiện đầu tiên khớp sẽ thắng. Chỉ cần đảm bảo mọi nhánh trong một phương thức có trả về giá trị đều kết thúc bằng return: nếu có nhánh nào có thể chạy hết mà không trả về, trình biên dịch sẽ báo "missing return statement". Câu return "F"; cuối cùng ở đây xử lý trường hợp còn lại.

static ở đây nghĩa là gì

Có thể bạn đã để ý mọi phương thức ở trên đều là static. Phương thức static thuộc về chính lớp, không thuộc về đối tượng nào, nên main (cũng là static) có thể gọi trực tiếp bằng tên. Không có static, phương thức thuộc về một instance và bạn cần một đối tượng để gọi nó.

Hiện tại, khi bạn đang viết những chương trình nhỏ có logic nằm cạnh main, hãy đánh dấu các phương thức phụ là static để gọi chúng theo cùng cách. Khi bắt đầu tự xây dựng lớp và đối tượng, bạn cũng sẽ viết phương thức không static (phương thức instance): phần đó nằm trong chương về lớp.

Biến cục bộ chỉ tồn tại trong phương thức

Biến khai báo bên trong một phương thức chỉ tồn tại ở đó. Chúng được tạo ra khi phương thức chạy và biến mất khi phương thức trả về: bên gọi không bao giờ thấy chúng:

total và i nằm hoàn toàn bên trong sumTo. Thứ duy nhất thoát ra khỏi phương thức là giá trị bạn return. Sự cô lập này là một ưu điểm: mỗi phương thức là một khối độc lập mà bạn có thể suy luận mà không lo biến tạm của nó lọt ra ngoài hay trùng tên với chỗ khác.

Tiếp theo: tham số phương thức

Mọi phương thức ở đây hoặc không nhận đầu vào, hoặc chỉ nhận một giá trị. Sức mạnh thật sự đến từ việc truyền dữ liệu vào, và Java có những quy tắc riêng về cách truyền đối số, điều gì xảy ra với đối tượng so với kiểu nguyên thủy, và cách tạo giá trị dự phòng giống như giá trị mặc định cho tham số. Đó là nội dung của trang tiếp theo.

Câu hỏi thường gặp

Phương thức trong Java là gì?

Phương thức (method) là một khối code có tên mà bạn chạy bất cứ lúc nào bằng cách gọi tên nó. Nó gom một phần công việc vào một chỗ để bạn dùng lại thay vì lặp đi lặp lại những dòng giống nhau. Phương thức có thể nhận đầu vào (tham số) và trả lại kết quả (giá trị trả về), hoặc làm việc của nó mà không trả về gì (void).

Làm sao tạo và gọi một phương thức trong Java?

Khai báo phương thức với kiểu trả về, tên và cặp ngoặc: static int square(int n) { return n * n; }. Sau đó gọi nó bằng tên kèm đối số trong ngoặc: int result = square(5);. Phương thức không trả về gì dùng void và được gọi như một câu lệnh độc lập, ví dụ printGreeting();.

void trong phương thức Java nghĩa là gì?

void nghĩa là phương thức không trả về giá trị: nó làm việc của mình (như in ra màn hình) và không trao lại gì cho bên gọi. Bạn không thể gán kết quả của một phương thức void cho biến. Nếu phương thức cần tạo ra giá trị để bên gọi dùng, hãy cho nó một kiểu trả về thật sự như int hoặc String và dùng return.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu