ตัวแปรและเมท็อดที่เป็น static
คีย์เวิร์ด static เป็นคีย์เวิร์ดที่ใช้ประกาศหน้าตัวแปรและเมท็อด ความพิเศษของ static คือว่าโดยปกติเวลาจะสร้างอ็อปเจ็คต้องทำการ new อ็อปเจ็คขึ้นมา ตัวแปรอ็อปเจ็คก็จะอ้างอิงไปที่อ็อปเจ็คที่สร้างขึ้น แล้วก็เอาตัวแปรนี้ไปเรียกใช้ตัวแปร ใช้เมท็อด แต่ถ้าตัวแปรหรือเมท็อดนั้นเป็น static ก็จะทำให้สามารถใช้ตัวแปรหรือเมท็อดนั้นได้เลยโดยไม่ต้องสร้างอ็อปเจ็คมาเรียกใช้งาน
สำหรับตัวแปรที่เป็น static นั้น จะทำให้ตัวแปรนั้นเป็นตัวแปรของคลาสไม่ได้เป็นของอ็อปเจ็คใดอ็อปเจ็คหนึ่ง ถ้ามีการเปลี่ยนแปลงขึ้นกับตัวแปร static อ็อปเจ็คอื่นๆทั้งหมดจะมองเห็นการเปลี่ยนแปลง
วิธีประกาศ
สำหรับตัวแปร modifier static ชนิดตัวแปร ชื่อตัวแปร;
สำหรับเมท็อด modifier static ประเภทผลลัพธ์ ชื่อเมท็อด( ) { }
วิธีการเรียกใช้งานเมท็อดที่เป็น static ถ้าอยู่ในคลาสเดียวกันก็ ชื่อเมท็อด(); แบบนี้ได้เลย แต่ถ้าอยู่คนละคลาสก็ ใช่ ชื่อคลาส.ชื่อเมท็อด static
เมท็อดที่เป็น static ที่ได้ใช้มาแล้วก็คือ เมท็อด main ใน public static void main(String [] args) เพราะว่า main เป็นเมท็อดสำหรับเริ่มทำงาน ดังนั้นต้องสามารถทำงานได้เลยโดยไม่ต้องมีอ็อปเจ็คมาเรียกใช้งาน
รูป 10-2-1
เมท็อดชื่อ f ในบรรทัดที่ 17 ประกาศเป็น เมท็อด static ดังนั้นในบรรทัดที่ 12 สามารถเรียกใช้เมท็อด f ได้เลย แต่บรรทัดที่ 13 มีการเรียกใช้เมท็อด println ซึ่งอยู่ในคลาส System ก็ต้องใช้งานแบบ ชื่อคลาส.เมท็อด
รูป 10-2-2
สังเกตว่าเมื่อเอาคำว่า static ออกในบรรทัดที่ 17 จะเกิด error ขึ้นทันทีที่บรรทัดที่ 12 ที่เรียกเมท็อด
ตัวแปร เมท็อดและคลาสที่เป็น final
คล้ายกับ static คีย์เวิร์ด final ใช้ประกาศหน้าตัวแปร เมท็อดและยังประกาศหน้าคลาสได้ด้วย
- ถ้า final ไปประกาศหน้าตัวแปร ตัวแปรนั้นจะมีค่านั้นตลอดเปลี่ยนแปลงไม่ได้ เรียกว่าเป็นค่าคงที่
- ถ้าอยู่หน้าเมท็อดแล้วคลาสนี้ถูกสืบคุณสมบัติไป เมท็อดนี้จะไม่สามารถเขียนทับแก้ไขได้หรือก็คือไม่สามารถ Overriding ได้
- แต่ถ้าอยู่คลาส คลาสนั้นๆจะไม่สามารถเป็นคลาสแม่ได้เลย คือบางทีไม่ต้องการให้คนเอาอะไรเปลี่ยนทั้งนั้นก็ประกาศคลาสเป็น final เพราะบางทีประกาศเมท็อดเป็น final คลาสลูกก็เขียนเมท็อดใหม่ขึ้นมาได้ เช่น เราไม่ต้องการเขาเปลี่ยนชื่อ เขาก็เขียนเมท็อดสำหรับเปลี่ยนชื่อใหม่ได้
วิธีประกาศ
สำหรับตัวแปร final ชนิดตัวแปร ชื่อตัวแปร = ค่าคงที่ ;
สำหรับเมท็อด modifier final ประเภทผลลัพธ์ ชื่อเมท็อด( ) { }
สำหรับคลาส modifier final class ชื่อคลาส{ }
เมท็อดและคลาส abstract
เป็นอีกหนึ่งคีย์เวิร์ดในจาวาที่ใช้สำหรับการประกาศหน้าคลาสหรือเมท็อดใดๆให้มีคุณสมบัติเป็น abstract(นามธรรม) ซึ่งหมายถึงคลาสที่ไม่สามารถมีอ็อปเจ็คได้ หรือถ้าประกาศหน้าเมท็อดก็จะเป็นเมท็อดที่ไม่ได้กำหนดการทำงานเอาไว้ ให้คลาสลูกที่มาสืบทอดคุณสมบัติไปไปกำหนดการทำงานเอาเอง
ทำไมต้อง abstract – ก็เพราะว่าบางครั้งมีการสืบทอดคลาสแม่ลูก สมมติว่าคลาส A เป็นคลาสแม่ มีคลาสลูก B, C, D, E มาสืบคุณสมบัติไป ปรากฏว่าคลาส B, D และ E ต้องใช้เมท็อดชื่อ show() เหมือนกัน แต่ในคลาสแม่ A ไม่มีเมท็อดนี้อยู่ ก็ให้คลาสแม่ประกาศเมท็อดเปล่าเอาไว้ คลาสลูกจะได้ใช้งาน ซึ่งคลาสลูกก็สามารถเปลี่ยนแปลงการทำงานในเมท็อด abstract ได้
เขียนเมท็อดชื่อ show() ใหม่ไม่ได้หรอ – ได้ ก็เขียนใหม่ในคลาส B, D ,E ได้ แต่มันไม่เป็นไปตามเรื่องการสืบทอดคุณสมบัติ(inheritance)และการพ้องรูป(polymorphism) ของการเขียนจาวาแบบ OOP ก็แบบว่า ตัวแปรอ็อปเจ็คของแม่สามารถอ้างอิงอ็อปเจ็คของลูกได้ แต่ถ้าในคลาสแม่ไม่มีเมท็อด show() แม่ก็จะเรียกใช้ก็งานเมท็อดนี้ไม่ได้ ซึ่งก็ทำให้ทำงานไม่ดี
วิธีประกาศ
สำหรับคลาส modifier abstract class ชื่อคลาส { }
สำหรับเมท็อด modifier abstract ประเภทผลลัพธ์ ชื่อเมท็อด(พารามิเตอร์)
ตัวอย่างเช่น
public abstract class Name
{
public abstract void setName(String name);
}
แต่ว่า
1. ภายในคลาสที่เป็น abstract จะใช้คำสั่ง new สร้างอ็อปเจ็คของคลาสนั้นไม่ได้ เช่น new Name(); ไม่ได้
2. ภายในเมท็อดที่เป็น abstract จะมีคำสั่งไม่ได้
3. ใน abstract คลาส จะมีเมท็อดที่เป็นหรือไม่เป็น abstract อยู่ก็ได้
4. แต่ abstract เมท็อดต้องอยู่ใน abstractคลาส เท่านั้น
รูป 10-2-3
ถ้าเอาคำว่า abstract ในบรรทัดที่ 2 ออกจะ error เพราะ บรรทัดที่ 4 กับ 7 เป็น abstract เมท็อด
5. Abstract คลาสสามารถสืบทอดคุณสมบัติกันได้เหมือนคลาสปกติ แต่คลาสที่สืบทอดไป(คลาสลูก)จะต้องอิมพลีเมนท์(implement)[1] ทุกเมท็อดแม้จะไม่ได้ใช้งานก็ตาม
6. คลาสธรรมดาสืบทอดคุณสมบัติจากคลาส abstract ได้
7. มีคอนสตรัคเตอร์
Interfaces
เป็นเรื่องต่อมาจาก abstract เพราะ interface เป็นเหมือคลาสๆหนึ่งที่ เมท็อดทุกเมท็อดเป็น abstract และตัวแปรทุกตัวก็เป็นตัวแปรแบบ public static final ด้วย
การประกาศ
การเขียนคลาสปกติ public class Worker { }
เขียน interface public interface Worker { } ก็เอาคำว่า interface ไปแทน class
ใน eclipse เวลาจะสร้างคลาส ตรงใต้ class จะมีคำว่า interface ก็กดตรงนั้นเลย
รูป10-2-4
การประการตัวแปรและเมท็อดของ interface ต้องเป็น ตัวแปร public static final และ เมท็อด abstract อยู่แล้วก็ไม่ต้องเขียนแบบรูป 10-2-4 ก็ได้ เขียนแบบข้างล่างแทน
รูป 10-2-5
วิธีใช้
1. ใช้คำว่า implements ตามด้วย ชื่อinterface เช่น public class A implements interface B { } แต่อิมพลีเมนต์ interface แล้วต้องทำการ interface ทุกเมท็อดของ interface นั้นด้วย ง่ายๆคือเวลาอิมพลีเมนต์มันขึ้นขีดเส้นสีแดง error ที่ชื่อคลาส A พอกดมันก็จะอิมพลีมเนต์ให้เลยแบบนี้
รูป 10-2-6
2. ค่าคงที่ เป็น public static final หมายถึงเปลี่ยนแปลงไม่ได้
3. อิมพลีเมนต์ได้มากกว่า 1 interface เช่น class A implements Interface1, Interface2, Interface3 { }
4. ใช้ extends ก่อนอิมพลีเมนต์ก็ได้ เช่น class A extends B implements Interface1, Interface2, Interface3 { }
Abstract กับ Interface
- เมท็อดของ abstract เป็น abstract ก็ได้ไม่เป็นก็ได้ แต่ถ้า interface นี่ไม่ได้เลยต้อง abstract เท่านั้น
- ตัวแปรของ interface ล็อกค่า ของ abstract ไม่ล็อกเปลี่ยนแปลงได้
- เวลามีคลาสไหนจะใช้งานเมท็อดของ abstract ต้องสืบทอดคุณสมบัติเป็นแม่ลูกกัน แต่ interface ไม่ต้องอยากใช้งานก็เอาไปใช้
- Interface ไม่มีคอนสตรัคเตอร์ abstract มี
ทำไมต้อง interface
เนื่องจาก interface ไม่ต้องมีความสัมพันธ์แม่ลูกกันแวลาใช้งาน ขอเปรียบเทียบว่า สมมติมีคลาสหมู กับคลาสลูกหมู แน่นอนว่าแบบนี้ต้องเป็นคลาสแม่ลูกกันเพราะนอกจากต้องจะสืบทอดคุณสมบัติทั้งรูปร่าง สีผิวแล้ว พฤติกรรมหรือนิสัยยังต้องทำอะไรคล้ายๆกันด้วย แบบนี้ก็ใช้ abstract ได้ เพราะลูกหมูหลายตัวอาจจะมีพฤติกรรมบางอย่างที่ทำเฉพาะตัวไม่เหมือนกัน ในคลาสลูกหมูก็ไปแก้เมท็อดนั้นเอา เรื่องมีอยู่ว่าแม่หมูทำงานอย่างหนึ่งคือดมกลิ่นหาเห็ดในป่ากับเก็บเห็ด วันนึงแม่หมูไม่สบายเลยจะเอาคนมาทำงานแทน แน่นอนว่าลูกหมูก็ต้องทำได้อยู่แล้วเพราะ extends สกิลดมกลิ่นเห็ดมาจากแม่ แต่เนื่องจากลูกหมูเด็กไป แม่หมูเลยให้หมีป่ามาทำงานแทน แต่หมีป่าไม่ได้เป็นลูก เป็นญาติอะไรกับหมูเลยก็จะมีสกิลไม่เหมือนกัน แต่อยากให้หมีป่าหาเห็ดเก็บเห็ดได้ ก็ไปเขียน interface มาแล้วให้หมีอิมพลีเมนต์สกิลนี้ไป หมีป่าก็จะทำงานแทนแม่หมูได้
Tag ที่น่าสนใจ: java object_oriented_programming oop static_variable static_method final_variable final_method final_class abstract_method abstract_class inheritance polymorphism interfaces java_programming programming_concepts
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM