Java - Phương thức

Phương thức Java là một tập hợp các câu lệnh được nhóm lại với nhau để thực hiện một thao tác. Khi bạn gọi System.out.println() chẳng hạn, hệ thống thực thi một số câu lệnh để hiển thị một thông báo trên bảng điều khiển.

Bây giờ bạn sẽ học cách tạo các phương thức của riêng mình có hoặc không có giá trị trả về, gọi một phương thức có hoặc không có tham số và áp dụng trừu tượng hóa phương thức trong thiết kế chương trình.

Phương pháp tạo

Xem xét ví dụ sau để giải thích cú pháp của một phương thức:

Syntax

public static int methodName(int a, int b) {
   // body
}

Đây,

  • public static - bổ ngữ

  • int - loại trả lại

  • methodName - tên của phương pháp

  • a, b - thông số chính thức

  • int a, int b - danh sách các tham số

Định nghĩa phương thức bao gồm một tiêu đề phương thức và một thân phương thức. Điều tương tự được thể hiện trong cú pháp sau:

Syntax

modifier returnType nameOfMethod (Parameter List) {
   // method body
}

Cú pháp hiển thị ở trên bao gồm:

  • modifier - Nó xác định kiểu truy cập của phương thức và nó là tùy chọn để sử dụng.

  • returnType - Phương thức có thể trả về một giá trị.

  • nameOfMethod- Đây là tên phương thức. Chữ ký phương thức bao gồm tên phương thức và danh sách tham số.

  • Parameter List- Danh sách các tham số, nó là kiểu, thứ tự và số lượng các tham số của một phương thức. Đây là tùy chọn, phương thức có thể chứa không tham số.

  • method body - Phần thân của phương thức xác định những gì phương thức thực hiện với các câu lệnh.

Example

Đây là mã nguồn của phương thức được xác định ở trên được gọi là min(). Phương thức này nhận hai tham số num1 và num2 và trả về giá trị tối đa giữa hai tham số:

/** the snippet returns the minimum between two numbers */

public static int minFunction(int n1, int n2) {
   int min;
   if (n1 > n2)
      min = n2;
   else
      min = n1;

   return min; 
}

Gọi phương thức

Để sử dụng một phương thức, nó nên được gọi. Có hai cách trong đó phương thức được gọi là phương thức trả về giá trị hoặc không trả về giá trị nào (không có giá trị trả về).

Quá trình gọi phương thức rất đơn giản. Khi một chương trình gọi một phương thức, điều khiển chương trình sẽ được chuyển đến phương thức được gọi. Phương thức được gọi này sau đó trả lại quyền điều khiển cho người gọi trong hai điều kiện, khi -

  • câu lệnh trả về được thực thi.
  • nó đạt đến phương thức kết thúc dấu ngoặc nhọn đóng.

Các phương thức trả về void được coi là lệnh gọi đến một câu lệnh. Hãy xem xét một ví dụ -

System.out.println("This is tutorialspoint.com!");

Phương thức trả về giá trị có thể được hiểu theo ví dụ sau:

int result = sum(6, 9);

Sau đây là ví dụ để minh họa cách xác định một phương thức và cách gọi nó:

Example

public class ExampleMinNumber {
   
   public static void main(String[] args) {
      int a = 11;
      int b = 6;
      int c = minFunction(a, b);
      System.out.println("Minimum Value = " + c);
   }

   /** returns the minimum of two numbers */
   public static int minFunction(int n1, int n2) {
      int min;
      if (n1 > n2)
         min = n2;
      else
         min = n1;

      return min; 
   }
}

Điều này sẽ tạo ra kết quả sau:

Output

Minimum value = 6

Từ khóa vô hiệu

Từ khóa void cho phép chúng ta tạo các phương thức không trả về giá trị. Ở đây, trong ví dụ sau, chúng tôi đang xem xét một phương thức void methodRankPoints . Phương thức này là một phương thức void, không trả về bất kỳ giá trị nào. Lời gọi phương thức void phải là một câu lệnh tức là methodRankPoints (255.7); . Đây là một câu lệnh Java kết thúc bằng dấu chấm phẩy như trong ví dụ sau.

Example

public class ExampleVoid {

   public static void main(String[] args) {
      methodRankPoints(255.7);
   }

   public static void methodRankPoints(double points) {
      if (points >= 202.5) {
         System.out.println("Rank:A1");
      }else if (points >= 122.4) {
         System.out.println("Rank:A2");
      }else {
         System.out.println("Rank:A3");
      }
   }
}

Điều này sẽ tạo ra kết quả sau:

Output

Rank:A1

Truyền thông số theo giá trị

