Java方法

Java中的方法是一組語句,它們組合在一起以執行各種操作。 例如,當調用System.out.println()方法時,系統實際上會執行多個語句,以便在控制檯上顯示消息。

下面將學習如何使用或不使用返回值創建自己的方法,使用或不使用參數調用方法,以及在程序設計中應用方法抽象。

1. 創建方法

下面來看看方法的語法 -

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

在上面語法中,

  • public static − 修辭符
  • int − 返回值的類型
  • methodName − 方法的名稱
  • a, b − 形式參數
  • int a, int b − 參數列表

方法定義由方法頭和方法體組成。以下語法中顯示了相同的內容 -

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

上面顯示的語法包括 -

  • modifier - 它定義方法的訪問類型,它可能是:public,private,protected或不指定。
  • returnType - 方法可以返回一個值。
  • nameOfMethod - 這是方法名稱,方法簽名由方法名稱和參數列表組成。
  • Parameter List - 參數列表,它是方法的類型,順序和參數數量。 這些是可選的,方法可能包含零參數。
  • method body - 方法體定義方法對語句的作用。

示例

以下代碼中定義了min()方法。 這個方法有兩個int類型的參數:num1num2,並返回兩者之間的最大值 -

/** 返回兩個數字之間的最小值 */
public static int minFunction(int n1, int n2) {
   int min;
   if (n1 > n2)
      min = n2;
   else
      min = n1;

   return min; 
}

2. 方法調用

可通過調用方法來使用方法,調用方法有兩種方式,即方法有返回值或無返回任何值。

方法調用的過程很簡單。 當程序調用方法時,程序控制將轉移到被調用的方法。 這個被調用的方法然後在兩個條件下將控制權返回給調用者,即 -

  • return語句被執行。
  • 它到達方法的結束,即右大括號(})。

對返回void的方法的調用 -

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

對有返回值的方法的調用 -

int result = sum(6, 9);

以下是演示如何定義方法以及如何調用方法的示例 -

public class ExampleMinNumber {

   public static void main(String[] args) {
      int a = 111;
      int b = 125;
      int c = getMin(a, b);
      System.out.println("最小值 = " + c);
   }

   /** 返回兩個 int 數值的最小值 */
   public static int getMin(int n1, int n2) {
      int min;
      if (n1 > n2)
         min = n2;
      else
         min = n1;

      return min; 
   }
}

執行上面示例代碼,得到以下結果:

最小值 = 111

3. void關鍵字

void關鍵字允許創建不返回值的方法。在下面的例子中有一個返回值是void的方法methodRankPoints,它不返回任何值。 調用void方法必須是一個語句,即methodRankPoints(245.67);. 它是一個以分號結尾的Java語句,如以下示例所示 -

public class ExampleVoid {

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

   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");
      }
   }
}

執行上面示例代碼,得到以下結果:

Rank:A1

4. 按值傳遞參數

在按值傳遞參數時需要傳遞參數。它們的順序應與方法規範中的參數順序相同。參數可以通過值或引用傳遞。

通過值傳遞參數是使用參數調用方法。 通過這樣將參數值將傳遞給參數。

示例

以下程序顯示了按值傳遞參數的示例。 即使在方法調用之後,參數的值仍保持不變。

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);

      // 調用交換方法
      swapFunction(a, b);
      System.out.println("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);
      // 交換 n1 和 n2
      int c = a;
      a = b;
      b = c;
      System.out.println("After swapping(Inside), a = " + a + " b = " + b);
   }
}

執行上面示例代碼,得到以下結果:

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

5. 方法重載

當一個類有兩個或多個同名但方法不同參數的方法時,稱爲方法重載。 它與重寫不同。 在重寫中,方法具有相同的方法名稱,類型,參數數量等。

在前面討論的用於查找最小整數類型數的示例中,假設想要查找兩個double類型的最小數值。 可引入重載的概念以創建具有相同名稱但不同參數的兩個或更多方法。

