The words you are searching are inside this book. To get more targeted content, please make full-text search by clicking here.
Discover the best professional documents and content resources in AnyFlip Document Base.
Search
Published by ปิติ เกตุ, 2021-04-04 04:44:55

Java OOP Programming

Java OOP Programming

195

jTextField4.setText(r.reportName(db.getData(ReportRec)));
jTextField5.setText(r.reportSurName(db.getData(ReportRec)));
ReportRec++;
jTextField6.setText(String.valueOf(ReportRec));
}
}
ป่ ุม >
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
if(ReportRec>0){
jTextField4.setText(r.reportName(db.getData(ReportRec)));
jTextField5.setText(r.reportSurName(db.getData(ReportRec)));
ReportRec--;
jTextField6.setText(String.valueOf(ReportRec));
}
}
ป่ ุมปิ ด
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}
ส่ วนท้ ายคลาส
ส่วนน้ีเป็นการประกาศแอตทริบิวตท์ ี่เป็นองคป์ ระกอบไดแ้ ก่ป่ ุม เทก็ ซ์ฟิ ลด์ โดยส่วนน้ีออกจาก
โปรแกรมเน็ตบีน ซ่ึงโปรแกรมจะสร้างส่วนต่าง ๆ เหล่าน้ีใหโ้ ดยอตั โนมตั ิ
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JButton jButton3;
private javax.swing.JButton jButton4;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;

196

private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
private javax.swing.JTextField jTextField3;
private javax.swing.JTextField jTextField4;
private javax.swing.JTextField jTextField5;
private javax.swing.JTextField jTextField6;
ผลการรัน แสดงดงั ภาพต่อไปน้ี

ภาพท่ี 6.21 ผลการรันโปรแกรมตวั อยา่ งที่ 6.11

ความสัมพนั ธ์แบบ คอมโพสสิชัน

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

197

ไปดว้ ย เช่น คลาสรถยนตต์ อ้ งมีคลาสลอ้ คลาสตวั ถงั รถยนต์ คลาสเคร่ืองยนต์ เป็ นตน้ หากคลาส
รถยนตถ์ ูกทาลายไปคลาสท่ีเป็ นองคป์ ระกอบก็จะไม่สามารถทางานได้ และถูกทาลายไปดว้ ยทนั ที
หรือ คลาสคอมพิวเตอร์ ตอ้ งมีคลาสซีพียู คลาสเมนบอร์ด คลาสแรม หากวตั ถุหลกั คือคอมพิวเตอร์
ถูกทาลาย ส่วนประกอบต่าง ๆ ก็จะถูกทาลายไปด้วย ความสัมพนั ธ์แบบน้ีมีสัญลักษณ์ คือ

โดยมีลกั ษณะความสัมพนั ธ์พ้ืนฐานแบบ has-a เช่นเดียวกบั แอคกรีเกชัน
ลกั ษณะโครงสร้างของความสัมพนั ธ์แสดงดงั คลาสไดอะแกรมดงั น้ี

ภาพที่ 6.22 ความสมั พนั ธ์แบบ คอมโพสสิชนั
โครงโปรแกรม
class MainComposition{

Compnent1 com1;
Compnent2 com2;
Compnent3 com3;

}
class Component1 {

}

198

class Component2 {

}
class Component3 {

}

ตวั อย่าง 6.12 จงออกแบบและเขียนโปรแกรมสาหรับใหว้ ตั ถุรถยนตท์ างาน
คลาสไดอะแกรม

ภาพที่ 6.23 แสดงความสัมพนั ธ์ของคลาสตวั อยา่ งท่ี 6.12
โปรแกรม :
public class MainAppCom {

public static void main(String args[]){

199

Car ford = new Car();
ford.drive();
}
}
------------------------------------------------------------------------------------------------------------------
public class Car {
Wheels wh=new Wheels();
Body bd=new Body();
Cover cv=new Cover();
Engine eg=new Engine();
Controler ct=new Controler();
public void drive(){
ct.start();
bd.working();
cv.working();
eg.working();
System.out.println("วง่ิ มานานแลว้ นะถึงท่ีหมายแลว้ ");
ct.stop();
wh.run();
}
}
------------------------------------------------------------------------------------------------------------------

public class Wheels {
public void run(){
System.out.println("ลอ้ ท้งั ส่ีวงิ่ แลว้ .");
}

}
------------------------------------------------------------------------------------------------------------------
public class Cover {

200

public void working(){
System.out.println("กระโปรงเครื่องแขง็ แรงดี.");

}
}
------------------------------------------------------------------------------------------------------------------
public class Engine {
public void working(){

System.out.println("เคร่ืองยนตส์ ภาพดี ทางานแลว้ .");
}
}
------------------------------------------------------------------------------------------------------------------
public class Body {

public void working(){
System.out.println("ตวั ถงั สภาพดี ทางานแลว้ .");
}
}
------------------------------------------------------------------------------------------------------------------
public class Controler {
public void start(){
System.out.println("เครื่องติดแลว้ .");
}
public void stop(){
System.out.println("เคร่ืองดบั แลว้ .");
}
}
------------------------------------------------------------------------------------------------------------------

ผลการรันโปรแกรม แสดงดงั น้ี

เคร่ืองติดแลว้ .

201

ตวั ถงั สภาพดี ทางานแลว้ .
กระโปรงเคร่ืองแขง็ แรงดี.
เคร่ืองยนตส์ ภาพดี ทางานแลว้ .
วงิ่ มานานแลว้ นะถึงท่ีหมายแลว้
เครื่องดบั แลว้ .
ลอ้ ท้งั ส่ีวง่ิ แลว้ .

ความสัมพนั ธ์แบบ แอสโสสิเอชัน

แอสโสสิเอชนั เป็ นความสัมพนั ธ์ท่ีนามาทางานร่วมกนั ไม่ไดม้ ีส่วนการทางานท่ีข้ึนต่อกนั

มีความสาคญั เท่าเทียมกนั (พนิดา พานิชกุล, 2548, หน้า 31) แต่มีความสัมพนั ธ์กนั ในเชิง

Multiplicity ที่เป็ นเชิงสัมพนั ธ์แบบ 1-1, 1-M, M-M เป็ นตน้ ซ่ึงจะอธิบายความสัมพนั ธ์วตั ถุสอง

ชนิดที่มีความสัมพนั ธ์ในแนวระนาบ (กิตติ ภกั ดีวฒั นะกุล และ กิตติพงษ์ กลมกล่อม, 2548, หน้า

17) จากตวั อย่างท่ีผ่านมาคลาส DBMS จะมีความสัมพนั ธ์แบบน้ี แบบ 1-M 1-10 เป็ นตน้

ความสัมพนั ธ์แบบน้ีมีขอ้ สงั เกตคือจะตอ้ งมีความสมั พนั ธ์กนั ท้งั สองดา้ นกล่าวคือถา้ มีความสัมพนั ธ์

แบบดา้ นเดียวจะกลายเป็ น แอคกรีเกชัน แต่ความสัมพนั ธ์แบบน้ีจาเป็ นตอ้ งมีสองทาง โดยใช้

สัญลกั ษณ์ที่ใชค้ ือ บางคร้ังอาจระบุความสัมพนั ธ์และจานวนของวตั ถุท่ี

สามารถสร้างข้ึนไดด้ ว้ ย เช่นดงั ภาพท่ี 6.24

1…* 0…*
ภาพท่ี 6.24 แสดงความสัมพนั ธ์ของคลาสแบบ แอสโสสิเอชนั

202

ตัวอย่างที่ 6.13 จงเขียนโปรแกรมแสดงรายงานอาจารยท์ ี่สงั กดั ภาควชิ าคอมพวิ เตอร์ โดยกาหนด
คลาส DepartMent เป็นภาควชิ า Teacher เป็นคลาสอาจารย์
คลาสไดอะแกรม