Trong khi làm việc theo quy trình gọi, các đối số sẽ được chuyển. Chúng phải theo thứ tự như các tham số tương ứng của chúng trong đặc tả phương pháp. Các tham số có thể được truyền theo giá trị hoặc tham chiếu.

Truyền tham số theo giá trị nghĩa là gọi một phương thức có tham số. Thông qua đó, giá trị đối số được truyền cho tham số.

Example

Chương trình sau đây cho thấy một ví dụ về truyền tham số theo giá trị. Giá trị của các đối số vẫn giữ nguyên ngay cả sau khi gọi phương thức.

public class swappingExample {

   public static void main(String[] args) {
      int a = 30;
      int b = 45;
      System.out.println("Before swapping, a = " + a + " and b = " + b);

      // Invoke the swap method
      swapFunction(a, b);
      System.out.println("\n**Now, Before and After swapping values will be same here**:");
      System.out.println("After swapping, a = " + a + " and b is " + b);
   }

   public static void swapFunction(int a, int b) {
      System.out.println("Before swapping(Inside), a = " + a + " b = " + b);
      
      // Swap n1 with n2
      int c = a;
      a = b;
      b = c;
      System.out.println("After swapping(Inside), a = " + a + " b = " + b);
   }
}

Điều này sẽ tạo ra kết quả sau:

Output

Before swapping, a = 30 and b = 45
Before swapping(Inside), a = 30 b = 45
After swapping(Inside), a = 45 b = 30

**Now, Before and After swapping values will be same here**:
After swapping, a = 30 and b is 45

Quá tải phương thức

Khi một lớp có hai hoặc nhiều phương thức trùng tên nhưng khác tham số, nó được gọi là quá tải phương thức. Nó khác với ghi đè. Trong ghi đè, một phương thức có cùng tên phương thức, kiểu, số lượng tham số, v.v.

Hãy xem xét ví dụ đã thảo luận trước đó để tìm các số nhỏ nhất kiểu số nguyên. Nếu, giả sử chúng ta muốn tìm số loại kép tối thiểu. Sau đó, khái niệm nạp chồng sẽ được giới thiệu để tạo ra hai hoặc nhiều phương thức có cùng tên nhưng khác tham số.

Ví dụ sau giải thích tương tự -

Example

public class ExampleOverloading {

   public static void main(String[] args) {
      int a = 11;
      int b = 6;
      double c = 7.3;
      double d = 9.4;
      int result1 = minFunction(a, b);
      
      // same function name with different parameters
      double result2 = minFunction(c, d);
      System.out.println("Minimum Value = " + result1);
      System.out.println("Minimum Value = " + result2);
   }

   // for integer
   public static int minFunction(int n1, int n2) {
      int min;
      if (n1 > n2)
         min = n2;
      else
         min = n1;

      return min; 
   }
   
   // for double
   public static double minFunction(double n1, double n2) {
     double min;
      if (n1 > n2)
         min = n2;
      else
         min = n1;

      return min; 
   }
}

Điều này sẽ tạo ra kết quả sau:

Output

Minimum Value = 6
Minimum Value = 7.3

Phương thức nạp chồng làm cho chương trình có thể đọc được. Ở đây, hai phương thức được đưa ra bởi cùng một tên nhưng với các tham số khác nhau. Số nhỏ nhất từ ​​kiểu số nguyên và kép là kết quả.

Sử dụng đối số dòng lệnh

Đôi khi bạn sẽ muốn chuyển một số thông tin vào một chương trình khi bạn chạy nó. Điều này được thực hiện bằng cách chuyển các đối số dòng lệnh tới hàm main ().

Đối số dòng lệnh là thông tin trực tiếp theo sau tên chương trình trên dòng lệnh khi nó được thực thi. Để truy cập các đối số dòng lệnh bên trong chương trình Java khá dễ dàng. Chúng được lưu trữ dưới dạng chuỗi trong mảng Chuỗi được chuyển đến hàm main ().

Example

Chương trình sau đây hiển thị tất cả các đối số dòng lệnh mà nó được gọi với:

public class CommandLine {

   public static void main(String args[]) { 
      for(int i = 0; i<args.length; i++) {
         System.out.println("args[" + i + "]: " +  args[i]);
      }
   }
}

Hãy thử thực hiện chương trình này như được hiển thị ở đây -

$java CommandLine this is a command line 200 -100

Điều này sẽ tạo ra kết quả sau:

Output

args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100

Từ khóa này

thislà một từ khóa trong Java được sử dụng như một tham chiếu đến đối tượng của lớp hiện tại, với trong một phương thức thể hiện hoặc một phương thức khởi tạo. Sử dụng nó, bạn có thể tham khảo các thành viên của một lớp như hàm tạo, biến và phương thức.

Note- Từ khóa này chỉ được sử dụng trong các phương thức phiên bản hoặc hàm tạo