參考以下示例代碼 -

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 = getMin(a, b);

      // 具有相同函數名稱,但數字不同參數
      double result2 = getMin(c, d);
      System.out.println("Minimum Value = " + result1);
      System.out.println("Minimum Value = " + result2);
   }

   // 處理 int 類型的數值(方法重載)
   public static int getMin(int n1, int n2) {
      int min;
      if (n1 > n2)
         min = n2;
      else
         min = n1;

      return min; 
   }

   //  處理 double 類型的數值(方法重載)
   public static double getMin(double n1, double n2) {
     double min;
      if (n1 > n2)
         min = n2;
      else
         min = n1;

      return min; 
   }
}

執行上面示例代碼,得到以下結果:

Minimum Value = 6
Minimum Value = 7.3

重載方法使程序可讀。這裏,兩個方法由相同的名稱給出但具有不同的參數類型。結果是求int類型和double類型的最小數。

6. 使用命令行參數

有時希望在運行程序時將一些信息傳遞給程序。它是通過將命令行參數傳遞給main()來實現的。

命令行參數是執行時在命令行上直接跟隨程序名稱的信息。 要訪問Java程序中的命令行參數非常簡單。 它們作爲字符串存儲在傳遞給main()String類型數組中。

示例

以下程序顯示傳遞給程序的所有命令行參數 -

public class CommandLine {

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

使用以下方式執行此程序 -

C:/> java CommandLine this is a command line 200 -100

那麼將得到以下結果:

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

7. this 關鍵字

this是Java中的一個關鍵字,用作對當前類對象的引用,在實例方法或構造函數中。 使用它可以引用類的成員,例如:構造函數,變量和方法。

注 - this關鍵字僅在實例方法或構造函數中使用。

通常,this關鍵字用於 -

  • 如果實例變量在構造函數或方法中具有相同的名稱,則將它們與局部變量區分開來。

    class Student {
     private int age;   
     Student(int age) {
        this.age = age;
     }
    }
  • 從類中的其他方法調用一種類型的構造函數(參數化構造函數或默認值),稱爲顯式構造函數調用。

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

以下是使用this關鍵字訪問類成員的示例 -

public class ThisExample {
   // 實例變量:num
   int num = 10;
   ThisExample() {
      System.out.println("This is an example program on keyword this");    
   }

   ThisExample(int num) {
      // 調用默認構造方法
      this();

      // 將局部變量 num 分配給實例變量 num 
      this.num = num;
   }

   public void greet() {
      System.out.println("Hi Welcome to Yiibai");
   }

   public void print() {
      // 局部變量:num
      int num = 20;

      // 打印局部變量
      System.out.println("value of local variable num is : "+num);

      // 打印實例變量
      System.out.println("value of instance variable num is : "+this.num);

      // 調用類方法 
      this.greet();     
   }

   public static void main(String[] args) {
      // 實例化該類
      ThisExample obj1 = new ThisExample();

      // 調用 print 方法
      obj1.print();

      //通過參數化構造函數將新值傳遞給 num 變量
      ThisExample obj2 = new ThisExample(30);

      // 再次調用 print 方法
      obj2.print(); 
   }
}

執行上面示例代碼,得到以下結果 -

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 Yiibai
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 Yiibai

8. 變量參數(var-args)

JDK 1.5允許將可變數量的相同類型的參數傳遞給方法。方法中的參數聲明如下 -

typeName... parameterName

在方法聲明中,指定類型後跟省略號(...)。 在方法中只能指定一個可變長度參數,並且此參數必須是最後一個參數。

public class VarargsDemo {

   public static void main(String args[]) {
       // 使用變量參數調用方法
       printMax(314, 321, 213, 212, 356.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("參數列表中的最大值是:" + result);
   }
}

執行上面示例代碼,得到以下結果 -

參數列表中的最大值是:356.5
參數列表中的最大值是:3.0

9. finalize()方法

finalize()方法在垃圾收集器對象最終銷燬之前調用,它可用於確保對象完全終止。例如,可以使用finalize()來確保該對象擁有的打開文件已關閉。

要將終結器添加到類中,只需定義finalize()方法即可。只要Java方法要回收該類的對象,它就會調用該方法。

finalize()方法中,將指定在銷燬對象之前必須執行的操作。finalize()方法有這種一般形式 -

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

這裏,關鍵字protected是一個修辭符,它阻止通過類外部定義的代碼訪問finalize()。 我們無法知道Java何時或甚至是否將執行finalize()方法。如果程序在垃圾收集發生之前結束,則finalize()將不會執行。