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 Tw511.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()將不會執行。