ภาพที่ 6.25 แสดงความสัมพนั ธ์ของคลาสตวั อยา่ งท่ี 6.13
โปรแกรม :
------------------------------------------------------------------------------------------------------------------
public class DepartMent {

private Teacher[] t;
private String name;
public Teacher[] getTeacher() {

return t;
}
public void setTeacher(Teacher[] t) {

this.t = t;
}
public String getName() {

return name;
}

203

public void setName(String name) {
this.name = name;

}
}
------------------------------------------------------------------------------------------------------------------
public class Teacher {

private String name;
private String surname;
private DepartMent d;
public String getName() {

return name;
}
public void setName(String name) {

this.name = name;
}
public String getSurname() {

return surname;
}
public void setSurname(String surname) {

this.surname = surname;
}
public DepartMent getDepartMent() {

return d;
}
public void setDepartMent(DepartMent d) {

this.d = d;
}
}
------------------------------------------------------------------------------------------------------------------
public class EdApp {

204

private static DepartMent d=new DepartMent();
private static Teacher[] t=new Teacher[5];
public static void main(String args[]){

d.setName("Computer Science");
// d.setTeacher(t);

//----------
t[0]=new Teacher();
t[0].setName("aName");
t[0].setSurname("aSurname");
t[0].setDepartMent(d);
//--------------------
t[1]=new Teacher();
t[1].setName("bName");
t[1].setSurname("bSurname");
t[1].setDepartMent(d);
//---------------------
t[2]=new Teacher();
t[2].setName("cName");
t[2].setSurname("cSurname");
t[2].setDepartMent(d);
//---------------------
t[3]=new Teacher();
t[3].setName("dName");
t[3].setSurname("dSurname");
t[3].setDepartMent(d);
//-----------------------
t[4]=new Teacher();
t[4].setName("eName");
t[4].setSurname("eSurname");
t[4].setDepartMent(d);

205

//d.setName("Computer Science");
d.setTeacher(t);

// รายงาน
Teacher[] data = d.getTeacher();
System.out.println("-----------------------");
System.out.println(d.getName());
System.out.println("-----------------------");
for(int i=0;i<data.length;i++){

System.out.println(data[i].getName()+" "+data[i].getSurname());
}
System.out.println("-----------------------");
}
}
------------------------------------------------------------------------------------------------------------------
ผลการรัน แสดงดงั น้ี
-----------------------
Computer Science
-----------------------
aName aSurname
bName bSurname
cName cSurname
dName dSurname
eName eSurname
-----------------------

206

ตัวอย่างท่ี 6.14 จงเขียนโปรแกรมบนั ทึกประวตั ิเก็บคอมพิวเตอร์ ในหอ้ งจานวน 3 ห้อง โดยแต่ละ
หอ้ งเกบ็ คอมพิวเตอร์ได้ 40 เคร่ือง โดยยกตวั อยา่ งขอ้ มลู การเก็บหอ้ งละสองเคร่ืองเท่าน้นั
คลาสไดอะแกรม

แนวคิดควรมีคลาสดงั น้ี เครื่องคอมพิวเตอร์ หอ้ ง และโปรแกรมหลกั

1…3 0…40

ภาพท่ี 6.26 แสดงความสมั พนั ธ์ของคลาสตวั อยา่ งท่ี 6.14
โปรแกรม :
------------------------------------------------------------------------------------------------------------------
public class Computer {

private int no;
private String spect;
private Room room;
public int getNo() {

return no;
}
public void setNo(int no) {

this.no = no;
}
public String getSpect() {

207

return spect;
}
public void setSpect(String spect) {

this.spect = spect;
}
public Room getRoom() {

return room;
}
public void setRoom(Room room) {

this.room = room;
}
}
------------------------------------------------------------------------------------------------------------------
public class Room {
private Computer[] computer;
private String name;
public Computer[] getComputer() {

return computer;
}
public void setComputer(Computer[] computer) {

this.computer = computer;
}
public String getName() {

return name;
}
public void setName(String name) {

this.name = name;
}
}
------------------------------------------------------------------------------------------------------------------

208

public class ComputerApp {
private static Room[] r=new Room[3];;
private static Computer[] comset1=new Computer[2];
private static Computer[] comset2=new Computer[2];
private static Computer[] comset3=new Computer[2];
public static void main(String args[]){
r[0]=new Room(); r[0].setName("Room A");
r[1]=new Room(); r[1].setName("Room B");
r[2]=new Room(); r[2].setName("Room C");
//----------
comset1[0]=new Computer();
comset1[0].setNo(1);
comset1[0].setSpect("Acer 1");
comset1[0].setRoom(r[0]);
//----------
comset1[1]=new Computer();
comset1[1].setNo(2);
comset1[1].setSpect("IBM 1");
comset1[1].setRoom(r[0]);
//----------
comset2[0]=new Computer();
comset2[0].setNo(1);
comset2[0].setSpect("Acer 2");
comset2[0].setRoom(r[1]);
//----------
comset2[1]=new Computer();
comset2[1].setNo(2);
comset2[1].setSpect("IBM 2");
comset2[1].setRoom(r[1]);
//----------

209

comset3[0]=new Computer();
comset3[0].setNo(1);
comset3[0].setSpect("Acer 3");
comset3[0].setRoom(r[2]);
//----------
comset3[1]=new Computer();
comset3[1].setNo(2);
comset3[1].setSpect("IBM 3");
comset3[1].setRoom(r[2]);
//---------------
r[0].setComputer(comset1);
r[1].setComputer(comset2);
r[2].setComputer(comset3);

// รายงานหอ้ ง 1
Computer[] cm1=r[0].getComputer();
System.out.println("-----------------------");
System.out.println(r[0].getName());
System.out.println("-----------------------");
for(int i=0;i<cm1.length;i++){

System.out.println(cm1[i].getNo()+" "+cm1[i].getSpect());
}
System.out.println("-----------------------");
// รายงานหอ้ ง 2
Computer[] cm2=r[1].getComputer();
System.out.println("-----------------------");
System.out.println(r[1].getName());
System.out.println("-----------------------");
for(int i=0;i<cm2.length;i++){

System.out.println(cm2[i].getNo()+" "+cm2[i].getSpect());

210

}
System.out.println("-----------------------");
// รายงานหอ้ ง 3
Computer[] cm3=r[2].getComputer();
System.out.println("-----------------------");
System.out.println(r[2].getName());
System.out.println("-----------------------");
for(int i=0;i<cm3.length;i++){

System.out.println(cm3[i].getNo()+" "+cm3[i].getSpect());
}
System.out.println("-----------------------");
}
}
------------------------------------------------------------------------------------------------------------------
ผลการรัน แสดงดงั น้ี
-----------------------
Room A
-----------------------
1 Acer 1
2 IBM 1
-----------------------
-----------------------
Room B
-----------------------
1 Acer 2
2 IBM 2
-----------------------
-----------------------
Room C
-----------------------

211

1 Acer 3
2 IBM 3
-----------------------

สรุป

เมื่อมีคลาสต้งั แตส่ องคลาสข้ึนไป การทางานของโปรแกรมจะติดต่อกนั ผา่ นเมสเซจที่ส่งถึง
กนั และการสร้างความสัมพนั ธ์ของคลาสเพื่อประสานกนั ทางานท่ีไดร้ ับมอบหมายให้สาเร็จลงได้
ความสัมพนั ธ์ของคลาสจะมีหลายลกั ษณะคือ ดีเพนเดนซี คือ การเรียกใชก้ นั ท่ีประกอบดว้ ย ส่วน
การพารามิเตอร์ คา่ ท่ีคืน หรือส่วนของแอตทริบิวตข์ องเมธอด แอคกรีเกชนั เป็ นความสัมพนั ธ์แบบ
has-a หรือมีส่วนประกอบของคลาสหลกั คอมโพสสิชนั เป็ นความสัมพนั ธ์ในลกั ษณะ has-a
เหมือนกบั แอคกรีเกชนั แต่จะใหค้ วามสัมพนั ธ์กบั ช่วงชีวติ ของวตั ถุที่เกิดข้ึน เมื่อคลาสหลกั ที่เป็ น
องคป์ ระกอบไดถ้ ูกทาลายไป แต่คลาสที่เป็นตวั ลูกยงั คงทางานได้ แอสโสสิเอชนั เป็นความสัมพนั ธ์
ที่เพียงแต่รู้จกั กนั เท่าน้นั แต่ไม่ไดม้ ีการเรียกใชง้ านกนั โดยตรง แต่จะถูกเรียกใชง้ านจากคลาสอ่ืนที่
กระตุน้ เมธอดสาหรับการใชง้ าน

