วันอังคารที่ 31 มกราคม พ.ศ. 2555

Object Oriented Java Programming Part2

Object Oriented Java Programming Part2







การเขียนโปรแกรมภาษาจาวาเชิงออปเจ็ค Object Oriented Java Programming
                วัตถุประสงค์
Ø อธิบายเมธอด และการเรียกใช้เมธอด
Ø อธิบายคีย์เวิร์ดที่ใช้เป็น modifier ของเมธอด
Ø แนะนำการเขียนโปรแกรมภาษาจาวาเชิงออปเจ็ค
Ø อธิบายคุณลักษณะเด่นของโปรแกรมเชิงออปเจ็ค
Ø อธิบายความหมายของ Constructor

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

รูปแบบการเรียกใช้เมธอด
Ø รูปแบบของคำสั่งที่มีการเรียกใช้เมธอดเป็นดังนี้
Obj.methodName ([arguments])  ;
Ø arguments อาจจะเป็นข้อมูลค่าคงที่หรือตัวแปร
Ø ชนิดข้อมูลของ arguments ที่ใช้ในการเรียกเมธอด จะต้องสอดคล้องกันกับชนิดข้อมูลของ arguments ของเมธอด

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

การส่งผ่าน argument
Ø กรณีที่เมธอดมี argument ที่จะรับค่าเพื่อนำไปใช้ในเมธอด อาทิเช่น
Public void setGPA(double GPA)                   {
                .  .   .
}
Ø คำสั่งที่เรียกใช้เมธอดนี้ จะต้องส่ง argument ที่มีชนิดข้อมูลเป็น double ไปพร้อมกับชื่อเมธอด เช่น setGPA(3.0)  ;

Argument ของเมธอด
Ø Argument  ของเมธอดจะมีชนิดข้อมูลเป็นสองแบบตามชนิดข้อมูลของตัวแปรดังนี้
·       argument  ที่มีชนิดข้อมูลแบบพื้นฐาน
·       argument  ที่มีชนิดข้อมูลแบบอ้างอิง
Ø ในกรณีของ argument ที่มีชนิดข้อมูลแบบพื้นฐาน เราสามารถที่จะส่งค่าคงที่ข้อมูล ตัวแปร หรือนิพจน์ให้กับ argument ได้ ตัวอย่างเช่น
·       ค่าคงที่ข้อมูล เช่น
s1.setGPA (3.0)  ;
·       ตัวแปร เช่น
double x = 3.0  ;
·       นิพจน์ เช่น
s1.setGPA (3.0 + 0.05)   ;
               

                argument ที่มีชนิดข้อมูลแบบอ้างอิง
Ø เราจะต้องส่งออปเจ็คที่มีชนิดข้อมูลที่สอดคล้องไปเท่านั้น
Ø ยกเว้นกรณีที่ argument นั้นมีชนิดข้อมูลเป็น String ซึ่งในกรณีนี้จะสามารถส่งข้อมูลค่าคงที่ได้

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

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

การรับค่าที่ส่งกลับมาจากเมธอด
Ø เมธอดใดๆของคลาสสามารถที่จะส่งค่าที่ส่งกลับมาได้ ซึ่งชนิดข้อมูลของค่าที่จะส่งกลับอาจเป็นชนิดข้อมูลแบบพื้นฐาน หรือเป็นชนิดข้อมูลแบบอ้างอิง
Ø เมธอดที่มีค่าจะส่งกลับมาจะต้องมีคำสั่ง return ซึ่งจะระบุค่าที่ส่งกลับโดยมีรูปแบบดังนี้
return value ;
Ø คำสั่งที่เรียกใช้เมธอด อาจจะรับค่าที่ส่งกลับมาเก็บไว้ในตัวแปรหรือเป็นตัวถูดำเนินการในนิพจน์ ตัวอย่างเช่น
double  d  =  getGPA ()  ;
System.out.println (“GPA: ” +getGPA () )  ;
               
