7  เมท็อด

วัตถุประสงค์

  1. เพื่อให้เข้าใจแนวคิดและโครงสร้างเมท็อด

  2. เพื่อให้สามารถสร้างและเรียกใช้เมท็อดได้

  3. เพื่อให้เข้าใจลำดับการทำงานของเมท็อดได้

  4. เพื่อให้เข้าใจการส่งผ่านพารามิเตอร์

  5. เพื่อให้สามารถใช้งานตัวแปรในโปรแกรมที่มีหลายเมท็อดได้อย่างเหมาะสม

  6. เพื่อให้สามารถเขียนโปรแกรมโดยแบ่งการทำงานออกเป็นเมท็อดได้

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

7.1 แนวคิดและโครงสร้างของเมท็อด

เมท็อด (method) คือกลุ่มของคำสั่งที่ใช้ในการทำงานอย่างใดอย่างหนึ่งซึ่งสามารถเรียกใช้เมท็อดได้โดยไม่จำเป็นต้องเข้าใจการทำงานทั้งหมดของเมท็อด ในแนวคิดที่ว่าเข้าใจว่าเมท็อดนั้นทำอะไรแต่ไม่ต้องเข้าใจว่าทำอย่างไรทำให้สามารถอ่านและทำความเข้าใจโปรแกรมในภาพร่วมได้ง่ายขึ้น จากโครงสร้างของโปรแกรมที่ประกอบไปด้วยคลาส เมท็อดจะต้องเขียนอยู่ภายในคลาสโดยมีคำสั่งต่าง ๆ อยู่ภายในเมท็อดอีกทีหนึ่งเมท็อดชนิดพิเศษคือเมท็อด main ใช้ควบคุมการทำงานของโปรแกรมโดยโปรแกรมจะเริ่มทำคำสั่งที่ เมท็อด main เป็นเมท็อดแรก หาสมมุติว่าเราต้องการเขียนโปรแกรมเพื่อหาค่าเลขยกกำลังโดยไม่เรียกใช้เมท็อดในคลาส Math เพื่อหาค่า
\(4^7\), \(2^5\), \(45^6\) , \(7^9\) และ \(10^8\) สามารถเขียนโปรแกรมได้ดังนี้

long  result = 1;
for(int i = 1; i <= 7; i++) 
result *= 4;
    System.out.println("4^7 = " + result);
for(int i = 1; i <=5; i++) 
result *= 2;
    System.out.println("2^5 = " + result);
for(int i = 1; i <= 6; i++) 
result *= 45;
    System.out.println("45^6 = " + result);
for(int i = 1; i <=9; i++) 
result *= 7;
    System.out.println("2^5 = " + result);
for(int i = 1; i <= 8; i++) 
result *= 10;
    System.out.println("10^8 = " + result);

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

ตัวอย่างที่ 7.1 โปรแกรม MethodEx1.java
public class MethodEx1 {
        public static void main (String[] args) {
            System.out.println("4^7 = " + power(4, 7));
            System.out.println("2^5 = " + power(2, 5));
            System.out.println("45^6 = " + power(45, 6));
            System.out.println("7^9 = " + power(7, 9));
            System.out.println("10^8 = " + power(10, 8));
        }
        public static long power (int base, int exp) {
            long result = 1;
            for(int i = 1; i <= exp; i++)
                    result =result * base;
            return result;
        }
    }
ผลการทำงานของโปรแกรม คือ

4^7 = 16384

2^5 = 32

45^6 = 8303765625

7^9 = 40353607

$$10^8 = 100000000

จากตัวอย่างที่ 7.1 บรรทัดที่ 9 – 14 เป็นการสร้างเมท็อดชื่อ power ที่เมท็อด main จะมีการเรียกใช้งานเมท็อด power(4, 7) เพื่อคำนวณค่าของ \(4^5\), power(2, 5) เพื่อคำนวณค่าของ \(2^5\), power(45, 6) ให้คำนวณค่าของ \(45^6\) , power(7, 9) เพื่อคำนวณค่าของ \(7^9\) และ power(10, 8) เพื่อคำนวณค่าของ \(10^8\)