212

แบบฝึ กหดั ท้ายบท

1. จงบอกความหมายของความสัมพนั ธ์ของคลาส
2. จงใหค้ วามหมายของ Dependence, Aggregation, Composition และ Association
3. จงยกตวั อยา่ งความสัมพนั ธ์แตล่ ะประเภทในขอ้ 2 มาอยา่ งละ 1 ชนิด
4. จงบอกความจาเป็ นของความสัมพนั ธ์แบบ Dependence, Aggregation, Composition และ
Association
5. จงบอกข้อเหมือนและข้อแตกต่างของความสัมพันธ์ Dependence, Aggregation,
Composition และ Association
6. กาหนดใหม้ ีคลาส A กบั B จงเขียนคลาสไดอะแกรมแสดงความสัมพนั ธ์ทุกแบบที่กล่าวมา
โดยกาหนดใหค้ ลาส A เป็นคลาสหลกั
7. กาหนดให้คลาส เคร่ืองบิน และคลาสลูกเรือ จงออกแบบคลาสท้งั สองให้มีความสัมพนั ธ์
Dependence, Aggregation, Composition และ Association
8. จากขอ้ 7 จงเขียนโครงโปรแกรมสาหรับความสัมพนั ธ์แต่ละประเภท
9. จงออกแบบโปรแกรมระบบการลงจอดบนดวงจันทร์โดยใช้ความสัมพันธ์แบบ
Dependence พร้อมท้งั เขียนโครงโปรแกรมประกอบ
10. จงเขียนโปรแกรมคานวณค่าปรับเมื่อส่งหนังสือให้ห้องสมุดช้า กาหนดอตั ราค่าปรับ 5
บาทตอ่ วนั ตอ่ หนงั สือ 1 เล่ม
11. จงเขียนโปรแกรมเวริ ์ดโปรเซสเซอร์อยา่ งง่าย โดยใชข้ อ้ ความท้งั หมดในการแสดง ส่วนหวั
เอกสาร รูปภาพ ส่วนทา้ ย
12. จงเขียนโปรแกรมสาหรับประกอบโตะ๊ นกั เรียน โดยมี ขา เบาะ พนกั พิง เป็ นส่วนประกอบ
สาคญั
13. จงออกแบบและเขียนโปรแกรมจาลองสาหรับการสร้างรายละเอียดยืมคืนหนังสือใน
หอ้ งสมุด
14. จงออกแบบใหโ้ ปรแกรมมีการใชง้ านความสมั พนั ธ์แบบ Aggregation ต่อกนั อยา่ งนอ้ ยสาม
ทอด
15. จงออกแบบให้โปรแกรมมีการใช้งานความสัมพนั ธ์แบบ Aggregation และ Association
อยา่ งนอ้ ยชนิดละสองคลาส

213

เอกสารอ้างองิ

กิตติ ภกั ดีวฒั นะกุล และ ศิริวรรณ อมั พรดนยั . (2544). Oject-Oriented ฉบับพนื้ ฐาน. กรุงเทพฯ:
KTP Comp&Consult.

กิตติพงษ์ กลมกล่อม. (2552). การวเิ คราะห์และออกแบบระบบเชิงวัตถุด้วย UML. กรุเทพฯ: เคทีพี
แอนด์ คอนซลั ท.์

ธีรวฒั น์ ประกอบผล. (2552). คู่มอื การเขียนโปรแกรมภาษา Java. กรุงเทพฯ: ซคั เซส มีเดีย.
_________. (2553). คู่มอื การเขยี นโปรแกรมภาษา Java. กรุงเทพฯ: ซิมพลิฟลาย.
พนิดา พานิชกุล. (2548). Object-Oriented ฉบบั พนื้ ฐาน. กรุงเทพฯ: เคทีพี แอนด์ คอนซลั ท.์
_________. (2554). การเขียนโปรแกรมคอมพิวเตอร์เบื้องต้นด้วยภาษาจาวา. พิมพ์คร้ังท่ี 5.

กรุงเทพฯ: เคทีพี แอนด์ คอนซลั ท.์
Bruce Eckel. (2000). Thinking in Java. 2nd . USA: Prentice Hall PTR Prentice-Hall.
Cay Horstmann. (2002). Object-Oriented Design & Patterns. USA: John Wiley & Sons.
David Etheridge. (2009). Java:The Fundamentals of Objects and Classes-An Introduction to

Java Programming. Ventus Publishing Aps. [Online]. Available:
http://www.BookBoon.com.
Simol Kendal. (2009). Object Orientted Programming using Java. Ventus Publishing Aps.
[Online]. Available: http://www.BookBoon.com.

บทท่ี 7
การรับทอด

การเขียนโปรแกรมเชิงวตั ถุมีความยดื หยนุ่ มาก เพราะสามารถเอาคลาสที่เขียนไวแ้ ลว้ มาใช้
งานได้ โดยไม่ต้องเขียนเมธอดหรือส่วนการทางานเพ่ิมเติมเลย โปรแกรมเมอร์สามารถใช้
คุณสมบตั ิท่ีสาคญั อย่างหน่ึงของการเขียนโปรแกรมเชิงวตั ถุ คือ การรับทอดคุณสมบตั ิของคลาส
เพ่ือทาให้การเขียนโปรแกรมมีความยดื หยนุ่ และส้ันลง การรับทอดดงั กล่าวน้นั สามารถรับทอดได้
ท้งั แอตทริบิวตแ์ ละเมธอดของคลาสมาดว้ ย บทน้ีนาเสนอรายละเอียดเกี่ยวกบั แนวคิดของการรับ
ทอด การสร้างคลาสเพ่ือการรับทอดคุณสมบตั ิ และการพฒั นาโปรแกรมสาหรับการใชง้ านการรับ
ทอดคุณสมบตั ิ รวมถึงการโอเวอร์ไรด์ ซ่ึงเป็นการนาเอาเมธอดที่รับทอดมาใชง้ าน ส่วนทา้ ยของบท
นาเสนอการใชง้ านเมื่อกาหนดการเขา้ ถึงและการปกป้ องขอ้ มลู ดว้ ยคียเ์ วริ ์ด

แนวคดิ ของการรับทอด

วาย. แดเนียล เหลียง (2007, p. 302) ไดก้ ล่าววา่ การเขียนโปรแกรมเชิงวตั ถุมีการอนุญาต
ใหม้ ีการการรับทอด (Derive) คลาสใหมจ่ ากคลาสท่ีมีอยแู่ ลว้ เรียกวา่ การรับทอด (Inheritance) โดย
การรับทอดมีความสาคญั และมีประโยชน์มากในจาวา ท่ีจริงแลว้ ทุกๆ คลาสที่กาหนดข้ึนในจาวารับ
ทอดจากคลาสที่มีอยแู่ ลว้ ท้งั แบบชดั แจง้ (Explicit) และโดยนยั (Implicit) โดยกลุ่มคลาสที่สร้างน้นั
รับทอดคุณสมบตั ิมาจาก java.lang.Object

ไซมอล เคนดลั (2009, p. 53) กล่าววา่ เรากาหนดคุณสมบตั ิทว่ั ไปในช้นั สูงข้ึนไปของ
ลาดบั ช้นั และมากกว่ากาหนดคุณสมบตั ิท่ีต่าลงมาอ่ืนๆ อีกในช้นั ที่ต่าลงมา หลกั การสาคญั ในเชิง
วตั ถุท่ีจดั การเป็นลาดบั ช้นั น้ีเราเรียกคุณสมบตั ิน้ีวา่ เจนเนอรอลไลเซชนั และ สเปเชียลไลเซชนั ทุกๆ
คุณสมบตั ิจากคลาสที่อยู่ดา้ นบนในช้นั ของความสัมพนั ธ์ดงั กล่าวจะถูกใส่ลงไปในลงมาในช้นั ที่
ต่าลงมาเรียกคุณสมบตั ิน้ีวา่ การรับทอด