modifier  ของเมธอด
Ø Modifier ของเมธอดประกอบด้วย
·       access modifier
·       static
·       abstract
·       synchronized
·       final
Ø access modifier ใช้เพื่อระบุระดับการเข้าถึง โดยมีคีย์เวิร์ดต่างๆดังนี้
·       public
·       protected
·       private
·       default (ไม่ระบุคีย์เวิร์ดใดๆ)
เมธอดแบบ static
Ø เมธอดโดยทั่วไปจะมี modifier เป็นแบบ  non-static
Ø เมธอดที่มี modifier เป็นแบบ static จะสามารถถูกเรียกใช้งานโดยใช้ชื่อคลาสได้เลยไม่จำเป็นต้องสร้างออปเจ็คชองคลาสนั้นขึ้นมาก่อน ซึ่งมีรูปแบบดังนี้
className.methodName ()  ;
Ø ตัวอย่างเช่น เมธอดทุกเมธอดในคลาส Match เป็นแบบ static ดังนั้นการเรียกใช้งานทุกเมธอดในคลาสสามารถทำได้ เช่น
Match.sqrt (4)  ;
Ø เมธอดแบบ static จะไม่สามารถเรียกใช้เมธอดหรือตัวแปรของออปเจ็คได้โดยตรง

คุณลักษณะแบบ static
Ø ตัวแปรคลาสที่มี modifier เป็นแบบ static จะเป็นตัวแปรของคลาสที่ใช้ร่วมกันสำหรับทุกออปเจ็ค
Ø ตัวแปรที่มี modifier เป็นแบบ static จะสามารถถูกเรียกใช้งานโดยใช้ชื่อคลาสได้เลย ไม่จำเป็นต้องสร้างออปเจ็คของคลาสขึ้นมาก่อน เช่นเดียวกันกับเมธอดที่มี modifier เป็นแบบ static
เมธอดแบบ Overloaded
Ø ภาษาจาวาอนุญาตให้คลาสใดๆมีเมธอดที่มีชื่อเดียวกันมากกว่าหนึ่งเมธอดได้ แต่เมธอดเหล่านั้นจะต้องมีจำนวนหรือชนิดข้อมูลของ argument ที่ต่างกัน
Ø ตัวอย่างต่อไปนี้เป็นการเขียนเมธอดแบบ Overloaded
Public void setDetails (String ID , String  n)  {
}
Public void setDetails (String ID , double GPA)  {
}
Public void setDetails (double GPA , String  n)  {
}
Ø ตัวอย่างต่อไปนี้เป็นการเขียนเมธอดแบบ Overloaded ที่ไม่ถูกต้อง

Public void setDetails (string ID , double  GPA)  {
}
Public void setDetails (String n , double  GPA)  {
}
                คีย์เวิร์ด this
Ø คีย์เวิร์ด this หมายถึงออปเจ็คของตัวเอง
Ø เราสามารถที่จะเรียกใช้เมธอดหรือคุณลักษณะภายในคลาสได้โดยใช้คีย์เวิร์ด this ซึ่งมีรูปแบบดังนี้
this.methodName () ;
this.attributeName
Ø โดยทั่วไปเราจะไม่ใช้คีย์เวิร์ด this ในคำสั่ง ยกเว้นในกรณีที่จำเป็น

การเขียนโปรแกรมโดยใช้หลักการของการห่อหุ้ม
Ø คุณลักษณะเด่นของโปรแกรมเชิงออปเจ็คมีอยู่สามอย่างคือ การห่อหุ้ม การสืบทอด และการมีได้หลายรูปแบบ
Ø ข้อดีของการห่อหุ้มประการหนึ่งคือการซ่อนเร้นข้อมูล
Ø หลักการห่อหุ้มของออปเจ็คทำได้ดังนี้
·       กำหนดคุณลักษณะของออปเจ็คให้มี mofifier เป็น private เพื่อซ่อนไม่ให้ออปเจ็คอื่นๆเรียกใช้ได้
·       กำหนดเมธอดของออปเจ็คที่ต้องการให้ออปเจ็คอื่นๆเรียกใช้ให้มี modifile เป็น public

เมธอดแบบ setter
Ø เมธอดแบบ accessor แบ่งออกเป็นสองประเภทคือ
·       เมธอดแบบ setter
·       เมธอดแบบ getter
Ø เมธอดแบบ setter จะใช้ในการกำหนดค่าของคุณลักษณะ
Ø โดยทั่วไปชื่อขอเมธอดแบบ setter จะขึ้นต้นด้วยคำว่า set แล้วตามด้วยชื่อของคุณลักษณะ ซึ่งมีรูปแบบดังนี้
public  void  setAttributeName (dataType  arg)   {
                attributeName  = arg  ;
}

                เมธอดแบบ getter
