Transcript Java OOP

Java OOP
Boonrit kidngun
[email protected]
การเขียนโปรแกรมเชิงวัตถุ



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
Encapsulation
Inheritance

การถ่ายทอดคุณสมบัติไปยังClass ลูก




Class ที่เป็ นต้นแบบเรี ยกว่า Superclass
Class ที่ได้รับการสื บทอดคุณสมบัติเรี ยกว่า Subclasses
Class หนึ่งจะมี Superclass ได้ Class เดียว
ซึ่งประโยชน์ของ Inheritance คือ



ทําให้มีโครงสร้างที่เป็ นระบบ ระเบียบ ปรับเปลี่ยนได้ง่าย
ลดเวลาในการพัฒนาระบบ
ลดค่าใช้จ่ายในการพัฒนา
Inheritance
Class x



class x extends y
{

}

Class y
Java ใช้ extends ชื่อclass
ในการสื บทอด
Inheritance
Inheritance
final


ถ้าระบุอยูห่ น้า class จะทําให้ class อื่นๆไม่สามารถที่จะสื บ
ทอดคุณสมบัติของ class ที่ระบุ final ได้
ถ้าระบุอยูห่ น้า method จะทําให้ class ที่สืบทอดไปไม่
สามารถที่จะ Override method นี้ได้
Error
Polymorphism

หมายถึง การบอกแบบเดียว แต่ได้รับการสนองได้หลายแบบ

Overloading


Method มีชื่อซํ้ากันใด้แต่มี argument แตกต่างกัน
Overriding

นํา Method ของ Superclass มาจัดการได้เอง
Overloading Methods





ในบางกรณี อาจมีเมธอดใดๆ ที่สามารถรับค่าที่เป็ นตัวแปรได้หลากหลายชนิด
ได้ ถ้ากําหนดไว้เป็ นเมธอดเดียว อาจทําให้ผลลัพธ์ที่ได้เกิดความผิดพลาดได้
ดังนั้นถ้าชนิดตัวแปรเป็ นคนละชนิดกัน ให้สร้างเมธอดขึ้นมาใหม่ โดยใช้ชื่อ
เมธอดเดียวกัน แต่สร้างให้เมธอด มีชนิดของตัวแปรใน parameter list ต่างกัน
โดยจะสร้างเมธอดใหม่ข้ ึนมาเป็ นจํานวนเท่ากับชนิ ดของตัวแปรที่เป็ นไปได้
เมื่อมีการใช้เมธอด ชื่อนี้โปรแกรมจะเรี ยกเมธอดที่มีชนิ ดของตัวแปรตรงกับที่
ต้องการโดยอัตโนมัติ
เรี ยกวิธีการนีว้ ่ า “Overloading” และเรี ยกเมธอดที่ใช้ วิธีการนีว้ ่ า
“Overloading Methods”
Overloading
Overloading
Overriding


เป็ นการจัดการ
implement
method ที่เป็ นของ
Suber Class
Overriding
Constructors

Constructors




เป็ น ฟังก์ชนั พิเศษที่จะถูกเรี ยกให้ทาํ งานตอนที่ Object ถูกสร้าง
ขึ้นมา
คลาสหนึ่งๆอาจจะมี Constructor หลายๆตัวได้ แต่ตอ้ งมี
Argument ต่างกันเรี ยกว่า Overloading
Constructors
ส่ วนใหญ่จะนํามาใช้ในการกําหนดค่าเริ่ มต้นให้กบั Object
ใน Java จะใช้ ชื่อ public ชื่อคลาส()
Constructors
Constructors
abstract class And Methods


ใช้สาํ หรับ ให้ class อื่นๆ สื บทอดไปใช้งาน
ทําให้ไม่สามารถ ที่จะสร้าง object จาก class ได้
abstact class
abstact method
abstract class And Methods
testAbstractClass t=new testAbstractClass();
Error
abstract class And Methods
จาเป็ นต้ อง Override
Interfaces


ประกาศ
เรียกใช้
มีลกั ษณะ เหมือน Abstract Class แต่จะไม่มี fields
จะไม่มีการ implement Code ภายใน methods
Interfaces
ตารางแสดงชนิดของ Modifier (หรือ
Accessibility)
Modifier
การใช้ งาน
static
ใช้นิยามตัวแปรและเมธอด ที่ตอ้ งการให้มีค่าคงที่ สามารถนําไปใช้ได้กบั ทุกๆ ส่ วน
ของ Class โดยค่านั้นจะไม่มีการเปลี่ยนแปลงไม่วา่ กรณี ใดๆ
public
ใช้นิยามตัวแปร, เมธอด และคลาส ใดๆ เพื่อให้สามารถนําไปใช้กบั คลาสหรื อ
โปรแกรมอื่นๆ ได้
private
ใช้นิยามตัวแปรหรื อเมธอด เพื่อให้เรี ยกใช้ได้เฉพาะภายในคลาส ที่สร้างตัวแปรหรื อ
เมธอดนั้น ขึ้นมาเท่านั้น
ใช้นิยามตัวแปรหรื อ เมธอด ที่ใช้ได้เฉพาะคลาส ที่สร้างขึ้นมาด้วยวิธีการสื บทอด
(Inheritance) เท่านั้น โดยปกติจะใช้ Protected กับ คลาส ที่เป็ น คลาสต้นฉบับ (Base
Class)
protected
void
ใช้นิยามเมธอด โดยเป็ นการกําหนดให้ไม่มีการส่ งค่าใดๆ กลับมาให้กบั เมธอดนี้
(ดังนั้นจึงไม่ตอ้ งใช้คาํ สั่ง return)


ถ้ าหากไม่ มีการระบุค่าไว้ จะหมายถึง
ตัวแปร


เมธอด


ใช้ได้เฉพาะในเมธอดที่นิยามตัวแปรนั้นไว้
ใช้ได้เฉพาะภายใน คลาส นั้นเท่านั้น คลาสอื่นจะเรี ยกใช้ไม่ได้
คลาส

ใช้ได้เฉพาะภายในโปรแกรม (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”