Java - วิธีการ

วิธี Java คือชุดของคำสั่งที่รวมกลุ่มกันเพื่อดำเนินการ เมื่อคุณเรียก System.outprintln() วิธีการตัวอย่างเช่นระบบเรียกใช้คำสั่งต่างๆเพื่อแสดงข้อความบนคอนโซล

ตอนนี้คุณจะได้เรียนรู้วิธีสร้างวิธีการของคุณเองโดยมีหรือไม่มีค่าส่งคืนเรียกใช้วิธีการที่มีหรือไม่มีพารามิเตอร์และใช้วิธีการที่เป็นนามธรรมในการออกแบบโปรแกรม

การสร้างวิธีการ

พิจารณาตัวอย่างต่อไปนี้เพื่ออธิบายไวยากรณ์ของวิธีการ -

Syntax

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

ที่นี่

  • public static - ตัวปรับแต่ง

  • int - ประเภทผลตอบแทน

  • methodName - ชื่อของวิธีการ

  • a, b - พารามิเตอร์ที่เป็นทางการ

  • int a, int b - รายการพารามิเตอร์

คำจำกัดความของวิธีการประกอบด้วยส่วนหัวของวิธีการและเนื้อหาของวิธีการ สิ่งเดียวกันนี้แสดงในไวยากรณ์ต่อไปนี้ -

Syntax

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

ไวยากรณ์ที่แสดงด้านบนประกอบด้วย -

  • modifier - กำหนดประเภทการเข้าถึงของวิธีการและเป็นทางเลือกที่จะใช้

  • returnType - เมธอดอาจส่งคืนค่า

  • nameOfMethod- นี่คือชื่อเมธอด ลายเซ็นเมธอดประกอบด้วยชื่อเมธอดและรายการพารามิเตอร์

  • Parameter List- รายการพารามิเตอร์เป็นประเภทลำดับและจำนวนพารามิเตอร์ของวิธีการ วิธีเหล่านี้เป็นทางเลือกวิธีการอาจมีพารามิเตอร์เป็นศูนย์

  • method body - เนื้อความของวิธีการกำหนดว่าวิธีการนี้ทำอะไรกับงบ

Example

นี่คือซอร์สโค้ดของวิธีการที่กำหนดไว้ข้างต้นที่เรียกว่า min(). วิธีนี้ใช้สองพารามิเตอร์ num1 และ num2 และส่งกลับค่าสูงสุดระหว่างสอง -

