คลาสและออบเจ็ค

24 August 2016

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

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

สร้าง Classes

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

class ClassName {
    // member variables
    // member methods
}

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

class Person {
    public String name;
    public int age;
    float speed = 4.0f;

    void setSpeed (float newSpeed) {
        speed = newSpeed;
    }

    float getSpeed () {
        return speed;
    }

    void run () {
        System.out.println(name + " is running at speed " + speed + " feet/s.");
    }
}

ในตัวอย่างด้านบน เราสร้างคลาสที่ชื่อว่า Person และในคลาสนี้สมาชิกที่เป็นตัวแปร 3 ตัวคือ name เป็นตัวแปร String สำหรับเก็บชื่อ age เป็นตัวแปรแบบ integer สำหรับเก็บอายุ และ speed เป็นตัวแปรแบบ float สำหรับเก็บความเร็ว และสมาชิกแบบเมธอด 3 ตัว คือ เมธอด setSpeed() สำหรับกำหนดความเร็วใหม่ เมธอด getSpeed() สำหรับรับค่าความเร็วไปใช้งาน และเมธอด run() เป็นเมธอดสำหรับให้ออบเจ็คทำการวิ่ง ในตัวอย่างเป็นการแสดงข้อความ

Info: ในการสร้างคลาสหรือ Interfaces ในภาษา Java นั้น คุณสามารถสร้างแยกออกเป็นไฟล์ใหม่ได้ ในการสร้างคลาสจะต้องใช้คำสั่ง public และชื่อของคลาสต้องตรงกันกับชื่อของไฟล์ เช่น คลาสของคุณชื่อว่า public class MyClass {... ชื่อไฟล์ต้องเป็น MyClass.java

สร้างและใช้งาน Object

หลังจากที่เราสร้างคลาสแล้ว ต่อไปเป็นการนำคลาสมาสร้างออบเจ็ค เราจะนำคลาส Person มาสร้างออบเจ็คสำหรับตัวอย่างต่อไป

public class ObjectExample {
    public static void main(String[] args) {
        Person p1 = new Person();
        Person p2 = new Person();

        p1.name = "Mateo";
        p1.age = 20;
        p1.speed = 3.5f;

        p2.name = "Danny";
        p2.age = 25;

        System.out.println("p1 is " + p1.name);
        System.out.println("He is " + p1.age + " year old.");
        System.out.println(p1.name + " has speed " + p1.speed + " feet/s.");    
        p1.run();

        System.out.println("\np2 is " + p2.name);
        System.out.println("He is " + p2.age + " year old.");
        System.out.println(p2.name + " has speed " + p2.getSpeed() + " feet/s.");
        p2.run();

        p2.setSpeed(5.0f);
        p2.run();

    }
}

class Person {
    public String name;
    public int age;
    float speed = 4.0f;

    void setSpeed (float newSpeed) {
        speed = newSpeed;
    }

    float getSpeed () {
        return speed;
    }

    void run () {
        System.out.println(name + " is running at speed " + speed + " feet/s.");
    }
}

ในตัวอย่างเราได้สร้างออบเจ็คจากคลาส Person ด้วยคำสั่ง

        Person p1 = new Person();
        Person p2 = new Person();

โดย p1 และ p2 นั้นเป็นตัวแปรประเภทออบเจ็คของคลาส Person โดยออบเจ็คทั้งสองนั้นเป็นอิสระต่อกัน โดยแต่ละออบเจ็คจะมีตัวแปรและเมธอดเป็นของมันเอง ต่อมาเราได้กำหนดค่าให้กับออบเจ็คทั้งสองด้วยคำสั่ง

        p1.name = "Mateo";
        p1.age = 20;
        p1.speed = 3.5f;

        p2.name = "Danny";
        p2.age = 25;

ในการเข้าถึงสมาชิกของออบเจ็คนั้นจะใช้เครื่องหมาย dot (.) แล้วตามด้วยชื่อของตัวแปรที่จะเข้าถึง เราได้กำหนดค่าต่างๆ ให้กับออบเจ็คทั้งสอง ในตัวอย่างเราไม่ได้กำหนดค่า speed ให้กับออบเจ็ค p2 ดังนั้นมันจะใช้ default ที่เราได้ประกาศไว้ในคลาสคือ 4.0

ต่อมาเราแสดงผลข้อมูลแต่ละออบเจ็ค ออกมาดู

        System.out.println("p1 is " + p1.name);
        System.out.println("He is " + p1.age + " year old.");
        System.out.println(p1.name + " has speed " + p1.speed + " feet/s.");    
        p1.run();

        System.out.println("\np2 is " + p2.name);
        System.out.println("He is " + p2.age + " year old.");
        System.out.println(p2.name + " has speed " + p2.getSpeed() + " feet/s.");
        p2.run();

        p2.setSpeed(5.0f);
        p2.run();

จากการแสดงผลในตัวอย่างนั้นตรงไปตรงมา เราได้แสดงชื่อ อายุ และความเร็วของแต่ละออบเจ็คออกมาทางหน้าจอ และเราเรียกใช้เมธอดด้วย เราเรียกใช้เมธอด ในตัวอย่างของออบเจ็ค p2 เราใช้ run() เพื่อสั่งให้ออบเจ็คทำการรัน p2.getSpeed() ในการรับค่า speed ออกมา นอกจากนี้เรายังเปลี่ยนแปลง speed ของออบเจ็ค p2 และใช้เมธอด run() อีกครั้งเพื่อดูความเร็วของมัน

p1 is Mateo
He is 20 year old.
Mateo has speed 3.5 feet/s.
Mateo is running at speed 3.5 feet/s.

p2 is Danny
He is 25 year old.
Danny has speed 4.0 feet/s.
Danny is running at speed 4.0 feet/s.
Danny is running at speed 5.0 feet/s.

และข้างล่างเป็นผลลัพธ์ของโปรแกรม

Constructor

คอนสตรัคเตอร์ (constructor) นั้นคือเมธอดพิเศษที่จะทำงานเมื่อออบเจ็คถูกสร้างขึ้น เรามักใช้คอนสตัคเตอร์ในการกำหนดค่าเริ่มต้นให้กับออบเจ็ค ตัวอย่างการสร้างและใช้งานคอนสตรัคเตอร์ในภาษา Java

class Person {
    public String name;
    public int age;
    float speed = 4.0f;

    public Person () {
    }

    public Person (String name) {
        this.name = name;
    }

    public Person (String name, int age) {
        this.name = name;
        this.age = age;
    }

    void setSpeed (float newSpeed) {
        speed = newSpeed;
    }

    float getSpeed () {
        return speed;
    }

    void run () {
        System.out.println(name + " is running at speed " + speed + " feet/s.");
    }
}

ในตัวอย่าง เราได้สร้างคอนสตรัคเตอร์สำหรับคลาส Person ด้วยโดยคอนสตรัคเตอร์นั้นจะต้องมีชื่อเหมือนคลาสและกำหนดระดับการเข้าถึงเป็น public เสมอ เราสามารถสร้างได้หลายคอนสตรัคเตอร์ซึ่งเราเรียกว่า Overloading Constructor เช่นเดียวกันกับ Overloading Method

Person p1 = new Person("Mateo");
Person p2 = new Person("Marcus", 25);
Person p3 = new Person();

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

คำสั่ง this

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

คำสั่ง static

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

public class ObjectExample {
    public static void main(String[] args) {
        Person p1 = new Person();
        Person p2 = new Person();

        p1.name = "Mateo";
        p1.age = 20;

        p2.name = "Danny";
        p2.age = 25;

        System.out.println("Name: " + p1.name);
         System.out.println("Age: " + p1.age);
        System.out.println(StaticMember.NAME_PREFIX + " " + p1.name);

        System.out.println("\nName: " + p2.name);
        System.out.println("Age: " + p2.age);
        StaticMember.displayName(p2.name);
    }
}

class Person {
    public String name;
    public static int age;
}

class StaticMember {
    public static String NAME_PREFIX = "Mr.";

    public static void displayName (String name) {
        System.out.println(NAME_PREFIX + " " + name);
    }
}

ในตัวอย่างเราได้เปลี่ยนให้ตัวแปร age ในคลาส Person เป็น static ดังนั้นออบเจ็คทุกออบเจ็คที่ถูกสร้างโดยคลาสนี้ จะให้ตัวแปรนี้ร่วมกัน

และเราได้สร้างคลาส StaticMember โดยมีสมาชิกเป็น static ทั้งหมด สมาชิกของมันสามารถเข้าถึงได้จากที่ใดๆ โดย prefix ของคลาสเช่น StaticMember.NAME_PREFIX และ StaticMember.displayName() ที่เราได้ใช้ในตัวอย่าง

Name: Mateo
Age: 25
Mr. Mateo

Name: Danny
Age: 25
Mr. Danny

และนี่เป็นผลการทำงานของโปรแกรม คุณว่าอายุของออบเจ็คทั้งสองนั้นมีค่าเท่ากับ เพราะมันได้รับการเปลี่ยนแปลงล่าสุดจากคำสั่ง p2.age = 25

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

บทความนี้เป็นประโยชน์หรือไม่? Yes · No