การเขียนโปรแกรมภาษาจาวาเชิงออปเจ็ค 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/