..CLASS..
วันนี้เราจะมารู้จักเรื่อง Class ในภาษาจาวากันนะคะ
สรุปความรู้ที่เรียนในวันที่ 24/08/50
การเขียนโปรแกรมแบบ OPP นั้นเป็นการเขียนโปรแกรมโดยใช้ออบเจ็กต์ (Object) เป็น
หลัก ความหมายของออบเจ็กต์ก็คือสิ่งต่างๆ ที่มีตัวตนและนำไปใช้ในการประมวลผลข้อมูลได้
เช่น นักเรียน โต๊ะเรียน วงกลม หรือการกู้ยืมเงิน เป็นต้น
ออบเจ็กต์หนึ่งๆ ก็จะมี "คุณสมบัติ" (Attribute) ที่ใช้ในการนิยามความหมายของแต่ละ
ออบเจ็กต์ ว่าประกอบด้วยลักษณะหรือข้อมูลอะไรบ้าง นอกจากนั้นยังมีพฤติกรรม (Behavior) ที่
ใช้ในการอธิบายว่าออบเจ็กต์นั้นทำอะไรได้บ้าง ซึ่งใน Java จะเรียก Behavior ว่า "เมธอด
(Method)" (ออบเจ็กต์จะเป็นสมาชิกหรือ Instance ของคลาสใดคลาสหนึ่ง) โดยภายใน
คลาสนั้น จะมีเมธอดตั้งแต่ 1 เมธอดขึ้นไป ที่ใช้อธิบายว่าออบเจ็กต์ทำอะไรได้บ้าง
Class หมายถึง โครงสร้างของออบเจ็กต์ซึ่งมีการจัดกลุ่มของโครงสร้างจากคุณสมบัติที่เรา
สนใจ (Domain) ว่ามี Attribute (Data) และเมธอดอะไรบ้าง
ชนิดของคลาส แบ่งตามการใช้งานได้ดังนี้
- คลาสที่ทำหน้าที่เป็นชนิดข้อมูล
- คลาสที่ทำหน้าที่เป็นผู้เรียกใช้ชนิดข้อมูล หรือเป็น Application
โครงสร้างของคลาส
[ class Modifiers ] class ชื่อ class
{
field Member Variables → ( properties )
methods Member Function → behaviors
nested Classes/Interface
}
[ class Modifiers ]
public ( publicly accessible )
abstract ( only blue print no instances of the class may be created )
final ( cannot be subclassed )
strictftp ( exact floating point operation )
Inheritance ใน object-oriented จะหมายถึงเราสามารถกำหนดนิยามคลาสอยู่ภายในคลาสอื่น
อีกก็ได้ เช่น ดอกกุหลาบ ดอกลิลลี่ ดอกชบา ต่างก็เป็นดอกไม้เหมือนกันแต่ต่างชนิดกัน ซึ่งเราเรียก
ดอกไม้พวกนี้ว่าเป็น สับคลาส (subclass) ของคลาสดอกไม้ ดังนั้น คลาสดอกไม้ เราเรียกว่า ซูเปอร์คลาส
(superclass) ของคลาสดอกกุหลาบ ดอกลิลลี่ ดอกชบา
ในแต่ละสับคลาสสามารถสืบทอดคุณลักษณะ (variable) จากซูเปอร์คลาสได้ เช่น ดอกกุหลาบ ดอกลิลลี่ ดอกชบา ต่างก็มี คุณสมบัติ คือ สี พันธุ์ กลิ่น และ ในแต่ละสับคลาสสามารถสืบทอดพฤติกรรม (method) จากซูเปอร์คลาสได้ เช่น สามารถสืบพันธุ์ได้ เป็นต้น นอกจากนี้ สับคลาสยังสามารถเพิ่มเติม variable, method และเปลี่ยนแปลง method ที่รับมาจากซูเปอร์คลาสได้
class ก็เหมือนกับแบบร่างที่ใช้อธิบาย variable และ method ที่อยู่ภายใน โดย method จะคล้ายๆกับ function ในภาษาอื่นๆ
รูปแบบในการประกาศ class
class ClassName {
........
}
การประกาศ class นั้น จะต้องขึ้นต้นด้วยคำว่า class เสมอ และตามด้วยชื่อของ class นั้นๆ ซึ่งภายใน {} จะมีการประกาศ ตัวแปรหรือเมธอดอยู่ด้วย
เมื่อมีการรันโปรแกรมด้วย Java Interpreter นั้น เราจะต้องใส่ชื่อ class ที่เราต้องการรันก่อน หลังจากนั้น ตัว Interpreter จะเรียก เมธอด main ที่อยู่ใน class นั้นๆ ซึ่ง เมธอด main จะควบคุมการทำงานทั้งหมดของโปรแกรม รวมถึงการเรียกใช้งานเมธอดอื่นด้วย
Constructor
Constructor เป็นส่วนที่ประกอบด้วยคำสั่งที่จำเป็นสำหรับการกำหนดค่าเริ่มต้นให้กับ
attribute ต่างๆของ object โดย constructor จะถูกเรียกให้ทำงานโดยอัตโนมัติ เมื่อเราสร้าง
object ขึ้นจากคลาสด้วย keyword new Constructor มีรูปร่างหน้าตาคล้ายคล้ายเมธอด แต่ต่างจาก
เมธอดตรงที่
- ชื่อของ Constructor ต้องเหมือนกับชื่อคลาส แต่เมธอดต้องมีชื่อไม่เหมือนชื่อคลาส
- เมธอดมี return type แต่ Constructor จะไม่มี return type ดังนั้นจึงไม่มีการส่งคืนค่าใดๆ
กลับออกไปจาก Constructor
- คลาสทุกคลาสไม่จำเป็นต้องสร้าง Constructor ขึ้นมาก็ได้ถ้าหากว่าเราไม่ต้องการกำหนดค่า
เริ่มต้นอะไรเป็นพิเศษให้กับ attribute ของ object เพราะโดยปกติถ้าเราไม่สร้าง Constructor ขึ้น
ในคลาสแล้ว คอมไฟเลอร์ก็จะทำการสร้าง Constructor เพื่อกำหนดค่าเริ่มต้นพื้นฐานให้กับแต่ละ
attribute อยู่แล้ว (ค่า 0 สำหรับ attribute ที่มีชนิดข้อมูลเป็นแบบตัวเลข, ค่า null สำหรับ
attribute ที่เป็นตัวแปร object และค่า false สำหรับ attribute ที่มีข้อมูลเป็น boolean) เราเรียก
Constructor ที่คอมไพเลอร์สร้างให้นี้ เรียกว่า default constructor
ตัวแปรระดับคลาส
ตัวแปรระดับคลาส หมายถึง ตัวแปรที่นิยามไว้ภายในคลาส (นอกเมธอด) เพื่อให้ทุกส่วนภาย
ในคลาสสามารถเรียกใช้งานได้ ตัวแปรระดับคลาสมีอยู่ 2 ชนิด คือ
ο ตัวแปรแบบ "Instance"
เป็นตัวแปรที่ใช้ได้เฉพาะภายในออบเจ็กต์ใดออบเจ็กต์หนึ่งเท่านั้น ไม่สามารถนำมาใช้ร่วม
กันระหว่างออบเจ็กต์ได้ โดยปกติก็คือ ตัวแปรทั่วไปที่ใช้เก็บค่าแอททริบิวต์ของออบเจ็กต์
ο ตัวแปรที่ใช้งานร่วมกัน
เป็นตัวแปรที่สามารถนำมาใช้งานร่วมกัน ระหว่างออบเจ็กต์ได้ ไม่ว่าการอ้างถึงนั้นจะอยู่ที่
ส่วนใดของคลาส หรือโปรแกรม ก็ตามตัวแปรชนิดนี้ก็จะให้ค่าเดียวกันเสมอ (ค่าที่เปลี่ยนแปลง
ล่าสุด) เนื่องจากตัวแปรนี้จะเก็บอยู่ใน Memory ที่ Address หนึ่ง เพียง Address เดียว ตัวแปรแบบ
นี้ในภาษาจาวา จะสร้างขึ้นด้วยการระบุ keyword "static" ลงไปตอนประกาศตัวแปรด้วย
ซึ่งอาจเรียกตัวแปรประเภทนี้ว่า "Static Variavle" ก็ได้ และถ้าไม่ต้องการให้เมธอดใดที่
เรียกใช้งานตัวแปรนี้ มาเปลี่ยนแปลงค่าภายในตัวแปร ให้ใส่ Keyword "final" ไว้ด้วย เช่น static
final double PI = 3.14 เป็นต้น
หมายเหตุ
ตัวแปรที่เป็น static ถูกเรียกขึ้นมาในคลาส โดยไม่ต้องใช้ new และในคลาสหนึ่งๆ จะมีสมาชิกที่เป็น static เพียงตัวเดียวเท่านั้น มีค่าคงที่ไม่ว่าจะเข้าถึงสักกี่ครั้ง (คือจะเห็นค่าสุดท้าย) และจะใช้ตัวแปร static ได้ก็ต่อเมื่อตัวมันเป็น static
ด้วยเท่านั้น
การเข้าถึงสมาชิกของคลาสใดๆ โดยอ้างถึงคลาสนั้น เช่น sub1.var1
สรุป
static members = class member
ตัวอย่างโปรแกรม