Nói chung, từ khóa này được sử dụng để -

  • Phân biệt các biến thể hiện với các biến cục bộ nếu chúng có cùng tên, trong một hàm tạo hoặc một phương thức.

class Student {
   int age;   
   Student(int age) {
      this.age = age;	
   }
}
  • Gọi một loại phương thức khởi tạo (phương thức tạo tham số hoặc mặc định) từ phương thức khác trong một lớp. Nó được gọi là lời gọi hàm tạo rõ ràng.

class Student {
   int age
   Student() {
      this(20);
   }
   
   Student(int age) {
      this.age = age;	
   }
}

Example

Đây là một ví dụ sử dụng từ khóa này để truy cập các thành viên của một lớp. Sao chép và dán chương trình sau vào một tệp có tên,This_Example.java.

public class This_Example {
   // Instance variable num
   int num = 10;
	
   This_Example() {
      System.out.println("This is an example program on keyword this");	
   }

   This_Example(int num) {
      // Invoking the default constructor
      this();
      
      // Assigning the local variable num to the instance variable num
      this.num = num;	   
   }
   
   public void greet() {
      System.out.println("Hi Welcome to Tutorialspoint");
   }
      
   public void print() {
      // Local variable num
      int num = 20;
      
      // Printing the local variable
      System.out.println("value of local variable num is : "+num);
      
      // Printing the instance variable
      System.out.println("value of instance variable num is : "+this.num);
      
      // Invoking the greet method of a class
      this.greet();     
   }
   
   public static void main(String[] args) {
      // Instantiating the class
      This_Example obj1 = new This_Example();
      
      // Invoking the print method
      obj1.print();
	  
      // Passing a new value to the num variable through parametrized constructor
      This_Example obj2 = new This_Example(30);
      
      // Invoking the print method again
      obj2.print(); 
   }
}

Điều này sẽ tạo ra kết quả sau:

Output

This is an example program on keyword this 
value of local variable num is : 20
value of instance variable num is : 10
Hi Welcome to Tutorialspoint
This is an example program on keyword this 
value of local variable num is : 20
value of instance variable num is : 30
Hi Welcome to Tutorialspoint

Đối số biến (var-args)

JDK 1.5 cho phép bạn truyền một số lượng biến đối số cùng kiểu vào một phương thức. Tham số trong phương thức được khai báo như sau:

typeName... parameterName

Trong phần khai báo phương thức, bạn chỉ định kiểu theo sau là dấu chấm lửng (...). Chỉ một tham số có độ dài biến đổi có thể được chỉ định trong một phương thức và tham số này phải là tham số cuối cùng. Bất kỳ tham số thông thường nào phải đứng trước nó.

Example

public class VarargsDemo {

   public static void main(String args[]) {
      // Call method with variable args  
	   printMax(34, 3, 3, 2, 56.5);
      printMax(new double[]{1, 2, 3});
   }

   public static void printMax( double... numbers) {
      if (numbers.length == 0) {
         System.out.println("No argument passed");
         return;
      }

      double result = numbers[0];

      for (int i = 1; i <  numbers.length; i++)
      if (numbers[i] >  result)
      result = numbers[i];
      System.out.println("The max value is " + result);
   }
}

Điều này sẽ tạo ra kết quả sau:

Output

The max value is 56.5
The max value is 3.0

Phương thức finalize ()

Có thể định nghĩa một phương thức sẽ được gọi ngay trước khi đối tượng bị hủy cuối cùng bởi bộ thu gom rác. Phương pháp này được gọi làfinalize( ), và nó có thể được sử dụng để đảm bảo rằng một đối tượng kết thúc sạch sẽ.

Ví dụ: bạn có thể sử dụng finalize () để đảm bảo rằng một tệp đang mở thuộc sở hữu của đối tượng đó đã được đóng lại.

Để thêm trình hoàn thiện vào một lớp, bạn chỉ cần xác định phương thức finalize (). Thời gian chạy Java gọi phương thức đó bất cứ khi nào nó chuẩn bị tái chế một đối tượng của lớp đó.

Bên trong phương thức finalize (), bạn sẽ chỉ định những hành động phải được thực hiện trước khi một đối tượng bị phá hủy.

Phương thức finalize () có dạng chung này:

protected void finalize( ) {
   // finalization code here
}

Ở đây, từ khóa được bảo vệ là một công cụ xác định ngăn truy cập vào finalize () bằng mã được định nghĩa bên ngoài lớp của nó.

Điều này có nghĩa là bạn không thể biết khi nào hoặc thậm chí nếu finalize () sẽ được thực thi. Ví dụ: nếu chương trình của bạn kết thúc trước khi quá trình thu gom rác xảy ra, thì finalize () sẽ không thực thi.