พนิดา พานิชกุล (2554, หน้า 242) การรับทอด หมายถึง การท่ีคลาสหน่ึงหรือหลายๆ
คลาส ถูกสร้างข้ึนใหม่ (เรียกวา่ Subclass) ภายใตค้ ลาสใดๆ (เรียกว่า Superclass) ดว้ ยการรับทอด
คุณสมบตั ิอนั ไดแ้ ก่แอตทริบิวต์และเมธอดท่ีสาคญั ของคลาสน้นั ๆ มาดว้ ย ดงั น้นั subclass ที่ถูก

215

สร้างข้ึนมาใหม่จะมีแอตทริบิวตแ์ ละเมธอด เหมือนกบั Superclass และยงั สามารถเพ่ิมแกไ้ ขแอตทริ
บิวตแ์ ละเมธอดเองไดอ้ ีกดว้ ย

สรุปว่า การรับทอด (Inheritance) หมายถึง การรับทอดคุณสมบตั ิของคลาส คลาสหลกั
เรียกวา่ superclass หรือเป็ นคลาสแม่ คลาสที่รับทอดคุณสมบตั ิของคลาสแม่เรียกวา่ subclass การ
รับทอดจะสามารถรับทอดคุณสมบตั ิไดท้ ้งั แอตทริบิวตแ์ ละเมธอด คุณสมบตั ิน้ีอาจเรียกไดว้ า่ เป็ น
หวั ใจของการเขียนโปรแกรมเชิงวตั ถุเพราะทาใหส้ ร้างคุณสมบตั ิตา่ ง ๆ ที่มีประโยชน์ไดอ้ ีกมากมาย
โดยเฉพาะอยา่ งยิ่งการนากลบั มาใชใ้ หม่ (Reuse code) การเขียนทบั (Override) ภาวะพหุสัณฐาน
(Polymorphism) ซ่ึงจะกล่าวในลาดบั ถดั ไป ความสัมพนั ธ์ของคลาสแบบน้ีสามารถพิจารณาไดง้ ่าย
ดว้ ยคาวา่ เป็ น หรือคือ ในภาษาไทย หรือใช้ is-a หากพิจารณาวา่ สิ่งท่ีเราสนใจ หรือคลาสท่ีกาลงั
พิจารณาอยนู่ ้ันเป็ น ส่ิงใด แสดงว่าคลาสที่กาลงั พิจารณาเป็ นคลาสย่อย และสิ่งท่ีมนั เป็ นน้ันคือ
คลาสแม่ เช่น หากกาลงั พิจารณาคลาสของแมว คลาสแม่ของคลาสแมวคือคลาสสัตว์ เพราะแมว
เป็นสตั วช์ นิดหน่ึง เป็นตน้

จากแนวคิดท่ีไดน้ าเสนอไปแลว้ ในบทที่ผา่ นมา การรับทอดคุณสมบตั ิหรือเรียกวา่ การอิน
เฮอริทแทน ซ่ึงเป็ นการรับทอดส่วนของเมธอดและแอตทริบิวตข์ องคลาสที่ตอ้ งการใช้งานเพื่อให้
สามารถใชง้ านไดโ้ ดยไม่ตอ้ งเขียนโปรแกรม เมื่อมีการสร้างวตั ถุของคลาสท่ีรับทอดไป (Subclass)
สามารถที่จะเรียกใช้งานเมธอด และแอตทริบิวของคลาสแม่ (Superclass) แนวคิดของการรับทอด
เบ้ืองตน้ โดยอา้ งอิงถึงภาพที่ 7.1 และ 7.2 ที่แสดงแผนผงั เก่ียวกบั สัตว์ และของใช้ จากภาพท้งั สอง
ความรู้เก่ียวกบั การจาแนกคลาสแม่ออกเป็ นคลาสยอ่ ย (Subclass) ไดเ้ ป็ นกลุ่มคลาสยอ่ ย ๆ ที่แต่ละ
คลาสดงั กล่าวจะมีวตั ถุที่สังกดั กบั คลาสแต่ละชนิดไดต้ รงกบั ที่ตอ้ งการใชใ้ หม้ ากท่ีสุด

สตั ว์

สตั วน์ ้า สตั วป์ ่ า สัตวค์ ร่ึงบกคร่ึง

- ปลาทู -เสือ -นก้าบ

- ภาพที่ 7.1 แสดงแผนผงั การจาแนกคลาสสัตว์

216

ของใช้

เครื่องเขียน อุปกรณ์ใชไ้ ฟฟ้ า อุปกรณ์ไม่ใชไ้ ฟฟ้ า

---ดสไมินมบ้สุดรอรทดั นอุปกรณ์ส-คานอมกั พงาวิ นเตอร์ -ตะเกียง
อุปกรณ์ใหค้ วามสวา่ ง

-สายไฟ
-หลอดไฟฟ้ า

ภาพท่ี 7.2 แสดงแผนผงั การจาแนกคลาสของใช้

จากแนวคิดท่ีกล่าวมาและตวั อย่างที่กาหนดให้ท้งั หมดขา้ งตน้ จะพบว่าส่ิงสาคญั ท่ีสุด

อย่างหน่ึงของแนวคิดการรับทอดคือ Subclass จะเป็ นส่วนของ Super Class เสมอ ซ่ึงเรียก

ความสัมพนั ธ์แบบน้ีวา่ “คอื ” หรือ “เป็ น” (is-a) พิจารณาดงั น้ี

สตั วน์ ้า เป็น สตั ว์ สัตวน์ ้า  สตั ว์

(Subclass) is a (Super Class)

อุปกรณ์ใชไ้ ฟฟ้ าคือของใช้ อุปกรณ์ใชไ้ ฟฟ้ าของใช้

รถยหี่ อ้ โตโยตา้ เป็นรถยนตเ์ ป็นพาหนะ รถยหี่ อ้ โตโยตา้ รถยนต์ พาหนะ

คลาสแม่ (จากภาพที่ 7.1) คือ คลาสสัตว์ จาแนกไดเ้ ป็ นคลาสยอ่ ยคือ คลาสสัตวป์ ่ า สัตว์

น้า และสัตวค์ ร่ึงบกคร่ึงน้า คลาสแม่ของใช้ (จากภาพท่ี 7.2) จาแนกเป็ นคลาสย่อย คือ เคร่ืองเขียน

อุปกรณ์ใชไ้ ฟฟ้ า อุปกรณ์ไมใ่ ชไ้ ฟฟ้ า วตั ถุแตล่ ะชนิดจะสงั กดั กบั คลาสท่ีตรงประเภทและเหมาะสม

อยา่ งท่ีควรจะเป็นมากท่ีสุด เช่น ปลาทู เป็ นสัตวน์ ้า แต่มีคุณสมบตั ิเป็ นสัตว์ หรือ ดินสอ เป็ นเครื่อง

เขียน และเป็นของใชด้ ว้ ย

หากพจิ ารณาคุณสมบตั ิของคลาสยอ่ ยจะพบวา่ คลาสยอ่ ยจะไดค้ ุณสมบตั ิของคลาสแม่มา

ดว้ ยเสมอ เช่น คลาสสัตวป์ ่ า ก็จะไดค้ ุณสมบตั ิของการเป็ นสัตวม์ าดว้ ยเสมอ หรือพิจารณาที่คลาส

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

ทอดคุณสมบตั ิต่อกนั มาเป็นทอด ๆ เรียกวา่ การรับทอด

217

