JavaProgrammingBook KMITL TH PDF
JavaProgrammingBook KMITL TH PDF
Java Programming i
2.1.5 ชองวาง.......................................................................................33
2.1.6 ขอมูลคาคงที่ ...............................................................................34
2.2 ชนิดขอมูลแบบพื้นฐาน .....................................................................34
2.2.1 ชนิดขอมูลตรรกะ.........................................................................35
2.2.2 ชนิดขอมูลตัวอักขระ....................................................................36
2.2.3 ชนิดขอมูลตัวเลขจํานวนเต็ม ........................................................37
2.2.4 ชนิดขอมูลตัวเลขทศนิยม.............................................................38
2.3 ตัวแปรและคาคงที่ ............................................................................39
2.3.1 คําสั่งกําหนดคา ...........................................................................40
2.3.2 คาคงที่ ........................................................................................42
2.3.3 ขอบเขตของตัวแปรและคาคงที่ ....................................................44
2.4 ตัวดําเนินการ....................................................................................47
2.4.1 ตัวดําเนินการทางคณิตศาสตร .....................................................47
2.4.2 ตัวดําเนินการแบบสัมพันธ ...........................................................50
2.4.3 ตัวดําเนินการทางตรรกศาสตร .....................................................52
2.4.4 ตัวดําเนินการแบบบิต ..................................................................54
2.4.5 ลําดับความสําคัญของตัวดําเนินการ.............................................56
2.5 การแปลงชนิดขอมูล..........................................................................57
2.5.1 การแปลงขอมูลในคําสั่งกําหนดคา ...............................................58
2.5.2 Typecasting ...............................................................................60
2.6 ชนิดขอมูลแบบอางอิง .......................................................................61
2.6.1 คลาส String ...........................................................................63
2.6.2 คลาส Math ..............................................................................66
2.7 คําสั่งอินพุตและเอาทพุต ...................................................................67
2.7.1 System.out.println() ...................................................68
2.7.2 การรับขอมูลเขามาทาง Command Line......................................69
สรุปเนื้อหาของบท..........................................................................................70
ii คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
3.2.1 คําสั่ง if.....................................................................................74
3.2.2 คําสั่ง if..else ......................................................................76
3.2.3 คําสั่ง if แบบซอน.....................................................................79
3.2.4 คําสั่ง switch ...........................................................................82
3.3 โครงสรางแบบทําซ้ํา .........................................................................85
3.3.1 คําสั่ง while .............................................................................85
3.3.2 คําสั่ง do..while ....................................................................88
3.3.3 คําสั่ง for ..................................................................................89
3.4 โครงสรางแบบซอน (NESTED STRUCTURE) ........................................92
3.4.1 คําสั่ง break, continue และ label ....................................94
สรุปเนื้อหาของบท..........................................................................................97
บทที่ 4 หลักการเชิงออปเจ็ค........................................................................................99
4.1 องคประกอบของโปรแกรมเชิงออปเจ็ค ..............................................99
4.1.1 ออปเจ็ค ......................................................................................99
4.1.2 คลาส ........................................................................................100
4.1.3 คุณลักษณะ...............................................................................101
4.1.4 เมธอด.......................................................................................103
4.2 การเขียนโปรแกรมเชิงออปเจ็คโดยใชภาษาจาวา.............................104
4.2.1 การประกาศคลาส......................................................................104
4.2.2 การประกาศคุณลักษณะ ............................................................105
4.2.3 การประกาศเมธอด....................................................................105
4.2.4 การประกาศและสรางออปเจ็ค ....................................................107
4.2.5 การเรียกใชสมาชิกของออปเจ็ค .................................................109
4.3 คุณลักษณะเดนของโปรแกรมเชิงออปเจ็ค........................................111
4.3.1 การหอหุม .................................................................................111
4.3.2 การสืบทอด...............................................................................113
4.3.3 การมีไดหลายรูปแบบ................................................................115
4.4 UNIFIED MODELING LANGUAGE ........................................................116
4.4.1 ไดอะแกรมของคลาส .................................................................116
4.4.2 ไดอะแกรมของออปเจ็ค .............................................................117
iv คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
5.9 การสรางภาพกราฟฟก....................................................................161
5.9.1 การเขียนคลาสเพื่อวาดรูปกราฟฟก ...........................................161
5.10 แพคเก็จ Swing.............................................................................164
5.10.1 คลาส JFrame ...................................................................166
5.10.2 คลาส JComponent..........................................................169
5.10.3 การใชคุณลักษณะเดนอื่นๆ ..................................................169
สรุปเนื้อหาของบท........................................................................................170
Java Programming v
6.5.2 ขั้นตอนการทํางานของคําสั่ง new..............................................207
6.5.3 Constructor แบบ Overloaded..................................................208
6.5.4 เมธอด this() .......................................................................209
6.5.5 เมธอด super().....................................................................210
6.6 เมธอดของคลาสที่ชื่อ Object .......................................................213
6.6.1 เมธอด toString() .............................................................214
6.6.2 เมธอด equals() ..................................................................215
6.7 คลาสประเภท WRAPPER .................................................................216
6.8 คียเวิรดอื่นๆที่สําคัญ .......................................................................217
6.8.1 คุณลักษณะแบบ static ........................................................217
6.8.2 เมธอดแบบ static ................................................................218
6.8.3 Static Initializer ........................................................................219
6.8.4 คียเวิรด final........................................................................220
6.9 คลาสแบบ abstract และอินเตอรเฟส.........................................221
6.9.1 คลาสแบบ abstract .............................................................221
6.9.2 อินเตอรเฟส ..............................................................................223
6.10 คลาสภายใน ...................................................................................225
6.10.1 คลาสภายในที่อยูภายในคลาส..............................................226
6.10.2 คลาสภายในที่อยูภายในเมธอด ............................................227
6.11 แพคเก็จ .........................................................................................228
6.11.1 การประกาศและใชแพคเก็จ .......................................................229
สรุปเนื้อหาของบท........................................................................................230
บทที่ 7 การจัดการกับเหตุการณกราฟฟก.................................................................235
7.1 เหตุการณ .......................................................................................235
7.2 AWTEvent ...................................................................................236
7.2.1 ActionEvent.......................................................................237
7.2.2 WindowEvent.......................................................................238
7.2.3 MouseEvent .........................................................................238
7.2.4 ItemEvent ...........................................................................239
7.2.5 Event อื่นๆ ............................................................................240
vi คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
7.3 อินเตอรเฟสประเภท Listener ...................................................240
7.4 การจัดการกับเหตุการณ..................................................................242
7.4.1 การสรางออปเจ็คของคลาสภายนอก ..........................................244
7.4.2 การสรางออปเจ็คของคลาสภายใน .............................................244
7.4.3 การสรางออปเจ็คภายในคลาสเดียวกัน .......................................247
7.4.4 การรับฟงเหตุการณหลายเหตุการณ ..........................................248
7.4.5 คลาสประเภท Event Adapter ...........................................250
7.4.6 การสรางคลาสแบบ anonymous ..............................................251
สรุปเนื้อหาของบท........................................................................................252
ศัพทานุกรม………………………………………………………..……………………...…..367
ดัชนี………………………………………………………..……………………...…..……….377
บรรณานุกรม…………………………………………………………………………………385
Java Programming ix
x คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
บทที่ 1
ความรูเบื้องตนของภาษาจาวา
เนื้อหาในบทนี้เปนการแนะนําภาษาจาวา โดยจะเริ่มจากการแนะนําหลักการของ
ภาษาคอมพิวเตอรโดยทั่วๆไป ประวัติความเปนมาโดยยอของภาษาจาวา ขอแตกตางของ
ภาษาจาวากับภาษาคอมพิวเตอรอื่นๆ หลักการการทํางานของโปรแกรมภาษาจาวา และ
ความหมายของเครื่องจักรสมมุติที่ใชในภาษาจาวา พรอมทั้งแนะนําเทคโนโลยีและแพลตฟอรม
ตางๆของภาษาจาวา แนะนําตัวอยางการเขียนโปรแกรมจาวาประยุกตและโปรแกรมจาวา
แอปเพล็ต และในสวนทายของบทไดมีการแนะนําวิธีการใชคูมอื Java API
1.1 ระบบคอมพิวเตอร
เครื่องคอมพิวเตอรเปนเครื่องอิเล็กทรอนิกส ที่ใชในการคํานวณและจัดการกับระบบ
ขอมูล องคประกอบของระบบคอมพิวเตอรโดยทั่วไปจะเปนดังแสดงในรูปที่ 1.1 ซึ่งจะประกอบ
ไปดวยสวนหลักสามสวนคือ
1. ฮารดแวร (Hardware) คือสวนประกอบที่เปนตัวเครื่องคอมพิวเตอรที่
ประกอบดวยหนวยประมวลผลกลาง (Central Processing Unit หรือ CPU)
อุปกรณสวนอินพุต อุปกรณสวนเอาทพุต หนวยความจํา และอุปกรณเก็บขอมูล
2. ระบบปฏิบัติการ (Operating System) คือระบบซอฟตแวรที่ติดตั้งเพื่อให
โปรแกรมประยุกตตางๆ สามารถติดตอกับฮารดแวรได ระบบปฏิบัติการที่นิยมใช
ในปจจุบันมีอยูหลายระบบ อาทิเชน Windows XP, Linux และ Solaris เปนตน
ทั้งนี้ฮารดแวรชนิดเดียวกันสามารถที่จะมีระบบปฏิบัติการที่แตกตางกันได
3. โปรแกรมประยุกต (Application Program) คือโปรแกรมที่ใชงานทั่วๆไป เชน
โปรแกรม Word Processor, เกมส หรือโปรแกรมเว็บบราวเซอร (Web
Browser) เปนตน โปรแกรมเหลานี้จะถูกพัฒนาโดยใชภาษาคอมพิวเตอรตางๆ
อาทิเชน ภาษาฟอรแทรน (FORTRAN) ภาษาโคบอล (COBOL) ภาษาเบสิก
(BASIC) ภาษา C++ หรือภาษาจาวา เปนตน โปรแกรมประยุกตจะทํางาน
ภายใตระบบปฏิบัติการ ดังนั้นโปรแกรมประยุกตบนระบบปฏิบัติการระบบใด
ระบบหนึ่งจะไมสามารถนําไปใชในระบบปฏิบัติการอื่นได
Java Programming 1
รูปที่ 1.1 องคประกอบของระบบคอมพิวเตอร
1.2 ภาษาคอมพิวเตอร
ภาษาคอมพิวเตอรคือคําสั่งที่นักพัฒนาโปรแกรม (programmer) พัฒนาขึ้นเพื่อสั่งให
เครื่องคอมพิวเตอรทํางานตามที่ตองการ ภาษาคอมพิวเตอรแบงออกเปนสามประเภทคือ
1. ภาษาเครื่อง (Machine Language) เปนภาษาเดียวที่เครื่องคอมพิวเตอรสามารถ
เขาใจได ภาษาเครื่องจะประกอบไปดวยคําสั่งที่เปนชุดของเลขฐานสองเชน
01010110 ซึ่งจะถูกกําหนดโดยฮารดแวรของเครื่องคอมพิวเตอร ทั้งนี้
ภาษาเครื่องจะขึ้นอยูกับชนิดของหนวยประมวลผลกลางของเครื่องคอมพิวเตอร
แตละเครื่อง โดยปกติแลวนักพัฒนาโปรแกรมไมสามารถที่จะพัฒนาโปรแกรมโดย
เขียนภาษาเครื่องไดโดยตรง ทั้งนี้เนื่องจากเปนภาษาที่ใชเลขฐานสองซึ่งไมใช
ชุดคําสั่งที่มนุษยจะสามารถเขาใจไดโดยงาย ตัวอยางของคําสั่งภาษาเครื่องมีดังนี้
10110011 00011001
01111010 11010001 10010100
10011111 00011001
01011100 11010001 10010000
10111011 11010001 10010110
2. ภาษาแอสเซมบลี (Assembly Language) เปนภาษาคอมพิวเตอรที่แทนชุดคําสั่ง
เลขฐานสองดวยคําสัญลักษณที่เปนภาษาอังกฤษ เชน 10110011 อาจแทนดวย
MOV เปนตน ทําใหนักพัฒนาโปรแกรมเขียนและเขาใจโปรแกรมไดงายขึ้น การ
ทํางานของโปรแกรมภาษาแอสเซมบลี จะตองมีการแปลภาษาแอสเซมบลีใหเปน
ภาษาเครื่องกอนจึงจะทํางานได แมภาษาแอสเซมบลีจะมีชุดคําสั่งที่เปนคํา
ภาษาอังกฤษ แตนักพัฒนาโปรแกรมภาษาแอสเซมบลีจะตองมีความเขาใจ
โครงสรางฮารดแวรของระบบคอมพิวเตอรจึงจะสามารถเขียนโปรแกรมได ดังนั้น
2 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
ทําใหภาษาแอสเซมบลีไมเปนที่นิยมใช ตัวอยางของโปรแกรมภาษาแอสเซมบลีมี
ดังนี้
MOV 0, SUM
MOV NUM, AC
ADD SUM, AC
STO SUM, TOT
3. ภาษาระดับสูง (High-level Language) การพัฒนาโปรแกรมโดยทั่วไปจะใช
โปรแกรมภาษาคอมพิวเตอรระดับสูง ภาษาคอมพิวเตอรระดับสูงจะใชชุดคําสั่งที่
คนทั่วไปเขาใจไดงาย เหมือนการใชคําสั่งในภาษาอังกฤษหรือการเขียนสมการ
คณิตศาสตรทั่วไป นักพัฒนาโปรแกรมไมจาํ เปนตองเขาใจหลักการทํางานของ
ฮารดแวรก็สามารถที่จะพัฒนาโปรแกรมภาษาคอมพิวเตอรระดับสูงได โปรแกรม
ภาษาคอมพิวเตอรระดับสูง จะตองการตัวแปลภาษาที่ทําหนาที่เปลี่ยนชุดคําสั่งให
มาเปนภาษาแอสเซมบลีหรือภาษาเครื่องจึงจะทํางานได เมื่อเทียบกับภาษา
แอสเซมบลีแลวภาษาคอมพิวเตอรระดับสูง จะชวยใหนักพัฒนาโปรแกรมพัฒนา
โปรแกรมไดรวดเร็วกวา แตโปรแกรมที่พัฒนาขึ้นจะทํางานไดชากวา
ในปจจุบันมีโปรแกรมภาษาคอมพิวเตอรระดับสูงอยูหลายรอยภาษา แตที่นิยมใชและ
ไดรับการยอมรับมีเพียงไมกี่ภาษา ภาษาคอมพิวเตอรในยุคแรกที่นิยมใชมหี ลายภาษาอาทิเชน
• ภาษาฟอรแทรน (FORTRAN ยอมาจาก FORmula TRANslator) พัฒนาโดย
บริษัท IBM ระหวางป ค.ศ. 1954 ถึง ค.ศ. 1957 ภาษานี้ใชสําหรับการพัฒนา
โปรแกรมประยุกตดานวิทยาศาสตรและวิศวกรรมศาสตร ที่ตองใชในการคํานวณ
สมการคณิตศาสตรที่ซับซอน ปจจุบันภาษาฟอรแทรนยังเปนที่นิยมใชในการ
พัฒนาโปรแกรมดานวิทยาศาสตรและวิศวกรรมศาสตร
• ภาษาโคบอล (COBOL ยอมาจาก COmmon Business Oriented Language)
พัฒนาขึ้นในป ค.ศ. 1959 เปนภาษาที่พัฒนาขึ้นมาเพื่อใชในการพัฒนาโปรแกรม
ประยุกตดานธุรกิจและการคา ปจจุบันโปรแกรมที่ใชในดานธุรกิจจํานวนมากยัง
เปนโปรแกรมที่พัฒนามาจากภาษาโคบอล
• ภาษาเบสิก (BASIC ยอมาจาก Beginners All-purpose Symbolic Instructional
Code) เปนภาษาที่พัฒนาขึ้นโดยมีจุดประสงคเพื่อใหผูเริ่มตนพัฒนาโปรแกรม
สามารถเรียนรูและเขาใจการพัฒนาโปรแกรมอยางงาย ภาษาเบสิกเปนภาษา
คอมพิวเตอรภาษาแรกที่ใชในเครื่องไมโครคอมพิวเตอร
Java Programming 3
ภาษาคอมพิวเตอรที่พัฒนาขึ้นในยุคแรก ยังมีขอจํากัดในการที่จะพัฒนาโปรแกรม
ขนาดใหญ ทั้งนี้เนื่องจากภาษาคอมพิวเตอรเหลานั้นขาดโครงสรางที่ดี ทําใหการพัฒนา
โปรแกรมที่มีขนาดใหญและมีความซับซอนเปนไปไดยาก ในชวงตนป ค.ศ. 1970 จึงมีภาษา
คอมพิวเตอรที่เปนภาษาเชิงกระบวนการ (Procedural หรือ Structural Language) เกิดขึ้น
ภาษาคอมพิวเตอรประเภทนี้จะมีความยืดหยุนในการพัฒนาโปรแกรม ทําใหสามารถแกไขและ
บํารุงรักษาไดงาย เนื่องจากโปรแกรมถูกแยกออกเปนสวนๆ ภาษาคอมพิวเตอรที่เปนภาษา
เชิงกระบวนการที่สําคัญคือ
• ภาษาปาสคาล (Pascal) พัฒนาโดย Nicklaus Wirth ในป ค.ศ. 1971 โดยมี
จุดประสงคเพื่อใชในการสอนการเขียนโปรแกรมภาษาเชิงกระบวนการ ใน
มหาวิทยาลัย แตเนื่องจากภาษาปาสคาลไมมีคุณลักษณะที่จะสนับสนุนการ
พัฒนาโปรแกรมดานธุรกิจและอุตสาหกรรมจึงไมไดรับความนิยมมากนัก
• ภาษาซี (C) พัฒนาขึ้นในชวงเดียวกับภาษาปาสคาล โดยนักวิจัยที่หองปฏิบัติการ
AT&T Bell ซึ่งไดนําเอาจุดเดนของภาษา BCPL และภาษา B มาใชและไดเพิ่ม
คุณลักษณะและชนิดขอมูลอื่นเขามาดวย เดิมภาษาซีถือวาเปนภาษาคอมพิวเตอร
ที่สําคัญในการพัฒนาโปรแกรมบนระบบปฏิบัติการยูนิกส (Unix) ซึ่งเปนภาษา
คอมพิวเตอรที่สามารถสรางโปรแกรมประยุกตที่ทํางานไดรวดเร็วมาก เมื่อเทียบ
กับภาษาคอมพิวเตอรอื่นๆ
จุดดอยของการพัฒนาโปรแกรมภาษาเชิงกระบวนการคือ จะมีตนทุนในการพัฒนา
โปรแกรมที่คอนขางสูง เนื่องจากจะตองมีการออกแบบโปรแกรมใหแยกออกเปนสวนๆที่
เรียกวาโมดูล (module) ซึ่งจะตองเปนอิสระจากกัน การออกแบบใหมคี วามเปนอิสระตอกัน
นั้นทําไดยาก ซึ่งหากออกแบบมาไมดีจะทําใหการแกไขและบํารุงรักษาโปรแกรมเปนไปไดยาก
ดังนั้นจึงมีการพัฒนาภาษาคอมพิวเตอรในแบบที่เรียกวา ภาษาเชิงออปเจ็ค (Object Oriented
Programming) ที่พยายามใหการพัฒนาโปรแกรมเปนการเลียนแบบการทํางานของออปเจ็ค
ตางๆในโลก ทั้งนี้เพื่อใหงายตอการพัฒนาโปรแกรมและสามารถนําโปรแกรมกลับมาใชใหม
(reuse) ไดดีกวาภาษาเชิงกระบวนการ ภาษาคอมพิวเตอรที่เปนภาษาเชิงออปเจ็คที่สําคัญคือ
• ภาษา C++ เปนภาษาที่พัฒนามาจากภาษาซีเมื่อตน ค.ศ. 1980 โดยนักวิจัยที่
หองปฏิบัติการ Bell โดยไดเพิ่มหลักการเชิงออปเจ็คขึ้นมาจากภาษาซี ดังนั้น
นักพัฒนาโปรแกรมภาษา C++ สามารถที่จะพัฒนาโปรแกรมทั้งในเชิงออปเจ็ค
และเชิงกระบวนการ (ตามแบบภาษาซี) ได ทําใหปจจุบันภาษา C++ ยังเปนที่
นิยมใชกันอยางแพรหลาย
4 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
• ภาษา Smalltalk เปนภาษาเชิงออปเจ็คที่พัฒนาโดยนักวิจัยที่ Xerox’s Palo Alto
Research Center (PARC) ซึ่งเปนภาษาคอมพิวเตอรที่เปนภาษาเชิงออปเจ็ค
อยางแทจริง แตภาษา Smalltalk ไมไดรับความนิยมในการนําไปใชงานมากนัก
เมื่อเทียบกับภาษา C++ หรือภาษาจาวา
• ภาษาจาวาเปนภาษาคอมพิวเตอรที่พัฒนาโดย นักวิจัยของบริษัทซันไมโครซิส-
เต็มส (SUN Microsystems) โดยเริ่มมีการนํามาเผยแพรเมื่อป ค.ศ. 1995
ปจจุบันเปนภาษาเชิงออปเจ็คที่เปนที่นิยมใชกันมากภาษาหนึ่ง ซึ่งไดรับการ
ยอมรับในการพัฒนาโปรแกรมทางธุรกิจและอุตสาหกรรม และยังเปนที่นิยมใช
เพื่อการศึกษาหลักการการเขียนโปรแกรมคอมพิวเตอรโดยใชภาษาเชิงออปเจ็ค
อีกดวย
1.3 ตัวแปลภาษา
ภาษาคอมพิวเตอรระดับสูงจะตองการตัวแปลภาษา (language translator) เพื่อแปล
โปรแกรมที่เขียนขึ้นหรือที่เรียกวาซอรดโคด (source code) ของภาษาคอมพิวเตอรแตละ
ภาษาใหเปนภาษาแอสเซมบลีหรือภาษาเครื่องที่เครื่องคอมพิวเตอรสามารถเขาใจได ตัวแปล
ภาษาแบงออกเปนสองแบบคือ
1. คอมไพเลอร (Compiler) ตัวแปลภาษาประเภทนี้จะแปลชุดคําสั่งในซอรดโคด
ทั้งหมดใหเปนโปรแกรม executable code ดังแสดงในรูปที่ 1.2 ตัวอยางเชน
แปลซอรดโคดภาษาซีจากโปรแกรม Hello.c ใหเปนโปรแกรม executable
code ที่ชื่อ Hello.exe โดยโปรแกรม executable code ที่ไดจากการ
แปลภาษาคอมพิวเตอรระดับสูงจะสามารถทํางานไดอยางรวดเร็ว ทั้งนี้เนื่องจาก
โคดอยูในรูปของเลขฐาน สองที่สามารถติดตอกับเครื่องคอมพิวเตอรไดโดยตรง
ตัวอยางของภาษา คอมพิวเตอรที่ใชคอมไพเลอรคือ ภาษาซี C++ ฟอรแทรน
และปาสคาล เปนตน
คอมไพเลอรจะสรางโปรแกรม executable code ที่ขึ้นอยูกับแพลตฟอรม
(ฮารดแวรและระบบปฏิบัติการ) ดังนั้นผูใชจะไมสามารถนําโปรแกรม executable
code ที่ไดจากการแปลของคอมไพเลอรบนแพลตฟอรมหนึ่งไปใชบนแพลตฟอรม
อื่นๆได ในกรณีที่นักพัฒนาโปรแกรมตองการนําโปรแกรมที่พัฒนาขึ้นไปใชบน
แพลตฟอรมอื่นๆ นักพัฒนาโปรแกรมจะตองทําการแปลซอรดโคดของโปรแกรม
Java Programming 5
ใหม โดยจะตองใชคอมไพเลอรที่สรางโปรแกรม executable code สําหรับ
แพลตฟอรมที่ตองการใชงานนั้นๆ
6 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
รูปที่ 1.3 ขั้นตอนการทํางานของอินเตอรพรีตเตอร
1.4 หลักการของโปรแกรมเชิงออปเจ็ค
การเขียนโปรแกรมโดยใชภาษาคอมพิวเตอรระดับสูงในปจจุบันจะมีแนววิธีการคิดอยู
สองรูปแบบที่สําคัญคือ แนวคิดเชิงกระบวนการ และแนวคิดเชิงออปเจ็ค ดังที่กลาวไวในหัวขอ
ที่ 1.2
การเขียนโปรแกรมโดยใชภาษาเชิงกระบวนการ จะเริ่มตนจากการวิเคราะหปญหา
โดยพิจารณาจากกระบวนการและลําดับการทํางาน และจะพยายามแบงโปรแกรมออกเปน
สวนๆตามฟงกชั่นของการทํางานอาทิเชน การพัฒนาโปรแกรมระบบทะเบียนนักศึกษาโดยใช
โปรแกรมเชิงกระบวนการอาจจะพิจารณาแบงโปรแกรมตามลําดับการทํางาน โดยอาจมี
ฟงกชั่นในการทํางานสําหรับการลงทะเบียนรายวิชา การชําระเงิน หรือการเพิ่มหรือถอน
รายวิชา เปนตน
ฟงกชั่นแตละสวนของโปรแกรมเชิงกระบวนการ จะมีตัวแปรที่จะสงผานขอมูล
ระหวางกัน การออกแบบโปรแกรมเชิงกระบวนการที่ดีจะตองพยายามแบงฟงกชั่นใหเปน
อิสระตอกันใหมากที่สุด และตองพยายามที่จะเขียนขั้นตอนหรือลําดับการทํางานใหสมบูรณ
ที่สุดตั้งแตขั้นตอนการออกแบบ จึงทําใหการปรับปรุงหรือแกไขโปรแกรมที่พัฒนาจากภาษา
เชิงกระบวนการทําไดยากเมื่อเทียบกับโปรแกรมที่พัฒนาจากภาษาเชิงออปเจ็ค ทั้งนี้เนื่องจาก
กระบวนการการพัฒนาโปรแกรมนั้นไมสามารถที่จะออกแบบโปรแกรมใหสมบูรณตั้งแตตนโดย
ไมมีการนํากลับมาแกไขปรับปรุงอีกได
Java Programming 7
การพัฒนาโปรแกรมเชิงออปเจ็คจะมีแนวคิดในการแกปญหา โดยมองปญหาวา
ประกอบไปดวยออปเจ็คตางๆ ซึ่งแนวคิดนี้จะเขาใกลเคียงกับธรรมชาติของมนุษยมากที่สุด
เนื่องจากมนุษยมองสิ่งตางๆรอบตัวเปนออปเจ็คทั้งที่เปนรูปธรรม (วัตถุ) เชน ปากกา
นักศึกษา หรือใบลงทะเบียน เปนตน และที่เปนนามธรรมเชน คะแนน หรือรายชื่อวิชา เปนตน
การเขียนโปรแกรมเชิงออปเจ็คจะเปนขบวนการการวิเคราะหปญหา โดยการจําลอง
คุณลักษณะและพฤติกรรมของออปเจ็คในระบบจริง ใหอยูในรูปของโปรแกรมคอมพิวเตอร
ตัวอยางเชน การพัฒนาโปรแกรมระบบทะเบียนนักศึกษาอาจแบงโปรแกรมใหประกอบดวย
ออปเจ็คตางๆอาทิเชน นักศึกษา ใบลงทะเบียน และรายวิชา เปนตน ออปเจ็คชนิดนักศึกษา
อาจมีคุณลักษณะตางๆเชน ชื่อ รหัส และเกรดเฉลี่ย เปนตน และอาจมีพฤติกรรมที่นักศึกษา
สามารถกระทําไดเชน ลงทะเบียน และเพิ่มหรือถอนวิชา เปนตน
การพัฒนาโปรแกรมโดยใชภาษาคอมพิวเตอรเชิงออปเจ็ค จะทําใหขบวนการพัฒนา
โปรแกรมทําไดรวดเร็วขึ้นและสามารถปรับปรุงแกไขโปรแกรมไดงาย ซึ่งเหมาะกับการพัฒนา
โปรแกรมขนาดใหญที่จะตองมีการปรับปรุงแกไขโปรแกรมอยูต ลอด นอกจากนี้โปรแกรมเชิง
ออปเจ็คยังมีคุณลักษณะเดนอื่นๆอีกดังนี้
• การหอหุม (Encapsulation) เปนคุณลักษณะที่ทําใหออปเจ็คแตละตัวเปนอิสระ
ตอกัน ซึ่งทําใหสามารถแบงการพัฒนาโปรแกรมออกเปนสวนๆไดงาย
• การสืบทอด (Inheritance) เปนคุณลักษณะที่ทําใหสามารถนําโปรแกรมที่พัฒนา
แลวกลับมาใชใหมไดงายกวาการเขียนโปรแกรมเชิงกระบวนการ
• การมีไดหลายรูปแบบ (Polymorphism) เปนคุณลักษณะที่ทําใหนักพัฒนา
โปรแกรมสามารถเพิ่มเติมสวนตางๆของโปรแกรมไดงาย
1.5 ประวัติภาษาจาวา
ภาษาจาวาเปนภาษาคอมพิวเตอรที่พัฒนาขึ้น โดยทีมวิจัยของบริษัทซันไมโครซิส-
เต็มส ซึ่งเริ่มตนเมื่อป ค.ศ. 1991 โดยทางบริษัทซันไมโครซิสเต็มสไดสนับสนุนใหมีการพัฒนา
โครงการที่ชื่อ Green Project ที่มีจุดมุงหมายที่จะออกแบบภาษาคอมพิวเตอรขนาดเล็กเพื่อใช
กับอุปกรณอิเล็กทรอนิกสตางๆเชน สวิทซบล็อกของเคเบิ้ลทีวี ซึ่งอุปกรณเหลานี้จะมีขอจํากัด
ในดานหนวยความจําและหนวยประมวลผลกลางที่จะมีความแตกตางกัน ดังนั้นภาษา
คอมพิวเตอรที่พัฒนาขึ้นจะตองไมขึ้นอยูกับแพลตฟอรม (Platform Independent) ผลงานของ
ทีมวิจัยนี้ทําใหไดภาษาคอมพิวเตอรใหมที่ชื่อวา “Oak” ซึ่งมีโครงสรางและคําสั่งคลายภาษา
C++ ทั้งนี้เนื่องจากทีมวิจัยของบริษัทซันไมโครซิสเต็มสมีความคุนเคยกับระบบปฏิบัติการ
8 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
ยูนิกสซึ่งมักจะใชภาษา C++ ในการพัฒนาโปรแกรม ภาษา “Oak” ตอมาไดเปลี่ยนมาเปนชื่อ
“จาวา” ทั้งนี้เนื่องจากทีมวิจัยไดทราบภายหลังวา ”Oak” เปนชื่อภาษาคอมพิวเตอรที่มีอยูแลว
ภาษาจาวาเปนภาษาคอมพิวเตอรเชิงออปเจ็ค (Object Orianted Programming หรือ
เรียกยอวา OOP) โดยมีจุดเดนตรงที่สามารถทํางานไดกับระบบคอมพิวเตอรหลาย
แพลตฟอรม ทีมวิจัยของโครงการ Green Project ไดสรางเครื่องตนแบบที่เรียกวา ”*7”
ซึ่งเปนรีโมทคอนโทรลเพื่อสาธิตเทคโนโลยีภาษาจาวาที่คนคิดขึ้นมานี้เมื่อป ค.ศ. 1992 โดย
ทางบริษัทซันไมโครซิสเต็มสไดพยายามหาผูซื้อเทคโนโลยีดังกลาว แตก็ไมประสบความสําเร็จ
มากนัก
ในชวงดังกลาว ระบบอินเตอรเน็ตไดเริ่มมีการใชงานอยางแพรหลายมากขึ้น โดย
เฉพาะการใชงานของโปรแกรมเว็บบราวเซอร (Web Browser) เพื่อที่จะเรียกดูเอกสารใน
รูปแบบของไฟล HTML เนื่องจากระบบอินเตอรเน็ตจะประกอบไปดวยเครื่องคอมพิวเตอรที่มี
แพลตฟอรมแตกตางกัน ทางบริษัทซันไมโครซิสเต็มสจึงไดเห็นความจําเปนที่จะตองมีภาษา
คอมพิวเตอรที่สามารถสรางโปรแกรมที่ทํางานบนแพลตฟอรมใดๆก็ได จึงไดนําภาษาจาวามา
พัฒนาอีกครั้งหนึ่ง โดยไดพัฒนาโปรแกรมเว็บบราวเซอรที่ชื่อ Hot Java ที่สามารถรัน
โปรแกรมจาวาแอปเพล็ต (Java Applet) ไดเพื่อพิสูจนการทํางานของเทคโนโลยีจาวา (proof
of technology) และไดนําผลงานดังกลาวมาแสดงในงาน Sun World’95 ในเดือนพฤษภาคม
ป ค.ศ. 1995
จากนั้นภาษาจาวาเริ่มเปนที่นิยมแพรหลายขึ้นในชวงปลายป ค.ศ. 1995 เมื่อบริษัท
Netscape ไดพัฒนาโปรแกรมเว็บบราวเซอร Netscape 2.0 และไดรวมเอาการทํางานของ
โปรแกรมจาวาแอปเพล็ต (Java Applet) เขามาเปนคุณลักษณะเดนของโปรแกรม ซึ่งบริษัท
อื่นๆอาทิเชน IBM, Symantec, Inspire หรือ Microsoft ตางก็ประกาศสนับสนุนการใชงานของ
โปรแกรมภาษาจาวาในเวลาตอมา ในชวงเดียวกันทางบริษัทซันไมโครซิสเต็มสไดนําชุดพัฒนา
โปรแกรมภาษาจาวาเวอรชั่นแรก (Java Development Kit 1.0 หรือที่เรียกยอวา JDK 1.0)
ออกมาแจกจาย ตอมาในป ค.ศ. 1998 ทางบริษัทซันไมโครซิสเต็มสไดเผยแพรโปรแกรม
ภาษาจาวา JDK 1.2 (แตตอมาไดเปลี่ยนชื่อเปน Java 2) ซึ่งเปนเทคโนโลยีที่สมบูรณแบบกวา
ภาษาจาวาเวอรชั่นกอนหนานี้ และเปนเทคโนโลยีที่สามารถทํางานไดกับทุกแพลตฟอรมอยาง
แทจริง
1.6 เทคโนโลยีจาวา
เทคโนโลยีจาวาประกอบไปดวยองคประกอบหลักๆสามสวนดังแสดงในรูปที่ 1.4 คือ
Java Programming 9
1. Java Virtual Machine (JVM) เปนเทคโนโลยีจาวาที่ทําหนาที่เปนอินเตอรพรีต
เตอร ที่จะแปลโปรแกรมจาวาไบทโคด (Java Bytecode) ใหเปนภาษาที่เครื่อง
เขาใจได
2. Java Runtime Environment (JRE) เปนเทคโนโลยีจาวาที่ใชในการรันโปรแกรม
ภาษาจาวาอาทิเชน โปรแกรมจาวาประยุกต (Java Application) และโปรแกรม
จาวาแอปเพล็ต (Java Applet) JRE จะประกอบดวย JVM และ Java
Application Programming Interface (Java API) ที่จะรวบรวมคลาสและ
อินเตอรเฟสตางๆ ที่จําเปนตอการใชงานของโปรแกรมภาษาจาวา
3. Java 2 Software Developer Kit (J2SDK) เปนชุดพัฒนาโปรแกรมภาษาจาวาที่
จะประกอบไปดวย JVM ตัวแปลภาษาจาวา (Java Compiler) เครื่องมือ (tool)
อื่นๆในการพัฒนาโปรแกรม และ API ทั้งหมดในภาษาจาวา ซึ่ง API จะเปน
มาตรฐานคําสั่งตางๆของภาษาจาวา
10 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
นี้มีชื่อเรียกวา JVM (Java Virtual Machine หรือเครื่องจักรสมมุติจาวา) ซึ่งขั้นตอนการ
ทํางานของโปรแกรมภาษาจาวาสามารถแสดงไดดังรูปที่ 1.5
JVM จะทําหนาที่แปลโปรแกรมไบทโคดใหเปนภาษาเครื่องที่ขึ้นอยูกับแพลตฟอรม
โปรแกรมไบทโคดที่ประมวลผลโดยใช JVM จะทํางานไดเร็วกวาโปรแกรมภาษาคอมพิวเตอร
อื่นๆที่ใชอินเตอรพรีตเตอรปกติในการประมวลผล ทั้งนี้เนื่องจาก JVM จะมีชดุ คําสั่งที่ใกลเคียง
กับชุดคําสั่งภาษาเครื่องของหนวยประมวลผลกลางที่ใชงาน ดังนั้น JVM จึงสามารถแปล
คําสั่งของโปรแกรมไบทโคดไปเปนคําสั่งภาษาเครื่องของหนวยประมวลผลกลางที่ใชงานไดงาย
กวา นอกจากนี้โปรแกรมไบทโคดจะไมขึ้นอยูกับแพลตฟอรม ดังนั้นเราสามารถที่จะนํา
โปรแกรมไบทโคดที่คอมไพลจากระบบปฏิบัติการหนึ่ง มาประมวลผลบนระบบปฏิบัติการอี่นๆ
ได หากระบบปฏิบัติการนั้นมี JVM อยู
JVM เปนเครื่องจักรกลสมมุติที่ทําหนาที่เหมือนกับระบบคอมพิวเตอรจริง โดย
มาตรฐานของ JVM ที่กําหนดโดยบริษัทซันไมโครซิสเต็มสจะมีขอกําหนดตางๆเชนเดียวกับ
องคประกอบของระบบคอมพิวเตอรเชน ชุดคําสั่ง (instruction set) และชุดรีจีสเตอร (register
set) เปนตน และยังมีขอกําหนดอื่นๆเชน เนื้อที่ของหนวยความจํา (memory area) สแต็ก
(stack), heap, garbage collection และรูปแบบของคลาสไฟล (class file format) เปนตน
ทั้งนี้ขอกําหนดของ JVM เปนมาตรฐานที่เปดเผย ทําใหบริษัทตางๆ สามารถที่จะพัฒนา JVM
ขึ้นมาเองได โดยไมจํากัดอยูเพียง JVM ของบริษัทซันไมโครซิสเต็มสเทานั้น
Java Programming 11
JVM ที่พัฒนามาใชในปจจุบันสวนใหญจะเปนซอฟตแวร แตก็ไดมีการพัฒนา JVM
ในรูปแบบของฮารดแวรขึ้นมาบางแลวเชน Java Chip ในปจจุบัน JVM มีใชในระบบ
ปฏิบัติการคอมพิวเตอรตางๆ โปรแกรมเว็บบราวเซอร เครื่องใชไฟฟาตางๆ โทรศัพท
เครื่องมือสื่อสารตางๆ และสมารทการด (smart card) จึงทําใหอุปกรณตางๆเหลานี้สามารถ
ประมวลผลโปรแกรมที่พัฒนาโดยใชภาษาจาวาได
12 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
1.6.3 Java 2 Software Development Kit
Java 2 SDK คือชุดพัฒนาโปรแกรมภาษาจาวาของบริษัทซันไมโครซิสเต็มส ซึ่งแต
เดิมเรียกวา JDK ทั้งนี้บริษัทซันไมโครซิสเต็มสไดเปลี่ยนชื่อมาเปน Java 2 ตั้งแต JDK
เวอรชั่น 1.2 ชุดโปรแกรม Java 2 SDK ที่ใชในปจจุบันคือเวอรชั่น 5.0 (สามารถ download
ไดที่ http://java.sun.com) จะประกอบไปดวยโปรแกรมตางๆอาทิเชน โปรแกรมคอมไพเลอร
(javac.exe) โปรแกรมอินเตอรพรีตเตอร (java.exe) และโปรแกรมดีบักเกอร เปนตน
แตชุดโปรแกรม Java 2 SDK จะไมใชโปรแกรม IDE (Integrated Development
Environment) ที่สมบูรณ เนื่องจากชุดโปรแกรมนี้จะไมมีโปรแกรมอีดิเตอรสําหรับการเขียน
ซอรดโคด ดังนั้นผูใชจะตองใชโปรแกรมอื่นชวยในการเขียนซอรดโคด
นอกจากนี้โปรแกรมที่อยูใน Java 2 SDK จะเปนโปรแกรมที่ตองเรียกใชงานผานทาง
command line จึงไมสะดวกในการใชงาน แตก็มีขอดีตรงที่ทําใหผูที่เริ่มตนในการพัฒนา
โปรแกรมสามารถเขาใจขั้นตอนตางๆของการพัฒนาโปรแกรมโดยใชภาษาจาวาไดดีขึ้น โดย
ไมมุงเนนการใชเครื่องมือหรือคําสั่งตางๆ ที่มีอยูในชุดพัฒนาโปรแกรมภาษาจาวาโปรแกรม
อื่นๆ
นอกจากชุดพัฒนาโปรแกรม Java 2 SDK แลวในปจจุบันยังมีชุดพัฒนาโปรแกรม
ภาษาจาวาที่เปนโปรแกรมแบบ IDE ทั้งที่เปนฟรีแวร (freeware) หรือโปรแกรมเพื่อการคา
(commercial software) ออกมาหลายโปรแกรมอาทิเชน
• Netbeans ของบริษัท Sun Microsystems (http://www.netbeans.org)
• Eclipse ของบริษัท IBM (http://eclipse.org)
• JBuilder ของบริษัท Borland (http://www.borland.com/jbuilder)
• JDeveloper ของบริษัท Oracle (http://www.oracle.com)
• intelliJ IDEA ของบริษัท JetBrains (http://www.jetbrains.com/idea)
โปรแกรม IDE เหลานี้จะมีเครื่องมือเพื่อชวยในการสรางโปรแกรมภาษาจาวาใน
รูปแบบตางๆไดงายขึ้นอาทิเชน เครื่องมือชวยในการออกแบบโปรแกรมกราฟฟก
สําหรับชุดพัฒนาโปรแกรม Java 2 SDK นั้นจําเปนตองมีโปรแกรมอิดีเตอรเพื่อใชใน
การเขียนซอรดโคดของโปรแกรมภาษาจาวา ซึ่งสามารถที่จะใชโปรแกรม Text Editor ทั่วไป
ไดเชน โปรแกรม Notepad ในระบบปฏิบัติการ Windows แตหากตองการพัฒนาโปรแกรมให
เร็วขึ้น ผูใ ชควรเลือกใชโปรแกรมอิดีเตอรที่ออกแบบมาเพื่อเขียนซอรดโคดของโปรแกรม
ภาษาจาวาโดยเฉพาะ ซึ่งโปรแกรมเหลานี้จะทํางานคลายกับโปรแกรมแบบ IDE โดยผูใช
Java Programming 13
สามารถเรียกคําสั่งในการคอมไพล หรือการรันโปรแกรมที่พัฒนาขึ้นจากเมนูที่กําหนดไวได
ตัวอยางโปรแกรมอิดีเตอรแบบนี้คือ
• EditPlus ของบริษัท ES-Computing (http://www.editplus.com)
• JCreator ของบริษัท Xinox Software (http://www.jcreator.com)
1.6.4 จุดเดนของภาษาจาวา
บริษัทซันไมโครซิสเต็มสไดระบุถึงจุดเดนของภาษาจาวาไวดังนี้
• ความงาย (simple) ภาษาจาวาเปนภาษาที่งายตอการศึกษาและพัฒนาโปรแกรม
ทั้งนี้เพราะภาษาจาวาพัฒนาโดยตัดขอดอยของภาษา C++ ออกไปอาทิเชน เรื่อง
ของการใช pointer
• ภาษาเชิงออปเจ็ค (object oriented) ภาษาจาวาเปนภาษาคอมพิวเตอรเชิง
ออปเจ็คที่สมบูรณโดยมีคุณลักษณะเดนของโปรแกรมเชิงออปเจ็คคือ การสืบทอด
การหอหุม และการมีไดหลายรูปแบบ
• การกระจาย (distributed) ภาษาจาวามีชุดคําสั่งที่เปนแพคเก็จ (package) ในการ
จัดการกับโปรโตคอล TCP/IP ทําใหสามารถพัฒนาโปรแกรมเชิงออปเจ็คแบบ
กระจาย (distributed object) ผานระบบเครือขายอินเตอรเน็ตไดงาย
• การปองกันการผิดพลาด (robust) ภาษาจาวาเปนภาษาคอมพิวเตอรที่ออกแบบ
มาเพื่อใหโปรแกรมที่พัฒนาขึ้นมีความนาเชื่อถือ โดยมีการตรวจสอบการ
ผิดพลาดที่อาจเกิดขึ้นในขั้นตอนตางๆเชน ขั้นตอนการคอมไพล และการรัน
โปรแกรม เปนตน
• ความปลอดภัย (secure) ภาษาจาวาออกแบบมาเพื่อพัฒนาโปรแกรมบนระบบ
เครือขาย และมีการกระจายการทํางานบนระบบเครือขายอินเตอรเน็ต ดังนั้นจึง
ตองสรางระบบปองกันความปลอดภัยจากไวรัสคอมพิวเตอร และการแกไข
โปรแกรมจากภายนอก
• สถาปตยกรรมกลาง (architecture neutral) โปรแกรมภาษาจาวาจะคอมไพลได
โปรแกรมไบทโคด (byte code) ซึ่งสามารถทํางานบนสถาปตยกรรมคอมพิวเตอร
ที่มีหนวยประมวลผลกลางและระบบปฏิบัติการตางๆได
14 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
• เคลื่อนยายงาย (portable) ขอกําหนดของภาษาจาวาจะไมขึ้นอยูกับระบบ
คอมพิวเตอรใดโดยเฉพาะ ดังนั้นโปรแกรมภาษาจาวาจึงสามารถประมวลผลได
กับระบบคอมพิวเตอรทุกประเภท
• อินเตอรพรีต (interpreted) ภาษาจาวาจะใชอินเตอรพรีตเตอรในการแปล
โปรแกรมไบทโคดใหเปนภาษาเครื่อง ดังนั้นจึงทําใหขบวนการการพัฒนา
โปรแกรมเปนไปไดอยางรวดเร็ว เชนเดียวกับภาษาคอมพิวเตอรอื่นๆที่ใช
อินเตอรพรีตเตอร
• ประสิทธิภาพสูง (high performance) โดยปกติโปรแกรมอินเตอรพรีตเตอรที่ทํา
หนาที่แปลโปรแกรมไบทโคดจะทํางานชา แตเทคโนโลยีจาวาไดพัฒนาใหมีการ
แปลโปรแกรมไบทโคด ในขั้นตอนการรันโปรแกรมใหเปนภาษาเครื่องแบบทันที
ทันใด (Just In Time) ที่ทํางานไดรวดเร็วเทียบเทากับคอมไพเลอร เพื่อได
โปรแกรมจาวาที่มีประสิทธิภาพในการประมวลผลสูง
• มัลติเธรด (multithreaded) ภาษาจาวามีความสามารถที่จะประมวลผลหลายๆงาน
ไดพรอมกัน
• พลวัต (dynamic) ภาษาจาวาออกแบบมาเพื่อที่จะใหปรับเปลี่ยนเพิ่มเติมไลบารี่
(library) ตางๆไดงาย ซึ่งแตกตางจากภาษาซี หรือ C++
1.7 แพลตฟอรมของเทคโนโลยีจาวา
แพลตฟอรม (Platform) คือฮารดแวรและสภาวะแวดลอมทางซอฟตแวร (Software
Environment) ที่โปรแกรมจะใชในการประมวลผลโดยทั่วไป
แพลตฟอรมจะนิยามโดยพิจารณาจากองคประกอบของฮารดแวรและระบบปฏิบัติการ
ที่ใชเชน แพลตฟอรมของระบบปฏิบัติการ Windows XP บนเครื่องไมโครคอมพิวเตอร
Pentium IV แตนิยามของแพลตฟอรมสําหรับเทคโนโลยีจาวาจะแตกตางจากนิยามที่ใชกัน
ทั่วไป ทั้งนี้จะพิจารณาจากองคประกอบของซอฟตแวรเทานั้นดังแสดงในรูปที่ 1.7 ซึ่ง
แพลตฟอรมของเทคโนโลยีจาวาจะประกอบดวย
• Java Virtual Machine (JVM)
• Java Application Programming Interface (Java API)
Java Programming 15
รูปที่ 1.7 แพลตฟอรมของเทคโนโลยีจาวา
16 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
โปรแกรมจาวาที่ใชบนเครื่องไมโครคอมพิวเตอรโดยทั่วไป จะใชแพลตฟอรมที่เปน
J2SE สวนแพลตฟอรม J2EE มุงเนนการพัฒนาโปรแกรมภาษาจาวาที่ใชงานบนเครื่อง
แมขาย (Server) สําหรับระบบงานในองคกร (Enterprise) และแพลตฟอรม J2ME ใชในการ
พัฒนาโปรแกรมจาวาบนอุปกรณขนาดเล็ก เชน โทรศัพทเคลื่อนที่ หรือ PDA เปนตน
Java Programming 17
1.7.2 Java 2 Platform, Enterprise Edition
แพลตฟอรมจาวารุนนี้ มีจุดประสงคเพื่อใชพัฒนาโปรแกรมภาษาจาวาสําหรับเครื่อง
แมขาย (Server) โดยมุงเนนการพัฒนาโปรแกรมที่เปน N-tier สําหรับงานในองคกร โดยใช
โปรแกรม Application Server หรือโปรแกรมสําหรับแมขายเว็บ (Web Server) ที่เรียกวา
โปรแกรมจาวาแบบ Servlet โปรแกรม Application Server เปนโปรแกรมที่ชวยในการพัฒนา
โปรแกรมภาษาจาวาที่สามารถเปลี่ยนแปลง แกไข และนํากลับมาใชใหมไดงาย โดยพัฒนา
เปนสวนประกอบออปเจ็ค (object component) ที่เรียกวา Enterprise Java Bean (EJB)
Application Server ที่ใชกับภาษาจาวาในปจจุบันมีทั้งโปรแกรมที่เปน open source อาทิเชน
JBoss หรือ Enhydra และโปรแกรมเพื่อการคา เชน WebLogic หรือ WebSphere
แพลตฟอรม J2EE เวอรชั่น 1.4 ซึ่งประกอบไปดวย API ดังแสดงในรูปที่ 1.10
โดยมีสวนตางๆที่สําคัญดังนี้
• JNDI API
JNDI ยอมาจาก Java Naming and Directory Interface เปน API เพื่อใชใน
การจัดการ directory service เชน LDAP server และระบบไฟล
• JavaMail API
เปน API ที่ใชในการพัฒนาโปรแกรมสําหรับสงขาวสารและอีเมลบนระบบ
อินเตอรเน็ต โดยใชโปรโตคอลตางๆ อาทิเชน SMTP และ POP3
• CORBA API
เปน API เพื่อสนับสนุนการใชงาน JavaIDL และ RMI-IIOP ซึ่งเปน
ซอฟตแวรสําหรับระบบออปเจ็คแบบกระจาย (Object Distributed System) ตาม
มาตรฐาน CORBA
• Java Transaction API
เปน API เพื่อใชในการจัดการ Transaction
• XML API
เปน API ที่สนับสนุนการจัดการขอมูลในรูปแบบของ XML
• JMS API
JMS ยอมาจาก Java Message Service เปน API เพื่อใชในการสงหรือรับ
ขาวสารแบบ asynchronous
18 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
รูปที่ 1.10 Java API ในแพลตฟอรม J2EE
Java Programming 19
รูปที่ 1.11 Java API ในแพลตฟอรม J2ME
1.8 โปรแกรมภาษาจาวา
โปรแกรมจาวาที่อยูบนแพลตฟอรม J2SE สามารถพัฒนาไดสองรูปแบบคือ
1. โปรแกรมจาวาประยุกต (Java Application) คือโปรแกรมประยุกตใชงานทั่วไป
โดยโปรแกรมแบบนี้จะทํางานภายใตโปรแกรมอินเตอรพรีตเตอรโดยตรง ซึ่ง
โปรแกรมลักษณะนี้เปน stand-alone
2. โปรแกรมจาวาแอปเพล็ต (Java Applet) คือโปรแกรมภาษาจาวาที่จะทํางาน
ภายใตโปรแกรมเว็บบราวเซอรที่มี JVM อยู
1.8.1 การสรางโปรแกรมจาวาประยุกต
การสรางโปรแกรมจาวาประยุกตจะมีขั้นตอนดังแสดงในรูปที่ 1.12 ซึ่งสามารถอธิบาย
พอสังเขปไดดังนี้
1. ขั้นตอนแรกจะเปนการเขียนซอรดโคดโดยใชโปรแกรมอิดีเตอรใดๆ โปรแกรมที่
1.1 เปนตัวอยางโปรแกรมเพื่อพิมพขอความ Hello World ออกทางจอภาพ
โปรแกรมนี้ใชชอื่ คลาสวา HelloWorld ซึ่งผูเขียนโปรแกรมจะตองเขียน
20 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
ซอรดโคดแลวเก็บลงในไฟลที่มีชื่อเดียวกับชื่อคลาส โดยมี extension เปน
.java กลาวคือโปรแกรมนี้จะเก็บไวในชื่อ HelloWorld.java โปรแกรมนี้
จะมี เมธอด main()เปนจุดเริ่มตน
2. ขั้นตอนที่สองจะเปนการคอมไพลโปรแกรม เพื่อแปลโปรแกรมซอรดโคดใหอยูใน
รูปของโปรแกรมไบทโคด ชุดพัฒนาโปรแกรม Java 2 SDK จะมีโปรแกรมชื่อ
javac.exe ที่ทําหนาที่เปนคอมไพลเลอร ซึ่งในตัวอยางนี้สามารถทําการ
คอมไพลโปรแกรมโดยใชคําสั่งตอไปนี้
javac HelloWorld.java
ผลลัพธที่ไดจากการคอมไพลโปรแกรมนี้คือ โปรแกรมไบทโคดที่ชื่อ
HelloWorld.class ในกรณีที่โปรแกรมซอรดโคดมีขอผิดพลาด
คอมไพเลอรจะระบุขอผิดพลาดที่เกิดขึ้น เพื่อใหผูเขียนโปรแกรมทําการแกไข
โปรแกรมซอรดโคดกอนที่จะทําการคอมไพลโปรแกรมใหม
3. ขั้นตอนการประมวลผลหรือรันโปรแกรม เปนการเรียกใชอินเตอรพรีตเตอรเพื่อ
แปลโปรแกรมไบทโคด ชุดพัฒนาโปรแกรม Java 2 SDK จะมีโปรแกรมชื่อ
java.exe ที่ทําหนาที่เปนโปรแกรมอินเตอรพรีตเตอร ซึ่งในตัวอยางนี้จะสามารถ
รันโปรแกรมไบทโคดไดโดยใชคําสั่งตอไปนี้
java HelloWorld
โดยโปรแกรมจะใหผลลัพธดังแสดงในรูปที่ 1.13
Java Programming 21
รูปที่ 1.12 ขั้นตอนการสรางโปรแกรมจาวาประยุกต
1.8.2 การสรางโปรแกรมจาวาแอปเพล็ต
การสรางโปรแกรมจาวาแอปเพล็ต จะมีขนั้ ตอนคลายกับการสรางโปรแกรมจาวา
ประยุกต แตโปรแกรมจาวาแอปเพล็ตจะประกอบดวยไฟลที่เขียนขึ้นสองไฟลคือ
• โปรแกรมซอรดโคด (.java)
• โปรแกรมเว็บเพจ (.html)
โปรแกรมที่ 1.2 เปนตัวอยางของโปรแกรมจาวาแอปเพล็ตเพื่อแสดงขอความ Hello
World โปรแกรมนี้จะแตกตางจากโปรแกรมจาวาประยุกตตรงที่ไมมีเมธอด main() และจะ
ไมสามารถทํางานตามลําพังได แตจะตองเรียกใชโดยผานโปรแกรมภาษา HTML ตัวอยางเชน
โปรแกรมที่ 1.3 เปนโปรแกรมภาษา HTML ที่เรียกใชโปรแกรม
HelloWorldApplet.class เพื่อประมวลผลภายใตโปรแกรมเว็บบราวเซอรที่มี JVM
อยู ขั้นตอนการสรางโปรแกรมนี้มีดังนี้
22 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
โปรแกรมที่ 1.2 โปรแกรมจาวาแอปเพล็ตเพื่อพิมพขอความ Hello World
import java.awt.*;
import java.applet.*;
Java Programming 23
1. เขียนโปรแกรมซอรดโคด (HelloWorldApplet.java) และโปรแกรม
เว็บเพจ (HelloWord.html) โดยใชโปรแกรมอิดีเตอรใดๆ
2. คอมไพลโปรแกรม HelloWorldApplet.java โดยใชคอมไพเลอรดังนี้
javac HelloWorldApplet.java
ตัวอยางนี้จะไดโปรแกรมไบทโคดที่ชื่อ HelloWorldApplet.class
3. ใชโปรแกรมเว็บบราวเซอรใดๆเชน Internet Explorer หรือ Netscape เปด
โปรแกรมเว็บเพจที่ชื่อ HelloWorld.html ซึ่งจะเรียกโปรแกรมไบทโคดที่
ชื่อ HelloWorldApplet.class โดยอัตโนมัติและจะมีผลรันดังรูปที่ 1.15
24 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
ทํางานคลายกันไวในที่เดียวกัน Java API มีแพคเก็จที่สําคัญอยูหลายแพคเก็จอาทิเชน
java.lang, java.util, java.awt และ java.io เปนตน
Java Programming 25
รูปที่ 1.16 คูมือ Java API
สรุปเนื้อหาของบท
• ระบบคอมพิวเตอรประกอบไปดวยสวนหลักสามสวนคือ ฮารดแวร ระบบปฏิบัติ
การ และโปรแกรมประยุกต
• ภาษาคอมพิวเตอรแบงออกเปนสามประเภทคือ ภาษาเครื่อง ภาษาแอสเซมบลี
และภาษาระดับสูง
• ภาษาระดับสูงแบงออกเปนสองประเภทคือ ภาษาเชิงกระบวนการ และภาษาเชิง
ออปเจ็ค
• ตัวแปลภาษาแบงออกเปนสองแบบคือ คอมไพเลอร และอินเตอรพรีตเตอร
26 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
• ภาษาจาวาเปนภาษาเชิงออปเจ็คที่ใชทั้งตัวแปลภาษาแบบคอมไพเลอรและ
อินเตอรพรีตเตอรในการคอมไพลและรันโปรแกรม
• คอมไพเลอรของภาษาจาวาจะทําหนาที่แปลโปรแกรมภาษาจาวาใหเปนโปรแกรม
ไบทโคด และจะใชจาวาอินเตอรพรีตเตอร (JVM) ในการแปลโปรแกรมไบทโคด
ใหเปนภาษาเครื่อง
• โปรแกรมภาษาจาวาสามารถทํางานขามแพลตฟอรมได ถาระบบคอมพิวเตอรนั้น
มี JVM อยู
• แพลตฟอรมของ Java ประกอบไปดวย JVM และ Java API ซึ่ง Java 2 มี
แพลตฟอรม 3 แบบคือ J2SE, J2EE และ J2ME
• ชุดพัฒนาโปรแกรมภาษาจาวา Java 2 SDK ประกอบไปดวยโปรแกรมตางๆที่
สําคัญคือ โปรแกรมคอมไพเลอร (javac.exe) และโปรแกรมอินเตอรพรีตเตอร
(java.exe)
• โปรแกรมจาวาที่อยูบนแพลตฟอรม J2SE สามารถพัฒนาไดสองรูปแบบคือ
โปรแกรมจาวาประยุกตซึ่งจะทํางานภายใต JVM โดยตรง และโปรแกรมจาวา
แอปเพล็ตซึ่งจะทํางานภายใตเว็บบราวเซอรที่มี JVM
• คูมือ Java API จะชวยในการคนหารายละเอียดของแพคเก็จและคลาสตางๆที่มี
อยูในชุดพัฒนาโปรแกรม Java 2 SDK
Java Programming 27
28 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
บทที่ 2
พื้นฐานโปรแกรมภาษาจาวา
เนื้อหาในบทนี้เปนการแนะนําไวยากรณของภาษาจาวา ซึ่งประกอบไปดวย
สัญลักษณหรือคําตางๆที่ใชในภาษาจาวา ชนิดขอมูลแบบพื้นฐาน และขอมูลคาคงที่ การ
ประกาศและเรียกใชคําสั่งกําหนดคาตัวแปร นิพจนและตัวดําเนินการประเภทตางๆ วิธีการ
แปลงชนิดขอมูล ชนิดขอมูลแบบอางอิง และแนะนําคําสั่งที่ใชในการรับขอมูลเขาและแสดงผล
ซึ่งเนื้อหาในบทนี้จะเปนการแนะนําการเขียนโปรแกรมเบื้องตนเพื่อกําหนดคาขอมูลตางๆ และ
แสดงผลลัพธของการประมวลผล
2.1 ไวยากรณระดับของคํา
คําหรือขอความที่สามารถเขียนในโปรแกรมภาษาจาวา จะตองเปนคําหรือขอความใน
รูปแบบใดรูปแบบหนึ่งของประเภทตางๆเหลานี้
• คอมเม็นต (comment)
• identifier
• คียเวิรด (keyword)
• สัญลักษณแยกคํา (separator)
• ชองวาง (whitespace)
• ขอมูลคาคงที่ (literals)
2.1.1 คอมเม็นต
คอมเม็นตคือขอความที่แทรกอยูภายในโปรแกรมซึ่งคอมไพเลอรจะไมแปลขอความนี้
ใหเปนสวนหนึ่งของโปรแกรม กลาวคือขอความนี้จะไมมีผลตอการทํางานของโปรแกรม
คอมเม็นตเขียนไวเพื่ออธิบายโปรแกรม เพื่อใหผูอานเขาใจโปรแกรมงายยิ่งขึ้น และชวยทําให
การแกไขและปรับปรุงโปรแกรมเปนไปไดงายขึ้น
Java Programming 29
ภาษาจาวากําหนดรูปแบบของการเขียนคอมเม็นตไวสามรูปแบบดังนี้
1. คอมเม็นตสําหรับขอความบรรทัดเดียว จะใชเครื่องหมาย // นําหนาขอความที่
ตองการเขียน ซึ่งจะอยูสวนไหนของบรรทัดก็ได
2. คอมเม็นตสําหรับขอความตั้งแตหนึ่งบรรทัดขึ้นไป จะเริ่มตนดวยเครื่องหมาย /*
และสิ้นสุดดวยเครื่องหมาย */
3. คอมเม็นตสําหรับขอความที่ตองการสรางเปนไฟลเอกสาร ที่เปนไฟลประเภท
HTML จะเริ่มตนดวยเครื่องหมาย /** และสิ้นสุดดวยเครื่องหมาย */ คอมเม็นต
รูปแบบนี้สามารถสรางเปนไฟลเอกสารไดโดยใชโปรแกรม javadoc.exe
2.1.2 Identifier
identifier คือชื่อที่ตั้งขึ้นในภาษาจาวา ซึ่งอาจเปนชื่อของคลาส ชื่อของตัวแปร ชื่อของ
เมธอด หรือชื่อของคาคงที่ ซึ่งจะตองเปนไปตามกฎการตั้งชื่อ ดังนี้
• identifier จะตองขึ้นตนดวยอักขระ A-Z, a-z, _ หรือ $ เทานั้น
• identifier ที่ประกอบไปดวยตัวอักขระมากกวาหนึ่งตัว ตัวอักขระหลังจากตัวแรก
นั้นจะตองเปนตัวอักขระขางตน หรือเปนตัวเลข 0 ถึง 9 เทานั้น
• identifier จะตองไมตรงกับคียเวิรด
identifier ในภาษาจาวาจะถือวาตัวอักษรพิมพใหญและตัวอักษรพิมพเล็กตางกัน
(case sensitive) ดังนั้น identifier ที่ชื่อ myVariable จะแตกตางจาก MyVariable
ตัวอยางของ identifier ที่ถูกตอง
30 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
• MyVariable
• _MyVariable
• $x
• This_is_also_a_variable
ตัวอยางของ identifier ที่ไมถูกตอง
• My Variable
• 9pns
• a+c
• Hello’World
• public
Java Programming 31
– ตัวอยางเชน getName, setName หรือ showDetails เปนตน
• การตั้งชื่อคาคงที่
– จะใชตัวอักษรพิมพใหญทั้งหมด และจะแยกคําโดยใชเครื่องหมาย_
(underscore)
– ควรเปนคํานาม
– ตัวอยางเชน MINIMUM, MIN_GPA เปนตน
2.1.3 คียเวิรด
คียเวิรดคือชื่อที่มีความหมายพิเศษในภาษาจาวา คอมไพเลอรของภาษาจาวาจะ
เขาใจความหมายและคําสั่งที่จะตองดําเนินการสําหรับคียเวิรดแตละตัว ภาษาจาวาไดกําหนด
คียเวิรดตางๆ ไวดังแสดงในตารางที่ 2.1
32 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
จาวาแตจะเปนขอมูลคาคงที่ชนิดตรรกะ เชนเดียวกับคําวา null ซึ่งเปนขอมูลคาคงที่ของ
ตัวแปรที่มีชนิดขอมูลแบบอางอิงที่จะกลาวถึงตอไป
2.1.4 สัญลักษณแยกคํา
ภาษาจาวามีสัญลักษณแยกคําตางๆ ที่สามารถนําไปใชเขียนในโปรแกรมไดดังตาราง
ที่ 2.2
ตารางที่ 2.2 หนาที่ของเครื่องหมายตางๆที่ใชในภาษาจาวา
สัญลักษณแยกคํา หนาที่
; เพื่อระบุการสิ้นสุดของคําสั่งตางๆ ภายในภาษาจาวา
สําหรับตอทายเมธอดหรือคําสั่งอื่นๆในภาษาจาวา เชน if,for
()
เปนตน
, สําหรับแยกตัวแปรหรือคําสั่งในภาษาจาวา
เพื่อใชในการระบุคุณลักษณะหรือเมธอดของออปเจ็ค หรือใชใน
.
การระบุแพคเก็จของภาษาจาวา
เพื่อระบุบล็อกคําสั่งของภาษาจาวา คําสั่งตางๆของภาษาจาวา
จะอยูภายในบล็อกอาทิเชน คําสั่งที่อยูภายในคลาส ภายใน
{} เมธอด หรืออยูภายในชุดคําสั่งโครงสรางควบคุมตางๆ เชน
if,while หรือ for เปนตน โดยปกติบล็อกเหลานี้สามารถ
ซอนกันได
2.1.5 ชองวาง
โปรแกรมภาษาจาวาสามารถที่จะมีชองวางเพื่อแยกคํา ประโยค หรือคําสั่งตางๆ
ภายในโปรแกรมได โดยชองวางจะมีขนาดเทาไรก็ได ทั้งนี้คอมไพเลอรของภาษาจาวาจะไม
นําสวนที่เปนชองวางมาเกี่ยวของกับขนาดของโปรแกรมไบทโคด ชองวางจะชวยทําใหรูปแบบ
ของโปรแกรมซอรดโคดดูงายขึ้น ซึ่งรูปแบบของชองวางประกอบดวย
• ชองวาง (กดคีย Space บนคียบอรด)
Java Programming 33
• แท็ป (กดคีย Tab บนคียบอรด)
• การขึ้นบรรทัดใหม (กดคีย Enter บนคียบอรด)
2.1.6 ขอมูลคาคงที่
ขอมูลคาคงที่คือคําที่ใชแสดงขอมูลที่เปนตัวเลข ตัวอักขระ ขอความ หรือคาทาง
ตรรกะ ซึ่งในภาษาจาวาไดกําหนดขอมูลคาคงที่ไว 5 ประเภทดังนี้
1. ตรรกะ (boolean)
2. ตัวอักขระ (character)
3. ตัวเลขจํานวนเต็ม (integral)
4. ตัวเลขทศนิยม (floating point)
5. ขอความ (string)
ซึ่งรูปแบบของการเขียนขอมูลคาคงที่และประเภทของชนิดขอมูล จะกลาวถึงในหัวขอ
ตอไป
2.2 ชนิดขอมูลแบบพื้นฐาน
ภาษาจาวาเปนภาษาที่ตองระบุชนิดขอมูลอยางชัดเจน (strongly typed language)
กลาวคือขอมูลที่เปนตัวแปรหรือคาคงที่ทุกตัวที่ปรากฏอยูในโปรแกรม จะตองมีการประกาศ
และจะตองระบุชนิดขอมูลดวยเสมอ โดยชนิดขอมูลในภาษาจาวาแบงเปนสองประเภทใหญๆ
คือ
1. ชนิดขอมูลแบบพื้นฐาน (primitive data type)
2. ชนิดขอมูลแบบอางอิง (reference data type)
ชนิดขอมูลแบบพื้นฐานคือชนิดขอมูลที่กําหนดไวในภาษาจาวา ซึ่งภาษาจาวา
กําหนดไว 8 ชนิดคือ boolean, char, byte, short, int, long, float
และ double ดังแสดงในตารางที่ 2.3 ซึ่งทั้ง 8 ชนิดสามารถแบงออกไดเปน 4 ประเภทคือ
1. ชนิดขอมูลตรรกะ (logical) คือชนิด boolean
2. ชนิดขอมูลอักขระ (textual) คือชนิด char
3. ชนิดขอมูลตัวเลขจํานวนเต็ม (integral) คือชนิด byte,short,int และ
long
34 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
4. ชนิดขอมูลตัวเลขทศนิยม (floating point) คือชนิด float และ double
ชนิดขอมูลแบบอางอิงคือชนิดขอมูลอื่นๆที่ไมใชชนิดขอมูลแบบพื้นฐาน ชนิดขอมูลทั้ง
สองประเภทจะมีความแตกตางกันในเรื่องของการเก็บขอมูลในหนวยความจํา และวิธีการ
เรียกใชงาน ซึ่งจะกลาวถึงตอไป
2.2.1 ชนิดขอมูลตรรกะ
ในภาษาจาวาชนิดขอมูล boolean คือชนิดขอมูลตรรกะ โดยขอมูลชนิดตรรกะเปน
ขอมูลที่ประกอบดวยคาสองคาคือจริงและเท็จ ซึ่งตรงกับ true และ false คาคงที่หรือตัว
แปรที่มีชนิดขอมูลเปน boolean จะมีคาเปนใดคาหนึ่งภายในสองคานี้เทานั้น คําวา true
และ false แมจะไมใชคียเวิรดในภาษาจาวา แตเนื่องจากเปนคําที่สงวนไว (reserved word)
จึงไมอนุญาตใหตั้งชื่อ identifier ตรงกับคําทั้งสอง ภาษาจาวาเปนภาษาที่ตองระบุชนิดขอมูล
อยางชัดเจน ดังนั้นจึงสามารถใชชนิดขอมูล boolean ในกรณีที่ตองการคาขอมูลชนิดตรรกะ
Java Programming 35
เทานั้นโดยไมอนุญาตใหใชชนิดขอมูลอื่นๆ ซึ่งกรณีนี้จะแตกตางจากภาษาซีหรือ C++ ที่
อนุญาตใหแปลงขอมูลชนิดตัวเลขจํานวนเต็มใหเปนขอมูลคาคงที่ชนิดตรรกะได
ตัวอยางเชน คําสั่ง
boolean flag = true;
เปนการประกาศตัวแปร flag ใหมีชนิดขอมูลเปน boolean โดยกําหนดใหมีคา
เปน true
2.2.2 ชนิดขอมูลตัวอักขระ
ในภาษาจาวาชนิดขอมูล char คือชนิดขอมูลตัวอักขระ โดยขอมูลชนิดตัวอักขระใช
เพื่อแสดงตัวอักขระหนึ่งตัว ซึ่งในภาษาจาวาจะถูกเก็บอยูในรูปของมาตรฐาน Unicode ซึ่งจะมี
ขนาด 16 บิต ขอมูลคาคงที่ซึ่งเปนตัวอักขระแบบ Unicode จะอยูในเครื่องหมาย ‘ ‘ โดยจะ
ขึ้นตนดวยสัญลักษณ \u และตามดวยเลขฐานสิบหก (Hexadecimal number) โดยจะมีคา
ตั้งแต ‘\u0000’ ถึง ‘\uFFFF’ เพื่อเก็บตัวอักขระของภาษาตางๆไดทั้งหมด 65,536 ตัว
ตัวอยางเชน ตัวอักขระแบบ Unicode สําหรับภาษาไทยจะมีคาตั้งแตชวง ‘\u0E00’ ถึง
‘\U0E7F’ เปนตน
ตัวอยางเชน คําสั่ง
char letter = ‘\u0041’;
จะเปนการประกาศตัวแปร letter ใหมีชนิดขอมูลเปน char โดยมีคาเปน
\u0041 ซึ่งมีคา เทากับตัวอักษร A
สําหรับรหัส ASCII ที่ใชในระบบคอมพิวเตอรทั่วไป ตัวอักขระแบบ Unicode จะ
กําหนดคาในชวง ‘\u0000’ ถึง ‘\u00FF’ ใหสอดคลองกับรหัส ASCII 128 ตัวแรก นอกจากนี้
เราสามารถที่จะกําหนดขอมูลคาคงที่ชนิดตัวอักขระโดยกําหนดตัวอักขระภายในเครื่องหมาย
‘ ’ อาทิเชน ‘x’,‘1’ และ ‘$’
ตัวอยางเชน คําสั่ง
char letter = ‘A’;
จะเปนการประกาศตัวแปร letter ใหมชี นิดขอมูลเปน char โดยมีคาเปน
ตัวอักษร A เชนเดียวกับคําสั่งกอนหนานี้
ภาษาจาวาสามารถที่จะเขียนขอมูลคาคงที่ที่เปนอักขระพิเศษตางๆได โดยใช
สัญลักษณ \ นําหนาตัวอักษรภาษาอังกฤษตางๆอาทิเชน ‘\n’ คืออักขระสําหรับการขึ้นบรรทัด
ใหม เปนตน ตัวอักขระพิเศษที่นิยมใชทั่วไปจะเปนไปตามตารางที่ 2.4
36 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
ตารางที่ 2.4 ตัวอักขระพิเศษที่นิยมใชทั่วไป
อักขระ Unicode ความหมาย
‘\b’ ‘\u000B’ Backspace
‘\t’ ‘\u0009’ Tab
‘\n’ ‘\u000A’ New line
‘\r’ ‘\u000D’ Return
‘\\’ ‘\u005C’ Backslash
‘\’’ ‘\u0027’ Single quote
‘\’’’ ‘\u0022’ Double quote
2.2.3 ชนิดขอมูลตัวเลขจํานวนเต็ม
ในภาษาจาวาชนิดขอมูล byte, short, int และ long คือชนิดขอมูลตัวเลข
จํานวนเต็ม โดยขอมูลชนิดนี้คือขอมูลที่เปนจํานวนเต็มใดๆในทางคณิตศาสตร โดยที่แตละ
ชนิดจะมีขนาดในการเก็บขอมูลไมเทากันทําใหมีชวงของขอมูลตางกัน ดังที่กลาวมาแลวใน
ตารางที่ 2.3 ซึ่งโดยทั่วไปภาษาจาวาจะกําหนดใหเลขจํานวนเต็มมีชนิดขอมูลเปน int
การเขียนขอมูลคาคงที่ที่เปนขอมูลชนิดตัวเลขจํานวนเต็มใดๆ จะไมมีการใช
เครื่องหมาย , (comma) เชน 10,000 จะตองเขียนเปน 10000 โดยภาษาจาวาจะสามารถเขียน
คาคงที่ขอมูลไดสามแบบดังนี้
1. เลขฐานสิบคือการเขียนเลขจํานวนเต็มทั่วไป อาทิเชน -121 และ 75362 เปนตน
2. เลขฐานแปดคือการเขียนเลขจํานวนเต็มที่ขึ้นตนดวยเลข 0 แลวตามดวยตัวเลข
ตั้งแต 0 ถึง 7 อาทิเชน 016 (มีคาเทากับ 14 ในเลขฐานสิบ)
3. เลขฐานสิบหกคือการเขียนเลขจํานวนเต็มที่ขึ้นตนดวย 0x หรือ 0X แลวตาม
ดวยตัวเลขตั้งแต 0 ถึง 9 หรือตัวอักษร A ถึง F อาทิเชน 0xA2 (มีคา
เทากับ 162 ในเลขฐานสิบ)
การประกาศตัวแปรใดๆใหมีชนิดขอมูลเปนตัวเลขจํานวนเต็มชนิดใดชนิดหนึ่ง จะมี
ผลใหภาษาจาวากําหนดขนาดของเนื้อที่สําหรับหนวยความจํา และชวงในการเก็บขอมูลให
สอดคลองกับชนิดขอมูลนั้นโดยอัตโนมัติอาทิเชน คําสั่ง
int x = 4;
Java Programming 37
byte b = 4;
เปนการประกาศตัวแปร x ใหมีชนิดขอมูลเปน int มีขนาดของเนื้อที่ใน
หนวยความจํา 32 บิต และตัวแปร b ใหมีชนิดขอมูลเปน byte มีขนาดของเนื้อที่ใน
หนวยความจํา 8 บิต ถึงแมวาตัวแปรทั้งสองจะเก็บคาเริ่มตนเปน 4 เหมือนกัน แตตัวแปร x
จะสามารถเก็บขอมูลตัวเลขจํานวนเต็มในชวงที่กวางกวา (-231 ถึง 231-1)
ขอมูลคาคงที่ของตัวเลขจํานวนเต็มโดยทั่วไปจะถูกกําหนดใหมีชนิดขอมูลเปน int
แตภาษาจาวาสามารถกําหนดขอมูลคาคงที่ของตัวเลขจํานวนเต็มใหมีชนิดขอมูลเปนlong ได
โดยใสตัวอักษร l หรือ L ตอทาย อาทิเชน
• 2l หมายถึงเลขฐานสิบที่มีคาเทากับ 2 และมีชนิดขอมูลเปน long
• 077L หมายถึงเลขฐานแปดที่มีคาเทากับ 63 และมีชนิดขอมูลเปน long
• 0xBAACL หมายถึงเลขฐานสิบหกที่มีชนิดขอมูลเปน long
2.2.4 ชนิดขอมูลตัวเลขทศนิยม
ขอมูลชนิดตัวเลขทศนิยมคือเลขจํานวนจริง (real number) ซึ่งในระบบคอมพิวเตอร
จะเก็บขอมูลประเภทนี้ โดยแบงจํานวนบิตที่เก็บขอมูลเปนสองสวนคือสวนที่เปนความละเอียด
ของตัวเลข (mantissa) และสวนที่เปนจํานวนเลขยกกําลัง (exponent) โดยสวนที่เปนความ
ละเอียดของตัวเลขจะเก็บคาในชวงตั้งแต -1.0 ถึง 1.0 และสวนที่เปนเลขยกกําลังจะเก็บคาที่
เปนเลขยกกําลังสอง ภาษาจาวาเก็บเลขจํานวนจริงตามมาตรฐาน IEEE 754 ซึ่งจะแบงเลข
จํานวนจริงออกเปน single precision และ double precision โดยที่ตัวเลขแบบ single
precision จะใชเนื้อที่หนวยความจําจํานวน 32 บิต แบงเปนสวนที่เปนความละเอียดของ
ตัวเลขจํานวน 24 บิต และสวนที่เปนจํานวนเลขยกกําลังจํานวน 8 บิต ดังแสดงในรูปที่ 2.1
สวนตัวเลขแบบ double precision จะใชเนื้อที่หนวยความจําจํานวน 64 บิต แบงเปนสวนที่
เปนความละเอียดของตัวเลขจํานวน 53 บิต และสวนที่เปนจํานวนเลขยกกําลังจํานวน 11 บิต
38 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
ภาษาจาวากําหนดชนิดขอมูลตัวเลขทศนิยมไวสองชนิดคือ float และ double
โดยที่ชนิดขอมูล float จะเก็บขอมูลขนาด 32 บิตตามมาตรฐานแบบ single precision
สวนขอมูลชนิด double จะเก็บขอมูลขนาด 64 บิตตามมาตรฐานแบบ double precision
ภาษาจาวากําหนดขอมูลชนิดตัวเลขทศนิยมใหเปนเลขที่มีเครื่องหมายจุดทศนิยม อาทิเชน
3.14 หรือ 3.0 นอกจากนี้ยังสามารถเขียนอยูในรูปแบบของเลขยกกําลังสิบ (exponential
form) ไดโดยใชตัวอักษร E หรือ e ระบุจํานวนที่เปนเลขยกกําลังสิบอาทิเชน 6.02E23 หรือ
2e-7
ขอมูลคาคงที่ชนิดตัวเลขทศนิยม โดยทั่วไปจะถูกกําหนดใหมีชนิดขอมูลเปน
double แตภาษาจาวาสามารถกําหนดขอมูลคาคงที่ใหมีชนิดขอมูลเปน float ได โดยใส
ตัวอักษร f หรือ F ตอทาย อาทิเชน 2.718F หรือ 3.14f เปนตน
นอกจากนี้ภาษาจาวาจะกําหนดขอมูลคาคงที่ชนิดตัวเลขทศนิยมที่มีอักษร D หรือ d
ตอทายวาเปนขอมูลคาคงที่ที่มีชนิดขอมูลเปน double อาทิเชน 3.14D แตเนื่องจาก
โดยทั่วไปขอมูลคาคงที่ชนิดตัวเลขทศนิยมจะถูกกําหนดใหเปนชนิด double อยูแลว จึงไมมี
ความจําเปนตองใสตัวอักษร D หรือ d ตอทาย
ตัวอยางขอมูลคาคงที่ของตัวเลขทศนิยมที่ถูกตอง
12. 12E2 12.0e2 12.0e2F -3.14F
ตัวอยางขอมูลคาคงที่ของตัวเลขทศนิยมที่ไมถูกตอง
1,234.0 1.2E108F
2.3 ตัวแปรและคาคงที่
ขอมูลที่เก็บอยูในโปรแกรมเชนขอมูลที่เปนคุณลักษณะของออปเจ็ค คุณลักษณะของ
คลาส และขอมูลในเมธอด จะแบงเปนสองประเภทคือตัวแปรและคาคงที่ ซึ่งตัวแปรคือขอมูลที่
สามารถเปลี่ยนแปลงคาไดในโปรแกรมโดยใชคําสั่งกําหนดคา สวนคาคงที่คือขอมูลที่
กําหนดคาไดเพียงครั้งเดียวและไมสามารถเปลี่ยนแปลงคาไดในโปรแกรม ทั้งตัวแปรและ
คาคงที่จะตองมีการประกาศชื่อและชนิดของขอมูล เพื่อที่จะเตรียมเนื้อที่ในหนวยความจํา
สําหรับเก็บขอมูล
คําสั่งในการประกาศตัวแปรของภาษาจาวามีรูปแบบดังนี้
Java Programming 39
โดยที่
• modifier คือคียเวิรดระบุคุณสมบัติตางๆของตัวแปรเชน access modifier
สวนกรณีที่ไมระบุจะถือวาเปน default
• dataType คือชนิดขอมูล
• variableName คือชื่อของตัวแปรที่เปนไปตามกฎการตั้งชื่อ
ตัวอยางเชน คําสั่ง
int amount;
เปนการประกาศตัวแปร amount ใหมีชนิดขอมูลเปน int
double x;
เปนการประกาศตัวแปร x ใหมีชนิดขอมูลเปน double
นอกจากนี้ภาษาจาวายังอนุญาต ใหสามารถประกาศชื่อตัวแปรที่เปนชนิดขอมูล
เดียวกันไดหลายๆตัวแปร ภายในคําสั่งเดียวกัน ตัวอยางเชน
float price, wholeSalePrice;
เปนคําสั่งประกาศตัวแปร price และ wholeSalePrice ใหมีชนิดขอมูลเปน
float
2.3.1 คําสั่งกําหนดคา
ตัวแปรที่มีการประกาศชนิดขอมูลแลวสามารถที่จะกําหนดหรือเปลี่ยนแปลงคาไดโดย
ใชคําสั่งกําหนดคา (assignment statement) ซึ่งมีรูปแบบดังนี้
variableName = expression;
โดยที่
• variableName คือชื่อตัวแปร
• expression คือนิพจนซึ่งเปนผลลัพธที่ไดจากการคํานวณขอความที่อาจ
ประกอบไปดวยคาคงที่ขอมูล ตัวแปร และตัวดําเนินการ (operator) ตางๆ ซึ่ง
นิพจนอาจเปนนิพจนที่ใหผลลัพธเปนขอมูลคาคงที่ชนิดตัวเลขจํานวนเต็ม ตรรกะ
ตัวเลขทศนิยม อักขระ หรือขอความ ทั้งนี้ขึ้นอยูกับชนิดขอมูลและคําสั่งที่ใช
ตัวอยางตอไปนี้แสดงการใชคําสั่งกําหนดคาสําหรับตัวแปร ที่ไดทําการประกาศชนิด
ขอมูลไวแลว
40 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
x = 1;
radius = 3.14;
c = ‘a’;
y = x+4*3;
คําสั่งกําหนดคาจะสั่งงานใหเครื่องคอมพิวเตอรทํางานสองขั้นตอนคือ คํานวณหา
ผลลัพธของนิพจน แลวเก็บผลลัพธที่ไดไวในตัวแปรอาทิเชน คําสั่ง
amount = 121+14;
จะมีขั้นตอนคือคํานวณหาผลลัพธซึ่งจะไดคาเปน 135 แลวเก็บผลลัพธที่ไดลงในตัว
แปร amount
คําสั่งกําหนดคาจะตองมีชื่อตัวแปรอยูทางดานซายมือ การใชคําสั่งเชน
1 = x;
เปนการใชคําสั่งที่ไมถูกตอง เพราะคาคงที่ใดๆไมสามารถที่จะเก็บผลลัพธที่ไดจาก
นิพจน (คาของ x) ได
นอกจากนี้เราสามารถที่จะนําชื่อตัวแปรที่จะกําหนดคามาประกอบในนิพจนได อาทิ
เชน
x = x+1;
เปนคําสั่งที่ใหนิพจนเพิ่มคาของตัวแปร x ที่มีอยูแลวไปอีก 1 แลวนําผลลัพธที่ไดเก็บ
ไวในตัวแปร x เชนเดิมอาทิเชน ถา x มีคาเปน 5 จะกลายเปน 6
เราสามารถที่จะประกาศและกําหนดคาเริ่มตนของตัวแปร ภายในคําสั่งเดียวกันได
โดยมีรูปแบบคําสั่งดังนี้
อาทิเชน
int amount = 123;
float price = 12.0f;
double x = 4.0, y = 2.5;
Java Programming 41
โปรแกรมที่ 2.2 ตัวอยางการใชคําสั่งกําหนดคา
2.3.2 คาคงที่
การประกาศคาคงที่ในภาษาจาวาทําไดโดยการใสคียเวิรด final หนาคําสั่ง
ประกาศชื่อ โดยมีรูปแบบดังนี้
โดยที่
• modifier คือคียเวิรดระบุคุณสมบัติตางๆของคาคงที่เชน access modifier
• dataType คือชนิดขอมูลของคาคงที่
42 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
• CONSTANT_NAME คือชื่อของคาคงที่ซึ่งโดยทั่วไปนิยมใชตัวอักษรพิมพใหญ
และแยกคําดวยเครื่องหมาย _
• expression คือนิพจนที่ใหผลลัพธเปนชนิดขอมูลที่สอดคลองกับชนิดขอมูล
ของคาคงที่
ตัวอยางเชน คําสั่ง
final int MINIMUM = 4;
final double MIN_GPA = 2.00;
เปนการประกาศคาคงที่ MINIMUM ใหมีชนิดขอมูลเปน int โดยมีคาเปน 4 และ
คาคงที่ MIN_GPA ใหมีชนิดขอมูลเปน double โดยมีคาเปน 2.00
คาคงที่จะกําหนดคาไดเพียงครั้งเดียว โดยจะตองมีการกําหนดคากอนที่จะมีการ
เรียกใชงาน ซึ่งเมื่อกําหนดคาแลวจะไมสามารถเปลี่ยนแปลงคาได
โปรแกรมที่ 2.3 เปนตัวอยางที่แสดงการประกาศคาคงที่และการใชคาคงที่ ซึ่งจะให
ผลลัพธดังแสดงในรูปที่ 2.3
Java Programming 43
2.3.3 ขอบเขตของตัวแปรและคาคงที่
ตัวแปรและคาคงที่ซึ่งประกาศขึ้นจะสามารถใชงานภายในบล็อกคําสั่ง { } ที่ประกาศ
เทานั้น โดยภาษาจาวาแบงตัวแปรและคาคงที่เปนสองประเภทคือ
1. ตัวแปรหรือคาคงที่ที่เปนคุณลักษณะของออปเจ็คหรือคุณลักษณะของคลาส
2. ตัวแปรหรือคาคงที่ที่อยูในบล็อกของเมธอดที่เรียกวาคาคงที่ภายใน (local
constant) หรือตัวแปรภายใน (local variable)
ตัวแปรหรือคาคงที่ ที่เปนคุณลักษณะของออปเจ็คหรือคุณลักษณะของคลาส คือ
ตัวแปรหรือคงที่ที่ประกาศภายในบล็อกของคลาส ซึ่งอยูนอกเมธอดของคลาส ตัวแปรหรือ
คาคงที่ประเภทนี้จะมีขอบเขตใชงานอยูภายในคลาส โดยที่ทุกๆเมธอดในคลาสสามารถ
เรียกใชได สําหรับตัวแปรประเภทนี้จะถูกกําหนดคาเริ่มตนใหโดยอัตโนมัติดังตารางที่ 2.5
สําหรับคาคงที่หรือตัวแปรที่อยูภายในบล็อกของเมธอด จะมีขอบเขตการใชงานอยู
ภายในบล็อกเทานั้น โปรแกรมที่ 2.4 แสดงตัวอยางตัวแปรที่เปนคุณลักษณะของออปเจ็คและ
ตัวแปรที่เปนตัวแปรภายใน โดยโปรแกรมนี้มีตัวแปร i ที่เปนคุณลักษณะของออปเจ็ค สวนตัว
แปร j และ k ในเมธอด method1() เปนตัวแปรภายใน และตัวแปร j ในเมธอด
method2() ก็เปนตัวแปรภายในอีกตัวหนึ่ง เราไมสามารถที่จะเรียกใชตัวแปร k นอกเมธอด
method1()ได นอกจากนี้ตัวแปร j ในเมธอดทั้งสองจะถือวาเปนตัวแปรคนละตัวกัน
44 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
โปรแกรมที่ 2.4 ตัวอยางแสดงขอบเขตของตัวแปร
public class VariableScopeDemo {
public int i; // object variable
// System.out.println(k); // illegal
}
}
ตัวแปรที่เปนคุณลักษณะของออปเจ็คจะสามารถเก็บ และเปลี่ยนแปลงคาที่เก็บไวใน
หนวยความจําได ตราบใดที่ออปเจ็คยังถูกอางอิงในโปรแกรม ตัวแปรภายในจะเปนตัวแปรที่
กําหนดในบล็อกของเมธอด ซึ่งจะมีขอบเขตการใชงานอยูภายในบล็อกที่กําหนดขึ้นเทานั้น ตัว
แปรประเภทนี้จะถูกสรางขึ้นเมื่อมีการเรียกใชงานเมธอดที่ตัวแปรประกาศอยู และจะถูกลบทิ้ง
เมื่อสิ้นสุดการทํางานของเมธอด ดังนั้นในบางครั้งจะเรียกตัวแปรประเภทนี้วา ตัวแปรชั่วคราว
(temporary variable) ตัวแปรที่ประกาศอยูใน argument ของเมธอด ก็จัดอยูในตัวแปร
ประเภทนี้เชนกัน
โปรแกรมที่ 2.5 แสดงตัวอยางของการประกาศและใชงานตัวแปรภายในและตัวแปร
ของออปเจ็ค คลาส ScopeExample จะมีตัวแปรของออปเจ็ค i ที่ถูกสรางขึ้นเมื่อมีการ
สรางออปเจ็คของคลาสและจะเก็บอยูใน Heap Memory ดังแสดงในรูปที่ 2.4 และเมื่อมีการ
เรียกใชเมธอด method1() และ method2() ตัวแปรภายใน i และ j จะถูกสรางขึ้นและ
ถูกลบทิ้งไปเมื่อออกจากเมธอดดังแสดงในรูปที่ 2.4
Java Programming 45
โปรแกรมที่ 2.5 ตัวอยางแสดงตัวแปรภายในและตัวแปรของออปเจ็ค
public class ScopeExample {
private int i=1;
this.i = i+j;
method2(7);
}
public void method2(int i) {
int j=8;
this.i = i+j;
}
}
-------------------------------------------------------
public class TestScoping {
public static void main(String args[]) {
ScopeExample scope = new ScopeExample();
scope.method1();
}
}
46 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
ภาษาจาวากําหนดใหตองมีการกําหนดคาเริ่มตนใหกับตัวแปรที่ประกาศไวกอนที่จะ
สามารถเรียกใชงานได ในกรณีของตัวแปรของออปเจ็คหรือตัวแปรของคลาสภาษาจาวาจะ
กําหนดคาเริ่มตนใหโดยอัตโนมัติดังตารางที่ 2.5 แตในกรณีของตัวแปรภายในจะตองมีคําสั่งใน
การกําหนดคาเริ่มตนเอง มิฉะนั้นจะเกิดขอผิดพลาดในขั้นตอนคอมไพล (Compile Error)
ตัวอยางเชน คําสั่ง
public void demoMethod(){
int x = (int)(Math.random()*10);
int y,z;
if(x > 5){
y = 6;
}
z = x+y;
}
จะทําใหโปรแกรมไมสามารถคอมไพลผานได เนื่องจากคา y มีโอกาสที่จะไมถูก
กําหนดคาเริ่มตนกอนใชงาน
2.4 ตัวดําเนินการ
นิพจนในภาษาจาวาอาจจะประกอบดวยขอมูลคาคงที่ ตัวแปร หรือคาคงที่ตางๆ โดย
จะมีตัวดําเนินการตางๆไวเพื่อคํานวณหาผลลัพธที่เปนชนิดขอมูลตางๆ ตัวดําเนินการในภาษา
จาวาแบงออกเปน 4 ประเภทคือ
1. ตัวดําเนินการทางคณิตศาสตร (Arithmetic Operator)
2. ตัวดําเนินการแบบสัมพันธ (Relational Operator)
3. ตัวดําเนินการทางตรรกศาสตร (Logical Operator)
4. ตัวดําเนินการแบบบิต (Bitwise Operator)
ทั้งนี้ตัวดําเนินการทางคณิตศาสตรและตัวดําเนินการแบบบิต จะใหผลลัพธเปนขอมูล
ชนิดจํานวนเต็มหรือจํานวนทศนิยม สวนตัวดําเนินการแบบสัมพันธและตัวดําเนินการทาง
ตรรกศาสตรจะใหผลลัพธเปนขอมูลชนิดตรรกะ
2.4.1 ตัวดําเนินการทางคณิตศาสตร
ตัวดําเนินการทางคณิตศาสตรสําหรับภาษาจาวาจะประกอบไปดวยเครื่องหมาย +,
-, *, / และ % ดังแสดงในตารางที่ 2.6
Java Programming 47
ตารางที่ 2.6 ตัวดําเนินการทางคณิตศาสตร
เครื่องหมาย ความหมาย ตัวอยางนิพจน
+ บวก a+b
- ลบ a-b
* คูณ a*b
/ หาร a/b
% เศษจากการหาร a%b
ตัวดําเนินการแบบยอ
ภาษาจาวาไดกําหนดตัวดําเนินการแบบยอ (shortcut operator) เพื่อใชแทนตัว
ดําเนินการทางคณิตศาสตร ที่ตองการเปลี่ยนแปลงคาของตัวแปรทางดานซายของคําสั่ง
กําหนดคา อาทิเชน คําสั่ง x = x+1; ซึ่งเปนคําสั่งที่ตองการเพิ่มคาของ x ขึ้นอีก 1
สามารถเขียนใหมโดยใชตัวดําเนินการแบบยอไดดังนี้
48 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
x += 1;
ขอดีของการเขียนคําสั่งโดยใชตัวดําเนินการแบบยอคือจะชวย ทําใหโปรแกรมทํางาน
ไดเร็วขึ้น ภาษาจาวามีตัวดําเนินการแบบยอ 5 ตัว คือ +=, -=, *=, /= และ %= ดังแสดง
ในตารางที่ 2.7
ตารางที่ 2.7 ตัวดําเนินการแบบยอ
เครื่องหมาย ตัวอยาง ความหมาย
+= x += 3; x = x + 3;
-= x -= 3; x = x – 3;
*= x *= 3; x = x * 3;
/= x /= 3; x = x / 2;
%= x %= 3; x = x % 3;
ตัวดําเนินการเพิ่มคาและลดคา
ภาษาจาวายังมีตัวดําเนินการแบบยออีกสองตัวคือตัวดําเนินการเพิ่มคา (increment
operator) ที่ใชเครื่องหมาย ++ และตัวดําเนินการลดคา (decrement operator) ที่ใช
เครื่องหมาย -- ตัวดําเนินการทั้งสองตัวใชในการเพิ่มคาทีละ 1 หรือลดคาทีละ 1
ตัวดําเนินการทั้งสองสามารถใสไวขางหนาหรือขางหลังตัวแปรก็ได ตัวอยางเชน
x++ คือ x = x+1
ตัวดําเนินการเพิ่มคาและตัวดําเนินการลดคาสามารถใชกับตัวแปร ทั้งที่มีชนิดขอมูล
เปนตัวเลขจํานวนเต็มและตัวเลขจํานวนทศนิยม การวางเครื่องหมายไวดานหนาตัวแปรจะมี
ผลใหโปรแกรมทําการเพิ่มหรือลดคากอนแลวจึงทําคําสั่งของนิพจนนั้น สวนการวาง
เครื่องหมายไวดานหลังตัวแปร จะมีผลใหโปรแกรมทําการเพิ่มหรือลดคา หลังจากทําคําสั่งของ
นิพจนนั้น
Java Programming 49
โปรแกรมที่ 2.6 แสดงตัวอยางของการใชตัวดําเนินการเพิ่มคา โดยการเปรียบเทียบ
ผลลัพธที่ไดจากการวางตําแหนงของเครื่องหมาย ++ ไวดานหนาและดานหลังตัวแปร ซึ่ง
ผลลัพธที่ไดจะเปนดังแสดงในรูปที่ 2.5
2.4.2 ตัวดําเนินการแบบสัมพันธ
ตัวดําเนินการแบบสัมพันธใชในการเปรียบเทียบคาของขอมูลชนิดใดๆสองคา โดยจะ
ใหผลลัพธของการเปรียบเทียบเปนขอมูลคาคงที่ชนิดตรรกะ ภาษาจาวากําหนดตัวดําเนินการ
แบบสัมพันธไว 6 ตัว คือ <, <=, >, >=, == และ != ดังแสดงในตารางที่ 2.8
50 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
ตารางที่ 2.8 แสดงตัวดําเนินการแบบสัมพันธ
เครื่องหมาย ความหมาย ตัวอยาง ผลลัพธ
< นอยกวา 3<4 true
ชนิดขอมูลที่จะนํามาเปรียบเทียบจะตองเปนชนิดขอมูลที่สอดคลองกันอาทิเชน การ
เปรียบเทียบตัวเลขกับตัวเลข ตัวอักขระกับตัวอักขระ หรือออปเจ็คกับออปเจ็ค เปนตน
ตัวอยางเชน
‘x’ > ‘y’
342 <= 431.50
“Test” == “\test”
ตัวถูกดําเนินการที่จะนําเปรียบเทียบอาจเปนตัวแปรหรือนิพจนก็ได แตจะตองมีชนิด
ขอมูลที่สอดคลองกันดวย ตัวอยางเชนถานิพจนเปน
x < 4.23
ตัวแปร x จะตองเปนตัวแปรชนิดตัวเลขทศนิยมหรือจํานวนเต็ม
โปรแกรมที่ 2.7 แสดงตัวอยางของการใชตัวดําเนินการแบบสัมพันธเพื่อเปรียบเทียบ
ตัวแปร x และ y ที่มีชนิดขอมูลเปน int และเก็บผลลัพธลงในตัวแปร b1 ที่มีชนิดขอมูลเปน
boolean ซึ่งโปรแกรมนี้จะใหผลลัพธดังแสดงในรูปที่ 2.6
Java Programming 51
โปรแกรมที่ 2.7 การใชตัวดําเนินการแบบสัมพันธ
public class BooleanDemo {
public static void main(String args[]) {
int x = 5;
int y = 4;
boolean b1;
b1 = (x != y);
System.out.println("x not equal y is " + b1);
System.out.println("y less than 0 is " + (y < 0));
}
}
2.4.3 ตัวดําเนินการทางตรรกศาสตร
ตัวดําเนินการทางตรรกศาสตร จะใชกับตัวถูกดําเนินการที่เปนนิพจนตรรกศาสตร
หรือชนิดขอมูล boolean ตัวดําเนินการประเภทนี้จะใหผลลัพธเปนขอมูลคาคงที่ชนิดตรรกะ
โดยภาษาจาวากําหนดตัวดําเนินการทางตรรกศาสตรไว 6 ตัวดังแสดงในตารางที่ 2.9
ตัวดําเนินการทุกตัวจะตองมีตัวถูกดําเนินการสองตัว ยกเวนตัวดําเนินการที่เปนตัว
ดําเนินการที่ใชในการกลับคา ซึ่งตองการตัวถูกดําเนินการเพียงหนึ่งตัว ตารางที่ 2.10 ถึง
ตารางที่ 2.13 แสดงผลลัพธที่เปนขอมูลคาคงที่ชนิดตรรกะซึ่งไดจากการดําเนินการที่เปนการ
กลับคา, AND, OR และ Exclusive-OR คาทางตรรกะ
ตัวอยางของนิพจนที่ใชตัวดําเนินการทางตรรกศาสตรมีดังนี้
(7>6) & (2<1) จะไดผลลัพธมีคาเปน false
(7>6) | (2<1) จะไดผลลัพธมีคาเปน true
!(7>6) จะไดผลลัพธมีคาเปน false
52 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
ตารางที่ 2.9 ตัวดําเนินการทางตรรกศาสตร
เครื่องหมาย ความหมาย
! กลับคาทางตรรกะ
&& หรือ & AND คาทางตรรกะ
ll หรือ l OR คาทางตรรกะ
^ Exclusive-OR คาทางตรรกะ
Java Programming 53
ตารางที่ 2.13 ผลลัพธของการ Exclusive-OR คาทางตรรกะ
op1 op2 op1 ^ op2
true true false
true false true
false true true
false false false
2.4.4 ตัวดําเนินการแบบบิต
ตัวดําเนินการแบบบิตเปนตัวดําเนินการที่ใชกับขอมูลชนิดตัวเลขจํานวนเต็ม เพื่อ
จัดการกับขอมูลเชิงบิตหรือเพื่อเลื่อนบิต โดยมีเครื่องหมายตางๆดังแสดงในตารางที่ 2.14 และ
ตารางที่ 2.15
54 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
ตารางที่ 2.14 ตัวดําเนินการเพื่อจัดการกับขอมูลเชิงบิต
เครื่องหมาย ความหมาย
~ Complement
& AND
l OR
^ XOR
Java Programming 55
128 >> 1 คือ 128/21 = 64
-128 >> 4 คือ -128/24 = -8
128 << 2 คือ 128 * 22 = 512
2.4.5 ลําดับความสําคัญของตัวดําเนินการ
กรณีที่นิพจนใดๆมีตัวดําเนินการมากกวาหนึ่งตัว ภาษาจาวาจะจัดลําดับความสําคัญ
ของตัวดําเนินการเพื่อคํานวณหาผลลัพธตามลําดับความสําคัญของตัวดําเนินการ โดยมีลําดับ
ความสําคัญดังแสดงในตารางที่ 2.16
56 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
ตัวอยางเชน คําสั่ง
x = 2+3*4-(7+2);
จะคํานวณหาผลลัพธตามลําดับดังนี้
1. คํานวณหาผลลัพธคา 7+2 ทําใหได
x = 2+3*4-9
2. คํานวณหาผลลัพธคา 3*4 ทําใหได
x = 2+12-9
3. คํานวณหาผลลัพธคา 2+12 ทําใหได
x = 14-9
4. คํานวณหาผลลัพธคา 14-5 ทําใหได
x = 5
2.5 การแปลงชนิดขอมูล
นิพจนทางคณิตศาสตรในภาษาจาวาอาจมีตัวถูกดําเนินการทางคณิตศาสตร ที่มีชนิด
ขอมูลเปนประเภทตางๆ ภาษาจาวาไดกําหนดใหผลลัพธของนิพจนเปนดังนี้
• ในกรณีที่ตัวถูกดําเนินการทั้งสองตัวมีชนิดขอมูลเปน double เหมือนกัน จะทํา
ใหไดผลลัพธที่มีชนิดขอมูลเปน double
• ในกรณีที่ตัวถูกดําเนินการทั้งสองตัวมีชนิดขอมูลเปน float เหมือนกัน จะทําให
ไดผลลัพธที่มีชนิดขอมูลเปน float
• ในกรณีที่ตัวถูกดําเนินการทั้งสองมีชนิดขอมูลที่ตางกัน ภาษาจาวาจะมีหลักการ
แปลงชนิดขอมูล (type conversion) ดังนี้
– ถาตัวถูกดําเนินการตัวหนึ่งมีชนิดขอมูลเปน double ตัวถูกดําเนินการอีก
ตัวหนึ่งจะถูกแปลงใหมีชนิดขอมูลเปน double โดยอัตโนมัติ
– ถาตัวถูกดําเนินการทั้งสองไมไดมีชนิดขอมูลเปน double แตมีตัวถูก
ดําเนินการตัวหนึ่งที่มีชนิดขอมูลเปน float ตัวถูกดําเนินการอีกตัวหนึ่ง
จะถูกแปลงใหมีชนิดขอมูลเปน float โดยอัตโนมัติ
– ถาตัวถูกดําเนินการทั้งสองไมไดมีชนิดขอมูลเปน double หรือ float
แตมีตัวถูกดําเนินการตัวหนึ่งที่มีชนิดขอมูลเปน long ตัวถูกดําเนินการอีก
ตัวหนึ่งจะถูกแปลงใหมีชนิดขอมูลเปน long โดยอัตโนมัติ
– กรณีอื่นๆ ตัวถูกดําเนินการทั้งสองจะแปลงใหมีชนิดขอมูลเปน int
Java Programming 57
จากหลักการขางตนจะเห็นไดวาผลลัพธที่ไดจากการคํานวณนิพจนคณิตศาสตร จะมี
ชนิดขอมูลเปน int เปนอยางนอย ดังนั้นคําสั่งตอไปนี้
byte b1, b2, b3;
b1 = 2;
b2 = 4;
b3 = b1+b2; // illegal
จึงเปนคําสั่งที่ไมถูกตอง เนื่องจาก b1+b2 จะใหคาผลลัพธที่มีชนิดขอมูลเปน int
ซึ่งไมสามารถกําหนดคาใหกับตัวแปรที่มีชนิดขอมูลเปน byte ได
2.5.1 การแปลงขอมูลในคําสั่งกําหนดคา
ภาษาจาวากําหนดใหคําสั่งกําหนดคาจะตองมีชนิดขอมูลของตัวแปรทางดานซายและ
ชนิดขอมูลของนิพจนทางดานขวาสอดคลองกัน อาทิเชน
int i = 4;
double x = 3.0;
ในกรณีที่ตัวแปรและนิพจนมีชนิดขอมูลที่แตกตางกัน คอมไพเลอรของภาษาจาวาจะ
ทําการแปลงชนิดขอมูลทั้งสองชนิดใหสอดคลองกัน โดยการแปลงชนิดขอมูลมีสองรูปแบบคือ
1. การแปลงขอมูลที่กวางขึ้น (widening conversion) คือการแปลงจากชนิดขอมูลที่
มีขนาดเล็กกวาไปเปนชนิดขอมูลที่มีขนาดใหญกวา
2. การแปลงขอมูลที่แคบลง (narrowing conversion) คือการแปลงจากชนิดขอมูลที่
มีขนาดใหญกวาไปเปนชนิดขอมูลที่มีขนาดเล็กลง ซึ่งอาจมีผลใหเสียความ
ละเอียดของขอมูลบางสวนไป
ภาษาจาวากําหนดขนาดของชนิดขอมูลตางๆที่สามารถแปลงขอมูลใหกวางขึ้นได ดัง
แสดงในรูปที่ 2.7 ซึ่งมีหลักการดังนี้
• ชนิดขอมูลตัวเลขจํานวนเต็มสามารถแปลงใหเปนชนิดขอมูลตัวเลขทศนิยมได
• ชนิดขอมูล float สามารถแปลงใหเปนชนิดขอมูล double ได
• ชนิดขอมูลตัวเลขจํานวนเต็มมีขนาดเรียงกันจากนอยไปมากดังนี้
byte → short → int → long
• ชนิดขอมูล char สามารถแปลงใหเปนชนิดขอมูล int ได
• ชนิดขอมูล boolean จะไมมคี วามสัมพันธกับชนิดขอมูลแบบพื้นฐานอื่นๆ
58 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
รูปที่ 2.7 การแปลงชนิดขอมูล
ในคําสั่งกําหนดคา ถาผลลัพธของนิพจนเปนชนิดขอมูลที่มีขนาดเล็กกวาชนิดขอมูล
ของตัวแปร ภาษาจาวาจะทําการแปลงขอมูลใหเปนชนิดขอมูลของตัวแปรดังกลาวโดย
อัตโนมัติอาทิเชน คําสั่ง
int i = 4;
long l = i;
นิพจน i จะถูกปรับชนิดขอมูลจาก int ใหเปน long โดยอัตโนมัติ
หรือคําสั่ง
double x = 3;
นิพจนที่มีคาเปน 3 จะถูกปรับชนิดขอมูลจาก int ใหเปน double โดยอัตโนมัติ
ในกรณีที่คําสั่งกําหนดคามีชนิดขอมูลของตัวแปรที่มีขนาดเล็กกวา ชนิดขอมูลของ
นิพจน ภาษาจาวาจะไมสามารถแปลงชนิดขอมูลของนิพจนใหเปนขนาดที่เล็กลงเทากับชนิด
ขอมูลของตัวแปรโดยอัตโนมัติ แตคอมไพเลอรจะแจงขอผิดพลาดในขั้นตอนการคอมไพล
(compile error) ตัวอยางเชน คําสั่ง
int amount = 123L;
หรือ float f = 4.0;
จะไมสามารถคอมไพลผานได เนื่องจากชนิดขอมูลของนิพจนมีขนาดใหญกวาชนิด
ขอมูลของตัวแปร
โปรแกรมที่ 2.8 แสดงตัวอยางของขอผิดพลาดในการแปลงชนิดขอมูล ซึ่งจะทําให
โปรแกรมนี้ไมสามารถคอมไพลผานได
Java Programming 59
โปรแกรมที่ 2.8 โปรแกรมที่มขี อผิดพลาดในการแปลงชนิดขอมูล
2.5.2 Typecasting
ภาษาจาวาจะสามารถทําการแปลงชนิดขอมูล ใหเปนชนิดขอมูลที่มีขนาดเล็กลงได
โดยใชวิธีการที่เรียกวา typecasting ซึ่งมีรูปแบบดังนี้
(targetType) expression
โดยที่
• targetType คือชนิดขอมูลที่ตองการ
การใช typecasting จะชวยทําใหโปรแกรมที่มีคําสั่งซึ่งจําเปนตองแปลงชนิดขอมูล
ใหมีขนาดเล็กลงสามารถคอมไพลผานได แตจะทําใหขอมูลบางสวนสูญหายไปในบางกรณี
ตัวอยางเชน คําสั่ง
int amount = (int)3.0;
จะทําการแปลงนิพจน 3.0 ที่มีชนิดขอมูลเปน double ใหเปน 3 ที่มีชนิดขอมูลเปน
int
หรือตัวอยางคําสั่ง
int x;
double y = 1.25;
x = (int)y;
60 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
จะทําการแปลงนิพจน y ที่มีคา 1.25 ใหมีชนิดขอมูลเปน int ที่มีคา 1 แตจะทําให
ตัวเลขที่เปนสวนทศนิยมหายไป
โปรแกรมที่ 2.9 แสดงตัวอยางการใช typecasting ในการแปลงชนิดขอมูล โดยนิพจน
b1+b2 จะใหผลลัพธที่มีชนิดขอมูลเปน int จึงตองแปลงชนิดขอมูลใหเปน byte เพื่อที่จะ
สามารถกําหนดคาใหกับตัวแปร b3 ซึ่งมีชนิดขอมูลเปน byte ได เชนเดียวกันกับคา 3.2 ซึ่ง
มีชนิดขอมูลเปน double จะถูกแปลงชนิดขอมูลใหเปน float
2.6 ชนิดขอมูลแบบอางอิง
ตัวแปรหรือคาคงที่ที่ประกาศเปนชนิดขอมูลอื่นๆ ซึ่งไมใชชนิดขอมูลแบบพื้นฐาน จะ
เปนชนิดขอมูลแบบอางอิงซึ่งก็คือออปเจ็คในภาษาจาวา โดยแบงออกเปนสองแบบคือ
1. ชนิดขอมูลที่เปนคลาส
2. ชนิดขอมูลที่เปนอะเรย
ตัวอยางของชนิดขอมูลที่เปนคลาสคือ ชนิดขอมูล String โดย String ไมใช
ชนิดขอมูลแบบพื้นฐาน แตเปนคลาสที่นิยามไวใน Java API อาทิเชน คําสั่ง
String id;
เปนคําสั่งประกาศตัวแปร id ใหเปนออปเจ็คของคลาส String สําหรับตัวอยาง
ของชนิดขอมูลที่เปนอะเรยจะถูกกลาวถึงในบทที่ 8
Java Programming 61
ชนิดขอมูลแบบอางอิงจะมีวิธีการเก็บขอมูลในหนวยความจําที่แตกตางจาก การเก็บ
ขอมูลของชนิดขอมูลแบบพื้นฐาน ทั้งนี้ขอมูลที่เก็บในหนวยความจําของชนิดขอมูลแบบอางอิง
จะเปนตําแหนงอางอิงที่เก็บขอมูลในหนวยความจํา แตในกรณีของชนิดขอมูลแบบพื้นฐาน
ขอมูลที่เก็บในหนวยความจําจะเปนคาของขอมูลจริงๆ อาทิเชน คําสั่ง
int x = 7;
String s = new String(“Thana”);
เปนการประกาศตัวแปรที่มีชนิดขอมูลแบบพื้นฐาน int ที่ชื่อ x และใหเก็บคาเปน 7
และเปนการประกาศตัวแปรชนิดขอมูลแบบอางอิง (ซึ่งก็คือออปเจ็ค) s ของคลาส String
และใหเก็บคาเปนขอความวา Thana ซึ่งตัวแปรทั้งสองตัวอาจจะมีการเก็บขอมูลใน
หนวยความจําดังแสดงในรูปที่ 2.8 ซึ่งคาที่เก็บในตัวแปร x จะเปนคาขอมูลที่เปนคา 7 สวนคา
ของตัวแปร s จะเปนตําแหนงอางอิงในหนวยความจําที่ใชเก็บขอความวา Thana
62 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
จะเปนคําสั่งในการจองเนื้อที่ในหนวยความจําเพื่อเก็บคุณลักษณะของออปเจ็คที่ชื่อ d
ที่มีอยู 3 ตัว คือ day, month และ year ซึ่งมีชนิดขอมูลเปน int ดังแสดงในรูปที่ 2.9 (ข)
(ก)
(ข)
รูปที่ 2.9 ตัวอยางของการเก็บขอมูลในหนวยความจํา
Java Programming 63
โดยไมจําเปนที่จะตองใชคําสั่ง
String s = new String(“Thana”);
ในกรณีที่ไมใชคําสั่ง new ภาษาจาวาจะกําหนดตําแหนงอางอิงในหนวยความจํา
ของขอความที่ระบุในเครื่อง (“ ”) โดยพิจารณาจาก String Pool วามีขอความ
เดิมอยูหรือไม หากมีก็จะใชตําแหนงอางอิงที่ซ้ํากัน แตถายังไมมีก็จะสราง
ขอความขึ้นมาใหมและกําหนดตําแหนงอางอิงของขอความนั้น สวนกรณีที่ใช
คําสั่ง new ภาษาจาวาจะสรางขอความใหมและจองเนื้อที่ในหนวยความจําเสมอ
โปรแกรมที่ 2.10 แสดงตัวอยางการสรางและกําหนดคา ออปเจ็คชนิด String
ทั้งในกรณีที่ใชและไมใชคําสั่ง new ออปเจ็ค s1 และ s2 จะมีขอมูลใน
หนวยความจําเปนตําแหนงอางอิงที่เดียวกัน สวน s3 จะมีขอมูลในหนวยความจํา
เปนตําแหนงอางอิงที่ตางกันเนื่องจากมีการสรางขอความขึ้นมาใหมดังแสดงในรูป
ที่ 2.10
64 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
• String เปนออปเจ็คที่เปลี่ยนคาไมได (immutable object) การกําหนดคา
ใหกับออปเจ็คชนิด String ใหม เปนการเปลี่ยนตําแหนงอางอิงใน
หนวยความจําของออปเจ็คดังกลาว แตจะไมไดมีการเปลี่ยนคาภายในตําแหนง
อางอิงเดิม ตัวอยางเชน คําสั่ง
String s1;
s1 = “Thanachart”;
s1 = “Somchai”;
จะมีผลทําใหตําแหนงอางอิงในหนวยความจําของออปเจ็ค s1 เปลี่ยนไป ดังแสดง
ในรูปที่ 2.11 ซึง่ เปนตัวอยางของการเปลี่ยนตําแหนงอางอิงในการเก็บขอมูลชนิด
String ในหนวยความจํา
• String เปนออปเจ็คที่มีตัวดําเนินการที่ใชในการเชื่อมขอความสองขอความ
เขาดวยกัน โดยใชเครื่องหมาย + อาทิเชน
String s1 = “Hello”+“ World”;
ตัวดําเนินการในการเชื่อมขอความสามารถใชเชื่อมขอมูลชนิด String กับตัว
ถูกดําเนินการที่เปนชนิดขอมูลอื่นๆที่ไมใชชนิด String ได ซึ่งภาษาจาวาจะ
แปลงชนิดขอมูลดังกลาวใหเปนชนิด String โดยอัตโนมัติอาทิเชน คําสั่ง
String s1 = “This”;
String s2 = s1+ “ is a test ”;
String s3 = s1+4;
จะทําใหไดขอความของตัวแปร s2 เปน “This is a test” และ s3
เปน “This4”
Java Programming 65
ตัวดําเนินการเพื่อเชื่อมขอความจะมีตัวดําเนินการแบบยอที่ใชเครื่องหมาย +=
เพื่อเชื่อมขอความ แลวกําหนดคาในออปเจ็คของคลาส String โดยใชชอื่ เดิม
อาทิเชน คําสั่ง
String s1 = “This”;
s1 += “ is a test”;
เปนคําสั่งเชื่อมขอความของออปเจ็ค s1 เดิมกับขอความที่วา “ is a test”
แลวเก็บลงในออปเจ็ค s1 เชนเดิม โดยทําให s1 มีขอความเปน “This is
a test”
66 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
− static double exp(double x);
− static double floor(double x);
− static double log(double x);
− static int max(int x, int y);
− static long max(long x, long y);
− static float max(float x, float y);
− static double max(double x, double y);
− static int min(int x, int y);
− static long min(long x, long y);
− static float min(float x, float y);
− static double min(double x, double y);
− static double pow(double x, double y);
− static double random();
− static double rint(double x);
− static int round(float x);
− static long round(double x);
− static double sin(double x);
− static double sqrt(double x);
− static double tan(double x);
2.7 คําสั่งอินพุตและเอาทพุต
โปรแกรมคอมพิวเตอรโดยทั่วไป จะตองมีการอานขอมูลเขาเพื่อใชในการประมวลผล
และจะมีการนําผลลัพธที่ไดจากการประมวลผลออกมาแสดง ขบวนการในการอานขอมูลเขา
และแสดงผลลัพธเรียกวา อินพุต/เอาทพุต (input/output) ภาษาจาวามีวิธีการหลายวิธีการใน
การจัดการกับอินพุต/เอาทพุต และมีคลาสหลายคลาสที่เกี่ยวของกับขบวนการอินพุต/เอาทพุต
แตวิธีการงายๆวิธีการหนึ่งคือการใชอินพุตมาตรฐาน (standard input) และการใชเอาทพุต
มาตราฐาน (standard output) ภาษาจาวามีออปเจ็คที่เปนอินพุต/เอาทพุตมาตรฐานสาม
ออปเจ็คคือ System.in, System.out และ System.err
• ออปเจ็ค System.in เปนออปเจ็คที่มีเมธอดสําหรับการอานขอมูลทางอุปกรณ
อินพุตมาตรฐาน ซึ่งโดยทั่วไปก็คือคียบอรด
• ออปเจ็ค System.out เปนออปเจ็คที่มีเมธอดสําหรับการแสดงขอมูลออกทาง
อุปกรณเอาทพุตมาตรฐานซึ่งโดยทั่วไปคือจอภาพ
Java Programming 67
• ออปเจ็ค System.err เปนออปเจ็คที่มีเมธอดสําหรับการแสดงขอผิดพลาด
(error) ออกทางอุปกรณที่ใชในการแสดงขอผิดพลาด ซึ่งโดยทั่วไปจะกําหนดเปน
จอภาพ
2.7.1 System.out.println()
ออปเจ็ค System.out หมายถึงออปเจ็คที่ชื่อ out ซึ่งเปนคุณลักษณะของคลาส
System ออปเจ็คที่ชื่อ out เปนออปเจ็คของคลาส PrintStream ที่มีเมธอดที่เกี่ยวของ
กับการแสดงผลอยูหลายเมธอด แตเมธอดที่นิยมใชทั่วไปคือ
print(String s)
และ println(String s)
ซึ่งเมธอดทั้งสองใชในการแสดงผลขอมูลที่มี argument เปนชนิดขอมูล String
เมธอด println() จะมีผลใหโปรแกรมขึ้นบรรทัดใหมหลังจากพิมพขอมูลที่ตองการแสดง
เมธอด print() และ println() สามารถรับ argument ที่เปนชนิดขอมูลอื่น ซึ่ง
โปรแกรมจะแปลงเปนชนิดขอมูล String ใหโดยอัตโนมัติตัวอยางเชน คําสั่ง
int x = 3;
System.out.println(x);
เปนชุดคําสั่งในการพิมพคาของตัวแปร x ที่มีชนิดขอมูลเปน int ออกทางจอภาพ
โดยโปรแกรมจะแปลงชนิดขอมูล int ใหเปน String แลวจึงพิมพขอความออกมา
โปรแกรมที่ 2.11 แสดงตัวอยางของการใชคําสั่ง System.out.print() และ
System.out.println() เพื่อแสดงขอมูลชนิดตางๆ ออกทางจอภาพดังแสดงในรูปที่
2.12
68 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
รูปที่ 2.12 ผลลัพธที่ไดจากการรันโปรแกรมที่ 2.11
Java Programming 69
สรุปเนื้อหาของบท
• คอมเม็นต คือขอความที่แทรกอยูภายในโปรแกรม ซึ่งคอมไพเลอรจะไมแปล
ขอความนี้ใหเปนสวนหนึ่งของโปรแกรม
• identifier คือชื่อที่ตั้งขึ้นในภาษาจาวา ซึ่งอาจเปนชื่อของคลาส ชื่อของตัวแปร ชื่อ
ของเมธอด หรือชื่อของคาคงที่ ซึ่งจะตองเปนไปตามกฎการตั้งชื่อ
• การตั้งชื่อในภาษาจาวา
– สําหรับคลาส นิยมขึ้นตนดวยตัวอักษรพิมพใหญ
– สําหรับเมธอดและตัวแปร นิยมขึ้นตนดวยตัวอักษรพิมพเล็ก
– ถาชื่อที่ตั้งขึ้นมีมากกวา 1 คํา นิยมขึ้นตนคําใหมดวยตัวอักษรพิมพใหญ
– ตองไมตรงกับคียเวิรด
• คียเวิรด คือชื่อที่มีความหมายพิเศษในภาษาจาวา คอมไพเลอรของภาษาจาวาจะ
เขาใจความหมายและคําสั่งที่จะตองดําเนินการสําหรับคียเวิรดแตละตัว
• ขอมูลคาคงที่ คือคําที่ใชแสดงขอมูลที่เปนตัวเลข ตัวอักขระ ขอความ หรือคาทาง
ตรรกะ
• ชนิดขอมูลในภาษาจาวาแบงเปนสองประเภท คือชนิดขอมูลแบบพื้นฐาน และ
ชนิดขอมูลแบบอางอิง
• ชนิดขอมูลแบบพื้นฐานที่ใชในภาษาจาวามีทั้งหมด 8 ชนิดคือ char, byte,
short, int, long, float, double และ boolean
70 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
• ตัวดําเนินการที่ใชในภาษาจาวามีทั้งหมด 4 แบบคือ
– ตัวดําเนินการทางคณิตศาสตร : +, -, *, /, %, +=, -=, *=, /=, %=, ++และ --
– ตัวดําเนินการทางตรรกศาสตร : !, &&, &, || และ |
– ตัวดําเนินการแบบสัมพันธ : <, <=, >, >=, == และ !=
– ตัวดําเนินการแบบบิต : ~, &, |, ^, >>, >>>, <<
• กรณีที่นิพจนใดๆมีตัวดําเนินการมากกวาหนึ่งตัว ภาษาจาวาจะจัดลําดับ
ความสําคัญของตัวดําเนินการ เพื่อคํานวณหาผลลัพธตามลําดับความสําคัญของ
ตัวดําเนินการ
• ความแตกตางระหวางการแปลงขอมูลชนิดอัตโนมัติและ Typecasting
– การแปลงขอมูลโดยอัตโนมัติคือ การที่ชนิดขอมูลที่มีขนาดเล็กกวาถูกแปลง
ใหเปนชนิดขอมูลที่มีขนาดใหญกวาโดยอัตโนมัติ
– Typecasting คือการที่จะตองระบุชนิดขอมูลที่มีขนาดเล็กกวาใหกับนิพจนที่
มีชนิดขอมูลขนาดใหญกวา
• ชนิดขอมูลแบบอางอิงซึ่งก็คือออปเจ็คในภาษาจาวา โดยแบงออกเปนสองแบบคือ
ชนิดขอมูลที่เปนคลาส และชนิดขอมูลที่เปนอะเรย
• ขอมูลที่เก็บในหนวยความจําของชนิดขอมูลแบบอางอิง จะเปนตําแหนงอางอิงที่
เก็บขอมูลในหนวยความจํา แตในกรณีของชนิดขอมูลแบบพื้นฐาน ขอมูลที่เก็บใน
หนวยความจําจะเปนคาของขอมูลจริงๆ
• String เปนชนิดขอมูลแบบคลาส ไมใชชนิดขอมูลแบบพื้นฐาน
• คลาส Math จะมีเมธอดตางๆ ในการจัดการกับฟงกชั่นหรือคําสั่งทาง
คณิตศาสตรตางๆ
• คําสั่งที่ใชในการแสดงผลลัพธของขอมูลในภาษาจาวาคือคําสั่ง
System.out.println()
Java Programming 71
72 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
บทที่ 3
โครงสรางควบคุม
เนื้อหาในบทนี้เปนการแนะนําคําสั่งที่เกี่ยวของกับโครงสรางควบคุมในภาษาจาวา ซึ่ง
เปนการควบคุมลําดับการทํางานของคําสั่งตางๆในโปรแกรมภาษาจาวา โดยจะกลาวถึงคําสั่ง
โครงสรางควบคุมสองประเภทคือ คําสั่งโครงสรางแบบเลือกทําซึ่งไดแกคําสั่ง if,if..else
และ switch และคําสั่งโครงสรางแบบทําซ้ําซึ่งไดแกคําสั่ง while,do..while และ
for และในตอนทายของบทนี้จะกลาวถึงคําสั่งโครงสรางควบคุมแบบซอน
3.1 คําสั่งโครงสรางควบคุม
คําสั่งโครงสรางควบคุม (control structure) เปนคําสั่งที่ใชในการกําหนดลําดับการ
ทํางานของคําสั่งตางๆ ภาษาจาวามีโครงสรางควบคุมสามรูปแบบคือ
1. โครงสรางแบบตามลําดับ (sequential structure)
2. โครงสรางแบบเลือกทํา (selection structure)
3. โครงสรางแบบทําซ้ํา (repetition structure)
โดยทั่วไปคําสั่งในภาษาจาวาจะมีโครงสรางควบคุมแบบตามลําดับ โดยจะทํางาน
ตามลําดับของคําสั่งที่มีอยูในโปรแกรม ซึ่งจะเริ่มทํางานจากเมธอด main()โดยจะทํางานจาก
คําสั่งแรกของเมธอด main() และทํางานเรียงตามลําดับคําสั่งตอไปเรื่อยๆ กรณีที่มีการ
เรียกใชเมธอดของออปเจ็ค โปรแกรมจะเขาไปทําคําสั่งภายในเมธอดนั้น และเมื่อสิ้นสุดคําสั่ง
สุดทายของเมธอดก็จะกลับมาทําคําสั่งที่เรียกใชเมธอด ดังแสดงในรูปที่ 3.1
Java Programming 73
public class Sample {
public static void main(String args[]) {
Student s = new Student();
String name;
name = s.getName();
System.out.println(name);
}
} public class Student {
String name;
public String getName();
return name;
}
}
3.2 โครงสรางแบบเลือกทํา
โครงสรางแบบเลือกทํา เปนการใหเลือกทําชุดคําสั่งในกรณีที่นิพจนตรรกศาสตรมีคา
เปนจริงตามเงื่อนไข ซึ่งชุดคําสั่งโครงสรางแบบเลือกทําจะประกอบไปดวยคําสั่งดังตอไปนี้
• คําสั่ง if
• คําสั่ง if..else
3.2.1 คําสั่ง if
คําสั่ง if จะมีรูปแบบดังนี้
if (logical expression) {
statements
}
โดยที่
• logical expression คือนิพจนตรรกศาสตรที่ใหผลลัพธเปนขอมูลคาคงที่
ชนิด boolean
74 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
• statements คือชุดคําสั่งใดๆ
ชุดคําสั่งที่อยูในบล็อก { } จะทํางานในกรณีที่นิพจนตรรกศาสตรใหคาเปนจริง ซึ่ง
คําสั่ง if สามารถแสดงลําดับการทํางานเปนโฟวชารต (flowchart) ไดดังแสดงในรูปที่ 3.2
จริง เท็จ
ทําชุดคําสั่ง นิพจนตรรกศาสตร ไมมีการทําคําสั่งใด
ถานิพจนตรรกศาสตร ถานิพจนตรรกศาสตร
เปนจริง เปนเท็จ
ชุดคําสั่ง
ตัวอยางของการใชคําสั่ง if มีดังนี้
if(radius >= 0) {
area = radius*radius*Math.PI;
System.out.println(area);
}
จากตัวอยางนี้ชุดคําสั่งที่อยูในบล็อก (คําสั่งกําหนดคาตัวแปร area และคําสั่ง
แสดงผล) จะทํางานในกรณีที่นิพจน radius >=0 เปนจริง กลาวคือตัวแปร radius มี
คามากกวาหรือเทากับ 0
กรณีที่ชุดคําสั่งในบล็อก { } มีเพียงคําสั่งเดียวเราสามารถที่จะตัดเครื่องหมาย { }
ออกไปไดอาทิเชน คําสั่ง
if((x > 0) && (x < 10)) {
System.out.println(x);
}
สามารถเขียนใหมไดเปน
if((x > 0) && (x < 10))
System.out.println(x);
Java Programming 75
แตอยางไรก็ตามการเขียนโปรแกรมที่ดีควรใชบล็อก { } เพื่อใหเกิดความเขาใจงาย
และงายตอการเพิ่มคําสั่ง (กลาวคือถามีมากกวาหนึ่งคําสั่งตองใชบล็อก { } เสมอ)
76 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
if (logical expression) {
true statements
} else {
false statements
}
โดยที่
• true statements คือชุดคําสั่งสําหรับคาจริง
• false statements คือชุดคําสั่งสําหรับคาเท็จ
โดยมีโฟวชารตของการทํางานของคําสั่งนี้ดังแสดงในรูปที่ 3.4
จริง นิพจนตรรกศาสตร
เท็จ
ทําชุดคําสั่ง ทําชุดคําสั่ง
สําหรับคาจริง สําหรับคาเท็จ
ถานิพจนตรรกศาสตร ถานิพจนตรรกศาสตร
เปนจริง เปนเท็จ
ชุดคําสั่งสําหรับคาจริง ชุดคําสั่งสําหรับคาเท็จ
Java Programming 77
จากตัวอยางนี้ถาตัวแปร radius มีคามากกวาหรือเทากับ 0 (นิพจนมีคาเปนจริง)
โปรแกรมจะทําการคํานวณคา กําหนดคาและพิมพคาของตัวแปร area ออกมา แตถาตัวแปร
radius มีคานอยกวา 0 (นิพจนเปนเท็จ) โปรแกรมจะแสดงขอความ Negative radius
ออกมาแทน
78 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
3.2.3 คําสั่ง if แบบซอน
คําสั่ง if หรือ if..else สามารถที่จะซอนอยูขางในคําสั่ง if หรือ if..else
อื่นไดอาทิเชน โฟวชารตที่แสดงในรูปที่ 3.6 ซึ่งมีขั้นตอนการทํางานคือ โปรแกรมจะทํา
ชุดคําสั่งที่ 3 ถานิพจนตรรกศาสตรที่ 1 เปนเท็จ แตถาเปนจริงจะตรวจสอบผลลัพธของนิพจน
ตรรกศาสตรที่ 2 ซึ่งถามีคาเปนจริง จะทําชุดคําสั่งที่ 1 แตถามีคาเปนเท็จจะทําชุดคําสั่งที่ 2
ชุดคําสั่งที่ 1 ชุดคําสั่งที่ 2
Java Programming 79
ตัวอยางเชน
if(radius >= 0) {
area = radius*radius*Math.PI;
if(area >= 500.0) {
System.out.println(“Big Circle”);
} else {
System.out.println(“Small Circle”);
}
} else {
System.out.println(“Negative radius”);
}
ชุดคําสั่งที่ 1
จริง นิพจน เท็จ
ตรรกศาสตรที่ 2
ชุดคําสั่งที่ 2 ชุดคําสั่งที่ 3
if (logical expression 1) {
statements 1
} else {
80 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
if (logical expression 2) {
statements 2
} else {
statements 3
}
}
if (logical expression 1) {
statements 1
} else if (logical expression 2) {
statements 2
} else {
statements 3
}
Java Programming 81
โปรแกรมที่ 3.3 การใชคําสั่ง if..else if..else
switch (expression) {
case value 1 : statements 1
break;
case value 2 : statements 2
break;
: :
case value N : statements N
break;
default : statements N+1
break;
}
82 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
โดยที่
• expression คือนิพจนที่ตองมีชนิดขอมูลเปน char, byte, short หรือ
int เทานั้น
• value 1 .. value N คือขอมูลคาคงที่ซึ่งมีชนิดขอมูลที่สอดคลองกับชนิด
ขอมูลของ expression
คําสั่ง switch จะตรวจสอบคาของนิพจนที่อาจเปนชนิดขอมูล char, byte,
short หรือ int กรณีที่คาของนิพจนมีคาตรงกับคาที่ 1 โปรแกรมจะทําชุดคําสั่งที่ 1 ถามี
คาตรงกับคาที่ 2 ก็จะทําชุดคําสั่งที่ 2 ถามีคาตรงกับคาที่ N ก็จะทําชุดคําสั่งที่ N สวนกรณีที่มี
คาไมตรงกับคาใดๆเลยในคําสั่ง case ก็จะทําชุดคําสั่งใน default คือชุดคําสั่งที่ N+1 ซึ่งแสดง
ขั้นตอนการทํางานไดดังโฟวชารตในรูปที่ 3.8
นิพจน
จริง
= คาที่ 1 ชุดคําสั่งที่ 1
= คาที่ 2
จริง ชุดคําสั่งที่ 2
: :
จริง ชุดคําสั่งที่ N
= คาที่ N
Java Programming 83
case 2 : System.out.println(“Two”);
break;
case 3 : System.out.println(“Three”);
break;
default : System.out.println(“Other”);
}
84 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
โปรแกรมที่ 3.4 ตัวอยางการใชคําสั่ง switch
3.3 โครงสรางแบบทําซ้ํา
โครงสรางแบบทําซ้ํา เปนคําสั่งที่ใชในการสั่งใหชุดคําสั่งใดๆทําซ้ําหลายครั้งตาม
เงื่อนไขที่ระบุ ซึ่งชุดคําสั่งโครงสรางแบบทําซ้ําประกอบดวยคําสั่ง
• คําสั่ง while
• คําสั่ง do..while
• คําสั่ง for
initial statements
while (logical expression) {
statements
update statements
}
Java Programming 85
โดยที่
• initial statements คือคําสั่งที่ใชในการกําหนดคาเริ่มตน
• logical expression คือนิพจนตรรกศาสตร
• update statements คือคําสั่งที่ใชในการเปลี่ยนแปลงคา
คําสั่งกําหนดคาเริ่มตน
นิพจน เท็จ
ทําชุดคําสั่งซ้ํา ตรรกศาสตร
ถานิพจนตรรกศาสตร จริง
ยังเปนจริง ชุดคําสั่ง
คําสั่งเปลี่ยนแปลงคา
86 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
}
ตัวอยางนี้มีคําสั่ง int count = 1; เปนคําสั่งกําหนดคาเริ่มตน โดยมีนิพจน
ตรรกศาสตรคือ count <= 10 ซึ่งโปรแกรมจะทําคําสั่งในบล็อก { } ตราบเทาที่นิพจน
ตรรกศาสตรมีคาเปนจริง (กลาวคือคาของตัวแปร count นอยกวาหรือเทากับ 10) สวน
คําสั่ง count++; เปนคําสั่งเปลี่ยนแปลงคาของตัวแปร count โดยจะเพิ่มคาทีละหนึ่งใน
แตละรอบจนกระทั่งมีคาเปน 11 ซึ่งจะมีผลทําใหนิพจน count <= 10 มีคาเปนเท็จ หาก
ไมมีคําสั่ง count++; ในบล็อก { } จะทําใหคา count มีคาเปน 1 ตลอด และจะทําใหนิพจน
count <= 10 มีคาเปนจริงเสมอ ซึ่งก็จะทําใหโปรแกรมพิมพขอความ Hello World โดยไม
มีที่สิ้นสุด
Java Programming 87
3.3.2 คําสั่ง do..while
คําสั่ง do..while เปนคําสั่งที่เปนโครงสรางแบบทําซ้ําที่มีการทํางานคลายกับ
คําสั่ง while โดยมีรูปแบบคําสั่งดังนี้
initial statements
do {
statements
update statements
} while(logical expression);
มีการทําชุดคําสั่ง
อยางนอยหนึ่งครั้ง
ทําชุดคําสั่งซ้ํา ชุดคําสั่ง
ถานิพจนตรรกศาสตร
คําสั่งเปลี่ยนแปลงคา
ยังเปนจริง
จริง
นิพจนตรรกศาสตร
เท็จ
88 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
do {
System.out.println(“Hello World”);
count++;
} while(count <= 10);
Java Programming 89
คําสั่งกําหนดคา
นิพจน เท็จ
ทําชุดคําสั่งซ้ํา ตรรกศาสตร
ถานิพจนตรรกศาสตร จริง
ยังเปนจริง ชุดคําสั่ง
คําสั่งเปลี่ยนแปลงคา
90 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
โปรแกรมที่ 3.7 ตัวอยางการใชคําสั่ง for
Java Programming 91
เปนคําสั่งที่ใชในการสุมตัวเลขระหวาง 1 ถึง 10 แลวกําหนดคาใหกับตัวแปร i
โปรแกรมนี้สามารถเขียนใหมโดยใชคําสั่ง while ได แตไมสามารถที่จะเขียนโดยใชคําสั่ง
for เนื่องจากไมทราบจํานวนครั้งที่ตองการสุมตัวเลขที่แนนอนได
92 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
มีคําสั่ง for ที่อยูภายนอกที่จะทําซ้ําสามครั้ง โดยกําหนดใหตัวแปร i มีคา
เริ่มตนเปน 1 และเพิ่มทีละหนึ่ง สวนคําสั่ง for ที่อยูภายในจะทําซ้ําสี่ครั้ง ในแตละรอบของ
คําสั่ง for ภายนอก โดยกําหนดใหตัวแปร j มีคาเริ่มตนเปน 1 และเพิ่มคาทีละหนึ่ง
ดังนั้นคําสั่งแสดงผล (System.out.println()) จะทําซ้ําทั้งหมด 12 ครัง้
โปรแกรมที่ 3.10 เปนตัวอยางการใชคําสั่ง for แบบซอน โดยคําสั่ง for ที่อยู
ภายในจะพิมพเครื่องหมาย ‘*’ เทากับจํานวนคอลัมน (5 ครั้ง) และคําสั่ง for ที่อยู
ภายนอกจะทําคําสั่ง for ที่อยูภายในซ้ําเทากับจํานวนแถว (3 ครั้ง) โปรแกรมจะไดผลลัพธดัง
รูปที่ 3.13
Java Programming 93
โปรแกรมที่ 3.11 ตัวอยางการใชคําสั่งโครงสรางแบบซอนหลายรูป
94 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
ตัวอยางเชน คําสั่ง
for(int i = 1; i <= 5; i++) {
if (i == 3)
break;
System.out.println(i);
}
จะพิมพคา i ตั้งแต 1 ถึง 2 ออกมา แลวจะหยุดการทํางานของคําสั่ง แตถาเปลี่ยน
จากคําสั่ง break ไปเปนคําสัง่ continue ดังนี้
for(int i = 1; i <= 5; i++) {
if (i == 3)
continue;
System.out.println(i);
}
โปรแกรมจะพิมพคา i ตั้งแต 1 ถึง 5 โดยขามคาที่ 3 ทั้งนี้เนื่องจากเจอคําสั่ง
continue
ในกรณีของคําสั่งโครงสรางควบคุมแบบซอน ถาคําสั่ง break หรือ continue
ปรากฏอยูในคําสั่งโครงสรางแบบทําซ้ําที่อยูขางใน คําสั่งโครงสรางแบบทําซ้ําที่อยูขางนอกจะ
ยังทําซ้ําตอ โปรแกรมที่ 3.12 แสดงตัวอยางของการใชคําสั่งโครงสรางควบคุมแบบซอนที่มี
คําสั่ง break อยูในคําสั่งโครงสรางแบบทําซ้ําที่อยูขางใน โปรแกรมนี้จะรันคําสั่ง break
เมื่อ j มีคาเปน 3 โดยคําสั่งในคําสั่ง for ภายในจะหยุดทํางาน แตคําสั่ง for ภายนอก
จะยังทํางานตอ โดยจะไดผลลัพธดังแสดงในรูปที่ 3.15
Java Programming 95
รูปที่ 3.15 ผลลัพธที่ไดจากการรันโปรแกรมที่ 3.12
ในกรณีที่ตองการจะหยุดการทํางานของคําสั่งโครงสรางควบคุมที่อยูภายนอก เราจะ
ตองกําหนด label ขึ้นมาเติม ดังตัวอยางในโปรแกรมที่ 3.13 ซึ่งกําหนด label ที่ชื่อ outer
และมีคําสั่ง break outer; เพื่อที่จะทําใหโปรแกรมหยุดการทํางานของคําสั่ง for
ภายนอก โดยจะไดผลลัพธดังแสดงในรูปที่ 3.16
96 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
สรุปเนื้อหาของบท
• คําสั่งโครงสรางควบคุม เปนคําสั่งที่ใชในการกําหนดลําดับการทํางานของคําสั่ง
ตางๆ โดยมีสามรูปแบบคือ โครงสรางแบบตามลําดับ โครงสรางแบบเลือกทํา
และ โครงสรางแบบทําซ้ํา
• คําสั่งที่เปนคําสั่งของโครงสรางแบบเลือกทําคือ คําสั่ง if, if..else หรือ
switch
• คําสั่ง if..else แตกตางจากคําสั่ง if ตรงที่ คําสั่ง if..else จะมีการทํา
คําสั่งสําหรับคาเท็จถานิพจนตรรกศาสตรเปนเท็จ สวนคําสั่ง if จะไมมีการทํา
คําสั่งใดถานิพจนตรรกศาสตรเปนเท็จ
• คําสั่ง หรือ
if if..else สามารถที่จะซอนอยูขางในคําสั่ง if หรือ
if..else อื่นได
Java Programming 97
• คําสั่ง จะทําใหหยุดสิ้นสุดการทํางานของโครงสรางแบบทําซ้ํา สวนคําสั่ง
break
continue จะขามการทํางานคําสั่งที่เหลือภายในบล็อก { } โดยไปเริ่มการทําซ้ํา
ในรอบตอไปใหม
98 คณะเทคโนโลยีสารสนเทศ สถาบันเทคโนโลยีพระจอมเกลาเจาคุณทหารลาดกระบัง
บทที่ 4
หลักการเชิงออปเจ็ค
เนื้อหาในบทนี้เปนการแนะนําหลักการการพัฒนาโปรแกรมเชิงออปเจ็ค อธิบายความ
หมายของคํานิยามตางๆที่ใชในการพัฒนาโปรแกรมเชิงออปเจ็คเชน คลาส ออปเจ็ค
คุณลักษณะ และเมธอด แนะนําการประกาศคํานิยามดังกลาวโดยใชภาษาจาวา อธิบาย
คุณลักษณะเดนของโปรแกรมเชิงออปเจ็ค แนะนําคลาสที่ใชในการจําลองขอกําหนดของ
โปรแกรมเชิงออปเจ็ค และในสวนทายของบทจะเปนการแนะนําขั้นตอนการพัฒนาโปรแกรม
โดยใชหลักการเชิงออปเจ็ค
4.1 องคประกอบของโปรแกรมเชิงออปเจ็ค
ภาษาจาวาเปนภาษาคอมพิวเตอร ที่ใชหลักการการพัฒนาโปรแกรมเชิงออปเจ็คที่
เรียกยอวาเปนภาษาคอมพิวเตอรแบบ OOP การพัฒนาโปรแกรมเชิงออปเจ็คจะเปน
ขบวนการการวิเคราะหปญหาโดยการจําลองปญหาวาประกอบไปดวยออปเจ็คใดบาง แลวจึง
เขียนใหอยูในรูปแบบของโปรแกรมคอมพิวเตอร โปรแกรมเชิงออปเจ็คจะมีคํานิยามที่สําคัญ
สองคําคือ ออปเจ็ค (object) และคลาส (class)
4.1.1 ออปเจ็ค
ออปเจ็คคือสิ่งตางๆที่มีอยูในชีวิตประจําวันแบงไดเปนสองประเภทคือ
1. สิ่งที่เปนรูปธรรม (tangible) คือสิ่งที่เปนวัตถุและจับตองไดอาทิเชน นักศึกษา ใบ
ลงทะเบียน ปากกา และรถ เปนตน
2. สิ่งที่เปนนามธรรม (intangible) คือสิ่งที่ไมสามารถจับตองไดอาทิเชน คะแนน
รายชื่อวิชา บัญชีเงินฝาก และตารางเที่ยวบิน เปนตน
ออปเจ็คตางๆจะประกอบไปดวยคุณลักษณะ (attribute) และพฤติกรรม
(behavior)คุณลักษณะก็คือขอมูลของออปเจ็ค สวนพฤติกรรมหรือเรียกวาเมธอด (method) คือ
สิ่งที่ ออปเจ็คสามารถกระทําได ซึ่งในโปรแกรมเชิงออปเจ็คก็คือคําสั่งในการทํางาน
โปรแกรมเชิงออปเจ็คจะประก อบดวยออปเจ็คตางๆหลายออปเจ็ค ซึ่งแตละออปเจ็คจะ
Java Programming 99
มีคุณลักษณะตางๆที่เปนขอมูลของออปเจ็ค และโปรแกรมสามารถจัดการกับขอมูลเหลานี้ได
โดยการเรียกใชเมธอดตางๆ
ตัวอยางของออปเจ็ค
• นักศึกษา อาจจะประกอบไปดวยคุณลักษณะเชน รหัส ชื่อ และเกรดเฉลี่ย
และอาจจะมีเมธอดเชน ลงทะเบียน สอบ และเดิน
• รถยนต อาจจะประกอบไปดวยคุณลักษณะเชน ยี่หอ รุน และสี
และอาจจะมีเมธอดเชน เคลื่อนที่ หยุดและเลี้ยว
• สุนัข อาจจะประกอบไปดวยคุณลักษณะเชน ชื่อ พันธุ และสี
และอาจจะมีเมธอดเชน เหา คลาน และกระดิกหาง
ตัวอยางของโปรแกรมเชิงออปเจ็คอาจยกตัวอยางของโปรแกรมระบบจัดการบัญชีเงิน
ฝากของธนาคาร ซึ่งอาจประกอบไปดวยออปเจ็คตางๆอาทิเชน บัญชี (Account) ลูกคา
(Customer) เครื่องเอทีเอ็ม (ATM) และรายการ (Transaction) ออปเจ็คชนิดบัญชีอาจจะมี
ขอมูลภายในตางๆอาทิเชน เลขที่บัญชี ชื่อเจาของบัญชี วันที่เปดบัญชี และยอดเงินคงเหลือ
เปนตน ออปเจ็คชนิดบัญชีอาจจะมีเมธอดตางๆอาทิเชน ฝาก ถอน และการโอนเงิน เปนตน
4.1.2 คลาส
โดยทั่วไปโปรแกรมเชิงออปเจ็คแตละโปรแกรมจะประกอบไปดวยออปเจ็ค ที่เปนชนิด
เดียวกันหลายๆออปเจ็คแตอาจมีขอมูลหรือคุณลักษณะที่ตางกันอาทิเชน โปรแกรมระบบ
จัดการบัญชีเงินฝากของธนาคารอาจมีออปเจ็คชนิดบัญชีหลายๆออปเจ็ค โดยที่แตละ
ออปเจ็คอาจจะมีขอมูลที่เปนเลขที่บัญชีหรือชื่อเจาของบัญชีที่ตางกัน โปรแกรมเชิงออปเจ็คจะ
มีคําสั่งในการสรางออปเจ็คโดยสรางมาจากคลาสซึ่งเปนตัวกําหนดนิยามของออปเจ็ควาจะตอง
ประกอบดวยคุณลักษณะและเมธอดใดบาง
คลาสเปรียบเสมือนพิมพเขียวของออปเจ็ค ออปเจ็คที่ถูกสรางมาจากคลาสบางครั้งจะ
เรียกวาเปน instance ของคลาส ซึ่งออปเจ็คใดๆจะตองเปน instance ของคลาสใดคลาสหนึ่ง
การเขียนโปรแกรมเชิงออปเจ็ค ตองมีการกําหนดนิยามของคลาสกอนที่จะสามารถสราง
ออปเจ็ค (หรือ instance) ของคลาสได ซึ่งคลาสหนึ่งคลาสสามารถที่จะสรางออปเจ็คไดหลาย
ออปเจ็ค รูปที่ 4.1 แสดงตัวอยางของคลาส Student ซึ่งสรางออปเจ็คขึ้นมาสามออปเจ็คที่
ชื่อ s1, s2 และ s3 เปนตน
4.1.3 คุณลักษณะ
คุณลักษณะของออปเจ็คคือขอมูลที่เก็บอยูในออปเจ็ค ซึ่งจะแบงออกเปนสองประเภท
คือตัวแปร (variable) และคาคงที่ (constant) โดยที่คุณลักษณะที่เปนตัวแปรจะสามารถเปลี่ยน
คาได สวนคุณลักษณะที่เปนคาคงที่จะไมสามารถเปลี่ยนคาได รูปที่ 4.2 แสดงตัวอยางของ
ออปเจ็ค s1,s2 และ s3 ที่เปนออปเจ็คของคลาส Student ซึ่งมีคุณลักษณะของออปเจ็คที่
เปนรหัส ชื่อ และคะแนนเฉลี่ยสะสมที่ตางกัน โดยกําหนดในคาของตัวแปร id, name และ
gpa ตามลําดับ
(ก) คุณลักษณะของออปเจ็ค
4.1.4 เมธอด
เมธอดเปนวิธีการหรือการกระทําที่นิยามอยูในคลาสหรือออปเจ็คเพื่อใชในการจัดการ
กับคุณลักษณะของออปเจ็คหรือคุณลักษณะของคลาสอาทิเชน ออปเจ็คชนิดบัญชีเงินฝากอาจ
มีคุณลักษณะ balance เพื่อเก็บยอดเงินคงเหลือที่อยูในบัญชี และอาจมีเมธอด
deposit()เพื่อเปนวิธีการในการฝากเงินใหกับออปเจ็ค ในเมธอดจะมีคําสั่งเพื่อจัดการกับ
วิธีการฝากเงินและจะทําการปรับเปลี่ยนคาของคุณลักษณะ balance เราสามารถ
เปรียบเทียบเมธอดไดกับฟงกชัน Procedure หรือ Subroutine ของโปรแกรมเชิงกระบวนการ
การเขียนโปรแกรมเชิงออปเจ็คจะกําหนดใหออปเจ็คตางๆสื่อสารกัน โดยการผาน
ขาวสาร (message) ระหวางออปเจ็คที่เปนผูสง (Sender) กับออปเจ็คที่เปนผูรับ (Receiver)
โดยการเรียกใชเมธอดอาทิเชน รูปที่ 4.4 แสดงตัวอยางของการสงขาวสารจากออปเจ็ค objA
ที่เปนผูสง เพื่อเรียกการทํางานของเมธอด method4() ของออปเจ็ค objB ที่เปนผูรับ การ
สงขาวสารระหวางกันอาจมีการสงขอมูลจาก objA ผานไปยัง objB โดยผานทาง argument
4.2 การเขียนโปรแกรมเชิงออปเจ็คโดยใชภาษาจาวา
4.2.1 การประกาศคลาส
โปรแกรมภาษาจาวาแตละโปรแกรมจะประกอบไปดวย คลาสอยางนอยหนึ่งคลาส
โดยมีรูปแบบการประกาศดังนี้
โดยที่
• modifier คือคียเวิรด (keyword) ของภาษาจาวาที่ใชเปน access modifier
เชน public หรืออธิบายคุณสมบัติอื่นๆของคลาส เชน abstract และ
final ซึ่งเปนเงื่อนไขเพิ่มเติม (option)
4.2.2 การประกาศคุณลักษณะ
คุณลักษณะของออปเจ็คคือตัวแปรหรือคาคงที่ซึ่งประกาศภายในออปเจ็ค โดยมี
รูปแบบการประกาศดังนี้
โดยที่
• modifier คือคียเวิรดของภาษาจาวาที่อธิบายคุณสมบัติตางๆของตัวแปรหรือ
คาคงที่อาทิเชน public, private, static, final และ
transient เปนตน
• dataType คือชนิดขอมูลซึ่งอาจเปนชนิดขอมูลแบบพื้นฐานหรือชนิดขอมูลแบบ
อางอิงทีจะกลาวถึงในบทตอไป
• attributeName คือชื่อของคุณลักษณะที่เปนชื่อ identifier ใดๆซึ่งสอดคลอง
กับกฎการตั้งชื่อ
ตัวอยางการประกาศคุณลักษณะ id, name และ gpa ซึ่งมีชนิดขอมูลเปน
String และ double ในคลาส Student สามารถทําไดดังนี้
public class Student {
public String id;
public String name;
public double gpa;
}
4.2.3 การประกาศเมธอด
ภาษาจาวากําหนดรูปแบบของการประกาศเมธอดที่อยูในคลาสไวดังนี้
โดยที่
• modifier คือคียเวิรดของภาษาจาวาที่เปน access modifier เชน public
หรือ private หรืออธิบายคุณสมบัติอื่นๆของเมธอดเชน abstract หรือ
static เปนตน
• return_type คือชนิดขอมูลของคาที่สงกลับหลังจากเสร็จสิ้นการทํางานของ
คําสั่งในเมธอดนี้ โดยชนิดขอมูลของคาที่สงกลับอาจเปนชนิดขอมูลแบบพื้นฐาน
หรือชนิดขอมูลแบบอางอิง ในกรณีที่ไมมีการสงคาใดๆกลับจะตองระบุชนิดขอมูล
เปน void
• methodName คือชื่อของเมธอดที่เปนชื่อ identifier ใดๆซึ่งสอดคลองกับกฎการ
ตั้งชื่อ
• arguments คือตัวแปรที่ใชในการรับขอมูลที่ออปเจ็คสงมาให โดยอาจมี
มากกวาหนึ่งตัวแปร หรือไมมีเลยก็ไดขึ้นอยูกับการกําหนดเมธอด
• method_body คือคําสั่งตางๆของภาษาจาวาที่อยูในเมธอด
โปรแกรมที่ 4.1 แสดงตัวอยางโปรแกรมภาษาจาวาที่ประกาศคลาส Student โดยมี
คุณลักษณะคือ id, name, gpa และ MIN_GPA และมีเมธอดคือ setID(),
setName(), setGPA() และ showDetails()
เมธอด main()
โปรแกรมภาษาจาวาที่เปนโปรแกรมจาวาประยุกต (Java Application) จะเริ่มตนการ
ทํางานในคลาสที่มีเมธอด main() โดยมีรูปแบบของเมธอดดังนี้
4.2.4 การประกาศและสรางออปเจ็ค
ออปเจ็คทุกออปเจ็คในโปรแกรมภาษาจาวาจะตองมีคําสั่งประกาศเพื่อระบุวาออปเจ็ค
นั้นเปนออปเจ็คของคลาสใด โดยมีรูปแบบดังนี้
โดยที่
คําสั่งในการประกาศออปเจ็คไมไดเปนคําสั่งที่ใชในการสรางออปเจ็ค คําสั่งที่ใชในการ
สรางออปเจ็คจะมีรูปแบบดังนี้
โดยที่
• objectName คือชื่อของออปเจ็ค
• new คือคียเวิรดของภาษาจาวาเพื่อใชในการสรางออปเจ็ค
• ClassName คือชื่อของคลาส
• arguments คือคาที่ตองการสงผานในการเรียกเมธอดในการสรางออปเจ็คซึ่ง
อาจมีหรือไมมีกไ็ ด
การสรางออปเจ็คโดยเรียกใชคําสั่ง new นี้จะเปนการเรียกใชเมธอดในการสราง
ออปเจ็คที่เรียกวา constructor ของคลาสนั้นๆ ซึ่งจะมีการอธิบายการทํางานของ constructor
ในบทที่ 5
ตัวอยางคําสั่งในการสรางออปเจ็ค s1 ทําไดดังนี้
s1 = new Student();
นอกจากนี้คําสั่งในการประกาศและสรางออปเจ็คสามารถที่จะรวมเปนคําสั่งเดียวกัน
ไดโดยมีรูปแบบคําสั่งดังนี้
4.2.5 การเรียกใชสมาชิกของออปเจ็ค
สมาชิกของออปเจ็คประกอบดวยคุณลักษณะและเมธอด การเรียกใชสมาชิกของ
ออปเจ็คทําไดโดยการใชเครื่องหมายจุด (.) กลาวคือคุณลักษณะของออปเจ็คสามารถเรียกใช
โดยมีรูปแบบดังนี้
objectName.attributeName;
โดยที่
• objectName คือชื่อของออปเจ็คที่สรางขึ้น
• attributeName คือชื่อของคุณลักษณะของออปเจ็คนั้น
นอกจากนี้เราสามารถที่จะสงขาวสารไปยังออปเจ็คภายหลังจากที่มีการสรางออปเจ็ค
ขึ้นมาไดโดยการเรียกใชเมธอดของออปเจ็คนั้น รูปแบบคําสั่งในการเรียกใชเมธอดมีดังนี้
objectName.methodName([arguments]);
โดยที่
• objectName คือชื่อของออปเจ็คที่สรางขึ้น
• methodName คือชื่อของเมธอดของออปเจ็คนั้น
• arguments คือคาที่ตองการสงผานไปใหกับเมธอดของออปเจ็คนั้น โดยที่
จะตองมีชนิดขอมูลและจํานวน argument ใหสอดคลองกับที่ประกาศในเมธอด
ของออปเจ็คนั้น
ตัวอยางเชน คําสั่ง
s1.setName(“Thana”);
เปนการเรียกใชเมธอด setName() ของออปเจ็ค s1 ซึ่งเปนออปเจ็คของคลาส
Student โดยจะสงผาน argument ชนิด String ที่มีคาเปนขอความ Thana ใหกับ
เมธอดดังกลาว โปรแกรมที่ 4.2 แสดงตัวอยางโปรแกรมของคลาส Sample ที่มีเมธอด
main()อยู โดยโปรแกรมนี้จะสรางออปเจ็คของคลาส Student ขึ้นมาสามออปเจ็คคือ
ออปเจ็ค s1, s2 และ s3 จากนั้นจะทําการเรียกเมธอด setName() เพื่อกําหนดคาให
4.3.1 การหอหุม
หลักการที่สําคัญประการหนึ่งของการเขียนโปรแกรมเชิงออปเจ็คคือการหอหุม ซึ่ง
คุณลักษณะของออปเจ็คจะถูกหอหุมอยูภายใน เพื่อไมใหออปเจ็คอื่นๆสามารถเขาถึงขอมูลที่
เปนคุณลักษณะไดโดยตรง การจะเรียกใชคุณลักษณะของออปเจ็คจะทําไดโดยการเรียกผาน
เมธอดเทานั้นดังแสดงในรูปที่ 4.6
ขอดีของการหอหุมคือ
• การซอนเรนขอมูล (Information Hiding) ทําใหออปเจ็คสามารถติดตอกับออปเจ็ค
ภายนอกผานเมธอดที่เปนสวนของ interface เทานั้น ซึ่งถามีการเปลี่ยนแปลง
คุณลักษณะหรือเมธอดที่อยูภายในออปเจ็ค ก็จะไมมผี ลกระทบใดๆตอออปเจ็ค
ภายนอกที่เรียกใช
• ความเปนโมดูล (Modularity) การพัฒนาโปรแกรมเชิงออปเจ็คจะสามารถ
กําหนดใหออปเจ็คแตละออปเจ็คมีความเปนอิสระตอกัน ถามีการเปลี่ยนแปลง
เกิดขึ้นภายในออปเจ็คหนึ่งก็จะไมมีผลกระทบตอออปเจ็คอื่น
เครื่องโทรศัพทเปนตัวอยางหนึ่ง ของการแสดงคุณลักษณะเดนดานการหอหุมของ
ออปเจ็ค สวนที่เปน interface ก็คือปุมของโทรศัพทที่ผูใชสามารถติดตอกับเครื่องได สําหรับ
ระบบอิเล็กทรอนิกสที่อยูในเครื่องโทรศัพทคือสวนที่เปน implementation ซึ่งผูใชไมสามารถ
มองเห็นและไมจําเปนตองเขาใจการทํางานของระบบดังกลาว และหากระบบอิเล็กทรอนิกส
ภายในเปลี่ยนแปลงไป ผูใชยงั สามารถที่จะติดตอกับเครื่องไดโดยใชปุมที่เปนสวน interface
เชนเดิม
ขอดีของการสืบทอดคือ ความสามารถในการที่จะนําโปรแกรมเดิมมาพัฒนาเพิ่มเติม
ใหมไดงายขึ้น และยังชวยทําใหโปรแกรมแตละโปรแกรมมีขนาดเล็ก ซึ่งทําใหงายตอการเขาใจ
และการปรับปรุงแกไขโปรแกรมทําไดงายขึ้น โดยในภาษาจาวาจะใชคียเวิรด extends เพื่อ
ระบุการสืบทอด โปรแกรมที่ 4.4 แสดงตัวอยางของคลาสที่ใชหลักการในการสืบทอดตาม
ไดอะแกรมของคลาสในรูปที่ 4.7
4.4.1 ไดอะแกรมของคลาส
ไดอะแกรมของคลาส (Class Diagram) เปนสัญลักษณที่ใชแสดงคลาสใน UML โดย
ไดอะแกรมของคลาสจะประกอบดวยสวนตางๆสามสวนคือ ชื่อของคลาส คุณลักษณะภายใน
คลาส และเมธอดภายในคลาส ดังแสดงในรูปที่ 4.9 ไดอะแกรมของคลาสจะระบุขอมูลตางๆ
สําหรับคุณลักษณะภายในคลาสคือ ชื่อของคุณลักษณะ ชนิดขอมูล สถานะการเขาถึง
(access modes) และคาเริ่มตน สวนเมธอดภายในคลาสจะระบุถึงสถานะการเขาถึง ชื่อของ
ไดอะแกรมของคลาสสามารถที่จะแสดงความสัมพันธของคลาส ที่มีการสืบทอดกัน
โดยการใชลูกศรเปนสัญลักษณดังแสดงตัวอยางในรูปที่ 4.7 นอกจากนี้ไดอะแกรมของคลาสยัง
สามารถที่จะแสดงความสัมพันธหรือแสดงคุณสมบัติอื่นๆเชน แสดงวาเปนคลาสแบบ
interface ไดอีกดวย
4.4.2 ไดอะแกรมของออปเจ็ค
UML สามารถที่จะแสดงใหเห็นไดวาออปเจ็คที่สรางขึ้นมาเปนออปเจ็คของคลาสใด
และมีคาของคุณลักษณะตางๆอยางไร โดยใชไดอะแกรมของออปเจ็ค (Object Diagram) ที่
ประกอบไปดวยสวนตางๆสองสวนคือ สวนที่ระบุชื่อของออปเจ็ค และสวนที่ระบุคาของ
คุณลักษณะภายในออปเจ็ค ดังตัวอยางในรูปที่ 4.10 ซึ่งเปนการแสดงออปเจ็ค s1 และ s2
ของคลาส Student จากรูปจะเห็นไดวาสัญลักษณลูกศรที่เปนเสนปะจะเปนการระบุวา
ออปเจ็ค s1 เปนออปเจ็คของคลาส Student
4.5 ขั้นตอนการพัฒนาโปรแกรม
การพัฒนาโปรแกรมคอมพิวเตอร ไมไดหมายถึงเพียงแคการเขียนโปรแกรมคําสั่ง
ภาษาคอมพิวเตอรภาษาใดภาษาหนึ่ง แตจะรวมถึงขั้นตอนทั้งหมดในการพัฒนาโปรแกรม ซึ่ง
ขั้นตอนการพัฒนาโปรแกรมนี้เรียกวา วัฎจักรการพัฒนาโปรแกรม (Software Development
Life Cycle เรียกยอวา SDLC) ซึ่งจะประกอบไปดวยขั้นตอนตางๆ 5 ขั้นตอนคือ
1. ขั้นตอนการวิเคราะห (Analysis)
2. ขั้นตอนการออกแบบ (Design)
3. ขั้นตอนการเขียนโปรแกรม (Programming)
4. ขั้นตอนการทดสอบ (Testing)
5. ขั้นตอนการทํางาน (Operation)
ซึ่งแตละขั้นตอนมักไมไดผลลัพธที่สมบูรณที่จะสามารถทําขั้นตอนตอไปได โดยไม
ตองกลับมาทําขั้นตอนเดิมอีก แตระหวางทํางานในแตละขั้นตอนอาจตองยอนกลับไปทํางานใน
ขั้นตอนอื่นๆกอนหนานั้นดังแสดงรูปที่ 4.11
สรุปเนื้อหาของบท
• โปรแกรมเชิงออปเจ็คจะมีคํานิยามที่สําคัญสองคําคือ ออปเจ็คและคลาส
• ออปเจ็คคือสิ่งตางๆที่มีอยูในชีวิตประจําวันจะประกอบไปดวยคุณลักษณะและ
เมธอด
• คลาสเปรียบเสมือนพิมพเขียวของออปเจ็ค ออปเจ็คจะถูกสรางมาจากคลาส
ออปเจ็คหลายออปเจ็คสามารถถูกสรางจากคลาสหนึ่งคลาสได
• คุณลักษณะของออปเจ็คคือขอมูลที่เก็บอยูในออปเจ็ค ซึ่งจะแบงออกเปนตัวแปร
และคาคงที่
โดยที่
• parent คือออปเจ็คของคลาส Frame ที่เปนเฟรมแม
• title คือขอความที่ตองการจะแสดงตรง title bar ของ Dialog
• isModal คือขอมูลชนิด boolean เพื่อระบุวาออปเจ็คของ Dialog มี
โหมดเปน modal หรือไม
5.4 การจัดวางผังของสวนประกอบกราฟฟก
โปรแกรม GUI ของภาษาจาวาจะจัดวางสวนประกอบกราฟฟกตางๆลงใน
ออปเจ็คของคลาสประเภท Container โดยอัตโนมัติ ทั้งนี้จะกําหนดขนาดและตําแหนงของ
สวนประกอบกราฟฟกไดโดยใชออปเจ็คของคลาสประเภท LayoutManager ซึ่ง
LayoutManager เปนอินเตอรเฟสที่ใชัในการกําหนดวิธีการจัดวางผังสวนประกอบ
กราฟฟก ภาษาจาวาไดกําหนดใหมีคลาสที่ implements อินเตอรเฟสที่ชื่อ
LayoutManager เพื่อใชเปนตัวจัดวางผังของสวนประกอบกราฟฟกทั้งหมดของคลาสคือ
1. BorderLayout
2. FlowLayout
3. GridLayout
4. CardLayout
5. GridBagLayout
การกําหนดวิธีการวางผังของออปเจ็คของคลาสประเภท Container จะทําไดโดย
การสรางออปเจ็คประเภท LayoutManager ของคลาสใดคลาสหนึ่งในหาคลาสขางตน
จากนั้นเราสามารถที่จะกําหนดการวางผังโดยการเรียกใชเมธอด setLayout() ของคลาส
ประเภท Container โดยสงผาน argument ที่เปนออปเจ็คประเภท LayoutManager ที่
สรางขึ้นมา ตัวอยางเชนคําสั่ง
Frame fr = new Frame(“Demo”);
FlowLayout fl = new FlowLayout();
fr.setLayout(fl);
เปนการกําหนดใหออปเจ็คของคลาส Frame ที่ชื่อ fr ซึ่งมีวิธีการจัดวางผังใน
รูปแบบของ FlowLayout
เนื่องจากคําสั่งในตัวอยางขางตนจะไมมีการนําออปเจ็ค fl ซึ่งเปนออปเจ็คของ
คลาส FlowLayout ไปอางอิงในคําสั่งอื่นๆ ดังนั้นเราจึงสามารถที่จะเขียนคําสั่งในการสราง
ออปเจ็คและคําสั่งกําหนดรูปแบบการวางผังภายในคําสั่งเดียวกันไดดังนี้
fr.setLayout(new FlowLayout());
โดยทั่วไปคลาสประเภท Container แตละชนิด จะมีการกําหนดวิธีการวางผังของ
ออปเจ็คของคลาสแตละชนิดไวเริ่มตนอยูแลวดังนี้
5.4.1 BorderLayout
BorderLayout เปนการจัดวางผังที่กําหนดใหสามารถวางออปเจ็คของคลาสที่
เปนสวนประกอบกราฟฟกได 5 ออปเจ็คตามตําแหนงทิศตางๆของออปเจ็คประเภท
Container 5 ตําแหนงคือ ทิศเหนือ (NORTH) ทิศใต (SOUTH) ทิศตะวันออก (EAST)
ทิศตะวันตก (WEST) และตรงกลาง (CENTER) ซึ่งออปเจ็คที่เปนสวนประกอบกราฟฟกจะ
ถูกใสในตําแหนงทิศตางๆโดยจะมีการกําหนดขนาดใหโดยอัตโนมัติ
โปรแกรมที่ 5.2 แสดงตัวอยางโปรแกรม GUI ที่ประกอบไปดวยปุม 5 ปุม โดยได
สรางออปเจ็คของคลาส Button ขึ้นมา 5 ออปเจ็คซึ่งมีชื่อเปน bn1 จนถึง bn5 และมี
ขอความบนปุมเปน B1 จนถึง B5 ตามลําดับ จากนั้นไดใสออปเจ็คชนิด Button แตละตัวลง
ไปในออปเจ็คชนิด Frame ที่ชื่อ fr โดยใชเมธอด add() ตามตําแหนงทิศตางๆ โดยที่
ออปเจ็ค bn1 จะอยูทางทิศเหนือ ออปเจ็ค bn2 จะอยูทางทิศใต ออปเจ็ค bn3 จะอยูทางทิศ
ตะวันออก ออปเจ็ค bn4 จะอยูทางทิศตะวันตก และออปเจ็ค bn5 จะอยูตรงกลาง ซึ่ง
โปรแกรมนี้จะใหผลลัพธดังแสดงในรูปที่ 5.6
การใชเมธอด add() ในกรณีที่ออปเจ็คประเภท Container มีการจัดวางผังแบบ
BorderLayout นั้น จะตองมี argument เพื่อระบุตําแหนงทิศที่ตองการวางออปเจ็คที่เปน
สวนประกอบกราฟฟกอาทิเชน คําสั่ง
fr.add(bn1,BorberLayout.NORTH);
เปนคําสั่งที่ใชในการใสออปเจ็ค bn1 ลงในออปเจ็ค fr ในตําแหนงทิศเหนือ
กรณีที่เรียกใชเมธอด add() โดยไมสงผาน argument เพื่อระบุตําแหนงทิศที่
ตองการวางออปเจ็คที่เปนสวนประกอบกราฟฟกนั้น ภาษาจาวาจะถือวาเปนการกําหนดใหใส
สวนประกอบกราฟฟกไวตําแหนงตรงกลางของออปเจ็คของคลาสประเภท Container อาทิ
เชน คําสั่ง
fr.add(bn1);
จะถือวาเปนคําสั่งเชนเดียวกับคําสั่ง
fr.add(bn1,BorderLayout.CENTER);
5.4.2 FlowLayout
FlowLayout เปนการจัดวางผังสวนประกอบกราฟฟกไวตําแหนงบนสุดของ
ออปเจ็คของคลาสประเภท Container โดยจะเรียงออปเจ็คของคลาสที่เปนสวนประกอบ
กราฟฟกจากซายไปขวา และถาความกวางของออปเจ็คของคลาสประเภท Container ใน
แตละแถวไมพอ ตัวจัดวางผังแบบ FlowLayout จะนําออปเจ็คของคลาสที่เปนสวนประกอบ
5.4.3 GridLayout
GridLayout เปนการจัดวางผังที่แบงออปเจ็คของคลาสประเภท Container
เปนชองยอยๆหลายชอง โดยแตละชองยอยจะมีขนาดความกวางและความสูงเทากัน
GridLayout จะอนุญาตใหใสออปเจ็คของคลาสที่เปนสวนประกอบกราฟฟกไดหนึ่งออปเจ็ค
ในแตละชองยอย โดยจะกําหนดใหขนาดของออปเจ็คของคลาสที่เปนสวนประกอบกราฟฟกมี
ขนาดเทากับขนาดของชองยอย การสรางตัวจัดวางผังแบบ GridLayout ทําไดโดยการ
สรางออปเจ็คของคลาส GridLayout ที่มีรูปแบบของ constructor เปนดังนี้
public GridLayout(int row, int col)
โดยที่ row และ col คือจํานวนแถวและคอลัมนที่ตองการแบงออปเจ็คของคลาส
ประเภท Container ใหเปนชองยอย
การใสออปเจ็คของคลาสที่เปนสวนประกอบกราฟฟกลงในชองยอย จะทําไดโดยการ
เรียกใชเมธอด add() เชนเดียวกัน แตในกรณีนี้โปรแกรม GUI จะใสออปเจ็คจากชองยอย
บนสุดเรียงจากซายไปขวา โดยไมสามารถที่จะขามชองยอยใดชองยอยหนึ่งได
โดยที่
• label คือขอความที่จะปรากฏอยูบนปุม
โดยที่
• text คือขอความที่ตองการแสดง
• align คือการกําหนดการวางแนว(ชิดซาย ขวา หรือตรงกลาง) ของขอความ
โดยที่
• text คือขอความเริ่มตนที่ตองการแสดง
• row และ col คือจํานวนแถวและคอลัมนของ TextArea
• scrollbar เปนการกําหนดการมี scrollbar ของ TextArea
โดยที่
• state เปนตัวกําหนดสถานะเริ่มตนของ Checkbox กรณีที่ constructor
ไมไดกําหนดสถานะเริ่มตนจะถือวามีคาเปน false (ไมถูกเลือก)
5.6 การสรางเมนู
โปรแกรมจาวาประยุกตที่มีสวนติดตอกับผูใชเปนแบบกราฟฟก สามารถที่จะมีเมนูให
ผูใชเลือกรายการได เมนูเปนออปเจ็คของคลาสที่สืบทอดมาจากคลาส MenuComponent
โดยมีลําดับชั้นของคลาสตางๆดังแสดงในรูปที่ 5.16 ซึ่งคลาสตางๆที่สําคัญมีดังนี้
• MenuBar เปนคลาสที่ใชในการสรางออปเจ็คที่เก็บกลุมของออปเจ็คของคลาส
Menu ซึ่งจะปรากฏเปนแถบเมนูโดยออปเจ็คของคลาสนี้จะตองมีออปเจ็คของ
คลาส Frame ที่คูกัน
• MenuItem เปนคลาสที่ใชในการสรางออปเจ็คที่เปนรายการ
• CheckboxMenuItem เปนคลาสที่ใชในการสรางออปเจ็คที่เปนรายการโดย
จะมีเครื่องหมายถูกที่จะแสดงขึ้นเมื่อรายการนี้ถูกเลือก
import java.awt.*;
• setFont(Font f)
• setForeground(Color c)
• setBackground(Color c)
เมธอด setFont() ใชในการกําหนดรูปแบบของฟอนต สวนเมธอด
setForeground() และ setBackground() ใชในการกําหนดสีพื้นหนาและพื้นหลัง
ตามลําดับ
คลาส Font เปนคลาสที่ใชในการสรางออปเจ็คเพื่อกําหนดรูปแบบของฟอนต โดยมี
constructor ดังนี้
• public Font(String name, int style, int size)
โดยที่
• name คือชื่อของฟอนต
• style เปนรูปแบบของฟอนต ซึ่งคลาส Font ไดกําหนดคาคงที่ไวคือ
Font.PLAIN, Font.BOLD และ Font.ITALIC
• size คือขนาดของฟอนต
ตัวอยางของการสรางออปเจ็คของคลาส Font มีดังนี้
• Font fn1 = new Font(“AngsanaUPC”,Font.PLAIN,16);
5.8.1 การเขียนคลาสเพื่อวาดรูปกราฟฟก
การสรางภาพกราฟฟกในภาษาจาวา จะทําไดโดยการสรางคลาสที่เปนสวนกราฟฟก
ซึ่งสืบทอดมาจากคลาส Canvas แลว override เมธอด paint() โดยเขียนคําสั่งในการวาด
รูปกราฟฟกตางๆในเมธอด ตัวอยางเชน โปรแกรมที่ 5.17 แสดงตัวอยางของคลาส
MyCanvas ซึ่งจะลากเสนตรงจากพิกัด (coordinate) (10,10) ไปยังพิกัด (100,100)
import javax.swing.*;
import java.awt.*;
5.10.3 การใชคุณลักษณะเดนอื่นๆ
แพคเก็จ Swing ยังมีเมธอดอื่นๆที่ใชในการกําหนดรูปลักษณและคุณลักษณะเดนของ
ออปเจ็คที่เปนสวนประกอบกราฟฟกตางๆเพิ่มเติมอาทิเชน
• void setMnemonic(char c) หรือ
• void setMnemonic(int i)
เปนเมธอดในการกําหนดคียที่เปน shortcut ใหกับออปเจ็คของคลาส JButton
• void setIcon(Icon c)
สรุปเนื้อหาของบท
• คลาสที่อยูในแพคเก็จ java.awt สามารถนํามาใชสรางโปรแกรม GUI แบบ Look
and Feel ตามแพลตฟอรมที่ใชงานได โดยมีคลาส Component เปน superclass
ของทุกคลาสที่เปนคลาสประเภท Container และคลาสประเภทสวนประกอบกราฟฟก
• คลาสประเภท Container ที่สําคัญคือคลาส Frame และ Panel
• คลาสประเภทสวนประกอบกราฟฟกที่สําคัญคือ Button, Label, TextField,
TextArea, Checkbox, Choice และ List
• รูปแบบการจัดวางผังสวนประกอบกราฟฟกในตัวใสสวนประกอบกราฟฟกมีทั้งหมด 5
รูปแบบคือ BorderLayout, FlowLayout, GridLayout, CardLayout
และ GridBagLayout
• การจัดวางผังของสวนประกอบกราฟฟกแบบ BorderLayout จะเปนการวางตาม
ทิศตางๆได 5 ทิศ สวน FlowLayout จะวางไวในตําแหนงบนสุดโดยเรียงจากซาย
ไปขวา สําหรับ GridLayout จะวางเรียงจากซายไปขวา และบนลงลางในชองยอย
ที่มีขนาดเทากัน ตามจํานวนแถวและคอลัมนที่ไดระบุไว
• Label จะแสดงขอความ ซึ่งผูใชไมสามารถปอนขอความได แตสําหรับ
TextField ผูใชสามารถปอนขอความไดยาวหนึ่งบรรทัด สวน TextArea ผูใช
สามารถปอนขอความไดหลายบรรทัด
6.1 เมธอด
เมธอดเปนสมาชิกของคลาสเพื่อระบุ วิธีการหรือพฤติกรรม ที่ออปเจ็คของคลาส
สามารถกระทําได เมธอดทําหนาที่ในการสงขาวสารระหวางออปเจ็ค ซึ่งเปรียบเทียบไดกับการ
ใช function หรือ procedure ที่อยูในโปรแกรมเชิงกระบวนการ ตัวอยางโปรแกรมในบทที่
ผานมาจะเขียนทุกคําสั่งอยูภายในเมธอด main() การเขียนโปรแกรมเชิงออปเจ็คที่ดีจะตอง
มีการกําหนดเมธอดตางๆใหกับคลาส และมีการสรางออปเจ็คของคลาส แลวจึงจะเรียกใช
เมธอดที่สรางขึ้นตัวอยางเชน โปรแกรมที่ 6.1 เปนโปรแกรมที่มีการเขียนคําสั่งทั้งหมดอยูใน
เมธอด main() โปรแกรมนี้ไมไดใชหลักการเชิงออปเจ็คและไมเหมาะที่จะนําไปใชในทาง
ปฏิบัติเมื่อโปรแกรมมีขนาดใหญขึ้น
เราสามารถเขียนโปรแกรมที่ 6.1 ใหมโดยใชหลักการเชิงออปเจ็คดังโปรแกรมที่ 6.2
โดยกําหนดใหมีคลาสสองคลาส คลาสแรกชื่อ NumericalClass จะมีเมธอด
calculate() ซึ่งจะมีคําสั่งตางๆที่อยูในบล็อกของเมธอด main() ของโปรแกรมที่ 6.1
สวนอีกคลาสชื่อ MyMain เปนคลาสที่กําหนดเพื่อเปนจุดเริ่มตนของโปรแกรม โดยมี เมธอด
main() อยูในคลาส ซึ่งเมธอด main()จะสรางออปเจ็คของคลาส NumericalClass
และมีคําสั่งเรียกใชเมธอด calculate() ในขณะเดียวกันเราก็สามารถที่จะเขียนโปรแกรม
โดยใชหลักการเชิงออปเจ็คโดยกําหนดเมธอด main() ใหอยูภายในคลาสเดียวกันกับคลาสที่
ตองการสรางออปเจ็คได โดยจะมีรูปแบบดังโปรแกรมที่ 6.3
6.1.1 การเรียกใชเมธอด
เมธอดที่กําหนดขึ้นในคลาสใดๆสามารถเรียกใชงานไดสองรูปแบบคือ
1. การเรียกใชงานจากคลาสที่ตางกัน
2. การเรียกใชงานภายในคลาสเดียวกัน
การเรียกใชเมธอดจากคลาสที่ตางกัน จะตองมีการสรางออปเจ็คของคลาสที่มีเมธอด
ที่จะถูกเรียกใชงานกอน จึงจะสามารถเรียกใชเมธอดได ดังตัวอยางในโปรแกรมที่ 6.2 คลาส
MyMain จะตองสรางออปเจ็คของคลาส NumericalClass กอน จึงจะเรียกใชงานเมธอด
calculate() ได โดยใชคําสั่ง
NumericalClass obj = new NemericalClass();
argument ของเมธอดจะมีชนิดขอมูลเปนสองแบบตามชนิดขอมูลของตัวแปรดังนี้
1. argument ที่มีชนิดขอมูลแบบพื้นฐาน
2. argument ที่มีชนิดขอมูลแบบอางอิง
ในกรณีของ argument ที่มีชนิดขอมูลแบบพื้นฐาน เราสามารถที่จะสงคาคงที่ขอมูล
ตัวแปร หรือนิพจนใหกับ argument ไดอาทิเชน การเรียกใชเมธอด setGPA() นั้น
argument ที่จะสงผานอาจมีรูปแบบเปน
• คาคงที่ขอมูล เชน
s1.setGPA(3.0);
import java.util.*;
6.1.3 การรับคาที่สงกลับมา
เมธอดใดๆของคลาสสามารถที่จะมีคาที่สงกลับมาได ทั้งนี้การประกาศเมธอดจะตอง
ระบุชนิดขอมูลของคาที่จะสงกลับใน return_type ซึ่งชนิดขอมูลของคาที่จะสงกลับอาจเปน
ชนิดขอมูลแบบพื้นฐาน หรือเปนชนิดขอมูลแบบอางอิง ในกรณีที่เมธอดไมมีขอมูลจะสงกลับมา
จะตองระบุให return_type เปน void อาทิเชน เมธอด setGPA() ในคลาส student
ของโปรแกรมที่ 6.5 นอกจากนี้เมธอดที่มีคาที่จะสงกลับมาจะตองมีคําสั่ง return ซึ่งจะระบุ
คาที่สงกลับโดยมีรูปแบบดังนี้
return value;
access modifier
modifier ประเภทนี้ใชเพื่อระบุระดับการเขาถึง โดยมีคียเวิรดตางๆดังนี้
• public
• protected
โดยที่
• dataType คือชนิดขอมูลของคุณลักษณะที่ตองการกําหนดคา
this.methodName();
this.attirbuteName;
6.3 การเขียนโปรแกรมโดยใชหลักการของการสืบทอด
ขอดีของการสืบทอดคือ การนําคลาสที่มีอยูแลวมาใชใหมโดยการเพิ่มเติมคุณลักษณะ
หรือเมธอดในคลาสใหม เพื่อใหเขาใจหลักการของการสืบทอดใหพิจารณาตัวอยางของคลาส
Student ทีก ่ ําหนดไวในโปรแกรมที่ 6.16 ซึ่งถาหากจําเปนที่จะตองพัฒนาคลาสขึ้นใหมที่
ชื่อ GradStudent เพื่อใชในการสรางออปเจ็คที่เปนนักศึกษาระดับบัณฑิตศึกษานั้น เรา
สามารถที่จะเลือกวิธีการไดสองแบบคือ
1. สรางคลาสขึ้นมาใหมโดยไมอางอิงกับคลาสเดิมที่ชื่อ Student ดังโปรแกรมที่
6.17
2. สรางคลาสที่สืบทอดมาจากคลาสเดิมที่ชื่อ Student ดังโปรแกรมที่ 6.18
การสรางคลาสขึ้นใหมตามโปรแกรมที่ 6.17 นั้นจะเห็นไดวามีความซ้ําซอนในการ
กําหนดคุณลักษณะและเมธอดของคลาส นอกจากนี้ยังจะทําใหเกิดความยุงยากในการแกไข
protected √ √ √
default √ √
Private √
super.methodName([arguments])
6.4 การมีไดหลายรูปแบบ
การมีไดหลายรูปแบบหมายถึงคุณสมบัติของออปเจ็คของคลาสที่ตางกัน ที่สามารถจะ
กําหนดคาไดหลายรูปแบบ หรือการตอบสนองตอเมธอดเดียวกันดวยวิธีการที่ตางกันได
หลักการของการมีไดหลายรูปแบบเปนหลักการที่สืบเนื่องมาจากหลักการของการสืบทอด
เมธอดแบบ Overloaded
ภาษาจาวาอนุญาตใหคลาสใดๆ มีเมธอดที่ชื่อเดียวกันมากกวาหนึ่งเมธอดได แต
เมธอดเหลานั้นจะตองมีจํานวนหรือชนิดขอมูลของ argument ที่ตางกัน โปรแกรมที่ 6.21 เปน
ตัวอยางของการเขียนเมธอดแบบ overloaded โดยเมธอด setDetails() จะมีสองเมธอด
เมธอดแรกจะรับ argument ที่มีสองตัว และเมธอดที่สองจะรับ argument ที่มีสามตัว ซึ่ง
คอมไพเลอรจะพิจารณาวาโปรแกรมเรียกใชเมธอดใดโดยดูจากจํานวนและชนิดของ argument
ทั้งนี้เมธอดแบบ overloaded อาจมีคาที่สงกลับมาเปนชนิดเดียวกันหรือตางกันก็ได
เมธอดแบบ Overridden
การกําหนดเมธอดแบบ overridden เปนหลักการที่สืบเนื่องมาจากหลักการของการ
สืบทอด โดยคลาสที่เปน subclass สามารถที่จะเขียนเมธอดของ superclass ขึ้นใหมได
วิธีการนี้เรียกวา เมธอดใน subclass เปนเมธอดแบบ overridden การเขียนเมธอดแบบ
overridden มีขอกําหนดดังนี้
• จํานวนและชนิดขอมูลของ argument จะตองเหมือนเดิม
• ชนิดขอมูลของคาที่สงกลับจะตองเหมือนเดิม
• access modifier จะตองไมมีระดับต่ํากวาเดิมอาทิเชน ถาเมธอดเดิมเปน
public จะไมสามารถเปลี่ยนเปน private ได
(ClassName) objectName
โดยที่
• ClassName คือชนิดของคลาสที่ตองการระบุ
• objectName คือชื่อของตัวแปรของออปเจ็ค
ตัวอยางที่ผานมาสามารถเขียนใหมไดเปน
Student s1 = new GradStudent();
GradStudent s2 = (GradStudent) s1;
จึงจะทําใหโปรแกรมสามารถคอมไพลผานได เชนเดียวกับคําสั่งในหัวขอ 6.4.2 ที่เปน
ตัวอยางของการเรียกใชเมธอด ก็จะสามารถเขียนใหมไดเปน
Student s1 = new GradStudent();
((GradStudent) s1).getSupervisor();
จึงจะทําใหโปรแกรมสามารถคอมไพลผานได จากตัวอยางขางตนออปเจ็ค s1 จะถูก
กําหนดใหเปนคลาสชนิด GradStudent ที่มีเมธอด getSupervisor()
ภาษาจาวาจะตรวจสอบชนิดของออปเจ็คในชวงของการรันโปรแกรม ดังนั้นถึงแมวา
โปรแกรมจะคอมไพลผานได แตถาเกิดตรวจสอบพบวาออปเจ็คที่ทําการ casting ไมใช
ออปเจ็คของคลาสนั้นหรือออปเจ็คของ subclass โปรแกรมจะไมสามารถรันผานได
ตัวอยางเชน0
Student s1 = new Student();
GradStudent s2 = (GradStudent) s1;
จะเปนคําสั่งที่ทําใหเกิดขอผิดพลาดในชวงของการรันโปรแกรม เนื่องจากตัวแปร s1
ถูกกําหนดคาใหเปนออปเจ็คของ superclass ซึ่งไมสามารถทําได เชนเดียวกับการเรียกใช
เมธอดของออปเจ็คที่ทําการ casting ภาษาจาวาจะตรวจสอบชนิดของออปเจ็คในชวงของการ
รันโปรแกรม วาออปเจ็คดังกลาวเปนออปเจ็คของคลาสใด และคลาสนั้นมีเมธอดที่เรียกใช
หรือไม หากไมพบก็จะเกิดขอผิดพลาดในชวงของการรันโปรแกรม ตัวอยางเชน
Student s1 = new Student();
((GradStudent) s1).getSupervisor();
[modifier] ClassName([arguments]) {
[statements]
}
public ClassName() {
}
ขั้นตอนการทํางานของ Constructor
ออปเจ็คของคลาสใดๆจะถูกสรางขึ้นเมื่อมีการเรียกใชคําสั่ง new ตามขั้นตอนการ
ทํางานที่ไดกลาวผานมาแลว โดยขั้นตอนสุดทายเปนการเรียกใช constructor ซึ่งจะมีขั้นตอน
การทํางานที่ตองพิจารณาเพิ่มเติมดังนี้
6.8 คียเวิรดอื่นๆที่สําคัญ
ภาษาจาวาไดกําหนดคียเวิรดที่เกี่ยวของกับคลาส เมธอดและคุณลักษณะที่สําคัญไว
สองตัวคือ static และ final คียเวิรด static เปนคียเวิรดเพื่อระบุวาตัวแปรหรือ
คาคงที่ใดเปนคุณลักษณะของคลาสหรือเมธอดใดเปนเมธอดของคลาส สวนคียเวิรด final
จะใชในคลาส และเมธอดเพื่อกําหนดไมใหมกี ารสืบทอด หรือใชในคุณลักษณะเพื่อกําหนดให
เปนคาคงที่
ClassName.methodName()
โดยที่
• className คือชื่อของคลาส
• methodName คือชื่อของเมธอดแบบ static
ตัวอยางของเมธอดแบบ static คือเมธอดทุกเมธอดในคลาส Math ที่อยูใน
Java API ทั้งนี้เนื่องจากเมธอดเหลานี้จัดวาเปนเมธอดสําหรับใชงานทั่วไปจึงกําหนดใหเปน
เมธอดแบบ static ทําใหเราสามารถที่จะเรียกใชเมธอดเหลานี้ไดโดยใชชื่อคลาส เชนคําสั่ง
Math.sqrt(4);
เปนคําสั่งคํานวณหาคารากที่สองของ 4 เปนตน
เมธอดที่ชื่อ main()เปนอีกตัวอยางหนึ่งของเมธอดแบบ static ทั้งนี้เนื่องจาก
ภาษาจาวาไมตองการให JVM ตองสรางออปเจ็คของคลาสที่มีเมธอด main() ขึ้นมากอน
เพื่อรันเมธอด main() จึงไดกําหนดให main() เปนเมธอดแบบ static
ภาษาจาวาไดกําหนดเงื่อนไขของเมธอดแบบ static ที่สําคัญไวดังนี้
• เมธอดแบบ static จะไมสามารถเรียกคุณลักษณะหรือเมธอดที่ไมไดเปน
แบบ static (non-static) ได
• เมธอดแบบ static จะไมสามารถมีเมธอดแบบ overridden ได
6.9.2 อินเตอรเฟส
อินเตอรเฟส (interface) มีลักษณะคลายกับคลาสแบบ abstract แตจะ
ประกอบดวยเมธอดที่ยังไมสมบูรณเทานั้น โดยมีรูปแบบดังนี้
โดยที่
• InterfaceName คือชื่อของอินเตอรเฟส
• methods() เปนเมธอดที่ยังไมสมบูรณ เชนเดียวกับเมธอดแบบ abstract
แตไมตองใชคียเวิรด abstract
โปรแกรมที่ 6.35 แสดงตัวอยางของอินเตอรเฟส Student อินเตอรเฟสนี้จะมี
เมธอด 4 เมธอดที่ยังไมมีบล็อกคําสั่งคือเมธอด setID(), setName(), setGPA()
และ showDetails()
อินเตอรเฟสกําหนดขึ้นมาเพื่อใหคลาสอื่นนําไปใชงานโดยใชคียเวิรด implements
โดยมีรูปแบบดังนี้
6.10 คลาสภายใน
คลาสภายใน (Inner class) คือคลาสที่ประกาศอยูภายในคลาสอื่นๆ ซึ่งบางครั้ง
เรียกวาคลาสแบบซอน (nested class) คลาสภายในอนุญาตใหประกาศคุณลักษณะหรือ
เมธอดภายในคลาสอื่นได คลาสภายในมีประโยชนในกรณีที่ตองการจะจัดกลุมของคลาสที่ตอง
6.10.1 คลาสภายในที่อยูภายในคลาส
กรณีนี้เปนการประกาศคลาสภายในคลาสอื่นที่เรียกวา คลาสภายนอก (Outer class)
โปรแกรมที่ 6.37 เปนตัวอยางของการประกาศคลาสภายในที่ชื่อ Inner ซึ่งถูกประกาศอยู
ภายในคลาสที่ชื่อ Outer คลาสภายในจะแตกตางกับคลาสทั่วๆไปตรงที่เราสามารถที่จะ
ประกาศใหคลาสภายในมี access modifier เปน public, private, default หรือ
protected ก็ได ขณะที่คลาสทั่วๆไปจะกําหนดใหเปนไดเฉพาะ public หรือ default
เทานั้น นอกจากนี้การสรางออปเจ็คของคลาสภายในยังมีขอแตกตางดังนี้
1. การสรางออปเจ็คของคลาสภายในนอกคลาสภายนอก จะตองทําการสราง
ออปเจ็คของคลาสภายนอกกอน แลวจึงสรางออปเจ็คของคลาสภายในได
ตัวอยางเชนคําสั่ง
Outer.Inner in2 = new Outer().new Inner();
ในโปรแกรมที่ 6.37 เปนตัวอยางการสรางออปเจ็คของคลาสภายในที่ชื่อ in2
(กรณีนี้จะไมสามารถสรางออปเจ็คของคลาสภายในได ถาคลาสภายในมี
modifier เปน private)
2. การสรางออปเจ็คภายในเมธอดที่อยูในคลาสภายนอกสามารถทําไดโดยตรง เชน
เดียวกับการสรางออปเจ็คทั่วๆไป ตัวอยางเชนถาเมธอด methodX() เปน
เมธอดในคลาสภายนอก และตองการจะสรางออปเจ็คของคลาสภายใน เรา
สามารถทําไดดังนี้
public void methodX() {
...
Inner in1 = new Inner();
}
คลาสที่อยูภายในสามารถที่จะเรียกใชคุณลักษณะ และเมธอดของคลาสภายนอกได
โปรแกรมที่ 6.37 แสดงตัวอยางของการเรียกใชและประกาศตัวแปรของคลาสภายในและ
ภายนอก ตัวอยางนี้จะมีตัวแปรชื่อเดียวกันซึ่งมีขอบเขตที่ตางกัน
6.10.2 คลาสภายในที่อยูภายในเมธอด
กรณีนี้เปนการประกาศคลาสภายในที่อยูภายในเมธอดของคลาสภายนอกดังตัวอยาง
ที่แสดงในโปรแกรมที่ 6.38 คลาสภายในประเภทนี้จะมี access modifier เปน default เราจะไม
สามารถที่จะสรางออปเจ็คของคลาสภายในประเภทนี้นอกเมธอดที่ประกาศคลาสได และจะ
สามารถเรียกใชตัวแปรภายในของเมธอดไดในกรณีที่ตัวแปรนั้นประกาศเปน final เทานั้น
สวนตัวแปรที่เปนคุณลักษณะของคลาสหรือคุณลักษณะของออปเจ็ค สามารถที่จะเรียกใชได
เชนเดียวกับคลาสภายในที่อยูภายในคลาส
คลาสภายในทั้งสองประเภทยังมีคุณสมบัติอื่นๆที่สําคัญดังนี้
• คลาสภายในอาจเปนคลาสแบบ abstract หรืออินเตอรเฟสได
• คลาสภายในที่อยูภายในคลาสภายนอกโดยตรง ถามี modifier เปน static จะ
กลายเปนคลาสปกติ และสามารถสรางออปเจ็คโดยการเรียกชื่อของคลาส
ภายนอกไดดังนี้
Outer.Inner in3 = Outer.new Inner();
• คลาสภายในไมสามารถที่ประกาศใหมีคุณลักษณะหรือเมธอดเปนแบบ static
ไดเวนแตคลาสภายในจะเปนคลาสแบบ static
6.11 แพคเก็จ
แพคเก็จจะเปนที่รวบรวมคลาสและอินเตอรเฟสตางๆที่มีหนาที่การทํางานคลายกันไว
ในที่เดียวกัน โดยทั่วไปโปรแกรมภาษาจาวาจะประกอบไปดวยคลาสหลายคลาสที่ประกาศอยู
ในโปรแกรมไฟลตางๆ ไฟลโปรแกรมภาษาจาวาแตละไฟลอาจมีคลาสที่ประกาศไวหลายคลาส
ได แตจะมีคลาสที่มี access modifier เปน public ไดเพียงคลาสเดียว ซึ่งวิธีการปฏิบัติที่
นิยมใชคือการกําหนดใหในแตละโปรแกรมไฟลมีคลาสเพียงคลาสเดียว โดยมีชื่อไฟลเปนชื่อ
เดียวกับชื่อคลาส
การจัดระบบไฟลและคลาสจึงจําเปนอยางยิ่งสําหรับการพัฒนาโปรแกรมขนาดใหญ
เราสามารถที่จะแบงโปรแกรมใหเปนแพคเก็จตางๆ โดยจัดกลุมของคลาสที่ทํางานคลายกันไว
ในแพคเก็จเดียวกัน แพคเก็จแตละแพคเก็จจะใชในการเก็บคลาสหรือแพคเก็จยอยได
ซึ่งโปรแกรมจาวาจะสรางไดเร็กทอรี่ (Directory) ที่มีชื่อเดียวกับแพคเก็จ ในการเก็บคลาสหรือ
แพคเก็จยอยเหลานั้น รูปที่ 6.10 แสดงตัวอยางโครงสรางไดเร็กทอรี่ของโปรแกรมที่มีคลาส
และแพคเก็จหลายๆตัว โปรแกรมจะอยูในแพคเก็จ faculty ซึ่งจะประกอบดวย
6.11.1 การประกาศและใชแพคเก็จ
โครงสรางโปรแกรมไฟลของภาษาจาวาจะประกอบดวยคําสั่งดังนี้
[<package_declaration>]
[<import_declaration>]
[<class_declaration>]
โดยที่
• package_declaration เปนการระบุวาโปรแกรมไฟลอยูในแพคเก็จใด
• import_declaration เปนคําสั่งในการเรียกใชแพคเก็จอื่นๆ
• class_declaration เปนคําสั่งในการประกาศคลาส
package <package_name>[<sub_package_name>]
ตัวอยางเชน
package faculty.domain;
หรือ package faculty;
import <package_name>[.<sub_package_name>].<Class_name>
หรือ
import <package_name>[.<sub_package_name>].*;
ตัวอยางเชน
import faculty.reports.Report;
หรือ import java.awt.*;
สรุปเนื้อหาของบท
• คลาสจะประกอบไปดวยคุณลักษณะและเมธอด
• การเขียนโปรแกรมเชิงออปเจ็คเปนการแบงโปรแกรมออกเปนโมดูลยอยๆ ทําให
สามารถปรับเปลี่ยนแกไขโปรแกรมไดงายขึ้น
• เมธอดที่กําหนดขึ้นในคลาสใดๆสามารถเรียกใชงานไดสองรูปแบบคือ การเรียก
ใชงานจากคลาสที่ตางกัน และการเรียกใชงานภายในคลาสเดียวกัน
• เมธอดที่กําหนดขึ้นในคลาสอาจมี argument ที่รับคาเพื่อนําไปใชในเมธอด
7.1 เหตุการณ
เหตุการณ (Event) เปนสถานการณที่เกิดขึ้นในขณะรันโปรแกรม อาทิเชน การใช
อินพุต (เมาสหรือคียบอรด) ติดตอกับโปรแกรม GUI การเกิดเหตุการณในโปรแกรมภาษา
จาวาจะเปนการสรางออปเจ็คของคลาสประเภท Event ชนิดตางๆขึ้นมาตามประเภทของ
เหตุการณ อาทิเชน
- เมื่อเลื่อนเมาสในเฟรมจะเกิดออปเจ็คของคลาส MouseEvent ขึ้นมา
- เมื่อปดเฟรมจะเกิดออปเจ็คของคลาส WindowEvent ขึ้นมา
- เมื่อกดปุมที่อยูในเฟรมจะเกิดออปเจ็คของคลาส ActionEvent ขึ้นมา
- เมื่อพิมพขอความใน TextField จะเกิดออปเจ็คของคลาส KeyEvent
ขึ้นมา
คลาสประเภท Event จะสืบทอดมาจากคลาส ObjectEvent สวนคลาสประเภท
Event สําหรับเหตุการณทางกราฟฟกจะสืบทอดมาจากคลาส AWTEvent ที่
สืบทอดมาจากคลาส ObjectEvent อีกตอหนึ่ง ซึ่งคลาสประเภท Event สําหรับ
เหตุการณทางกราฟฟกทั้งหมดจะอยูในแพคเก็จ java.awt.event โดยสามารถแสดง
ลําดับชั้นของการสืบทอดไดดังแสดงในรูปที่ 7.1
7.2 AWTEvent
คลาส AWTEvent เปน superclass ของคลาสประเภท Event สําหรับเหตุการณ
ทางดานกราฟฟกซึ่งจะมีอยูทั้งหมด 11 คลาสคือ ActionEvent,
AdjustmentEvent, ComponentEvent, ItemEvent, TextEvent,
FocusEvent, WindowEvent, InputEvent, ContainerEvent,
KeyEvent และ MouseEvent ดังแสดงในรูปที่ 7.1 เนื้อหาในบทนี้จะกลาวถึงเมธอดของ
คลาสประเภท AWTEvent ที่สําคัญเทานั้น ซึ่งคลาส AWTEvent และคลาส
ObjectEvent มีเมธอดที่สําคัญดังนี้
7.2.1 ActionEvent
ออปเจ็คของคลาส ActionEvent จะถูกสรางขึ้นในกรณีที่มีเหตุการณเกิดขึ้นใน
โปรแกรม GUI ดังนี้
• เมื่อมีการคลิกเมาสบนปุม (ออปเจ็คของคลาส Button)
• เมื่อมีการปอนคีย Enter ใน TextField
• เมื่อมีการเลือกรายการในเมนูของ MenuItem
• เมื่อมีการกดดับเบิ้ลคลิก (double click) ใน List
คลาส ActionEvent มีเมธอดที่เกี่ยวของดังนี้
• String getActionCommand()
เปนเมธอดที่จะสงชื่อคําสั่งที่เกิดขึ้นจาก ActionEvent ทั้งนี้คําสั่งของ
ActionEvent จะกําหนดขึน ้ โดยออปเจ็คของ Event Source ในกรณีที่เปน
ออปเจ็คของคลาส Button หรือ MenuItem ก็จะคือขอความ (label) ที่
ปรากฏบนปุมหรือเมนู นอกจากนี้เราสามารถที่จะกําหนดชื่อคําสั่งของออปเจ็ค
ของคลาส Button หรือ MenuItem ใหแตกตางจากขอความที่ปรากฏไดโดย
ใชเมธอด setActionCommand()
• int getModifiers()
เปนเมธอดที่จะสงสถานะของคีย Modifier (คีย Alt, Ctrl, Meta และ Shift) ที่เกิด
จากออปเจ็คของคลาส ActionEvent เมธอดนี้จะสงชนิดขอมูลแบบ int ที่มี
คาคงที่คืนมาคือ ALT_MASK, CTRL_MASK, META_MASK และ
SHIFT_MASK
7.2.3 MouseEvent
ออปเจ็คของคลาส MouseEvent จะถูกสรางขึ้นในกรณีที่มีการใชงานเมาสเพื่อ
ติดตอกับผูใชโดยมีเหตุการณที่เกิดขึ้นไดดังนี้
• dragged เปนเหตุการณที่เกิดขึ้นเมื่อมีการเลื่อนเมาสแลวกดปุมของเมาสพรอม
กัน
• moved เปนเหตุการณที่เกิดขึ้นเมื่อมีการเลื่อนเมาส
• clicked เปนเหตุการณที่เกิดขึ้นเมื่อมีการคลิกเมาส
• entered เปนเหตุการณที่เกิดขึ้นเมื่อมีการเลื่อนเมาสเขาไปในขอบเขตของ
ออปเจ็คของคลาสที่เปนสวนประกอบกราฟฟกใดๆ
• exited เปนเหตุการณที่เกิดขึ้นเมื่อตําแหนงของเมาสอยูนอกขอบเขตของ
ออปเจ็คของคลาสที่เปนสวนประกอบกราฟฟกใดๆ
• pressed เปนเหตุการณที่เกิดขึ้นเมื่อมีการกดปุมบนเมาส
7.2.4 ItemEvent
ออปเจ็คของคลาส ItemEvent จะถูกสรางขึ้นในกรณีที่มีเหตุการณเกิดขึ้นใน
โปรแกรม GUI ดังนี้
• เมื่อมีการเลือกหรือยกเลิกรายการใน List หรือ Checkbox
• เมื่อมีการคลิกเมาสในรายการใน Choice
คลาส ItemEvent มีเมธอดที่สําคัญดังนี้
• ItemSelectable getItemSelectable()
เปนเมธอดที่จะสงออปเจ็คของคลาสประเภท ItemSelectable ที่เปน
Event Source คืนมา
• Object getItem()
เปนเมธอดที่จะสงออปเจ็คของรายการที่ถูกเลือกคืนมา
• int getStateChange()
เปนเมธอดที่จะสงคาคงที่ชนิด int ที่มีคาเปน SELECTED หรือ
DESELECTED เพื่อระบุสถานการณเลือกของรายการคืนมา
• MouseListener เปนอินเตอรเฟสสําหรับออปเจ็คของคลาส
MouseEvent
• MouseMotionListener เปนอินเตอรเฟสสําหรับออปเจ็คของคลาส
MouseEvent
• TextListener เปนอินเตอรเฟสสําหรับออปเจ็คของคลาส TextEvent
• WindowListener เปนอินเตอรเฟสสําหรับออปเจ็คของคลาส
WindowEvent
7.4 การจัดการกับเหตุการณ
ภาษาจาวาจะมีวิธีการจัดการกับเหตุการณที่เรียกวา Delegation Model โดยจะมี
หลักการดังนี้
การเขียนโปรแกรมเพื่อจัดการกับเหตุการณสามารถที่เขียนคลาสที่เปน Event
Handler ไดหลายรูปแบบดังนี้
• กําหนดคลาสภายนอกคลาสที่ใชในการจัดการเหตุการณ
• กําหนดคลาสที่เปนคลาสภายในอยูในคลาสที่ใชในการจัดการเหตุการณ
7.4.1 การสรางออปเจ็คของคลาสภายนอก
โปรแกรมที่ 7.1 แสดงตัวอยางการจัดการกับเหตุการณที่เกิดจากการกดปุม โดย
กําหนดคลาส ActionHandler ใหเปนคลาสประเภท Event Handler ซึ่งคลาสนี้จะอยู
ภายนอกคลาส EventDemo1 ซึ่งเปนคลาสที่ใชในการจัดการกับเหตุการณการกดปุม คลาส
EventDemo1 จะมีออปเจ็คของคลาส Button ที่ชื่อ bn1 ออปเจ็ค bn1 ไดลงทะเบียน
รับฟงเหตุการณ ActionEvent โดยใชคําสั่ง
bn1.addActionListener(new ActionHandler())
โดยที่คําสั่ง new เปนการสรางออปเจ็คของคลาส
ActionHandler()
ActionHandler ที่จะทําหนาที่เปน Event Handler ดังนั้นคลาส ActionHandler
จะตอง implements อินเตอรเฟส ActionListener โดยมีเมธอดเดียวที่จะตองเขียน
บล็อกคําสั่งคือ
public void actionPerformed(ActionEvent ev)
ซึ่งผลลัพธที่ไดจากการรันโปรแกรมที่ 7.1 จะไดดังแสดงในรูปที่ 7.3
7.4.2 การสรางออปเจ็คของคลาสภายใน
โปรแกรมที่ 7.2 แสดงตัวอยางการจัดการกับเหตุการณที่เกิดขึ้นจากการเลื่อนเมาส
โดยกําหนดคลาสประเภท Event Handler ใหอยูภายในคลาสที่ตองการจัดการกับเหตุการณ
จากตัวอยางนี้คลาส MouseHandler ซึ่งเปนคลาสที่จะรับฟงเหตุการณชนิด
MouseMotionListener โดยเปนคลาสภายในที่อยูในคลาส EventDemo2 ที่มี
ออปเจ็คของคลาส Frame ที่ชื่อ fr ซึ่งการลงทะเบียนรับฟงเหตุการณ MouseEvent
โดยใชคําสั่ง
fr.addMouseMotionListener(new MouseHandler())
โดยที่คําสั่ง new MouseHandler() เปนการสรางออปเจ็คของคลาส
MouseHandler ที่จะทําหนาที่เปน Event Handler โปรแกรมนี้จะไดผลลัพธดังแสดงในรูป
ที่ 7.4
import java.awt.*;
import java.awt.event.*;
7.4.4 การรับฟงเหตุการณหลายเหตุการณ
ภาษาจาวาอนุญาตใหออปเจ็คของคลาสที่เปนสวนกราฟฟกแตละออปเจ็ค สามารถที่
จะรับฟงเหตุการณหลายประเภทไดพรอมกันอาทิเชน ถาออปเจ็ค fr เปนออปเจ็คของ
Frame เราสามารถที่จะลงทะเบียนรับฟงเหตุการณไดดังนี้
fr.addMouseMotionListener(this);
fr.addWindowListener(this);
ซึ่งเปนการกําหนดใหออปเจ็ค fr รับฟงเหตุการณที่เกิดจากการเลื่อนเมาสและ
เหตุการณที่เกี่ยวของกับเฟรมพรอมกัน
คลาสใดๆสามารถที่จะ implements อินเตอรเฟสประเภท Listener ไดหลาย
ชนิดเชน
public class EventDemo4 implements
MouseMotionListener, WindowListener {
...
}
เปนการกําหนดคลาส EventDemo4 ใหเปนคลาสประเภท Event Handler ที่
implement อินเตอรเฟส MouseMotionListener และ WindowListener
ภายในคลาสเดียวกัน
นอกจากนี้คลาสประเภท Event Handler ใดๆสามารถที่ใชในการสรางออปเจ็คแลว
จัดการกับออปเจ็คที่เปน Event Source ไดหลายออปเจ็ค ทั้งนี้ argument ที่เปนออปเจ็คของ
คลาสประเภท Event จะมีเมธอดที่ใชในการระบุออปเจ็คของ Event Source ไดอาทิเชน
(เมธอด getSource())
สรุปเนื้อหาของบท
• ออปเจ็คของคลาสประเภท Event ในแพจเก็จ java.awt.event จะถูกสรางขึ้น
เมื่อมีเหตุการณเกิดขึ้นกับออปเจ็คของสวนประกอบกราฟฟก เชน ActionEvent
เกิดขึ้นเมื่อมีการกด Button หรือ WindowEvent เกิดขึ้นเมื่อมีการปด Frame
• การจะจัดการกับ Event ประเภทใดนั้น โดยทั่วไปจะตองสรางออปเจ็คของคลาสที่
implements อินเตอรเฟสที่สอดคลองกันกับ Event นั้นดวย เชนถาตองการ
จัดการกับ WindowEvent จะตองสรางออปเจ็คของคลาสที่ implements
อินเตอรเฟส WindowListener โดยการสรางออปเจ็คอาจสรางจากคลาสใหม
คลาสภายใน คลาสเดียวกัน หรือคลาสประเภท anonymous ซึ่งคลาสประเภทนี้จะถูก
เรียกวาคลาสประเภท Event Handler
• คลาสใดๆสามารถ implements อินเตอรเฟสไดหลายตัว ทําใหสามารถที่จะขึ้น
ทะเบียนรับฟงเหตุการณไดหลายเหตุการณ
• คลาสประเภท Event Adapter คือคลาสที่ implements อินเตอรเฟสประเภท
Listener ไวแลว โดยไดกําหนดเมธอดตางๆของอินเตอรเฟสที่ตองเขียนบล็อกคําสั่ง
ไวแลว แตจะเปนบล็อกคําสั่งที่ไมมีคําสั่งใดๆอยูภายในบล็อก
8.1 อะเรย
อะเรยในภาษาจาวา คือตัวแปรที่เปนชนิดขอมูลแบบอางอิงที่สามารถใชเก็บขอมูล
ชนิดเดียวกันไดหลายคา ตัวแปรอะเรยจะเปนตัวแปรที่มีชื่อเดียวกันแตจะมีจํานวนสมาชิกได
หลายตัว โดยตําแหนงในหนวยความจําที่เก็บขอมูลเหลานี้จะอยูติดกัน ตัวอยางเชน หาก
ตองการกําหนดตัวแปรใหมีชนิดขอมูลเปน int เพื่อเก็บขอมูลได 5 คาโดยตั้งชื่อตัวแปรเปน
x1, x2, x3, x4 และ x5 ดังนี้
int x1, x2, x3, x4, x5;
ตัวแปรดังกลาวจะถือวาเปนตัวแปรคนละตัวกัน โดยมีชื่อตางกันและไมมีความ
สัมพันธซึ่งกันและกัน แตหากประกาศใหตัวแปร x เปนตัวแปรอะเรยที่มีจํานวนสมาชิก 5 ตัว
โดยใชคําสั่งดังนี้
int []x = new int[5];
จะทําใหตัวแปรอะเรย x เปนตัวแปรที่มีชนิดขอมูลเปน int ซึ่งมีสมาชิก 5 ตัว โดยมี
หมายเลขสมาชิกตั้งแต 0 ถึง 4 และเปนชนิดขอมูลแบบอางอิง กลาวคือคาของ x จะเก็บ
ตําแหนงของหนวยความจําเพื่ออางอิงถึงตําแหนงที่เก็บขอมูลสมาชิกของอะเรยแตละตัว ดัง
แสดงในรูปที่ 8.1
อะเรยของขอมูลชนิดคลาส คืออะเรยที่สามารถใชเก็บขอมูลที่เปนออปเจ็คของคลาส
ใดๆไดหลายออปเจ็คเชน อะเรยของขอมูลชนิด String เปนตน
8.2 อะเรยของขอมูลชนิดพื้นฐาน
ภาษาจาวาสามารถที่จะสรางอะเรย เพื่อใชเก็บขอมูลที่มีชนิดขอมูลแบบพื้นฐานได
การสรางตัวแปรอะเรย จะมีขั้นตอนเชนเดียวกับการสรางตัวแปรที่เปนชนิดขอมูลแบบอางอิง
ทั่วไปสองขั้นตอนคือ
1. ขั้นตอนแรกเปนการประกาศชื่อตัวแปร ขั้นตอนนี้จะเปนการจองเนื้อที่ในหนวย
ความจําเพื่อเก็บคาของตําแหนงอางอิงที่เก็บขอมูลสมาชิกในหนวยความจํา แต
ขั้นตอนนี้จะยังไมมีการจองเนื้อที่ในหนวยความจํา เพื่อใชเก็บคาขอมูลสมาชิก
ของอะเรยแตละตัว ดังนั้นคาของตัวแปรในขั้นตอนนี้จะเปน null
2. ขั้นตอนที่สองเปนการสรางตัวแปร เพื่อบอกจํานวนสมาชิกของอะเรย และจองเนื้อ
ที่ในหนวยความจําสําหรับเก็บคาขอมูลสมาชิกของอะเรยแตละตัว โดยใชคําสั่ง
new เชนเดียวกับการสรางออปเจ็คของคลาส ขั้นตอนนี้จะทําใหคาของตัว
แปรเปลี่ยนไปเปนคาของตําแหนงอางอิงที่เก็บขอมูลสมาชิกของอะเรย
8.2.1 การประกาศชื่อตัวแปรอะเรยของขอมูลชนิดพื้นฐาน
การประกาศชื่อของตัวแปรอะเรยจะมีรูปแบบคลายกับการประกาศชื่อตัวแปรของชนิด
ขอมูลแบบพื้นฐาน แตการประกาศตัวแปรอะเรยจะตองมีเครื่องหมาย [] อยูดานหนาหรือ
ดานหลังชื่อตัวแปรดังนี้
8.2.2 การสรางตัวแปรอะเรยของขอมูลชนิดพื้นฐาน
การประกาศชื่อตัวแปรอะเรยจะไมมีการจองเนื้อที่ในหนวยความจํา เพื่อเก็บขอมูล
สมาชิกของอะเรย เนื้อที่ในหนวยความจําดังกลาวจะถูกจองขึ้นเมื่อมีการใชคําสั่ง new ซึ่งมี
รูปแบบคําสั่งดังนี้
8.2.3 การเรียกใชสมาชิกของอะเรย
ตัวแปรอะเรยที่สรางขึ้นจะมีสมาชิกที่มีหมายเลขตั้งแต 0 จนถึง size-1 การอางอิงถึง
สมาชิกของอะเรยแตละตัวจะมีรูปแบบดังนี้
variableName[index]
8.2.4 การกําหนดคาเริ่มตนใหกับสมาชิกของอะเรย
เราสามารถที่จะประกาศตัวแปรอะเรย สรางตัวแปรอะเรย และกําหนดคาใหกับ
สมาชิกของอะเรยภายในคําสั่งเดียวกัน โดยมีรูปแบบของคําสั่งดังนี้
การกําหนดคาเริ่มตนของตัวแปรอะเรย ทําไดเฉพาะในคําสั่งประกาศตัวแปรเทานั้น
ทั้งนี้เราไมสามารถที่จะกําหนดคาเริ่มตนภายหลังจากคําสั่งประกาศตัวแปรอะเรยได กลาวคือ
คําสั่ง
int []x;
x[] = {4, 3, 5, 1, 8}; // illegal
เปนคําสั่งที่ไมถูกตอง
8.3 อะเรยของขอมูลชนิดคลาส
ตัวแปรอะเรยของขอมูลชนิดคลาสคือ ตัวแปรที่ใชเก็บกลุมของขอมูลสมาชิกที่เปน
ออปเจ็คของคลาสใดคลาสหนึ่ง
ขั้นตอนการสรางตัวแปรอะเรยของขอมูลชนิดคลาสจะมีขั้นตอนคลายกับขั้นตอนการ
สรางตัวแปรอะเรยของขอมูลชนิดพื้นฐาน โดยมีขั้นตอนตางๆดังนี้
1. ขั้นตอนแรกเปนการประกาศตัวแปรอะเรยซึ่งจะจองเนื้อที่ในหนวยความจํา เพื่อ
เก็บคาของตําแหนงอางอิงของตําแหนงในหนวยความจําของสมาชิกของอะเรยแต
ละตัว
2. ขั้นตอนที่สองเปนการใชคําสั่ง new เพื่อสรางและจองเนื้อที่ในหนวยความจําเพื่อ
เก็บคาของตําแหนงอางอิงของสมาชิกของอะเรยซึ่งจะชี้ไปยังตําแหนงที่เก็บขอมูล
จริงๆ
3. ขั้นตอนสุดทายเปนการสรางออปเจ็คของคลาสใหกับสมาชิกแตละตัวของอะเรย
โดยใชคําสั่ง new ซึ่งจะเปนการจองเนื้อที่ในหนวยความจําเพื่อเก็บขอมูลจริงๆ
ของออปเจ็ค
ตัวอยางเชน ถาคลาส Student มีนิยามดังนี้
public class Student {
8.4 อะเรยหลายมิติ
ภาษาจาวากําหนดใหมีตัวแปรอะเรยที่เปนหลายมิติอาทิเชน การกําหนดตัวแปรที่มี
ลักษณะเปนเมตริกซ (matrix) หรือตารางจะตองใชตัวแปรอะเรยที่เปนสองมิติ การประกาศ
ตัวแปรอะเรยที่มีขนาดมากกวาหนึ่งมิติทําไดโดยการเพิ่มเครื่องหมาย [ ] ในแตละมิติ ดังนั้น
รูปแบบการประกาศตัวแปรอะเรยสองมิติมีดังนี้
โดยที่
• row คือจํานวนสมาชิกในแตละแถว
• col คือจํานวนสมาชิกในแตละคอลัมน
ตัวอยางเชน
x = new int [3][4];
เปนการสรางตัวแปรอะเรยสองมิติ x ซึ่งมีขนาด 3 แถว 4 คอลัมน
การเรียกใชสมาชิกของอะเรยสองมิติจะตองระบุตําแหนงของแถวและคอลัมน โดยมี
รูปแบบดังนี้
variableName[row_number][col_number]
โดยที่
• row_number คือหมายเลขแถวของสมาชิกของอะเรยสองมิติ
• col_number คือหมายเลขคอลัมนของสมาชิกของอะเรยสองมิติ
ตัวอยางเชน
x[2][3]
หมายถึงสมาชิกของอะเรย x ตําแหนงแถวที่ 2 คอลัมนที่ 3 เปนตน
8.4.1 การเขียนโปรแกรมเพื่อจัดการกับเมตริกซ
โปรแกรมทางดานคณิตศาสตรที่เกี่ยวของกับการจัดการเมตริกซ จะตองใชตัวแปร
อะเรยขนาดสองมิติ โปรแกรมที่ 8.5 เปนตัวอยางแสดงการบวกและคูณเมตริกซสองเมตริกซ
⎡a 11 a 12 a 13 a 14 a 15 ⎤ ⎡b 11 b 12 b 13 b 14 b 15 ⎤
⎢ ⎥ ⎢ ⎥
⎢a 21 a 22 a 23 a 24 a 25 ⎥ ⎢b 21 b 22 b 23 b 24 b 25 ⎥
⎢a 31 a 32 a 33 a 34 a 35 ⎥ + ⎢b 31 b 32 b 33 b 34 b 35 ⎥ =
⎢ ⎥ ⎢ ⎥
⎢a 41 a 42 a 43 a 44 a 45 ⎥ ⎢b 41 b 42 b 43 b 44 b 45 ⎥
⎢⎣a 51 a 52 a 53 a 54 a 55 ⎥⎦ ⎢⎣b 51 b 52 b 53 b 54 b 55 ⎥⎦
⎡a 11 + b 11 a 12 + b 12 a 13 + b 13 a 14 + b 14 a 15 + b 15 ⎤
⎢ ⎥
⎢a 21 + b 21 a 22 + b 22 a 23 + b 23 a 24 + b 24 a 25 + b 25 ⎥
⎢a 31 + b 31 a 32 + b 32 a 33 + b 33 a 34 + b 34 a 35 + b 35 ⎥
⎢ ⎥
⎢a 41 + b 41 a 42 + b 42 a 43 + b 43 a 44 + b 44 a 45 + b 45 ⎥
⎢⎣a 51 + b 51 a 52 + b 52 a 53 + b 53 a 54 + b 54 a 55 + b 55 ⎥⎦
⎡c 11 c 12 c 13 c 14 c 15 ⎤
⎢ ⎥
⎢c 21 c 22 c 23 c 24 c 25 ⎥
⎢c 31 c 32 c 33 c 34 c 35 ⎥ =
⎢ ⎥
⎢c 41 c 42 c 43 c 44 c 45 ⎥
⎢⎣c 51 c 52 c 53 c 54 c 55 ⎥⎦
⎡a 11 a 12 a 13 a 14 a 15 ⎤ ⎡b 11 b 12 b 13 b 14 b 15 ⎤
⎢ ⎥ ⎢ ⎥
⎢a 21 a 22 a 23 a 24 a 25 ⎥ ⎢b 21 b 22 b 23 b 24 b 25 ⎥
⎢a 31 a 32 a 33 a 34 a 35 ⎥ x ⎢b 31 b 32 b 33 b 34 b 35 ⎥
⎢ ⎥ ⎢ ⎥
⎢a 41 a 42 a 43 a 44 a 45 ⎥ ⎢b 41 b 42 b 43 b 44 b 45 ⎥
⎢⎣a 51 a 52 a 53 a 54 a 55 ⎥⎦ ⎢⎣b 51 b 52 b 53 b 54 b 55 ⎥⎦
8.5 เมธอดที่เกี่ยวของกับอะเรย
ภาษาจาวามีเมธอดหลายเมธอดที่รับ argument เปนอะเรยของขอมูลชนิดตางๆ
ตัวอยางเชนแพคเก็จ java.lang มีคลาสที่ชื่อ Arrays ซึ่งมีเมธอดที่เกียวของกับอะเรยที่
สําคัญดังนี้
• sort() เปนเมธอดที่ใชในการเรียงคาขอมูลสมาชิกของอะเรยจากนอยไปมาก
• binarySearch() เปนเมธอดที่ใชในการคนหาคาขอมูลที่ตองการจากชุด
ขอมูลทั้งหมดของสมาชิกของอะเรย ซึ่งถูกเรียงจากนอยไปมากหรือมากไปนอย
ไวแลว
• fill() เปนเมธอดที่ใชในการกําหนดคาขอมูลเดียวกันใหกับสมาชิกทั้งหมด
ของอะเรย
เนื่องจากเมธอดทั้งสามเมธอดที่กลาวมาขางตนเปนเมธอดแบบ static ดังนั้นการ
เรียกใชงานเมธอดเหลานี้จึงสามารถเรียกโดยใชชื่อคลาส Arrays ไดเลย ไมจําเปนตองสราง
ออปเจ็คของคลาส Arrays ขึ้นมากอนการเรียกใชงาน
โปรแกรมที่ 8.7 แสดงตัวอยางการเรียกใชเมธอดของคลาส Arrays ที่กลาวไว
ขางตน โปรแกรมนี้เรียกใชเมธอด sort() โดยสง argument ที่เปนตัวแปรอะเรย d ไป
import java.util.Arrays;
• int size()
เปนเมธอดที่ใชในการหาจํานวนสมาชิกที่มีอยูในคอลเล็กชั่น
• boolean isEmpty()
เปนเมธอดที่ใชในการตรวจวาคอลเล็กชั่นมีสมาชิกอยูหรือไม โดยจะสงคากลับมา
เปน true ถาไมมีสมาชิกอยูในคอลเล็กชั่น
• boolean contains(Object element)
import java.util.*;
}
}
}
9.1 ขอผิดพลาด
โปรแกรมภาษาจาวาอาจเกิดขอผิดพลาด (Exception) ขึ้นในขั้นตอนการรันโปรแกรม
โดยที่ขอผิดพลาดเหลานี้จะไมสามารถตรวจสอบไดในขั้นตอนการคอมไพลโปรแกรม ตัวอยาง
เชน คําสั่ง
offset = x/n;
สําหรับตัวแปรที่มีชนิดขอมูลเปน int ที่ชื่อ offset, x และ n จะเปนคําสั่งที่
สามารถคอมไพลผานได แตถาคาของ n เปนศูนย โปรแกรมนี้จะเกิดขอผิดพลาดขึ้นใน
ขั้นตอนการรันโปรแกรม ซึ่งโปรแกรมภาษาจาวาจะตรวจสอบพบขอผิดพลาดในการหารดวย
จํานวนเต็มศูนย และจะสงขอผิดพลาด (throwing an exception) ที่เกิดขึ้นกลับมา
โปรแกรมภาษาจาวาแบงขอผิดพลาดที่อาจเกิดขึ้นขณะรันโปรแกรมเปนสองประเภท
คือ
1. Error เปนขอผิดพลาดที่ไมสามารถแกไขและจัดการได เชน Virtual
MemoryError และ OutOfMemoryError เปนตน เราจะไมกลาวถึง
Error เนื่องจาก Error เปนขอผิดพลาดที่เราไมสามารถเขียนโปรแกรมเพื่อแกไข
และจัดการได
2. Exception เปนขอผิดพลาดที่สามารถแกไขและจัดการได เชน ขอผิดพลาด
จากการเปดไฟลที่ไมมีอยูในไดเร็กทอรี่ (FileNotFoundException)
หรือขอผิดพลาดจากการอางอิงหมายเลขของสมาชิกของอะเรยที่ไมถูกตอง คือ
ไมไดมีอยูจริง (ArrayIndexOutOfBoundsException)
9.1.1 Exception
คลาสที่ชื่อ Exception เปนคลาสที่กําหนดใน Java API เพื่อระบุขอผิดพลาดที่
เกิดขึ้นในขณะรันโปรแกรมภาษาจาวา Exception แบงออกเปนสองประเภทคือ
1. RuntimeException เปนขอผิดพลาดที่อาจหลีกเลี่ยงไดหากมีการเขียน
โปรแกรมที่ถูกตอง ตัวอยางเชน ArrayIndexOutOfBoundsException
ซึ่งเปนขอผิดพลาดเพราะมีการอางอิงสมาชิกของอะเรยที่ไมถูกตอง สามารถ
แกไขโปรแกรมใหดีขึ้นไดถามีการตรวจสอบหมายเลขสมาชิกของอะเรยกอนที่จะ
อางอิง โดยใชคําสั่ง if
try {
[statements]
}
โปรแกรมภาษาจาวาจะสั่งงานชุดคําสั่งที่อยูในบล็อกทีละคําสั่ง และหากเกิด
ขอผิดพลาดขึ้นในคําสั่งใดก็จะมีการสงออปเจ็คของขอผิดพลาดประเภท Exception นั้นขึ้นมา
ซึ่งโปรแกรมจะยกเลิกการทํางานคําสั่งที่อยูในบล็อกที่เหลือทั้งหมด แตหากทุกคําสั่งที่อยูใน
บล็อกไมมีขอผิดพลาดใดเกิดขึ้น โปรแกรมจาวาก็จะทํางานตอไปตามปกติเสมือนวาไมมี
คียเวิรด try อยู ในกรณีที่ตองการจัดการกับขอผิดพลาดที่เกิดขึ้น โปรแกรมจะตองมีชุดคําสั่ง
อยูในบล็อกของคียเวิรด catch ที่จะระบุชนิดของออปเจ็คในคลาสประเภท Exception ที่
ตองการจัดการโดยมีรูปแบบคําสั่งดังนี้
catch(ExceptionType argumentName){
[statements]
}
ตัวอยางเชน
public void openFile(String s)throws FileNotFoundException {
}
เมธอดใดๆสามารถที่จะจัดการกับออปเจ็คประเภท Exception โดยใชคําสั่ง throws
ไดมากกวาหนึ่งชนิด ตัวอยางเชน
public void openFile(String s)throws FileNotFoundException,
UnknownHostException {
}
กรณีที่มีการใชคําสั่ง throws แลวสงตอใหเมธอดอื่นๆที่เรียกใชเปนตัวจัดการกับ
ออปเจ็คประเภท Exception ดังกลาวไปเรื่อยๆ แตถาเมธอดที่ชื่อ main() ซึ่งเรียกใช
เมธอดสุดทายที่ใชคําสั่ง throws ไมมีการจัดการกับออปเจ็คประเภท Exception ดังกลาว
โปรแกรมจะเกิดขอผิดพลาดในขั้นตอนการรันโปรแกรม เมือ่ มีขอผิดพลาดของออปเจ็คประเภท
Exception ดังกลาวเกิดขึ้น ตัวอยางเชนโปรแกรมที่ 9.7 ซึ่งผลลัพธที่ไดจากการรันเปนดังแสดง
ในรูปที่ 9.7
import java.io.*;
import java.io.*;
โดยที่
• ExceptionType คือชื่อของคลาสประเภท Exception ที่ตองการจะสราง
ออปเจ็คโดยมี argument สอดคลองกับที่ระบุใน constructor ของคลาสดังกลาว
นอกจากนี้คําสั่งประกาศเมธอดนั้นจะตองมีคําสั่ง throws เพื่อกําหนดใหคําสั่งใน
เมธอดอื่นๆที่เรียกใชเมธอดนี้ตองเขียนคําสั่งในการจัดการกับขอผิดพลาดนี้ โปรแกรมที่ 9.11
สรุปเนื้อหาของบท
• ขอดีประการหนึ่งของภาษาจาวาคือ เราสามารถเขียนโปรแกรมใหมีการตรวจจับและ
จัดการกับขอผิดพลาดที่อาจเกิดขึ้นได โดยที่การทํางานไมตองหยุดลง
• Error เปนขอผิดพลาดที่ไมสามารถแกไขและจัดการได สวน Exception เปน
ขอผิดพลาดที่สามารถแกไขหรือจัดการได
10.1 โปรแกรมจาวาแอปเพล็ต
โปรแกรมจาวาแอปเพล็ต (Java Applet) คือโปรแกรมภาษาจาวาที่สามารถทํางาน
ภายใตโปรแกรมเว็บบราวเซอร (Web Browser) ที่มี JVM อยู โปรแกรมจาวาแอปเพล็ตจะ
ประกอบดวยไฟลโปรแกรมสองไฟลคือ
- โปรแกรมภาษาจาวา (.java)
- โปรแกรมภาษา HTML (.html)
โปรแกรมที่ 10.1 เปนตัวอยางของโปรแกรมจาวาแอปเพล็ตเพื่อแสดงขอความ Hello
World โปรแกรมนี้จะแตกตางจากโปรแกรมจาวาประยุกตตรงที่ไมมีเมธอดที่ชื่อ main()
และจะไมสามารถทํางานตามลําพังได แตจะตองเรียกใชโดยผานโปรแกรมภาษา HTML
ตัวอยางเชนโปรแกรมที่ 10.2 เปนโปรแกรมภาษา HTML ที่เรียกใชโปรแกรม
HelloWorldApplet.class เพื่อประมวลผลภายใตโปรแกรมเว็บบราวเซอรที่มี JVMอยู
<HTML>
<HEAD>
<TITLE>HelloWorld Example</TITLE>
</HEAD>
<BODY>
<APPLET CODE=”HelloWorldApplet.class”
WIDTH=”300” HEIGHT=”300”>
</APPLET>
</BODY>
</HTML>
การรันโปรแกรมจาวาแอปเพล็ตภายในโปรแกรมเว็บบราวเซอร จะมีขั้นตอนการ
ทํางานดังรูปที่ 8.2 โดยมีขั้นตอนการทํางานดังนี้
1. โปรแกรมเว็บบราวเซอรจะโหลด URL ตามตําแหนงที่ระบุ
2. โปรแกรมเว็บบราวเซอรจะโหลดไฟล HTML ที่ระบุและกระทําคําสั่ง tag ตางๆที่
ระบุในไฟล HTML
3. โปรแกรมเว็บบราวเซอรจะโหลดโปรแกรมโปรแกรมไบทโคด ที่เปนโปรแกรม
จาวาแอปเพล็ตที่ระบุใน tag ที่ชื่อ APPLET ตาม URL ที่ระบุ
4. โปรแกรมเว็บบราวเซอรจะรันโปรแกรมจาวาแอปเพล็ต
โปรแกรมเว็บบราวเซอรที่รันโปรแกรมจาวาแอปเพล็ตจะตองมี JVM อยูและเนื่องจาก
โปรแกรมเว็บบราวเซอรสามารถโหลดโปรแกรมจาวาแอปเพล็ต มาจากเครื่องคอมพิวเตอรแม
ขายอื่นๆได ดังนั้นภาษาจาวาจึงไดกําหนดระบบความปลอดภัยในการรันโปรแกรมจาวา
แอปเพล็ต เพื่อปองกันไมใหโปรแกรมจาวาแอปเพล็ตทํางานตางๆดังนี้
- อานหรือเขียนไฟลอื่นๆที่อยูในเครื่องที่รันโปรแกรมอยู
นอกจากนี้ยังมีคุณลักษณะอื่นๆที่เปนเงื่อนไขเพิ่มเติมดังนี้
• ALIGN เพื่อกําหนดการวางตําแหนงของโปรแกรมจาวาแอปเพล็ตเชน left,
right, top, textop, middle, absmiddle, baseline,
bottom และ absbottom เปนตน
10.1.2 การสงพารามิเตอร
คุณลักษณะที่ชื่อ PARAM จะใชในการสงผานพารามิเตอรไปยังโปรแกรมจาวา
แอปเพล็ตไดโดยมีรูปแบบดังนี้
โดยที่
- attr1 คือชื่อของพารามิเตอรที่จะปรากฏอยูในโปรแกรมจาวาแอปเพล็ต
- val1 คือคาของพารามิเตอรที่จะสงใหกับโปรแกรมจาวาแอปเพล็ต
ตัวอยางเชน
<PARAM name = speed VALUE = “25”>
โดยที่
paramName คือชื่อพารามิเตอร
เมธอดนี้จะสงคาเปนชนิดขอมูลแบบ String คืนมาโดยจะเปนคาที่อยูใน
<PARAM> ที่ชื่อ VALUE คาที่สงกลับมาจะเปน case-sensitive แตชื่อพารามิเตอรจะไมใช
case-sensitive
ตัวอยางเชน
getParameter(“SPEED”)
จะให ค า กลั บ มาเป น “25” ตามที่ ร ะบุ ไ ว ใ นตั ว อย า งของ <PARAM> ข า งต น
ในกรณีที่ไมพบพารามิเตอรตามชื่อที่ระบุใน tag ที่ชื่อ <APPLET> คาที่ไดกลับมาจะมีคาเปน
null
เมธอด start()
เมธอดนี้จะถูกเรียกหลังจากทําคําสั่งในเมธอดที่ชื่อ init() และถูกเรียกใชทุกครั้งที่
ผูใชกลับมายังเว็บเพจที่มีโปรแกรมจาวาแอปเพล็ตหนานี้อยู หรือทุกครั้งที่มีการแสดงเฟรมที่มี
โปรแกรมจาวาแอปเพล็ตหนานี้อยู โดยทั่วไปโปรแกรมจาวาแอปเพล็ตจะ override เมธอดนี้
ในกรณีที่ตองมีคําสั่งที่ตองทําทุกครั้งที่มีการกลับเขามาในเว็บเพจหนานี้อาทิเชน การเริ่มตน
แสดงภาพเคลื่อนไหวใหม
เมธอด stop()
เมธอดนี้จะถูกเรียกใชเมื่อผูใชยายไปยังเว็บเพจหนาอื่น หรือเมื่อมีการยกเลิกการ
แสดงเฟรมที่มีโปรแกรมจาวาแอปเพล็ตหนานี้อยู โดยทั่วไปโปรแกรมจาวาแอปเพล็ตจะ
override เมธอดนี้ในกรณีที่ตองมีคําสั่งในการหยุดการทํางานของโปรแกรมเมื่อออกจากเว็บ
เพจหนานี้เชน การหยุดภาพเคลื่อนไหวหรือโปรแกรมแบบเธรด (thread)
เมธอด destroy()
เมธอดนี้จะถูกเรียกครั้งเดียวเมื่อมีการปดเว็บบราวเซอร โดยทั่วไปโปรแกรมจาวา
แอปเพล็ตจะไม override เมธอดนี้ยกเวนจะตองการลบขอมูลในหนวยความจําบางอยางเชน
โปรแกรมแบบเธรดที่สรางขึ้น
เมธอด paint()
เมธอด paint() จะเปนเมธอดที่มีคําสั่งที่เกี่ยวของกับการวาดรูปกราฟฟกตางๆ
โดยเมธอด paint() มีรูปแบบดังนี้
โดยที่
• g คือออปเจ็คของคลาส Graphics ที่สามารถใชในการวาดรูปกราฟฟกตางๆ
• statements คือคําสั่งในการวาดรูปกราฟฟกตางๆ
import java.awt.*;
import java.applet.*;
10.3.1 เมธอดในการวาดรูปทรงตางๆ
คลาสที่ชื่อ Graphics จะมีเมธอดในการวาดรูปทรงกราฟฟกตางๆหลายเมธอด
ดังนี้
• drawLine(int x1, int y1, int x2, int y2)
เปนเมธอดที่ใชในการวาดเสนตรงจากพิกัด (x1,y1)ไปยังพิกัด (x2,y2)
• drawRect(int x, int y, int width, int height)
เปนเมธอดที่ใชในการวาดสี่เหลี่ยมผืนผา โดยจะมีตําแหนงเริ่มตนที่พิกัด (x,y)
ซึ่งมีความกวางและความสูงเปน width และ height ตามลําดับ
• fillRect(int x, int y, int width, int height)
เปนเมธอดที่ใชในการวาดสี่เหลี่ยมผืนผา เชนเดียวกับเมธอด drawRect() แต
จะมีสีเติมเต็มในสี่เหลี่ยมผืนผา
import java.awt.*;
import java.applet.*;
10.3.2 เมธอดที่ใชในการจัดการคุณลักษณะของกราฟฟก
ออปเจ็คของคลาสที่ชื่อ Graphics มีคุณลักษณะตางๆของรูปทรงกราฟฟกที่วาด
เชน สีของพื้นหนา (Foreground) ลักษณะของเสน และรูปแบบของฟอนต เราสามารถที่จะ
กําหนดคุณลักษณะตางๆเหลานี้ได โดยเรียกใชเมธอดตางๆของคลาสดังนี้
เมธอด repaint()
โปรแกรม GUI จะมีโปรแกรมแบบเธรดที่เรียกวา AWTThread ที่เปนโปรแกรมที่
ประมวลผลพรอมกัน ซึ่งจะทําหนาที่คอยตรวจสอบวา จะตองมีการเรียกใชเมธอด paint()
เพื่อวาดรูปทรงกราฟฟกตามคําสั่งที่ระบุใหแสดงบนออปเจ็คประเภท Container (เชน
Applet) ใหมหรือไม ซึ่งโปรแกรม AWTThread จะเรียกใชเมธอด paint() ใหมในกรณี
ตางๆอาทิเชน
• เมื่อมีการโหลดออปเจ็คของคลาสประเภท Container เพื่อแสดงผลครั้งแรก
• เมื่อโปรแกรมเปลี่ยนจากไอคอนกลับมาเปนโปรแกรมที่แสดงผลตามหนาจอปกติ
โดยที่
• URL เปนคลาสที่ใชสรางออปเจ็คเพื่อระบุตําแหนง URL ของรูปภาพอาทิเชน
URL u = new URL(“http://java.sun.com”)
• name คือชื่อของไฟลรูปภาพที่มีฟอรแมตเปน GIF หรือ JPG
ในกรณีที่ตําแหนงของไฟลรูปภาพมี URL เดียวกับตําแหนงของโปรแกรมเว็บเพจ
เราสามารถเรียกใชเมธอดที่ชื่อ getDocumentBase() เพื่อระบุ URL ดังกลาวอาทิเชน
Image cat = getImage(getDocumentBase(),“cat.gif”)
สวนในกรณีที่ตําแหนงของไฟลรูปภาพมี URL ตรงกับตําแหนงของโปรแกรมไบทโคด
ของโปรแกรมจาวาแอปเพล็ต เราสามารถเรียกใชเมธอดที่ชื่อ getCodeBase() เพื่อระบุ
URL ดังกลาวอาทิเชน
Image cat = getImage(getCodeBase(), “cat.gif”)
การแสดงรูปภาพที่อยูในออปเจ็คของคลาส Image จะทําไดโดยเรียกใชเมธอดที่ชื่อ
drawImage() ที่อยูในคลาสที่ชื่อ Graphic ซึ่งมีรูปแบบดังนี้
drawImage(Image im, int x, int y, ImageObserver ob)
โดยที่
- im คือชื่อออปเจ็คของคลาส Image ที่ตองการแสดง
- x และ y คือตําแหนงพิกัดที่ตองการแสดง
- ob คือออปเจ็คของคลาสที่ implements อินเตอรเฟส ImageObserver
ที่ใชระบุการเปลี่ยนแปลงสถานะของรูปภาพ ซึ่งคลาส Applet ได
implements อินเตอรเฟสดังกลาวไว เราจึงสามารถมี argument โดยใช
ออปเจ็คที่ชื่อ this ได
โปรแกรมที่ 10.6 แสดงตัวอยางของโปรแกรมจาวาแอปเพล็ตที่มีการแสดงรูปภาพที่
ชื่อ duke.gif ซึ่งเก็บอยูในตําแหนงเดียวกับโปรแกรม .html
import java.awt.*;
import java.applet.*;
Image im;
public void init() {
im = getImage(getDocumentBase(), "duke.gif");
}
public void paint(Graphics g){
g.drawImage(im, 20, 20, this);
}
}
โดยที่
name คือชื่อของไฟลเสียงที่มีฟอรแมตเปน au
คลาส AudioClip จะมีเมธอดที่เกี่ยวของกับการเลนเสียงดังนี้
- play() คือเมธอดที่ใชในการเลนเสียง
- loop() คือเมธอดที่ใชในการเลนเสียงแบบวนรอบ
- stop() คือเมธอดที่ใชในการหยุดการเลนเสียง
AudioClip sound;
public void init() {
sound = getAudioClip(getDocumentBase(),
"spacemusic.au");
}
public void paint(Graphics g){
sound.loop();
}
public void stop() {
sound.stop();
}
}
10.5 โปรแกรมจาวาแอปเพล็ตที่โตตอบกับผูใช
คลาสที่ชื่อ Applet เปนคลาสประเภท Container และสามารถที่จะรับฟง
เหตุการณทางกราฟฟกตางๆไดอาทิเชน ActionListener, MouseListener,
MouseMotionListener, KeyListener, และ FocusListener เปนตน
ดังนั้นเราจึงสามารถที่จะเขียนโปรแกรมจาวาแอปเพล็ตเพื่อโตตอบกับผูใชได
โปรแกรมที่ 10.8 แสดงตัวอยางของโปรแกรมจาวาแอปเพล็ตที่มีออปเจ็คของคลาสที่
เปนสวนประกอบกราฟฟกอื่นๆ โดยมีปุมสองปุมเพื่อทําหนาที่เลนและหยุดไฟลเพลงที่โหลด
เขามาในโปรแกรม
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
AudioClip sound;
Button bn1, bn2;
public void init() {
sound = getAudioClip(getDocumentBase(),
"spacemusic.au");
bn1 = new Button("PLAY");
bn2 = new Button("STOP");
add(bn1);
add(bn2);
bn1.addActionListener(this);
bn2.addActionListener(this);
bn1.setEnabled(true);
bn2.setEnabled(false);
}
• โปรแกรมจาวาแอปเพล็ตทุกโปรแกรมจะตองสืบทอดมาจากคลาสที่ชื่อ Applet
โดยใชคําสั่ง extends Applet และจะเริ่มตนทํางานที่เมธอด init()
11.1 Stream
ภาษาจาวาจัดการกับขบวนการอินพุตและเอาทพุตโดยใชหลักการของ stream ซึ่ง
เปรียบเสมือนทอสงขอมูลจากตนทาง (source) ไปยังปลายทาง (sink) โดยที่ตนทางเปน
ตําแหนงเริ่มตนของ stream ที่เรียกวา input stream และปลายทางเปนตําแหนงสิ้นสุดของ
stream ที่เรียกวา output stream ดังแสดงในรูปที่ 11.1 stream จะชวยใหนักพัฒนาโปรแกรม
สามารถที่เขียนโปรแกรมเพื่อสงขอมูลจากตนทางไปยังปลายทางได โดยไมจําเปนตองทราบ
รายละเอียดภายในของการติดตอกับฮารดแวรหรือซอฟตแวรที่ในการสงขอมูล ซึ่งสามารถ
เขียนโปรแกรมไดโดยเพียงแตรูเมธอดที่ใชในการรับหรือสงขอมูลเทานั้น
• InputStream
เปนคลาสที่ใชในการสรางออปเจ็คที่เปน stream ในการรับชนิดขอมูลแบบ
byte
• OutputStream
เปนคลาสที่ใชในการสรางออปเจ็คที่เปน stream ในการสงชนิดขอมูลแบบ
byte
• Reader
เปนคลาสที่ใชในการสรางออปเจ็คที่เปน stream ในการรับชนิดขอมูลแบบ
char
• Writer
เปนคลาสที่ใชในการสรางออปเจ็คที่เปน stream ในการสงชนิดขอมูลแบบ
char
ซึ่งคลาสทั้งสี่นี้จะเปนคลาสที่เปนคลาสรากของคลาสอื่นๆที่จะสืบทอดมา ดังแสดงใน
รูปที่ 11.2 ถึง รูปที่ 11.5
• boolean markSupported()
เมธอดนี้ใชตรวจสอบวา stream ที่ใชอยูสนับสนุนการใชเมธอด mark() และ
reset() หรือไม
• void close()
• void skip(long n)
• boolean markSupported()
• void reset()
• boolean ready()
Writer เปนคลาสที่ใชในการเขียนขอมูลของ stream ที่เปนชนิดขอมูลแบบ char
Writer จะมีเมธอดที่เหมือนกับคลาส OutputStream และมีหลักการทีสอดคลองกันแตจะ
รับขอมูลหรือ argument ที่เปนชนิดขอมูล char โดยมีเมธอดตางๆดังนี้
• void write(int c)
• void write(char []c)
• void write(char []c, int offset, int length)
• void close()
• void flush()
นอกจากนี้คลาส Writer จะมีเมธอดเพิ่มเติมขึ้นมาเพื่อเขียนชนิดขอมูลที่เปน
String ดังนี้
• void write(String s)
import java.io.*;
try {
FileOutputStream fout;
DataOutputStream dout;
fout = new FileOutputStream("data.dat");
dout = new DataOutputStream(fout);
dout.writeInt(124);
dout.writeDouble(2.45);
dout.writeChar('a');
dout.writeUTF("test");
dout.close();
fout.close();
} catch (IOException ex) {
System.out.println(ex.toString());
}
}
}
import java.io.*;
public class DataReaderDemo {
public static void main (String args[]) {
try {
FileInputStream fin;
DataInputStream din;
fin = new FileInputStream("data.dat");
din = new DataInputStream(fin);
int x = din.readInt();
double d = din.readDouble();
char ch = din.readChar();
String line = din.readUTF();
System.out.println("x=" + x + " d="
+ d + " ch=" + ch);
System.out.println(line);
din.close();
fin.close();
} catch (IOException ex) {
System.out.println(ex.toString());
}
}
}
FileOutputStream fout;
OutputStreamWriter oout;
PrintWriter p;
try {
fout = new FileOutputStream("data.dat");
oout = new OutputStreamWriter(fout);
p = new PrintWriter(oout);
p.println(line1);
p.println(line2);
p.close();
oout.close();
fout.close();
} catch (IOException ex) {
System.out.println(ex.toString());
}
}
}
import java.io.*;
• long getFilePointer()
เปนเมธอดที่ใชในการเรียกดูตําแหนงชี้ของไฟล
เราสามารถจะระบุคุณลักษณะของออปเจ็คหรือคุณลักษณะของคลาสที่ไมตองการจะ
เก็บหรือเรียกดูขอมูลผาน stream ไดโดยการระบุใหคุณลักษณะดังกลาวมี modifier เปน
คียเวิรด transient ตัวอยางเชน
public class Student implements Serializable {
private String id,name;
private double gpa;
private transient String parent;
}
เปนคลาสที่มีคียเวิรด transient ในคุณลักษณะชื่อ parent ซึ่งจะมีผลทําให
คุณลักษณะนี้ไมสามารถเก็บหรือเรียกดูขอมูลผาน stream คียเวิรด transient สามารถใช
กับคุณลักษณะที่เปนออปเจ็คประเภท non-serializable เพื่อปองกันไมใหเกิดขอผิดพลาดใน
การเก็บหรือเรียกดูขอมูลเชน
import java.io.*;
สรุปเนื้อหาของบท
• stream เปรียบเสมือนทอสงขอมูล สามารถแบงออกไดเปน 2 ประเภทคือ byte
stream และ character stream
• byte stream มีคลาสพื้นฐานคือ คลาส InputStream และ
OutputStream
• character stream มีคลาสพื้นฐานคือ คลาส Reader และ Writer
• คลาส InputStream และ OutputStream เปน low-level stream ที่
สามารถอานหรือเขียนขอมูลชนิด byte ไดเทานั้น
• คลาส Reader และ Writer เปน low-level stream ที่สามารถอานหรือเขียน
ขอมูลชนิด char ไดเทานั้น
• คลาสที่เปน high-level stream สําหรับ byte stream จะสืบทอดมาจากคลาส
FilterInputStream หรือ FilterOutputStream
12.1 โปรแกรมแบบมัลติเธรด
คุณลักษณะเดนขอหนึ่งของภาษาจาวาคือ ความสามารถในการพัฒนาโปรแกรม
แบบมัลติเธรด (multithreaded) ที่สามารถทํางานพรอมกันได ซึ่งโปรแกรมแบบมัลติเธรดนี้ใช
หลักการของระบบปฏิบัติการแบบ Multitasking ในการกําหนดใหโปรแกรมสามารถทํางาน
หลายงาน (task) ไดพรอมกัน ระบบปฏิบัติการแบบ Multitasking จะเปนระบบปฏิบัติที่
อนุญาตใหผูใช สามารถสงโปรแกรมใหระบบปฏิบัติการทํางานไดมากกวาหนึ่งโปรแกรมพรอม
กัน ซึ่งโปรแกรมแตละโปรแกรมที่รันอยูในระบบปฏิบัติการจะสราง process ขึ้นมา และ
ระบบปฏิบัติการแบบ Multitasking จะมี process หลายๆ process เขาคิวรอการทํางาน โดย
ระบบปฏิบัติการจะกําหนดลําดับของการทํางานของ process เอง
โปรแกรมมัลติเธรดจะเปนการทํางานหลายงานพรอมกันโดยแตละงานจะเรียกวาเธรด
ซึ่งจะแตกตางจาก process ที่ทํางานภายใตระบบปฏิบัติการแบบ Multitasking ตรงที่ process
แตละ process จะมีความเปนอิสระตอกัน แตเธรดแตละเธรดอาจใชขอมูลรวมกันซึ่ง
เปรียบเสมือนซีพียูจําลอง (Virtual CPU)
โปรแกรมแบบเธรดจะมีหลักการทํางานที่แตกตางกัน ทั้งนี้ขึ้นอยูกับระบบปฏิบัติการ
และจํานวนซีพียู ในระบบคอมพิวเตอรที่มีซีพียูหลายตัวโปรแกรมแบบเธรดแตละโปรแกรม
สามารถที่จะรันพรอมกันไดดังแสดงในรูปที่ 12.1 (ก) สวนในระบบคอมพิวเตอรที่มีซีพียูตัว
เดียว ระบบปฏิบัติการจะเปนสวนที่จะจัดการตารางการทํางานของโปรแกรมเธรด ซึ่งอาจแบง
เวลาการทํางานของซีพียูดังแสดงในรูปที่ 12.1 (ข)
โปรแกรมภาษาจาวาสามารถกําหนดใหออปเจ็คของคลาสใดๆ ทํางานเปนแบบเธรด
ได ซึ่งก็จะทําใหสามารถรันโปรแกรมของออปเจ็คแบบเธรดหลายๆออปเจ็คพรอมกันได โดย
ภาษาจาวาจะมีตัวจัดตารางเวลา (Thread Scheduler) ของออปเจ็คแบบเธรดเพื่อจัดลําดับการ
ทํางานของออปเจ็คแบบเธรด ทั้งนี้โปรแกรมบางประเภทจําเปนตองพัฒนาเปนแบบเธรดอาทิ
เชน โปรแกรมภาพกราฟฟกแบบเคลื่อนไหว (Graphics Animation) โปรแกรมนาฬิกา และ
โปรแกรมแมขาย (Application Server) เปนตน
class PrintName {
String name;
public PrintName(String n) {
name = n;
}
public void run() {
for(int i=0; i<100; i++) {
System.out.println(name);
}
}
}
public class TestPrintName {
public static void main(String args[]) {
PrintName p1 = new PrintName("Thana");
PrintName p2 = new PrintName("Somchai");
p1.run();
p2.run();
}
}
โดยที่
• obj คือออปเจ็คของคลาสที่ implements อินเตอรเฟส Runnable
ภายหลังจากที่สรางออปเจ็คของคลาสแบบเธรดแลว เราสามารถจะสั่งงานให
ออปเจ็ค obj เริ่มทํางานไดโดยการเรียกใชเมธอด start() ที่อยูในคลาสที่ชื่อ Thread
ซึ่งคลาสที่ชื่อ Thread จะลงทะเบียนออปเจ็คดังกลาวลงในตัวจัดตารางเวลา และเมื่อซีพียู
เรียกรันโปรแกรมของออปเจ็คดังกลาว คําสั่งในเมธอด run() จะถูกสั่งงานตามลําดับ
โปรแกรมที่ 12.2 เปนตัวอยางการปรับปรุงคลาส PrintName ใหเปนคลาสแบบ
เธรด โดยการ implements อินเตอรเฟส Runnable คลาส PrintNameThread จะ
สรางออปเจ็คของคลาส PrintName ขึ้นมาสองออปเจ็คคือ p1 และ p2 ซึ่งทั้งสองเปน
12.3 วงจรการทํางานของเธรด
ออปเจ็คแบบเธรดเมื่อลงทะเบียนไวกับตัวจัดตารางเวลาแลว อาจยังไมมีการรัน
โปรแกรมโดยทันที แตทั้งนี้จะขึ้นอยูกับสถานะของออปเจ็คซึ่งวงจรการทํางานของเธรดจะมี
การทํางานดังแสดงในรูปที่ 12.5 โดยจะมีสถานะตางๆดังนี้
• สถานะ Blocked
ออปเจ็คแบบเธรดที่อยูในสถานะ Running อาจถูกบล็อกแลวยายไปอยูในสถานะ
Blocked ไดเนื่องจากเหตุการณตางๆดังนี้
− มีการเรียกใชเมธอด sleep()
− ออปเจ็คแบบเธรดรอรับการทํางานที่เปนอินพุตหรือเอาทพุต
− มีการเรียกใชเมธอด wait()
− ออปเจ็คแบบเธรดถูกเรียกโดยเมธอด suspend()
12.4 Synchronization
กรณีที่ออปเจ็คแบบเธรดใชขอมูลรวมกันอาจเกิดปญหาที่เรียกวา race condition ขึ้น
ได ซึ่งเปนกรณีที่ออปเจ็คแบบเธรดตางแยงกันจัดการขอมูลทําใหไดขอมูลที่ผิดพลาด
โปรแกรมที่ 12.4 เปนตัวอยางกรณีของโปรแกรมจําลองระบบธนาคารซึ่งจะมีคลาส Bank ที่มี
บัญชีลูกคาอยู 10 บัญชีโดยมียอดเงินรวมของทุกบัญชีทั้งสิ้นจํานวน 100,000 บาท และมี
เมธอด transfer() ที่ใชในการโอนเงินระหวางบัญชีหนึ่งไปยังอีกบัญชีหนึ่งโดยใชคําสั่ง
accounts[from] -= amount
accounts[to] += amount
โดยที่ตัวแปร from คือหมายเลขบัญชีที่ตองการตัดโอนเงินไปและ to คือหมายเลข
บัญชีที่ตองการรับเงินเขามา คลาส TransferThread เปนคลาสแบบเธรดที่มีเมธอด
run() ซึ่งเรียกใชออปเจ็คของคลาส Bank เพื่อโอนเงินระหวางบัญชีใดๆแบบสุมโดยจะทํา
การโอนเงินซ้ําไปไมมีที่สิ้นสุด และทุกๆการโอนเงินจํานวน 10,000 ครั้ง จะพิมพยอดเงินรวม
ของบัญชีทุกบัญชีออกมาซึ่งควรจะมีคาเปน 100,000 บาท ตัวอยางผลลัพธที่ไดจากการรัน
โปรแกรมนี้ อาจเกิดปญหาที่แสดงใหเห็นวาเมื่อรันโปรแกรมไปไดระยะหนึง่ จะมีผลรวม
ยอดเงินที่ผิดพลาด ทั้งนี้เนื่องจากเกิดปญหาที่เรียกวา race condition ซึ่งออปเจ็คแบบเธรดแต
ละตัวอาจหยุดทํางานระหวางขั้นตอนใดๆของคําสั่งในเมธอด run() เพื่อใหออปเจ็คแบบเธ
รดตัวอื่นไดทํางาน ซึ่งคําสั่งแตละคําสั่งอาจมีขั้นตอนการทํางานหลายขั้นเชนคําสั่ง
account[to] += amount
จะไมใชเปนเพียงคําสั่งเดียวแตจะมีขั้นตอนตางๆดังนี้
1. โหลด account[to] เขาสูรีจิสเตอรในซีพียู
2. บวกคาในรีจิสเตอรดวยคาของ amount
3. มีผลลัพธจากรีจิสเตอรกลับมายัง account[to]
class Bank{
public static final int NTEST = 10000;
private final int[] accounts;
private long ntransacts = 0;
(ก) (ข)
รูปที่ 12.6 เปรียบเทียบการทํางานแบบ Unsynchronized และแบบ Synchronized
class Bank{
public static final int NTEST = 10000;
private final int[] accounts;
private long ntransacts = 0;
System.out.println("Transactions:" + ntransacts
+ " Sum: " + sum);
}
-- 49 Arithmetic Operator 47
! 53 ArrayIndexOutOfBoundException 260
!= 50 ArrayList 278
%= 49 attribute 99
& 53, 55 AudioClip 318
&& 53, 55 AWT 125
*= 49 AWTEvent 235
/= 49 binarySearch() 271
^ 53, 55 Bitwise Operator 47
++ 49 boolean 34, 35
+= 49 BorderLayout 132
< 50 break 94
<= 50 Button 138
-= 49 byte 34, 37
== 50 Canvas 161, 171
> 50 Casting 203
>= 50 catch 290
abstract 182, 221 char 34, 36
access modifier 106 character stream 324
ActionEvent 237 Checkbox 143
addActionListener 243 CheckboxGroup 145
AND 53 CheckboxMenuItem 155
Applet 130, 308 child class 113
args[] 69 Choice 146
argument 176, 230 class 104