7.2 การสร้างและการเรียกใช้เมท็อด

การกำหนดเมท็อดขึ้นใช้งานโดยกำหนดให้เป็นเมท็อดสาธารณะ (public) ซึ่งผู้อื่นสามารถเรียกใช้ได้และเป็นเมท็อดแบบ static มีไวยากรณ์เป็นดังนี้

public static ประเภทข้อมูลที่เป็นผลลัพธ์ ชื่อเมท็อด (รายการของพารามิเตอร์) {
    กลุ่มของคำสั่งภายในเมท็อด;
}

จากตัวอย่างที่ 7.1 บรรทัดที่ 9 ส่วนหัวเมท็อด คือ public static long power (int base, int exp) แสดงให้เห็นว่าเมท็อดนี้ชื่อ power ซึ่งจะให้ผลลัพธ์จากการทำงานของเมท็อดเป็นข้อมูลชนิด long และมีพารามิเตอร์ (parameter) ชนิด int จำนวน 2 ตัว คือ base และ exp

ภาพที่ 7-1 องค์ประกอบของการกำหนดเมท็อดขึ้นใช้งาน

ภาพที่ 7.2 การเรียกใช้เมท็อด

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

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

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

วิธีที่ 1 การเรียกใช้เมท็อดที่มีการคืนค่าผลลัพธ์กลับ วิธีการคือให้มองว่าเมท็อดนั้นเป็นค่าค่าหนึ่ง
ตัวอย่าง เช่น

long  powValue = power(4, 7);

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

System.out.println("4^7 = " + power(4, 7));

เป็นการพิมพ์ค่าที่เป็นผลลัพธ์ที่คืนกลับมาเมื่อมีการเรียกใช้เมท็อด power(4, 7)

วิธีที่ 2 การเรียกใช้เมท็อดที่ไม่มีการคืนค่ากลับ (void) วิธีการคือให้มองว่าเมท็อดคือคำสั่งคำสั่งหนึ่ง เมื่อมองว่าการเรียกใช้เมท็อดแบบนี้เป็นเหมือนคำสั่ง ตัวอย่างการเรียกใช้ เช่น

printStar(5);
Output('B',7);

ตัวอย่างการเรียกใช้งานเมท็อดที่ไม่มีการคืนค่ากลับเป็นดังตัวอย่างที่ 7.2

ตัวอย่างที่ 7.2 โปรแกรม MethodEx2.java
public class MethodEx2 {
    public static void main(String[] args){
        int j, num = 10;
        char ch = 'A';
        printStar(5);
        printStar(num);
        printStar(2);
        output(ch,num);
        output('B',7);
        output('J',7);
        output('D',5);
    }
    public static void printStar(int number){
        for(int i=0; i<number ; i++)
            System.out.print("*");
        System.out.println();
    }
    public static void output(char ch, int size){
        for(int i=0; i<size ; i++)
            System.out.print(ch);
        System.out.println();
    }
    }
ผลการทำงานของโปรแกรม คือ

*****

**********

**

AAAAAAAAAA

BBBBBBB

JJJJJJJ

DDDDD

จากตัวอย่างที่ 7.2 บรรทัดที่ 5 – 11 เป็นการเรียกใช้เมท็อด printStar และเมท็อด output ซึ่งเป็นเมท็อดแบบที่ไม่มีการคืนค่ากลับจึงไม่จำเป็นต้องมีตัวแปรมารับค่า และใช้งานเมท็อดเหมือนเป็นคำสั่งคำสั่งหนึ่งที่ให้ทำงานตามที่ต้องการ โดยเมท็อด printStar จะพิมพ์ * ตามจำนวนที่ระบุ เช่น printStar(5); ผลการทำงานคือพิมพ์ * จำนวน 5 ตัว ส่วนเมท็อด output เป็นเมท็อดที่ทำการพิมพ์ตัวอักษรที่ต้องการตามจำนวน เช่น output(‘B’,7); จะทำการพิมพ์ตัวอักษร B จำนวน 7 ตัวออกทางจอภาพ