ตวั อย่างที่ 7.1 จงอธิบายวา่ คลาสต่อไปน้ีคลาสใดเป็นคลาสแม่และคลาสใดเป็นคลาสยอ่ ย พร้อมท้งั
เขียนโครงสร้างการแยกคลาสดว้ ย
Ship, TwoHappyHouse, CruiseShip, Mansion, Cruise90938, VacationTrip, House,
PanamaShip89032
แนวคดิ
คลาสแม่ Ship และ House
Ship มีคลาสยอ่ ยคือ CruiseShip, Cruise90938, VocationTrip, PanamaShip89032
House มีคลาสยอ่ ยคือ Mansion, TwoHappyHouse

ตัวอย่างที่ 7.2 จงอธิบายวา่ คลาสต่อไปน้ีคลาสใดเป็นคลาสแมแ่ ละคลาสใดเป็นคลาสยอ่ ย
Worm, Ellipse, Animal, 2DFigure, Circle

แนวคดิ
WormAnimal
Ellipse2DFigure
Circle2DFigure

ตวั อย่างที่ 7.3 กาหนดขอ้ มลู ใหด้ งั น้ี เรือ, รถยนต,์ เคร่ืองบิน, ปลา, นก, คน จงเขียน Super Class
และ Sub-Class ของส่ิงที่กาหนดให้

แนวคิด
เรือหางยาว เรือ พาหนะ
เครื่องบินแอร์บสั เคร่ืองบินพาหนะสาหรับเดินทางทางอากาศ
ปลาบู่ ปลาสัตวน์ ้า
นกแกว้ นกสัตวป์ ี ก
คนฉลาดคนสตั วป์ ระเสริฐ

การเขยี นโปรแกรมแบบรับทอด ความสัมพนั ธ์ของคลาสน้ีจะมีลกั ษณะดงั น้ี

ความสัมพนั ธ์แบบน้ีใชส้ ัญลกั ษณ์

218

ภาพที่ 7.3 แนวคิดของคลาสไดอะแกรมของการรับทอด
โครงโปรแกรม
class SuperClass{


}
class Subclass extends SuperClass{


}
ข้อควรจา การเรียกใชง้ านจะตอ้ งมีระบุ extends ในการรับทอดคุณสมบตั ิเสมอ
ตวั อย่างท่ี 7.4 จากคลาสแม่คือ Ship โดยมีคลาสยอ่ ยคือ CruiseShip, Cruise90938, VocationTrip,
PanamaShip89032 จงเขียนคลาสไดอะแกรมและเขียนโครงโปรแกรม

ภาพท่ี 7.4 คลาสไดอะแกรมของตวั อยา่ งที่ 7.4

219

โครงโปรแกรม
class Ship {


}
class CruiseShip extends Ship{


}
class Cruise90938 extends Ship{


}
class VocationTrip extends Ship{


}
class panamaShip89032 extends {


}

ตัวอย่างท่ี 7.5 จงออกแบบคลาสแม่เป็ นคลาสเคร่ืองคิดเลขที่สามารถบวกไดอ้ ย่างเดียว และเขียน
คลาสยอ่ ยท่ีรับทอดคุณสมบตั ิเคร่ืองคิดเลข โดยสามารถเพ่ิมเมธอดสาหรับการลบดว้ ยอีกหน่ึงอยา่ ง
แลว้ เขียนโปรแกรมหลกั เพ่ือเรียกใชง้ านสาหรับบวกและลบ เลข x=100 y=50
คลาสไดอะแกรม

220

ภาพท่ี 7.5 คลาสไดอะแกรมของตวั อยา่ งท่ี 7.5
โปรแกรม :
----------------------------------------------------------------------------------------------------------------------
public class Calculator {

int x;
int y;
public int plus(){

return x+y;
}
}
----------------------------------------------------------------------------------------------------------------------
public class betterCalculator extends Calculator {
public int minus(){

return x-y;
}
}
----------------------------------------------------------------------------------------------------------------------
public class CalculatorMainApp {
public static void main(String args[]){

221

betterCalculator casio = new betterCalculator();
casio.x =100;
casio.y=50;
int resultPlus=casio.plus();
int resultMinus=casio.minus();
System.out.println("Plus Result:"+resultPlus+" Minus Result:"+resultMinus);
}

}
----------------------------------------------------------------------------------------------------------------------
ผลการรัน แสดงดงั น้ี
Plus Result:150 Minus Result:50

จากตวั อยา่ งน้ีจะพบวา่ การรับทอดน้นั สามารถรับทอดไดท้ ้งั เมธอดและแอตทริบิวต์ เช่น
การเรียกใชง้ าน x-y โดยที่ไม่ตอ้ งมีการประกาศเนื่องจากประกาศไวใ้ นคลาสแม่แลว้ คลาสลูกจึง
เรียกใช้งานไดท้ นั ที นอกจากน้นั ยงั เขียนเมธอดเพ่ิมเขา้ ไปใหม่ได้ โดยไม่ตอ้ งเขียนโปรแกรมที่มี
อยแู่ ลว้ ในคลาสแม่ เช่นการเขียนเมธอด minus เป็นตน้

ตัวอย่างที่ 7.6 จงเขียนโปรแกรมรับทอดเคร่ืองคิดเลขในขอ้ 7.5 ใหไ้ ดด้ งั น้ี
calDivision  calMultiply  betterCalculator  Calculator โดยเพ่ิมความสามารถ

คูณและหารเขา้ มาใชง้ านตามลาดบั
คลาสไดอะแกรม

222

ภาพท่ี 7.6 คลาสไดอะแกรมของตวั อยา่ งที่ 7.6
โปรแกรม :

โปรแกรมน้ีสร้างจากพ้นื ฐานของตวั อยา่ งท่ีผา่ นมา ดงั น้นั ตวั อยา่ งน้ีจาเป็นตอ้ งเขียน
คลาสเพมิ่ ดงั น้ี
----------------------------------------------------------------------------------------------------------------------
public class Calculator {

int x;
int y;
public int plus(){

return x+y;
}
}
----------------------------------------------------------------------------------------------------------------------
public class betterCalculator extends Calculator {

223

public int minus(){
return x-y;

}
}
----------------------------------------------------------------------------------------------------------------------
public class calMultiply extends betterCalculator {

public int multiply(){
return x*y;

}
}
----------------------------------------------------------------------------------------------------------------------
public class CalculatorMainApp {

public static void main(String args[]){
calDivision smartCasio = new calDivision();
smartCasio.x =100;
smartCasio.y=50;
int resultPlus=smartCasio.plus();
int resultMinus=smartCasio.minus();
int resultMultiply=smartCasio.multiply();
double resultDivision=smartCasio.divide();
System.out.println("Plus Result:"+resultPlus);
System.out.println("Minus Result:"+resultMinus);
System.out.println("Multiply Result:"+resultMultiply);
System.out.println("Divide Result:"+resultDivision);

}
}
----------------------------------------------------------------------------------------------------------------------
ผลการรัน จะไดด้ งั น้ี
Plus Result:150
Minus Result:50

224

Multiply Result:5000
Divide Result:2.0
คาอธิบาย จากตวั อย่างพบว่าการรับทอดคุณสมบตั ิในระดบั คลายย่อยสุดทา้ ย calDivision น้ัน
สามารถเรียกใชง้ านแอตทริบิวเตอร์ x และ y จากคลาสแม่ไดโ้ ดยตรง และการสร้างวตั ถุของคลาส
สาหรับรันโปรแกรมน้นั สามารถเรียกใชง้ านเมธอดทุกเมธอดของคลาสท่ีรับทอดมาท้งั หมด
ตัวอย่างท่ี 7.7 จงเขียนโปรแกรมเครื่องคิดเลข MixCalculator ให้สามารถบวก ลบ คูณ หาร
เลขทศนิยมได้ หลังจากน้ันเขียนคลาส AdvanceCalculator รับทอดคุณสมบัติของคลาส
MixCalculator โดยให้มีคุณสมบตั ิการ หาค่ารากที่สอง เพิ่มเติม โดยใช้จาวาสวิงในการจดั การ
โปรแกรมหลกั เพือ่ ติดตอ่ กบั ผใู้ ช้
คลาสไดอะแกรม