/** 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; 
}

วิธีการโทร

สำหรับการใช้วิธีนั้นควรเรียกว่า มีสองวิธีที่เรียกเมธอดคือเมธอดส่งคืนค่าหรือคืนค่าอะไร (ไม่มีค่าส่งคืน)

ขั้นตอนวิธีการโทรนั้นง่ายมาก เมื่อโปรแกรมเรียกใช้วิธีการควบคุมโปรแกรมจะถูกโอนไปยังเมธอดที่เรียกว่า วิธีที่เรียกว่านี้จะส่งคืนการควบคุมไปยังผู้โทรในสองเงื่อนไขเมื่อ -

  • คำสั่ง return ถูกดำเนินการ
  • ถึงเมธอดที่สิ้นสุดการปิดวงเล็บปีกกา

วิธีการคืนโมฆะถือเป็นการเรียกไปยังคำสั่ง ลองพิจารณาตัวอย่าง -

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

วิธีการคืนค่าสามารถเข้าใจได้จากตัวอย่างต่อไปนี้ -

int result = sum(6, 9);

ต่อไปนี้เป็นตัวอย่างเพื่อสาธิตวิธีการกำหนดวิธีการและวิธีการเรียกใช้ -

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

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

Output

Minimum value = 6

คีย์เวิร์ดที่เป็นโมฆะ

คีย์เวิร์ดที่เป็นโมฆะช่วยให้เราสามารถสร้างเมธอดที่ไม่ส่งคืนค่า ที่นี่ในตัวอย่างต่อไปนี้เรากำลังพิจารณาวิธีการที่เป็นโมฆะmethodRankPoints วิธีนี้เป็นวิธีโมฆะซึ่งไม่ส่งคืนค่าใด ๆ การเรียกใช้เมธอด void ต้องเป็นคำสั่งเช่นmethodRankPoints (255.7); . เป็นคำสั่ง Java ที่ลงท้ายด้วยอัฒภาคตามที่แสดงในตัวอย่างต่อไปนี้

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

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

Output

Rank:A1

การส่งผ่านพารามิเตอร์ตามค่า

ในขณะที่ทำงานภายใต้กระบวนการโทรข้อโต้แย้งจะถูกส่งผ่าน สิ่งเหล่านี้ควรอยู่ในลำดับเดียวกันกับพารามิเตอร์ที่เกี่ยวข้องในข้อกำหนดวิธีการ พารามิเตอร์สามารถส่งผ่านโดยค่าหรือโดยการอ้างอิง

การส่งผ่านพารามิเตอร์ตามค่าหมายถึงการเรียกใช้เมธอดด้วยพารามิเตอร์ ด้วยวิธีนี้ค่าอาร์กิวเมนต์จะถูกส่งไปยังพารามิเตอร์

Example

โปรแกรมต่อไปนี้แสดงตัวอย่างการส่งผ่านพารามิเตอร์ตามค่า ค่าของอาร์กิวเมนต์ยังคงเหมือนเดิมแม้ว่าจะมีการเรียกใช้เมธอดแล้วก็ตาม

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

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

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

วิธีการโอเวอร์โหลด

เมื่อคลาสมีสองเมธอดหรือมากกว่าโดยใช้ชื่อเดียวกัน แต่พารามิเตอร์ต่างกันเรียกว่าเมธอดโอเวอร์โหลด มันแตกต่างจากการลบล้าง ในการลบล้างเมธอดจะมีชื่อเมธอดประเภทจำนวนพารามิเตอร์และอื่น ๆ เหมือนกัน

ลองพิจารณาตัวอย่างที่กล่าวถึงก่อนหน้านี้เพื่อค้นหาจำนวนเต็มขั้นต่ำ ถ้าสมมุติว่าเราต้องการหาจำนวนขั้นต่ำของประเภทคู่ จากนั้นจะมีการนำแนวคิดเรื่องการโอเวอร์โหลดมาใช้เพื่อสร้างเมธอดสองวิธีขึ้นไปที่มีชื่อเดียวกัน แต่พารามิเตอร์ต่างกัน

ตัวอย่างต่อไปนี้อธิบายเหมือนกัน -

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

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

Output

Minimum Value = 6
Minimum Value = 7.3

วิธีการโอเวอร์โหลดทำให้โปรแกรมอ่านได้ ที่นี่มีการกำหนดสองวิธีโดยใช้ชื่อเดียวกัน แต่มีพารามิเตอร์ต่างกัน จำนวนขั้นต่ำจากจำนวนเต็มและประเภทคู่คือผลลัพธ์

การใช้อาร์กิวเมนต์บรรทัดคำสั่ง

บางครั้งคุณอาจต้องการส่งข้อมูลบางอย่างไปยังโปรแกรมเมื่อคุณเรียกใช้ สิ่งนี้ทำได้โดยส่งอาร์กิวเมนต์บรรทัดคำสั่งไปยัง main ()

อาร์กิวเมนต์บรรทัดคำสั่งคือข้อมูลที่ต่อท้ายชื่อโปรแกรมบนบรรทัดคำสั่งโดยตรงเมื่อดำเนินการ ในการเข้าถึงอาร์กิวเมนต์บรรทัดคำสั่งภายในโปรแกรม Java นั้นค่อนข้างง่าย ซึ่งจะถูกเก็บเป็นสตริงในอาร์เรย์ String ที่ส่งผ่านไปยัง main ()

Example

โปรแกรมต่อไปนี้แสดงอาร์กิวเมนต์บรรทัดคำสั่งทั้งหมดที่เรียกด้วย -

public class CommandLine {

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

ลองรันโปรแกรมนี้ตามที่แสดงไว้ที่นี่ -

$java CommandLine this is a command line 200 -100

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

Output

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

คีย์เวิร์ดนี้

thisเป็นคีย์เวิร์ดใน Java ซึ่งใช้อ้างอิงถึงอ็อบเจ็กต์ของคลาสปัจจุบันด้วยวิธีอินสแตนซ์หรือคอนสตรัคเตอร์ การใช้สิ่งนี้ทำให้คุณสามารถอ้างอิงสมาชิกของคลาสเช่นตัวสร้างตัวแปรและวิธีการ

Note- คำหลักนี้ใช้เฉพาะในวิธีการของอินสแตนซ์หรือตัวสร้าง

โดยทั่วไปคำหลักนี้ใช้เพื่อ -

  • แยกความแตกต่างของตัวแปรอินสแตนซ์จากตัวแปรโลคัลหากมีชื่อเดียวกันภายในตัวสร้างหรือวิธีการ

class Student {
   int age;   
   Student(int age) {
      this.age = age;	
   }
}
  • เรียกตัวสร้างประเภทหนึ่ง (ตัวสร้างพารามิเตอร์หรือค่าเริ่มต้น) จากตัวสร้างอื่น ๆ ในคลาส เรียกว่าการเรียกตัวสร้างที่ชัดเจน

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

Example

นี่คือตัวอย่างที่ใช้คีย์เวิร์ดนี้เพื่อเข้าถึงสมาชิกของคลาส คัดลอกและวางโปรแกรมต่อไปนี้ในไฟล์ที่มีชื่อ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(); 
   }
}

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

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

อาร์กิวเมนต์ตัวแปร (var-args)

JDK 1.5 ช่วยให้คุณสามารถส่งผ่านจำนวนตัวแปรของอาร์กิวเมนต์ประเภทเดียวกันไปยังเมธอด พารามิเตอร์ในวิธีการประกาศดังต่อไปนี้ -

typeName... parameterName

ในการประกาศวิธีการให้คุณระบุประเภทตามด้วยจุดไข่ปลา (... ) สามารถระบุพารามิเตอร์ความยาวตัวแปรได้เพียงตัวเดียวในเมธอดและพารามิเตอร์นี้ต้องเป็นพารามิเตอร์สุดท้าย พารามิเตอร์ปกติใด ๆ ต้องอยู่ข้างหน้า

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

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

Output

The max value is 56.5
The max value is 3.0

วิธีการสรุป ()

เป็นไปได้ที่จะกำหนดวิธีการที่จะถูกเรียกใช้ก่อนการทำลายครั้งสุดท้ายของวัตถุโดยตัวเก็บขยะ วิธีนี้เรียกว่าfinalize( )และสามารถใช้เพื่อให้แน่ใจว่าวัตถุสิ้นสุดลงอย่างสมบูรณ์

ตัวอย่างเช่นคุณอาจใช้ finalize () เพื่อให้แน่ใจว่าไฟล์ที่เปิดอยู่ของอ็อบเจ็กต์นั้นปิดอยู่

ในการเพิ่ม Finalizer ให้กับคลาสคุณเพียงแค่กำหนดวิธีการ finalize () รันไทม์ของ Java เรียกใช้เมธอดนั้นเมื่อใดก็ตามที่กำลังจะรีไซเคิลอ็อบเจ็กต์ของคลาสนั้น

ภายในเมธอด finalize () คุณจะระบุการดำเนินการที่ต้องดำเนินการก่อนที่วัตถุจะถูกทำลาย

วิธี finalize () มีรูปแบบทั่วไปนี้ -

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

ในที่นี้คำหลักที่ได้รับการป้องกันคือตัวระบุที่ป้องกันการเข้าถึงเพื่อสรุป () โดยรหัสที่กำหนดไว้นอกคลาส

ซึ่งหมายความว่าคุณไม่สามารถทราบได้ว่าจะดำเนินการ Finalize () เมื่อใดหรือแม้ว่า ตัวอย่างเช่นหากโปรแกรมของคุณสิ้นสุดลงก่อนที่การรวบรวมขยะจะเกิดขึ้น finalize () จะไม่ดำเนินการ