7.3 ลำดับการทำงานของเมท็อด

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

ตัวอย่างที่ 7.3 โปรแกรม MethodEx3.java
public class MethodEx3 {
    public static void main(String[] args)  {
        System.out.println("1 main    : statement 1");  
        methodA();
        System.out.println("6 main    : statement 3");  
    }
    public static void methodA()  {
        System.out.println("2 methodA : statement 1");
        methodB();
        System.out.println("5 methodA : statement 3");
    }
    public static void methodB()  {
        System.out.println("3 methodB : statement 1");
        System.out.println("4 methodB : statement 2");
    }   
    }
ผลการทำงานของโปรแกรม คือ

1 main\(~~~~~~~\): statement 1

2 methodA : statement 1

3 methodB : statement 1

4 methodB : statement 2

5 methodA : statement 3

6 main\(~~~~~~~\): statement 3

ลำดับการทำงานของโปรแกรมในตัวอย่างที่ 7.3 เป็นดังภาพที่ 7-3

ภาพที่ 7-3 ลำดับการทำงานเมื่อมีการเรียกใช้เมท็อดของโปรแกรมตัวอย่างที่ 7.2

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

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

การส่งผ่านค่าระหว่างอาร์กิวเมนต์กับพารามิเตอร์ต้องคำนึงถึง

  1. ชนิดข้อมูล

ชนิดข้อมูลของอาร์กิวเมนต์จะต้องตรงกับพารามิเตอร์ ตัวอย่างเช่นจากภาพที่ 7-4 ในการเรียกใช้เมท็อด output อาร์กิวเมนต์จะต้องเป็นชนิด char กับ int

  1. ลำดับ

ลำดับของอาร์กิวเมนต์จะต้องตรงกับพารามิเตอร์ ตัวอย่างเช่นจากภาพที่ 7-4 ในการเรียกใช้เมท็อด output อาร์กิวเมนต์ตัวแรกจะต้องเป็นชนิด char และตัวที่สองจะต้องเป็นชนิด int จะสลับลำดับกันไม่ได้

  1. จำนวน

จำนวนของอาร์กิวเมนต์จะต้องเท่ากับจำนวนของพารามิเตอร์ ตัวอย่างเช่นจากภาพที่ 7-4 ในการเรียกใช้เมท็อด output จะต้องมีจำนวนอาร์กิวเมนต์ 2 ตัว

การส่งผ่านค่าระหว่างอาร์กิวเมนต์กับพารามิเตอร์ของเมท็อดมี 2 แบบคือ Pass by value และ Pass by reference หรือ pass by sharing

  1. Pass by value คือ การส่งค่าข้อมูลหรืออาร์กิวเมนต์ที่เป็นตัวแปรชนิดทั่วไป เช่น int, short, double เป็นต้น ไปยังเมท็อดโดยการสำเนาค่าของข้อมูลในตัวแปรดังกล่าวเพื่อส่งไปให้พารามิเตอร์ซึ่งทำหน้าที่รับข้อมูลหรือจัดเก็บข้อมูลที่ถูกส่งมา ดังนั้นค่าของตัวแปรที่เป็นอาร์กิวเมนต์จะไม่เปลี่ยนแปลงไปตามค่าพารามิเตอร์ในเมท็อด

  2. Pass by reference หรือ pass by sharing คือการส่งข้อมูลหรืออาร์กิวเมนต์ที่เป็นอาร์เรย์ไปยังเมท็อดโดยการส่งค่าตำแหน่งอ้างอิง (reference) ของอาร์กิวเมนต์นั้นไปยังพารามิเตอร์ของ เมท็อดในลักษณะของการใช้ข้อมูลร่วมกัน อาร์เรย์ที่ถูกส่งค่าไปยังเมท็อดจะเปลี่ยนแปลงค่าไปตามการเปลี่ยนแปลงที่เกิดขึ้นกับอาร์เรย์ที่เป็นพารามิเตอร์ของเมท็อดเพราะมีการใช้ข้อมูลชุดเดียวกันร่วมกัน

