Java là ngôn ngữ hướng đối tượng. Các phương thức Java được định nghĩa trong class và là xương sống trong lập trình Java
Các phương thức Java là tập hợp các câu lệnh dùng để xử lý một vài tác vụ cụ thể và trả về phản hồi cho phía gọi. Các phương thức cho phép chúng ta viết code có thể tái sử dụng và chia chương trình thành các đơn vị công việc nhỏ hơn. Java giúp code trở nên sạch sẽ và dễ đọc hơn
Các thành phần
Hãy cùng xem các thành phần khác nhau của phương thức Java
- Truy cập Modifiers (Access Modifier): Phương thức Java truy cập các Modifier định nghĩa ai có thể gọi phương thức. Nó được sử dụng để hạn chế phạm vi của phương thức. Có 4 truy cập Modifier trong Java: private, protected, public và default. Ngoài việc sử dụng truy cập Modifier, chúng ta cũng có thể chỉ định phương thức là static, trong trường hợp này, chúng ta không cần tạo một object để gọi phương thức. Chúng ta có thể gọi trực tiếp phương thức thông qua class. Các phương thức static là rất hữu dụng khi tạo các phương thức dùng chung.
- Kiểu trả về (Return Type): Các phương thức Java phải chỉ định kiểu trả về. Nó có thể là bất kỳ kiểu cơ bản nào (primitive type) hoặc một object. Nếu phương thức không trả về thì phải sử dụng void như kiểu trả về.
- Tên phương thức: Tất cả các phương thức trong Java phải có tên, nó được sử dụng để xác định phương thức. Chúng ta nên cung cấp mô tả cho tên phương thức để giúp người đọc có thể hình dung về phương thức dùng để làm gì thông qua tên
- Các tham số phương thức: Chúng ta có thể truyền các tham số cho phương thức, chúng được định nghĩa trong dấu ngoặc đơn sau tên phương thức. Thông thường, các câu lệnh phương thức hoạt động dựa vào các tham số này để đạt được nhiệm vụ của chúng
- Danh sách Exception: Thỉnh thoảng phương thức cần throw Exception. Chúng ta có thể định nghĩa sử dụng từ khoá
throws
. Nếu có nhiều Exception cần throws chúng ta có thể tách chúng sử dụng dấu phẩy. - Body phương thức (Method body): Đây là nơi tất cả các hoạt động phương thức diễn ra. Body của phương thức chứa các câu lệnh để được thực hiện bởi phương thức và chúng nằm bên trong dấu ngoặc
{}
Hãy cùng xem ví dụ bên dưới đây
Signature
Signature của phương thức Java bao gồm tên và các kiểu tham số trong thứ tự khai báo. Trong class có thể có nhiều phương thức, mỗi phương thức nên có signature khác nhau nếu không nó không biên dịch. Signature của phương thức được JRE sử dụng để xác định chính xác phương thức được gọi khi được gọi trong chương trình.
public void print(String s) {} private static int print(String s) {}
Nếu chúng ta có cả 2 phương thức trên trong cùng một class thì nó sẽ không biên dịch bởi vì cả 2 phương thức có signature giống nhau.
public void print(String s, int i) {} private static void print(int i, String s) {}
2 phương thức bên trên là khác nhau bởi vì thứ tự tham số không giống nhau
Gọi Java phương thức
Hãy cùng xem ví dụ tạo một phương thức main và gọi các phương thức khác
package com.javatest.util; public class MathUtils { public int add (int x, int y) { return x + y; } public static void main(String args[]) throws Exception { MathUtils mu = new MathUtils(); System.out.println(mu.add(5, 2)); MathUtils.print("Static Method"); } public static void print(String s) {} }
Khi chúng ta chạy chương trình bên trên, phương thức main sẽ chạy và sẽ gọi các phương thức của MathUtils. Chú ý rằng nếu phương thức không phải là static, chúng ta cần tạo một object để gọi nó. Tuy nhiên nếu nó là static chúng ta chỉ việc đơn giản gọi nó sử dụng tên của phương thức.
Cũng chú ý rằng, phương thức println()
được định nghĩa trong object System.out
. Nó là phương thức của chuẩn thư viện Java trong đó các phương thức add()
và print()
trong class MathUtils được gọi là phương thức do người dùng định nghĩa.
Ví dụ
Phương thức overloaded
Nếu một class có nhiều phương thức có tên giống nhau thì được gọi là các phương thức overloaded
public void print(String s) { System.out.println(s); } public void print(String s, int times) { for (int i=0; i< times; i++) { System.out.println(s); } }
Phương thức Throwing Exception
Xem ví dụ sau, chúng ta sẽ thử Throwing Exception
public int divide(int x, int y) throws IllegalArgumentException { if(y==0) throw new IllegalArgumentException("Can't divide by 0"); return x/y; }
Phương thức đệ quy
Khi một phương thức gọi chính nó thì được gọi là phương thức đệ quy. Chúng ta nên cẩn thận khi định nghĩa một phương thức đệ quy bởi vì nó có thể bị lặp vô hạn nêu không có điều kiện sau cùng. Hãy cùng xem phương thức số nguyên tố dùng đệ quy bên dưới đây
public static long factorial(long n) { if (n == 1) return 1; else return (n * factorial(n - 1)); }
Phương thức gọi phương thức khác
Chúng ta có thể gọi phương thức khác từ một phương thức, hãy cùng định nghĩa lại các phương thức overloaded ở trên bằng cách sử dụng phương thức print(String s)
public void print(String s) { System.out.println(s); } public void print(String s, int times) { for (int i=0; i< times; i++) { print(s); } }
Phương thức static của Java Interface
Java interface có thể có phương thức static từ Java 8 trở đi. Sau đây là một ví dụ nhỏ
public interface MyData { static boolean isNull(String str) { System.out.println("Interface Null Check"); return str == null ? true : "".equals(str) ? true : false; } }
Phương thức default của Java Interface
Từ Java 8 trở đi, Interface có phương thức default đầy đủ
public interface MyData { default void print(String str) { if (!isNull(str)) System.out.println("MyData Print::" + str); } }
Các phương thức getter setter
Các phương thức getter setter là các phương thức thông thường để truy cập và các nhập các thuộc tính của object. Các phương thức này tạo ra sự trừu tượng và chúng ta có thể hạn chế truy cập các thuộc tính khác nhau. Hầu hết các IDE đều hỗ trợ dễ dàng tạo các phương thức getter setter cho một thuộc tính.
private String name; public String getName() { return name; } public void setName(String name) { this.name = name; }
Các phương thức Abstract
Các class abstract và interface có thể khai báo các phương thức mà không cần body. Các class mà extend hoặc thực hiện implement sẽ có trách nhiệm cung cấp định nghĩa phương thức. Những phương thức này được khai báo sử dụng từ khoá abstract trong class abstract. Các phương thức của Interface là abstract ẩn
public abstract class Person { public abstract void work(); } public interface Shape { //interface methods are implicitly abstract and public void draw(); double getArea(); }