ภาพท่ี 7.7 คลาสไดอะแกรมของตวั อยา่ งท่ี 7.7
โปรแกรม :
----------------------------------------------------------------------------------------------------------------------
public class MixCalculator {

public double plus(double number1, double number2){

225

return number1+number2;
}
public double minus(double number1, double number2){

return number1-number2;
}

public double multiply(double number1, double number2){
return number1*number2;

}
public double divide(double number1, double number2){

return number1/number2;
}
}
----------------------------------------------------------------------------------------------------------------------
public class AdvanceCalculator extends MixCalculator{
public double squareRoot(double number){

return Math.sqrt(number);
}
}
----------------------------------------------------------------------------------------------------------------------
หลงั จากน้นั สร้างโปรแกรมจากโปรแกรมเน็ตบีนโดยใหอ้ อกแบบ JFrame ของคลาส MainMixApp
ดงั ภาพ

ภาพที่ 7.8 แสดงการออกแบบส่วนของโปรแกรมหลกั ตวั อยา่ งที่ 7.7
เขียนส่วนตน้ ของคลาสดงั น้ี

226

public class MainMixApp extends javax.swing.JFrame {
AdvanceCalculator advcasio = new AdvanceCalculator();

หลงั จากน้นั เขียนส่วนการจดั การเหตุการณ์ ใน ActionPerform ของแตล่ ะป่ ุมดงั น้ี
ป่ ุม +

double result=advcasio.plus(Double.parseDouble(jTextField1.getText()),
Double.parseDouble(jTextField2.getText()));

jTextField3.setText(String.valueOf(result));
ป่ ุม –

double result=advcasio.minus(Double.parseDouble(jTextField1.getText()),
Double.parseDouble(jTextField2.getText()));

jTextField3.setText(String.valueOf(result));
ป่ ุม *

double result=advcasio.multiply(Double.parseDouble(jTextField1.getText()),
Double.parseDouble(jTextField2.getText()));

jTextField3.setText(String.valueOf(result));
ป่ ุม /

double result=advcasio.divide(Double.parseDouble(jTextField1.getText()),
Double.parseDouble(jTextField2.getText()));

jTextField3.setText(String.valueOf(result));
ป่ ุม sqr

double result=advcasio.squareRoot(Double.parseDouble(jTextField1.getText()));
jTextField3.setText(String.valueOf(result));
ป่ ุม close

System.exit(0);
----------------------------------------------------------------------------------------------------------------------

ผลการรัน แสดงดงั น้ี

227

ภาพที่ 7.9 ผลการรันของตวั อยา่ งท่ี 7.7
คาอธิบาย โปรแกรมน้ียงั มีปัญหาอยบู่ า้ งกรณีหากไมป่ ้ อนขอ้ มลู ช่องท่ีสอง เพราะทาใหค้ ่าท่ีป้ อนเขา้
มาไมส่ ามารถแปลงไปเป็นตวั เลขได้
ตัวอย่างที่ 7.8 จงเขียนโปรแกรมถอนเงิน และฝากเงิน ตรวจสอบยอดเงิน จากบญั ชีธนาคาร โดย
หลงั จากน้นั ใหเ้ ขียนโปรแกรมส่วนการฝากเงินตรวจสอบยอดเงินแบบพิเศษสาหรับคนต่างชาติ ซ่ึง
บญั ชีคนต่างชาติตอ้ งมีเงินประกนั ดว้ ยโดยระบุยอดเงินไวเ้ สมอ สาหรับคนต่างชาติมีค่าธรรมเนียม
การดาเนินการคร้ังละ 50 บาทเสมอ

กาหนดให้มีลูกคา้ ปกติดงั น้ี สมพร, สมใจ, สมจิตร มียอดเงินในบญั ชีคือ 50000, 70000,
800000 ตามลาดบั

ลูกคา้ ต่างชาติดงั น้ี Micheal, Robert, Dumkerng มียอดเงินในบญั ชีคือ 60000, 900000,
1000000 ตามลาดบั
แนวคิดการแก้ปัญหา การวเิ คราะห์วตั ถุที่ควรจะมีดงั น้ี : บญั ชีธนาคารคนไทย, บญั ชีของคนตา่ งชาติ
การดาเนินการกบั บญั ชีคนไทย (ฝาก ถอน ตรวจสอบยอดเงิน), การดาเนินการกบั บญั ชีลูกคา้
ตา่ งชาติ, ลูกคา้ คนไทย, ลูกคา้ ต่างชาติ

บญั ชีธนาคารคนไทย: Account
บญั ชีคนตา่ งชาติ: ForeignAccount
การดาเนินการปกติ: AccountOperation

228

การดาเนินการคนต่างชาติ : ForeingnAccountOperation
ลูกคา้ คนไทย : NormalCustomer
ลูกคา้ ตา่ งชาติ : ForeignCustomer
วเิ คราะห์ความสัมพนั ธ์ของคลาส
AccountForeignAccount
AccountOperationForeingAccountOperation
NormalCustomerForeignCustomer
นอกจากน้นั ยงั มีคลาสที่เป็นคลาสรันโปรแกรมอีกคือ
Javax.swing.JFrameMainBankAccount
คลาสไดอะแกรม

ภาพที่ 7.10 คลาสไดอะแกรมของตวั อยา่ งท่ี 7.8
โปรแกรม :
----------------------------------------------------------------------------------------------------------------------
คลาสดาเนินการ
public class Account {

private double balance;

229

public double getBalance() {
return balance;

}

public void setBalance(double money) {
this.balance = money;

}
}
----------------------------------------------------------------------------------------------------------------------
public class ForeignAccount extends Account{
private double garuntee;

public double getGaruntee() {
return garuntee;

}
public void setGaruntee(double money) {

this.garuntee = money;
}
}
----------------------------------------------------------------------------------------------------------------------
public class AccountOperation {
public boolean withDraw(double money,Account acc){

acc.setBalance(acc.getBalance()-money);
return true;
}
public boolean Deposit(double money,Account acc){
acc.setBalance(acc.getBalance()+money);
return true;
}
public double checkBalance(Account acc){

230

return acc.getBalance();
}
}
----------------------------------------------------------------------------------------------------------------------
public class ForeignAccountOperation extends AccountOperation{
public double charge(ForeignAccount acc){

acc.setBalance(acc.getBalance()-50);
return 50;
}
public double checkForeignBalance(ForeignAccount acc){
this.charge(acc);
return acc.getBalance();
}
}
----------------------------------------------------------------------------------------------------------------------
public class NormalCustomer {
private String name;
public String getName() {
return name;
}
public void setName(String n) {
this.name = n;
}
}
----------------------------------------------------------------------------------------------------------------------
public class ForeignCustomer extends NormalCustomer{
private String national;
public String getNational() {
return national;
}

231

public void setNational(String n) {
this.national = n;

}
}
--------------------------------------------------------------------------------------------------------------------
คลาสหลกั สาหรับรัน
สร้างโปรแกรมหลกั สาหรับรันโดยให้ออกแบบโดยใชเ้ ครื่องมือของโปรแกรมเน็ตบีนดงั น้ี

ภาพท่ี 7.11 แสดงการออกแบบส่วนของโปรแกรมหลกั ตวั อยา่ งที่ 7.8
ส่วนการป้ อนขอ้ มลู ในตวั เลือกของลูกคา้ ใหค้ ลิกท่ี jComboBox1 แลว้ เลือก Model และ
กาหนดส่วนของขอ้ มูลดงั ภาพท่ี 7.12

ภาพท่ี 7.12 แสดงกาหนดขอ้ มูลใหผ้ ใู้ ชเ้ ลือกของ jComboBox1

232

ส่วนการกาหนดคลาสและคอนสตรักเตอร์
ส่ วนการประกาศแอตทริ บิวต์

public class MainBankAccount extends javax.swing.JFrame {
private NormalCustomer Somporn = new NormalCustomer();
private NormalCustomer Somjai = new NormalCustomer();
private NormalCustomer Somjit = new NormalCustomer();
private ForeignCustomer Micheal = new ForeignCustomer();
private ForeignCustomer Robert = new ForeignCustomer();
private ForeignCustomer Dumkerng = new ForeignCustomer();
//private Account N=new Account(5);
private Account SompornAcc=new Account();
private Account SomjaiAcc=new Account();
private Account SomjitAcc=new Account();
private ForeignAccount MichealAcc=new ForeignAccount();
private ForeignAccount RobertAcc=new ForeignAccount();
private ForeignAccount DumkerngAcc=new ForeignAccount();
private AccountOperation AccOp=new AccountOperation();
private ForeignAccountOperation ForAccOp=new ForeignAccountOperation();
คอนสตรักเตอร์
public MainBankAccount() {
initComponents();
//----- กาหนดชื่อ------
Somporn.setName("สมพร");
Somjai.setName("สมใจ");
Somjit.setName("สมจิตร");
Micheal.setName("Micheal");
Robert.setName("Robert");
Dumkerng.setName("Dumkerng");
SompornAcc.setBalance(50000);
SomjaiAcc.setBalance(70000);

233

SomjitAcc.setBalance(800000);
MichealAcc.setBalance(60000);
RobertAcc.setBalance(900000);
DumkerngAcc.setBalance(1000000);
}
ป่ มุ ถอน
switch(jComboBox1.getSelectedIndex()){
case 0:{

AccOp.withDraw(Double.parseDouble(jTextField1.getText()), SompornAcc);
jTextField2.setText(Somporn.getName());
jTextField3.setText("ถอน");
jTextField4.setText(String.valueOf(SompornAcc.getBalance()));
break;
}
case 1:{
AccOp.withDraw(Double.parseDouble(jTextField1.getText()), SomjaiAcc);
jTextField2.setText(Somjai.getName());
jTextField3.setText("ถอน");
jTextField4.setText(String.valueOf(SomjaiAcc.getBalance()));
break;
}
case 2:{
AccOp.withDraw(Double.parseDouble(jTextField1.getText()), SomjitAcc);
jTextField2.setText(Somjit.getName());
jTextField3.setText("ถอน");
jTextField4.setText(String.valueOf(SomjitAcc.getBalance()));
break;

}
case 3:{

234

ForAccOp.withDraw(Double.parseDouble(jTextField1.getText()), MichealAcc);
jTextField2.setText(Micheal.getName());
jTextField3.setText("ถอน");
ForAccOp.charge(MichealAcc);
jTextField4.setText(String.valueOf(MichealAcc.getBalance()));
break;
}
case 4:{
ForAccOp.withDraw(Double.parseDouble(jTextField1.getText()), RobertAcc);
jTextField2.setText(Robert.getName());
jTextField3.setText("ถอน");
ForAccOp.charge(RobertAcc);
jTextField4.setText(String.valueOf(RobertAcc.getBalance()));
break;
}
case 5:{
ForAccOp.withDraw(Double.parseDouble(jTextField1.getText()), DumkerngAcc);
jTextField2.setText(Dumkerng.getName());
jTextField3.setText("ถอน");
ForAccOp.charge(DumkerngAcc);
jTextField4.setText(String.valueOf(DumkerngAcc.getBalance()));
break;

}
}
ป่ ุมฝาก
switch(jComboBox1.getSelectedIndex()){

case 0:{
AccOp.Deposit(Double.parseDouble(jTextField1.getText()), SompornAcc);
jTextField2.setText(Somporn.getName());

235

jTextField3.setText("ฝาก");
jTextField4.setText(String.valueOf(SompornAcc.getBalance()));
break;
}
case 1:{
AccOp.Deposit(Double.parseDouble(jTextField1.getText()), SomjaiAcc);
jTextField2.setText(Somjai.getName());
jTextField3.setText("ฝาก");
jTextField4.setText(String.valueOf(SomjaiAcc.getBalance()));
break;
}
case 2:{
AccOp.Deposit(Double.parseDouble(jTextField1.getText()), SomjitAcc);
jTextField2.setText(Somjit.getName());
jTextField3.setText("ฝาก");
jTextField4.setText(String.valueOf(SomjitAcc.getBalance()));
break;

}
case 3:{

ForAccOp.Deposit(Double.parseDouble(jTextField1.getText()), MichealAcc);
jTextField2.setText(Micheal.getName());
jTextField3.setText("ฝาก");
ForAccOp.charge(MichealAcc);
jTextField4.setText(String.valueOf(MichealAcc.getBalance()));
break;
}
case 4:{
ForAccOp.Deposit(Double.parseDouble(jTextField1.getText()), RobertAcc);
jTextField2.setText(Robert.getName());

236

jTextField3.setText("ฝาก");
ForAccOp.charge(RobertAcc);
jTextField4.setText(String.valueOf(RobertAcc.getBalance()));
break;
}
case 5:{
ForAccOp.Deposit(Double.parseDouble(jTextField1.getText()), DumkerngAcc);
jTextField2.setText(Dumkerng.getName());
jTextField3.setText("ฝาก");
ForAccOp.charge(DumkerngAcc);
jTextField4.setText(String.valueOf(DumkerngAcc.getBalance()));
break;
}
}

ป่ มุ ถามยอด
switch(jComboBox1.getSelectedIndex()){
case 0:{
jTextField2.setText(Somporn.getName());
jTextField3.setText("ถามยอด");
jTextField4.setText(String.valueOf(AccOp.checkBalance(SompornAcc)));
break;
}
case 1:{

jTextField2.setText(Somjai.getName());
jTextField3.setText("ถามยอด");
jTextField4.setText(String.valueOf(AccOp.checkBalance(SomjaiAcc)));
break;
}

237

case 2:{
jTextField2.setText(Somjit.getName());
jTextField3.setText("ถามยอด");
jTextField4.setText(String.valueOf(AccOp.checkBalance(SomjitAcc)));
break;

}
case 3:{

jTextField2.setText(Micheal.getName());
jTextField3.setText("ถามยอด");
jTextField4.setText(String.valueOf(ForAccOp.checkForeignBalance(MichealAcc)));
break;

}
case 4:{

jTextField2.setText(Robert.getName());
jTextField3.setText("ถามยอด");
jTextField4.setText(String.valueOf(ForAccOp.checkForeignBalance(RobertAcc)));
break;
}
case 5:{
jTextField2.setText(Dumkerng.getName());
jTextField3.setText("ถามยอด");
jTextField4.setText(String.valueOf(ForAccOp.checkForeignBalance(DumkerngAcc)));
break;
}
}
ป่ ุมปิ ด
System.exit(0);

238

----------------------------------------------------------------------------------------------------------------------
ผลการรัน แสดงดงั น้ี

ภาพท่ี 7.13 แสดงตวั อยา่ งผลการรันตวั อยา่ งที่ 7.8

การอ้างองิ this และการเรียกใช้งานตวั สร้างแบบ super

ไซมอล เคนดลั (2009, p. 60) กล่าววา่ แต่ละ Subclass มีคอนสตรักเตอร์ของตนเองสาหรับ
ถูกใชก้ าหนดค่าเริ่มตน้ แต่ตอ้ งกระตุน้ ให้พฤติกรรมของ Superclass ดว้ ยคียเ์ วิร์ด super ซ่ึงเมื่อ
super() ถูกเรียกคอนสตรักเตอร์จะของ Superclass จะถูกกระตุน้ ให้ทางาน ดงั น้นั ตอ้ งใส่ไวท้ ่ี
ประโยคแรกของคอนสตรักเตอร์ของ Subclass

วาย. แดเนีล เหลียง (Y. Daniel Leang, 2009, p. 309) คียเ์ วริ ์ด super ใชอ้ า้ งถึงเมธอดอื่นๆ
มากกวา่ การเรียกใชค้ อนสตรักเตอร์ใน Superclass เอง ดงั น้นั การอา้ งถึงแอตทริบิวต์ และเมธอดใน
คลาสของตนเองสามารถอา้ งอิงไดด้ ว้ ย this. ใหส้ งั เกตตวั อยา่ งต่อไปน้ี

private int x;
public void showName(){

System.out.println("My name is Mr.Hero.");
this.showSurname();
}
public void showSurname(){
System.out.println("My surname is K.Man.");
}

239

public void setX(int x) {
this.x = x;

}

สังเกตเมธอด setX มีการอา้ งถึง this.x ซ่ึงหมายถึง private x; ท่ีประกาศไวต้ อนตน้ แต่ x อีก
ตวั น้นั หมายถึงตวั แปรเฉพาะที่ที่ประกาศเป็นพารามิเตอร์ใหใ้ ชง้ าน

การเรียกใชเ้ มธอด ใน showName() มีการเรียกใช้ this.showSurname() เพื่ออา้ งถึงเมธอดท่ี
อยใู่ นคลาสของตนเองเป็นหลกั

ตัวอย่างท่ี 7.9 จงเขียนโปรแกรมแสดง ช่ือ นามสกุล และที่อยโู่ ดยใชค้ ียเ์ วริ ์ด this ในการอา้ งถึงตวั
แปรสาธารณะและเมธอดท่ีทางานร่วมกนั กาหนดให้ คลาส thisExam เป็ นคลาสสาหรับแสดงชื่อ
นามสกุล และที่อยโู่ ดยใหเ้ มธอดแสดงชื่อเรียกใชเ้ มธอดแสดงนามสกลุ แลท่ีอยดู่ ว้ ยคียเ์ วริ ์ด this และ
อีกคลาสหน่ึงเป็นคลาสหลกั สาหรับรันโปรแกรม

โปรแกรม :
คลาส thisExam
public class thisExam {

private int x;
private String n;
private double a;
public void showName(){

System.out.println("My name is Mr.Hero.");
this.showSurname();
this.showAddress();
}
public void showSurname(){
System.out.println("My surname is K.Man.");
}
public void showAddress(){
System.out.println("My address is Thailand.");

240

}
public int getX() {

return x;
}
public void setX(int x) {

this.x = x;
}
public String getN() {

return n;
}
public void setN(String n) {

this.n = n;
}
public double getA() {

return a;
}
public void setA(double a) {

this.a = a;
}
}
คลาส mainApp
public class mainApp {
public static void main(String args[]){
thisExam obj = new thisExam();
obj.showName();
}
}
ผลการรันโปรแกรม แสดงดงั น้ี
My name is Mr.Hero.
My surname is K.Man.

241

My address is Thailand.

เมื่อคลาสย่อยมีการรับทอดคุณสมบัติจากคลาสแม่ดังน้ันส่ิงต่าง ๆ จะถูกกาหนดให้
คลาสลูกสามารถใชง้ านได้ ส่ิงหน่ึงท่ีเป็นเมธอดคอนสตรักเตอร์ สามารถอา้ งถึงดว้ ยการเรียกใชง้ าน
คอนสตรักเตอร์ของคลาสแม่ไดโ้ ดยใชเ้ มธอด super() ซ่ึงสามารถเรียกใชง้ านไดใ้ นสองลกั ษณะคือ
การเรียกใหค้ อนสตรักเตอร์ของคลาสแม่ทางาน หรืออาจใชอ้ า้ งอิงเพ่ือเรียกใชง้ านคลาสท่ีมีลกั ษณะ
ของการโอเวอร์ไรด์ คือการเขียนเมธอดใหม่แต่ตอ้ งการเรียกใช้งานเมธอดสาหรับทางานของ
คลาสแม่ก็สามารถทางานไดเ้ ช่นกนั รูปแบบการเรียกใช้งานเพียงแต่เรียกใช้งานคลาสที่มีอยแู่ ลว้
ดงั น้ี

super() จะเรี ยกใช้ในคอนตรักเตอร์ของคลาสย่อยสาหรับเรี ยกการทางานของ
คอนสตรักเตอร์ของคลาสยอ่ ย แสดงดงั ตวั อยา่ งที่ 7.10

super. ตามด้วยตัวแปร เป็ นการเขา้ ถึงตวั แปรสาธารณะท่ีอยู่ในคลาสแม่โดยตรง หากมี
ตวั แปรที่อาจซ้ากนั หรือดาเนินการใด ๆ กบั คลาสแม่โดยตรงอาจใชว้ ธิ ีน้ี แสดงดงั ตวั อยา่ งที่ 7.11

super. ตามด้วยเมธอด เป็นการเรียกใชง้ านเมธอดของคลาสแม่ ดงั ตวั อยา่ งท่ี 7.12
ตวั อย่างท่ี 7.10 จงเขียนโปรแกรมใหค้ ลาสยอ่ ยเรียกใชง้ านคอนสตรักเตอร์คลาสแม่เพอื่ แสดงค่า x
หลงั ถูกคอนสตรักเตอร์ของคลาสแม่เรียกทางานแลว้
คลาสไดอะแกรม

ภาพที่ 7.14 คลาสไดอะแกรมของตวั อยา่ งที่ 7.10

242

โปรแกรม :
----------------------------------------------------------------------------------------------------------------------
public class mySuperClass {

public int x;
public mySuperClass(){

this.x=500;
}
}
----------------------------------------------------------------------------------------------------------------------
public class mySubClass extends mySuperClass{
public mySubClass(){

super();
}
public void showXvalue(){

System.out.println("X value of Sub Class:" +this.x);
}
----------------------------------------------------------------------------------------------------------------------
public class App {
public static void main(String args[]){

mySubClass obj = new mySubClass();
obj.showXvalue();
}
}
--------------------------------------------------------------------------------------------------------------------
ผลการรัน แสดงดงั น้ี
X value of Sub Class:500

243

คาอธิบาย จากผลการรันน้ีพบวา่ มีการเรียกใช้ super() คือการเรียกใชง้ านเมธอดคอนสตรักเตอร์ของ
คลาสแม่ ในคอนสตรักเตอร์ตวั คลาสยอ่ ย ทาใหค้ า่ x ถูกกาหนดเปล่ียนไปไดเ้ ป็น 500

ตัวอย่างที่ 7.11 จากโปรแกรมตวั อย่างท่ี 7.10 จงเขียนโปรแกรมเพ่ือเรียกใชง้ านตวั แปร x โดย
เรียกใช้ super.x และ ตวั แปรเฉพาะท่ีสาหรับในคลาสที่เพมิ่ ข้ึนมาใหม่
โปรแกรม :
การเขียนโปรแกรมเพียงแต่เพิ่มส่วนของ mySubClass ดังนี้
public class mySubClass extends mySuperClass{

private int x=15;
public mySubClass(){

super();
}
public void showXvalue(){

System.out.println("X value of Sub Class:" +this.x);
System.out.println("X value of Sub Class:" +super.x);
}
}
ผลการรัน แสดงดงั น้ี
X value of Sub Class:15
X value of Sub Class:500

ตวั อย่างที่ 7.12 จากตวั อยา่ งที่ 7.10 จงเขียนเมธอดสาหรับแสดงค่า x ใน super class แลว้ เรียกใชโ้ ดย
ใช้ super.showXValue();
โปรแกรม :
การเขียนโปรแกรมเพียงแต่เพิ่ม ดงั นี้
public class mySuperClass {

public int x;

public mySuperClass(){

244

this.x=500;
}
public void showXvalue(){

System.out.println("X value from Super Class:"+this.x);
}
}
----------------------------------------------------------------------------------------------------------------------
public class mySubClass extends mySuperClass{
private int x=15;
public mySubClass(){

super();
}
public void showXvalue(){

System.out.println("X value from Sub Class:" +this.x);
}
public void showOutput(){

this.showXvalue();
super.showXvalue();
}
}
----------------------------------------------------------------------------------------------------------------------
public class App {
public static void main(String args[]){
mySubClass obj = new mySubClass();
obj.showOutput();
}
}
ผลการรัน แสดงดงั น้ี
X value from Sub Class:15


Click to View FlipBook Version