ตัวอย่างการส่งผ่านค่าแบบ pass by value เป็นดังภาพที่ 7-4

ภาพที่ 7-4 การส่งผ่าค่าแบบ pass by value

จากภาพที่ 7-4 เมื่อมีการเรียกใช้เมท็อด output(c, num); จะมีการส่งค่าตัวอักษร ‘A’ ที่เก็บอยู่ในตัวแปร c ซึ่งเป็นอาร์กิวเมนต์ไปให้ยังเมท็อด output ที่มีพารามิเตอร์ ch เป็นตัวรับค่า โดยค่าในตัวแปร c กับค่าในพารามิเตอร์ ch เป็นข้อมูลที่เหมือนกันแต่ถือว่าเป็นคนละตัวกัน เช่นเดียวกันกับคู่ของตัวแปร num กับพารามิเตอร์ size จะมีข้อมูลเหมือนกันแต่ถือว่าเป็นคนละตัวกัน

ตัวอย่างของการ pass by reference เป็นดังตัวอย่างที่ 7.4

ตัวอย่างที่ 7.4 โปรแกรม MethodEx4.java
public class MethodEx4 {
        public static void main(String[] args) {
            char[] orgChar = {'a','e','i','o','u'};
        
            System.out.println("Before: orgChar[0] is " + orgChar[0]);
            System.out.println("Before: orgChar[1] is " + orgChar[1]);
        
            setText(orgChar); 
        
            System.out.println("After : orgChar[0] is " + orgChar[0]);
            System.out.println("After : orgChar[1] is " + orgChar[1]);
        }
    
        public static void setText(char[] destChar){
            destChar[0] = 'z';
            destChar[1] = 'x';
            System.out.println("destChar[0] is " + destChar[0]);
            System.out.println("destChar[1] is " + destChar[1]);        
        }
    }
ผลการทำงานของโปรแกรม คือ

Before: orgChar[0] is a

Before: orgChar[1] is e

destChar[0] is z

destChar[1] is x

After : orgChar[0] is z

After : orgChar[1] is x

จากตัวอย่างที่ 7.4 ในการเรียกใช้เมท็อด setText ได้ส่งค่าตำแหน่งอ้างอิง (reference) ของอาร์เรย์ชื่อ orgChar ซึ่งเป็นอาร์กิวเมนต์ไปยังพารามิเตอร์คืออาร์เรย์ชื่อ destChar ทำให้ทั้งสองอาร์เรย์นี้ใช้งานข้อมูลชุดเดียวกันร่วมกัน (ข้อมูลที่จัดเก็บอยู่ในตำแหน่งอ้างอิงเดียวกัน) ดังนั้นก่อนการเรียกใช้เมท็อด setText ข้อมูลในอาร์เรย์ orgChar ในลำดับที่ 0 และลำดับที่ 1 คือ a และ e ตามลำดับ ในระหว่างการทำงานใน เมท็อด setText อาร์เรย์ destChar ได้เปลี่ยนค่าของอาร์เรย์ในลำดับที่ 0 และลำดับที่ 1 เป็น z และ x ตามลำดับ หลังการเรียกใช้เมท็อด setText จึงทำให้ค่าของอาร์เรย์ orgChar เปลี่ยนไปด้วยเนื่องจากอาร์เรย์ทั้งสองใช้ข้อมูลร่วมกัน

7.5 การใช้คำสั่ง RETURN