Ø เมธอดแบบ getter จะให้เรียกค่าของคุณลักษณะ
Ø โดยทั่วไปชื่อของเมธอดแบบ getter จะขึ้นต้นด้วยคำว่า get แล้วตามด้วยชื่อของคุณลักษณะ ซึ่งมีรูปแบบดังนี้
Public  dataType  getAttributeName ()   {
                Return  attributeName  ;
}


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

รูปแบบหลักการของการสืบทอด
Student
-Id : String
-name : String
-gpa : double
-minGPA : double = 2.00


               
                                               
S1 : Student
-theisTitle : String
-supervisor : String






                คีย์เวิร์ด protected
Ø คุณลักษณะหรือเมธอดของ superclass ที่มี modifier เป็นแบบ private จะทำให้ subclass ไม่สามารถที่จะเรียกใช้ได้
Ø ภาษาจาวากำหนดให้มี access modifier ที่ชื่อ protected ซึ่งจะทำให้ subclass สามารถเรียกใช้เมธอดหรือคุณลักษณะของ superclass ได้
Ø ตัวอย่างเช่น
Protected  String  name  ;

                คลาสที่ชื่อว่า Object
Ø ภาษาจาวาได้กำหนดให้คลาสใดๆสามารถจะสืบทอดคลาสอื่นได้เพียงคลาสเดียวเท่านั้น
Ø คลาสทุกคลาสในภาษาจาวาถ้าไม่ได้สืบทอดจากคลาสใดเลยจะถือว่าคลาสนั้นสืบทอดจากคลาสที่ชื่อ Object
Ø ตัวอย่างเช่น
public  class  Student  extends  Object  {
                .  .  .
}
Ø คลาสที่ชื่อ Object จะมีเมธอดที่สำคัญคือ
public  String  toString ()
                และ        public  boolean  equals (Object  o)
               
                ตัวอย่างการสืบทอดที่ไม่ถูกต้อง
Ø เราสามารถที่ตรวจสอบหลักการของการสืบทอดด้วยคำว่า is a
public  class  Shirt  {
char  size  ;
float  price  ;
                                 }
public  class  Skirt  extends  Shirt  {
                boolean  long  ;
}
                ตัวอย่างการสืบทอดที่ถูกต้อง
public  class  Chothing  {
char  size  ;
float  price  ;
                                 }
public  class  Shirt  extends  Chothing    {
}
public  class  Skirt  extends  Chothing    {
                boolean  long  ;
}
                การเขียนโปรแกรมโดยใช้หลักการของการมีได้หลายรูปแบบ
Ø การมีได้หลายรูปแบบหมายถึง คุณลักษณะของออปเจ็คของคลาสที่ต่างกัน สามารถตอบสนองต่อเมธอดเดียวกันในวิธีการที่ต่างกันได้ ซึ่งหมายถึงการเขียนเมธอดแบบ overridden และการใช้ Dynamic Binding
Ø การเขียนเมธอดแบบ overridden มีข้อกำหนดดังนี้
·       จำนวนและชนิดข้อมูลของ argument จะต้องเหมือนเดิม
·       ชนิดข้อมูลของค่าที่ส่งกลับจะต้องเหมือนเดิม
·       Access modifier จะต้องไม่มีระดับต่ำกว่าเดิมอาทิเช่น ถ้าเมธอดเดิมเป็น public จะไม่สามารถเปลี่ยนเป็น private ได้

คีย์เวิร์ด super
Ø super เป็นคีย์เวิร์ดที่ใช้ในทางการอ้างอิง superclass เพื่อที่จะเรียกใช้เมะอดหรือ constructor  ของ superclass  โดยมีรูปแบบคำสั่งดังนี้
                 super.methodName ([arguments])
Ø ตัวอย่างเช่น คลาส Gradstudent อาจมีเมธอดที่ชื่อ showDetails () โดยมีคำสั่งที่เรียกใช้เมธอด showDetails () ของคลาส Gradsyudent
                 public  void  showDetails ()   {
                                super.showDetails ()  ;
                                showThesis ()  ;
                 }

                Dynamic Binding
Ø ข้อดีของการมีได้หลายรูปแบบอีกประการหนึ่ง คือการที่สามารถกำหนดออปเจ็คได้หลายรูปแบบ ตัวอย่างเช่น จากรูปแบบ
                 SuperClass  obj  ;