จากโปรแกรม class3_static1 สรุปได้ดังนี้
1. คลาสมี 4 คลาสประกอบด้วย class3_static1 , sub1 , sub2 , sub3
2. มี object ดังนี้
- hello1 เป็น object ของ sub1
- hello2 เป็น object ของ sub1
3. แต่ละ class มี method ดังนี้
- class3_static1 มี method main( )
- class sub1 มี method sub1_1( ), sub1_2( ), sub1_3( )
- class sub3 มี method sub3_1( )
4. สมาชิกของคลาสที่เป็น static คือ var1
ผลการรันโปรแกรม

Message
บางครั้งออบเจ็กต์จะมีการติดต่อสื่อสารกันส่งข้อมูลระหว่างกันไปยังออบเจ็กต์อื่นที่อยู่ภายในโปรแกรมเดียวกัน ซึ่งเรียกวิธีนี้ว่า เมสเสจ
(message) เช่น ออบเจ็กต์ C ต้องการใช้เมธอดที่อยู่ในออบเจ็กต์ D ออบเจ็กต์ C จะส่งเมสเสจ ไปยังออบเจ็กต์ D
เมสเสจ ประกอบด้วย 3 องค์ประกอบ คือ
1. ชื่อออบเจ็กต์ปลายทางที่เมสเสจจะส่งไป
2. ชื่อเมธอดที่ใช้ในออบเจ็กต์นั้นๆ
3. ชื่อตัวแปรจะต้องไม่ซ้ำกัน
4. พารามิเตอร์ที่จำเป็นสำหรับเมธอดนั้น
Method
Method ในภาษาจาวานั้นก็เปรียบได้กับ function ในภาษาซีนั่นเอง โดยทั่วไปแล้วเราควรจะ define ให้ method ทำอะไรอย่างหนึ่งเท่าที่เราต้องการ การสร้าง method ให้ใหญ่และซับซ้อนมาก ๆ จะทำให้วัตถุประสงค์ของ OOP นั้นถูกบดบังลงไป องค์ประกอบสำคัญของ method นั้นมีดังนี้
ชื่อของ method
ชื่อของ method นั้นมีกฏเกณฑ์ในการตั้งเหมือนกับชื่อของตัวแปรนั่นเอง หลักการตั้งชื่อ method ที่
จะกล่าวถึงนี้มิใช่กฏบังคับ แต่ผู้เขียนโปรแกรมจาวาโดยส่วนมากใช้กันเพื่อทำให้โปรแกรมอ่านง่าย ชื่อ
มักจะตั้งให้เป็นคำกิริยาหลาย ๆ คำซึ่งแสดงถึงหน้าที่ของ method นั้น ๆ คำแรกจะถูกเขียนด้วยตัว
lowercase ทั้งหมดและตัวอักษรตัวแรกของคำถัดไปแต่ละคำจะเป็นตัว uppercase และที่เหลือจะเป็น
ตัว lowercase ตัว method getClassSched()
method arguments
argument นี้อาจจะเป็นตัวแปรพื้นฐานของจาวา หรืออาจจะเป็น object ก็ได้ เราสามารถกำหนด
method ให้รับ argument ได้เท่าที่เราต้องการ
method body
ตัว body นี้เองที่เป็นตัวกำหนดอย่างแท้จริงว่า method นี้ทำหน้าที่อะไร ภายใน method body เรา
สามารถ declare ตัวแปรขึ้นมาเพื่อใช้งานชั่วคราวซึ่ง scope ของตัวแปรเหล่านี้จะอยู่ภายใน method นี้
เท่านั้น ภายใน method body เราสามารถเรียกใช้ method อื่นของ object นั้นหรือของ object อื่นที่อยู่
ภายใน scope ของ body นั้นได้ด้วย ขอบเขตของ method body นั้นจะถูกกำหนดด้วยเครื่องหมาย
ปีกกาเปิดและปิดหนึ่งคู่
return value
ภายหลังจาก method ทำงานจนถึงบรรทัดสุดท้ายแล้วก็จะ return กลับไปหาส่วนของโปรแกรมที่
call มัน ถ้าเราอยากให้ method ส่งค่า คืนไปยังผู้ call ก็สามารถใส่ return statement เข้าไปได้ หลัง
จากที่ return statement ได้ถูก execute แล้ว control จะหลุดออกจาก method นั้นทันที โปรแกรม
ส่วนที่กระทำการ call ก็สามารถรับค่า return นั้นได้โดยการใส่ตัวแปรตามด้วยเครื่องหมายเท่ากับไว้
ด้านซ้ายของ method call ถ้าไม่มีค่า return ก็ต้องใส่ คำว่า void
ไว้ตรงตำแหน่งของชนิดรีเทอร์น
เช่นเดียวกันกับ variable ตัว method ก็ถูกจัดตาม scope ได้เป็นสามชนิดคือ private, public และ
protected
- private method สามารถถูกเรียกได้เฉพาะจาก method อื่น ๆ ภายใน class เดียวกันเท่านั้น subclass
ไม่สามารถเรียกหรือมองเห็น private method ของ superclass ส่วน public method ตรงข้ามกับ
private method อย่างสิ้นเชิง ทุกคลาสสามารถเรียกpublic method ของอีกคลาสหนึ่งได้ ส่วน
protected method ก็สามารถถูกเรียกได้เฉพาะจากตัวคลาสนั้นเองหรือ subclasses เท่านั้น
วิธีการเรียกใช้ method ของ object ตัวใหนก็ให้เอา object นั้นมาเขียนต่อด้วยจุดแล้วก็ตามด้วยชื่อ
method พร้อมด้วยชุดของ arguments ที่อยู่ในวงเล็บ เราไม่ต้องใส่ชนิดของ arguments ลงไป แต่ถ้า
เราอยากจะนำค่า return ที่ได้จาก method กลับมาใช้ก็สามารถเอาตัวแปรมารับโดยใช้ assignment
operator ได้
โครงสร้างของ method
[modifiers] [return type] name(parameter list)
{
[return data ;]
}
การใช้ "this" อ้างถึงตัวแปรของคลาส (This Reference) 
ในบางครั้งการเขียนโปรแกรมมักมีการสร้างตัวแปรของคลาส และตัวแปรของเมธอดที่มีชื่อเหมือนกัน ทั้งนี้ก็เพื่อใช้ในการสื่อความหมายนั่นเอง แต่ปัญหาที่เกิดขึ้นคือ เมื่อต้องการอ้างถึงตัวแปรของคลาสภายในเมธอด จะไม่สามารถทำได้
เพราะตัวแปรภาษาจะมองตัวแปรในขณะนั้นเป็นตัวแปรของเมธอด ดังนั้นเพื่อแก้ปัญหาดังกล่าวจึงได้มีการนำ Keyword
"this" มาใช้ โดย หากต้องการอ้างถึงตัวแปรของคลาสต้องระบุ Keyword "this" ลงไปด้วย เพื่อให้เกิดความแตกต่างกับตัวแปร
ภายในเมธอด
เช่น this.x หมายถึง อ้างถึงตัวแปร "x" ของคลาส
ประโยชน์ของการใช้ "this" อย่างหนึ่งก็คือ เป็นการป้องกันการสับสนในการอ้างถึง และรับค่าตัวแปร (Parameter) ที่เป็นชื่อเดียวกันภายในเมธอด
ตัวอย่างโปรแกรมที่ใช้ this 
ผลการรันโปรแกรม

จากโปรแกรม แสดงให้เห็นถึงการใช้this โดยถ้าเอาthis ออกจะได้เป็น0 เพราะthisเป็นตัวอ๊อบเจ็คที่อ้างถึงตัวคลาสนั้น เนื่องจากมันจะมองใกล้ตัวมันเองก่อน มันจึงแสดงผลที่ได้จาก private
อ้างอิงจาก
http://sunsite.au.ac.th/JavaCorner/startjavamenu.html
http://www.jarticles.com/tutorials/basic/classAndObject.html