การส่งผลลัพธ์คืนกลับจากเมท็อดจะต้องใช้คำสั่ง return ซึ่งมีลักษณะการทำงาน ดังนี้

  1. เมื่อพบคำสั่ง return จะเป็นการจบการทำงานของเมท็อด โดยคืนค่าผลลัพธ์ที่ตามมาหลังคำสั่ง return

  2. เมท็อดที่ไม่ได้มีการส่งค่ากลับซึ่งระบุคำว่า void ที่ส่วนหัวของเมท็อด ไม่จำเป็นต้องใส่คำสั่ง return

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

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

  5. หลังคำสั่ง return สามารถเป็นการคำนวณเพื่อส่งค่ากลับได้ เช่น

    public static double calculateValue() {
    return 3.45*2.17
}
  1. การส่งค่ากลับด้วยคำสั่ง return จะส่งค่ากลับได้เพียงค่าเดียวหรือตัวแปรเดียวเท่านั้น

7.6 ขอบเขตการใช้งานตัวแปร

ขอบเขตของตัวแปร หมายถึง บริเวณขอบโปรแกรมที่สามารถอ้างถึงหรือใช้งานตัวแปรนั้นได้ ตัวแปรที่ประกาศในเมท็อดจะถูกอ้างถึงหรือใช้งานได้เฉพาะภายในเมท็อดเท่านั้น เรียกตัวแปรลักษณะนี้ว่า ตัวแปรเฉพาะที่ (local variable) ตัวแปรเฉพาะที่จะมีขอบเขตตัวแปรเริ่มจากจุดที่มีการประกาศตัวแปรนั้นไปจนจบบล็อกของโปรแกรมซึ่งตัวแปรนั้นสังกัดอยู่ การแบ่งบล็อกของโปรแกรมจะอาศัยเครื่องหมาย { และ } ตัวแปรเฉพาะที่จะต้องได้รับการประกาศและกำหนดค่าให้กับตัวแปรก่อนจึงจะสามารถใช้งานตัวแปรนั้นได้ พารามิเตอร์ของเมท็อดถือว่าเป็นตัวแปรเฉพาะที่ซึ่งสามารถใช้งานได้ทุกที่ภายในตัวเมท็อด

ตัวอย่างที่ 7.5 โปรแกรม MethodEx5.java

จากตัวอย่างที่ 7.5 จะเกิดข้อผิดพลาดทางไวยากรณ์ขึ้นในบรรทัดที่ 6, 9, 19 และ 21 อธิบายได้ดังนี้

บรรทัดที่ 6 มีการเรียกใช้ตัวแปร num1 ซึ่งเป็นพารามิเตอร์ของเมท็อด process ขอบเขตของตัวแปร num1 อยู่ภายในตัวเมท็อด process คือตั้งแต่บรรทัดที่ 8 – 21 เท่านั้น ไม่สามารถเรียกใช้ num1 ซึ่งเป็นตัวแปรเฉพาะที่นอกเมท็อด process ได้ แต่จากตัวอย่างมีการเรียกใช้ตัวแปร num1 ที่เมท็อด main ทำให้เกิดข้อผิดพลาดขึ้น

บรรทัดที่ 9 มีการเรียกใช้ตัวแปร test ที่ตัวเมท็อด process แต่ตัวแปร test ประกาศอยู่ในเมท็อด main การเรียกใช้ที่เมท็อดอื่นนอกตัวเมท็อด main จึงทำให้เกิดข้อผิดพลาดขึ้น

บรรทัดที่ 19 มีการเรียกใช้ตัวแปร i แต่ตัวแปร i มีขอบเขตของตัวแปรอยู่ภายใต้บล็อกของคำสั่ง for คือบรรทัดที่ 16 – 18 เนื่องจากตัวแปร i ถูกประกาศในบล็อกของ for นี้ เมื่อมีการใช้นอกขอบเขตของตัวแปร i จึงทำให้เกิดข้อผิดพลาดขึ้น

บรรทัดที่ 20 มีการเรียกใช้ตัวแปร num2 ซึ่งประกาศอยู่ที่บรรทัดที่ 11 ภายใต้บล็อกของเครื่องหมาย { ในบรรรทัดที่ 10 และเครื่องหมาย } ในบรรทัดที่ 15 การเรียกใช้ตัวแปร num2 นอกขอบเขตของตัวแปรจึงทำให้เกิดข้อผิดพลาดขึ้น