Ø เราสามารถที่จะสร้างออปเจ็คที่ชื่อ obj ซึ่งอาจเป็นออปเจ็คของคลาสที่เป็น superclass หรือที่เป็นsubclass ได้ โดยใช้คำสั่งที่มีรูปแบบดังนี้
obj  =  new  SuperClass ()  ;
                หรือ         obj  =  new Subclass  ()  ;
Ø ตัวอย่างเช่น
                 Student  s  ;
                 s  =  new  GradStudent () ;

Constructor
Ø construtor เป็นเมธอดที่ชื่อเดียวกับชื่อคลาส ซึ่งมีรูปแบบดังนี้
                 [modifile]    ClassName ([argument])  {
                                [Statements]
                 }
Ø construtor เป็นเมธอดที่ไม่มีค่าที่จะส่งกลับแต่ไม่ต้องระบุคีย์เวิร์ด void
Ø โดยทั่วไปคลาสทุกคลาสจะมี default constructor ซึ่งมีรูปแบบดังนี้
                 Public  ClassName ()  {
                 }
Ø เราสามารถที่จะเขียน constructor ในคลาสตใดๆขึ้นมาก็ได้
Ø Default constructor จะหายไปเมื่อมีการเขียน constructor ขึ้นใหม่

คำสั่ง new ()
Ø มีขั้นตอนการทำงานดังนี้
·       กำหนดเนื้อหาที่ในหน่วยความจำให้กับออปเจ็ค
·       กำหนดค่าเริ่มต้นให้กับคุณลักษณะของออปเจ็ค
·       กำหนดค่าของคุณลักษณะของออปเจ็คตามคำสั่งกำหนดค่าที่ประกาศไว้
·       เรียกใช้ constructor
Ø ตัวอย่างเช่น
                 Public  class MyDate  {
                                private  int  day  = 1 ;
                                private  int  month  = 1 ;
                                private  int  year  = 1 ;
                                publice  MyDate  (int  m , int y)  {
                                                day  =  d  ;
                                                month  =  m  ;
                                                year  =  y  ;
                                }
                                 }

         รูปแสดงตัวอย่างการทำงานขั้นตอนคำสั่ง new
Ø คำสั่ง     
MyDate d1  =  new  MyDate (16,8,1972)  ;

ยังไม่ได้ใส่รูป

Constructor  และ Overloaded

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


คลาสแบบอื่นๆที่สำคัญ
Ø คลาสแบบ final
·       คลาสที่มี modifile จะหมายความว่าคลาสนั้นไม่สามารถสืบทอดได้
·       ตัวอย่างเช่น
Public  final class  String  {
                .   .   .
}
Ø คลาสแบบ abstract
·       คลาสที่มี modifile เป็น abstract จะหมายความว่าคลาสนั้นยังเป็นคลาสที่ไม่สมบูรณ์ โดยมีเมธอดแบบ abstract อยู่อย่างน้อยหนึ่งเมธอดซึ่งรูปแบบการประกาศดังนี้
[modifile]  abstract  return_type  mrthodName ([arguments] )  ;
·       เราไม่สามารถที่จะสร้างออปเจ็คของคลาสแบบ abstract ได้
               
                อินเตอร์เฟส
Ø อินเตอร์เฟส (interface) ลักษณะคล้ายกับคลาสแบบ abstract แต่จะประกอบด้วยเมธอดที่ยังไม่สมบูรณ์เท่านั้น โดยมีรูปแบบดังนี้
                 [modifile]  interface  InterfaceName   {
                                [methods  () ; ]
                 }
Ø อินเตอร์เฟสกำหนดขึ้นมาเพื่อให้คลาสอื่นนำไปใช้งานโดยใช้คีย์เวิร์ด implements
Ø อินเตอร์เฟสจะเหมือนกับคลาสแบบ abstract ตรงที่เราจะไม่สามรถสร้างออปเจ็คของอินเตอร์เฟสได้
ภาษาจาวากำหนดให้คลาสใดๆสามารถ implements อินเตอร์เฟสได้หลายอินเตอร์เฟส


รับเขียนโปรแกรม Android Application และสอนการเขียนโปรแกรม สอน online ได้

อดุลย์ 081-6452400  e-mail fongwe_a@hotmail.com  

more info about Android Development
http://androiddevelopersthai.blogspot.com/