More Related Content
Java Programming: หลักการเชิงอ็อบเจกต์ Java Programming [4/12] : Object Oriented Concept คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น บทที่ 6 คลาสและการเขียนโปรแกรม Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์ Similar to พื้นฐานการเขียนโปรแกรมเชิงอ็อบเจ็กต์พร้อมตัวอย่าง (20)
Java-Chapter 13 Advanced Classes and Objects คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น พื้นฐานการเขียนโปรแกรมเชิงอ็อบเจ็กต์พร้อมตัวอย่าง
- 3. เนื้อหา
เนื้อหา
4.1 แนะนำการเขียนโปรแกรมเชิงอ็อบเจกต์
4.2 คลาสและอ็อบเจกต์
4.3 การสร้างอ็อบเจกต์จากคลาส
4.4 การซ่อนสารสนเทศ (Information Hiding) หรือ การ
ห่อหุ้ม (Encapsulation)
4.5 เมทอด
4.6 เมทอดคอนสตรัคเตอร์
4.7 ดาต้าเมมเบอร์
4.8 ขอบเขตของการมองเห็น
4.9 การออกแบบคลาสและการใช้คลาส
4.10 การจัดเก็บและการคอมไพล์โปรแกรม
- 4. 4.1
4.1 แนะนำการเขียนโปรแกรม
แนะนำการเขียนโปรแกรม
เชิงอ็อบเจกต์
เชิงอ็อบเจกต์
Abstraction การกำหนดสาระสำคัญ
Data Abstraction การกำหนดสาระสำคัญของ
ข้อมูลในลักษณะองค์รวม เช่น เลขจำนวนเต็ม
การกำหนดคุณลักษณะ
การกำหนดพฤติกรรม
Abstract Data Type – ADT แบบข้อมูลนามธรรม
เอนทิตี (Entity) = ค่าของข้อมูล + ชุดของการดำเนิน
การ (Operation)
แบบข้อมูลนามธรรมของเลขจำนวนเต็ม
จำนวนเต็มบวก จำนวนเต็มลบ และศูนย์
ชุดของการดำเนินการ เช่น บวก ลบ คูณ หาร และเปรียบเทียบ
ความเท่ากัน
- 8. 4.2
4.2 คลาสและอ็อบเจกต์
คลาสและอ็อบเจกต์
อ็อบเจกต์หรือ เอนทิตี สิ่งที่เป็นองค์ประกอบ
ในปัญหา
อ็อบเจกต์ (Object) พื้นที่ในหน่วยความจำ
ของเครื่องคอมพิวเตอร์เพื่อใช้ในการประมวล
ผล
อ็อบเจกต์ ชื่อที่ใช้เรียกสิ่งที่สร้างขึ้นจาก
ต้นแบบ ซึ่งก็คือคลาส หรือ อินสแตนด์ของ
คลาส
คลาส (Class) คือ การกำหนดสาระสำคัญ
หรือภาพรวม หรือต้นแบบของอ็อบเจกต์
- 9. 4.2
4.2 คลาสและอ็อบเจกต์
คลาสและอ็อบเจกต์
คลาส (Class) คือ การกำหนดสาระสำคัญ
หรือภาพรวม หรือต้นแบบของอ็อบเจกต์
◦ ดาต้าเมมเบอร์ (Data Member) หรือ
สมาชิกข้อมูล ใช้กำหนดว่าวัตถุที่สร้างจาก
คลาสมีลักษณะประจำหรือสถานะอะไรบ้าง
◦ เมท็อด (Method) ใช้กำหนดว่าวัตถุที่สร้าง
จากคลาสประกอบด้วยพฤติกรรมหรือ
กระบวนการเปลี่ยนแปลงสถานะของอ็อบเจ
กต์อะไรบ้าง
- 11. ตัวอย่างที่
ตัวอย่างที่ 4.1
4.1 การประกาศคลาส
การประกาศคลาส
◦ (<modifier>) class <ชื่อคลาส> <โครงสร้างของคลาส>
◦ class FirstClass { }
ตัวอย่างที่
ตัวอย่างที่ 4.2
4.2 การประกาศคลาส
การประกาศคลาส
public class CurrencyExchange {
private float exchange_rate;
String currency;
public void setRate(float exchange_rate, String currency)
{
this. exchange_rate = exchange_rate;
this.currency = currency;
}
}
- 15. การเขียนโปรแกรมเชิงอ็อบเจกต์ให้ความสำคัญ
กับการซ่อนสารสนเทศจากคลาสภายนอก
ภาษาจาวามีส่วนขยาย (modifiers) ให้เลือกใช้
งานสามรูปแบบ สำหรับกำหนดว่าคลาสและ
สมาชิกแต่ละตัวของคลาส (ดาต้าเมมเบอร์ และ
เมทอด) สามารถมองเห็นและอ้างถึงได้หรือไม่
จากภายนอกคลาส
◦ public ถูกอ้างถึงได้จากทุกคลาสที่เห็นคลาสนั้นๆ
◦ protected ถูกอ้างถึงได้จากคลาสที่อยู่ภายใน
package เดียวกัน หรือคลาสลูกที่อยู่ต่าง package
◦ private ถูกอ้างถึงได้จากภายในคลาสเท่านั้น
4.4
4.4 การซ่อนสารสนเทศ
การซ่อนสารสนเทศ (Information
(Information
Hiding)
Hiding) หรือการห่อหุ้ม
หรือการห่อหุ้ม
(Encapsulation)
(Encapsulation)
- 17. 4.4
4.4 การซ่อนสารสนเทศ
การซ่อนสารสนเทศ (Information
(Information
Hiding)
Hiding) หรือการห่อหุ้ม
หรือการห่อหุ้ม
(Encapsulation)
(Encapsulation)
การติดต่อกันระหว่างแต่ละอ็อบเจกต์เพื่อทำงานใดงาน
หนึ่งสามารถทำได้โดยการส่งแมสแสจ (Message) ผ่าน
ทางเมท็อดของแต่ละอ็อบเจกต์
เนื่องจากแต่ละอ็อบเจกต์สามารถซ่อนดาต้าเมมเบอร์และ
เมท็อดจากอ็อบเจกต์อื่นได้
หากต้องการเรียกใช้ดาต้าเมมเบอร์จากอ็อบเจกต์อื่น ๆ ที่
ไม่ใช่อ็อบเจกต์ที่เป็นเจ้าของดาต้าเมมเบอร์นั้น ต้องเรียก
ใช้งานผ่านเมท็อดที่ได้รับอนุญาตเท่านั้น
ผู้เขียนโปรแกรมสามารถกำหนดได้ว่าต้องการให้ดาต้า
เมมเบอร์หรือเมท็อดนั้นสามารถเรียกใช้งานจากภายนอก
ขอบเขตของคลาสนั้นได้หรือไม่ โดยการใช้ส่วนขยาย
หรือ โมดิฟายเออร์ (Modifier)
- 18. //Program TestModifier.java;
class Modifier {
public char z = 'A';
protected String sentence;
int i;
private int x;
int sqr (int y) {
return y * y;
}
private int plusOne (int y) {
return y+1;
}
int callPlusOne (int y) {
return i = plusOne(y);
}
}
public class TestModifier {
public static void main(String args[]) {
int a = 2, b, c;
Modifier mod1 = new Modifier();
b = mod1.sqr(a);
c = mod1.plusOne(a); // compile error
c = mod1.callPlusOne(a);
mod1.sentence = "Hello";
System.out.println(c);
System.out.println(mod1.z);
System.out.println(mod1.sentence);
System.out.println(mod1.sqr(a));
System.out.println(mod1.x); // compile
error
}
}
ตัวอย่างที่ 4.5
- 19. ตัวอย่างที่ 4.6 ขอบเขตการใช้งานดาต้าเมมเบอร์
แบบ private
//Program TestCurrencyPrivate.java
package chapter4;
import java.util.Scanner;
class CurrencyExchange {
private float changeRate;
public void setChangeRate (float rate) {
changeRate = rate;
}
public float toBaht (float otherUnit) {
return (otherUnit *
changeRate);
}
public float fromBaht (float baht) {
return (baht / changeRate);
}
}
public class TestCurrencyPrivate {
static Scanner console = new
Scanner(System.in);
public static void main (String[] args) {
float rate, baht, usDollars;
System.out.print("Enter
exchange rate for USD : ");
rate = console.nextFloat();
CurrencyExchange
currencyExchange = new CurrencyExchange();
currencyExchange.setChangeRate(rate);
System.out.print("Enter
amount in baht : ");
baht = console.nextFloat();
usDollars =
currencyExchange.fromBaht(baht);
System.out.println("Baht : " +
baht + ", USD rate : " + rate +
", USD : " + usDollars + "dollars.");
}
}
เปลี่ยนแปลงค่า changeRate ซึ่ง
เป็ นดาต้าเมมเบอร ์แบบ private ขอ
งอ็อบเจกต์currencyExchange
โดยเรียกใช้งานเมท็อด
currencyExchange.setChangeR
ate(rate)
- 20. ตัวอย่างที่ 4.7 ขอบเขตการใช้งานดาต้าเมมเบอร์
แบบ public
//Program TestCurrencyPublic.java
import java.util.Scanner;
class CurrencyExchangeP {
public float changeRate;
public float toBaht (float otherUnit)
{
return (otherUnit * changeRate);
}
public float fromBaht (float baht) {
return (baht / changeRate);
}
}
public class TestCurrencyPublic {
static Scanner console = new
Scanner(System.in);
public static void main (String[] args) {
float rate, baht, usDollars;
System.out.print("Enter
exchange rate for USD : ");
rate = console.nextFloat();
CurrencyExchangeP
currencyExchange = new CurrencyExchangeP();
currencyExchange.changeRate = rate;
System.out.print("Enter
amount in baht : ");
baht = console.nextFloat();
usDollars =
currencyExchange.fromBaht(baht);
System.out.println("Baht : " +
baht + ", USD rate : " + rate
+ ", USD : " + usDollars + " dollars.");
}
}
สามารถเปลี่ยนแปลงค่า
changeRate ซึ่งเป็ นดาต้าเมมเบอร ์
แบบ public ของอ็อบเจกต์
currencyExchange ได้โดยตรง
ด้วยคำสั่ง
currencyExchange.changeRate
= rate
- 21. 4.5 เมท็อด (Method)
คือ สมาชิกของคลาสที่ใช้สำหรับกำหนดพฤติกรรมของอ็
อบเจกต์
เมท็อดจะอยู่ภายในคลาสเท่านั้น
แต่ละเมท็อดควรทำหน้าที่เพียงอย่างเดียว
ในภาษาจาวามีรูปแบบการประกาศเมท็อด 2 รูปแบบหลัก
คือ
◦ 1) เมท็อดที่ส่งค่ากลับเมื่อทำงานเสร็จสิ้น
◦ 2) เมท็อดที่ไม่มีการส่งค่ากลับ
เมทอดที่ไม่มีการส่งค่ากลับ สามารถเรียกใช้งานเมท็อดนั้น
โดยตรง
เมทอดที่มีการส่งค่ากลับ การเรียกใช้งานจะต้องมีตัวแปรรับ
ค่าพารามิเตอร์ซึ่งมีชนิดข้อมูลเดียวกันกับที่ประกาศไว้ใน
เมท็อดที่ส่งค่ากลับ
- 24. ตัวอย่างที่ 4.8
class CurrencyExchange {
private float changeRate;
public void setChangeRate (float rate) {
changeRate = rate;
}
public float toBaht (float otherUnit) {
return (otherUnit * changeRate);
}
public float fromBaht (float baht) {
return (baht / changeRate);
}
}
- 25. ตัวอย่างที่ 4.9
public class TestCurrencyPrivate {
static Scanner console = new Scanner(System.in);
public static void main (String[] args) {
float rate, baht, usDollars ;
System.out.print("Enter exchange rate for USD : ");
rate = console.nextFloat();
CurrencyExchange currencyExchange = new CurrencyExchange();
currencyExchange.setChangeRate(rate);
System.out.print("Enter amount in baht : ");
baht = console.nextFloat();
usDollars = currencyExchange.fromBaht(baht);
System.out.println("Baht : " + baht + ", USD rate : " + rate + ",
USD : " + usDollars + "dollars.");
}
}
- 26. 4.6 เมทอดคอนสตรัคเตอร์
(Constructor Method)
อ็อบเจกต์แต่ละตัว แม้ว่าจะสร้างจากคลาสเดียวกัน ก็
มักมีมีสถานะที่แตกต่างกัน
ภาษาจาวามีกลไกสำหรับกำหนดค่าเริ่มต้นให้กับ data
members หรือ สมาชิกข้อมูล ในขั้นตอนการสร้าง
อ็อบเจ็กต์จากคลาส เรียกว่า เมทอดคอนสตรัคเตอร์
(constructor method)
เมทอดคอนสตรัคเตอร์ มีโครงสร้างคล้ายกับเมทอด
อื่นๆ แต่มีลักษณะสำคัญคือมีชื่อเหมือนกับคลาส และ
ห้ามส่งค่าออกมาจากเมทอด คือ ห้ามมีคำสั่ง return
โครงสร้างของ constructor method เป็นดังนี้
<ชื่อคลาส> (<ลำดับพารามิเตอร์>) <โครงสร้างเมท
อด>
- 27. 4.6 เมทอดคอนสตรัคเตอร์ (Constructor
Method)
constructor method จะถูกเรียกใช้พร้อมกับการใช้คำสั่ง new เพื่อสร้าง
อ็อบเจ็กต์
พารามิเตอร์ของ constructor นำค่าที่รับเข้าไปกำหนดค่าให้กับ data
members เพื่อกำหนดค่าเริ่มต้นหรือสถานะของอ็อบเจ็กต์ที่สร้างขึ้นมา
ใหม่
ถ้าไม่มีการเขียนเมท็อดนี้ไว้ใน คลาส เจวีเอ็มก็จะสร้างอ็อบเจกต์ให้โดย
อัตโนมัติ
คลาสหนึ่งคลาส มี constructor method ได้มากกว่าหนึ่ง เรียกกรณีนี้ว่า
overloaded constructors
◦ constructor แต่ละตัว ต้องมีพารามิเตอร์แตกต่างกัน
◦ อาจต่างกันที่จำนวนพารามิเตอร์ ชนิดของพารามิเตอร์ หรือ ลำดับของ
พารามิเตอร์
◦ คอมไพเลอร์จะเลือกใช้ constructor method ที่เหมาะสมจากพารามิเตอร์ที่
ส่งให้
◦ เป็นกลไกที่ช่วยให้ผู้เขียนโปรแกรมสามารถกำหนดสถานะของอ็อบเจ็กต์ได้
หลากหลายแบบ
- 28. ตัวอย่างที่ 4.10 โปรแกรมแสดงการใช้ constructor
method
// Program TestConstructor.java
class Constructor {
int x;
Constructor (int y) {
x = y;
System.out.println("x = "+ x);
}
Constructor () {
x = 0;
System.out.println("x = "+ x);
}
}
public class TestConstructor {
public static void main(String args[]) {
Constructor cons1 = new Constructor(2);
Constructor cons2 = new Constructor();
}
}
- 29. 4.7 ดาต้าเมมเบอร์ (Data Member)
ภาษาจาวาแบ่งประเภทของดาต้าเมมเบอร์เป็น 2 รูปแบบ
คือ คลาสดาต้าเมมเบอร์ (Class Data Member) และ อินส
แตนซ์ดาต้าเมมเบอร์ (Instance data member)
4.7.1 คลาสดาต้าเมมเบอร์ (Class Data
Member)
คลาสดาต้าเมมเบอร์ คือ ตัวแปรที่สามารถใช้
ร่วมกันได้สำหรับทุกๆ อ็อบเจกต์ที่สร้างขึ้นจาก
คลาส
เนื้อที่ในหน่วยความจำที่ใช้สำหรับเก็บค่าของ
คลาสดาต้าเมมเบอร์จะถูกสร้างขึ้นเพียงที่เดียว
เมื่อทุก ๆ อ็อบเจกต์ที่สร้างขึ้นจากคลาสนี้
ต้องการใช้คลาสดาต้าเมมเบอร์ก็จะอ้างถึงเนื้อที่
- 30. 4.7.1 คลาสดาต้าเมมเบอร์ (Class Data
Member)
มีรูปแบบการประกาศคลาสดาต้าเมมเบอร์ดังนี้
(<โมดิฟายเออร์>) <static> <ชนิดข้อมูล> <ชื่อ
ตัวแปร> , (<ชื่อตัวแปร>),….. ;
ในกรณีที่คลาสดาต้าเมมเบอร์เป็นค่าคงที่
(<โมดิฟายเออร์>) <static> <final> <ชนิดข้อมูล> <ชื่อ
ตัวแปร> , (<ชื่อตัวแปร>),….. ;
ตัวอย่างที่ 4.11 ตัวอย่างการประกาศคลาสดาต้า
เมมเบอร์ เช่น
private static float minGPA = 2.00f;
static final int noMin = 2;
- 31. 4.7.2 อินสแตนซ์ดาต้าเมมเบอร์ (Instance data
member)
อินสแตนซ์ดาต้าเมมเบอร์ ใช้สำหรับแสดงลักษณะ
ประจำของแต่ละอ็อบเจกต์
แต่ละอ็อบเจกต์อาจมีค่าของอินสแตนซ์ดาต้าเมมเบอร์
แตกต่างหรือเหมือนกันก็ได้
รูปแบบการประกาศอินสแตนซ์ดาต้าเมมเบอร์เป็นดังนี้
(<โมดิฟายเออร์>) <ชนิดข้อมูล> <ชื่อตัวแปร> , (<ชื่อ
ตัวแปร>),….. ;
หรือในกรณีที่คลาสดาต้าเมมเบอร์เป็นค่าคงที่
(<โมดิฟายเออร์>) <final> <ชนิดข้อมูล> <ชื่อตัวแปร>
, (<ชื่อตัวแปร>),….. ;
ตัวอย่างที่ 4.12 ตัวอย่างของการประกาศตัวแปรแบ
บอินสแตนซ์ดาต้าเมมเบอร์ public int studentID;
- 33. 4.7 ดาต้าเมมเบอร์ (Data Member)
มักประกาศตัวแปรประเภทค่าคงที่ให้เป็นคลาส
ดาต้าเมมเบอร์
หากไม่ได้ระบุโมดิฟายเออร์ให้กับดาต้า
เมมเบอร์ตัวใด จะถือว่าดาต้าเมมเบอร์ตัวนั้นมี
โมดิฟายเออร์เป็น private โดยอัตโนมัติ
- 34. 4.8 ขอบเขตของการมองเห็น (Scope of
Visibility)
ขอบเขตของการมองเห็น (Scope of Visibility)
คือพื้นที่ในโปรแกรมที่ชื่อหนึ่งสามารถถูกอ้าง
ถึงได้
ประโยคหนึ่งสามารถมองเห็นชื่อนั้นได้ ถ้า
ประโยคนั้นอ้างถึงชื่อนั้นได้
ภาษาจาวามีกำเกณฑ์การมองเห็นตัวแปรและ
เมทอดดังนี้
1. block { } เป็นตัวกำหนดขอบเขตของการมอง
เห็นตัวแปร ดังนั้นขอบเขตของการมองเห็น
ตัวแปรจะจำกัดอยู่ภายใน block
- 35. 4.8 ขอบเขตของการมองเห็น (Scope of
Visibility)
2. จะประกาศตัวแปรที่บรรทัดไหนใน block
ก็ได้ แต่ต้องมีประโยคประกาศตัวแปรนั้นก่อน
ก่อนอ้างถึงครั้งแรก
// ไม่เห็น a
{
// ไม่เห็น a
Int a;
// มองเห็น a
}
//
- 36. 4.8 ขอบเขตของการมองเห็น (Scope of
Visibility)
3.ตัวแปรที่ประกาศในเงือนไขของคำสั่ง for จะ
ใช้ได้ภายใน block ของ for เท่านั้น
for (int i = 0; i < 10; i ++) {
// // มองเห็น i
}
// ไม่เห็น
4. กรณีที่ตัวแปรของเมทอดมีชื่อซ้ำกับดาต้า
เมมเบอร์ของคลาส ภายในเมทอดตัวแปรของ
เมทอดจะบังดาต้าเมมเบอร์ของคลาส
- 37. 4.8 ขอบเขตของการมองเห็น (Scope of
Visibility)
5.ดาต้าเมมเบอร์และเมทอดของคลาสจะถูกมอง
เห็นได้จากทุกเมทอดในคลาสไม่ว่าจะถูก
ประกาศไว้ก่อนหรือหลัง
class Visible {
void a( ) {
// เห็น b( )
// เห็น x
}
int x;
void b( ) {
// เห็น a( )
// เห็น x
}
- 38. 4.8 ขอบเขตของการมองเห็น (Scope of
Visibility)
6. หาก method ที่ static อ้างถึงตัวแปรหรือเมท
อดภายในคลาสเดียวกัน ตัวแปรหรือเมทอดนั้น
ต้องเป็นประเภท static ด้วย
- 39. //Program ScopeRule.java
class ScopeRule
{
static final double rate = 9.50;
static int a;
static double b;
public static void main(String[] args)
{
int num = 5;
double c = 4, a = 3.5;
char ch = '&';
System.out.println("Main: " + num + " " + c
+ " "
+ a + " " + ch + " "
+ rate + " " + b);
one(num, ch);
two(10, 20);
}
public static void one(int x, char y)
{
a = 10;
b = 20.5;
x = a;
y = '$';
c = 12;
System.out.println("Function One: " + x + " " + y
+ " "
+ a + " " + b + " " + rate + " " + c);
}
public static int c;
public static void two(int one, int y)
{
char ch = '#';
int k = 30;
one = 5;
y = 10;
//Block
{
int x = 11;
System.out.println("Block: " + x + " " + k + " "
+ one + " " + y + " " + ch);
}//end block
int x = 9;
System.out.println("Function Two: " + x + " " + k
+ " " + one + " " + y + " " + ch);
one(10,'A');
}
}