420 likes | 660 Views
Java OOP. Boonrit kidngun boonrit@feu.ac.th. การเขียนโปรแกรมเชิงวัตถุ. Object คือ สิ่งที่มีคุณสมบัติและพฤติกรรมตามที่กําหนดไว้ในคลาส ออ บ เจ็ กต์ (object) แบ่งได้เป็นสองประเภท คือ สิ่งที่เป็นรูปธรรม (tangible) คือสิ่งที่เป็นวัตถุและจับต้องได้อาทิเช่น นักศึกษา ปากกา และรถ เป็นต้น
E N D
Java OOP Boonrit kidngun boonrit@feu.ac.th
การเขียนโปรแกรมเชิงวัตถุการเขียนโปรแกรมเชิงวัตถุ • Objectคือ สิ่งที่มีคุณสมบัติและพฤติกรรมตามที่กําหนดไว้ในคลาส • ออบเจ็กต์(object) แบ่งได้เป็นสองประเภท คือ • สิ่งที่เป็นรูปธรรม (tangible) คือสิ่งที่เป็นวัตถุและจับต้องได้อาทิเช่น นักศึกษา ปากกา และรถ เป็นต้น • สิ่งที่เป็นนามธรรม (intangible) คือสิ่งที่ไม่สามารถจับต้องได้อาทิเช่น คะแนนรายชื่อวิชา การลงทะเบียน การฝาก-ถอนเงิน และตารางเที่ยวบิน เป็นต้น • Object ประกอบไปด้วย • คุณลักษณะ (attribute) หรือข้อมูล (data) • เมธอด (method) หรือพฤติกรรม (behavior)
การเขียนโปรแกรมเชิงวัตถุการเขียนโปรแกรมเชิงวัตถุ • ทุกสิ่งในโปรแกรม ที่เขียนถือว่าเป็นวัตถุ(Object) • Object แต่ละตัวมีอิสระต่อกัน การเปลี่ยนแปลงภายในObject หนึ่ง จะไม่กระทบกับ Object อื่น • การติดต่อสื่อสารระหว่าง Object จะเป็นการส่งข้อมูล Message ระหว่าง Object
Class • โครงสร้างของ object โดย class เป็นตัวกำหนดว่า object นั้นจะมี data หรือคุณลักษณะอะไรบ้าง และมี method อะไรบ้ • เปรียบเสมือนพิมพ์เขียว (template) ของออปเจ็ค • ออปเจ็คที่ถูกสร้างมาจากคลาส (class) บางครั้งเรียกว่าเป็น instanceของคลาส • คลาสหนึ่งคลาสสามารถสร้างออปเจ็คได้หลายออปเจ็ค
Object • is an instance of a Class • ไม่สามารถสร้างได้ ถ้าไม่มี class Bicycle bike1 = new Bicycle(); Object
Encapsulation • หมายถึงการจะเรียกใช้คุณลักษณะของออปเจ็ค จะทำได้โดยการเรียกผ่านเมธอดเท่านั้น • หลักการของการห่อหุ้ม คือการกำหนดให้คุณลักษณะของออปเจ็คมีคุณสมบัติเป็น privateและกำหนดให้เมธอดมีคุณสมบัติเป็น public • โดยมีเมธอด get/ set ไว้เพื่อเข้าถึง data นั้นๆ จะเรียกว่า class นั้นๆเป็น Full Encapsulation class
Encapsulation • จะใช้ Access Modifiers ในการเข้าถึงข้อมูล และ method • Public class อื่นภายนอก สามารถที่จะเข้าถึงใด้ • Private class อื่นภายนอก ไม่สามารถเข้าถึงใด้ • Protected class ที่ถูกสืบทอดมาเท่านั้นที่สามารถใช้ได้ • ถ้าไม่กำหนด จะถือว่า เป็น Private
Inheritance • การถ่ายทอดคุณสมบัติไปยังClass ลูก • Class ที่เป็นต้นแบบเรียกว่า Superclass • Class ที่ได้รับการสืบทอดคุณสมบัติเรียกว่า Subclasses • Class หนึ่งจะมี Superclass ได้ Class เดียว • ซึ่งประโยชน์ของ Inheritance คือ • ทำให้มีโครงสร้างที่เป็นระบบ ระเบียบ ปรับเปลี่ยนได้ง่าย • ลดเวลาในการพัฒนาระบบ • ลดค่าใช้จ่ายในการพัฒนา
Class x Class y Inheritance • Java ใช้ extends ชื่อclass • ในการสืบทอด • class x extends y • { • }
final • ถ้าระบุอยู่หน้า class จะทำให้ class อื่นๆไม่สามารถที่จะสืบทอดคุณสมบัติของ class ที่ระบุ finalได้ • ถ้าระบุอยู่หน้า method จะทำให้ class ที่สืบทอดไปไม่สามารถที่จะ Override method นี้ได้ Error
Polymorphism • หมายถึง การบอกแบบเดียว แต่ได้รับการสนองได้หลายแบบ • Overloading • Method มีชื่อซ้ำกันใด้แต่มี argument แตกต่างกัน • Overriding • นำ Method ของ Superclass มาจัดการได้เอง
Overloading Methods • ในบางกรณีอาจมีเมธอดใดๆ ที่สามารถรับค่าที่เป็นตัวแปรได้หลากหลายชนิดได้ ถ้ากำหนดไว้เป็นเมธอดเดียว อาจทำให้ผลลัพธ์ที่ได้เกิดความผิดพลาดได้ • ดังนั้นถ้าชนิดตัวแปรเป็นคนละชนิดกัน ให้สร้างเมธอดขึ้นมาใหม่ โดยใช้ชื่อเมธอดเดียวกัน แต่สร้างให้เมธอด มีชนิดของตัวแปรใน parameter list ต่างกัน • โดยจะสร้างเมธอดใหม่ขึ้นมาเป็นจำนวนเท่ากับชนิดของตัวแปรที่เป็นไปได้ • เมื่อมีการใช้เมธอด ชื่อนี้โปรแกรมจะเรียกเมธอดที่มีชนิดของตัวแปรตรงกับที่ต้องการโดยอัตโนมัติ • เรียกวิธีการนี้ว่า “Overloading”และเรียกเมธอดที่ใช้วิธีการนี้ว่า “Overloading Methods”
Overriding • เป็นการจัดการ implement • method ที่เป็นของ Suber Class
Constructors • Constructors • เป็น ฟังก์ชันพิเศษที่จะถูกเรียกให้ทำงานตอนที่ Object ถูกสร้างขึ้นมา • คลาสหนึ่งๆอาจจะมี Constructor หลายๆตัวได้ แต่ต้องมี Argument ต่างกันเรียกว่า Overloading Constructors • ส่วนใหญ่จะนำมาใช้ในการกำหนดค่าเริ่มต้นให้กับ Object • ใน Java จะใช้ ชื่อ public ชื่อคลาส()
abstract classAnd Methods • ใช้สำหรับ ให้ class อื่นๆ สืบทอดไปใช้งาน • ทำให้ไม่สามารถ ที่จะสร้าง object จาก class ได้ abstact class abstact method
abstract classAnd Methods testAbstractClass t=new testAbstractClass(); Error
abstract classAnd Methods จำเป็นต้อง Override
Interfaces • มีลักษณะ เหมือน Abstract Class แต่จะไม่มี fields • จะไม่มีการ implement Code ภายใน methods ประกาศ เรียกใช้
ตารางแสดงชนิดของ Modifier (หรือ Accessibility)
ถ้าหากไม่มีการระบุค่าไว้ จะหมายถึง • ตัวแปร • ใช้ได้เฉพาะในเมธอดที่นิยามตัวแปรนั้นไว้ • เมธอด • ใช้ได้เฉพาะภายใน คลาส นั้นเท่านั้น คลาสอื่นจะเรียกใช้ไม่ได้ • คลาส • ใช้ได้เฉพาะภายในโปรแกรม (File) นี้เท่านั้น โปรแกรมอื่นจะมาเรียกใช้เมธอดหรือตัวแปรต่างๆ ใน คลาส นี้ไม่ได้เลย
[Static Class Members] • ความหมาย คลาสมีสมาชิกที่เป็นตัวแปรใดๆ สามารถใช้ร่วมกันได้ระหว่าง object ที่เป็น instance ของคลาสเดียวกัน (ปกติแยกจากกัน) • วิธีการประกาศให้ตัวแปรใดๆ เป็นแบบ static class members ต้องมีคำสงวน static นำหน้าชนิดข้อมูล เช่น private static int count = 0;
class X { static int a = 0; public static int methodA() { a += 1; return a; } } class TestClassMember { public static void main(String[] args) { int num = 0; num = num + X.methodA(); } }
การส่งค่าผ่าน Arguments การส่งค่าผ่านทางอาร์กิวเม็นต์ที่อยู่ใน parameter list มีอยู่ 2 ลักษณะคือ • อาร์กิวเม็นต์แบบสําเนาค่าข้อมูล (Pass by Value Argument) • อาร์กิวเม็นต์แบบผ่านค่าอ้างถึง (Pass by Reference Argument)
อาร์กิวเม็นต์แบบสําเนาค่าข้อมูล (Pass by Value Argument) • คุณสมบัติที่เรียกว่า Pass by Value คือการส่งข้อมูลไปให้เมธอด และเมธอด ก็อ่านค่าได้โดยตรง และนําไปใช้งานได้ตามความต้องการ แต่หากข้อมูลในอาร์กิว เม็นต์เกิดการเปลี่ยนแปลงไม่ว่าจากกรณีใดๆภายในเมธอด ข้อมูลที่เปลี่ยนแปลงไป จะไม่มีผล กับข้อมูลหลังจากเมธอดทํางานเสร็จสิ้น • การส่งค่าไปยัง method แบบ pass-by-value นี้ค่าที่ส่งเข้าไปจะถูกนําไปใช้ภายใน ตัว method เท่านั้น การเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นจะไม่มีผลกระทบกับตัวแปรที่เป็นเจ้าของค่านั้น ภายนอก method เลย
รูปแบบส่วนอาร์กิวเม็นต์แบบผ่านค่าข้อมูลรูปแบบส่วนอาร์กิวเม็นต์แบบผ่านค่าข้อมูล Method_Name (Primitive_Type Argument_Name1, Primitive_Type Argument_Name2, …) { … Argument_Name1 = …; … } • Primitive_Type คือชนิดข้อมูลที่กําหนดเป็น int, double, float, boolean • Argument_Name1, Argument_Name2 คือชื่ออาร์กิวเม็นต์ อาร์กิวเม็นต์แต่ละตัวที่กําหนดไว้ระหว่างเครื่องหมาย( และ ) หากมีมากกว่าหนึ่งตัวจะถูกแยก ด้วยเครื่องหมาย , (จุลภาค)
อาร์กิวเม็นต์แบบผ่านค่าอ้างถึง (Pass by Reference Argument) • คุณสมบัติที่เรียกว่า Pass by Reference คือการส่งข้อมูลไปให้เมธอด และเมธอดก็ อ่านค่าจากการอ้างถึง และนําไปใช้งานได้ตามความต้องการ แต่หากข้อมูลใน อาร์กิวเม็นต์ไม่ว่าจะเป็นการเปลี่ยนแปลงแอทริบิวต์ของอาร์กิวเม็นต์ หรือการสร้าง ใหม่ให้กับอาร์กิวเม็นต์ การเปลี่ยนแปลงดังกล่าวภายในเมธอดข้อมูลที่เปลี่ยนแปลงไปจะมีผลกับข้อมูลหลังจากเมธอดทํางานเสร็จสิ้น • การส่งค่าแบบอ้างอิงนั้น สิ่งที่เราส่งเข้าไปใน method นั้นไม่ใช้ค่าของตัวแปร (copy) แต่เป็นตัวอ้างอิงถึง object นั้น ๆ โดยตรง เราอาจพูดได้ว่าสิ่งที่เราส่งไปนั้น เป็นที่อยู่ (address) ของ object นั้น ๆ ก็ได้
มีหลักการทํางานแบบเดียวกัน แต่ไม่เหมือนกันซะทีเดียว นั่นคือเมธอดที่ได้รับ อาร์กิวเม็นต์ที่ไม่ใช่ข้อมูลลักษณะพลีมิทีฟแล้ว อาร์กิวเม็นต์นั้นจะสร้างมาจากคลาส เป็นอาร์กิวเม็นต์ลักษณะออปเจ็ค ดังนั้นลักษณะการส่งข้อมูลอาร์กิวเม็นต์จะไม่ใช้การสําเนาข้อมูลเพื่อนําไปใช้งานภายในเมธอด แต่ในเมธอดจะได้รับเป็น จุดอ้างถึง หรือจุดที่เชื่อมโยงไปหาออปเจ็ค ดังนั้นจึงเรียกการส่งข้อมูล แบบนี้ว่าการผ่านค่า อ้างถึง
รูปแบบส่วนอาร์กิวเม็นต์แบบผ่านค่าอ้างถึงรูปแบบส่วนอาร์กิวเม็นต์แบบผ่านค่าอ้างถึง Method_Name (Class_Name Argument_Name1, Class_Name Argument_Name2, …) { Argument_Name1.Attribute_Name = …; Argument_Name2.Method_Name(); … } • Class_Name คือชื่อคลาสที่เป็นที่มาของออปเจ็คที่จะส่งมาเป็นอาร์กิวเม็นต์ • Argument_Name1, Argument_Name2 เป็นอาร์กิวเม็นต์ที่ถูกสร้างขึ้นมาแบบ ออปเจ็ค (สร้างมาจากคลาสด้วยคําสั่ง new)
Package • โปรแกรมที่มีขนาดใหญ่ จะประกอบด้วยคลาสจํานวนมาก อาจมีมากเป็นร้อยหรือเป็นพันเราสามารถจัดหมวดหมู่ของคลาสให้เป็นระเบียบและง่ายต่อการใช้งานได้ ด้วยการแตก ซอร์สโค้ดของโปรแกรมหนึ่งโปรแกรมให้เป็นหลายซอร์สโค้ด ในกรณีนี้ซอร์สโค้ดไม่จําเป็นต้องมีเมธอด main()อยู่ ยกเว้นซอร์สโค้ดที่มีคลาส คลาสแรกที่เราใช้เรียกโปรแกรมหลักของเรา เราเรียกซอร์ส โค้ด ไฟล์อื่นๆ ที่ประกอบ ด้วยคลาสตั้งแต่หนึ่งคลาสขึ้นไปแต่ไม่มีคลาสที่มีเมธอด main() อยู่ว่า แพคเกจ • เป็นที่รวมของ class ต่างๆ ที่ถูกเรียกใช้ในโปรแกรมหรือ method ต่างๆ class ทุกๆ ตัวของ Java ได้ถูกจัดเก็บอยู่ใน package ต่างๆ เพื่อทำให้การเรียกใช้ class ต่างๆ เหล่านี้ทำได้ง่ายขึ้น
Package • คือการรวมกลุ่มของคลาสไว้ในชุดเดียวกัน • เพื่อความสะดวกในการอ้างอิงถึงเพื่อใช้งาน • ทำให้การจัดเก็บ Bytecodes เป็นไปอย่างมีระบบ • ใช้หลักเกณฑ์การจัด package เป็นไปตามการจัด Directory ของระบบ • ทำให้เกิดรูปแบบหนึ่งของการกำหนดระดับการเข้าถึง
Package • คำสั่งในการเรียกใช้ Package คือ คำสั่ง import • ตัวอย่างการใช้งาน • import java.util.*; หมายถึง เรียกใช้ Package ชื่อ “java.util” ทั้ง Package(ทุก Class) • import java.util.ArrayList; หมายถึง เรียกใช้เฉพาะ Class ชื่อ “ArrayList” ซึ่งอยู่ใน Library ชื่อ “java.util”