ทั้งนี้หากต้องให้ตัวแปรสามารถใช้งานได้ในทุกเมท็อดภายในคลาสจะต้องประกาศตัวแปรแบบ static ในภาษาจาวา ซึ่งเรียกตัวแปรลักษณะนี้ว่า ตัวแปรส่วนกลาง (global variable) ซึ่งมีไวยากรณ์ในการประกาศตัวแปร ดังนี้

static ชนิดตัวแปร ชื่อตัวแปร;

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

ตัวอย่างที่ 7.4 โปรแกรม MethodEx4.java
public class MethodEx6 { 
            static int x = 0;
            public static void main(String args[]  {    
                    System.out.println("x = " + x);
                x = 5;
                        methodA();
                        methodB();
                }
            public static void methodA()  { 
                System.out.println("x = " + x);
                        x = x + 3;
            }
            public static void methodB()  { 
                System.out.println("x = " + x); 
                }
        }
ผลการทำงานของโปรแกรม คือ

x = 0

x = 5

x = 8

จากตัวอย่างที่ 7.6 ตัวแปร x เป็นตัวแปรส่วนกลางซึ่งประกาศในบรรทัดที่ 2 และมีการกำหนดค่าเริ่มต้นให้ x มีค่าเท่ากับ 0 ต่อมามีการเรียกใช้ตัวแปร x ที่เมท็อด main ในบรรทัดที่ 4 ผลการพิมพ์ค่า x จะได้ว่า x มีค่าเท่ากับ 0 ต่อมามีการเปลี่ยนแปลงค่า x โดยกำหนดให้ x = 5 หลังจากนั้นมีการเรียกใช้เมท็อด methodA ภายในเมท็อดนี้มีการเรียกใช้ตัวแปร x ผลการพิมพ์จะได้ว่า x = 5 ซึ่งเป็นค่า x ในขณะนี้หลังจากที่เมท็อด main ได้เปลี่ยนค่า x ไปเมื่อเมท็อด methodA เรียกใช้ก็จะเห็นค่าที่เปลี่ยนไปด้วยเพราะตัวแปร x นี้เป็นตัวแปรที่ถูกใช้ร่วมกันในทุกเมท็อด ต่อมาที่เมท็อด methodA ได้ทำการบวกค่า x เพิ่มขึ้นอีก 3 ทำให้ในขณะนี้ x มีค่าเท่ากับ 8 หลังจากนั้นเมท็อด methodB มีการเรียกใช้ตัวแปร x ในการพิมพ์จะได้ว่า x = 8 ตามค่าที่เปลี่ยนแปลงไป

7.7 การใช้งานเมท็อดในคลาสอื่นและเมท็อดทางคณิตศาสตร์

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

charAt() เป็นเมท็อดที่ใช้ในการดึงค่าตัวอักษรออกจากข้อความ (String) โดยระบุตำแหน่งที่ต้องการ ตัวอย่างเช่น

    String text = "PSU Trang";
    char ch = text.charAt(2);

ผลลัพธ์ที่ได้คือ ตัวแปร ch มีค่าเท่ากับ ‘U’

toCharArray() เป็นคือเมท็อดที่ใช้ในการแยกตัวอักษรแต่ละตัวออกจากข้อความแล้วนำไปเก็บในอาร์เรย์ของ char ตัวอย่างเช่น

    String text = "PSU Trang";
    char[] uName = text.tocharArray();

ผลลัพธ์ที่ได้คือในอาร์เรย์ uName จะมีค่าดังนี้ uName = {‘P’, ‘S’, ‘U’, ’ ‘, ’T’, ‘r’, ‘a’, ‘n’, ‘g’}

อีกตัวอย่างหนึ่งที่สำคัญ คือ คลาส Math ซึ่งประกอบไปด้วยเมท็อดที่ช่วยในการคำนวณฟังก์ชั่นพื้นฐานทางคณิตศาสตร์ เช่น pow(a, b) เป็นเมท็อดสำหรับหาค่าเลยยกกำลัง ab นอกจากนี้คลาส Math ยังมีค่าคงที่อีก 2 ตัวที่ใช้บ่อยคือ PI และ E

ตัวอย่างของเมท็อดในคลาส Math แยกตามหมวดหมู่ดังนี้

  1. เมท็อดเกี่ยวกับตรีโกณมิติ ตัวอย่างเช่น

  2. Method เกี่ยวกับเอ็กซ์โพเนนเชียล ตัวอย่างเช่น

  3. เทม็อดเกี่ยวกับการปัดเศษ (rounding) ตัวอย่างเช่น การปัดเศษขึ้น

การปัดเศษลง

การปัดเศษให้เป็นจำนวนเต็ม

  1. เมท็อดในการหาค่าต่ำสุด มากสุด และค่าสัมบูรณ์ ตัวอย่างเช่น

  2. เมท็อดในสุ่มค่า (random) ตัวอย่างเช่น

จะเป็นการสุ่มตัวเลขจำนวนเต็ม (int) ตั้งแต่ 0 ถึง 9

จะเป็นการสุ่มตัวเลขจำนวนเต็ม (int) ตั้งแต่ 50 ถึง 99 เป็นต้น

แบบฝึกหัด

  1. ให้หาผลลัพธ์ของโปรแกรมต่อไปนี้ พร้องทั้งอธิบายลำดับการทำงาน
public class CallStack {

            public static void main(String[] args)  {
                System.out.print("I");  
                methodA();
                methodB();
                System.out.println("Easy"); 
                }
            public static void methodA()  {
                System.out.print(" Love ");
                System.out.println("Programming");
            }
            public static void methodB()  {
                methodC();
                System.out.print(" Is "); 
            }
            public static void methodC()  {
                System.out.print(" For Me ");
                System.out.print("Java Programming");
            }
    }
  1. ให้เขียนโปรแกรมรับค่าความกว้าง (width) ความยาว (length) และความสูง (height) ทางคีย์บอร์ด เพื่อนำมาหาพื้นที่ (area) และปริมาตร (volume) ซึ่งมีสูตรการคำนวณดังนี้

    พื้นที่ = ความกว้าง \(\times\) ความยาว

    ปริมาตร = ความกว้าง \(\times\) ความยาว \(\times\) ความสูง

โดยกำหนดเมท็อดดังต่อไปนี้ เมท็อด calArea ใช้ในการคำนวณหาพื้นที่ โดยรับค่าความกว้าง (w) และความยาว (l) ตามลำดับมาใช้ในการคำนวณ ซึ่งกำหนดให้มีส่วนหัวดังนี้

public static double calArea(double w, double l)

เมท็อด calVolume ใช้ในการคำนวณหาปริมาตร โดยรับค่าความกว้าง (w) ความยาว (l) และความสูง (h) ตามลำดับมาใช้ในการคำนวณ ซึ่งกำหนดให้มีส่วนหัวดังนี้

public static double calVolume(double w, double l, double h)

เมท็อด displayResult ใช้ในการแสดงผลพื้นที่ (a) และปริมาตร (v) โดยรับค่าพื้นที่และปริมาตรตามลำดับ ซึ่งกำหนดให้มีส่วนหัวดังนี้

public static void displayResult(double a, double v)

ตัวอย่างหน้าจอโปรแกรมเมื่อผู้ใช้ป้อนความกว้างเป็น 3 ความยาวเป็น 4 และความสูงเป็น 2

Tip

Enter width: 3

Enter length: 4

Enter height: 2

Area is 12.0

Volume is 24

  1. ให้เติมส่วนของโปรแกรมที่เว้นว่างไว้ให้สมบูรณ์ โดยโปรแกรมนี้นำค่า num1 และ num2 มาหาค่าผลบวก ผลลบ ผลคูณ และผลหาร โดยเรียกใช้ method ชื่อ plus, minus, multiply และ divide ตามลำดับ