SlideShare a Scribd company logo
Java 101: Intermediate Java
                  Programming Language

        หลกสตร Mini         Master of Java Technology




                                            ผศ.ธนศา เครอไวศยวรรณ
                                             คณะเทคโนโลยสารสนเทศ
                        สถาบนเทคโนโลยพระจอมเกล!าเจ!าค"ณทหารลาดกระบง




ผศ. ธนศา เครอไวศยวรรณ                                    Java Programming i
สารบญ
บทท 1 ความรเบองตนภาษาจาวา.......................................................................................................................................1
  1.1 ระบบคอมพวเตอร#เบราว#เซอร#.................................................................................................................................1
  1.2 ภาษาคอมพวเตอร#....................................................................................................................................................2
  1.3 ต)วแปลภาษา ............................................................................................................................................................6
  1.4 หล)กการของโปรแกรมเชงอ5อบเจกต# ......................................................................................................................7
  1.5 ประว)ตภาษาจาวา.....................................................................................................................................................9
  1.6 เทคโนโลย;จาวา......................................................................................................................................................10
     1.6.1 Java Virtual Machine....................................................................................................................................11
     1.6.2 Java Runtime Environment...........................................................................................................................12
     1.6.3 Java Development Kit...................................................................................................................................13
  1.7 จJดเดLนของภาษาจาวา.............................................................................................................................................15
  1.8 แพลตฟอร#มของเทคโนโลย;จาวา...........................................................................................................................16
     1.8.1 Java Platform, Standard Edition...................................................................................................................18
     1.8.2 Java Platform, Enterprise Edition.................................................................................................................18
     1.8.3 Java Platform, Micro Edition........................................................................................................................19
  1.9 โปรแกรมภาษาจาวา...............................................................................................................................................20
     1.9.1 การสรUางโปรแกรมจาวาประยJกต#..................................................................................................................20
     1.9.2 การสรUางโปรแกรมจาวาแอปเพล5ต................................................................................................................22
  1.10 คVLมอ Java API......................................................................................................................................................24
  สรJปเนYอหาของบท.......................................................................................................................................................25

บทท 2 พนฐานโปรแกรมภาษาจาวา.................................................................................................................................27
  2.1 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#..........................................................................................................27
  2.2 ไวยากรณ#ระด)บของคZา...........................................................................................................................................29
     2.2.1 คอมเม5นต# ......................................................................................................................................................29
     2.2.2 Identifier........................................................................................................................................................30
     2.2.3 ค;ย#เวร#ด...........................................................................................................................................................31

ii     Java Programming                                                                                                                         ผศ. ธนศา เครอไวศยวรรณ
2.2.4 ส)ญล)กษณ#แยกคZา...........................................................................................................................................32
     2.2.5 ชLองวLาง .........................................................................................................................................................33
     2.2.6 ขUอมVลคLาคงท;. .................................................................................................................................................33
  2.3 ชนดขUอมVลแบบพYนฐาน.........................................................................................................................................33
     2.3.1 ชนดขUอมVลตรรกะ..........................................................................................................................................35
     2.3.2 ชนดขUอมVลต)วอ)กขระ.....................................................................................................................................35
     2.3.3 ชนดขUอมVลต)วเลขจZานวนเต5ม ........................................................................................................................36
     2.3.4 ชนดขUอมVลต)วเลขทศนยม..............................................................................................................................37
  2.4 ต)วแปรและคLาคงท;.................................................................................................................................................38
     2.4.1 คZาส)งกZาหนดคLา .............................................................................................................................................39
     2.4.2 คLาคงท;. ...........................................................................................................................................................41
     2.4.3 ขอบเขตของต)วแปรและคLาคงท;....................................................................................................................42
  2.5 ต)วดZาเนนการ .........................................................................................................................................................45
     2.5.1 ต)วดZาเนนการทางคณตศาสตร#.......................................................................................................................46
     2.5.2 ต)วดZาเนนการแบบส)มพ)นธ#............................................................................................................................48
     2.5.3 ต)วดZาเนนการทางตรรกศาสตร#......................................................................................................................50
     2.5.4 ต)วดZาเนนการแบบบต....................................................................................................................................52
     2.5.5 ลZาด)บความสZาค)ญของต)วดZาเนนการ..............................................................................................................53
  2.6 การแปลงชนดขUอมVล..............................................................................................................................................54
     2.6.1 การแปลงขUอมVลในคZาส)งกZาหนดคLา...............................................................................................................55
     2.6.2 Typecasting...................................................................................................................................................57
  2.7 ชนดขUอมVลแบบอUางอง...........................................................................................................................................58
     2.7.1 คลาส String...................................................................................................................................................60
     2.7.2 คลาส Math...................................................................................................................................................62
  2.8 คZาส)งอนพJตและเอาต#พJต........................................................................................................................................64
     2.8.1 System.out.println()......................................................................................................................................64
     2.8.2 การร)บขUอมVลเขUามาทาง Command Line.......................................................................................................65
  สรJปเนYอหาของบท.......................................................................................................................................................66
บทท 3 โครงสรางควบค%ม.................................................................................................................................................69



ผศ. ธนศา เครอไวศยวรรณ                                                                                                                             Java Programming iii
3.1 คZาส)งโครงสรUางควบคJม.........................................................................................................................................69
     3.2 โครงสรUางแบบเลอกทZา..........................................................................................................................................70
        3.2.1 คZาส)ง if...........................................................................................................................................................70
        3.2.2 คZาส)ง if..else..................................................................................................................................................72
        3.2.3 คZาส)ง if แบบซUอน..........................................................................................................................................74
        3.2.4 คZาส)ง switch..................................................................................................................................................78
     3.3 โครงสรUางแบบทZาซYZา .............................................................................................................................................80
        3.3.1 คZาส)ง while....................................................................................................................................................81
        3.3.2 คZาส)ง do..while..............................................................................................................................................83
        3.3.3 คZาส)ง for........................................................................................................................................................84
     3.4 โครงสรUางแบบซUอน (Nested Structure)................................................................................................................86
        3.4.1 คZาส)ง break, continue และ label ...............................................................................................................88
     สรJปเนYอหาของบท.......................................................................................................................................................90

บทท 4 หลกการเช,งอ-อบเจกต.............................................................................................................................................93
  4.1 องค#ประกอบของโปรแกรมเชงอ5อบเจกต#.............................................................................................................93
     4.1.1 อ5อบเจกต#.......................................................................................................................................................93
     4.1.2 คลาส..............................................................................................................................................................94
     4.1.3 คJณล)กษณะ ...................................................................................................................................................95
     4.1.4 เมธอด...........................................................................................................................................................97
  4.2 การเข;ยนโปรแกรมเชงอ5อบเจกต#โดยใชUภาษาจาวา...............................................................................................98
     4.2.1 การประกาศคลาส..........................................................................................................................................98
     4.2.2 การประกาศคJณล)กษณะ................................................................................................................................99
     4.2.3 การประกาศเมธอด........................................................................................................................................99
     4.2.4 การประกาศและสรUางอ5อบเจกต#..................................................................................................................101
     4.2.5 การเร;ยกใชUสมาชกของอ5อบเจกต#................................................................................................................102
  4.3 คJณล)กษณะเดLนของโปรแกรมเชงอ5อบเจกต#........................................................................................................104
     4.3.1 การหLอหJUม ...................................................................................................................................................104
     4.3.2 การสบทอด ................................................................................................................................................106


iv      Java Programming                                                                                                                           ผศ. ธนศา เครอไวศยวรรณ
4.3.3 การม;ไดUหลายรVปแบบ..................................................................................................................................107
    4.4 การเข;ยนโปรแกรมเชงอ5อบเจกต#เพอสรUางคลาสแบบ abstract และอนเตอร#เฟส................................................109
       4.4.1 คลาสแบบ abstract......................................................................................................................................109
       4.4.2 อนเตอร#เฟส.................................................................................................................................................111
    4.5 แพคเก5จ................................................................................................................................................................113
       4.5.1 การประกาศและใชUแพคเก5จ........................................................................................................................114
    4.6Unified Modeling Language................................................................................................................................115
       4.6.1 ไดอะแกรมของคลาส .................................................................................................................................116
       4.6.2 ไดอะแกรมของอ5อบเจกต#............................................................................................................................116
    4.7 ข)นตอนการพ)ฒนาโปรแกรม...............................................................................................................................117
          Y
    สรJปเนYอหาของบท.....................................................................................................................................................119

บทท 5 การสรางส0วนต0อประสานกราฟ3กกบผใช............................................................................................................121
  5.1 Java Foundation Class ........................................................................................................................................121
     5.1.1 แพคเก5จ AWT.............................................................................................................................................122
     5.1.2 แพคเก5จ Swing............................................................................................................................................124
  5.2 คลาสประเภท Container ....................................................................................................................................125
     5.2.1 คลาส Frame................................................................................................................................................125
     5.2.2 คลาส Panel..................................................................................................................................................127
     5.2.3 คลาส Dialog................................................................................................................................................128
     5.2.4 คลาส JFrame...............................................................................................................................................128
  5.3 การจ)ดวางผ)งของสLวนประกอบกราฟmก...............................................................................................................131
     5.3.1 BorderLayout..............................................................................................................................................132
     5.3.2 FlowLayout.................................................................................................................................................135
     5.3.3 GridLayout..................................................................................................................................................137
  5.4 สLวนประกอบกราฟmกในแพคเก5จ Swing..............................................................................................................138
     5.4.1 คลาส JButton.............................................................................................................................................140
     5.4.2 คลาส JLabel...............................................................................................................................................141
     5.4.3 คลาส JTextField........................................................................................................................................144



ผศ. ธนศา เครอไวศยวรรณ                                                                                                                              Java Programming v
5.4.4 คลาส JTextArea.........................................................................................................................................145
        5.4.5 คลาส JcheckBox และ JRadioButton........................................................................................................147
        5.4.6 คลาส JComboBox.....................................................................................................................................150
        5.4.7 คลาส JList..................................................................................................................................................151
     5.5 การสรUางเมนV........................................................................................................................................................153
        5.5.1 การสรUาง JMenuBar...................................................................................................................................154
        5.5.2 การสรUาง JMenu.........................................................................................................................................154
        5.5.3 การสรUาง JMenuItem..................................................................................................................................155
        5.5.4 คลาส JCheckBoxMenuItem......................................................................................................................157
        5.5.5 การสรUางเมนVยLอย.........................................................................................................................................159
     5.6 คJณล)กษณะของคลาส Component......................................................................................................................161
     สรJปเนYอหาของบท.....................................................................................................................................................163

บทท 6 การเขยนโปรแกรมภาษาจาวาเช,งอ-อบเจกต.........................................................................................................165
  6.1 เมธอด .................................................................................................................................................................165
     6.1.1 การเร;ยกใชUเมธอด........................................................................................................................................165
     6.1.2 การสLงผLาน argument ..................................................................................................................................166
     6.1.3 การร)บคLาท;สLงกล)บมา..................................................................................................................................172
     6.1.4 modifier ของเมธอด....................................................................................................................................172
  6.2 การเข;ยนโปรแกรมโดยใชUหล)กการของการหLอหJม.............................................................................................173
                                                                             U
     6.2.1 เมธอดแบบ Accessor..................................................................................................................................175
     6.2.2 ค;ย#เวร#ด this..................................................................................................................................................178
  6.3 การเข;ยนโปรแกรมโดยใชUหล)กการของการสบทอด...........................................................................................179
     6.3.1 การสบทอดท;ถVกตUอง...................................................................................................................................182
     6.3.2 ค;ย#เวร#ด protected ......................................................................................................................................183
     6.3.3 คลาสท;ชอ Object........................................................................................................................................184
                      
     6.3.4 ค;ย#เวร#ด super ..............................................................................................................................................185
  6.4 การม;ไดUหลายรVปแบบ..........................................................................................................................................186
     6.4.1 Dynamic Binding........................................................................................................................................186


vi      Java Programming                                                                                                                       ผศ. ธนศา เครอไวศยวรรณ
6.4.2 การกZาหนดเมธอดใหUม;วธ;การท;ตางก)น.......................................................................................................187
                                                             L
      6.4.3 Virtual Method Invocation..........................................................................................................................190
      6.4.4 การสLงผLาน argument ไดUหลายรVป.............................................................................................................190
      6.4.5 ต)วดZาเนนการ instanceof.............................................................................................................................191
      6.4.6 การ Casting อ5อบเจกต#................................................................................................................................192
   6.5 Constructor..........................................................................................................................................................194
      6.5.1 การเข;ยน Constructor..................................................................................................................................195
      6.5.2 ข)นตอนการทZางานของคZาส)ง new ..............................................................................................................196
               Y
      6.5.3 Constructor แบบ Overloaded.....................................................................................................................197
      6.5.4 เมธอด this()...............................................................................................................................................198
      6.5.5 เมธอด super()..............................................................................................................................................199
      6.5.6 ข)นตอนการทZางานของ Constructor............................................................................................................200
                 Y
   6.6 เมธอดของคลาสท;ชอ Object...............................................................................................................................202
      6.6.1 เมธอด toString().........................................................................................................................................202
      6.6.2 เมธอด equals()............................................................................................................................................203
   6.7 คลาสประเภท Wrapper.......................................................................................................................................204
      6.7.1 Autoboxing..................................................................................................................................................205
   6.8 ค;ย#เวร#ดอนๆ ท;สZาค)ญ...........................................................................................................................................206
      6.8.1 คJณล)กษณะแบบ static.................................................................................................................................206
      6.8.2 เมธอดแบบ static.........................................................................................................................................207
      6.8.3 Static Initializer...........................................................................................................................................208
      6.8.4 ค;ย#เวร#ด final................................................................................................................................................209
   6.9 คลาสภายใน.........................................................................................................................................................210
      6.9.1 คลาสภายในท;อยVLภายในคลาส.....................................................................................................................210
      6.9.2 คลาสภายในท;อยVLภายในเมธอด...................................................................................................................212
   6.10 Generic Types....................................................................................................................................................213
      6.10.1 เมธอดแบบ Generic..................................................................................................................................214
   6.11Annotation..........................................................................................................................................................215
      6.11.1 Annotation Document...............................................................................................................................216



ผศ. ธนศา เครอไวศยวรรณ                                                                                                                         Java Programming vii
6.11.2 Annotation ท;ใชUโดยคอมไพเลอร#..............................................................................................................217
     สรJปเนYอหาของบท.....................................................................................................................................................218

บทท 7 การจดการกบเหต%การณ.กราฟ3ก...........................................................................................................................221
  7.1 เหตJการณ#.............................................................................................................................................................221
  7.2 AWTEvent...........................................................................................................................................................223
  7.2.1 ActionEvent......................................................................................................................................................224
  7.2.2 WindowEvent...................................................................................................................................................225
  7.2.3 MouseEvent......................................................................................................................................................225
  7.2.4 ItemEvent..........................................................................................................................................................226
  7.2.5 Event อนๆ .......................................................................................................................................................227
  7.3 อนเตอร#เฟสประเภท Listener..............................................................................................................................227
  7.4 การจ)ดการก)บเหตJการณ#.......................................................................................................................................230
  7.4.1 การสรUางอ5อบเจกต#ของคลาสภายนอก..............................................................................................................231
  7.5 การสรUางอ5อบเจกต#ของคลาสภายใน....................................................................................................................232
  7.5.1 การสรUางอ5อบเจกต#ภายในคลาสเด;ยวก)น..........................................................................................................234
  7.5.2 การร)บฟwงเหตJการณ#หลายเหตJการณ#.................................................................................................................235
  7.5.3 คลาสประเภท Event Adapter..........................................................................................................................237
  7.5.4 การสรUางคลาสแบบ anonymous .....................................................................................................................238
  สรJปเนYอหาของบท.....................................................................................................................................................239

บทท 8 อะเรย.และคอลเล-กชน..........................................................................................................................................241
  8.1 อะเรย#....................................................................................................................................................................241
  8.2 อะเรย#ของขUอมVลชนดพYนฐาน..............................................................................................................................242
     8.2.1 การประกาศชอต)วแปรอะเรย#ของขUอมVลชนดพYนฐาน.................................................................................242
     8.2.2 การสรUางต)วแปรอะเรย#ของขUอมVลชนดพYนฐาน...........................................................................................243
     8.2.3 การเร;ยกใชUสมาชกของอะเรย#......................................................................................................................245
     8.2.4 การกZาหนดคLาเรมตUนใหUก)บสมาชกของอะเรย# ...........................................................................................246
     8.2.5 การใชUคZาส)ง for เพออUางองสมาชกของอะเรย#.............................................................................................247


viii      Java Programming                                                                                                                        ผศ. ธนศา เครอไวศยวรรณ
8.2.6 ขUอผดพลาดประเภท ArrayIndexOutOfBoundsException .......................................................................248
    8.3 อะเรย#ของขUอมVลชนดคลาส..................................................................................................................................249
       8.3.1 การเก5บคLาของต)วแปรอะเรย#ของขUอมVลชนดคลาส......................................................................................251
    8.4 อะเรย#หลายมต.....................................................................................................................................................252
       8.4.1 การเข;ยนโปรแกรมเพอจ)ดการก)บเมตรกซ#..................................................................................................254
       8.4.2 อะเรย#สองมตท;ม;จZานวนคอล)มน#ตLางก)น......................................................................................................257
       8.4.3 เมธอดท;เก;ยวขUองก)บอะเรย#..........................................................................................................................259
    8.5 คอลเล5กช)น...........................................................................................................................................................261
       8.5.1 อนเตอร#เฟส Collection..............................................................................................................................262
       8.5.2 อนเตอร#เฟส Set .........................................................................................................................................263
       8.5.3 อนเตอร#เฟส List ........................................................................................................................................264
       8.5.4 อนเตอร#เฟส Map .......................................................................................................................................266
       8.5.5 อนเตอร#เฟส Iterator ..................................................................................................................................268
       8.5.6 คลาส Vector .............................................................................................................................................271
       8.5.7 การใชUคZาส)ง for และ Generic......................................................................................................................272
    สรJปเนYอหาของบท.....................................................................................................................................................273

บทท 9 การจดการกบขอผ,ดพลาด...................................................................................................................................275
  9.1 ขUอผดพลาด..........................................................................................................................................................275
  9.2 Exception.............................................................................................................................................................276
  9.3 คZาส)ง try..catch....................................................................................................................................................278
  9.4 การจ)ดการก)บขUอผดพลาดหลายๆ ประเภท..........................................................................................................279
  9.5 บล5อก finally........................................................................................................................................................281
  9.6 การจ)ดการก)บเมธอดท;สLงอ5อบเจกต#ประเภท Exception......................................................................................283
  9.7 การสรUางคลาสประเภท Exception ขxYนใหมL.........................................................................................................285
  9.7.1 การเข;ยนเมธอดเพอสLงอ5อบเจกต#ประเภท Exception.......................................................................................286
  สรJปเนYอหาของบท.....................................................................................................................................................287

บทท 10 คลาสอ,นพ%ตและเอาต.พ%ต...................................................................................................................................289



ผศ. ธนศา เครอไวศยวรรณ                                                                                                                            Java Programming ix
10.1 Stream ...............................................................................................................................................................289
       10.1.1 แพคเก5จ java.io..........................................................................................................................................290
       10.1.2 คลาสประเภท Byte Stream.......................................................................................................................292
       10.1.3 คลาส InputStream.....................................................................................................................................292
       10.1.4 คลาส OutputStream..................................................................................................................................294
       10.1.5 คลาสประเภท Character Stream...............................................................................................................295
    10.2 โหนดสZาหร)บ Stream.........................................................................................................................................296
    10.3 คลาสประเภท Stream ระด)บสVง.........................................................................................................................298
       10.3.1 DataInputStream และ DataOutputStream................................................................................................301
       10.3.2 InputStreamReader และ OutputStreamWriter.........................................................................................304
    10.4 คลาส File...........................................................................................................................................................305
       10.4.1 คลาส RandomAccessFile.........................................................................................................................307
       10.4.2ObjectInputStream และ ObjectOutputStream...........................................................................................308
    สรJปเนYอหาของบท.....................................................................................................................................................310




x     Java Programming                                                                                                                           ผศ. ธนศา เครอไวศยวรรณ
ผศ. ธนศา เครอไวศยวรรณ   Java Programming xi
บทท 1 ความรเบองตนภาษาจาวา
      เนYอหาในบทน;เY ปyนการแนะนZาภาษาจาวา โดยจะเรมจากการแนะนZาหล)กการของภาษาคอมพวเตอร#โดยท)วๆ ไป
                                                                                            
ประว)ตความเปyนมาโดยยLอของภาษาจาวา ขUอแตกตLางของภาษาจาวาก)บภาษาคอมพวเตอร#อนๆ หล)กการการทZางานของ
โปรแกรมภาษาจาวา และความหมายของเครองจ)กรสมมJตท;ใชUในภาษาจาวา พรUอมท)YงแนะนZาเทคโนโลย;และ
แพลตฟอร#มตLางๆ ของภาษาจาวา แนะนZาต)วอยLางการเข;ยนโปรแกรมจาวาประยJกต#และโปรแกรมจาวาแอปเพล5ต และ
ในสLวนทUายของบทไดUม;การแนะนZาวธ;การใชUคVLมอ Java API

1.1   ระบบคอมพ,วเตอร.
      เครองคอมพวเตอร#เปyนเครองอเล5กทรอนกส# ท;ใชUในการคZานวณและจ)ดการก)บระบบขUอมVล องค#ประกอบของ
ระบบคอมพวเตอร#โดยท)วไปจะเปyนด)งแสดงในรVปท; 1.1 ซxงจะประกอบไปดUวยสLวนหล)กสามสLวนคอ
                    
      1. ฮาร#ดแวร# (Hardware) คอสLวนประกอบท;เปyนต)วเครองคอมพวเตอร#ท;ประกอบดUวยหนLวยประมวลผล
         กลาง (Central Processing Unit หรอ CPU) อJปกรณ#สLวนอนพJต อJปกรณ#สLวนเอาต#พJต หนLวยความจZา
         และอJปกรณ#เก5บขUอมVล
      2. ระบบปฏบ)ตการ (Operating System) คอระบบซอฟต#แวร#ท;ตดต)YงเพอใหUโปรแกรมประยJกต#ตLางๆ
         สามารถตดตLอก)บฮาร#ดแวร#ไดU ระบบปฏบ)ตการท;นยมใชUในปwจจJบนม;อยVLหลายระบบ อาทเชLน Windows
                                                                      )
         Vista, Linux และ Solaris เปyนตUน ท)Yงน;Yฮาร#ดแวร#ชนดเด;ยวก)นสามารถท;จะม;ระบบปฏบ)ตการท;แตกตLาง
         ก)นไดU
      3. โปรแกรมประยJกต# (Application Program) คอโปรแกรมท;ใชUงานท)วๆ ไป เชLน โปรแกรม Word
         Processor, เกมส# หรอโปรแกรมเว5บเบราวเซอร# (Web Browser) เปyนตUน โปรแกรมเหลLาน;จะถVกพ)ฒนา
                                                                                              Y
         โดยใชUภาษาคอมพวเตอร#ตLางๆ อาทเชLน ภาษาฟอร#แทรน (FORTRAN) ภาษาโคบอล (COBOL)
         ภาษา C# ภาษา C++ หรอภาษาจาวา เปyนตUน โปรแกรมประยJกต#จะทZางานภายใตUระบบปฏบ)ตการ ด)งน)น          Y
         โปรแกรมประยJกต#ท;ทZางานบนระบบปฏบ)ตการระบบใดระบบหนxงจะไมLสามารถนZาไปใชUในระบบ ปฏบ)ต
                                                                        
         การอนไดU




ผศ. ธนศา เครอไวศยวรรณ                                                             ความรVUเบYองตUนภาษาจาวา   1
รปท 1.1 องคประกอบของระบบคอมพวเตอร


       เกร%ดความร!

                EDSAC เปนเครองคอมพวเตอรรนแรกๆของโลกสรางขนเมอเดอนพฤษภาคม คศ. 1949 โดยม%
      หนวยความจ(าหล)กเพ%ยง 512 ค(า (words) และสามารถค(านวณค(าส)งได 600 ค(าส)งตอวนาท% และม%ขนาด
      ใหญด)งร1ป




1.2    ภาษาคอมพ,วเตอร.
       ภาษาคอมพวเตอร#คอคZาส)งท;น)กพ)ฒนาโปรแกรม (programmer) พ)ฒนาขxนเพอส)งใหUเครองคอมพวเตอร#
                                                                     Y
ทZางานตามท;ตUองการ ภาษาคอมพวเตอร#แบLงออกเปyนสามประเภทคอ


2     ความรVUเบYองตUนภาษาจาวา                                                      ผศ. ธนศา เครอไวศยวรรณ
1.   ภาษาเครอง (Machine Language) เปyนภาษาเด;ยวท;เครองคอมพวเตอร#สามารถเขUาใจไดU ภาษาเครองจะ
             ประกอบไปดUวยคZาส)งท;เปyนชJดของเลขฐานสองเชLน 01010110 ซxงจะถVกกZาหนดโดยฮาร#ดแวร#ของเครอง
             คอมพวเตอร# ท)Yงน;YภาษาเครองจะขxนอยVLก)บชนดของหนLวยประมวลผลกลางของเครองคอมพวเตอร#แตLละ
                                               Y
             เครอง โดยปกตแลUวน)กพ)ฒนาโปรแกรมไมLสามารถท;จะพ)ฒนาโปรแกรมโดยเข;ยนภาษาเครองไดUโดยตรง
             ท)Yงน;Yเนองจากเปyนภาษาท;ใชUเลขฐานสองซxงไมLใชLชJดคZาส)งท;มนJษย#จะสามารถเขUาใจไดUโดยงLาย ต)วอยLางของ
             คZาส)งภาษาเครองม;ด)งน;Y
                         10110011     00011001
                         01111010     11010001 10010100
                         10011111     00011001
                         01011100     11010001 10010000
                         10111011     11010001 10010110

        2.   ภาษาแอสเซมบล; (Assembly Language) เปyนภาษาคอมพวเตอร#ท;แทนชJดคZาส)งเลขฐานสองดUวยคZา
             ส)ญล)กษณ#ท;เปyนภาษาอ)งกฤษ เชLน 10110011 อาจแทนดUวย MOV เปyนตUน ทZาใหUน)กพ)ฒนาโปรแกรมเข;ยน
             และเขUาใจโปรแกรมไดUงLายขxYน การทZางานของโปรแกรมภาษาแอสเซมบล; จะตUองม;การแปลภาษา แอส
             เซมบล;ใหUเปyนภาษาเครองกLอนจxงจะทZางานไดU แมUภาษาแอสเซมบล;จะม;ชJดคZาส)งท;เปyนคZาภาษาอ)งกฤษ แตL
             น)กพ)ฒนาโปรแกรมภาษาแอสเซมบล;จะตUองม;ความเขUาใจโครงสรUางฮาร#ดแวร#ของระบบคอมพวเตอร#จxงจะ
             สามารถเข;ยนโปรแกรมไดU ด)งน)YนทZาใหUภาษาแอสเซมบล;ไมLเปyนท;นยมใชU ต)วอยLางของโปรแกรมภาษาแอส
             เซมบล;ม;ด)งน;Y
                          MOV     0, SUM
                          MOV     NUM, AC
                          ADD     SUM, AC
                          STO     SUM, TOT

        3.   ภาษาระด)บสVง (High-level Language) การพ)ฒนาโปรแกรมโดยท)วไปจะใชUโปรแกรมภาษาคอมพวเตอร#
             ระด)บสVง ภาษาคอมพวเตอร#ระด)บสVงจะใชUชJดคZาส)งท;คนท)วไปเขUาใจไดUงLาย เหมอนการใชUคZาส)งในภาษา
                                                                     
             อ)งกฤษหรอการเข;ยนสมการคณตศาสตร#ทวไป น)กพ)ฒนาโปรแกรมไมLจZาเปyนตUองเขUาใจหล)กการทZางานของ
                                                      )
             ฮาร#ดแวร#ก5สามารถท;จะพ)ฒนาโปรแกรมภาษาคอมพวเตอร#ระด)บสVงไดU โปรแกรมภาษาคอมพวเตอร#ระด)บ
             สVง จะตUองการต)วแปลภาษาท;ทZาหนUาท;เปล;ยนชJดคZาส)งใหUมาเปyนภาษาแอสเซมบล;หรอภาษาเครองจxงจะ
             ทZางานไดU เมอเท;ยบก)บภาษาแอสเซมบล;แลUว ภาษาคอมพวเตอร#ระด)บสVงจะชLวยใหUน)กพ)ฒนาโปรแกรม
             พ)ฒนาโปรแกรมไดUรวดเร5วกวLา แตLโปรแกรมท;พ)ฒนาขxนจะทZางานไดUชUากวLา
                                                                   Y

        ในปwจจJบ)นม;โปรแกรมภาษาคอมพวเตอร#ระด)บสVงอยVLหลายรUอยภาษา แตLท;นยมใชUและไดUร)บการยอมร)บม;เพ;ยง



ผศ. ธนศา เครอไวศยวรรณ                                                                       ความรVUเบYองตUนภาษาจาวา   3
ไมLก;ภาษา ภาษาคอมพวเตอร#ในยJคแรกท;นยมใชUม;หลายภาษาอาทเชLน
         • ภาษาฟอร#แทรน (FORTRAN ยLอมาจาก FORmula TRANslator) พ)ฒนาโดยบรษ)ท IBM ระหวLางป}
            ค.ศ. 1954 ถxง ค.ศ. 1957 ภาษาน;ใชUสZาหร)บการพ)ฒนาโปรแกรมประยJกต#ดUานวทยาศาสตร#และ
                                          Y
            วศวกรรมศาสตร# ท;ตUองใชUในการคZานวณสมการคณตศาสตร#ท;ซ)บซUอน ปwจจJบนภาษาฟอร#แทรนย)งเปyนท;
                                                                                )
            นยมใชUในการพ)ฒนาโปรแกรมดUานวทยาศาสตร#และวศวกรรมศาสตร#
         • ภาษาโคบอล (COBOL ยLอมาจาก COmmon Business Oriented Language) พ)ฒนาขxนในป} ค.ศ.  Y
            1959 เปyนภาษาท;พ)ฒนาขxนมาเพอใชUในการพ)ฒนาโปรแกรมประยJกต#ดUานธJรกจและการคUา ปwจจJบ)น
                                    Y
            โปรแกรมท;ใชUในดUานธJรกจจZานวนมากอาทเชLนโปรแกรมในสถาบ)นการเงน ย)งเปyนโปรแกรมท;พ)ฒนามา
            จากภาษาโคบอล
         • ภาษาเบสก (BASIC ยLอมาจาก Beginners All-purpose Symbolic Instructional Code) เปyนภาษาท;
            พ)ฒนาขxนโดยม;จดประสงค#เพอใหUผเVU รมตUนพ)ฒนาโปรแกรมสามารถเร;ยนรVและเขUาใจการพ)ฒนาโปรแกรม
                     Y      J                                                U
            อยLางงLาย ภาษาเบสกเปyนภาษา คอมพวเตอร#ภาษาแรกท;ใชUในเครองไมโครคอมพวเตอร#

     เกร%ดความร!

            การเข%ยนโปรแกรมภาษาฟอรแทรนหรอภาษาโคบอลในยคแรกจะใชเครองคอมพวเตอรท%อาน
    โปรแกรมจาก punch card ท%ตองใชการดหนงใบตอหนงค(าส)ง ซงเครองคอมพวเตอรท%ใช punch card
    ย)งม%การใชในการเร%ยนการสอนในประเทศไทยจนถงป6 พ.ศ. 2529 จนกระท)งเครองคอมพวเตอรพ%ซ%เขา
    มาแทนท%




         ภาษาคอมพวเตอร#ท;พ)ฒนาขxYนในยJคแรก ย)งม;ขUอจZาก)ดในการท;จะพ)ฒนาโปรแกรมขนาดใหญL ท)Yงน;เY นองจาก
                                                                 
ภาษาคอมพวเตอร#เหลLาน)YนขาดโครงสรUางท;ด; ทZาใหUการพ)ฒนาโปรแกรมท;ม;ขนาดใหญLและม;ความซ)บซUอนเปyนไปไดU
ยาก ในชLวงตUนป} ค.ศ. 1970 จxงม;ภาษาคอมพวเตอร#ท;เปyนภาษาเชงกระบวนการ (Procedural หรอ Structural
Language) เกดขxYน ภาษาคอมพวเตอร#ประเภทน;จะม;ความยดหยJLนในการพ)ฒนาโปรแกรม ทZาใหUสามารถแกUไขและ
                                             Y
บZารJงร)กษาไดUงLาย เนองจากโปรแกรมถVกแยกออกเปyนสLวนๆ ภาษาคอมพวเตอร#ท;เปyนภาษาเชงกระบวนการท;สZาค)ญคอ


4   ความรVUเบYองตUนภาษาจาวา                                                          ผศ. ธนศา เครอไวศยวรรณ
•   ภาษาปาสคาล (Pascal) พ)ฒนาโดย Nicklaus Wirth ในป} ค.ศ. 1971 โดยม;จJดประสงค#เพอใชUในการ
            สอนการเข;ยนโปรแกรมภาษาเชงกระบวนการ ในมหาวทยาล)ย แตLเนองจากภาษาปาสคาลไมLม;คJณล)กษณะท;
            จะสน)บสนJนการพ)ฒนาโปรแกรมดUานธJรกจและอJตสาหกรรมจxงไมLไดUร)บความนยมมากน)ก
        •   ภาษาซ; (C) พ)ฒนาขxนในชLวงเด;ยวก)บภาษาปาสคาล โดยน)กวจ)ยท;หUองปฏบ)ตการ AT&T Bell ซxงไดUนZาเอา
                              Y
            จJดเดLนของภาษา BCPL และภาษา B มาใชUและไดUเพมคJณล)กษณะและชนดขUอมVลอนเขUามาดUวย เดมภาษาซ;
            ถอวLาเปyนภาษาคอมพวเตอร#ท;สZาค)ญในการพ)ฒนาโปรแกรมบนระบบปฏบ)ตการยVนกส# (Unix) ซxงเปyนภาษา
            คอมพวเตอร#ท;สามารถสรUางโปรแกรมประยJกต#ท;ทZางานไดUรวดเร5วมาก เมอเท;ยบก)บภาษาคอมพวเตอร#อนๆ

            จJดดUอยของการพ)ฒนาโปรแกรมภาษาเชงกระบวนการคอ จะม;ตUนทJนในการพ)ฒนาโปรแกรมท;คLอนขUางสVง
เนองจากจะตUองม;การออกแบบโปรแกรมใหUแยกออกเปyนสLวนๆ ท;เร;ยกวLาโมดVล (module) ซxงจะตUองเปyนอสระจากก)น
การออกแบบใหUมความเปyนอสระตLอก)นน)นทZาไดUยาก ซxงหากออกแบบมาไมLด;จะทZาใหUการแกUไขและบZารJงร)กษา
                      ;                   Y
โปรแกรมเปyนไปไดUยาก ด)งน)นจxงม;การพ)ฒนาภาษาคอมพวเตอร#ในแบบท;เร;ยกวLา ภาษาเชงอ5อบเจกต# (Object-
                                    Y
Oriented Programming) ท;พยายามใหUการพ)ฒนาโปรแกรมเปyนการเล;ยนแบบการทZางานของอ5อบเจกต#ตLางๆ ในโลก
ท)Yงน;เY พอใหUงLายตLอการพ)ฒนาโปรแกรมและสามารถนZาโปรแกรมกล)บมาใชUใหมL (reuse) ไดUด;กวLาภาษาเชงกระบวนการ
ภาษาคอมพวเตอร#ท;เปyนภาษาเชงอ5อบเจกต#ท;สZาค)ญคอ
            • ภาษา C++ เปyนภาษาท;พ)ฒนามาจากภาษาซ;เมอตUน ค.ศ. 1980 โดยน)กวจ)ยท;หUองปฏบ)ตการ Bell โดยไดU
               เพมหล)กการเชงอ5อบเจกต#ขxYนมาจากภาษาซ; ด)งน)นน)กพ)ฒนาโปรแกรมภาษา C++ สามารถท;จะพ)ฒนา
                                                           Y
               โปรแกรมท)Yงในเชงอ5อบเจกต#และเชงกระบวนการ (ตามแบบภาษาซ;) ไดU ทZาใหUปwจจJบนภาษา C++ ย)งเปyนท;
                                                                                               )
               นยมใชUก)นอยLางแพรLหลาย
            • ภาษา Smalltalk เปyนภาษาเชงอ5อบเจกต#ท;พ)ฒนาโดยน)กวจ)ยท; Xerox’s Palo Alto Research Center
               (PARC) ซxงเปyนภาษาคอมพวเตอร#ท;เปyนภาษาเชงอ5อบเจกต# อยLางแทUจรง แตLภาษา Smalltalk ไมLไดUร)บ
               ความนยมในการนZาไปใชUงานมากน)กเมอเท;ยบก)บภาษา C++ หรอภาษาจาวา
            • ภาษาจาวาเปyนภาษาคอมพวเตอร#ท;พ)ฒนาโดย น)กวจ)ยของบรษ)ทซ)นไมโครซสเต5มส# (Sun Microsystems)
               โดยเรมม;การนZามาเผยแพรLเมอป} ค.ศ. 1995 ปwจจJบ)นเปyนภาษาเชงอ5อบเจกต#ท;เปyนท;นยมใชUก)นมากภาษา
                                                                                             
               หนxง ซxงไดUร)บการยอมร)บในการพ)ฒนาโปรแกรมทางธJรกจและอJตสาหกรรม และย)งเปyนท;นยมใชUเพอการ
                                                                                                
               ศxกษาหล)กการการเข;ยนโปรแกรมคอมพวเตอร#โดยใชUภาษาเชงอ5อบเจกต#อ;กดUวย นอกจากน;Yภาษาจาวาย)ง
               เปyนซอฟต#แวร#แบบเปmดเผยซอร#สโคUด (Open source code)
            • ภาษา C# เปyนภาษาคอมพวเตอร#ท;ม;ล)กษณะคลUายก)บภาษาจาวาท;พ)ฒนาโดยบรษ)ท Microsoft โดยม;
               จJดประสงค#เพอใหUน)กพ)ฒนาโปรแกรมสามารถพ)ฒนาโปรแกรมเชงอ5อบเจกต#ท;จะร)นบนระบบปฎบ)ตการ
               Windows ไดUงLายขxน Y


ผศ. ธนศา เครอไวศยวรรณ                                                                ความรVUเบYองตUนภาษาจาวา   5
1.3    ตวแปลภาษา

         ภาษาคอมพวเตอร#ระด)บสVงจะตUองการต)วแปลภาษา (Language Translator) เพอแปลโปรแกรมท;เข;ยนขxน     Y
หรอท;เร;ยกวLาซอร#ดโคUด (Source Code) ของภาษาคอมพวเตอร#แตLละภาษาใหUเปyนภาษาแอสเซมบล;หรอภาษาเครองท;
เครองคอมพวเตอร#สามารถเขUาใจไดU ต)วแปลภาษาแบLงออกเปyนสองแบบคอ
          1. คอมไพเลอร# (Compiler) ต)วแปลภาษาประเภทน;YจะแปลชJดคZาส)งในซอร#ดโคUดท)YงหมดใหUเปyนโปรแกรม
              executable code ด)งแสดงในรVปท; 1.2 ต)วอยLางเชLน แปลซอร#ดโคUดภาษาซ;จากโปรแกรม Hello.c ใหU
              เปyนโปรแกรม executable code ท;ชอ Hello.exe โดยโปรแกรม executable code ท;ไดUจากการแปล
              ภาษาคอมพวเตอร#ระด)บสVงจะสามารถทZางานไดUอยLางรวดเร5ว ท)Yงน;YเนองจากโคUดอยVLในรVปของเลขฐานสอง
              ท;สามารถตดตLอก)บเครองคอมพวเตอร#ไดUโดยตรง ต)วอยLางของภาษา คอมพวเตอร#ท;ใชUคอมไพเลอร# คอ
              ภาษาซ; C++ ฟอร#แทรน และปาสคาล เปyนตUน
                        คอมไพเลอร#จะสรUางโปรแกรม executable code ท;ขxYนอยVLก)บแพลตฟอร#ม (ฮาร#ดแวร#และระบบ
              ปฏบ)ตการ) ด)งน)นผVUใชUจะไมLสามารถนZาโปรแกรม executable code ท;ไดUจากการแปลของคอมไพเลอร#
                              Y
              บนแพลตฟอร#มหนxงไปใชUบนแพลตฟอร#มอนๆ ไดU ในกรณ;ท;น)กพ)ฒนาโปรแกรมตUองการนZาโปรแกรมท;
              พ)ฒนาขxนไปใชUบนแพลตฟอร#มอนๆ น)กพ)ฒนาโปรแกรมจะตUองทZาการแปลซอร#ดโคUด ของโปรแกรม
                      Y
              ใหมL โดยจะตUองใชUคอมไพเลอร#ท;สรUางโปรแกรม executable code สZาหร)บแพลตฟอร#มท;ตUองการใชU
              งานน)นๆ
                    Y




                                รปท 1.2 ขนตอนการทางานของคอมไพเลอร



6     ความรVUเบYองตUนภาษาจาวา                                                          ผศ. ธนศา เครอไวศยวรรณ
2.   อนเตอร#พร;ตเตอร# (Interpreter) ต)วแปลภาษาประเภทน;จะแปลชJดคZาส)งของภาษาคอมพวเตอร#ระด)บสVง
                                                                   Y
               ท;ละคZาส)งใหUเปyนโปรแกรม executable code แลUวจะส)งใหUเครองคอมพวเตอร#ทZางานท)นท;ด)งแสดงใน
               รVปท; 1.3 โปรแกรมภาษาคอมพวเตอร#ท;ใชUอนเตอร#พร;ตเตอร# จะทZางานไดUชากวLาโปรแกรมภาษา
                                                                                   U
               คอมพวเตอร#ท;ใชUคอมไพเลอร# แตLขUอด;ของโปรแกรมภาษาคอมพวเตอร#ทใชUอนเตอร#พร;ตเตอร#คอจะ
                                                                                ;
               สามารถใชUงานขUามแพลตฟอร#มไดU ท)Yงน;Yเนองจากข)YนตอนการแปลภาษากระทZาอยVLในชLวงการร)น
               โปรแกรม นอกจากน;โปรแกรมอนเตอร#พร;ตเตอร#จะพ)ฒนาไดUงLายกวLาเนองจากม;ขนาดเล5ก ต)วอยLางของ
                                    Y
               ภาษาคอมพวเตอร#ท;ใชUอนเตอร#พร;ตเตอร#คอ ภาษาเบสก โปรล5อก (Prolog) และ Smalltalk เปyนตUน




                                รปท 1.3 ขนตอนการทางานของอนเตอรพรตเตอร


1.4   หลกการของโปรแกรมเช,งอ-อบเจกต.

      การเข;ยนโปรแกรมโดยใชUภาษาคอมพวเตอร#ระด)บสVงในปwจจJบนจะม;แนววธ;การคดอยVLสองรVปแบบท;สZาค)ญคอ
                                                            )
แนวคดเชงกระบวนการ และแนวคดเชงอ5อบเจกต# ด)งท;กลLาวไวUในห)วขUอท; 1.2 การเข;ยนโปรแกรมโดยใชUภาษาเชง
กระบวนการ จะเรมตUนจากการวเคราะห#ปญหาโดยพจารณาจากกระบวนการและลZาด)บการทZางาน และจะพยายามแบLง
                                  w
โปรแกรมออกเปyนสLวนๆ ตามฟwงก#ช)นของการทZางานอาทเชLน การพ)ฒนาโปรแกรมระบบทะเบ;ยนน)กเร;ยนโดยใชU
โปรแกรมเชงกระบวนการอาจจะพจารณาแบLงโปรแกรมตามลZาด)บการทZางาน โดยอาจม;ฟwงก#ชนในการทZางานสZาหร)บ
                                                                                 )
การลงทะเบ;ยนรายวชา การชZาระเงน หรอการเพมหรอถอนรายวชา เปyนตUน




ผศ. ธนศา เครอไวศยวรรณ                                                               ความรVUเบYองตUนภาษาจาวา   7
ฟwงก#ชนแตLละสLวนของโปรแกรมเชงกระบวนการ จะม;ต)วแปรท;จะสLงผLานขUอมVลระหวLางก)น การออกแบบ
             )
โปรแกรมเชงกระบวนการท;ด;จะตUองพยายามแบLงฟwงก#ชนใหUเปyนอสระตLอก)นใหUมากท;สJด และตUองพยายามท;จะเข;ยนข)น
                                                 )                                                    Y
ตอนหรอลZาด)บการทZางานใหUสมบVรณ#ท;สJดต)YงแตLขนตอนการออกแบบ จxงทZาใหUการปร)บปรJงหรอแกUไขโปรแกรมท;
                                             )Y
พ)ฒนาจากภาษาเชงกระบวนการทZาไดUยากเมอเท;ยบก)บโปรแกรมท;พ)ฒนาจากภาษาเชงอ5อบเจกต# ท)Yงน;เY นองจาก
กระบวนการการพ)ฒนาโปรแกรมน)นไมLสามารถท;จะออกแบบโปรแกรมใหUสมบVรณ#ต)YงแตLตUนโดยไมLม;การนZากล)บมา
                             Y
แกUไขปร)บปรJงอ;กไดU

           การพ)ฒนาโปรแกรมเชงอ5อบเจกต#จะม;แนวคดในการแกUปwญหา โดยมองปwญหาวLาประกอบไปดUวยอ5อบเจกต#
ตLางๆ ซxงแนวคดน;YจะเขUาใกลUเค;ยงก)บธรรมชาตของมนJษย#มากท;สJด เนองจากมนJษย#มองสงตLางๆ รอบต)วเปyนอ5อบเจกต#
ท)Yงท;เปyนรVปธรรม (ว)ตถJ) เชLน ปากกา น)กศxกษา หรอใบลงทะเบ;ยน เปyนตUน และท;เปyนนามธรรมเชLน คะแนน หรอราย
ชอวชา เปyนตUน

        การเข;ยนโปรแกรมเชงอ5อบเจกต#จะเปyนขบวนการการวเคราะห#ปญหา โดยการจZาลองคJณล)กษณะและ
                                                                 w
พฤตกรรมของอ5อบเจกต#ในระบบจรง ใหUอยVLในรVปของโปรแกรมคอมพวเตอร# ต)วอยLางเชLน การพ)ฒนาโปรแกรมระบบ
ทะเบ;ยนน)กศxกษาอาจแบLงโปรแกรมใหUประกอบดUวยอ5อบเจกต#ตLางๆ อาทเชLน น)กศxกษา ใบลงทะเบ;ยน และรายวชา
เปyนตUน อ5อบเจกต#ชนดน)กศxกษาอาจม;คJณล)กษณะตLางๆ เชLน ชอ รห)ส และเกรดเฉล;ย เปyนตUน และอาจม;พฤตกรรมท;
น)กศxกษาสามารถกระทZาไดUเชLน ลงทะเบ;ยน และเพมหรอถอนวชา เปyนตUน

        การพ)ฒนาโปรแกรมโดยใชUภาษาคอมพวเตอร#เชงอ5อบเจกต# จะทZาใหUขบวนการพ)ฒนาโปรแกรมทZาไดUรวดเร5ว
ขxYนและสามารถปร)บปรJงแกUไขโปรแกรมไดUงLาย ซxงเหมาะก)บการพ)ฒนาโปรแกรมขนาดใหญLท;จะตUองม;การปร)บปรJง
แกUไขโปรแกรมอยVLตลอด นอกจากน;โปรแกรมเชงอ5อบเจกต#ย)งม;คJณล)กษณะเดLนอนๆ อ;กด)งน;Y
                                 Y
        • การหLอหJUม (Encapsulation) เปyนคJณล)กษณะท;ทZาใหUอ5อบเจกต#แตLละต)วเปyนอสระตLอก)น ซxงทZาใหUสามารถ
           แบLงการพ)ฒนาโปรแกรมออกเปyนสLวนๆ ไดUงLาย
        • การสบทอด (Inheritance) เปyนคJณล)กษณะท;ทZาใหUสามารถนZาโปรแกรมท;พ)ฒนาแลUวกล)บมาใชUใหมLไดU
           งLายกวLาการเข;ยนโปรแกรมเชงกระบวนการ
        • การม;ไดUหลายรVปแบบ (Polymorphism) เปyนคJณล)กษณะท;ทZาใหUน)กพ)ฒนาโปรแกรมสามารถเพมเตมสLวน
           ตLางๆ ของโปรแกรมไดUงLาย




8   ความรVUเบYองตUนภาษาจาวา                                                             ผศ. ธนศา เครอไวศยวรรณ
1.5   ประวต,ภาษาจาวา
         ภาษาจาวาเปyนภาษาคอมพวเตอร#ท;พ)ฒนาขxYน โดยท;มวจ)ยของบรษ)ทซ)นไมโครซสเต5มส# ซxงเรมตUนเมอป} ค .ศ.
1991 โดยทางบรษ)ทซ)นไมโครซสเต5มส#ไดUสน)บสนJนใหUม;การพ)ฒนาโครงการท;ชอ Green Project ท;ม;จJดมJLงหมายท;
จะออกแบบภาษาคอมพวเตอร#ขนาดเล5กเพอใชUก)บอJปกรณ#อเล5กทรอนกส#ตLางๆ เชLน สวทซ#บล5อกของเคเบYลท;ว; ซxง
อJปกรณ#เหลLาน;Yจะม;ขUอจZาก)ดในดUานหนLวยความจZาและหนLวยประมวลผลกลางท;จะม;ความแตกตLางก)น ด)งน)นภาษาY
คอมพวเตอร#ท;พ)ฒนาขxนจะตUองไมLขนอยVLก)บแพลตฟอร#ม (Platform Independent) ผลงานของท;มวจ)ยน;YทZาใหUไดUภาษา
                      Y             xY
คอมพวเตอร#ใหมLท;ชอวLา “Oak” ซxงม;โครงสรUางและคZาส)งคลUายภาษา C++ ท)Yงน;เY นองจากท;มวจ)ยของบรษ)ทซ)นไมโคร
ซสเต5มส#ม;ความคJนเคยก)บระบบปฏบ)ตการยVนกส#ซxงม)กจะใชUภาษา C++ ในการพ)ฒนาโปรแกรม ภาษา “Oak” ตLอมาไดU
                 U
เปล;ยนมาเปyนชอ “จาวา” ท)Yงน;Yเนองจากท;มวจ)ยไดUทราบภายหล)งวLา ” Oak” เปyนชอภาษาคอมพวเตอร#ท;ม;อยVLแลUว
         ภาษาจาวาเปyนภาษาคอมพวเตอร#เชงอ5อบเจกต# (Object Oriented Programming หรอเร;ยกยLอวLา OOP) โดย
ม;จJดเดLนตรงท;สามารถทZางานไดUก)บระบบคอมพวเตอร#หลายแพลตฟอร#ม ท;มวจ)ยของโครงการ Green Project ไดU
สรUางเครองตUนแบบท;เร;ยกวLา “*7” ซxงเปyนร;โมทคอนโทรล เพอสาธตเทคโนโลย;ภาษาจาวาท;คUนคดขxนมาน;Yเมอป} ค .ศ.
                                                                                              Y
1992 โดยทางบรษ)ทซ)นไมโครซสเต5มส#ไดUพยายามหาผVซYอเทคโนโลย;ด)งกลLาว แตLก5ไมLประสบความสZาเร5จมากน)ก
                                                     U

      เกร%ดความร!

                            James Gosling เปนผ1ท%คดคนภาษาจาวาจนไดร)บการยกยองวาเปนบดาของ
                            ภาษาจาวา โดยเขาเกดท%ประเทศ Canada จบการศกษาระด)บปรญญาเอกท%
                            มหาวทยาล)ย Carnegie Mellon และเขาท(างานท%บรษ)ท Sun Microsystems
      ต)งแตป6 ค.ศ. 1984 และในป6 ค.ศ. 2007 เขาไดร)บการยกยองจากประเทศ Canada ใหเปน Officer ของ
      Order of Canada ซงเปนเก%ยรตยศท%มอบใหก)บพลเมองของประเทศ

                            โลโกของภาษาจาวาจะเปนร1ปแกวกาแฟท%ม%คว)นรอนระอขนมา โดยทางบรษ)ท
                            Sun Microsystems ไดเปล%ยนร1ปโลโกเดมมาเปนร1ปลาสดด)งท%แสดงใหเห9น




                              Duke เปน mascot ของภาษาจาวา ซงจะม%การใชส)ญล)กษณในทาทางท%แตก
                              ตางก)น และในงานประชม Java One Conference ท%จ)ดเปนประจ(าทกป6 ก9จะ
                              ม%การมอบรางว)ลใหแกซอฟตแวรหรอน)กพ)ฒนาท%ใชเทคโนโลย%จาวาและม%นว)ต
                              กรรมด%เดนท%เร%ยกวา Duke's Choice Awards



ผศ. ธนศา เครอไวศยวรรณ                                                               ความรVUเบYองตUนภาษาจาวา   9
ในชLวงด)งกลLาว ระบบอนเทอร#เน5ตไดUเรมม;การใชUงานอยLางแพรLหลายมากขxYน โดย เฉพาะการใชUงานของ
โปรแกรมเว5บเบราวเซอร# (Web Browser) เพอท;จะเร;ยกดVเอกสารในรVปแบบของไฟล# HTML เนองจากระบบ
อนเทอร#เน5ตจะประกอบไปดUวยเครองคอมพวเตอร#ท;ม;แพลตฟอร#มแตกตLางก)น ทางบรษ)ทซ)นไมโครซสเต5มส#จxงไดUเห5น
ความจZาเปyนท;จะตUองม;ภาษาคอมพวเตอร#ท;สามารถสรUางโปรแกรมท;ทZางานบนแพลตฟอร#มใดๆ ก5ไดU จxงไดUนZาภาษา
จาวามาพ)ฒนาอ;กคร)Yงหนxง โดยไดUพ)ฒนาโปรแกรมเว5บเบราว#เซอร#ท;ชอ Hot Java ท;สามารถร)นโปรแกรมจาวา
แอปเพล5ต (Java Applet) ไดUเพอพสVจน#การทZางานของเทคโนโลย;จาวา (Proof of Technology) และไดUนZาผลงาน
ด)งกลLาวมาแสดงในงาน Sun World’95 ในเดอนพฤษภาคม ป} ค.ศ. 1995

          จากน)นภาษาจาวาเรมเปyนท;นยมแพรLหลายขxนในชLวงปลายป} ค.ศ. 1995 เมอบรษ)ท Netscape ไดUพ)ฒนาโปร
               Y                              Y
แกรมเว5บเบราว#เซอร# Netscape 2.0 และไดUรวมเอาการทZางานของ โปรแกรมจาวาแอปเพล5ต (Java Applet) เขUามา
เปyนคJณล)กษณะเดLนของโปรแกรม ซxงบรษ)ทอนๆ อาทเชLน IBM, Symantec, Inspire หรอ Microsoft ตLางก5ประกาศ
สน)บสนJนการใชUงานของโปรแกรมภาษาจาวาในเวลาตLอมา ในชLวงเด;ยวก)นทางบรษ)ทซ)นไมโครซสเต5มส#ไดUนZาชJด
พ)ฒนาโปรแกรมภาษาจาวาเวอร#ช)นแรก (Java Development Kit 1.0 หรอท;เร;ยกยLอวLา JDK 1.0) ออกมาแจกจLาย
ตLอมาในป} ค.ศ. 1998 ทางบรษ)ทซ)นไมโครซสเต5มส#ไดUเผยแพรLโปรแกรมภาษาจาวา JDK 1.2 (แตLตLอมาไดUเปล;ยนชอ
เปyน Java 2) และไดUแยกแพลตฟอร#มในการพ)ฒนาโปรแกรมภาษาจาวาเปyนหลายแพลตฟอร#มคอ J2EE สZาหร)บการ
พ)ฒนาโปรแกรมประยJกต#บนเครองแมLขLาย (Server) J2ME สZาหร)บการพ)ฒนาโปรแกรมบนเครองโทรศ)พท#มอถอ และ
J2SE สZาหร)บโปรแกรมมาตรฐานจาวาท;พ)ฒนาบนเครองคอมพวเตอร#พYนฐาน และป} ค .ศ. 2006 ทางซ)นไมโครซสเต5ม
ส#ไดUเปล;ยนชอ J2 ท)Yงสามเปyน JavaEE, JavaME และ JavaSE ตามลZาด)บ

         ในเดอนมกราคม ป} ค.ศ. 2010 บรษ)ทออราเคล (Oracle Corporation) ซxงเปyนซอฟต#แวร#ท;พ)ฒนาโปรแกรม
ฐานขUอมVล และซอฟต#แวร#ประยJกต#อนๆ ไดUเขUามาซYอกจการบรษ)ทซ)นไมโครซสเต5มส# ทZาใหUผVUพ)ฒนาเทคโนโลย;จาวาราย
สZาค)ญไดUเปล;ยนเปyนบรษ)ทออราเคล ซxงไดUใชUเทคโนโลย;จาวาในซอฟต#แวร#ตางๆ จZานวนมาก ท)Yงน;Y บรษ)ทออราเคลก5จะ
                                                                    L
ย)งคงไวUในหล)กการของเทคโนโลย;จาวาท;จะใหUมาตรฐานเปmด โปรแกรมเปmดรห)ส (Open Source) และสามารถทZางาน
บนแพลตฟอร#มท;หลากหลายไดUเชLนเดม

1.6   เทคโนโลยจาวา

        เทคโนโลย;จาวาประกอบไปดUวยองค#ประกอบหล)กๆ สามสLวนด)งแสดงในรVปท; 1.4 คอ
        1. Java Virtual Machine (JVM) เปyนเทคโนโลย;จาวาท;ทZาหนUาท;เปyนอนเตอร#พร;ตเตอร# ท;จะแปลโปรแกรม
                                                             
           จาวาไบท#โคUด (Java Bytecode) ใหUเปyนภาษาท;เครองเขUาใจไดU


10    ความรVUเบYองตUนภาษาจาวา                                                         ผศ. ธนศา เครอไวศยวรรณ
2. Java Runtime Environment (JRE) เปyนเทคโนโลย;จาวาท;ใชUในการร)นโปรแกรมภาษาจาวาอาทเชLน
           โปรแกรมจาวาประยJกต# (Java Application) และโปรแกรมจาวาแอปเพล5ต (Java Applet) JRE จะ
           ประกอบดUวย JVM และ Java Application Programming Interface (Java API) ท;จะรวบรวมคลาส
           และอนเตอร#เฟสตLางๆ ท;จZาเปyนตLอการใชUงานของโปรแกรมภาษาจาวา
        3. Java Software Developer Kit (JDK) เปyนชJดพ)ฒนาโปรแกรมภาษาจาวาท;จะประกอบไปดUวย JVM ต)ว
                                                                           
           แปลภาษาจาวา (Java Compiler) เครองมอ (tool) อนๆ ในการพ)ฒนาโปรแกรม และ API ท)Yงหมดใน
           ภาษาจาวา ซxง API จะเปyนมาตรฐานคZาส)งตLางๆ ของภาษาจาวา




                                  รปท 1.4 องคประกอบของเทคโนโลยจาวา

1.6.1 Java Virtual Machine
        ภาษาจาวาออกแบบมาเพอใหUสามารถประมวลผลไดUก)บทJกแพลตฟอร#ม โดยไดUรวมหล)กการของต)วแปลภาษา
ท)Yงคอมไพเลอร#และอนเตอร#พร;ตเตอร#ไวU โดยคอมไพเลอร#ของภาษาจาวาจะทZาหนUาท;แปลซอร#ดโคUดของโปรแกรม (ชอ
ไฟล#.java) ใหUเปyนโปรแกรมไบท#โคUด (ชอไฟล#.class) โปรแกรมไบท#โคUดจะแตกตLางจากโปรแกรมภาษาเครองท;
สามารถประมวลผลบนระบบปฏบ)ตการไดUโดยตรง แตLโปรแกรมไบท#โคUดจะประมวลผลไดUโดยผLานอนเตอร#พร;ตเตอร#
ซxงจะแปลโปรแกรมไบท#โคUดแลUวส)งงานไปย)งเครองคอมพวเตอร# อนเตอร#พร;ตเตอร#แบบน;ม;ชอเร;ยกวLา JVM (Java
                                                                              Y
Virtual Machine หรอเครองจ)กรสมมJตจาวา) ซxงข)YนตอนการทZางานของโปรแกรมภาษาจาวาสามารถแสดงไดUด)งรVปท;
1.5
        JVM จะทZาหนUาท;แปลโปรแกรมไบท#โคUดใหUเปyนภาษาเครองท;ขxYนอยVLก)บแพลตฟอร#มโปรแกรมไบท#โคUดท;
ประมวลผลโดยใชU JVM จะทZางานไดUเร5วกวLาโปรแกรมภาษาคอมพวเตอร#อนๆ ท;ใชUอนเตอร#พร;ตเตอร#ปกตในการ
                                                                          
ประมวลผล ท)Yงน;เY นองจาก JVM จะม;ชJดคZาส)งท;ใกลUเค;ยงก)บชJดคZาส)งภาษาเครองของหนLวยประมวลผลกลางท;ใชUงาน
ด)งน)น JVM จxงสามารถแปลคZาส)งของโปรแกรมไบท#โคUดไปเปyนคZาส)งภาษาเครองของหนLวยประมวลผลกลางท;ใชUงาน
     Y
ไดUงLายกวLา นอกจากน;โปรแกรมไบท#โคUดจะไมLขxYนอยVLก)บแพลตฟอร#ม ด)งน)นเราสามารถท;จะนZาโปรแกรมไบท#โคUดท;
                     Y                                                  Y


ผศ. ธนศา เครอไวศยวรรณ                                                              ความรVUเบYองตUนภาษาจาวา   11
คอมไพล#จากระบบปฏบ)ตการหนxง มาประมวลผลบนระบบปฏบ)ตการอ;นๆ ไดU หากระบบปฏบ)ตการน)นม; JVM อยVL     Y
          JVM เปyนเครองจ)กรกลสมมJตท;ทZาหนUาท;เหมอนก)บระบบคอมพวเตอร#จรง โดยมาตรฐานของ JVM ท;กZาหนด
โดยบรษ)ทซ)นไมโครซสเต5มส#จะม;ขUอกZาหนดตLางๆ เชLนเด;ยวก)บองค#ประกอบของระบบคอมพวเตอร#เชLน ชJดคZาส)ง
(instruction set) และชJดร;จ;สเตอร# (register set) เปyนตUน และย)งม;ขอกZาหนดอนๆ เชLน เนYอท;ของหนLวยความจZา
                                                                   U
(memory area) สแต5ก (stack), heap, garbage collection และรVปแบบของคลาสไฟล# (class file format) เปyนตUน
ท)Yงน;ขUอกZาหนดของ JVM เปyนมาตรฐานท;เปmดเผย ทZาใหUบรษ)ทตLางๆ สามารถท;จะพ)ฒนา JVM ขxนมาเองไดU โดยไมL
      Y                                                                                       Y
จZาก)ดอยVLเพ;ยง JVM ของบรษ)ทซ)นไมโครซสเต5มส#เทLาน)น และลLาสJดในเดอนพฤศจกายน ค.ศ. 2006 ทางซ)นไมโคร-
                                                      Y
ซสเต5มส# ไดUเปmดเผยซอร#สโคUดในการพ)ฒนาซอฟต#แวร#จาวาท)Yงหมด




                                รปท 1.5 ขนตอนการทางานของโปรแกรมภาษาจาวา

        JVM ท;พ)ฒนามาใชUในปwจจJบ)นสLวนใหญLจะเปyนซอฟต#แวร# แตLก5ไดUม;การพ)ฒนา JVMในรVปแบบของฮาร#ดแวร#
ขxYนมาบUางแลUวเชLน Java Chip ในปwจจJบ)น JVM ม;ใชUในระบบ ปฏบ)ตการคอมพวเตอร#ตางๆ โปรแกรมเว5บเบราว#
                                                                            L
เซอร# เครองใชUไฟฟ‚าตLางๆ โทรศ)พท# เครองมอสอสารตLางๆ และสมารตคารด (Smart Card) จxงทZาใหUอJปกรณ#ตLางๆ
เหลLาน;สามารถประมวลผลโปรแกรมท;พ)ฒนาโดยใชUภาษาจาวาไดU
       Y


1.6.2 Java Runtime Environment
             JRE จะร)นโปรแกรมไบท#โคUดท;แปลมาจาก JVM โดยจะม;ขนตอนการทZางานสาม ข)นตอนด)งแสดงในรVป
                                                             )Y                 Y
ท; 1.6 คอ
              1. โหลดโปรแกรมไบท#โคUด ข)Yนตอนน;YจะเปyนการโหลดคลาสทJกคลาสท;จZาเปyนตLอการร)นโปรแกรม      โดย


12    ความรVUเบYองตUนภาษาจาวา                                                         ผศ. ธนศา เครอไวศยวรรณ
ใชU Class Loader
             2. ตรวจสอบโปรแกรมไบท#โคUด ข)นตอนน;เปyนการตรวจสอบโดยใชU Byte Code Verifier วLาโปรแก
                                           Y      Y
               รมไบท#โคUดถVกตUองตามขUอกZาหนดของ JVM หรอไมL และโปรแกรมจะตUองไมLม;คZาส)งใดท;ส)งงานแลUวจะ
               ทZาใหUเกดขUอผดพลาดก)บระบบ เชLน การแปลงขUอมVลท;ผดพลาด หรอการพยายามบJกรJกเขUาสVLระบบ
               ภายใน
            3. ร)นโปรแกรมไบท#โคUด ข)นตอนน;Yจะเปyนการร)นโปรแกรมไบท#โคUด โดยใชU Runtime Interpreter
                                    Y




                                    รปท 1.6 ขนตอนการทางานของ JRE


1.6.3 Java Development Kit
        JDK คอชJดพ)ฒนาโปรแกรมภาษาจาวาของบรษ)ทซ)นไมโครซสเต5มส# ซxงแตLเดมเร;ยกวLา JDK ท)Yงน;Yบรษ)ทซ)น
ไมโครซสเต5มส#ไดUเปล;ยนชอมาเปyน Java 2 ต)YงแตL JDK เวอร#ช)น 1.2 ชJดโปรแกรม JDK ท;ใชUในปwจจJบนคอเวอร#ช)น 6
                                                                                              )
(สามารถ download ไดUท; http://java.sun.com) จะประกอบไปดUวยโปรแกรมตLางๆ อาทเชLน โปรแกรมคอมไพเลอร#
(javac.exe) โปรแกรมอนเตอร#พร;ตเตอร# (java.exe) และโปรแกรมด;บ)กเกอร# เปyนตUน แตLชJดโปรแกรม JDK จะ

เปyนเพ;ยงเซ5ตยLอยของโปรแกรมประเภท Software Development Kit (SDK) ท)Yงน;Yเนองจาก JDK จะไมLม;โปรแกรม
อ;ดเตอร#สZาหร)บการเข;ยนซอร#ดโคUดหรอร)นโปรแกรม ด)งน)นผVUใชUจะตUองใชUโปรแกรม SDK อนชLวยในการเข;ยนซอร#ด
                                                      Y
โคUด
        นอกจากน;โปรแกรมท;อยVLใน JDK จะเปyนโปรแกรมท;ตUองเร;ยกใชUงานผLานทาง command line จxงไมLสะดวก
                Y


ผศ. ธนศา เครอไวศยวรรณ                                                              ความรVUเบYองตUนภาษาจาวา   13
ในการใชUงาน แตLก5ม;ขUอด;ตรงท;ทZาใหUผVUท;เรมตUนในการพ)ฒนาโปรแกรมสามารถเขUาใจข)YนตอนตLางๆ ของการพ)ฒนา
โปรแกรมโดยใชUภาษาจาวาไดUด;ขxYน โดยไมLมJLงเนUนการใชUเครองมอหรอคZาส)งตLางๆ ท;ม;อยVLในชJดพ)ฒนาโปรแกรมภาษา
จาวาโปรแกรมอนๆ
        นอกจากโปรแกรม JDK ท;พ)ฒนาโดยบรษ)ทซ)นไมโครซสเต5มส#แลUว บรษ)ทอนๆ ก5ม;การพ)ฒนาโปรแกรม JDK
ขxYนมา โดยบางสLวนอาจใชUซอร#โคUดของทางซ)นไมโครซสเต5มส# ซxงโปรแกรม JDK เหลLาน;Yจะม;มาตรฐานคZาส)งท;เหมอน
ก)นแตLอาจจะม;ขUอแตกตLางในคJณล)กษณะอนๆ เชLน คอมไพเลอร#หรอ Garbage Collection ต)วอยLางของโปรแกรม
JDK อนๆ ม;อาทเชLน J9 ของบรษ)ทไอบ;เอ5ม หรอ JRockit ของบรษ)ทออราเคล


     เกร%ดความร!

                                      NetBeans เปนชดพ)ฒนาโปรแกรมแบบเป;ดซอรสโคดของบรษ)ทซ)น
                                 ไมโครซสเต9มสซงสามารถดาวนโหลดมาใชไดจากเว9บไซต
                                 www.netbeans.org โปรแกรม NetBeans ถ1กพ)ฒนาเรมตนโดย
                                 กลมน)กศกษาท%มหาวทยาล)ย Charles ท%ประเทศสาธารณร)ฐเชค ซง
                                 ภายหล)งก9จดต)งเปนบรษ)ทเพอขายโปรแกรม NetBeans ในป6 1997
                                           )
                                 กอนท%จะถ1กบรษ)ทซ)นไมโครซสเต9มสเขามาซอในป6 1999 แลวจ)ดให
     เปนโปรแกรมแบบฟร%แวร ป>จจบ)นโปรแกรม NetBeans เปนเวอรช)น 6.8 (เดอนม%นาคม ป6 ค.ศ. 2010)ท%
     สามารถใชพ)ฒนาโปรแกรมจาวาไดทกแพลตฟอรมท)ง Java SE, Java ME และ Java EE รวมถงการ
     พ)ฒนา SOA และเข%ยนโปรแกรมภาษาอนๆ อาทเชน C/C++, PHP และ Ruby เปนตน

       สLวน SDK สZาหร)บการพ)ฒนาโปรแกรมภาษาจาวาท;ม;อยVLในปwจจJบนจะม;ท)Yงท;เปyนโปรแกรมแบบฟร;แวร#
                                                               )
(freeware) หรอโปรแกรมเพอการคUา (commercial software) อาทเชLน
       • Netbeans ของบรษ)ท Sun Microsystems (http://www.netbeans.org)
       • Eclipse ของบรษ)ท IBM (http://eclipse.org)
       • JDeveloper ของบรษ)ท Oracle (http://www.oracle.com)
       • intelliJ IDEA ของบรษ)ท JetBrains (http://www.jetbrains.com/idea)


         โปรแกรม SDK เหลLาน;จะม;เครองมอเพอชLวยในการสรUางโปรแกรมภาษาจาวาในรVปแบบตLางๆ ไดUงLายขxYนอาท
                            Y
เชLน เครองมอชLวยในการออกแบบโปรแกรมกราฟmก
       สZาหร)บชJดพ)ฒนาโปรแกรม JDK น)นจZาเปyนตUองม;โปรแกรมอด;เตอร# (Editor)เพอใชUในการเข;ยนซอร#ดโคUด
                                    Y


14   ความรVUเบYองตUนภาษาจาวา                                                            ผศ. ธนศา เครอไวศยวรรณ
ของโปรแกรมภาษาจาวา ซxงสามารถท;จะใชUโปรแกรม Text Editor ท)วไปไดUเชLน โปรแกรม Notepad ในระบบ
                                                              
ปฏบ)ตการ Windows แตLหากตUองการพ)ฒนาโปรแกรมใหUเร5วขxน ผVUใชUควรเลอกใชUโปรแกรมอด;เตอร#ท;ออกแบบมาเพอ
                                                      Y
เข;ยนซอร#ดโคUดของโปรแกรมภาษาจาวาโดยเฉพาะ ซxงโปรแกรมเหลLาน;จะทZางานคลUายก)บโปรแกรมแบบ SDK โดยผVU
                                                                Y
ใชUสามารถเร;ยกคZาส)งในการคอมไพล# หรอการร)นโปรแกรมท;พ)ฒนาขxนจากเมนVท;กZาหนดไวUไดUตวอยLางโปรแกรม
                                                            Y                       )
อด;เตอร#แบบน;คอ
             Y
        •    EditPlus ของบรษ)ท ES-Computing (http://www.editplus.com)
        •    JCreator ของบรษ)ท Xinox Software (http://www.jcreator.com)


1.7   จ%ดเด0นของภาษาจาวา
        บรษ)ทซ)นไมโครซสเต5มส#ไดUระบJถxงจJดเดLนของภาษาจาวาไวUด)งน;Y
        • ความงLาย (Simple) ภาษาจาวาเปyนภาษาท;งLายตLอการศxกษาและพ)ฒนาโปรแกรม ท)Yงน;เพราะภาษาจาวา
                                                                                      Y
          พ)ฒนาโดยต)ดขUอดUอยของภาษา C++ ออกไปอาทเชLน เรองของการใชU pointer
        • ภาษาเชงอ5อบเจกต# (Object-Oriented) ภาษาจาวาเปyนภาษาคอมพวเตอร#เชงอ5อบเจกต#ท;สมบVรณ#โดยม;
          คJณล)กษณะเดLนของโปรแกรมเชงอ5อบเจกต#คอ การสบทอด การหLอหJม และการม;ไดUหลายรVปแบบ
                                                                        U
        • การกระจาย (Distributed) ภาษาจาวาม;ชดคZาส)งท;เปyนแพคเก5จ (Package) ในการจ)ดการก)บโปรโตคอล
                                                J
          TCP/IP ทZาใหUสามารถพ)ฒนาโปรแกรมเชงอ5อบเจกต#แบบกระจาย (Distributed Object) ผLานระบบ
          เครอขLายอนเทอร#เน5ตไดUงLาย
        • การป‚องก)นการผดพลาด (Robust) ภาษาจาวาเปyนภาษาคอมพวเตอร#ท;ออกแบบมาเพอใหUโปรแกรมท;
          พ)ฒนาขxนม;ความนLาเชอถอ โดยม;การตรวจสอบการผดพลาดท;อาจเกดขxนในข)นตอนตLางๆ เชLน ข)นตอนการ
                 Y                                                        Y    Y               Y
          คอมไพล# และการร)นโปรแกรม เปyนตUน
        • ความปลอดภ)ย (Secure) ภาษาจาวาออกแบบมาเพอพ)ฒนาโปรแกรมบนระบบเครอขLาย และม;การกระจา
          ยการทZางานบนระบบเครอขLายอนเทอร#เน5ต ด)งน)นจxงตUองสรUางระบบป‚องก)นความปลอดภ)ยจากไวร)ส
                                                     Y
          คอมพวเตอร# และการแกUไขโปรแกรมจากภายนอก
        • สถาปwตยกรรมกลาง (Architecture Neutral) โปรแกรมภาษาจาวาจะคอมไพล#ไดUโปรแกรมไบท#โคUด
          (byte code) ซxงสามารถทZางานบนสถาปwตยกรรมคอมพวเตอร#ท;ม;หนLวยประมวลผลกลางและระบบปฏบ)ต
          การตLางๆ ไดU
        • เคลอนยUายงLาย (Portable) ขUอกZาหนดของภาษาจาวาจะไมLขนอยVLก)บระบบคอมพวเตอร#ใดโดยเฉพาะ
                                                                xY
          ด)งน)นโปรแกรมภาษาจาวาจxงสามารถประมวลผลไดUก)บระบบคอมพวเตอร#ทJกประเภท
               Y



ผศ. ธนศา เครอไวศยวรรณ                                                        ความรVUเบYองตUนภาษาจาวา   15
•   อนเตอร#พร;ต (Interpreted) ภาษาจาวาจะใชUอนเตอร#พร;ตเตอร#ในการแปลโปรแกรมไบท#โคUดใหUเปyนภาษา
            เครอง ด)งน)นจxงทZาใหUขบวนการการพ)ฒนาโปรแกรมเปyนไปไดUอยLางรวดเร5ว เชLนเด;ยวก)บภาษาคอมพวเตอร#
                        Y
            อนๆ ท;ใชUอนเตอร#พร;ตเตอร#
        •   ประสทธภาพสVง (High Performance) โดยปกตโปรแกรมอนเตอร#พร;ตเตอร#ท;ทZาหนUาท;แปลโปรแก
            รมไบท#โคUดจะทZางานชUา แตLเทคโนโลย;จาวาไดUพ)ฒนาใหUม;การแปลโปรแกรมไบท#โคUด ในข)นตอนการร)น
                                                                                              Y
            โปรแกรมใหUเปyนภาษาเครองแบบท)นท; ท)นใด (Just In Time) ท;ทZางานไดUรวดเร5วเท;ยบเทLาก)บคอมไพเลอร#
            เพอไดUโปรแกรมจาวาท;ม;ประสทธภาพในการประมวลผลสVง
        •   ม)ลตเธรด (Multithreaded) ภาษาจาวาม;ความสามารถท;จะประมวลผลหลายๆ งานไดUพรUอมก)น
        •   พลว)ต (Dynamic) ภาษาจาวาออกแบบมาเพอท;จะใหUปร)บเปล;ยนเพมเตมไลบาร; (library) ตLางๆ ไดUงLาย
            ซxงแตกตLางจากภาษาซ; หรอ C++

1.8   แพลตฟอร.มของเทคโนโลยจาวา

      แพลตฟอร#ม (Platform) คอฮาร#ดแวร#และสภาวะแวดลUอมทางซอฟต#แวร# (Software Environment) ท;
โปรแกรมจะใชUในการประมวลผลโดยท)วไป
                               
          แพลตฟอร#มจะนยามโดยพจารณาจากองค#ประกอบของฮาร#ดแวร#และระบบปฏบ)ตการท;ใชUเชLน แพลตฟอร#ม
ของระบบปฏบ)ตการ Windows XP บนเครองไมโครคอมพวเตอร# Pentium IV แตLนยามของแพลตฟอร#มสZาหร)บ
เทคโนโลย;จาวาจะแตกตLางจากนยามท;ใชUกนท)วไป ท)Yงน;จะพจารณาจากองค#ประกอบของซอฟต#แวร#เทLาน)นด)งแสดงใน
                                      )           Y                                      Y
รVปท; 1.7 ซxงแพลตฟอร#มของเทคโนโลย;จาวาจะประกอบดUวย
        • Java Virtual Machine (JVM)
        • Java Application Programming Interface (Java API)




                                   รปท 1.7 แพลตฟอรมของเทคโนโลยจาวา




16    ความรVUเบYองตUนภาษาจาวา                                                           ผศ. ธนศา เครอไวศยวรรณ
โดยท; JVM จะเปyนสLวนฐานของแพลตฟอร#มเพอใชUในการตดตLอก)บแพลตฟอร#มสLวนท;เปyนฮาร#ดแวร# สLวน
Java API เปyนชJดแพคเก5จท;รวบรวมคลาสและอนเตอร#เฟสตLางๆ ท;เปyนประโยชน#ตLอการใชUงานของโปรแกรมท;พ)ฒนา
โดยภาษาจาวาเชLน คลาสท;เก;ยวขUองก)บสLวนตLอประสานกราฟmกก)บผVUใชU (Graphical User Interface) เปyนตUน

        บรษ)ทซ)นไมโครซสเต5มส#ไดUกZาหนดแพลตฟอร#มของเทคโนโลย;จาวาใหUม;สามรVปแบบคอ
        • Java Platform, Standard Edition (Java SE)
        • Java Platform, Enterprise Edition (Java EE)
        • Java Platform, Micro Edition (Java ME)
        โดยแตLละแพลตฟอร#มจะม; JVM และ API ท;แตกตLางก)น และมJLงเนUนท;จะใชUในการพ)ฒนาโปรแกรมภาษาจาวา
                                                                     
สZาหร)บระบบคอมพวเตอร#หรออJปกรณ#ท;แตกตLางก)น ด)งแสดงในรVปท; 1.8




                             รปท 1.8 แพลตฟอรมของ Java 2 ในรปแบบต%างๆ


       โปรแกรมจาวาท;ใชUบนเครองคอมพวเตอร#โดยท)วไป จะใชUแพลตฟอร#มท;เปyน Java SE สLวนแพลตฟอร#ม
                      
Java EE มJLงเนUนการพ)ฒนาโปรแกรมภาษาจาวาท;ใชUงานบนเครองแมLขLาย (Server) สZาหร)บระบบงานในองค#กร
(Enterprise) และแพลตฟอร#ม Java ME ใชUในการพ)ฒนาโปรแกรมจาวาบนอJปกรณ#ขนาดเล5ก เชLน โทรศ)พท#เคลอนท;
หรอ PDA เปyนตUน




ผศ. ธนศา เครอไวศยวรรณ                                                        ความรVUเบYองตUนภาษาจาวา   17
1.8.1 Java Platform, Standard Edition
         แพลตฟอร#ม Java SE เปyนแพลตฟอร#มจาวามาตรฐานท;ใชUในการพ)ฒนาโปรแกรมภาษาจาวาเพอใชUงานก)บ
เครองคอมพวเตอร#ท)วไป Virtual Machine ท;กZาหนดไวUในแพลตฟอร#มน;Yคอ JVM และม; Java API ท;กZาหนดไวU
ตLางๆ อาทเชLน java.lang, java.util, java.io และ java.net
         แพลตฟอร#ม Java SE ใชUในการพ)ฒนาโปรแกรมจาวาท;ใชUในเครองคอมพวเตอร#ลVกขLาย โดยแบLงออกเปyน 2
ประเภท คอ
         • โปรแกรมจาวาประยJกต# (Java Application) คอ โปรแกรมท;ใชUงานท)วไป
         • โปรแกรมจาวาแอปเพล5ต (Java Applet) คอโปรแกรมภาษาจาวาท;รนบนเว5บเบราว#เซอร#
                                                                           )
    เวอร#ชนลLาสJดของ Java SE คอเวอร#ช)น 7 (เดอนม;นาคม ค.ศ. 2010) ซxงผVUใชUสามารถ download ไดUฟร;ทาง
           )
เว5บไซต#ท;ชอ java.sun.com

1.8.2 Java Platform, Enterprise Edition
       แพลตฟอร#มจาวารJนน;Y ม;จJดประสงค#เพอใชUพ)ฒนาโปรแกรมภาษาจาวาสZาหร)บเครองแมLขาย โดยมJLงเนUนการ
                         L                                                           L
พ)ฒนาโปรแกรมท;เปyน N-tier สZาหร)บงานในองค#กร โดยใชUโปรแกรม Application Server หรอโปรแกรม Web
Server ท;เร;ยกวLาโปรแกรมจาวาแบบ Servlet โปรแกรม Application Server เปyนโปรแกรมท;ชLวยในการพ)ฒนา
โปรแกรมภาษาจาวาท;สามารถเปล;ยนแปลง แกUไข และนZากล)บมาใชUใหมLไดUงLาย โดยพ)ฒนาเปyนสLวนประกอบอ5อบเจกต#
(Object Component) ท;เร;ยกวLา Enterprise Java Bean (EJB) โปรแกรม Web Server หรอ Application
Server ท;ใชUก)บภาษาจาวาในปwจจJบนม;ท)Yงโปรแกรมท;เปyนแบบเปmดซอร#สโคUด อาทเชLน Tomcat, GlassFish
                                )
หรอ JBoss และโปรแกรมเพอการคUา เชLน WebLogic หรอ WebSphere สZาหร)บ เวอร#ชนลLาสJดของ Java EE
                                                                                 )
คอ Java EE6 (เดอนม;นาคม ค.ศ. 2010)

     เกร%ดความร!

            การพ)ฒนาโปรแกมบน Web Server จะตองม%เครองล1กขายในการแสดงผลผานทางอนเทอรเน9ต
     ซงโดยมากจะใชโปรแกรมเว9บเบราวเซอรในการแสดงผล การพ)ฒนาโปรแกรม Web Server จะตองม%
     การตดต)งเครองแมขายและโปรแกรม Web Server ท%อาจใชเครองคอมพวเตอรแมขายท%ม%ประสทธภาพ
     ส1งและใชระบบปฎบ)ตการส(าหร)บแมขายเชน Windows Server, Linux และ Solaris เปนตน ภาษาท%
     นยมใชในการพ)ฒนาโปรแกรมบน Web Server ท%นยมในป>จจบ)นคอ Java, PHP และ ASP.NET




18   ความรVUเบYองตUนภาษาจาวา                                                       ผศ. ธนศา เครอไวศยวรรณ
ส(าหร)บโปรแกม Web Server ท%เปนท%นยมต)วหนงในภาษาจาวาคอ Tomcat
                             ซงเปนโปรแกรมแบบเป;ดเผยซอรสโคด ท%พ)ฒนาโดยองคกร Apache
                             Software Foundation ซงสามารถท(างานไดบนระบบปฎบ)ตการตางๆ อาท
                             เชน Linux และ Windows โดยเวอรช)นป>จจบ)นคอ Tomcat 6.0 (เดอน
                             ม%นาคม ค.ศ. 2010)

1.8.3 Java Platform, Micro Edition
        แพลตฟอร#ม Java ME เปyนแพลตฟอร#มจาวาท;ใชUในการพ)ฒนาโปรแกรมภาษาจาวา เพอใชUงานก)บอJปกรณ#
ไฟฟ‚า และเครองมอสอสารตLางๆ อาทเชLน โทรศ)พท#มอถอ หรอ PDA (Personal Digital Assistant) เปyนตUน
แพลตฟอร#ม Java ME จะใชU Virtual Machine ท;ม;ขนาดเล5กกวLา JVM ท;ใชUในเครองคอมพวเตอร#ท)วไป ท)Yงน;Y
เนองจากอJปกรณ#เหลLาน)นจะม;หนLวยความจZานUอยกวLา และจะม;หนLวยประมวลผลกลางท;มความเร5วชUากวLา
                      Y                                                       ;
        แตLเนองจากปwจจJบนม;การออกโทรศ)พท#มอถอรJLนตLางๆออกมามากโดยใชUระบบปฎบ)ตการท;ตางก)นเชLน คLาย
                         )                                                              L
โนเก;ยจะใชUระบบ Symbian คLาย Apple จะใชU iPhone และคLาย Google จะใชU Andriod จxงทZาใหUแพลตฟอร#มในการ
พ)ฒนาโปรแกรมจาวาบนโทรศ)พท#มอถอม;ความหลากหลายมากขxYน กลLาวคอนอกจากแพลตฟอร# Java ME ท;สามารถ
ทZางานบนโทรศ)พท#สLวนใหญLรวมท)Yงระบบปฎบ)ตการ Symbian แลUว ย)งม;แพลตฟอร#ม Android ท;พ)ฒนาโปรแกรม
จาวาโดยใชUคZาส)งมาตรฐานท;อยVLใน Java SE และแพลตฟอร#ม Java FX ท;พ)ฒนาลLาสJดโดยบรษ)ทซ)นไมโครซสเต5มส#

      เกร%ดความร!

                                    Android เปนแพลตฟอรมส(าหร)บโทรศ)พทมอถอท%พ)ฒนาโดยกลม
                                    Open Handset Alliance ท%ประกอบดวยบรษ)ทตางๆ อาทเชน
                                    Google, HTC, Intel และ Samsung เปนตน โดยก(าหนด
                                    แพลตฟอรมท%ใชระบบปฎบ)ตการ Linux บนเครองโทรศ)พทมอถอ
                                    และค(าส)งในการพ)ฒนาโปรแกรมโดยใชภาษาจาวา โทรศ)พทมอถอ
                                    ท%ใชมาตรฐาน Android รนแรกคอ T1-Mobile G1 โดยบรษ)ท
                                    HTC เมอปลายป6ค.ศ. 2008 และไดม%การน(าเขามาจ(าหนายใน
                                    ประเทศไทยแลว

       ภายหล)งจากท;ทางบรษ)ทออราเคลไดUเขUามาซYอกจการของบรษ)ทซ)นไมโครซสเต5มส# ทางบรษ)ทก5ไดUประกาศ
สน)บสนJนใหUเทคโนโลย;จาวาเปyนแบบระบบเปmด ท;สามารถร)นไดUหลากหลายอJปกรณ#เชLนเดม (Complete. Open.
Integrated) โดยกZาหนดใหUม; API และ JVM ท;หลากหลายเชLนเดมด)งแสดงในรVปท; 1.9




ผศ. ธนศา เครอไวศยวรรณ                                                         ความรVUเบYองตUนภาษาจาวา   19
รปท 1.9 แพลตฟอรมล%าส(ดของ Java Technology

1.9   โปรแกรมภาษาจาวา

        โปรแกรมจาวาท;อยVLบนแพลตฟอร#ม Java SE สามารถพ)ฒนาไดUสองรVปแบบคอ
        1. โปรแกรมจาวาประยJกต# (Java Application) คอโปรแกรมประยJกต#ใชUงานท)วไป โดยโปรแกรมแบบน;จะ
                                                                                               Y
           ทZางานภายใตUโปรแกรมอนเตอร#พร;ตเตอร#โดยตรง ซxงโปรแกรมล)กษณะน;เY ปyน stand-alone
        2. โปรแกรมจาวาแอปเพล5ต (Java Applet) คอโปรแกรมภาษาจาวาท;จะทZางานภายใตUโปรแกรมเว5บ
           เบราว#เซอร#ท;ม; JVM อยVL

1.9.1 การสรางโปรแกรมจาวาประย%กต.
        การสรUางโปรแกรมจาวาประยJกต#จะม;ขนตอนด)งแสดงในรVปท; 1.10 ซxงสามารถอธบายพอส)งเขปไดUด)งน;Y
                                           )Y
        1. ข)นตอนแรกจะเปyนการเข;ยนซอร#ดโคUดโดยใชUโปรแกรมอด;เตอร#ใดๆ โปรแกรมท; 1.1 เปyนต)วอยLาง
               Y
           โปรแกรมเพอพมพ#ขUอความ Hello World ออกทางจอภาพ โปรแกรมน;ใชUชอคลาสวLา HelloWorld ซxง
                                                                               Y
           ผVเU ข;ยนโปรแกรมจะตUองเข;ยนซอร#ดโคUดแลUวเก5บลงในไฟล#ท;ม;ชอเด;ยวก)บชอคลาส โดยม; extension เปyน
           .java กลLาวคอโปรแกรมน;Yจะเก5บไวUในชอ HelloWorld.java โปรแกรมน;จะม;เมธอด main()เปyนจJด
                                                                                    Y
           เรมตUน


20    ความรVUเบYองตUนภาษาจาวา                                                           ผศ. ธนศา เครอไวศยวรรณ
2.   ข)นตอนท;สองจะเปyนการคอมไพล#โปรแกรม เพอแปลโปรแกรมซอร#ดโคUดใหUอยVLในรVปของโปรแกรมไบท#
               Y
             โคUด ชJดพ)ฒนาโปรแกรม JDK จะม;โปรแกรมชอ javac.exe ท;ทZาหนUาท;เปyนคอมไพล#เลอร# ซxงใน
             ต)วอยLางน;สามารถทZาการคอมไพล#โปรแกรมโดยใชUคZาส)งตLอไปน;Y
                       Y
                        javac HelloWorld.java


                       ผลล)พธ#ท;ไดUจากการคอมไพล#โปรแกรมน;คอ โปรแกรมไบท#โคUดท;ชอ HelloWorld.class ใน
                                                          Y
             กรณ;ท;โปรแกรมซอร#ดโคUดม;ขUอผดพลาด คอมไพเลอร#จะระบJขUอผดพลาดท;เกดขxน เพอใหUผVUเข;ยนโปรแกรม
                                                                                       Y
             ทZาการแกUไขโปรแกรมซอร#ดโคUดกLอนท;จะทZาการคอมไพล#โปรแกรมใหมL
        3.   ข)นตอนการประมวลผลหรอร)นโปรแกรม เปyนการเร;ยกใชUอนเตอร#พร;ตเตอร#เพอแปลโปรแกรมไบท#โคUด
               Y
             ชJดพ)ฒนาโปรแกรม Java 2 SDK จะม;โปรแกรมชอ java.exe ท;ทZาหนUาท;เปyนโปรแกรมอนเตอร#-พร;ต
             เตอร# ซxงในต)วอยLางน;Yจะสามารถร)นโปรแกรมไบท#โคUดไดUโดยใชUคZาส)งตLอไปน;Y
                    java HelloWorld

             โดยโปรแกรมจะใหUผลล)พธ#ด)งแสดงในรVปท; 1.11


โปรแกรมท( 1.1 เปนโปรแกรมเพอพมพขอความ Hello World
   public class HelloWorld {
         public static void main(String args[]){
             System.out.println("Hello World");
         }
   }




                                        รปท 1.10 ขนตอนการสร*างโปรแกรมจาวาประย(กต


ผศ. ธนศา เครอไวศยวรรณ                                                             ความรVUเบYองตUนภาษาจาวา   21
รปท 1.11 ผลลพธทได*จากการรนโปรแกรมท 1.1

1.9.2 การสรางโปรแกรมจาวาแอปเพล-ต
      การสรUางโปรแกรมจาวาแอปเพล5ต จะม;ขนตอนคลUายก)บการสรUางโปรแกรมจาวาประยJกต# แตLโปรแกรมจาวา
                                         )Y
แอปเพล5ตจะประกอบดUวยไฟล#ท;เข;ยนขxนสองไฟล#คอ
                                  Y
        •  โปรแกรมซอร#ดโคUด (.java)
        • โปรแกรมเว5บเพจ (.html)
        โปรแกรมท; 1.2 เปyนต)วอยLางของโปรแกรมจาวาแอปเพล5ตเพอแสดงขUอความ Hello World โปรแกรมน;Yจะ
แตกตLางจากโปรแกรมจาวาประยJกต#ตรงท;ไมLม;เมธอด main() และจะไมLสามารถทZางานตามลZาพ)งไดU แตLจะตUองเร;ยก
ใชUโดยผLานโปรแกรมภาษา HTML ต)วอยLางเชLน โปรแกรมท; 1.3 เปyนโปรแกรมภาษา HTML ท;เร;ยกใชUโปรแกรม
HelloWorldApplet.class เพอประมวลผลภายใตUโปรแกรมเว5บเบราว#เซอร#ท;ม; JVM อยVL ข)นตอนการสรUาง
                                                                                 Y
โปรแกรมน;Yม;ด)งน;Y

โปรแกรมท( 1.2 โปรแกรมจาวาแอปเพล9ตเพอพมพขอความ Hello World
     import java.awt.*;
     import javax.swing.*;

     public class HelloWorldApplet extends JApplet {
           public void paint(Graphics g) {
                 g.drawString("Hello World",20,20);
           }
     }




22    ความรVUเบYองตUนภาษาจาวา                                                      ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท( 1.3 โปรแกรมภาษา HTML ท%เร%ยกใช HelloWorldApplet.class
   <HTML>
         <HEAD>
               <TITLE>HelloWorld Example</TITLE>
         </HEAD>
         <BODY>
               <APPLET CODE=”HelloWorldApplet.class”
                             WIDTH=”300” HEIGHT=”300”>
               </APPLET>
         </BODY>
   </HTML>




                              รปท 1.12 ขนตอนการสร*างโปรแกรมจาวาแอปเพล-ต


        1.   เข;ยนโปรแกรมซอร#ดโคUด (HelloWorldApplet.java) และโปรแกรม เว5บเพจ (HelloWord.html)
             โดยใชUโปรแกรมอด;เตอร#ใดๆ
        2.   คอมไพล#โปรแกรม HelloWorldApplet.java โดยใชUคอมไพเลอร#ด)งน;Y
                 javac HelloWorldApplet.java



             ต)วอยLางน;จะไดUโปรแกรมไบท#โคUดท;ชอ HelloWorldApplet.class
                       Y
        3.   ใชUโปรแกรมเว5บเบราว#เซอร#ใดๆ เชLน Internet Explorer หรอ Netscape เปmดโปรแกรมเว5บเพจท;ชอ
             HelloWorld.html ซxงจะเร;ยกโปรแกรมไบท#โคUดท;ชอ HelloWorldApplet.class โดยอ)ตโนม)ต

             และจะม;ผลร)นด)งรVปท; 1.13



ผศ. ธนศา เครอไวศยวรรณ                                                           ความรVUเบYองตUนภาษาจาวา   23
รปท 1.13 ผลลพธทได*จากการรนโปรแกรมท 1.3 บนเว-บเบราวเซอร

1.10   ค0มอ Java API
       Java API เปyนขUอกZาหนดท;วLาดUวยคลาสและอนเตอร#เฟสตLางๆ ท;กZาหนดไวUในแพคเก5จมาตรฐานของภาษาจาวา
แพคเก5จจะเปyนท;รวบรวมคลาสและอนเตอร#เฟสตLางๆ ท;มหนUาท;การทZางานคลUายก)นไวUในท;เด;ยวก)น Java API ม;แพค-
                                                  ;
เก5จท;สZาค)ญอยVหลายแพคเก5จ อาทเชLน java.lang, java.util, java.awt และ java.io เปyนตUน
                L

         เนองจาก Java API ม;แพคเก5จและคลาสตLางๆ อยVLเปyนจZานวนมาก จxงเปyนเรองยากในการท;จะจดจZาคลาสและ
                                                                                           
เมธอดตLางๆ ท)Yงหมดท;ม;อยVLไดU ด)งน)นชJดพ)ฒนาโปรแกรม JDK จะม;ไฟล#คVLมอ Java API ท;อยVLในรVปของไฟล# HTML
                                    Y
ด)งแสดงในรVปท; 1.14 ซxงคVLมอ Java API จะประกอบไปดUวยเฟรมสามเฟรมคอ สLวนท;เ ปyนชอแพคเก5จ (มJมบนซUาย)
สLวนท;เปyนชอคลาสและอนเตอร#เฟสตLางๆ ของแพคเก5จ (มJมลLางซUาย) และสLวนท;เปyนรายละเอ;ยดของคลาสหรอ
อนเตอร#เฟส (ตรงกลาง) ซxงรVปท; 1.14 แสดงคVLมอ Java API ท;ระบJคลาสและอนเตอร#เฟสตLางๆ ในแพคเก5จ
java.lang และเฟรมหล)กตรงกลางแสดงรายละเอ;ยดของคลาส String


       คVLมอ Java API จะแสดงรายละเอ;ยดตLางๆ ของคลาสหรออนเตอร#เฟสด)งน;Y
       • ลZาด)บการสบทอดของคลาส
       • คZาอธบายเก;ยวก)บคลาสและจJดประสงค#ท)วไป
       • รายชอคJณล)กษณะตLางๆ ของคลาส




24   ความรVUเบYองตUนภาษาจาวา                                                           ผศ. ธนศา เครอไวศยวรรณ
•   รายชอเมธอดตLางๆ ของคลาส
        •   รายชอ Constructor ตLางๆ ของคลาส
        •   คZาอธบายรายละเอ;ยดของคJณล)กษณะแตLละต)วของคลาส
        •   คZาอธบายรายละเอ;ยดของเมธอดแตLละต)วของคลาส
        •   คZาอธบายรายละเอ;ยดของ Constructor แตLละต)วของคลาส




                                        รปท 1.14 ค%ม0อ Java API

สร%ปเนอหาของบท

        •   ระบบคอมพวเตอรประกอบไปดวยสวนหลกสามสวนคอ ฮารดแวร ระบบปฏบตการ และโปรแกรม
            ประยกต
        •   ภาษาคอมพวเตอรแบงออกเป$นสามประเภทคอ ภาษาเคร&อง ภาษาแอสเซมบล( และภาษาระดบส)ง
        •   ภาษาระดบส)งแบงออกเป$นสองประเภทคอ ภาษาเชงกระบวนการ และภาษาเชงอ+อบเจกต



ผศ. ธนศา เครอไวศยวรรณ                                                  ความรVUเบYองตUนภาษาจาวา   25
•   ตวแปลภาษาแบงออกเป$นสองแบบคอ คอมไพเลอร และอนเตอรพร(ตเตอร
       •   ภาษาจาวาเป$นภาษาเชงอ+อบเจกตท(&ใชท.งตวแปลภาษาแบบคอมไพเลอรและอนเตอรพร(ตเตอรในการ
           คอมไพลและรนโปรแกรม
       •   คอมไพเลอรของภาษาจาวาจะท1าหนาท(&แปลโปรแกรมภาษาจาวาใหเป$นโปรแกรมไบทโคด และจะใชจาวา
           อนเตอรพร(ตเตอร (JVM) ในการแปลโปรแกรมไบทโคดใหเป$นภาษาเคร&อง
       •   โปรแกรมภาษาจาวาสามารถท1างานขามแพลตฟอรมได ถาระบบคอมพวเตอรน.นม( JVM อย)
       •   แพลตฟอรมของ Java ประกอบไปดวย JVM และ Java API ซ4&ง Java ม(แพลตฟอรม 3 แบบคอ Java
           SE, Java EE และ Java ME
       •   ชดพฒนาโปรแกรมภาษาจาวา JDK ประกอบไปดวยโปรแกรมตางๆ ท(&ส1าคญคอ โปรแกรมคอมไพเลอร
           (javac.exe) และโปรแกรมอนเตอรพร(ตเตอร (java.exe)
       •   โปรแกรมจาวาท(&อย)บนแพลตฟอรม Java SE สามารถพฒนาไดสองร)ปแบบคอโปรแกรมจาวาประยกตซ4&ง
           จะท1างานภายใต JVM โดยตรง และโปรแกรมจาวาแอปเพล+ตซ4&งจะท1างานภายใตเว+บเบราวเซอรท(&ม( JVM
       •   ค)มอ Java API จะชวยในการคนหารายละเอ(ยดของแพคเก+จและคลาสตางๆ ท(&ม(อย)ในชดพฒนาโปรแกรม
           JDK




26   ความรVUเบYองตUนภาษาจาวา                                                    ผศ. ธนศา เครอไวศยวรรณ
บทท 2 พนฐานโปรแกรมภาษาจาวา

       เนYอหาในบทน;YเปyนการแนะนZาไวยากรณ#ของภาษาจาวา ซxงประกอบไปดUวยส)ญล)กษณ#หรอคZาตLางๆ ท;ใชUใน
ภาษาจาวา ชนดขUอมVลแบบพYนฐาน และขUอมVลคLาคงท; การประกาศและเร;ยกใชUคZาส)งกZาหนดคLาต)วแปร นพจน#และต)ว
ดZาเนนการประเภทตLางๆ วธ;การแปลงชนดขUอมVล ชนดขUอมVลแบบอUางอง และแนะนZาคZาส)งท;ใชUในการร)บขUอมVลเขUาและ
แสดงผล ซxงเนYอหาในบทน;จะเปyนการแนะนZาการเข;ยนโปรแกรมเบYองตUนเพอกZาหนดคLาขUอมVลตLางๆ และแสดงผลล)พธ#
                        Y
ของการประมวลผล

2.1 การเขยนโปรแกรมภาษาจาวาเช,งอ-อบเจกต.

        ภาษาจาวาเปyนภาษาคอมพวเตอร# ท;ใชUหล)กการการพ)ฒนาโปรแกรมเชงอ5อบเจกต#ท;เร;ยกยLอวLาเปyนภาษา
คอมพวเตอร#แบบ OOP การพ)ฒนาโปรแกรมเชงอ5อบเจกต#จะเปyนขบวนการการวเคราะห#ปญหาโดยการจZาลองปwญหา
                                                                               w
วLาประกอบไปดUวยอ5อบเจกต#ใดบUาง แลUวจxงเข;ยนใหUอยVLในรVปแบบของโปรแกรมคอมพวเตอร# โปรแกรมเชงอ5อบเจกต#จะ
ม;คZานยามท;สZาค)ญสองคZาคอ อ5อบเจกต# (Object) และคลาส (Class)

       คลาสเปร;ยบเสมอนพมพ#เข;ยวของอ5อบเจกต# อ5อบเจกต#ท;ถVกสรUางมาจากคลาสบางคร)Yงจะเร;ยกวLาเปyน instance
ของคลาส ซxงอ5อบเจกต#ใดๆ จะตUองเปyน instance ของคลาสใดคลาสหนxง การเข;ยนโปรแกรมเชงอ5อบเจกต# ตUองม;การ
                                                                
กZาหนดนยามของคลาสกLอนท;จะสามารถสรUางอ5อบเจกต# (หรอ instance) ของคลาสไดU ซxงคลาสหนxงคลาสสามารถท;
                                                                                       
จะสรUางอ5อบเจกต#ไดUหลายอ5อบเจกต#

       ภายในคลาสจะประกอบดUวยคJณล)กษณะ (Attribute) ซxงก5คอขUอมVลท;เก5บอยVLในอ5อบเจกต# โดยจะแบLงออกเปyน
สองประเภท คอต)วแปร (Variable) และคLาคงท; (Constant) คJณล)กษณะท;เปyนต)วแปรจะสามารถเปล;ยนคLาไดU สLวน
คJณล)กษณะท;เปyนคLาคงท;จะไมLสามารถเปล;ยนคLาไดU และเมธอด (Method) ซxงก5คอวธ;การหรอการกระทZาท;นยามอยVLใน
คลาส อ5อบเจกต#ท;สรUางมาจากคลาสน)น อาจม;คาคJณล)กษณะตLางก)นแตLจะม;การเร;ยกใชUเมธอดท;เหมอนก)น ต)วอยLางของ
                                   Y         L
การนยามคลาสท;ชอ Student ซxงม;คJณล)กษณชอ name และ เมธอดท;ชอ sayHi ม;ด)งน;Y
                 public class Student {
                      public String name;
                      public void sayHi() {
                            System.out.println(“Hello”);
                      }
                 }
        จากคZาส)งการประกาศจะเห5นวLาคZาส)งในภาษาจาวาจะถVกกZาหนดใหUอยVLบล5อกของ {} เชLนคJณล)กษณะและเมธอด


ผศ. ธนศา เครอไวศยวรรณ                                                           พYนฐานโปรแกรมภาษาจาวา   27
ของคลาสก5จะอยVLในบล5อก {} ทZานองเด;ยวก)นคZาส)งตLางๆท;อยVLในเมธอดก5จะอยVLภายในบล5อก {} โดยท)วไปคลาสแตLละ
คลาสจะม;คJณล)กษณะและเมธอดไดUไมLจZาก)ดจZานวน

       โดยท)วไปภาษาจาวาจะกZาหนดใหUชอไฟล#และชอคลาสตUองเปyนชอเด;ยวก)น และเปyนแบบ Case-sensitive
กลLาวคอจะตUองใชUอ)กษรต)วเล5กต)วใหญLอยLางถVกตUอง กรณ;น;Yคลาสท;ชอ Student จะเข;ยนโปรแกรมในไฟล#ท;ชอ
                                                                                                  
Student.java

       คลาสจะถVกเร;ยกใชUงานไดUเมอม;การสรUางอ5อบเจกต#ของคลาส โดยเร;ยกใชUคZาส)ง new จะตUองม;การกZาหนดชอ
ของอ5อบเจกต#นน ต)วอยLางเชLนคZาส)งขUางลLางน;เY ปyนการสรUางอ5อบเจกต#ของคลาส Student ท;ชอ s1
             )Y
                 Student s1 = new Student();

        โปรแกรมท;ร)นภาษาจาวาอาจม;หลายคลาส ซxงคลาสบางคลาสเปyนคลาสท;ถVกเร;ยกใชUมากจากคลาสอนเชLน
คลาสท;ชอ String หรอ System แตLสZาหร)บโปรแกรมประเภทจาวาประยJกต# โปรแกรม JVM จะเร;ยกคลาสท;ม;
เมธอดท;ชอ main ซxงม;รVปแบบด)งน;Y มาร)นเปyนเมธอดแรก
                 public static void main(String args[]) {

                 }

          โปรแกรมท; 2.2 แสดงต)วอยLางของคลาสท;ชอ Main ท;ม;เมธอดท;ชอ main ซxงม;คZาส)งในการสรUางอ5อบเจกต#
ชนด Student แลUวเร;ยกใชUเมธอด sayHi ผลล)พธ#ของโปรแกรมน;Yจะเปyนการพมพ#ขUอความวLา Hello ด)งแสดงใน
รVปท; 2.1


โปรแกรมท( 2.1 ต)วอยางการเข%ยนโปรแกรมท%เร%ยกใชคลาส Student

     public class Main {

             public static void main(String args[]) {
                 Student s1 = new Student();
                 s1.sayHi();
             }

     }



           การเข;ยนโปรแกรมในบทน;Y จะเนUนการเข;ยนแบบเชงอ5อบเจกต#โดยโปรแกรมสLวนใหญLจะเปyนการสรUางคลาส


28       พYนฐานโปรแกรมภาษาจาวา                                                             ผศ. ธนศา เครอไวศยวรรณ
ขxYนมาหนxงคลาสเชLน Student.java แลUวจะม;อ;กหนxงคลาสเชLน Main.java เพอมาสรUางอ5อบเจกต#ของคลาสแรกแลUว
                                               
เร;ยกใชUเมธอดท;อยVLภายใน




                                  รปท 2.1 ผลลพธจากการรนโปรแกรมท 2.2

         ภาษาจาวาต)YงแตLเวอร#ชน Java SE 5 ไดUกZาหนดรVปแบบเมธอดท;ชอ main ใหUสามารถท;จะเข;ยนไดUอ;กรVปแบบ
                              )                                   
หนxงด)งน;Y
                 public static void main(String... args) {

                 }


2.2 ไวยากรณ.ระดบของคDา

      คZาหรอขUอความท;สามารถเข;ยนในโปรแกรมภาษาจาวา จะตUองเปyนคZาหรอขUอความในรVปแบบใดรVปแบบหนxง
ของประเภทตLางๆ เหลLาน;Y
      • คอมเม5นต# (Comment)
        • Identifier
        • ค;ย#เวร#ด (Keyword)
        •   ส)ญล)กษณ#แยกคZา (Separator)
        •   ชLองวLาง (Whitespace)
        •   ขUอมVลคLาคงท; (Literals)

2.2.1 คอมเม-นต.
         คอมเม5นต#คอขUอความท;แทรกอยVLภายในโปรแกรม ซxงคอมไพเลอร#จะไมLแปลขUอความน;ใหUเปyนสLวนหนxงของ
                                                                                     Y
โปรแกรม กลLาวคอขUอความน;YจะไมLม;ผลตLอการทZางานของโปรแกรม คอมเม5นต#เข;ยนไวUเพออธบายโปรแกรม เพอใหUผVU
อLานเขUาใจโปรแกรมงLายยงขxYน และชLวยทZาใหUการแกUไขและปร)บปรJงโปรแกรมเปyนไปไดUงLายขxน
                                                                                   Y


ผศ. ธนศา เครอไวศยวรรณ                                                          พYนฐานโปรแกรมภาษาจาวา   29
ภาษาจาวากZาหนดรVปแบบของการเข;ยนคอมเม5นต#ไวUสามรVปแบบด)งน;Y
        1. คอมเม5นต#สZาหร)บขUอความบรรท)ดเด;ยว จะใชUเครองหมาย // นZาหนUาขUอความท;ตUองการเข;ยน ซxงจะอยVLสLวน
           ไหนของบรรท)ดก5ไดU
        2. คอมเม5นต#สZาหร)บขUอความต)YงแตLหนxงบรรท)ดขxนไป จะเรมตUนดUวยเครองหมาย /* และสYนสJดดUวยเครอง-
                                                    Y
           หมาย */
        3. คอมเม5นต#สZาหร)บขUอความท;ตUองการสรUางเปyนไฟล#เอกสาร ท;เปyนไฟล#ประเภท HTML จะเรมตUนดUวย
           เครองหมาย /** และสYนสJดดUวยเครองหมาย */ คอมเม5นต# รVปแบบน;YสามารถสรUางเปyนไฟล#เอกสารไดUโดย
           ใชUโปรแกรม javadoc.exe

โปรแกรมท(     2.2 แสดงการเข%ยนคอมเม9นตในร1ปแบบตางๆ

     /* This program is to show
        how to write comments */
     public class CommentDemo {
           // Main method
           public static void main(String args[]) {
           /** This is a comment for documentation */
               System.out.println("Document");
           }
     }




2.2.2 Identifier
        identifier คอชอท;ต)Yงขxนในภาษาจาวา ซxงอาจเปyนชอของคลาส ชอของต)วแปร ชอของเมธอด หรอชอของคLา
                                 Y
คงท; ซxงจะตUองเปyนไปตามกฎการต)Yงชอ ด)งน;Y
          • identifier จะตUองขxYนตUนดUวยอ)กขระ A-Z, a-z, _ หรอ $ เทLาน)น
                                                                       Y
          • identifier ท;ประกอบไปดUวยต)วอ)กขระมากกวLาหนxงต)ว ต)วอ)กขระหล)งจากต)วแรกน)นจะตUองเปyนต)วอ)กขระ
                                                                                       Y
             ขUางตUน หรอเปyนต)วเลข 0 ถxง 9 เทLาน)น
                                                 Y
          • identifier จะตUองไมLตรงก)บค;ย#เวร#ด
          identifier ในภาษาจาวาจะถอวLาต)วอ)กษรพมพ#ใหญLและต)วอ)กษรพมพ#เล5กตLางก)น (Case Sensitive) ด)งน)นY
identifier ท;ชอ myVariable จะแตกตLางจาก MyVariable

ต)วอยLางของ identifier ท;ถVกตUอง
        • MyVariable
        • _MyVariable
        • $x




30    พYนฐานโปรแกรมภาษาจาวา                                                               ผศ. ธนศา เครอไวศยวรรณ
• This_is_also_a_variable
ต)วอยLางของ identifier ท;ไมLถVกตUอง
        •   My Variable
        •   9pns
        •   a+c
        •   Hello’World
        •   public


หลกการตงชอทน,ยมปฏ,บต,กนโดยทวไป
        แนวทางปฏบ)ตท;ใชUในการต)Yงชอจะม;ขUอกZาหนดด)งน;Y
        • การต)Yงชอคลาส
          – จะขxนตUนดUวยต)วอ)กษรพมพ#ใหญLแลUวตามดUวยต)วอ)กษรพมพ#เล5กหรอต)วเลข โดยจะใชUต)วอ)กษรพมพ#
                    Y
               ใหญLสZาหร)บอ)กษรนZาของแตLละคZาท;ตามมาในชอ
          – ควรเปyนคZานาม
          – ต)วอยLางเชLน Main, HelloWorld, Student หรอ GraduateStudent เปyนตUน
        • การต)Yงชอต)วแปร ชอคJณล)กษณะ หรออ5อบเจกต#
          – จะขxนตUนดUวยต)วอ)กษรพมพ#เล5ก โดยจะใชUต)วอ)กษรพมพ#ใหญLสZาหร)บอ)กษรนZาของแตLละคZาท;ตามมาใน
                      Y
               ชอ
          – ควรเปyนคZานามหรอเปyนชอส)Yนๆ
          – ต)วอยLางเชLน x, s1, id, name หรอ thesisTitle เปyนตUน
        • การต)Yงชอเมธอด
          – จะใชUหล)กการเด;ยวก)บการต)Yงชอต)วแปร แตLควรเปyนคZากรยา
          – ต)วอยLางเชLน getName, sayHi, setName หรอ showDetails เปyนตUน
        • การต)YงชอคLาคงท;
          – จะใชUตวอ)กษรพมพ#ใหญLท)Yงหมด และจะแยกคZาโดยใชUเครองหมาย_ (underscore)
                        )
          – ควรเปyนคZานาม
          – ต)วอยLางเชLน MINIMUM, MIN_GPA เปyนตUน
2.2.3 คย.เว,ร.ด
         ค;ย#เวร#ดคอชอท;ม;ความหมายพเศษในภาษาจาวา คอมไพเลอร#ของภาษาจาวาจะเขUาใจความหมายและคZาส)งท;จะ
ตUองดZาเนนการสZาหร)บค;ย#เวร#ดแตLละต)ว ภาษาจาวาไดUกZาหนดค;ย#เวร#ดตLางๆ ไวUด)งแสดงในตารางท; 2.1


ผศ. ธนศา เครอไวศยวรรณ                                                         พYนฐานโปรแกรมภาษาจาวา   31
ตารางท 2.1 ค;ย#เวร#ดท;ใชUในภาษาจาวา
                abstract          continue          for              new               switch
                assert            default           goto             package           synchronied
                boolean           do                if               private           this
                break             double            implements       protected         throw
                byte              else              import           public            throws
                case              enum              instanceof       return            transient
                catch             extends           int              short             try
                char              final             interface        static            void
                class             finally           long             strictfp          volatile
                const             float             native           super             while



         ค;ย#เวร#ดเหลLาน;YไมLสามารถจะนZามาต)Yงเปyน identifier ไดU ซxงจากค;ย#เวร#ดขUางตUนจะเห5นวLาค;ย#เวร#ดทJกต)วจะเปyนต)ว
อ)กษรพมพ#เล5ก และจะม;ค;ย#เวร#ด goto และ const เปyนค;ย#เวร#ดท;ไมLไดUตรงก)บคZาส)งใดในภาษาจาวา สLวนคZาวLา
true และ false ไมLไดUเปyนค;ย#เวร#ดในภาษาจาวาแตLจะเปyนขUอมVลคLาคงท;ชนดตรรกะ เชLนเด;ยวก)บคZาวLา null ซxงเปyน

ขUอมVลคLาคงท;ของต)วแปรท;ม;ชนดขUอมVลแบบอUางองท;จะกลLาวถxงตLอไป


2.2.4 สญลกษณ.แยกคDา

        ภาษาจาวาม;ส)ญล)กษณ#แยกคZาตLางๆ ท;สามารถนZาไปใชUเข;ยนในโปรแกรมไดUด)งตารางท; 2.2

                                 ตารางท 2.2 หนUาท;ของเครองหมายตLางๆ ท;ใชUในภาษาจาวา
                                                  
                 สญลกษณ.แยกคDา                                      หนาท
                          ;             เพอระบ%การส,นส%ดของคDาสงต0างๆ ภายในภาษาจาวา
                                        สDาหรบต0อทายเมธอดหรอคDาสงอนๆ ในภาษาจาวา เช0น
                         ()
                                        if,for เปHนตน

                          ,            สDาหรบแยกตวแปรหรอคDาสงในภาษาจาวา
                                       เพอใชในการระบ%คณลกษณะหรอเมธอดของอ-อบเจกต. หรอใช
                                                        %
                          .
                                       ในการระบ%แพคเก-จของภาษาจาวา



32    พYนฐานโปรแกรมภาษาจาวา                                                                        ผศ. ธนศา เครอไวศยวรรณ
เพอระบ%บล-อกคDาสงของภาษาจาวา คDาสงต0างๆ ของภาษาจาวา
                                    จะอย0ภายในบล-อกอาท,เช0น คDาสงทอย0ภายในคลาส ภายใน
                        {}          เมธอด หรออย0ภายในช%ดคDาสงโครงสรางควบค%มต0างๆ เช0น
                                    if,while หรอ for เปHนตน โดยปกต,บล-อกเหล0านสามารถ

                                    ซอนกนได

2.2.5 ช0องว0าง
        โปรแกรมภาษาจาวาสามารถท;จะม;ชLองวLางเพอแยกคZา ประโยค หรอคZาส)งตLางๆ ภายในโปรแกรมไดU โดยชLอง
วLางจะม;ขนาดเทLาไรก5ไดU ท)Yงน;Yคอมไพเลอร#ของภาษาจาวาจะไมLนZาสLวนท;เปyนชLองวLางมาเก;ยวขUองก)บขนาดของโปรแก
รมไบท#โคUด ชLองวLางจะชLวยทZาใหUรVปแบบของโปรแกรมซอร#ดโคUดดVงLายขxน ซxงรVปแบบของชLองวLางประกอบดUวย
                                                                    Y
        • ชLองวLาง (กดค;ย# Space บนค;ยบอร#ด)
                                       #
        • แท5ป (กดค;ย# Tab บนค;ยบอร#ด)
                                   #
        • การขxYนบรรท)ดใหมL (กดค;ย# Enter บนค;ย#บอร#ด)


2.2.6 ขอมลค0าคงท
         ขUอมVลคLาคงท;คอคZาท;ใชUแสดงขUอมVลท;เปyนต)วเลข ต)วอ)กขระ ขUอความ หรอคLาทางตรรกะ ซxงในภาษาจาวาไดU
กZาหนดขUอมVลคLาคงท;ไวU 5 ประเภทด)งน;Y
         1. ตรรกะ (Boolean)
         2. ต)วอ)กขระ (Character)
         3. ต)วเลขจZานวนเต5ม (Integral)
         4. ต)วเลขทศนยม (Floating Point)
         5. ขUอความ (String)
ซxงรVปแบบของการเข;ยนขUอมVลคLาคงท;และประเภทของชนดขUอมVล จะกลLาวถxงในห)วขUอตLอไป

2.3 ชน,ดขอมลแบบพนฐาน

        ภาษาจาวาเปyนภาษาท;ตUองระบJชนดขUอมVลอยLางช)ดเจน (Strongly Typed Language) กลLาวคอขUอมVลท;เปyน
ต)วแปรหรอคLาคงท;ทJกต)วท;ปรากฏอยVLในโปรแกรม จะตUองม;การประกาศ และจะตUองระบJชนดขUอมVลดUวยเสมอ โดยชนด
ขUอมVลในภาษาจาวาแบLงเปyนสองประเภทใหญLๆ คอ


ผศ. ธนศา เครอไวศยวรรณ                                                               พYนฐานโปรแกรมภาษาจาวา   33
1.   ชนดขUอมVลแบบพYนฐาน (Primitive Data Type)
       2.   ชนดขUอมVลแบบอUางอง (Reference Data Type)

       ชนดขUอมVลแบบพYนฐานคอชนดขUอมVลท;กZาหนดไวUในภาษาจาวา ซxงภาษาจาวากZาหนดไวU 8 ชนดคอ boolean,
char, byte, short, int, long, float และ double ด)งแสดงในตารางท; 2.3 ซxงท)Yง 8 ชนดสามารถแบLง

ออกไดUเปyน 4 ประเภทคอ
       1. ชนดขUอมVลตรรกะ (Logical) คอชนด boolean
       2. ชนดขUอมVลอ)กขระ (Textual) คอชนด char
       3. ชนดขUอมVลต)วเลขจZานวนเต5ม (Integral) คอชนด byte,short,int และ long
       4. ชนดขUอมVลต)วเลขทศนยม (Floating Point) คอชนด float และ double

                    ตารางท 2.3 ขนาดและชLวงคLาของชนดขUอมVลแบบพYนฐานของภาษาจาวา
               ชน,ดขอมล     ขนาด              ช0วงค0า               หมายเหต%
                            (บ,ต)
               boolean        1         true หรอ false

                                      ‘u0000’ ถKง ‘uFFFF’ ขอมลอกขระแบบ
                 char        16
                                                              Unicode
                 byte         8            -128 ถKง +127
                short         16        -32,768 ถKง +32,767
                  int         32           -231 ถKง +231-1
                 long         64           -263 ถKง +263-1
                                                              IEEE 754 single
                                           -3.40E+38 ถKง
                float         32                              precision
                                            +3.40E+38          floating point.
                                                              IEEE 754 double
                                          -1.80E+308 ถKง
                double        64                              precision
                                           +1.80E+308          floating point.

       ชนดขUอมVลแบบอUางองคอชนดขUอมVลอนๆ ท;ไมLใชLชนดขUอมVลแบบพYนฐาน ชนดขUอมVลท)Yงสองประเภทจะม;ความ
แตกตLางก)นในเรองของการเก5บขUอมVลในหนLวยความจZา และวธ;การเร;ยกใชUงาน ซxงจะกลLาวถxงตLอไป




34   พYนฐานโปรแกรมภาษาจาวา                                                       ผศ. ธนศา เครอไวศยวรรณ
2.3.1 ชน,ดขอมลตรรกะ
         ในภาษาจาวาชนดขUอมVล boolean คอชนดขUอมVลตรรกะ โดยขUอมVลชนดตรรกะเปyนขUอมVลท;ประกอบดUวยคLา
สองคLาคอจรงและเท5จ ซxงตรงก)บ true และ false คLาคงท;หรอต)วแปรท;ม;ชนดขUอมVลเปyน boolean จะม;คาเปyนใดคLา
                                                                                                     L
หนxงภายในสองคLาน;YเทLาน)น คZาวLา true และ false แมUจะไมLใชLคย#เวร#ดในภาษาจาวา แตLเนองจากเปyนคZาท;สงวนไวU
                            Y                                 ;
(Reserved Word) จxงไมLอนJญาตใหUต)Yงชอ identifier ตรงก)บคZาท)Yงสอง ภาษาจาวาเปyนภาษาท;ตUองระบJชนดขUอมVลอยLาง
ช)ดเจน ด)งน)นจxงสามารถใชUชนดขUอมVล boolean ในกรณ;ท;ตUองการคLาขUอมVลชนดตรรกะเทLาน)นโดยไมLอนJญาตใหUใชU
            Y                                                                         Y
ชนดขUอมVลอนๆ ซxงกรณ;นจะแตกตLางจากภาษาซ;หรอ C++ ท;อนJญาตใหUแปลงขUอมVลชนดต)วเลขจZานวนเต5มใหUเปyน
                              ;Y
ขUอมVลคLาคงท;ชนดตรรกะไดU
         ต)วอยLางเชLน คZาส)ง
                   boolean flag = true;
          เปyนการประกาศต)วแปร flag ใหUมชนดขUอมVลเปyน boolean โดยกZาหนดใหUม;คาเปyน true
                                       ;                                    L

2.3.2 ชน,ดขอมลตวอกขระ
          ในภาษาจาวาชนดขUอมVล char คอชนดขUอมVลต)วอ)กขระ โดยขUอมVลชนดต)วอ)กขระใชUเพอแสดงต)วอ)กขระหนxง     
ต)ว ซxงในภาษาจาวาจะถVกเก5บอยVLในรVปของมาตรฐาน Unicode ซxงจะม;ขนาด 16 บต ขUอมVลคLาคงท;ซxงเปyนต)วอ)กขระ
แบบ Unicode จะอยVLในเครองหมาย ‘ ‘ โดยจะขxนตUนดUวยส)ญล)กษณ# u และตามดUวยเลขฐานสบหก (Hexadecimal
                                            Y
number) โดยจะม;คาต)YงแตL ‘u0000’ ถxง ‘uFFFF’ เพอเก5บต)วอ)กขระของภาษาตLางๆ ไดUท)Yงหมด 65,536 ต)วต)วอยLาง
                       L
เชLน ต)วอ)กขระแบบ Unicode สZาหร)บภาษาไทยจะม;คาต)YงแตLชLวง ‘u0E00’ ถxง ‘u0E7F’ เปyนตUน
                                                L
          ต)วอยLางเชLน คZาส)ง
                   char letter = ‘u0041’;

          จะเปyนการประกาศต)วแปร letter ใหUมชนดขUอมVลเปyน char โดยม;คาเปyน u0041 ซxงม;คLาเทLาก)บต)วอ)กษร A
                                           ;                        L

        สZาหร)บรห)ส ASCII ท;ใชUในระบบคอมพวเตอร#ท)วไป ต)วอ)กขระแบบ Unicode จะกZาหนดคLาในชLวง ‘u0000’
ถxง ‘u00FF’ ใหUสอดคลUองก)บรห)ส ASCII 128 ต)วแรก นอกจากน;Yเราสามารถท;จะกZาหนดขUอมVลคLาคงท;ชนดต)วอ)กขระ
โดยกZาหนดต)วอ)กขระภายในเครองหมาย ‘ ’ อาทเชLน ‘x’, ‘1’ และ ‘$’
        ต)วอยLางเชLน คZาส)ง
                   char letter = ‘A’;

          จะเปyนการประกาศต)วแปร letter ใหUมชนดขUอมVลเปyน char โดยม;คาเปyน ต)วอ)กษร A เชLนเด;ยวก)บคZาส)งกLอน
                                           ;                        L
หนUาน;Y



ผศ. ธนศา เครอไวศยวรรณ                                                             พYนฐานโปรแกรมภาษาจาวา   35
ภาษาจาวาสามารถท;จะเข;ยนขUอมVลคLาคงท;ท;เปyนอ)กขระพเศษตLางๆ ไดU โดยใชUส)ญล)กษณ#  นZาหนUาต)วอ)กษร
ภาษาอ)งกฤษตLางๆ อาทเชLน ‘n’ คออ)กขระสZาหร)บการขxนบรรท)ดใหมL เปyนตUน ต)วอ)กขระพเศษท;นยมใชUท)วไปจะเปyน
                                                    Y
ไปตามตารางท; 2.4

                                  ตารางท 2.4 ต)วอ)กขระพเศษท;นยมใชUทวไป
                                                                    )
                             อกขระ          Unicode              ความหมาย
                              ‘b’          ‘u000B’             Backspace
                              ‘t’          ‘u0009’                Tab
                              ‘n’          ‘u000A’             New line
                              ‘r’          ‘u000D’               Return
                              ‘’          ‘u005C’             Backslash
                              ‘’’          ‘u0027’            Single quote
                              ‘’’’         ‘u0022’            Double quote


2.3.3 ชน,ดขอมลตวเลขจDานวนเต-ม
          ในภาษาจาวาชนดขUอมVล byte, short, int และ long คอชนดขUอมVลต)วเลขจZานวนเต5มโดยขUอมVลชนดน;Yคอ
ขUอมVลท;เปyนจZานวนเต5มใดๆ ในทางคณตศาสตร# โดยท;แตLละชนดจะม;ขนาดในการเก5บขUอมVลไมLเทLาก)นทZาใหUม;ชLวงของ
ขUอมVลตLางก)น ด)งท;กลLาวมาแลUวในตารางท; 2.3 ซxงโดยท)วไปภาษาจาวาจะกZาหนดใหUเลขจZานวนเต5มม;ชนดขUอมVลเปyน
int การเข;ยนขUอมVลคLาคงท;ท;เปyนขUอมVลชนดต)วเลขจZานวนเต5มใดๆ จะไมLม;การใชUเครองหมาย , (comma) เชLน

10,000 จะตUองเข;ยนเปyน 10000 โดยภาษาจาวาจะสามารถเข;ยนคLาคงท;ขUอมVลไดUสามแบบด)งน;Y
          1. เลขฐานสบคอการเข;ยนเลขจZานวนเต5มท)วไป อาทเชLน -121 และ 75362 เปyนตUน
          2. เลขฐานแปดคอการเข;ยนเลขจZานวนเต5มท;ขxYนตUนดUวยเลข 0 แลUวตามดUวยต)วเลขต)YงแตL 0 ถxง 7 อาทเชLน
             016 (ม;คาเทLาก)บ 14 ในเลขฐานสบ)
                      L
          3. เลขฐานสบหกคอการเข;ยนเลขจZานวนเต5มท;ขxYนตUนดUวย 0x หรอ 0X แลUวตามดUวยต)วเลขต)YงแตL 0 ถxง 9
             หรอต)วอ)กษร A ถxง F อาทเชLน 0xA2 (ม;คาเทLาก)บ 162 ในเลขฐานสบ)
                                                          L

        การประกาศต)วแปรใดๆ ใหUม;ชนดขUอมVลเปyนต)วเลขจZานวนเต5มชนดใดชนดหนxง จะม;ผลใหUภาษาจาวากZาหนด
                                                                           
ขนาดของเนYอท;สZาหร)บหนLวยความจZา และชLวงในการเก5บขUอมVลใหUสอดคลUองก)บชนดขUอมVลน)นโดยอ)ตโนม)ตอาทเชLน
                                                                                 Y
คZาส)ง
               int x = 4;
               byte b = 4;

       เปyนการประกาศต)วแปร x ใหUมชนดขUอมVลเปyน int ม;ขนาดของเนYอท;ในหนLวยความจZา 32 บต และต)วแปร b
                                  ;
ใหUม;ชนดขUอมVลเปyน byte ม;ขนาดของเนYอท;ในหนLวยความจZา 8 บต ถxงแมUวาต)วแปรท)Yงสองจะเก5บคLาเรมตUนเปyน 4
                                                                   L


36   พYนฐานโปรแกรมภาษาจาวา                                                             ผศ. ธนศา เครอไวศยวรรณ
เหมอนก)น แตLต)วแปร x จะสามารถเก5บขUอมVลต)วเลขจZานวนเต5มในชLวงท;กวUางกวLา (-231 ถxง 231-1)

       ขUอมVลคLาคงท;ของต)วเลขจZานวนเต5มโดยท)วไปจะถVกกZาหนดใหUม;ชนดขUอมVลเปyน int แตLภาษาจาวาสามารถ
กZาหนดขUอมVลคLาคงท;ของต)วเลขจZานวนเต5มใหUม;ชนดขUอมVลเปyน long ไดUโดยใสLต)วอ)กษร l หรอ L ตLอทUาย อาทเชLน
       • 2l หมายถxงเลขฐานสบท;ม;คLาเทLาก)บ 2 และม;ชนดขUอมVลเปyน long
       • 077L หมายถxงเลขฐานแปดท;ม;คาเทLาก)บ 63 และม;ชนดขUอมVลเปyน long
                                         L
       • 0xBAACL หมายถxงเลขฐานสบหกท;ม;ชนดขUอมVลเปyน long


2.3.4 ชน,ดขอมลตวเลขทศน,ยม
         ขUอมVลชนดต)วเลขทศนยมคอเลขจZานวนจรง (real number) ซxงในระบบคอมพวเตอร#จะเก5บขUอมVลประเภทน;Y
โดยแบLงจZานวนบตท;เก5บขUอมVลเปyนสองสLวนคอสLวนท;เปyนความละเอ;ยดของต)วเลข (mantissa) และสLวนท;เปyนจZานวน
เลขยกกZาล)ง (exponent) โดยสLวนท;เปyนความละเอ;ยดของต)วเลขจะเก5บคLาในชLวงต)YงแตL -1.0 ถง 1.0 และสLวนท;เปyน
เลขยกกZาล)งจะเก5บคLาท;เปyนเลขยกกZาล)งสอง ภาษาจาวาเก5บเลขจZานวนจรงตามมาตรฐาน IEEE 754 ซxงจะแบLง
เลขจZานวนจรงออกเปyน single precision และ double precision โดยท;ต)วเลขแบบ single precision จะใชUเนYอท;
หนLวยความจZาจZานวน 32 บต แบLงเปyนสLวนท;เปyนความละเอ;ยดของต)วเลขจZานวน 24 บต และสLวนท;เปyนจZานวนเลขยก
กZาล)งจZานวน 8 บต ด)งแสดงในรVปท; 2.2 สLวนต)วเลขแบบ double precision จะใชUเนYอท;หนLวยความจZาจZานวน 64 บต
                                                                                 
แบLงเปyนสLวนท;เปyนความละเอ;ยดของต)วเลขจZานวน 53 บต และสLวนท;เปyนจZานวนเลขยกกZาล)งจZานวน 11 บต




              รปท 2.2 จานวนบตของ     mantissa และ exponent สาหรบตวเลขแบบ single precision


        ภาษาจาวากZาหนดชนดขUอมVลต)วเลขทศนยมไวUสองชนดคอ float และ double โดยท;ชนดขUอมVล float จะ
เก5บขUอมVลขนาด 32 บตตามมาตรฐานแบบ single precision สLวนขUอมVลชนด double จะเก5บขUอมVลขนาด 64 บตตาม
มาตรฐานแบบ double precision ภาษาจาวากZาหนดขUอมVลชนดต)วเลขทศนยมใหUเปyนเลขท;ม;เครองหมายจJดทศนยม
อาทเชLน 3.14 หรอ 3.0 นอกจากน;ย)งสามารถเข;ยนอยVLในรVปแบบของเลขยกกZาล)งสบ (exponential form) ไดUโดยใชU
                                 Y
ต)วอ)กษร E หรอ e ระบJจZานวนท;เ ปyนเลขยกกZาล)งสบอาทเชLน 6.02E23 หรอ 2e-7



ผศ. ธนศา เครอไวศยวรรณ                                                              พYนฐานโปรแกรมภาษาจาวา   37
ขUอมVลคLาคงท;ชนดต)วเลขทศนยม โดยท)วไปจะถVกกZาหนดใหUม;ชนดขUอมVลเปyน double แตLภาษาจาวาสามารถ
กZาหนดขUอมVลคLาคงท;ใหUม;ชนดขUอมVลเปyน float ไดU โดยใสLต)วอ)กษร f หรอ F ตLอทUาย อาทเชLน 2.718F หรอ 3.14f
เปyนตUน

          นอกจากน;ภาษาจาวาจะกZาหนดขUอมVลคLาคงท;ชนดต)วเลขทศนยมท;ม;อ)กษร D หรอ d ตLอทUายวLาเปyนขUอมVลคLา
                     Y
คงท;ท;ม;ชนดขUอมVลเปyน double อาทเชLน 3.14D แตLเนองจากโดยท)วไปขUอมVลคLาคงท;ชนดต)วเลขทศนยมจะถVกกZาหนด
                                                               
ใหUเปyนชนด double อยVLแลUว จxงไมLม;ความจZาเปyนตUองใสLต)วอ)กษร D หรอ d ตLอทUาย
          ต)วอยLางขUอมVลคLาคงท;ของต)วเลขทศนยมท;ถVกตUอง
                 12.    12E2       12.0e2   12.0e2F     -3.14F
           ต)วอยLางขUอมVลคLาคงท;ของต)วเลขทศนยมท;ไมLถVกตUอง
                 1,234.0 1.2E108F


2.4 ตวแปรและค0าคงท

          ขUอมVลท;เก5บอยVLในโปรแกรมเชLนขUอมVลท;เปyนคJณล)กษณะของอ5อบเจกต# คJณล)กษณะของคลาส และขUอมVลใน
เมธอด จะแบLงเปyนสองประเภทคอต)วแปรและคLาคงท; ซxงต)วแปรคอขUอมVลท;สามารถเปล;ยนแปลงคLาไดUในโปรแกรมโดย
ใชUคZาส)งกZาหนดคLา สLวนคLาคงท;คอขUอมVลท;กZาหนดคLาไดUเพ;ยงคร)Yงเด;ยวและไมLสามารถเปล;ยนแปลงคLาไดUในโปรแกรม
ท)Yงต)วแปรและคLาคงท;จะตUองม;การประกาศชอและชนดของขUอมVล เพอท;จะเตร;ยมเนYอท;ในหนLวยความจZาสZาหร)บเก5บ
                                                                        
ขUอมVล
          คZาส)งในการประกาศต)วแปรของภาษาจาวาม;รVปแบบด)งน;Y
                                 [modifier] dataType variableName[,variableName];

โดยท;
           • modifier คอค;ย#เวร#ดระบJคJณสมบ)ตตLางๆ     ของต)วแปรเชLน access modifier สLวนกรณ;ท;ไมLระบJจะถอวLา
              เปyน default
           • dataType คอชนดขUอมVล
           • variableName คอชอของต)วแปรท;เปyนไปตามกฎการต)Yงชอ
           ต)วอยLางเชLน คZาส)ง
                   int amount;

           เปyนการประกาศต)วแปร amount ใหUม;ชนดขUอมVลเปyน int
                   double x;




38       พYนฐานโปรแกรมภาษาจาวา                                                              ผศ. ธนศา เครอไวศยวรรณ
เปyนการประกาศต)วแปร x ใหUมชนดขUอมVลเปyน double
                                   ;

       นอกจากน;ภาษาจาวาย)งอนJญาต ใหUสามารถประกาศชอต)วแปรท;เปyนชนดขUอมVลเด;ยวก)นไดUหลายๆ ต)วแปร
                   Y
ภายในคZาส)งเด;ยวก)น ต)วอยLางเชLน
         float      price, wholeSalePrice;

         เปyนคZาส)งประกาศต)วแปร price และ wholeSalePrice ใหUม;ชนดขUอมVลเปyน float

2.4.1 คDาสงกDาหนดค0า
       ต)วแปรท;ม;การประกาศชนดขUอมVลแลUวสามารถท;จะกZาหนดหรอเปล;ยนแปลงคLาไดUโดยใชUคZาส)งกZาหนดคLา
(assignment statement) ซxงม;รVปแบบด)งน;Y

                                          variableName = expression;

โดยท;
         • variableName       คอชอต)วแปร
         •   expression คอนพจน#ซxงเปyนผลล)พธ#ท;ไดUจากการคZานวณขUอความท;อาจประกอบไปดUวยคLาคงท;ขUอมVล

             ต)วแปร และต)วดZาเนนการ (operator) ตLางๆ ซxงนพจน#อาจเปyนนพจน#ท;ใหUผลล)พธ#เปyนขUอมVลคLาคงท;ชนด
             ต)วเลขจZานวนเต5ม ตรรกะ ต)วเลขทศนยม อ)กขระ หรอขUอความ ท)Yงน;ขxYนอยVLก)บชนดขUอมVลและคZาส)งท;ใชU
                                                                        Y

         ต)วอยLางตLอไปน;แสดงการใชUคZาส)งกZาหนดคLาสZาหร)บต)วแปร ท;ไดUทZาการประกาศชนดขUอมVลไวUแลUว
                        Y
                         x = 1;
                         radius = 3.14;
                         c = ‘a’;
                         y = x+4*3;

       คZาส)งกZาหนดคLาจะส)งงานใหUเครองคอมพวเตอร#ทZางานสองข)นตอนคอ คZานวณหาผลล)พธ#ของนพจน# แลUวเก5บ
                                                              Y
ผลล)พธ#ท;ไดUไวUในต)วแปรอาทเชLน คZาส)ง
                         amount = 121+14;

         จะม;ขนตอนคอคZานวณหาผลล)พธ#ซxงจะไดUคLาเปyน 135 แลUวเก5บผลล)พธ#ท;ไดUลงในต)วแปร amount
              )Y

         คZาส)งกZาหนดคLาจะตUองม;ชอต)วแปรอยVLทางดUานซUายมอ การใชUคZาส)งเชLน
                         1 = x;

         เปyนการใชUคZาส)งท;ไมLถVกตUอง เพราะคLาคงท;ใดๆ ไมLสามารถท;จะเก5บผลล)พธ#ท;ไดUจากนพจน# (คLาของ x) ไดU




ผศ. ธนศา เครอไวศยวรรณ                                                                  พYนฐานโปรแกรมภาษาจาวา      39
นอกจากน;เY ราสามารถท;จะนZาชอต)วแปรท;จะกZาหนดคLามาประกอบในนพจน#ไดU อาทเชLน
                        x = x+1;

       เปyนคZาส)งท;ใหUนพจน#เพมคLาของต)วแปร x ท;ม;อยVLแลUวไปอ;ก 1 แลUวนZาผลล)พธ#ท;ไดUเก5บไวUในต)วแปร x เชLนเดม
อาทเชLน ถUา x ม;คาเปyน 5 จะกลายเปyน 6
                  L

        เราสามารถท;จะประกาศและกZาหนดคLาเรมตUนของต)วแปร ภายในคZาส)งเด;ยวก)นไดU โดยม;รVปแบบคZาส)งด)งน;Y
      [modifier] dataType variableName = expression [,variableName = expression];

        อาทเชLน
                        int amount = 123;
                        float price = 12.0f;
                        double x = 4.0, y = 2.5;

         โปรแกรมท; 2.3 เปyนต)วอยLางท;แสดงการประกาศต)วแปรและการใชUคZาส)งกZาหนดคLาของต)วแปรท;ม;ชนดขUอมVล
ตLางๆ ซxงโปรแกรมน;YจะใหUผลล)พธ#ด)งแสดงในรVปท; 2.3


โปรแกรมท( 2.3 ต)วอยางการใชค(าส)งก(าหนดคา

  public class VariableAssignDemo {
     public void showDemo() {
         int x,y;
         boolean b1;
         float z = 3.414f; /* The program will not be
                                compiled successfully if
                                a character f is missing */
         double w;
         x = 5;
         y = 4;
         b1 = (x > y);
         w = x * 3.2;
         System.out.println("x = " + x + " y = " + y);
         System.out.println("b1 = " + b1);
         System.out.println("z = " + z + " w = " + w);
     }
  }

  -----------------------------------------------------------------
  public class Main {

          public static void main(String args[]) {
              VariableAssignDemo obj = new VariableAssignDemo();
              obj.showDemo();
          }
  }




40    พYนฐานโปรแกรมภาษาจาวา                                                                    ผศ. ธนศา เครอไวศยวรรณ
รปท   2.3 ผลลพธทได*จากการรนโปรแกรมท 2.3


2.4.2 ค0าคงท
        การประกาศคLาคงท;ในภาษาจาวาทZาไดUโดยการใสLค;ย#เวร#ด final หนUาคZาส)งประกาศชอ โดยม;รVปแบบด)งน;Y
                        [modifier] final dataType CONSTANT_NAME = expression;

        โดยท;
        • modifier      คอค;ย#เวร#ดระบJคJณสมบ)ตตLางๆ ของคLาคงท;เชLน access modifier
        • dataType คอชนดขUอมVลของคLาคงท;
        • CONSTANT_NAME คอชอของคLาคงท;ซxงโดยท)วไปนยมใชUตวอ)กษรพมพ#ใหญL และแยกคZาดUวยเครองหมาย _
                                                                    )
        • expression คอนพจน#ท;ใหUผลล)พธ#เปyนชนดขUอมVลท;สอดคลUองก)บชนดขUอมVลของคLาคงท;
        ต)วอยLางเชLน คZาส)ง
                 final int MINIMUM = 4;
                 final double MIN_GPA = 2.00;

        เปyนการประกาศคLาคงท; MINIMUM ใหUม;ชนดขUอมVลเปyน int โดยม;คLาเปyน 4 และคLาคงท; MIN_GPA ใหUม;ชนด
ขUอมVลเปyน double โดยม;คาเปyน 2.00
                        L

       คLาคงท;จะกZาหนดคLาไดUเพ;ยงคร)Yงเด;ยว โดยจะตUองม;การกZาหนดคLากLอนท;จะม;การเร;ยกใชUงาน ซxงเมอกZาหนดคLา
แลUวจะไมLสามารถเปล;ยนแปลงคLาไดU

        โปรแกรมท; 2.4 เปyนต)วอยLางท;แสดงการประกาศคLาคงท;และการใชUคาคงท; ซxงจะใหUผลล)พธ#ด)งแสดงในรVปท;
                                                                     L
2.4




ผศ. ธนศา เครอไวศยวรรณ                                                                พYนฐานโปรแกรมภาษาจาวา   41
โปรแกรมท( 2.4 ต)วอยางแสดงการประกาศคาคงท%
     public class ConstantDemo {
        public void showDemo() {
           final int MAXIMUM = 10;
           final double MIN_GPA;

              System.out.println("Maximum is " + MAXIMUM);
              MIN_GPA = 2.00;
              System.out.println("Minimum GPA is " + MIN_GPA);
     //       MIN_GPA = 3.00;   //illegal
          }
     }

     --------------------------------------------------------
     public class Main {

              public static void main(String args[]) {
                  ConstantDemo obj = new ConstantDemo();
                  obj.showDemo();
              }
     }




                                 รปท 2.4 ผลลพธทได*จากการรนโปรแกรมท 2.4

2.4.3 ขอบเขตของตวแปรและค0าคงท
        ต)วแปรและคLาคงท;ซxงประกาศขxนจะสามารถใชUงานภายในบล5อกคZาส)ง { } ท;ประกาศเทLาน)น โดยภาษาจาวา
                                      Y                                                    Y
แบLงต)วแปรและคLาคงท;เปyนสองประเภทคอ
        1. ต)วแปรหรอคLาคงท;ท;เปyนคJณล)กษณะของอ5อบเจกต# หรอคJณล)กษณะของคลาส
        2. ต)วแปรหรอคLาคงท;ท;อยVLในบล5อกของเมธอดท;เร;ยกวLาคLาคงท;ภายใน (Local Constant) หรอต)วแปรภายใน
              (Local Variable)




42       พYนฐานโปรแกรมภาษาจาวา                                                         ผศ. ธนศา เครอไวศยวรรณ
ต)วแปรหรอคLาคงท; ท;เปyนคJณล)กษณะของอ5อบเจกต#หรอคJณล)กษณะของคลาส คอ ต)วแปรหรอคงท;ท;ประกาศ
ภายในบล5อกของคลาส ซxงอยVLนอกเมธอดของคลาส ต)วแปรหรอคLาคงท;ประเภทน;จะม;ขอบเขตใชUงานอยVLภายในคลาส
                                                                       Y
โดยท;ทJกๆ เมธอดในคลาสสามารถเร;ยกใชUไดU สZาหร)บต)วแปรประเภทน;YจะถVกกZาหนดคLาเรมตUนใหUโดยอ)ตโนม)ตด)ง
ตารางท; 2.5
                               ตารางท 2.5 คLาเรมตUนท;ถVกกZาหนดใหUอ)ตโนม)ต
                                 ชน,ดขอมล                    ค0าเร,มตน
                                 boolean                    false
                                    byte                        0
                                   short                        0
                                     int                        0
                                    long                       0L
                                   float                     0.0f
                                  double                      0.0
                                    char                  ‘u0000’
                                   คลาส                      null




        สZาหร)บคLาคงท;หรอต)วแปรท;อยVLภายในบล5อกของเมธอด จะม;ขอบเขตการใชUงานอยVLภายในบล5อกเทLาน)น
                                                                                                 Y
โปรแกรมท; 2.5 แสดงต)วอยLางต)วแปรท;เปyนคJณล)กษณะของอ5อบเจกต#และต)วแปรท;เปyนต)วแปรภายใน โดยโปรแกรมน;Y
ม;ต)วแปร i ท;เปyนคJณล)กษณะของอ5อบเจกต# สLวนต)วแปร j และ k ในเมธอด method1()เปyนต)วแปรภายใน และ
ต)วแปร j ในเมธอด method2() ก5เปyนต)วแปรภายในอ;กต)วหนxง เราไมLสามารถท;จะเร;ยกใชUต)วแปร k นอกเมธอด
                                                         
method1()ไดU นอกจากน;Yต)วแปร j ในเมธอดท)YงสองจะถอวLาเปyนต)วแปรคนละต)วก)น



โปรแกรมท( 2.5 ต)วอยางแสดงขอบเขตของต)วแปร

   public class VariableScopeDemo {
      public int i;              // object variable

       public void method1() {
          int j = 4;                    // local variable
          int k = 2;                    // another local variable
       }

      public void method2() {
         int j = 0;                     // local variable
         System.out.println(i);         // calling an object variable i
   //    System.out.println(k);         // illegal
      }
   }




ผศ. ธนศา เครอไวศยวรรณ                                                         พYนฐานโปรแกรมภาษาจาวา   43
ต)วแปรท;เปyนคJณล)กษณะของอ5อบเจกต#จะสามารถเก5บ และเปล;ยนแปลงคLาท;เ ก5บไวUในหนLวยความจZาไดU
ตราบใดท;อ5อบเจกต#ย)งถVกอUางองในโปรแกรม ต)วแปรภายในจะเปyนต)วแปรท;กZาหนดในบล5อกของเมธอด ซxงจะม;
ขอบเขตการใชUงานอยVLภายในบล5อกท;กZาหนดขxนเทLาน)น ต)วแปรประเภทน;จะถVกสรUางขxนเมอม;การเร;ยกใชUงานเมธอดท;
                                        Y      Y                   Y          Y
ต)วแปรประกาศอยVL และจะถVกลบทYงเมอสYนสJดการทZางานของเมธอด ด)งน)นในบางคร)Yงจะเร;ยกต)วแปรประเภทน;Yวา
                                                                 Y                                   L
ต)วแปรช)วคราว (temporary variable) ต)วแปรท;ประกาศอยVLใน argument ของเมธอด ก5จ)ดอยVLในต)วแปรประเภทน;Y
เชLนก)น

       โปรแกรมท; 2.6 แสดงต)วอยLางของการประกาศและใชUงานต)วแปรภายในและต)วแปรของอ5อบเจกต# คลาส
ScopeExample จะม;ต)วแปรของอ5อบเจกต# i ท;ถVกสรUางขxนเมอม;การสรUางอ5อบเจกต#ของคลาสและจะเก5บอยVLใน
                                                     Y
Heap Memory ด)งแสดงในรVปท; 2.5 และเมอม;การเร;ยกใชUเมธอด method1() และ method2() ต)วแปรภายใน i
และ j จะถVกสรUางขxนและถVกลบทYงไปเมอออกจากเมธอดด)งแสดงในรVปท; 2.5
                  Y


โปรแกรมท( 2.6 ต)วอยางแสดงต)วแปรภายในและต)วแปรของอ9อบเจกต

     public class ScopeExample {
        private int i=1;

          public void method1() {
             int i=4, j=5;

              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();
          }
     }




44       พYนฐานโปรแกรมภาษาจาวา                                                        ผศ. ธนศา เครอไวศยวรรณ
รปท 2.5 การเก-บค%าของตวแปรในหน%วยความจา

      ภาษาจาวากZาหนดวLาตUองม;การกZาหนดคLาเรมตUนใหUก)บต)วแปรท;ประกาศไวU กLอนท;จะสามารถเร;ยกใชUงานไดU ใน
กรณ;ของต)วแปรของอ5อบเจกต#หรอต)วแปรของคลาส ภาษาจาวาจะกZาหนดคLาเรมตUนใหUโดยอ)ตโนม)ตด)งตารางท; 2.5 แตL
ในกรณ;ของต)วแปรภายใน จะตUองม;คZาส)งในการกZาหนดคLาเรมตUนเอง มฉะน)นจะเกดขUอผดพลาดในข)Yนตอนคอมไพล#
                                                                  Y
(Compile Error) ต)วอยLางเชLน คZาส)ง
                 public void demoMethod(){
                       int x = (int)(Math.random()*10);
                       int y,z;
                       if (x > 5) {
                           y = 6;
                       }
                       z = x+y;
                 }


        จะทZาใหUโปรแกรมไมLสามารถคอมไพล#ผLานไดU เนองจากคLา y ม;โอกาสท;จะไมLถVกกZาหนดคLาเรมตUนกLอนใชUงาน

2.5 ตวดDาเน,นการ
         นพจน#ในภาษาจาวาอาจจะประกอบดUวยขUอมVลคLาคงท; ต)วแปร หรอคLาคงท;ตLางๆ โดยจะม;ต)วดZาเนนการตLางๆ
ไวUเพอคZานวณหาผลล)พธ#ท;เปyนชนดขUอมVลตLางๆ ต)วดZาเนนการในภาษาจาวาแบLงออกเปyน 4 ประเภทคอ
         1. ต)วดZาเนนการทางคณตศาสตร# (Arithmetic Operator)
         2. ต)วดZาเนนการแบบส)มพ)นธ# (Relational Operator)
         3. ต)วดZาเนนการทางตรรกศาสตร# (Logical Operator)
         4. ต)วดZาเนนการแบบบต (Bitwise Operator)



ผศ. ธนศา เครอไวศยวรรณ                                                           พYนฐานโปรแกรมภาษาจาวา   45
ท)Yงน;Yต)วดZาเนนการทางคณตศาสตร#และต)วดZาเนนการแบบบต จะใหUผลล)พธ#เปyนขUอมVลชนดจZานวนเต5มหรอ
จZานวนทศนยม สLวนต)วดZาเนนการแบบส)มพ)นธ#และต)วดZาเนนการทางตรรกศาสตร#จะใหUผลล)พธ#เปyนขUอมVลชนดตรรกะ

2.5.1 ตวดDาเน,นการทางคณ,ตศาสตร.
      ต)วดZาเนนการทางคณตศาสตร#สZาหร)บภาษาจาวาจะประกอบไปดUวยเครองหมาย +,            -, *, /   และ   % ด)งแสดง
ในตารางท; 2.6
                              ตารางท 2.6 ต)วดZาเนนการทางคณตศาสตร#
                        เครองหมาย         ความหมาย         ตวอย0างน,พจน.
                            +                บวก               a+b

                            -                 ลบ               a-b

                            *                 คณ               a*b

                            /                หาร               a/b

                            %           เศษจากการหาร           a%b



       ต)วดZาเนนการ / จะใหUผลล)พธ#เปyนเลขจZานวนทศนยม ถUาต)วถVกดZาเนนการ (operand) ต)วใดต)วหนxงเปyนขUอมVล
ชนดจZานวนทศนยม สLวนกรณ;ท;ต)วกระทZาท)Yงสองต)วเปyนขUอมVลชนดจZานวนเต5ม ต)วดZาเนนการจะใหUผลล)พธ#เปyนคLา
จZานวนเต5ม กลLาวคอ 1/2.0 จะไดUผลล)พธ#เปyน 0.5 สLวน 1/2 จะไดUผลล)พธ#เปyน 0

       ต)วดZาเนนการ % ใชUก)บต)วถVกดZาเนนการท;เปyนต)วเลขจZานวนเต5ม โดยจะใหUผลล)พธ#เปyนต)วเลขจZานวนเต5มท;เปyน
เศษของการหาร อาทเชLน 7%3 จะไดUผลล)พธ#เปyน 1 ต)วดZาเนนการสLวนใหญLจะตUองม;ต)วถVกดZาเนนการสองต)ว ยกเวUนต)ว
ดZาเนนการ + และ - ท;อาจม;ต)วถVกดZาเนนการต)วเด;ยวไดUเชLน –3 หรอ +4.0 เปyนตUน

       ต)วอยLางตLอไปน;เY ปyนการกZาหนดคLา โดยม;ต)วดZาเนนการอยVในนพจน#คZาส)ง
                                                             L
                       int i = 34+2;
                       double d1 = 34.0–0.2;
                       long l = 300*30;
                       int j = 1/2;
                       double d2 = 1.0/2.0;
                       byte b1 = 20%3;




46   พYนฐานโปรแกรมภาษาจาวา                                                               ผศ. ธนศา เครอไวศยวรรณ
ตวดDาเน,นการแบบย0อ
        ภาษาจาวาไดUกZาหนดต)วดZาเนนการแบบยLอ (shortcut operator) เพอใชUแทนต)วดZาเนนการทางคณตศาสตร# ท;
ตUองการเปล;ยนแปลงคLาของต)วแปรทางดUานซUายของคZาส)งกZาหนดคLา อาทเชLน คZาส)ง x = x+1; ซxงเปyนคZาส)งท;ตUองการ
เพมคLาของ x ขxYนอ;ก 1 สามารถเข;ยนใหมLโดยใชUต)วดZาเนนการแบบยLอไดUด)งน;Y
                        x += 1;
        ขUอด;ของการเข;ยนคZาส)งโดยใชUต)วดZาเนนการแบบยLอคอจะชLวย ทZาใหUโปรแกรมทZางานไดUเร5วขxน ภาษาจาวาม;
                                                                                            Y
ต)วดZาเนนการแบบยLอ 5 ต)ว คอ +=, -=, *=, /= และ %= ด)งแสดงในตารางท; 2.7

                                      ตารางท 2.7 ต)วดZาเนนการแบบยLอ
                              เครองหมาย          ตวอย0าง          ความหมาย
                                  +=               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;



ตวดDาเน,นการเพ,มค0าและลดค0า
         ภาษาจาวาย)งม;ต)วดZาเนนการแบบยLออ;กสองต)วคอต)วดZาเนนการเพมคLา (increment operator) ท;ใชU
เครองหมาย ++ และต)วดZาเนนการลดคLา (decrement operator) ท;ใชUเครองหมาย -- ต)วดZาเนนการท)Yงสองต)วใชUในการ
เพมคLาท;ละ 1 หรอลดคLาท;ละ 1
         ต)วดZาเนนการท)YงสองสามารถใสLไวUขางหนUาหรอขUางหล)งต)วแปรก5ไดU ต)วอยLางเชLน
                                         U
                 x++ คอ x = x+1

                 ++x คอ x = x+1

                 x-- คอ x = x-1

                 --x คอ x = x-1


         ต)วดZาเนนการเพมคLาและต)วดZาเนนการลดคLาสามารถใชUก)บต)วแปร ท)Yงท;ม;ชนดขUอมVลเปyนต)วเลขจZานวนเต5มและ
ต)วเลขจZานวนทศนยม การวางเครองหมายไวUดานหนUาต)วแปรจะม;ผลใหUโปรแกรมทZาการเพมหรอลดคLากLอนแลUวจxงทZา
                                           U
คZาส)งของนพจน#นน สLวนการวางเครองหมายไวUดUานหล)งต)วแปร จะม;ผลใหUโปรแกรมทZาการเพมหรอลดคLา หล)งจากทZา
                  )Y
คZาส)งของนพจน#นน    )Y


ผศ. ธนศา เครอไวศยวรรณ                                                               พYนฐานโปรแกรมภาษาจาวา   47
โปรแกรมท; 2.7 แสดงต)วอยLางของการใชUต)วดZาเนนการเพมคLา โดยการเปร;ยบเท;ยบผลล)พธ#ท;ไดUจากการวาง
ตZาแหนLงของเครองหมาย ++ ไวUดUานหนUาและดUานหล)งต)วแปร ซxงผลล)พธ#ท;ไดUจะเปyนด)งแสดงในรVปท; 2.6

โปรแกรมท( 2.7 ต)วอยางการใชต)วด(าเนนการเพมคา
  public class IncrementDemo {
        public void showDemo() {
              int x;
              int y;
              x = 5;
              y = x++;
              System.out.println("x = "+x+"              y = "+y);
              y = ++x;
              System.out.println("x = "+x+"              y = "+y);
        }
  }

  ------------------------------------------------------
  public class Main {

          public static void main(String args[]) {
              IncrementDemo obj = new IncrementDemo();
              obj.showDemo();
          }
  }




                               รปท 2.6 ผลลพธทได*จากการรนโปรแกรมท 2.7

2.5.2 ตวดDาเน,นการแบบสมพนธ.
        ต)วดZาเนนการแบบส)มพ)นธ#ใชUในการเปร;ยบเท;ยบคLาของขUอมVลชนดใดๆ สองคLา โดยจะใหUผลล)พธ#ของการ
เปร;ยบเท;ยบเปyนขUอมVลคLาคงท;ชนดตรรกะ ภาษาจาวากZาหนดต)วดZาเนนการแบบส)มพ)นธ#ไวU 6 ต)ว คอ <, <=, >, >=,
== และ != ด)งแสดงในตารางท; 2.8




48    พYนฐานโปรแกรมภาษาจาวา                                                            ผศ. ธนศา เครอไวศยวรรณ
ตารางท 2.8 แสดงต)วดZาเนนการแบบส)มพ)นธ#
                        เครองหมาย        ความหมาย           ตวอย0าง      ผลลพธ.
                             <            นอยกว0า             3<4         true

                            <=       นอยกว0าหรอเท0ากบ        3<=4         true

                             >             มากกว0า            3>4        false

                            >=        มากกว0าหรอเท0ากบ       3>=4        false

                            ==             เท0ากบ            3==4        false

                            !=            ไม0เท0ากบ          3!=4         true




        ชนดขUอมVลท;จะนZามาเปร;ยบเท;ยบจะตUองเปyนชนดขUอมVลท;สอดคลUองก)นอาทเชLน การเปร;ยบเท;ยบต)วเลขก)บ
ต)วเลข ต)วอ)กขระก)บต)วอ)กขระ หรออ5อบเจกต#ก)บอ5อบเจกต# เปyนตUน ต)วอยLางเชLน
                         ‘x’ > ‘y’
                         342 <= 431.50
                         “Test” == “test”

         ต)วถVกดZาเนนการท;จะนZาเปร;ยบเท;ยบอาจเปyนต)วแปรหรอนพจน#ก5ไดU แตLจะตUองม;ชนดขUอมVลท;สอดคลUองก)นดUวย
ต)วอยLางเชLนถUานพจน#เปyน
                         x < 4.23
        ต)วแปร x จะตUองเปyนต)วแปรชนดต)วเลขทศนยมหรอจZานวนเต5ม

         โปรแกรมท; 2.8 แสดงต)วอยLางของการใชUต)วดZาเนนการแบบส)มพ)นธ#เพอเปร;ยบเท;ยบต)วแปร x และ y ท;ม;ชนด
ขUอมVลเปyน int และเก5บผลล)พธ#ลงในต)วแปร b1 ท;ม;ชนดขUอมVลเปyน boolean ซxงโปรแกรมน;YจะใหUผลล)พธ#ด)งแสดง
ในรVปท; 2.7




ผศ. ธนศา เครอไวศยวรรณ                                                             พYนฐานโปรแกรมภาษาจาวา   49
โปรแกรมท( 2.8 การใชต)วด(าเนนการแบบส)มพ)นธ

  public class BooleanDemo {
      public void showDemo() {
          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));
      }
  }

  ----------------------------------------------------------------
  public class Main {

          public static void main(String args[]) {
              BooleanDemo obj = new BooleanDemo();
              obj.showDemo();
          }
  }




                                 รปท 2.7 ผลลพธทได*จากการรนโปรแกรมท 2.8

2.5.3 ตวดDาเน,นการทางตรรกศาสตร.
        ต)วดZาเนนการทางตรรกศาสตร# จะใชUก)บต)วถVกดZาเนนการท;เ ปyนนพจน#ตรรกศาสตร# หรอชนดขUอมVล boolean
ต)วดZาเนนการประเภทน;จะใหUผลล)พธ#เปyนขUอมVลคLาคงท;ชนดตรรกะ โดยภาษาจาวากZาหนดต)วดZาเนนการทาง
                     Y
ตรรกศาสตร#ไวUหกต)วด)งแสดงในตารางท; 2.9

           ต)วดZาเนนการทJกต)วจะตUองม;ต)วถVกดZาเนนการสองต)ว ยกเวUนต)วดZาเนนการท;เปyนต)วดZาเนนการท;ใชUในการกล)บ
คLา ซxงตUองการต)วถVกดZาเนนการเพ;ยงหนxงต)วตารางท; 2.10 ถxง ตารางท; 2.13 แสดงผลล)พธ#ท;เปyนขUอมVลคLาคงท;ชนด
ตรรกะซxงไดUจากการดZาเนนการท;เปyนการกล)บคLา, AND, OR และ Exclusive-OR คLาทางตรรกะ
ต)วอยLางของนพจน#ทใชUต)วดZาเนนการทางตรรกศาสตร#ม;ด)งน;Y
                      ;


50    พYนฐานโปรแกรมภาษาจาวา                                                                 ผศ. ธนศา เครอไวศยวรรณ
(7>6) & (2<1)         จะไดUผลล)พธ#ม;คาเปyน
                                                      L       false
                 (7>6) | (2<1)         จะไดUผลล)พธ#ม;คาเปyน
                                                        L     true
                 !(7>6)                จะไดUผลล)พธ#ม;คาเปyน
                                                          L   false



                                 ตารางท 2.9 ต)วดZาเนนการทางตรรกศาสตร#
                              เครองหมาย                 ความหมาย
                                    !                 กลบค0าทางตรรกะ
                              && หรอ &               AND ค0าทางตรรกะ
                                || หรอ |             OR ค0าทางตรรกะ
                                    ^           Exclusive-OR ค0าทางตรรกะ


                               ตารางท 2.10 ผลล)พธ#ของการกล)บคLาทางตรรกะ
                                            op                 !op
                                           true               false
                                          false                true


                              ตารางท 2.11 ผลล)พธ#ของการ AND คLาทางตรรกะ
                                 op1              op2                op1 & op2
                               true                true                 true
                               true               false                false
                              false                true                false
                              false               false                false



                              ตารางท 2.12 ผลล)พธ#ของการ OR คLาทางตรรกะ
                                 op1              op2                 op1 | op2
                               true                true                 true
                               true               false                 true
                              false                true                 true
                              false               false                false



                          ตารางท 2.13 ผลล)พธ#ของการ Exclusive-OR คLาทางตรรกะ
                                 op1              op2                op1 ^ op2
                               true                true                false
                               true               false                 true
                              false                true                 true
                              false               false                false




ผศ. ธนศา เครอไวศยวรรณ                                                             พYนฐานโปรแกรมภาษาจาวา   51
ต)วดZาเนนการท;ม;เครองหมาย && และ || เร;ยกวLา ต)วดZาเนนการทางตรรกศาสตร#แบบ short circuit โดยท;
&& เปyนการ AND คLาทางตรรกะ ซxงจะแตกตLางจาก & ตรงท; && จะหยJดการเปร;ยบเท;ยบถUานพจน#ต)วแรกเปyนเท5จ
เชLนเด;ยวก)บ || ท;เปyนการ OR คLาทางตรรกะ ซxงจะแตกตLางจาก | ตรงท; || จะหยJดการเปร;ยบเท;ยบถUานพจน#ตวแรกเปyน
                                                                                                    )
จรง ต)วอยLางเชLน
                    int x = 10;
                    if ( (x > 0) || (x++ < -5) ) {
                          System.out.println(x);
                    }

       ผลล)พธ#ของ x จะม;คLาเปyน 10 เนองจาก || จะไมLเร;ยกคZาส)งในนพจน#ท;สอง

       แตLคZาส)ง
                    int x = 10;
                    if ( (x > 0) | (x++ < -5) ) {
                          System.out.println(x);
                    }

       ผลล)พธ#ของ x จะม;คาเปyน
                         L       11


2.5.4 ตวดDาเน,นการแบบบ,ต
         ต)วดZาเนนการแบบบตเปyนต)วดZาเนนการท;ใชUก)บขUอมVลชนดต)วเลขจZานวนเต5ม เพอจ)ดการก)บขUอมVลเชงบตหรอ
เพอเลอนบต โดยม;เครองหมายตLางๆ ด)งแสดงในตารางท; 2.14 และตารางท; 2.15

                              ตารางท 2.14 ต)วดZาเนนการเพอจ)ดการก)บขUอมVลเชงบต
                                เครองหมาย                ความหมาย
                                      ~                   Complement
                                      &                     AND
                                      |                      OR
                                      ^                     XOR

                                     ตารางท 2.15 ต)วดZาเนนการเพอเลอนบต
                                 เครองหมาย                ความหมาย
                                       >>              signed right shift
                                      >>>             unsigned right shift
                                       <<                  left shift



       เครองหมาย ~, &, | และ ^ ใชUในการจ)ดการขUอมVลเชงบต เชLน 4 ^ 3 คอ 0100 ท;ทZาการ XOR ก)บ 0011 จะม;


52   พYนฐานโปรแกรมภาษาจาวา                                                                ผศ. ธนศา เครอไวศยวรรณ
คLาเปyน 0111 สLวนเครองหมาย >>, >>> และ << เปyนต)วดZาเนนการเพอเลอนบต โดยจะใชUก)บชนดขUอมVลจZานวนเต5ม
ท;เปyน int หรอ long โดยต)วถVกดZาเนนการท;เปyนจZานวนบตท;จะเลอนไปจะเปyนเศษของการหารดUวย 32 และ 64
สZาหร)บชนดขUอมVล int และ long ตามลZาด)บ ด)งน)นคZาส)ง
                                              Y
                        int x = 8;
                        System.out.println(x >> 32);

        หมายถxงการเลอนบตของต)วแปร      x   ไป   0   บต ไมLใชL 32 บต

         เครองหมาย >> เปyนการเลอนบตโดยพจารณาจากเครองหมาย ซxงถUาบตทางซUายเปyนคLา 1 ก5จะใสLคา 1 แทน
                                                                                               L
แตLถUาเปyนคLา 0 ก5จะใสLคLา 0 แทน สLวนเครองหมาย >>> และ << จะเปyนการเลอนบตโดยไมLพจารณาเครองหมาย
กลLาวคอจะใสLคา 0 เสมอ การเลอนบตไปทางขวา (>>) คอการหารของจZานวนเต5มดUวยคLา 2 ยกกZาล)งจZานวนบตท;จะ
                L
เลอน สLวนการเลอนบตไปทางซUาย (<<) จะเปyนการคVณเลขจZานวนเต5มดUวยคLา 2 ยกกZาล)งจZานวนบตท;จะเลอน ต)วอยLาง
เชLน
                          128 >> 1 คอ 128/21 = 64
                          -128 >> 4 คอ -128/24 = -8
                          128 << 2 คอ 128 * 22 = 512


2.5.5 ลDาดบความสDาคญของตวดDาเน,นการ
      กรณ;ท;นพจน#ใดๆ ม;ต)วดZาเนนการมากกวLาหนxงต)ว ภาษาจาวาจะจ)ดลZาด)บความสZาค)ญของต)วดZาเนนการเพอ
คZานวณหาผลล)พธ#ตามลZาด)บความสZาค)ญของต)วดZาเนนการ โดยม;ลZาด)บความสZาค)ญด)งแสดงในตารางท; 2.16

                                  ตารางท 2.16 ลZาด)บความสZาค)ญของต)วดZาเนนการ
                        ล()ด+บท./                   เร.ยงจ)ก                 ต+วด()เน9นก)ร
                           1                  ขว)ไปซ>)ย (R to L)       ++, --, +, -, ~, ! (data type)
                           2                  ซ>)ยไปขว) (L to R)                    *, /, %
                           3                  ซ>)ยไปขว) (L to R)                      +, -
                           4                  ซ>)ยไปขว) (L to R)                <<, >>, >>>
                           5                  ซ>)ยไปขว) (L to R)        <, >, <=, >=, instanceof
                           6                  ซ>)ยไปขว) (L to R)                    ==, !=
                           7                  ซ>)ยไปขว) (L to R)                       &
                           8                  ซ>)ยไปขว) (L to R)                       ^



ผศ. ธนศา เครอไวศยวรรณ                                                                   พYนฐานโปรแกรมภาษาจาวา   53
9              ซ>)ยไปขว) (L to R)                   |
                              10             ซ>)ยไปขว) (L to R)                 &&
                              11             ซ>)ยไปขว) (L to R)                  ||
                              12             ขว)ไปซ>)ย (R to L)                   ?:
                                                                     =, +=, -=, *=, /=, %=, <<=,
                              13             ขว)ไปซ>)ย (R to L)
                                                                      >>=, >>>=, &=, ^=, |=

       ต)วอยLางเชLน คZาส)ง
                x = 2+3*4-(7+2);
       จะคZานวณหาผลล)พธ#ตามลZาด)บด)งน;Y
       1. คZานวณหาผลล)พธ#คา 7+2 ทZาใหUไดU
                          L
                x = 2+3*4-9
       2. คZานวณหาผลล)พธ#คา 3*4 ทZาใหUไดU
                          L
               x = 2+12-9
       3. คZานวณหาผลล)พธ#คา 2+12 ทZาใหUไดU
                            L
               x = 14-9
       4. คZานวณหาผลล)พธ#คา 14-5 ทZาใหUไดU
                              L
               x=5


2.6 การแปลงชน,ดขอมล

      นพจน#ทางคณตศาสตร#ในภาษาจาวาอาจม;ต)วถVกดZาเนนการทางคณตศาสตร# ท;ม;ชนดขUอมVลเปyนประเภทตLางๆ
ภาษาจาวาไดUกZาหนดใหUผลล)พธ#ของนพจน#เปyนด)งน;Y
      • ในกรณ;ท;ต)วถVกดZาเนนการท)Yงสองต)วม;ชนดขUอมVลเปyน double เหมอนก)น จะทZาใหUไดUผลล)พธ#ท;ม;ชนด
         ขUอมVลเปyน double
      • ในกรณ;ท;ต)วถVกดZาเนนการท)Yงสองต)วม;ชนดขUอมVลเปyน float เหมอนก)น จะทZาใหUไดUผลล)พธ#ท;ม;ชนดขUอมVล
         เปyน float
      • ในกรณ;ท;ต)วถVกดZาเนนการท)Yงสองม;ชนดขUอมVลท;ตLางก)น ภาษาจาวาจะม;หล)กการแปลงชนดขUอมVล (type
         conversion) ด)งน;Y
         o ถUาต)วถVกดZาเนนการต)วหนxงม;ชนดขUอมVลเปyน double ต)วถVกดZาเนนการอ;กต)วหนxงจะถVกแปลงใหUม;ชนด
                                    
              ขUอมVลเปyน double โดยอ)ตโนม)ต
         o ถUาต)วถVกดZาเนนการท)YงสองไมLไดUม;ชนดขUอมVลเปyน double แตLม;ต)วถVกดZาเนนการต)วหนxงท;ม;ชนดขUอมVล



54   พYนฐานโปรแกรมภาษาจาวา                                                                 ผศ. ธนศา เครอไวศยวรรณ
เปyน float ต)วถVกดZาเนนการอ;กต)วหนxงจะถVกแปลงใหUม;ชนดขUอมVลเปyน float โดยอ)ตโนม)ต
            o   ถUาต)วถVกดZาเนนการท)YงสองไมLไดUม;ชนดขUอมVลเปyน double หรอ float แตLม;ต)วถVกดZาเนนการต)วหนxง
                ท;ม;ชนดขUอมVลเปyน long ต)วถVกดZาเนนการอ;กต)วหนxงจะถVกแปลงใหUม;ชนดขUอมVลเปyน long โดย
                อ)ตโนม)ต
            o   กรณ;อนๆ ต)วถVกดZาเนนการท)YงสองจะแปลงใหUมชนดขUอมVลเปyน int
                                                              ;

               จากหล)กการขUางตUนจะเห5นไดUวาผลล)พธ#ท;ไดUจากการคZานวณนพจน#คณตศาสตร# จะม;ชนดขUอมVลเปyน
                                                L
        int เปyนอยLางนUอย ด)งน)นคZาส)งตLอไปน;Y
                               Y
                         byte b1, b2, b3;
                         b1 = 2;
                         b2 = 4;
                         b3 = b1+b2;    // illegal

               จxงเปyนคZาส)งท;ไมLถVกตUอง เนองจาก b1+b2 จะใหUคLาผลล)พธ#ท;ม;ชนดขUอมVลเปyน int ซxงไมLสามารถ
        กZาหนดคLาใหUก)บต)วแปรท;ม;ชนดขUอมVลเปyน byte ไดU

2.6.1 การแปลงขอมลในคDาสงกDาหนดค0า
       ภาษาจาวากZาหนดใหUคZาส)งกZาหนดคLาจะตUองม;ชนดขUอมVลของต)วแปรทางดUานซUายและชนดขUอมVลของนพจน#ทาง
ดUานขวาสอดคลUองก)น อาทเชLน
                 int i = 4;
                 double x = 3.0;

        ในกรณ;ท;ต)วแปรและนพจน#ม;ชนดขUอมVลท;แตกตLางก)น คอมไพเลอร#ของภาษาจาวาจะทZาการแปลงชนดขUอมVล
ท)YงสองชนดใหUสอดคลUองก)น โดยการแปลงชนดขUอมVลม;สองรVปแบบคอ
        1. การแปลงขUอมVลท;กวUางขxYน (widening conversion) คอการแปลงจากชนดขUอมVลท;ม;ขนาดเล5กกวLาไปเปyน
           ชนดขUอมVลท;ม;ขนาดใหญLกวLา
        2. การแปลงขUอมVลท;แคบลง (narrowing conversion) คอการแปลงจากชนดขUอมVลท;ม;ขนาดใหญLกวLาไปเปyน
           ชนดขUอมVลท;ม;ขนาดเล5กลง ซxงอาจม;ผลใหUเส;ยความละเอ;ยดของขUอมVลบางสLวนไป

       ภาษาจาวากZาหนดขนาดของชนดขUอมVลตLางๆ ท;สามารถแปลงขUอมVลใหUกวUางขxYนไดU ด)งแสดงในรVปท; 2.8 ซxงม;
หล)กการด)งน;Y
       • ชนดขUอมVลต)วเลขจZานวนเต5มสามารถแปลงใหUเปyนชนดขUอมVลต)วเลขทศนยมไดU
       • ชนดขUอมVล float สามารถแปลงใหUเปyนชนดขUอมVล double ไดU
       • ชนดขUอมVลต)วเลขจZานวนเต5มม;ขนาดเร;ยงก)นจากนUอยไปมากด)งน;Y



ผศ. ธนศา เครอไวศยวรรณ                                                                 พYนฐานโปรแกรมภาษาจาวา     55
byte → short → int → long

       •   ชนดขUอมVล char สามารถแปลงใหUเปyนชนดขUอมVล int ไดU
       •   ชนดขUอมVล boolean จะไมLม;ความส)มพ)นธ#ก)บชนดขUอมVลแบบพYนฐานอนๆ



                                      รปท 2.8 การแปลงชนดข*อมล

       ในคZาส)งกZาหนดคLา ถUาผลล)พธ#ของนพจน#เปyนชนดขUอมVลท;ม;ขนาดเล5กกวLาชนดขUอมVลของต)วแปร ภาษาจาวาจะ
ทZาการแปลงขUอมVลใหUเปyนชนดขUอมVลของต)วแปรด)งกลLาวโดยอ)ตโนม)ตอาทเชLน คZาส)ง
               int i = 4;
               long l = i;

       นพจน# i จะถVกปร)บชนดขUอมVลจาก int ใหUเปyน long โดยอ)ตโนม)ต

       หรอคZาส)ง
               double        x = 3;

       นพจน#ท;ม;คาเปyน 3 จะถVกปร)บชนดขUอมVลจาก int ใหUเปyน double โดยอ)ตโนม)ต
                  L

        ในกรณ;ทคZาส)งกZาหนดคLาม;ชนดขUอมVลของต)วแปรท;ม;ขนาดเล5กกวLา ชนดขUอมVลของนพจน# ภาษาจาวาจะไมL
               ;
สามารถแปลงชนดขUอมVลของนพจน#ใหUเปyนขนาดท;เล5กลงเทLาก)บชนดขUอมVลของต)วแปรโดยอ)ตโนม)ต แตLคอมไพเลอร#
จะแจUงขUอผดพลาดในข)นตอนการคอมไพล# (compile error) ต)วอยLางเชLน คZาส)ง
                      Y
               int amount = 123L;

       หรอ
               float f = 4.0;

       จะไมLสามารถคอมไพล#ผานไดU เนองจากชนดขUอมVลของนพจน#ม;ขนาดใหญLกวLาชนดขUอมVลของต)วแปร
                          L

โปรแกรมท; 2.9 แสดงต)วอยLางของขUอผดพลาดในการแปลงชนดขUอมVล ซxงจะทZาใหUโปรแกรมน;YไมLสามารถคอมไพล#
ผLานไดU




56   พYนฐานโปรแกรมภาษาจาวา                                                           ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท( 2.9 โปรแกรมท%ม%ขอผดพลาดในการแปลงชนดขอม1ล
   public class PromotionDemo {
         public void showDemo() {
               int i;
               long l;
               float fl = 4.2f;
               i = 4;
               l = i;
               fl = i;
               double x = fl;
               fl = 4.2;                             //illegal
         }
   }




2.6.2 Typecasting
       ภาษาจาวาจะสามารถทZาการแปลงชนดขUอมVล ใหUเปyนชนดขUอมVลท;ม;ขนาดเล5กลงไดU โดยใชUวธ;การท;เร;ยกวLา
typecasting ซxงม;รVปแบบด)งน;Y

                                        (targetType) expression


        โดยท;
        • targetType         คอชนดขUอมVลท;ตUองการ

     การใชU typecasting จะชLวยทZาใหUโปรแกรมท;มคZาส)งซxงจZาเปyนตUองแปลงชนดขUอมVลใหUม;ขนาดเล5กลงสามารถ
                                                ;
คอมไพล#ผานไดU แตLจะทZาใหUขUอมVลบางสLวนสVญหายไปในบางกรณ;
        L
     ต)วอยLางเชLน คZาส)ง
                 int amount = (int)3.0;

        จะทZาการแปลงนพจน# 3.0 ท;ม;ชนดขUอมVลเปyน double ใหUเปyน 3 ท;ม;ชนดขUอมVลเปyน int

        หรอต)วอยLางคZาส)ง
                 int x;
                 double y = 1.25;
                 x = (int)y;

        จะทZาการแปลงนพจน# y ท;ม;คา 1.25 ใหUมชนดขUอมVลเปyน int ท;ม;คา 1 แตLจะทZาใหUตวเลขท;เปyนสLวนทศนยม
                                  L          ;                       L               )
หายไป




ผศ. ธนศา เครอไวศยวรรณ                                                            พYนฐานโปรแกรมภาษาจาวา   57
โปรแกรมท;2.10 แสดงต)วอยLางการใชU typecasting ในการแปลงชนดขUอมVล โดยนพจน# b1+b2 จะใหUผลล)พธ#
ท;ม;ชนดขUอมVลเปyน int จxงตUองแปลงชนดขUอมVลใหUเปyน byte เพอท;จะสามารถกZาหนดคLาใหUก)บต)วแปร b3 ซxงม;ชนด
ขUอมVลเปyน byte ไดU เชLนเด;ยวก)นก)บคLา 3.2 ซxงม;ชนดขUอมVลเปyน double จะถVกแปลงชนดขUอมVลใหUเปyน float

โปรแกรมท( 2.10 การใช typecasting ในการแปลงชนดขอม1ล
     public class TypecastingDemo {
           public void showDemo() {
                 byte b1 = 4;
                 byte b2 = 3;
                 byte b3;
                 b3 = (byte) (b1 + b2);
                 float f1;
                 f1 = (float) 3.2;
           }
     }

     ----------------------------------------------------------------
     public class Main {

              public static void main(String args[]) {
                  TypecastingDemo obj = new TypecastingDemo();
                  obj.showDemo();
              }
     }




2.7 ชน,ดขอมลแบบอางอ,ง

         ต)วแปรหรอคLาคงท;ท;ประกาศเปyนชนดขUอมVลอนๆ ซxงไมLใชLชนดขUอมVลแบบพYนฐาน จะเปyนชนดขUอมVลแบบ
อUางองซxงก5คออ5อบเจกต#ในภาษาจาวา โดยแบLงออกเปyนสองแบบคอ
         1. ชนดขUอมVลท;เปyนคลาส
         2. ชนดขUอมVลท;เปyนอะเรย#
         ต)วอยLางของชนดขUอมVลท;เปyนคลาสคอ ชนดขUอมVล String โดย String ไมLใชLชนดขUอมVลแบบพYนฐาน แตL
เปyนคลาสท;นยามไวUใน Java API อาทเชLน คZาส)ง
                           String id;

        เปyนคZาส)งประกาศต)วแปร id ใหUเปyนอ5อบเจกต#ของคลาส String สZาหร)บต)วอยLางของชนดขUอมVลท;เปyน
อะเรย#จะถVกกลLาวถxงในบทท; 8


58       พYนฐานโปรแกรมภาษาจาวา                                                        ผศ. ธนศา เครอไวศยวรรณ
ชนดขUอมVลแบบอUางองจะม;วธ;การเก5บขUอมVลในหนLวยความจZาท;แตกตLางจาก การเก5บขUอมVลของชนดขUอมVลแบบ
พYนฐาน ท)Yงน;ขUอมVลท;เก5บในหนLวยความจZาของชนดขUอมVลแบบอUางองจะเปyนตZาแหนLงอUางองท;เก5บขUอมVลในหนLวยความ
             Y
จZา แตLในกรณ;ของชนดขUอมVลแบบพYนฐาน ขUอมVลท;เก5บในหนLวยความจZาจะเปyนคLาของขUอมVลจรงๆ อาทเชLน คZาส)ง
                 int x = 7;
                 String s = new String(“Thana”);

          เปyนการประกาศต)วแปรท;ม;ชนดขUอมVลแบบพYนฐาน int ท;ชอ x และใหUเก5บคLาเปyน 7 และเปyนการประกาศ
ต)วแปรชนดขUอมVลแบบอUางอง (ซxงก5คออ5อบเจกต#) s ของคลาส String และใหUเก5บคLาเปyนขUอความวLา Thana ซxง
ต)วแปรท)Yงสองต)วอาจจะม;การเก5บขUอมVลในหนLวยความจZาด)งแสดงในรVปท; 2.9 ซxงคLาท;เก5บในต)วแปร x จะเปyนคLาขUอมVล
ท;เปyนคLา 7 สLวนคLาของต)วแปร s จะเปyนตZาแหนLงอUางองในหนLวยความจZาท;ใชUเก5บขUอความวLา Thana




                              รปท 2.9 ตวอย%างของการเก-บข*อมลในหน%วยความจา

         การประกาศต)วแปร (หรออ5อบเจกต#) ของชนดขUอมVลแบบอUางองจะเปyนเพ;ยงการประกาศชอต)วแปร (หรอ
อ5อบเจกต#) แตLจะไมLม;การจองเนYอท;ในหนLวยความจZาเพอเก5บขUอมVล ในกรณ;ท;ต)วแปรด)งกลLาวเปyนคJณล)กษณะของ
อ5อบเจกต# หรอคJณล)กษณะของคลาส ภาษาจาวาจะกZาหนดตZาแหนLงอUางองเรมตUนใหUม;คาเปyน null โดยอ)ตโนม)ต ซxง
                                                                                 L
เนYอท;ในหนLวยความจZาเพอเก5บขUอมVลตLางๆ ของต)วแปรชนดขUอมVลแบบอUางองจะถVกสรUางขxYน เมอม;การเร;ยกใชUคZาส)ง
new อาทเชLน คZาส)ง
                        Date d;

        เปyนคZาส)งในการประกาศต)วแปร (หรออ5อบเจกต#) d ใหUเปyนคลาสชนด Date ท;กZาหนดไวUใน Java API และ
จะไดUคLาในหนLวยความจZาด)งแสดงในรVปท; 2.10 (ก)
        และคZาส)ง
                        d = new Date(16, 8, 2002);

      จะเปyนคZาส)งในการจองเนYอท;ในหนLวยความจZาเพอเก5บคJณล)กษณะของอ5อบเจกต#ท;ชอ d ท;ม;อยVL 3 ต)ว คอ day,
month และ year ซxงม;ชนดขUอมVลเปyน int ด)งแสดงในรVปท; 2.10 (ข)




ผศ. ธนศา เครอไวศยวรรณ                                                              พYนฐานโปรแกรมภาษาจาวา   59
(ก)




                                                     (ข)
                                 รปท 2.10 ตวอย%างของการเก-บข*อมลในหน%วยความจา

2.7.1 คลาส String
       • String เปyนคลาสท;กZาหนดไวUใน Java API ต)วแปรท;ม;ชนดขUอมVลเปyน String        ก5คออ5อบเจกต#ชนดหนxง
                                                                                                          
           ซxง String ม;ขUอแตกตLางจากอ5อบเจกต#ท)วๆ ไปด)งน;Y
       •   String เปyนอ5อบเจกต#ท;ม;คาคงท;ขUอมVลซxงก5คอขUอความใดๆ ท;อยVLภายในเครองหมาย double quote
                                     L
           (“ ”) ต)วอยLางเชLน
                                  “This is a java course”

       • String เปyนอ5อบเจกต#ท;สามารถถVกสรUางขxนและกZาหนดคLาไดUโดยไมLจZาเปyนตUองใชUคZาส)ง new ต)วอยLางเชLน
                                                Y
           เราสามารถใชUคZาส)ง
                                  String s = “Thana”;

           โดยไมLจZาเปyนท;จะตUองใชUคZาส)ง
                          
                                  String s = new String(“Thana”);

       •   ในกรณ;ท;ไมLใชUคZาส)ง new ภาษาจาวาจะกZาหนดตZาแหนLงอUางองในหนLวยความจZาของขUอความท;ระบJใน
           เครอง (“ ”) โดยพจารณาจาก String Pool วLาม;ขอความเดมอยVLหรอไมL หากม;ก5จะใชUตZาแหนLงอUางองท;ซYZา
                                                           U
           ก)น แตLถาย)งไมLม;ก5จะสรUางขUอความขxYนมาใหมLและกZาหนดตZาแหนLงอUางองของขUอความน)น สLวนกรณ;ท;ใชUคZา
                   U                                                                     Y
           ส)ง new ภาษาจาวาจะสรUางขUอความใหมLและจองเนYอท;ในหนLวยความจZาเสมอ โปรแกรมท; 2.11 แสดง


60   พYนฐานโปรแกรมภาษาจาวา                                                               ผศ. ธนศา เครอไวศยวรรณ
ต)วอยLางการสรUางและกZาหนดคLาอ5อบเจกต#ชนด String ท)Yงในกรณ;ท;ใชUและไมLใชUคZาส)ง new อ5อบเจกต#
            s1 และ s2 จะม;ขUอมVลในหนLวยความจZาเปyนตZาแหนLงอUางองท;เด;ยวก)น สLวน s3 จะม;ขUอมVลในหนLวยความ
            จZาเปyนตZาแหนLงอUางองท;ตLางก)นเนองจากม;การสรUางขUอความขxนมาใหมLด)งแสดงในรVปท; 2.11
                                                                      Y

โปรแกรมท( 2.11 ต)วอยางการประกาศและสรางอ9อบเจกตชนด String
  public class StringDemo {
        public void showDemo() {
              String s1 = "Thana";
              String s2 = "Thana";
              String s3 = new String("Thana");
        }
  }

  -------------------------------------------------------------
  public class Main {

           public static void main(String args[]) {
               StringDemo obj = new StringDemo();
               obj.showDemo();
           }
  }




                          รปท 2.11 ตวอย%างการเก-บข*อมลชนด String ในหน%วยความจา

        • String เปyนอ5อบเจกต#ท;เปล;ยนคLาไมLไดU (Immutable Object) การกZาหนดคLาใหUก)บอ5อบเจกต#ชนด
            String ใหมL เปyนการเปล;ยนตZาแหนLงอUางองในหนLวยความจZาของอ5อบเจกต#ด)งกลLาว แตLจะไมLไดUม;การ
            เปล;ยนคLาภายในตZาแหนLงอUางองเดม ต)วอยLางเชLน คZาส)ง
                         String s1;
                         s1 = “Thanachart”;
                         s1 = “Somchai”;

            จะม;ผลทZาใหUตZาแหนLงอUางองในหนLวยความจZาของอ5อบเจกต# s1 เปล;ยนไป ด)งแสดงในรVปท; 2.12 ซxงเปyน


ผศ. ธนศา เครอไวศยวรรณ                                                              พYนฐานโปรแกรมภาษาจาวา   61
ต)วอยLางของการเปล;ยนตZาแหนLงอUางองในการเก5บขUอมVลชนด String ในหนLวยความจZา




                             รปท 2.12 ตวอย%างการเปลยนตาแหน%งอ*างองในการเก-บข*อมล

       • String    เปyนอ5อบเจกต#ท;ม;ต)วดZาเนนการท;ใชUในการเชอมขUอความสองขUอความเขUาดUวยก)น โดยใชU
          เครองหมาย + อาทเชLน
                       String s1 = “Hello”+“ World”;

          ต)วดZาเนนการในการเชอมขUอความสามารถใชUเชอมขUอมVลชนด String ก)บต)วถVกดZาเนนการท;เปyนชนดขUอ
          มVลอนๆ ท;ไมLใชLชนด String ไดU ซxงภาษาจาวาจะแปลงชนดขUอมVลด)งกลLาวใหUเปyนชนด String โดย
          อ)ตโนม)ตอาทเชLน คZาส)ง
                       String s1 = “This”;
                       String s2 = s1+ “ is a test ”;
                       String s3 = s1+4;

          จะทZาใหUไดUขUอความของต)วแปร s2 เปyน “This is a test” และ s3 เปyน “This4”
          ต)วดZาเนนการเพอเชอมขUอความจะม;ต)วดZาเนนการแบบยLอท;ใชUเครองหมาย += เพอเชอมขUอความ แลUว
          กZาหนดคLาในอ5อบเจกต#ของคลาส String โดยใชUชอเดมอาทเชLน คZาส)ง
                       String s1 = “This”;
                       s1 += “ is a test”;

          เปyนคZาส)งเชอมขUอความของอ5อบเจกต# s1 เดมก)บขUอความท;วา “ is a test” แลUวเก5บลงในอ5อบเจกต# s1 เชLน
                                                                  L
          เดม โดยทZาใหU s1 ม;ขUอความเปyน “This is a test”

2.7.2 คลาส    Math
       Java API      ไดUกZาหนดใหUม;คลาส Math ท;อยVLในแพคเก5จ java.lang ซxงจะม;เมธอดตLางๆ ในการจ)ดการก)บ
ฟwงก#ช)นหรอคZาส)งทางคณตศาสตร#ตLางๆ คลาส Math เปyนคลาสแบบ final และเมธอดทJกเมธอด จะเปyนเมธอดของ
คลาส (ม;ค;ยเ# วร#ด static อยVL ซxงจะกลLาวถxงในบทท; 6) การเร;ยกใชUเมธอดเหลLาน;YทZาไดUโดยไมLจZาเปyนตUองสรUาง
อ5อบเจกต# แตLสามารถเร;ยกผLานชอคลาสไดUโดยตรงอาทเชLน Math.exp(4.0); เปyนการคZานวณหาคLา exponential


62   พYนฐานโปรแกรมภาษาจาวา                                                                ผศ. ธนศา เครอไวศยวรรณ
ของ 4.0
          คลาส Math ไดUประกาศคLาคงท;สองต)วด)งน;Y
              -    final static double E = 2.7182818284590452354;
              -    final static double PI = 3.14158265358979323846;

          ซxงการเร;ยกใชU   Math.E   จะม;คLาเปyน 2.718281828… และ Math.PI จะม;คLาเปyน   3.141582653…


          เมธอดอนๆ ในคลาส      Math ท;สZาค)ญม;ด)งน;Y
              -    static     int abs(int x);
              -    static     long abs(long x);
              -    static     float abs(float x);
              -    static     double abs(double x);
              -    static     double acos(double x);
              -    static     double asin(double x);
              -    static     double atan(double x);
              -    static     double atan2(double x, double y);
              -    static     double ceil(double x);
              -    static     double cos(double x);
              -    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);




ผศ. ธนศา เครอไวศยวรรณ                                                            พYนฐานโปรแกรมภาษาจาวา   63
2.8 คDาสงอ,นพ%ตและเอาต.พต
                        %

         โปรแกรมคอมพวเตอร#โดยท)วไป จะตUองม;การอLานขUอมVลเขUาเพอใชUในการประมวลผล และจะม;การนZาผลล)พธ#
ท;ไดUจากการประมวลผลออกมาแสดง ขบวนการในการอLานขUอมVลเขUาและแสดงผลล)พธ#เร;ยกวLา อนพJต/เอาต#พJต
(Input/Output) ภาษาจาวาม;วธ;การหลายวธ;การในการจ)ดการก)บอนพJต /เอาต#พJต และม;คลาสหลายคลาสท;เก;ยวขUองก)บ
ขบวนการอนพJต/เอาต#พJต แตLวธ;การงLายๆ วธ;การหนxงคอการใชUอนพJตมาตรฐาน (Standard Input) และการใชU
เอาต#พJตมาตรฐาน (standard output) ภาษาจาวาม;อ5อบเจกต#ท;เปyนอนพJต/เอาต#พJตมาตรฐานสามอ5อบเจกต#คอ
System.in, System.out และ System.err
         • อ5อบเจกต# System.in เปyนอ5อบเจกต#ท;ม;เมธอดสZาหร)บการอLานขUอมVลทางอJปกรณ#อนพJตมาตรฐาน ซxงโดย
            ท)วไปก5คอค;ย#บอร#ด
               
         • อ5อบเจกต# System.out เปyนอ5อบเจกต#ท;ม;เมธอดสZาหร)บการแสดงขUอมVลออกทางอJปกรณ#เอาต#พJต
            มาตรฐานซxงโดยท)วไปคอจอภาพ
                             
         • อ5อบเจกต# System.err เปyนอ5อบเจกต#ท;ม;เมธอดสZาหร)บการแสดงขUอผดพลาด (Error) ออกทางอJปกรณ#
            ท;ใชUในการแสดงขUอผดพลาด ซxงโดยท)วไปจะกZาหนดเปyนจอภาพ

2.8.1 System.out.println()
       อ5อบเจกต# System.out หมายถxงอ5อบเจกต#ท;ชอ out ซxงเปyนคJณล)กษณะของคลาส System อ5อบเจกต#ท;
ชอ out เปyนอ5อบเจกต#ของคลาส PrintStream ท;ม;เมธอดท;เก;ยวขUองก)บการแสดงผลอยVLหลายเมธอด แตLเมธอดท;
นยมใชUทวไปคอ
        )
                       print(String s)
       และ             println(String s)

       ซxงเมธอดท)YงสองใชUในการแสดงผลขUอมVลท;ม; argument เปyนชนดขUอมVล String

     เมธอด println() จะม;ผลใหUโปรแกรมขxนบรรท)ดใหมLหล)งจากพมพ#ขUอมVลท;ตUองการแสดง เมธอด
                                          Y
print() และ println() สามารถร)บ argument ท;เปyนชนดขUอมVลอน ซxงโปรแกรมจะแปลงเปyนชนดขUอมVล
String ใหUโดยอ)ตโนม)ตต)วอยLางเชLน คZาส)ง
                       int x = 3;
                       System.out.println(x);


        เปyนชJดคZาส)งในการพมพ#คาของต)วแปร x ท;ม;ชนดขUอมVลเปyน int ออกทางจอภาพ โดยโปรแกรมจะแปลงชนด
                                L
ขUอมVล int ใหUเปyน String แลUวจxงพมพ#ขUอความออกมา โปรแกรมท; 2.12 แสดงต)วอยLางของการใชUคZาส)ง


64   พYนฐานโปรแกรมภาษาจาวา                                                           ผศ. ธนศา เครอไวศยวรรณ
System.out.print() และ System.out.println() เพอแสดงขUอมVลชนดตLางๆ             ออกทางจอภาพด)งแสดง
ในรVปท; 2.13


โปรแกรมท( 2.12 การใชค(าส)งเพอพมพขอความตางๆ ออกทางจอภาพ
   public class PrintDemo {
         public void showDemo() {
               int x = 3, y = 4, z = 5;
               System.out.print("x = "+x);
               System.out.println(" y = "+y);
               System.out.println("z = "+z);
         }
   }

   ---------------------------------------------------------------
   public class Main {

           public static void main(String args[]) {
               PrintDemo obj = new PrintDemo();
               obj.showDemo();
           }
   }




                            รปท 2.13 ผลลพธทได*จากการรนโปรแกรมท 2.12


2.8.2 การรบขอมลเขามาทาง Command Line
      เมธอด main() ท;เปyนตZาแหนLงเรมตUนการทZางานของโปรแกรมจาวาประยJกต# จะม; argument เปyน String
args[] ซxงหมายถxงต)วแปรอะเรย# (จะกลLาวถxงในบทท; 8) args ท;ม;ชนดขUอมVลเปyน String ซxงสามารถร)บ
argument ท;สLงผLานมาจาก command line ไดUโดยม;ตวอยLางของการทZางานด)งรVปท; 2.14 ซxงเปyนการกZาหนดใหU
                                               )
args[0]ม;คLาเปyน Tommy และต)วแปร args[1] ม;คาเปyน boy โปรแกรมท; 2.13 เปyนต)วอยLางการป‚อนอนพJตทาง
                                                 L
command line แลUวแสดงผลออกทางจอภาพ



ผศ. ธนศา เครอไวศยวรรณ                                                      พYนฐานโปรแกรมภาษาจาวา   65
โปรแกรมท( 2.13 โปรแกรมแสดงการป@อนอนพตทาง command line
 public class InputDemo {
       public static void main(String args[]) {
             System.out.println("My name is "+ args[0] +
                               " and I am a " + args[1]);
       }
 }




                              รปท 2.14 ผลลพธทได*จากการรนโปรแกรมท 2.12

สร%ปเนอหาของบท
       •   ภาษาจาวาเปyนภาษาเชงอ5อบเจกต# ท;ม;คZานยามท;สZาค)ญสองคZาคอคลาสและอ5อบเจกต#
       •   คลาสเปร;ยบเสมอนพมพ#เข;ยวของอ5อบเจกต# อ5อบเจกต#ท;ถVกสรUางมาจากคลาส
       •   คลาสจะประกอบดUวยคJณล)กษณะและเมธอด
       •   คลาสจะถVกเร;ยกใชUงานไดUเมอม;การสรUางอ5อบเจกต#ของคลาสโดยเร;ยกใชUคZาส)ง new แลUวเร;ยกใชUเมธอด
       •   คอมเม5นต# คอขUอความท;แทรกอยVLภายในโปรแกรม ซxงคอมไพเลอร#จะไมLแปลขUอความน;YใหUเปyนสLวนหนxง
           ของโปรแกรม
       •   identifier คอชอท;ต)Yงขxนในภาษาจาวา ซxงอาจเปyนชอของคลาส ชอของต)วแปร ชอของเมธอด หรอชอของ
                                    Y
           คLาคงท; ซxงจะตUองเปyนไปตามกฎการต)Yงชอ
       •   การต)Yงชอในภาษาจาวา
             – สZาหร)บคลาส นยมขxนตUนดUวยต)วอ)กษรพมพ#ใหญL
                                      Y
             – สZาหร)บเมธอดและต)วแปร นยมขxนตUนดUวยต)วอ)กษรพมพ#เล5ก
                                                   Y
             – ถUาชอท;ต)YงขxYนม;มากกวLา 1 คZา นยมขxนตUนคZาใหมLดUวยต)วอ)กษรพมพ#ใหญL
                                                     Y
             – ตUองไมLตรงก)บค;ย#เวร#ด
       •   ค;ย#เวร#ด คอชอท;ม;ความหมายพเศษในภาษาจาวา คอมไพเลอร#ของภาษาจาวาจะเขUาใจความหมายและคZาส)งท;
           จะตUองดZาเนนการสZาหร)บค;ย#เวร#ดแตLละต)ว


66   พYนฐานโปรแกรมภาษาจาวา                                                           ผศ. ธนศา เครอไวศยวรรณ
•   ขUอมVลคLาคงท; คอคZาท;ใชUแสดงขUอมVลท;เปyนต)วเลข ต)วอ)กขระ ขUอความ หรอคLาทางตรรกะ
        •   ชนดขUอมVลในภาษาจาวาแบLงเปyนสองประเภท คอชนดขUอมVลแบบพYนฐาน และชนดขUอมVลแบบอUางอง
        •   ชนดขUอมVลแบบพYนฐานท;ใชUในภาษาจาวาม;ท)Yงหมด 8 ชนดคอ char, byte, short, int, long,
            float, double และ boolean

        •   ขUอมVลท;เก5บอยVLในโปรแกรมแบLงเปyนสองประเภท คอต)วแปรและคLาคงท; ซxงต)วแปรคอขUอมVลท;สามารถ
            เปล;ยนแปลงคLาไดUในโปรแกรมโดยใชUคZาส)งกZาหนดคLา สLวนคLาคงท;คอขUอมVลท;กZาหนดคLาไดUเพ;ยงคร)Yงเด;ยว
            และไมLสามารถเปล;ยนแปลงคLาไดUในโปรแกรม
        •   ต)วแปรท;ม;การประกาศชนดขUอมVลแลUวสามารถท;จะกZาหนดหรอเปล;ยนแปลงคLาไดUโดยใชUคZาส)งกZาหนดคLา
        •   การประกาศคLาคงท;ในภาษาจาวาทZาไดUโดยการใสLค;ย#เวร#ด final หนUาคZาส)งประกาศชอ
        •   คLาคงท;หรอต)วแปรท;อยVLภายในบล5อกของเมธอด จะม;ขอบเขตการใชUงานอยVLภายในบล5อกเทLาน)น   Y
        •   ต)วดZาเนนการท;ใชUในภาษาจาวาม;ท)Yงหมด 4 แบบคอ
              – ต)วดZาเนนการทางคณตศาสตร# : +, -, *, /, %, +=, -=, *=, /=, %=, ++ และ --
              – ต)วดZาเนนการทางตรรกศาสตร# : !, &&, &, || และ |
              – ต)วดZาเนนการแบบส)มพ)นธ# : <, <=, >, >=, == และ !=
              – ต)วดZาเนนการแบบบต : ~, &, |, ^, >>, >>>, <<
        •   กรณ;ท;นพจน#ใดๆ ม;ต)วดZาเนนการมากกวLาหนxงต)ว ภาษาจาวาจะจ)ดลZาด)บความสZาค)ญของต)วดZาเนนการ เพอ
            คZานวณหาผลล)พธ#ตามลZาด)บความสZาค)ญของต)วดZาเนนการ
        •   ความแตกตLางระหวLางการแปลงขUอมVลชนดอ)ตโนม)ตและ Typecasting
              – การแปลงขUอมVลโดยอ)ตโนม)ตคอ การท;ชนดขUอมVลท;ม;ขนาดเล5กกวLาถVกแปลงใหUเปyนชนดขUอมVลท;ม;
                  ขนาดใหญLกวLาโดยอ)ตโนม)ต
              – Typecasting คอการท;จะตUองระบJชนดขUอมVลท;ม;ขนาดเล5กกวLาใหUก)บนพจน#ท;ม;ชนดขUอมVลขนาดใหญL
                  กวLา
        •   ชนดขUอมVลแบบอUางองซxงก5คออ5อบเจกต#ในภาษาจาวา โดยแบLงออกเปyนสองแบบคอชนดขUอมVลท;เปyนคลาส
            และชนดขUอมVลท;เปyนอะเรย#
        •   ขUอมVลท;เก5บในหนLวยความจZาของชนดขUอมVลแบบอUางอง จะเปyนตZาแหนLงอUางองท;เก5บขUอมVลในหนLวยความจZา
            แตLในกรณ;ของชนดขUอมVลแบบพYนฐาน ขUอมVลท;เก5บในหนLวยความจZาจะเปyนคLาของขUอมVลจรงๆ
        •   String เปyนชนดขUอมVลแบบคลาส ไมLใชLชนดขUอมVลแบบพYนฐาน

        •   คลาส Math จะม;เมธอดตLางๆ ในการจ)ดการก)บฟwงก#ช)นหรอคZาส)งทางคณตศาสตร#ตLางๆ
        •   ค1าส&งท(&ใชในการแสดงผลลพธของขอม)ลในภาษาจาวาคอค1าส&ง System.out.println()



ผศ. ธนศา เครอไวศยวรรณ                                                               พYนฐานโปรแกรมภาษาจาวา   67
68   พYนฐานโปรแกรมภาษาจาวา   ผศ. ธนศา เครอไวศยวรรณ
บทท 3 โครงสรางควบค%ม
       เนYอหาในบทน;YเปyนการแนะนZาคZาส)งท;เก;ยวขUองก)บโครงสรUางควบคJมในภาษาจาวา ซxงเปyนการควบคJมลZาด)บการ
ทZางานของคZาส)งตLางๆ ในโปรแกรมภาษาจาวา โดยจะกลLาวถxงคZาส)งโครงสรUางควบคJมสองประเภทคอ คZาส)งโครงสรUาง
แบบเลอกทZาซxงไดUแกLคZาส)ง if,if..else และ switch และคZาส)งโครงสรUางแบบทZาซYZาซxงไดUแกLคZาส)ง while,
do..while และ for และในตอนทUายของบทน;จะกลLาวถxงคZาส)งโครงสรUางควบคJมแบบซUอน
                                                Y

3.1 คDาสงโครงสรางควบค%ม

      คZาส)งโครงสรUางควบคJม (Control Structure) เปyนคZาส)งท;ใชUในการกZาหนดลZาด)บการทZางานของคZาส)งตLางๆ
ภาษาจาวาม;โครงสรUางควบคJมสามรVปแบบคอ
      1. โครงสรUางแบบตามลZาด)บ (Sequential Structure)
      2. โครงสรUางแบบเลอกทZา (Selection Structure)
      3. โครงสรUางแบบทZาซYZา (Repetition Structure)

         โดยท)วไปคZาส)งในภาษาจาวาจะม;โครงสรUางควบคJมแบบตามลZาด)บ โดยจะทZางานตามลZาด)บของคZาส)งท;ม;อยVLใน
โปรแกรม ซxงจะเรมทZางานจากเมธอด main()โดยจะทZางานจากคZาส)งแรกของเมธอด main()และทZางานเร;ยงตาม
ลZาด)บคZาส)งตLอไปเรอยๆ กรณ;ท;ม;การเร;ยกใชUเมธอดของอ5อบเจกต# โปรแกรมจะเขUาไปทZาคZาส)งภายในเมธอดน)น และ
                                                                                                    Y
เมอสYนสJดคZาส)งสJดทUายของเมธอดก5จะกล)บมาทZาคZาส)งท;เร;ยกใชUเมธอด ด)งแสดงในรVปท; 3.1

                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.1 ขนตอนการทางานตามลาดบของคาสงทมอย%ในโปรแกรม


ผศ. ธนศา เครอไวศยวรรณ                                                                    โครงสรUางควบคJม   69
3.2 โครงสรางแบบเลอกทDา

          โครงสรUางแบบเลอกทZาเปyนการใหUเลอกทZาชJดคZาส)งในกรณ;ท;นพจน#ตรรกศาสตร#ม;คLาเปyนจรงตามเงอนไข ซxง
ชJดคZาส)งโครงสรUางแบบเลอกทZาจะประกอบไปดUวยคZาส)งด)งตLอไปน;Y
          • คZาส)ง if
          • คZาส)ง if..else
          • คZาส)ง if แบบซUอน (nested if)
          • คZาส)ง switch


3.2.1 คDาสง if
       คZาส)ง if จะม;รVปแบบด)งน;Y
                if (logical expression) {
                    statements
                }


       โดยท;
       • logical expression คอนพจน#ตรรกศาสตร#ท;ใหUผลล)พธ#เปyนขUอมVลคLาคงท;ชนด boolean
       • statements      คอชJดคZาส)งใดๆ

        ชJดคZาส)งท;อยVLในบล5อก { } จะทZางานในกรณ;ท;นพจน#ตรรกศาสตร#ใหUคาเปyนจรง ซxงคZาส)ง if สามารถแสดง
                                                                         L
ลZาด)บการทZางานเปyนโฟว#ชาร#ต (flowchart) ไดUด)งแสดงในรVปท; 3.2




                                       รปท 3.2 โฟวชารตของคาสง if


70   โครงสรUางควบคJม                                                                      ผศ. ธนศา เครอไวศยวรรณ
ต)วอยLางของการใชUคZาส)ง if ม;ด)งน;Y
                 if (radius >= 0) {
                       area = radius*radius*Math.PI;
                       System.out.println(area);
                 }


       จากต)วอยLางน;YชJดคZาส)งท;อยVLในบล5อก (คZาส)งกZาหนดคLาต)วแปร area และคZาส)งแสดงผล) จะทZางานในกรณ;ท;
นพจน# radius >=0 เปyนจรง กลLาวคอต)วแปร radius ม;คามากกวLาหรอเทLาก)บ 0
                                                             L

        กรณ;ท;ชJดคZาส)งในบล5อก { } ม;เพ;ยงคZาส)งเด;ยวเราสามารถท;จะต)ดเครองหมาย { } ออกไปไดUอาทเชLน คZาส)ง
                 if((x > 0) && (x < 10)) {
                      System.out.println(x);
                 }

        สามารถเข;ยนใหมLไดUเปyน
                 if((x > 0) && (x < 10))
                      System.out.println(x);

       แตLอยLางไรก5ตามการเข;ยนโปรแกรมท;ด;ควรใชUบล5อก { } เพอใหUเกดความเขUาใจงLาย และงLายตLอการเพมคZาส)ง
(กลLาวคอถUาม;มากกวLาหนxงคZาส)งตUองใชUบล5อก { } เสมอ)



โปรแกรมท( 3.1 ต)วอยางการใชค(าส)ง if

  import javax.swing.JOptionPane;

  public class SampleIf {
      public void showDemo() {
          String inputStr = JOptionPane.showInputDialog("Enter value");
          int score = Integer.parseInt(inputStr);
          if (score >= 50) {
              JOptionPane.showMessageDialog(null, "You pass");
              // null to tell that there is no parent frame
          }
      }
  }
  ------------------------------------------------------------------------
  public class Main {

        public static void main(String[] args) {
            SampleIf obj = new SampleIf();
            obj.showDemo();
        }
  }




ผศ. ธนศา เครอไวศยวรรณ                                                                         โครงสรUางควบคJม   71
โปรแกรมท; 3.1 เปyนต)วอยLางของโปรแกรมท;ใชUคZาส)ง if โดยโปรแกรมจะร)บต)วเลขเขUามาทางไดอะล5อก ซxง
จะเปyนขUอมVลชนด String ท;จะเก5บอยVLในต)วแปรท;ชอ inputStr โดยการเร;ยกใชUเมธอดท;ชอ showInputDialog
                                                
ของคลาส JOptionPane แลUวจxงสLงคLาเปyน argument ของเมธอด Integer.parseInt() เพอทZาการแปลงชนด
ขUอมVล String ใหUเปyนชนดขUอมVล int แลUวกZาหนดไวUในต)วแปร score ซxงคZาส)ง if จะตรวจสอบวLาถUาต)วแปร score
ม;คLามากกวLาหรอเทLาก)บ 50 จะพมพ#ขUอความ You pass ออกมาทางไดอะล5อกท;เร;ยกใชUเมธอด
showMessageDialog ของคลาส JOptionPane ต)วอยLางของผลล)พธ#ท;ไดUจากการร)นโปรแกรมท; 3.1 แสดงด)งรVปท;
3.3




                                  รปท 3.3 ผลลพธทได*จากการรนโปรแกรมท 3.1

      คลาส JOptionPane

            คลาส JOptionPane เปนคลาสท%ก(าหนดมาในภาษาจาวาเพอใชในการสราง DialogBox แบบ
      มาตรฐาน คลาสน%เปนคลาสขนาดใหญท%ม%เมธอดหลายๆ เมธอดแตเมธอดท%ส(าค)ญคอ
               - showConfirmDialog เปนไดอะล9อกเพอยนย)นค(าถามเชน yes/no/cancel
               - showInputDialog   เปนไดอะล9อกส(าหร)บร)บคาขอม1ลชนด String
               -   showMessageDialog เปนไดอะล9อกเพอแสดงขอความออกมา




3.2.2 คDาสง if..else
      คZาส)ง if จะไมLม;การทZาคZาส)งใด ถUานพจน#ตรรกศาสตร#ม;คLาเปyนเท5จ ด)งน)นถUาตUองการทZาคZาส)งบางคZาส)งเมอ
                                                                             Y
นพจน#ตรรกศาสตร#ม;คาเปyนเท5จ จะตUองใชUคZาส)ง if..else แทน ซxงม;รVปแบบของคZาส)งด)งน;Y
                    L
               if (logical expression) {
                   true statements
               } else {
                   false statements
               }




72    โครงสรUางควบคJม                                                                          ผศ. ธนศา เครอไวศยวรรณ
โดยท;
        • true statements     คอชJดคZาส)งสZาหร)บคLาจรง
        • false     statements คอชJดคZาส)งสZาหร)บคLาเท5จ


        โดยม;โฟว#ชาร#ตของการทZางานของคZาส)งน;Yด)งแสดงในรVปท; 3.4




                                      รปท   3.4 โฟวชารตของคาสง if..else



        ต)วอยLางของการใชUคZาส)ง if..else ม;ด)งน;Y
            if (radius >= 0) {
                  area = radius*radius*Math.PI;
                  System.out.println(area);
            } else {
                  System.out.println(“Negative radius”);
            }

         จากต)วอยLางน;Yถาต)วแปร radius ม;คามากกวLาหรอเทLาก)บ 0 (นพจน#ม;คาเปyนจรง) โปรแกรมจะทZาการคZานวณ
                        U                 L                              L
คLา กZาหนดคLาและพมพ#คLาของต)วแปร area ออกมา แตLถUาต)วแปร radius ม;คานUอยกวLา 0 (นพจน#เปyนเท5จ) โปรแกรม
                                                                       L
จะแสดงขUอความ Negative radius ออกมาแทน




ผศ. ธนศา เครอไวศยวรรณ                                                                โครงสรUางควบคJม   73
โปรแกรมท( 3.2 ต)วอยางการใชค(าส)ง if..else
     import javax.swing.JOptionPane;

     public class SampleIfElse {
         public void showDemo() {
             String inputStr = JOptionPane.showInputDialog("Enter value");
             int score = Integer.parseInt(inputStr);
             if (score >= 50) {
                 JOptionPane.showMessageDialog(null, "You pass");
             } else {
                 JOptionPane.showMessageDialog(null, "You fail");
             }
         }
     }




       โปรแกรมท; 3.2 เปyนต)วอยLางของการใชUคZาส)ง if..else โดยโปรแกรมจะพมพ#ขUอความ You pass ถUาคLา
ของต)วแปร score ท;ร)บเขUามาทางไดอะล5อก ม;คามากกวLาหรอเทLาก)บ 50 และจะพมพ#ขUอความ You fail ถUาคLาของ
                                            L
score ม;คLานUอยกวLา 50 โดยม;ต)วอยLางของผลล)พธ#ด)งแสดงในรVปท; 3.5




                                รปท 3.5 ผลลพธทได*จากการรนโปรแกรมท 3.2

3.2.3 คDาสง if แบบซอน
           คZาส)ง if หรอ if..else สามารถท;จะซUอนอยVขUางในคZาส)ง if หรอ if..else อนไดUอาทเชLน โฟว#ชาร#ตท;
                                                     L
แสดงในรVปท; 3.6 ซxงม;ขนตอนการทZางานคอ โปรแกรมจะทZาชJดคZาส)งท; 3 ถUานพจน#ตรรกศาสตร#ท; 1 เปyนเท5จ แตLถUาเปyน
                           )Y
จรงจะตรวจสอบผลล)พธ#ของนพจน#ตรรกศาสตร#ท; 2 ซxงถUาม;คาเปyนจรง จะทZาชJดคZาส)งท; 1 แตLถUาม;คาเปyนเท5จจะทZาชJด
                                                          L                                 L
คZาส)งท; 2




74     โครงสรUางควบคJม                                                                    ผศ. ธนศา เครอไวศยวรรณ
รปท 3.6 โฟวชารตของคาสง if แบบซ*อน


จากโฟว#ชาร#ตในรVปท; 3.6 สามารถท;จะเข;ยนเปyนคZาส)ง if แบบซUอนไดUด)งน;Y
        if (logical expression 1) {
             if (logical expression 2) {
                 statements 1
             } else {
                 statements 2
             }
        } else {
             statements 3
        }


        ต)วอยLางเชLน
           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”);
           }




ผศ. ธนศา เครอไวศยวรรณ                                                      โครงสรUางควบคJม   75
รปท 3.7 โฟวชารตของคาสง if แบบซ*อน


          โครงสรUางเลอกทZาแบบซUอนย)งม;กรณ;ท;เปyนด)งโฟว#ชาร#ตในรVปท; 3.7 ซxงจะม;ขนตอนการทZางานคอ โปรแกรม
                                                                                            )Y
จะทZาชJดคZาส)งท; 1 ถUานพจน#ตรรกศาสตร#ท; 1 เปyนจรง แตLถาเปyนเท5จจะตรวจสอบผลล)พธ#ของนพจน#ตรรกศาสตร#ท; 2
                                                             U
ซxงถUาม;คาเปyนจรง จะทZาชJดคZาส)งท; 2 แตLถUาม;คาเปyนเท5จจะทZาชJดคZาส)งท; 3 ซxงจะม;รVปแบบของคZาส)งด)งน;Y
          L                                      L
              if (logical expression 1) {
                     statements 1
              } else {
                     if (logical expression 2) {
                           statements 2
                     } else {
                           statements 3
                     }
              }


          ในกรณ;น;Yสามารถท;เข;ยนคZาส)ง if แบบซUอนไดUใหมL ในรVปของ if..else   if..else   โดยม;รปแบบของ
                                                                                                V
คZาส)งด)งน;Y




76   โครงสรUางควบคJม                                                                      ผศ. ธนศา เครอไวศยวรรณ
if (logical expression 1) {
                      statements 1
               } else if (logical expression 2) {
                      statements 2
               } else {
                      statements 3
               }


        ต)วอยLางของการใชUคZาส)ง if..else   if..else   ม;ด)งน;Y
                        if (score >= 80) {
                             System.out.println(‘A’);
                        } else if(score >= 70) {
                             System.out.println(‘B’);
                        } else if(score >= 60) {
                             System.out.println(‘C’);
                        } else if(score >= 50) {
                                   System.out.println(‘D’);
                        } else {
                             System.out.println(‘F’);
                        }


       ต)วอยLางน;Yจะพมพ#ต)วอ)กษร A ถUาต)วแปร score ม;คLามากกวLาหรอเทLาก)บ 80 พมพ#ต)วอ)กษร B ถUาต)วแปร
score ม;คLาต)YงแตL 70 จนถxง 79 พมพ#ต)วอ)กษร C ถUาต)วแปร score ม;คLาต)YงแตL 60 จนถxง 69 พมพ#ต)วอ)กษร D ถUา

ต)วแปร score ม;คาต)YงแตL 50 จนถxง 59 และพมพ#ต)วอ)กษร F ถUาต)วแปร score ม;คาตZากวLา 50
                   L                                                          L

โปรแกรมท 3.3 การใชUคZาส)ง if..else   if..else

   import javax.swing.JOptionPane;

   public class SampleIfElseIf {
       public void showDemo() {
           String inputStr = JOptionPane.showInputDialog("Enter value");
           int x = Integer.parseInt(inputStr);
           if (x == 1) {
               JOptionPane.showMessageDialog(null, "Value is one");
           } else if (x == 2) {
               JOptionPane.showMessageDialog(null, "Value is two");
           } else {
               JOptionPane.showMessageDialog(null, "Other than 1 and 2 ");
           }
       }
   }




       โปรแกรมท; 3.3 แสดงต)วอยLางการใชUคZาส)ง if..else if..else โปรแกรมน;จะอLานคLาท;ป‚อนเขUามาทาง
                                                                           Y
ไดอะล5อกบล5อก โดยโปรแกรมจะพมพ#ขUอความวLา “Value is one” ถUาคLาท;ป‚อนเขUามาเปyน 1 พมพ#ขUอความวLา


ผศ. ธนศา เครอไวศยวรรณ                                                                     โครงสรUางควบคJม   77
”Value is two” ถUาคLาท;ป‚อนเขUามาเปyน 2     และพมพ#ขUอความวLา “Other       than 1 or 2”      ถUาคLาท;ป‚อนเขUามาเปyนคLา
อนๆ

3.2.4 คDาสง switch
         คZาส)ง switch เปyนคZาส)งโครงสรUางแบบเลอกทZา โดยม;รVปแบบด)งน;Y
                  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;
                   }

         โดยท;
         • expression คอนพจน#ท;ตUองม;ชนดขUอมVลเปyน char, byte, short หรอ int เทLาน)น
                                                                                    Y
         • value 1 .. value N         คอขUอมVลคLาคงท;ซxงม;ชนดขUอมVลท;สอดคลUองก)บชนดขUอมVลของ expression

        คZาส)ง switch จะตรวจสอบคLาของนพจน#ท;อาจเปyนชนดขUอมVล char, byte, short หรอ int กรณ;ท;คLา
ของนพจน#ม;คาตรงก)บคLาท; 1 โปรแกรมจะทZาชJดคZาส)งท; 1 ถUาม;คาตรงก)บคLาท; 2 ก5จะทZาชJดคZาส)งท; 2 ถUาม;คาตรงก)บคLาท;
               L                                              L                                           L
N ก5จะทZาชJดคZาส)งท; N สLวนกรณ;ท;ม;คาไมLตรงก)บคLาใดๆ เลยในคZาส)ง case ก5จะทZาชJดคZาส)งใน default คอชJดคZาส)งท;
                                       L
N+1 ซxงแสดงข)YนตอนการทZางานไดUด)งโฟว#ชาร#ตในรVปท; 3.8




78     โครงสรUางควบคJม                                                                           ผศ. ธนศา เครอไวศยวรรณ
รปท 3.8 โฟวชารตของคาสง switch


        ต)วอยLางของการใชUคZาส)ง switch ม;ด)งน;Y
               switch (x) {
                    case 1 : System.out.println(“One”);
                             break;
                    case 2 : System.out.println(“Two”);
                             break;
                    case 3 : System.out.println(“Three”);
                             break;
                   default : System.out.println(“Other”);
                }



          ต)วอยLางน;จะพมพ#ขUอความตามคLาของ x ต)YงแตL 1 ถxง 3 และจะพมพ#ขUอความวLา other ถUาคLาของ x เปyนคLาอนๆ
                    Y
คZาส)ง switch ม;ขUอกZาหนดตLางๆ ด)งน;Y
          • นพจน#ตUองม;ชนดขUอมVลเปyน char,byte,short หรอ int เทLาน)น      Y
          • ชนดขUอมVลของนพจน#และคLาท; 1 ถxง N ตUองเปyนชนดขUอมVลเด;ยวก)น
          • คZาส)ง break จะหยJดการทZางานภายในบล5อก { } ถUาไมLม;คZาส)ง break โปรแกรมจะทZาคZาส)งถ)ดไป ต)วอยLาง



ผศ. ธนศา เครอไวศยวรรณ                                                                     โครงสรUางควบคJม   79
เชLน
                   switch (x) {
                       case 1 : System.out.println(“One”);
                       case 2 : System.out.println(“Two”);
                                break;
                       default : System.out.println(“Other”);
                   }

         จะพมพ#ขUอความ One ตามดUวย Two ในกรณ;ท; x ม;คLาเปyน 1
        • เงอนไข default จะม;หรอไมLม;ก5ไดU

         โปรแกรมท; 3.4 แสดงต)วอยLางของการใชUคZาส)ง switch ซxงจะไดUผลล)พธ#เปyนขUอความวLา Value is one ถUา
ต)วเลขท;ป‚อนเขUามาม;คLาเปyน 1 เปyนขUอความวLา Value is two ถUาต)วเลขท;ป‚อนเขUามาม;คาเปyน 2 และเปyนขUอความวLา
                                                                                    L
Other than 1 or 2 ถUาต)วเลขท;ป‚อนเขUามาม;คLาอนๆ



โปรแกรมท( 3.4 ต)วอยางการใชค(าส)ง switch

  import javax.swing.JOptionPane;

  public class SampleSwitch {
      public void showDemo() {
          String inputStr = JOptionPane.showInputDialog("Enter value");
          int x = Integer.parseInt(inputStr);
          switch (x) {
             case 1: JOptionPane.showMessageDialog(null, "Value is one");
                     break;
             case 2: JOptionPane.showMessageDialog(null, "Value is two");
                     break;
             default: JOptionPane.showMessageDialog(null, "Other than 1 and 2");
          }
      }
  }




3.3 โครงสรางแบบทDาซDา

       โครงสรUางแบบทZาซYZา เปyนคZาส)งท;ใชUในการส)งใหUชJดคZาส)งใดๆ ทZาซYZาหลายคร)Yงตามเงอนไขท;ระบJ ซxงชJดคZาส)ง
โครงสรUางแบบทZาซYZาประกอบดUวยคZาส)ง
       • คZาส)ง while
       • คZาส)ง do..while
       • คZาส)ง for



80    โครงสรUางควบคJม                                                                             ผศ. ธนศา เครอไวศยวรรณ
3.3.1 คDาสง while
        คZาส)ง while จะม;รVปแบบด)งน;Y
                 initial statements
                 while (logical expression) {
                            statements
                          update statements
                 }


        โดยท;
        • initial statements คอคZาส)งท;ใชUในการกZาหนดคLาเรมตUน
        • logical expression คอนพจน#ตรรกศาสตร#
        • update statements คอคZาส)งท;ใชUในการเปล;ยนแปลงคLา

        คZาส)ง while จะทZาชJดคZาส)งและคZาส)งเปล;ยนแปลงคLาท;อยVLในบล5อก { } ตราบใดท;นพจน#ตรรกศาสตร#ย)งม;คLา
เปyนจรง คZาส)งท;อยVLในบล5อก { } จะตUองม;คZาส)งในการเปล;ยนแปลงคLา เพอเปล;ยนคLานพจน#ตรรกศาสตร#ใหUม;คาเปyนเท5จ
                                                                                                        L
มฉะน)นแลUวโปรแกรมจะทZาคZาส)งท;อยVLในบล5อกแบบไมLม;ท;สYนสJด คZาส)ง while สามารถเข;ยนเปyนโฟว#ชาร#ตไดU ด)ง
      Y
แสดงในรVปท; 3.9




                                         รปท 3.9 โฟวชารตของคาสง while


ผศ. ธนศา เครอไวศยวรรณ                                                                        โครงสรUางควบคJม   81
ต)วอยLางของการใชUคZาส)ง while เพอพมพ#ขUอความวLา Hello World สบคร)Yง ม;ด)งน;Y
              int count = 1;
              while(count <= 10) {
                   System.out.println(“Hello World”);
                    count++;
              }


        ต)วอยLางน;ม;คZาส)ง int count = 1; เปyนคZาส)งกZาหนดคLาเรมตUน โดยม;นพจน#ตรรกศาสตร#คอ count <=
                  Y
10 ซxงโปรแกรมจะทZาคZาส)งในบล5อก { } ตราบเทLาท;นพจน#ตรรกศาสตร#ม;คาเปyนจรง (กลLาวคอคLาของต)วแปร count
                                                                       L
นUอยกวLาหรอเทLาก)บ 10) สLวนคZาส)ง count++; เปyนคZาส)งเปล;ยนแปลงคLาของต)วแปร count โดยจะเพมคLาท;ละหนxง
                                                                                                        
ในแตLละรอบจนกระท)งม;คาเปyน 11 ซxงจะม;ผลทZาใหUนพจน# count <= 10 ม;คLาเปyนเท5จ หากไมLมคZาส)ง count++;
                            L                                                            ;
ในบล5อก { } จะทZาใหUคา count ม;คาเปyน 1 ตลอด และจะทZาใหUนพจน# count <= 10 ม;คาเปyนจรงเสมอ ซxงก5จะ
                        L           L                                               L
ทZาใหUโปรแกรมพมพ#ขUอความ Hello World โดยไมLม;ท;สYนสJด


โปรแกรมท( 3.5 ต)วอยางการใชค(าส)ง while
  public class SampleWhile {
      public void showDemo() {
           int i = 1;
           while(i <= 10) {
              System.out.print(i+"            ");
              i++;
           }
      }
  }




      โปรแกรมท(& 3.5 แสดงตวอยางการใชค1าส&ง while เพ&อพมพคาตวเลข 1 ถ4ง 10 ซ4&งผลลพธของโปรแกรมเป$นดง
แสดงในร)ปท(& 3.10




                               รปท 3.10 ผลลพธทได*จากการรนโปรแกรมท 3.5


82   โครงสรUางควบคJม                                                                    ผศ. ธนศา เครอไวศยวรรณ
3.3.2 คDาสง do..while
             คZาส)ง do..while เปyนคZาส)งท;เปyนโครงสรUางแบบทZาซYZาท;ม;การทZางานคลUายก)บคZาส)ง while โดยม;รVปแบบ คZา
ส)งด)งน;Y
                   initial statements
                   do {
                            statements
                          update statements
                   } while(logical expression);


        โดยม;โฟว#ชาร#ตของการทZางานของคZาส)งน;ด)งแสดงในรVปท; 3.11 ขUอแตกตLางของคZาส)ง while ก)บคZาส)ง
                                              Y
do..while คอคZาส)ง do..while จะทZาคZาส)งในบล5อก { } อยLางนUอยหนxงคร)YงแลUวจxงทZาการตรวจสอบเงอนไขใน
                                                                     
นพจน#ตรรกศาสตร# ขณะท;คZาส)ง while จะทZาการตรวจสอบเงอนไขในนพจน#ตรรกศาสตร#กLอนซxงหากม;คาเปyนจรงถxง
                                                                                                 L
จะทZาคZาส)งในบล5อก { }




                                        รปท 3.11 โฟวชารตของคาสง do..while

             ต)วอยLางของการใชUคZาส)ง do..while เพอพมพ#ขUอความวLา Hello World สบคร)Yงม;ด)งน;Y
                   int count = 1;
                   do {
                         System.out.println(“Hello World”);
                         count++;
                   } while(count <= 10);




ผศ. ธนศา เครอไวศยวรรณ                                                                             โครงสรUางควบคJม   83
โปรแกรมท( 3.6 ต)วอยางการใชค(าส)ง do..while
  public class SampleDoWhile {
        public void showDemo() {
           int i = 1;
           do {
              System.out.print(i+"                 ");
              i++;
           } while (i <= 10);
        }
  }




        โปรแกรมท; 3.6 แสดงต)วอยLางการใชUคZาส)ง do..while เพอพมพ#คาต)วเลข 1 ถxง 10 ซxงจะไดUผลล)พธ#เชLน
                                                                    L
เด;ยวก)บโปรแกรมท; 3.5

3.3.3 คDาสง for
        คZาส)ง for เปyนคZาส)งท;เปyนโครงสรUางแบบทZาซYZา ท;ม;รปแบบของคZาส)งด)งน;Y
                                                                V
               for(initial statements; expression; update statements) {
                   statements
               }


       โดยม;โฟว#ชาร#ตของการทZางานของคZาส)งน;YเชLนเด;ยวก)บโฟว#ชาร#ตชองคZาส)ง while ในรVปท; 3.9 คZาส)ง for จะ
ใชUในกรณ;ท;ทราบจZานวนคร)YงในการทZาซYZาท;แนLนอน สLวนคZาส)ง while หรอ do..while นยมใชUในกรณ;ท;ไมLทราบ
จZานวนคร)YงในการทZาซYZาลLวงหนUา

      ต)วอยLางเชLนคZาส)งพมพ#ขUอความ Hello World สบคร)Yง ควรใชUคZาส)ง for มากกวLาใชUคZาส)ง while หรอ
do..while โดยสามารถเข;ยนคZาส)งไดUด)งน;Y

           for (int count = 1; count <= 10; count++) {
                 System.out.println(“Hello World”);
           }

        ในกรณ;นจะเห5นไดUวาชJดคZาส)งท;ใชUคZาส)ง for จะม;รVปแบบท;กระช)บกวLาเมอเท;ยบก)บกรณ;ของคZาส)ง while
               ;Y        L
หรอ do..while

      คZาส)งกZาหนดคLาเรมตUนหรอคZาส)งเปล;ยนแปลงคLาท;อยVLในคZาส)ง for สามารถท;จะม;มากกวLาอยLางละหนxงคZาส)ง
โดยจะใชUเครองหมาย , ในการแยกคZาส)ง อาทเชLน



84    โครงสรUางควบคJม                                                                         ผศ. ธนศา เครอไวศยวรรณ
for (int i = 0, j = 0; i < 4; i++, j += 2) {
                 System.out.println(i + “ ” + j);
            }

        เปyนคZาส)งท;จะพมพ#คาของต)วแปร i และ j ท;กZาหนดขxนภายในคZาส)ง for ส;คร)Yง โดยต)วแปร i จะเพมคLาขxYนท;
                             L                             Y
ละหนxง และต)วแปร j จะเพมคLาขxYนท;ละสอง


โปรแกรมท( 3.7 ต)วอยางการใชค(าส)ง for
  public class SampleFor {
      public void showDemo() {
           for (int i=1; i<=10; i++) {
              System.out.print(i+" ");
           }
      }
  }




      โปรแกรมท; 3.7 แสดงต)วอยLางการใชUคZาส)ง for เพอพมพ#ต)วเลข 1 ถxง 10 ซxงจะไดUผลล)พธ#เชLนเด;ยวก)บ
โปรแกรมท; 3.5 และโปรแกรมท; 3.6

         ต)วแปรท;ประกาศในคZาส)งกZาหนดคLาของคZาส)ง for จะม;ขอบเขตการใชUงานไดUเฉพาะภายในบล5อก { } ของคZา
ส)ง for เทLาน)น การใชUงานต)วแปรนอกบล5อก { } จะเกด compile error ด)งแสดงในต)วอยLางของโปรแกรมท; 3.8
               Y


โปรแกรมท( 3.8 ขอบเขตการใชงานของต)วแปร

  public class VariableScope {
        public void showDemo() {
           for (int i=1; i<10; i++) {
               System.out.print(i+" ");
           }
           System.out.println("i = "+i);                   //illegal
        }
  }




         เราไมLสามารถใชUคZาส)ง for ในกรณ;ท;ไมLทราบจZานวนคร)งในการทZาซYZาท;แนLนอนต)วอยLางเชLนโปรแกรมท; 3.9
                                                               Y
เปyนการสJLมต)วเลขสองต)วท;ม;คLาระหวLาง 1 ถxง 10 โดยใหUทZาการสJLมต)วเลขท)YงสองจนกวLาผลการสJLมของเลขท)Yงสองม;คLา
เทLาก)น เมธอด Math.random() เปyนเมธอดท;ใชUในการสJLมเลขจZานวนทศนยมระหวLาง 0 ถxง 1 และคZาส)ง



ผศ. ธนศา เครอไวศยวรรณ                                                                       โครงสรUางควบคJม   85
i = (int)(Math.random()*10) + 1;
        เปyนคZาส)งท;ใชUในการสJLมต)วเลขระหวLาง 1 ถxง 10 แลUวกZาหนดคLาใหUก)บต)วแปร i โปรแกรมน;Yสามารถเข;ยนใหมL
โดยใชUคZาส)ง while ไดU แตLไมLสามารถท;จะเข;ยนโดยใชUคZาส)ง for เนองจากไมLทราบจZานวนคร)Yงท;ตUองการสJLมต)วเลขท;
แนLนอนไดU

โปรแกรมท 3.9 การสJLมต)วเลขสองต)วท;ม;คาระหวLาง 1 ถxง 10
                                      L
     public class ShowNotFor {
         public void showDemo() {
             int i,j;
             do {
                 i = (int)(Math.random()*10)+1;
                 j = (int)(Math.random()*10)+1;
             } while (i != j);
         }
     }




3.4 โครงสรางแบบซอน (Nested Structure)

       คZาส)งโครงสรUางควบคJมสามารถเข;ยนซUอนก)นไดUอาทเชLน ใชUคZาส)ง if แบบซUอน คZาส)ง for แบบซUอน
โครงสรUางแบบซUอนสามารถท;จะม;คZาส)งโครงสรUางควบคJมท;อยVLภายในและภายนอกแตกตLางก)นไดU อาทเชLน คZาส)ง
                for (int i = 1; i <= 40; i++) {
                  if ((i%5) == 0) {
                       System.out.println(i);
                  }
                }

         เปyนคZาส)ง if ท;อยVLภายในคZาส)ง for เพอท;จะพมพ#ต)วเลขระหวLาง 1 ถxง 40 ท;หาร 5 ลงต)วออกมา

        ภาษาจาวาอนJญาตใหUเข;ยนคZาส)งโครงสรUางควบคJมซUอนก)นหลายๆ ช)YนไดU คZาส)งโครงสรUางแบบซUอนท;ใชUก)น
ท)วไปแบบหนxงคอคZาส)ง for แบบซUอน ต)วอยLางเชLน คZาส)ง
                for (int i = 1; i <= 3; i++) {
                  for (int j = 1; j <= 4; j++) {
                       System.out.println(“i =”+i+“ j =” +j);
                  }
                }

        ม;คZาส)ง for ท;อยVLภายนอกท;จะทZาซYZาสามคร)ง โดยกZาหนดใหUต)วแปร i ม;คาเรมตUนเปyน 1 และเพมท;ละหนxง
                                                      Y                        L
สLวนคZาส)ง for ท;อยVLภายในจะทZาซYZาส;คร)Yง ในแตLละรอบของคZาส)ง for ภายนอก โดยกZาหนดใหUต)วแปร j ม;คLาเรมตUน
เปyน 1 และเพมคLาท;ละหนxง ด)งน)นคZาส)งแสดงผล (System.out.println()) จะทZาซYZาท)Yงหมด 12 คร)Yง
                                 Y


86     โครงสรUางควบคJม                                                                        ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท; 3.10 เปyนต)วอยLางการใชUคZาส)ง for แบบซUอน โดยคZาส)ง for ท;อยVLภายในจะพมพ#เครองหมาย ‘*’
เทLาก)บจZานวนคอล)มน# (5 คร)Yง) และคZาส)ง for ท;อยVLภายนอกจะทZาคZาส)ง for ท;อยVLภายในซYZาเทLาก)บจZานวนแถว (3 คร)ง)
                                                                                                                   Y
โปรแกรมจะไดUผลล)พธ#ด)งรVปท; 3.12

โปรแกรมท( 3.10 ต)วอยางการใชค(าส)ง for แบบซอน
    public class NestedFor {
         public void showDemo() {
              for (int i=1; i<=3; i++) {
                for (int j=1; j<=5; j++) {
                   System.out.print('*');
                }
                System.out.println();
             }
         }
    }




                                 รปท 3.12 ผลลพธทได*จากการรนโปรแกรมท 3.10

         โปรแกรมท; 3.11 แสดงต)วอยLางโปรแกรมท;ม;คZาส)งโปรแกรมแบบซUอนหลายๆ รVปแบบอยVLภายใน โปรแกรมน;Y
จะสJLมเลขจZานวนเต5มมาสองคLา แลUวจะพมพ#ต)วเลขเฉพาะ (Prime Number) ท;อยVLระหวLางเลขท)Yงสองน)นออกมา ซxงรVป
                                                                                           Y
ท; 3.13 แสดงต)วอยLางผลล)พธ#ท;ไดUจากการร)นโปรแกรมท; 3.11




ผศ. ธนศา เครอไวศยวรรณ                                                                          โครงสรUางควบคJม   87
โปรแกรมท( 3.11 ต)วอยางการใชค(าส)งโครงสรางแบบซอนหลายร1ป
 public class SampleNested {
     public void showDemo() {
         int n1 = (int) (Math.random()*10)+2;
         int n2 = (int) (Math.random()*50);
         boolean flag = false;
         int j = 0;
         System.out.println("The prime number between n1+" to "+n2+" are ");
         for (int i=n1; i<=n2; i++) {
             flag = false;
             j = 2;
             do {
                  if ((i % j++) == 0)
                      flag = true;
             } while ((j < i) & (!flag));
             if (!flag)
                  System.out.print(i+" ");
          }
      }
  }




                               รปท 3.13 ตวอย%างผลลพธทได*จากการรนโปรแกรมท 3.11

3.4.1 คDาสง    break, continue            และ label
        คZาส)ง break และ continue เปyนคZาส)งท;ใชUในโครงสรUางแบบทZาซYZา เพอท;จะควบคJมการทZางานของคZาส)งใน
บล5อก { } โดยคZาส)ง break จะทZาใหUหยJดสYนสJดการทZางานของโครงสรUางแบบทZาซYZา สLวนคZาส)ง continue จะขUาม
การทZางานคZาส)งท;เหลอภายในบล5อก { } โดยไปเรมการทZาซYZาในรอบตLอไปใหมL
        ต)วอยLางเชLน คZาส)ง
                 for (int i = 1; i <= 5; i++) {
                     if (i == 3)
                         break;
                     System.out.println(i);
                  }

        จะพมพ#คLา i ต)YงแตL 1 ถxง 2 ออกมา แลUวจะหยJดการทZางานของคZาส)ง แตLถUาเปล;ยนจากคZาส)ง break ไปเปyน


88    โครงสรUางควบคJม                                                                      ผศ. ธนศา เครอไวศยวรรณ
คZาส)ง continue ด)งน;Y
                 for (int i = 1; i <= 5; i++) {
                     if (i == 3)
                          continue;
                     System.out.println(i);
                 }


        โปรแกรมจะพมพ#คLา i ต)YงแตL 1 ถxง 5 โดยขUามคLาท; 3 ท)Yงน;YเนองจากเจอคZาส)ง continue

          ในกรณ;ของคZาส)งโครงสรUางควบคJมแบบซUอน ถUาคZาส)ง break หรอ continue ปรากฏอยVLในคZาส)งโครงสรUาง
แบบทZาซYZาท;อยVLขางใน คZาส)งโครงสรUางแบบทZาซYZาท;อยVขUางนอกจะย)งทZาซYZาตLอ โปรแกรมท; 3.12 แสดงต)วอยLางของการ
                  U                                    L
ใชUคZาส)งโครงสรUางควบคJมแบบซUอนท;มคZาส)ง break อยVLในคZาส)งโครงสรUางแบบทZาซYZาท;อยVขUางใน โปรแกรมน;Yจะร)น
                                        ;                                                 L
คZาส)ง break เมอ j ม;คาเปyน 3 โดยคZาส)งในคZาส)ง for ภายในจะหยJดทZางาน แตLคZาส)ง for ภายนอกจะย)งทZางาน
                          L
ตLอ โดยจะไดUผลล)พธ#ด)งแสดงในรVปท; 3.14


โปรแกรมท( 3.12 ต)วอยางการใชค(าส)ง break
   public class SampleBreak1 {
      public void showDemo() {
         int i, j, product;
         for (i=1; i<=3; i++) {
            for (j=1; j<=3; j++) {
               product = i*j;
               if (j==3) break;
               System.out.println(i+" * "+j+" = "+product);
            }
         }
      }
   }




                                รปท 3.14 ผลลพธทได*จากการรนโปรแกรมท 3.12


ผศ. ธนศา เครอไวศยวรรณ                                                                           โครงสรUางควบคJม   89
ในกรณ;ท;ตUองการจะหยJดการทZางานของคZาส)งโครงสรUางควบคJมท;อยVLภายนอก เราจะตUองกZาหนด label ขxนมาY
เตม ด)งต)วอยLางในโปรแกรมท; 3.13 ซxงกZาหนด label ท;ชอ outer และม;คZาส)ง break outer; เพอท;จะทZาใหU
โปรแกรมหยJดการทZางานของคZาส)ง for ภายนอก โดยจะไดUผลล)พธ#ด)งแสดงในรVปท; 3.15

โปรแกรมท( 3.13 ต)วอยางการใชค(าส)ง break และ label

     public class SampleBreak2 {
        public void showDemo() {
           int i, j, product;
     outer: for (i=1; i<=3; i++) {
               for (j=1; j<=3; j++) {
                   product = i*j;
                   if (j==3) break outer;
                   System.out.println(i+" * "+j+" = "+product);
               }
            }
            System.out.println("Outside nested loops.");
        }
     }




                                 รปท 3.15 ผลลพธทได*จากการรนโปรแกรมท 3.13


สร%ปเนอหาของบท
         • คZาส)งโครงสรUางควบคJม เปyนคZาส)งท;ใชUในการกZาหนดลZาด)บการทZางานของคZาส)งตLางๆ โดยม;สามรVปแบบคอ
           โครงสรUางแบบตามลZาด)บ โครงสรUางแบบเลอกทZา และ โครงสรUางแบบทZาซYZา
         • คZาส)งท;เปyนคZาส)งของโครงสรUางแบบเลอกทZาคอ คZาส)ง if, if..else หรอ switch
         • คZาส)ง if..else แตกตLางจากคZาส)ง if ตรงท; คZาส)ง if..else จะม;การทZาคZาส)งสZาหร)บคLาเท5จถUานพจน#
           ตรรกศาสตร#เปyนเท5จ สLวนคZาส)ง if จะไมLม;การทZาคZาส)งใดถUานพจน#ตรรกศาสตร#เปyนเท5จ



90     โครงสรUางควบคJม                                                                        ผศ. ธนศา เครอไวศยวรรณ
• คZาส)ง if หรอ if..else สามารถท;จะซUอนอยVLขางในคZาส)ง if หรอ if..else อนไดU
                                                      U
        • คZาส)ง switch จะม;ล)กษณะโครงสรUางการทZางานคลUายคลxงก)บคZาส)ง if..else if..else          ..   แตLชนด
            ขUอมVลของต)วแปรท;จะนZามาใชUก)บคZาส)ง switch จะตUองเปyนชนด char, byte, short หรอ int
            เทLาน)นY
        •   คZาส)งท;เปyนคZาส)งของโครงสรUางแบบทZาซYZาคอ คZาส)ง while, do..while หรอ for
        •   คZาส)ง while แตกตLางจากคZาส)ง do..while ตรงท; คZาส)ง while จะไมLม;การทZาชJดคZาส)งเลยถUานพจน#
            ตรรกศาสตร#เปyนเท5จ สLวนคZาส)ง do..while จะม;การทZาชJดคZาส)งหนxงคร)YงถUานพจน#ตรรกศาสตร#เปyนเท5จ
        •   คZาส)ง for ม;ล)กษณะการทZางานท;เหมอนก)บคZาส)ง while แตLจะม;การรวมคZาส)งกZาหนดคLาเรมตUน นพจน#
            ตรรกศาสตร#และคZาส)งเปล;ยนแปลงคLาไวUหล)งคZาส)ง for
        •   คZาส)ง for จะใชUในกรณ;ท;ทราบจZานวนคร)YงในการทZาซYZาท;แนLนอน สLวนคZาส)ง while หรอ do..while
            นยมใชUในกรณ;ท;ไมLทราบจZานวนคร)งในการทZาซYZาลLวงหนUา
                                                Y
        •   คZาส)งโครงสรUางท)Yงหมดท;กลLาวมาแลUวขUางตUน สามารถนZามาใชUรLวมก)นเปyนล)กษณะแบบซUอนไดU เชLน คZาส)ง
            switch อยVLภายในคZาส)ง while หรอคZาส)ง for อยVLภายในคZาส)ง for ซxงเร;ยกโครงสรUางในล)กษณะน;วาYL
            โครงสรUางแบบซUอน
        •   คZาส)ง break จะทZาใหUหยJดสYนสJดการทZางานของโครงสรUางแบบทZาซYZา สLวนคZาส)ง continue จะขUามการ
            ทZางานคZาส)งท;เหลอภายในบล5อก { } โดยไปเรมการทZาซYZาในรอบตLอไปใหมL




ผศ. ธนศา เครอไวศยวรรณ                                                                       โครงสรUางควบคJม   91
92   โครงสรUางควบคJม   ผศ. ธนศา เครอไวศยวรรณ
บทท 4 หลกการเช,งอ-อบเจกต.
         เนYอหาในบทน;YเปyนการแนะนZาหล)กการการพ)ฒนาโปรแกรมเชงอ5อบเจกต# อธบายความ หมายของคZานยาม
ตLางๆ ท;ใชUในการพ)ฒนาโปรแกรมเชงอ5อบเจกต#เชLน คลาส อ5อบเจกต# คJณล)กษณะ และเมธอด แนะนZาการประกาศ
คZานยามด)งกลLาวโดยใชUภาษาจาวา อธบายคJณล)กษณะเดLนของโปรแกรมเชงอ5อบเจกต# แนะนZาคลาสท;ใชUในการจZาลอง
ขUอกZาหนดของโปรแกรมเชงอ5อบเจกต# และในสLวนทUายของบทจะเปyนการแนะนZาข)นตอนการพ)ฒนาโปรแกรมโดยใชU
                                                                       Y
หล)กการเชงอ5อบเจกต#

4.1 องค.ประกอบของโปรแกรมเช,งอ-อบเจกต.

        ภาษาจาวาเปyนภาษาคอมพวเตอร# ท;ใชUหล)กการการพ)ฒนาโปรแกรมเชงอ5อบเจกต#ท;เร;ยกยLอวLาเปyนภาษา
คอมพวเตอร#แบบ OOP การพ)ฒนาโปรแกรมเชงอ5อบเจกต#จะเปyนขบวนการการวเคราะห#ปญหาโดยการจZาลองปwญหา
                                                                               w
วLาประกอบไปดUวยอ5อบเจกต#ใดบUาง แลUวจxงเข;ยนใหUอยVLในรVปแบบของโปรแกรมคอมพวเตอร# โปรแกรมเชงอ5อบเจกต#
จะม;คZานยามท;สZาค)ญสองคZาคอ อ5อบเจกต# (Object) และคลาส (Class)

4.1.1 อ-อบเจกต.

        อ5อบเจกต#คอสงตLางๆ ท;ม;อยVLในช;วตประจZาว)นแบLงไดUเปyนสองประเภทคอ
        1. สงท;เปyนรVปธรรม (Tangible) คอสงท;เปyนว)ตถJและจ)บตUองไดUอาทเชLน น)กศxกษา ใบลงทะเบ;ยน ปากกา
           และรถ เปyนตUน
        2. สงท;เปyนนามธรรม (Intangible) คอสงท;ไมLสามารถจ)บตUองไดUอาทเชLน คะแนนรายชอวชา บ)ญช;เงนฝาก
           และตารางเท;ยวบน เปyนตUน

         อ5อบเจกต#ตLางๆ จะประกอบไปดUวยคJณล)กษณะ (Attribute) และพฤตกรรม (Behavior) คJณล)กษณะก5คอ
ขUอมVลของอ5อบเจกต# สLวนพฤตกรรมหรอเร;ยกวLาเมธอด (Method) คอสงท;อ5อบเจกต#สามารถกระทZาไดU ซxงในโปรแกรม
เชงอ5อบเจกต#ก5คอคZาส)งในการทZางาน โปรแกรมเชงอ5อบเจกต#จะประกอบดUวยอ5อบเจกต#ตLางๆ หลายอ5อบเจกต# ซxงแตLละ
อ5อบเจกต#จะม;คJณล)กษณะตLางๆ ท;เปyนขUอมVลของอ5อบเจกต# และโปรแกรมสามารถจ)ดการก)บขUอมVลเหลLาน;YไดUโดยการ
เร;ยกใชUเมธอดตLางๆ




ผศ. ธนศา เครอไวศยวรรณ                                                               หล)กการเชงอ5อบเจกต#   93
ต)วอยLางของอ5อบเจกต#
       • น)กศxกษา อาจจะประกอบไปดUวยคJณล)กษณะเชLน รห)ส ชอ และเกรดเฉล;ย และอาจจะม;เมธอดเชLน การ
          ลงทะเบ;ยน สอบ และเดน
       • รถยนต# อาจจะประกอบไปดUวยคJณล)กษณะเชLน ย;หUอ รJน และส; และอาจจะม;เมธอดเชLน เคลอนท; หยJดและ
                                                        L
          เล;Yยว
       • สJนข อาจจะประกอบไปดUวยคJณล)กษณะเชLน ชอ พ)นธJ# และส; และอาจจะม;เมธอดเชLน เหLา คลาน และกระดก
               )
          หาง

       ต)วอยLางของโปรแกรมเชงอ5อบเจกต#อาจยกต)วอยLางของโปรแกรมระบบจ)ดการบ)ญช;เงนฝากของธนาคาร ซxง
อาจประกอบไปดUวยอ5อบเจกต#ตLางๆ อาทเชLน บ)ญช; (Account) ลVกคUา (Customer) เครองเอท;เอ5ม (ATM) และรายการ
(Transaction) อ5อบเจกต#ชนดบ)ญช;อาจจะม;ขUอมVลภายในตLางๆ อาทเชLน เลขท;บญช; ชอเจUาของบ)ญช; ว)นท;เปmดบ)ญช;
                                                                      )
และยอดเงนคงเหลอ เปyนตUน อ5อบเจกต#ชนดบ)ญช;อาจจะม;เมธอดตLางๆ อาทเชLน ฝาก ถอน และการโอนเงน เปyนตUน

4.1.2 คลาส

       โดยท)วไปโปรแกรมเชงอ5อบเจกต#แตLละโปรแกรมจะประกอบไปดUวยอ5อบเจกต# ท;เปyนชนดเด;ยวก)นหลายๆ
อ5อบเจกต# แตLอาจม;ขUอมVลหรอคJณล)กษณะท;ตLางก)นอาทเชLน โปรแกรมระบบจ)ดการบ)ญช;เงนฝากของธนาคารอาจม;
อ5อบเจกต# ชนดบ)ญช;หลายๆ อ5อบเจกต# โดยท;แตLละอ5อบเจกต#อาจจะม;ขUอมVลท;เปyนเลขท;บญช;หรอชอเจUาของบ)ญช;ท;ตLาง
                                                                                 )
ก)น โปรแกรมเชงอ5อบเจกต#จะม;คZาส)งในการสรUางอ5อบเจกต#โดยสรUางมาจากคลาส ซxงเปyนต)วกZาหนดนยามของ
อ5อบเจกต#วาจะตUองประกอบดUวยคJณล)กษณะและเมธอดใดบUาง
           L

       คลาสเปร;ยบเสมอนพมพ#เข;ยวของอ5อบเจกต# อ5อบเจกต#ท;ถVกสรUางมาจากคลาสบางคร)Yงจะเร;ยกวLาเปyน instance
ของคลาส ซxงอ5อบเจกต#ใดๆ จะตUองเปyน instance ของคลาสใดคลาสหนxง การเข;ยนโปรแกรมเชงอ5อบเจกต# ตUองม;การ
                                                                 
กZาหนดนยามของคลาสกLอนท;จะสามารถสรUางอ5อบเจกต# (หรอ instance) ของคลาสไดU ซxงคลาสหนxงคลาสสามารถท;
                                                                                          
จะสรUางอ5อบเจกต#ไดUหลายอ5อบเจกต# รVปท; 4.1 แสดงต)วอยLางของคลาส Student ซxงสรUางอ5อบเจกต#ขxYนมาสาม
อ5อบเจกต#ท;ชอ s1, s2 และ s3 เปyนตUน




94   หล)กการเชงอ5อบเจกต#                                                                  ผศ. ธนศา เครอไวศยวรรณ
รปท 4.1 ตวอย%างของอ-อบเจกตและคลาส

4.1.3 ค%ณลกษณะ

        คJณล)กษณะของอ5อบเจกต# คอขUอมVลท;เก5บอยVLในอ5อบเจกต# ซxงจะแบLงออกเปyนสองประเภท คอต)วแปร
(Variable) และคLาคงท; (Constant) โดยท;คJณล)กษณะท;เปyนต)วแปรจะสามารถเปล;ยนคLาไดU สLวนคJณล)กษณะท;เปyนคLา
คงท;จะไมLสามารถเปล;ยนคLาไดU รVปท; 4.2 แสดงต)วอยLางของอ5อบเจกต# s1,s2 และ s3 ท;เปyนอ5อบเจกต#ของคลาส
Student ซxงม;คJณล)กษณะของอ5อบเจกต#ท;เปyนรห)ส ชอ และคะแนนเฉล;ยสะสมท;ตLางก)น โดยกZาหนดในคLาของต)วแปร

id, name และ gpa ตามลZาด)บ




                                  รปท 4.2 ตวอย%างค(ณลกษณะของอ-อบเจกต




ผศ. ธนศา เครอไวศยวรรณ                                                                 หล)กการเชงอ5อบเจกต#   95
โปรแกรมเชงอ5อบเจกต#ไดUกZาหนดนยามคJณล)กษณะอ;กประเภทหนxง ท;เ ร;ยกวLา คJณล)กษณะของคลาส (Class
Data Value) ซxงจะเปyนคJณล)กษณะท;ทJกอ5อบเจกต#ใชUรวมก)น อาทเชLน คลาส Student อาจกZาหนดใหUม;คJณล)กษณะ
                                                   L
ของคลาสท;เปyนคLาคงท;ท;ชอ MIN_GPA เพอเก5บคLาคะแนนเฉล;ยสะสมข)นตZาของน)กศxกษาทJกคน ท)Yงน;น)กศxกษาทJกคนจะ
                                                                 Y                            Y
ตUองม;คาคะแนนเฉล;ยสะสมสVงกวLาคะแนนเฉล;ยสะสมข)นตZา การเก5บคJณล)กษณะท;เหมอนก)นเชLนน;YถากZาหนดใหUเปyน
       L                                             Y                                      U
คJณล)กษณะของอ5อบเจกต# จะทZาใหUสYนเปลองเนYอท;ในหนLวยความจZา ด)งแสดงใหUเห5นในรVปท; 4.3 แตLถUากZาหนดใหUเปyน
คJณล)กษณะของคลาส จะทZาใหUสามารถประหย)ดพYนท;ในหนLวยความจZาไดUด)งแสดงใหUเห5นในรVปท; 4.4




                           รปท   4.3 ค(ณลกษณะ MIN_GPA ซ4งเป5นค(ณลกษณะของอ-อบเจกต




96   หล)กการเชงอ5อบเจกต#                                                                 ผศ. ธนศา เครอไวศยวรรณ
รปท 4.4 ค(ณลกษณะ MIN_GPA ซ4งเป5นค(ณลกษณะของคลาส

4.1.4 เมธอด

         เมธอดเปyนวธ;การหรอการกระทZาท;นยามอยVLในคลาสหรออ5อบเจกต#เพอใชUในการจ)ดการก)บคJณล)กษณะของ
อ5อบเจกต#หรอคJณล)กษณะของคลาสอาทเชLน อ5อบเจกต#ชนดบ)ญช;เงนฝากอาจม;คณล)กษณะ balance เพอเก5บยอดเงน
                                                                      J
คงเหลอท;อยVLในบ)ญช; และอาจม;เมธอด deposit()เพอเปyนวธ;การในการฝากเงนใหUก)บอ5อบเจกต# ในเมธอดจะม;คZาส)ง
เพอจ)ดการก)บวธ;การฝากเงนและจะทZาการปร)บเปล;ยนคLาของคJณล)กษณะ balance เราสามารถเปร;ยบเท;ยบเมธอดไดU
ก)บฟwงก#ชน Procedure หรอ Subroutine ของโปรแกรมเชงกระบวนการ
          )

       การเข;ยนโปรแกรมเชงอ5อบเจกต#จะกZาหนดใหUอ5อบเจกต#ตLางๆ สอสารก)น โดยการผLานขLาวสาร (Message)
ระหวLางอ5อบเจกต#ท;เปyนผVUสLง (Sender) ก)บอ5อบเจกต#ท;เปyนผVUรบ (Receiver) โดยการเร;ยกใชUเมธอดอาทเชLน รVปท; 4.5
                                                              )
แสดงต)วอยLางของการสLงขLาวสารจากอ5อบเจกต# objA ท;เปyนผVสLง เพอเร;ยกการทZางานของเมธอด method4()ของ
                                                                U
อ5อบเจกต# objB ท;เปyนผVร)บ การสLงขLาวสารระหวLางก)นอาจม;การสLงขUอมVลจาก objA ผLานไปย)ง objB โดยผLานทาง
                        U
argument ของเมธอด (ต)วอยLางเชLน คLา 1 และ 2 ในรVปท; 4.5) และผVUร)บก5อาจสLงคLากล)บ (Return Value) มาย)งผVUสLง




ผศ. ธนศา เครอไวศยวรรณ                                                                      หล)กการเชงอ5อบเจกต#   97
รปท 4.5 ตวอย%างของการส%งข%าวสารระหว%างอ-อบเจกต

4.2 การเขยนโปรแกรมเช,งอ-อบเจกต.โดยใชภาษาจาวา
4.2.1 การประกาศคลาส

           โปรแกรมภาษาจาวาแตLละโปรแกรมจะประกอบไปดUวย คลาสอยLางนUอยหนxงคลาส โดยม;รVปแบบการประกาศ
                                                                     
ด)งน;Y
                   [modifier] class ClassName {
                       [class member]
                   }


โดยท;
           • modifier คอค;ย#เวร#ด (Keyword) ของภาษาจาวาท;ใชUเปyน access modifier เชLน public หรออธบาย
               คJณสมบ)ตอนๆ ของคลาส เชLน abstract และ final ซxงเปyนเงอนไขเพมเตม (Option)
           •   class คอค;ย#เวร#ดของภาษาจาวาเพอระบJวLาเปyนการประกาศคลาส

           •   ClassName คอชอของคลาสท;เปyนชอ identifier ใดๆ ท;สอดคลUองก)บกฎการต)Yงชอ

           •   class member คอเมธอดหรอคJณล)กษณะของคลาส


           ต)วอยLางการประกาศคลาส Student สามารถทZาไดUด)งน;Y
                   public class Student {

                   }




98       หล)กการเชงอ5อบเจกต#                                                          ผศ. ธนศา เครอไวศยวรรณ
4.2.2 การประกาศค%ณลกษณะ

         คJณล)กษณะของอ5อบเจกต# คอต)วแปรหรอคLาคงท;ซxงประกาศภายในอ5อบเจกต# โดยม;รVปแบบการประกาศด)งน;Y
j
               [modifier] dataType attributeName;

โดยท;
         • modifier คอค;ย#เวร#ดของภาษาจาวาท;อธบายคJณสมบ)ตตLางๆ   ของต)วแปรหรอคLาคงท;อาทเชLน public,
             private, static, final     และ transient เปyนตUน
         •   dataType คอชนดขUอมVลซxงอาจเปyนชนดขUอมVลแบบพYนฐานหรอชนดขUอมVลแบบอUางองท;จะกลLาวถxงในบท

             ตLอไป
         •   attributeName คอชอของคJณล)กษณะท;เปyนชอ identifier ใดๆ ซxงสอดคลUองก)บกฎการต)Yงชอ


      ต)วอยLางการประกาศคJณล)กษณะ id,      name   และ gpa ซxงม;ชนดขUอมVลเปyน String และ double ในคลาส
Student สามารถทZาไดUด)งน;Y


               public class Student {
                   public String id;
                   public String name;
                   public double gpa;
               }


4.2.3 การประกาศเมธอด

         ภาษาจาวากZาหนดรVปแบบของการประกาศเมธอดท;อยVLในคลาสไวUด)งน;Y
               [modifier] return_type methodName([arguments]) {
                   [method_body]
               }

โดยท;
     • modifier คอค;ย#เวร#ดของภาษาจาวาท;เปyน access modifier เชLน public หรอ private หรออธบาย
         คJณสมบ)ตอนๆ ของเมธอดเชLน abstract หรอ static เปyนตUน
     •   return_type คอชนดขUอมVลของคLาท;สLงกล)บหล)งจากเสร5จสYนการทZางานของคZาส)งในเมธอดน;Y โดยชนด

         ขUอมVลของคLาท;สLงกล)บอาจเปyนชนดขUอมVลแบบพYนฐานหรอชนดขUอมVลแบบอUางอง ในกรณ;ท;ไมLม;การสLงคLาใดๆ
         กล)บจะตUองระบJชนดขUอมVลเปyน void



ผศ. ธนศา เครอไวศยวรรณ                                                              หล)กการเชงอ5อบเจกต#   99
• methodName คอชอของเมธอดท;เปyนชอ identifier ใดๆ      ซxงสอดคลUองก)บกฎการต)Yงชอ
      •   arguments คอต)วแปรท;ใชUในการร)บขUอมVลท;อ5อบเจกต#สLงมาใหU โดยอาจม;มากกวLาหนxงต)วแปร หรอไมLม;เลย
                                                                                         
          ก5ไดUขนอยVLก)บการกZาหนดเมธอด
                xY
      •   method_body คอคZาส)งตLางๆ ของภาษาจาวาท;อยVLในเมธอด


          โปรแกรมท; 4.1 แสดงต)วอยLางโปรแกรมภาษาจาวาท;ประกาศคลาส Student โดยม;คJณล)กษณะคอ id,
name,     gpa และ MIN_GPA และม;เมธอดคอ setId(), setName(), setGpa() และ showDetails()


โปรแกรมท( 4.1 คลาส Student
  public class Student {
      public String id;
      public String name;
      public double gpa;
      public static final double MIN_GPA = 2.00;

           public void setId(String ID) {
               id = ID;
           }
           public void setName(String n) {
               name = n;
           }
           public void setGpa(double GPA) {
               gpa = GPA;
           }
           public void showDetails() {
               System.out.println("ID: "+id);
               System.out.println("Name: "+name);
               System.out.println("GPA: "+gpa);
           }
  }




เมธอด main()

       โปรแกรมภาษาจาวาท;เ ปyนโปรแกรมจาวาประยJกต# (Java Application) จะเรมตUนการทZางานในคลาสท;ม;
เมธอด main() โดยม;รปแบบของเมธอดด)งน;Y
                   V
                  public static void main (String args[]) {
                      [method_body]
                  }




100       หล)กการเชงอ5อบเจกต#                                                            ผศ. ธนศา เครอไวศยวรรณ
4.2.4 การประกาศและสรางอ-อบเจกต.

      อ5อบเจกต#ทJกอ5อบเจกต#ในโปรแกรมภาษาจาวาจะตUองม;คZาส)งประกาศเพอระบJวาอ5อบเจกต#น)Yนเปyนอ5อบเจกต#
                                                                          L
ของคลาสใด โดยม;รVปแบบด)งน;Y
                  [modifier] ClassName objectName;

โดยท;
         • modifier คอค;ย#เวร#ดท;อธบายคJณสมบ)ตตLางๆ ของอ5อบเจกต#
         • ClassName คอชอของคลาส
         • objectName       คอชอของอ5อบเจกต#ท;เปyนชอ identifier ใดๆ ซxงสอดคลUองก)บกฏการต)Yงชอ

     ต)วอยLางเชLน คZาส)ง
                        Student   s1;


       เปyนคZาส)งประกาศอ5อบเจกต# s1 ใหUเปyนอ5อบเจกต#ของคลาส Student ท)Yงน;คลาสท;ระบJในคZาส)งประกาศ
                                                                           Y
อ5อบเจกต#จะตUองเปyนคลาสท;ม;การนยามไวUแลUว กลLาวคอจะตUองม;คลาส Student ท;นยามไวUแลUว

      คZาส)งในการประกาศอ5อบเจกต#ไมLไดUเปyนคZาส)งท;ใชUในการสรUางอ5อบเจกต# คZาส)งท;ใชUในการสรUางอ5อบเจกต#จะม;
รVปแบบด)งน;Y
                  objectName = new ClassName([arguments]);


         โดยท;
         • objectName คอชอของอ5อบเจกต#
         • new   คอค;ย#เวร#ดของภาษาจาวาเพอใชUในการสรUางอ5อบเจกต#
         •   ClassName คอชอของคลาส

         •   arguments คอคLาท;ตUองการสLงผLานในการเร;ยกเมธอดในการสรUางอ5อบเจกต#ซxงอาจม;หรอไมLม;ก5ไดU


       การสรUางอ5อบเจกต#โดยเร;ยกใชUคZาส)ง new น;Yจะเปyนการเร;ยกใชUเมธอดในการสรUางอ5อบเจกต#ท;เร;ยกวLา
constructor ของคลาสน)นๆ ซxงจะม;การอธบายการทZางานของ constructor ในบทท; 6
                      Y

         ต)วอยLางคZาส)งในการสรUางอ5อบเจกต# s1 ทZาไดUด)งน;Y
                   s1 = new Student();




ผศ. ธนศา เครอไวศยวรรณ                                                                    หล)กการเชงอ5อบเจกต#   101
นอกจากน;คZาส)งในการประกาศและสรUางอ5อบเจกต#สามารถท;จะรวมเปyนคZาส)งเด;ยวก)นไดUโดยม;รVปแบบคZาส)ง
                 Y
ด)งน;Y
                  [modifier] ClassName objectName = new className([arguments]);

         อาทเชLน
                   Student s1 = new Student();



4.2.5 การเรยกใชสมาช,กของอ-อบเจกต.

       สมาชกของอ5อบเจกต#ประกอบดUวยคJณล)กษณะและเมธอด การเร;ยกใชUสมาชกของอ5อบเจกต#ทZาไดUโดยการใชU
เครองหมายจJด (.) กลLาวคอคJณล)กษณะของอ5อบเจกต#สามารถเร;ยกใชU โดยม;รVปแบบด)งน;Y
                  objectName.attributeName;


         โดยท;
         • objectName   คอชอของอ5อบเจกต#ท;สรUางขxYน
         •   attributeName คอชอของคJณล)กษณะของอ5อบเจกต#นน
                                                         )Y

       นอกจากน;เY ราสามารถท;จะสLงขLาวสารไปย)งอ5อบเจกต#ภายหล)งจากท;ม;การสรUางอ5อบเจกต#ขxYนมาไดUโดยการเร;ยก
ใชUเมธอดของอ5อบเจกต#นน รVปแบบคZาส)งในการเร;ยกใชUเมธอดม;ด)งน;Y
                      )Y
                  objectName.methodName([arguments]);

         โดยท;
         • objectName    คอชอของอ5อบเจกต#ท;สรUางขxYน
         •   methodName คอชอของเมธอดของอ5อบเจกต#นน    )Y
         •   arguments คอคLาท;ตUองการสLงผLานไปใหUก)บเมธอดของอ5อบเจกต#นน โดยท;จะตUองม;ชนดขUอมVลและ
                                                                       )Y
             จZานวน argument ใหUสอดคลUองก)บท;ประกาศในเมธอดของอ5อบเจกต#น)Yน

         ต)วอยLางเชLน คZาส)ง
                   s1.setName(“Thana”);


      เปyนการเร;ยกใชUเมธอด setName() ของอ5อบเจกต# s1 ซxงเปyนอ5อบเจกต#ของคลาส Student โดยจะสLงผLาน
argument ชนด String ท;ม;คLาเปyนขUอความ Thana ใหUก)บเมธอดด)งกลLาว โปรแกรมท; 4.2 แสดงต)วอยLางโปรแกรม




102      หล)กการเชงอ5อบเจกต#                                                             ผศ. ธนศา เครอไวศยวรรณ
ของคลาส Sample ท;ม;เมธอด main()อยVL โดยโปรแกรมน;จะสรUางอ5อบเจกต#ของคลาส Student ขxนมาสามอ5อบเจกต#
                                                   Y                                  Y
คอ อ5อบเจกต# s1, s2 และ s3 จากน)นจะทZาการเร;ยกเมธอด setName() เพอกZาหนดคLาใหUกZาหนดคLาใหUก)บ
                                Y
คJณล)กษณะ name ของอ5อบเจกต#แตLละต)ว ซxงผลล)พธ#ของโปรแกรมน;จะไดUอ5อบเจกต#ด)งแสดงใน รVปท; 4.6
                                                           Y


โปรแกรมท( 4.2 คลาส Sample ท%เร%ยกใชเมธอดของคลาส Student
   public class Sample {
       public static void main(String args[]) {
           Student s1 = new Student();
           Student s2 = new Student();
           Student s3 = new Student();
           s1.setId("1234");
           s1.setName("Thana");
           s1.setGpa(3.25);
           s2.setId("1122");
           s2.setName("Somchai");
           s2.setGpa(2.90);
           s3.setId("2211");
           s3.setName("Somsri");
           s3.setGpa(3.00);
       }
   }




                                 รปท 4.6 ผลลพธของโปรแกรมท 4.2



ผศ. ธนศา เครอไวศยวรรณ                                                        หล)กการเชงอ5อบเจกต#   103
4.3 ค%ณลกษณะเด0นของโปรแกรมเช,งอ-อบเจกต.

        โปรแกรมเชงอ5อบเจกต# จะม;คJณล)กษณะเดLนอยVLสามประการคอ การหLอหJUม (Encapsulation) การสบทอด
(Inheritance) และการม;ไดUหลายรVปแบบ (Polymorphism)

4.3.1 การห0อห%ม

        หล)กการท;สZาค)ญประการหนxงของการเข;ยนโปรแกรมเชงอ5อบเจกต#คอการหLอหJUม ซxงคJณล)กษณะของอ5อบเจกต#
จะถVกหLอหJมอยVLภายใน เพอไมLใหUอ5อบเจกต#อนๆ สามารถเขUาถxงขUอมVลท;เปyนคJณล)กษณะไดUโดยตรง การจะเร;ยกใชUคJณ -
          U
ล)กษณะของอ5อบเจกต#จะทZาไดUโดยการเร;ยกผLานเมธอดเทLาน)นด)งแสดงในรVปท; 4.7
                                                       Y




                                       รปท 4.7 หลกการของการห%อห(*ม

         อ5อบเจกต#แตLละอ5อบเจกต#จะประกอบไปดUวยสLวนท;เปyน interface และสLวนท;เปyน implementation สLวนท;
เปyน interface คอสLวนของอ5อบเจกต#ท;อนJญาตใหUอ5อบเจกต#อนสามารถเร;ยกใชUงานไดU ซxงในภาษาจาวาก5คอคJณล)กษณะ
หรอเมธอดท;ถVกประกาศใหUม; access modifier เปyน public สZาหร)บสLวนท;เปyน implementation คอสLวนของ
อ5อบเจกต#ท;ไมLสามารถเขUาถxงไดUจากภายนอก อ5อบเจกต#อนๆ จะไมLสามารถเห5นสLวนท;เปyน implementation ของ
อ5อบเจกต#ไดU ในภาษาจาวาก5คอคJณล)กษณะหรอเมธอดท;ถVกประกาศใหUม; access modifier เปyน private

       การเข;ยนโปรแกรมเชงอ5อบเจกต#โดยใชUหล)กการของการหLอหJUม สามารถทZาไดUโดยกZาหนดใหUคJณล)กษณะของ
อ5อบเจกต#ม; access modifier เปyน private และกZาหนดใหUเมธอดท;สามารถเร;ยกจากอ5อบเจกต#ภายนอกไดUม; access
modifier เปyน public ด)งแสดงต)วอยLางในโปรแกรมท; 4.3




104    หล)กการเชงอ5อบเจกต#                                                               ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท 4.3 การใชUหล)กการของการหLอหJUม

   public class Student {
       private String id;
       private String name;
       private double gpa;
       private static final double MIN_GPA = 2.00;

        public void setId(String ID) {
            id = ID;
        }
        public void setName(String n) {
            name = n;
        }
        public void setGpa(double GPA) {
            gpa = GPA;
        }
        public void showDetails() {
            System.out.println("ID: "+id);
            System.out.println("Name: "+name);
            System.out.println("GPA: "+gpa);
        }
   }



        ขUอด;ของการหLอหJUมคอ
        • การซLอนเรUนขUอมVล (Information Hiding) ทZาใหUอ5อบเจกต#สามารถตดตLอก)บอ5อบเจกต#ภายนอกผLานเมธอด
           ท;เปyนสLวนของ interface เทLาน)น ซxงถUาม;การเปล;ยนแปลงคJณล)กษณะหรอเมธอดท;อยVLภายในอ5อบเจกต# ก5จะ
                                          Y
           ไมLม;ผลกระทบใดๆ ตLออ5อบเจกต#ภายนอกท;เร;ยกใชU
        • ความเปyนโมดVล (Modularity) การพ)ฒนาโปรแกรมเชงอ5อบเจกต#จะสามารถกZาหนดใหUอ5อบเจกต#แตLละ
           อ5อบเจกต#ม;ความเปyนอสระตLอก)น ถUาม;การเปล;ยนแปลงเกดขxYนภายในอ5อบเจกต#หนxงก5จะไมLมผลกระทบตLอ
                                                                                                ;
           อ5อบเจกต#อน

        เครองโทรศ)พท#เปyนต)วอยLางหนxง ของการแสดงคJณล)กษณะเดLนดUานการหLอหJUมของอ5อบเจกต# สLวนท;เปyน
                                       
interface ก5คอปJšมของโทรศ)พท#ท;ผVUใชUสามารถตดตLอก)บเครองไดU สZาหร)บระบบอเล5กทรอนกส#ท;อยVLในเครองโทรศ)พท#
คอสLวนท;เปyน implementation ซxงผVUใชUไมLสามารถมองเห5นและไมLจZาเปyนตUองเขUาใจการทZางานของระบบด)งกลLาว และ
หากระบบอเล5กทรอนกส#ภายในเปล;ยนแปลงไป ผVใชUย)งสามารถท;จะตดตLอก)บเครองไดUโดยใชUปJšมท;เปyนสLวน interface
                                               U
เชLนเดม




ผศ. ธนศา เครอไวศยวรรณ                                                                 หล)กการเชงอ5อบเจกต#   105
4.3.2 การสบทอด

         คJณล)กษณะเดLนประการหนxงของการโปรแกรมเชงอ5อบเจกต#คอ ความสามารถท;จะนZาเอาโปรแกรมท;ออกแบบ
                                   
ไวUแลUวมาใชUใหมLไดU ซxงสZาหร)บโปรแกรมเชงกระบวนการจะทZาไดUโดยการกZาหนดคZาส)งท;ตUองใชUบLอยไวUในโปรแกรม
ยLอย (ฟwงก#ชน หรอ Procedure) ซxงจะม;ความซ)บซUอนในการออกแบบเพอใหUไดUโปรแกรมยLอยท;เหมาะสม ทZาใหUการนZา
            )
โปรแกรมมาใชUใหมLของโปรแกรมเชงกระบวนการคLอนขUางจะเปyนไปไดUยากกวLา และเมอโปรแกรมม;ความซ)บซUอนขxYน
การนZาโปรแกรมมาใชUใหมLก5เปyนไปไดUยากขxน เนองจากเราไมLสามารถออกแบบโปรแกรมครอบคลJมปwญหาท)Yงหมด ไวU
                                         Y
ลLวงหนUาไดU

        วธ;การนZาโปรแกรมมาใชUใหมLของโปรแกรมเชงอ5อบเจกต# จะใชUหล)กการของการสบทอด ซxงเปyนการนยาม
คลาสใหมLจากรVปแบบของคลาสท;ม;อยVLแลUว โดยคลาสใหมLจะนZาคJณล)กษณะและเมธอดของคลาสเดมมาใชUไดU โดยท)วไป
คลาสตLางๆ ท;ม;อยVLจะม;โครงสรUางท;ม;ความส)มพ)นธ#ก)นตามลZาด)บช)Yน เราสามารถท;จะออกแบบโปรแกรมเชงอ5อบเจกต#
เพอสรUางคลาสท;เปyนคลาสแบบท)วไป (Generalized Class) ซxงจะม;คJณล)กษณะและเมธอดเพอใหUคลาสอนๆ ท;เปyน
คลาสเฉพาะ (Specific Class) สบทอดไดU คลาสท;เปyนคลาสแบบท)วไปจะเร;ยกวLาเปyน superclass หรอ parent class
สLวนคลาสท;เปyนคลาสเฉพาะท;สบทอดมาจะเร;ยกวLาเปyน subclass หรอ child class

       รVปท; 4.8 แสดงต)วอยLางของคลาสท;ใชUหล)กการของการสบทอด ต)วอยLางน;จะม;คลาส Student เปyนคลาสแบบ
                                                                         Y
ท)วไป และม;คลาส GradStudent, PartTimeStudent และ FullTimeStudent สบทอดมาจากคลาส Student
และคลาส PhDStudent จะสบทอดมาจากคลาส GradStudent อ;กช)Yนหนxง การสบทอดจะม;ผลใหUคJณล)กษณะและ
เมธอดของ Superclass สบทอดไปย)ง Subclass ต)วอยLางเชLน ถUาคลาส Student ในรVปท; 4.8 ม;คJณล)กษณะ id,
name, gpa และ MIN_GPA และม;เมธอด setId(), setName(), setGpa() และ showDetails() คลาส

GradStudent, PartTimeStudent และ FullTimeStudent ก5จะสบทอดคJณล)กษณะและเมธอดเหลLาน)นมาดUวย      Y
นอกจากน;คลาส PhDStudent ท;สบทอดมาจากคลาส GradStudent ก5จะไดUรบคJณล)กษณะและเมธอดท;สบทอดมา
          Y                                                            )
จากคลาส Student ท;เปyน superclass ของคลาส GradStudent ดUวย

       ขUอด;ของการสบทอดคอ ความสามารถในการท;จะนZาโปรแกรมเดมมาพ)ฒนาเพมเตมใหมLไดUงLายขxน และย)งชLวย
                                                                                         Y
ทZาใหUโปรแกรมแตLละโปรแกรมม;ขนาดเล5ก ซxงทZาใหUงLายตLอการเขUาใจและการปร)บปรJงแกUไขโปรแกรมทZาไดUงLายขxน
                                                                                                    Y
โดยในภาษาจาวาจะใชUคย#เวร#ด extends เพอระบJการสบทอด โปรแกรมท; 4.4 แสดงต)วอยLางของคลาสท;ใชUหล)กการ
                     ;
ในการสบทอดตามไดอะแกรมของคลาสในรVปท; 4.8




106   หล)กการเชงอ5อบเจกต#                                                            ผศ. ธนศา เครอไวศยวรรณ
รปท 4.8 ตวอย%างของคลาสทใช*หลกการของการส0บทอด


โปรแกรมท 4.4 ต)วอยLางการใชUหล)กการในการสบทอด
   public class PartTimeStudent extends Student { }

   ------------------------------------------------------
   public class FullTimeStudent extends Student { }

   ------------------------------------------------------
   public class GradStudent extends Student {
       private String thesisTitle;
       private String supervisor;
       public void setThesisTitle(String t) {
           thesisTitle = t;
       }
       public void setSupervisor(String s) {
           supervisor = s;
       }
   }

   ------------------------------------------------------
   public class PhDStudent extends GradStudent {
       public boolean passQualify;
       public boolean isPassQualify() {
           return passQualify;
       }
   }




4.3.3 การมไดหลายรปแบบ

     หล)กการของการม;ไดUหลายรVปแบบคอ คJณสมบ)ตของโปรแกรมเชงอ5อบเจกต#ท;สามารถตอบสนองตLอขLาวสาร
(เมธอด) เด;ยวก)นดUวยวธ;การท;ตLางก)น และสามารถกZาหนดอ5อบเจกต#ไดUหลายรVปแบบ หล)กการของการม;ไดUหลายรVป




ผศ. ธนศา เครอไวศยวรรณ                                                            หล)กการเชงอ5อบเจกต#   107
แบบเปyนหล)กการท;สบเนองมาจากหล)กการของการสบทอด ต)วอยLางเชLน รVปท; 4.9 ม;คลาส Ball ซxงเปyน superclass
ของคลาส SoccerBall และ TennisBall




                                      รปท 4.9 ตวอย%างของคลาส Ball

       คลาส Ball อาจม;เมธอด throwBall() เพอกZาหนดพฤตกรรมการโยนลVกบอล ซxง subclass ท;ชอ
SoccerBall และ TennisBall อาจกZาหนดวธ;การการโยนลVกบอลแตLละชนดท;ตLางก)นกลLาวคอเข;ยนคZาส)งในเมธอด

throwBall() ท;สบทอดมาดUวยชJดคZาส)งท;ตLางก)นด)งแสดงในโปรแกรมท; 4.5 หล)กการของการม;ไดUหลายรVปแบบย)ง

รวมไปถxงความ สามารถท;จะอUางองอ5อบเจกต#ท;สบทอดมาไดUหลายรVปแบบ ต)วอยLางเชLนคลาส SoccerBall ท;สบทอด
มาจากคลาส Ball สามารถท;จะอUางองอ5อบเจกต#ของคลาส SoccerBall ไดUท)YงในรVปแบบของ SoccerBall หรอ
Ball ไดU ต)วอยLางเชLนคZาส)ง

                  SoccerBall b2 = new SoccerBall();
                  Ball b3 = new SoccerBall();


          ซxงขUอด;ของการใชUหล)กการของการม;ไดUหลายรVปแบบคอ ทZาใหUโปรแกรมสามารถปร)บเปล;ยนหรอเพมเตมไดU
งLายขxน
      Y




108       หล)กการเชงอ5อบเจกต#                                                         ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท( 4.5 ต)วอยางการใชหล)กการของการม%ไดหลายร1ปแบบ

  public class Ball {
      public void throwBall() { }
  }

  --------------------------------------------------------------
  public class SoccerBall extends Ball {
      public void throwBall() {
          System.out.println(“Throwing soccerball”);
      }
  }

  --------------------------------------------------------------
  public class TennisBall extends Ball {
      public void throwBall() {
          System.out.println(“Throwing tennisball”);
      }
  }

  --------------------------------------------------------------
  public class TestBall {
      public static void main(String args[]) {
          Ball b1 = new Ball();
          SoccerBall b2 = new SoccerBall();
          Ball b3 = new SoccerBall();
      }
  }




4.4 การเขยนโปรแกรมเช,งอ-อบเจกต.เพอสรางคลาสแบบ abstract และอ,นเตอร.เฟส

      โปรแกรมเชงอ5อบเจกต#นอกเหนอจากการนยามคลาสแลUว ในบางกรณ;เราอาจจZาเปyนท;จะตUองนยามเมธอดตLางๆ
                                                                                   
ภายในคลาส ขxนมากLอนไดU โดยย)งไมLตUองระบJคZาส)งหรอวธ;การของคลาสน)น อาทเชLนเราอาจตUองการกZาหนดคลาสชอ
            Y                                                      Y
Vehicle (ยานพาหนะ) ซxงอาจม;เมธอดท;ชอ move() อยVL ท)Yงน;อาจม;คลาสอนๆท;จะสบทอดจาก Vehicle เชLน Car
                                                          Y
หรอ Motorbike ซxงจะม;วธ;การหรอคZาส)งในการ move() ท;แตกตLางก)นภาษาจาวาไดUกZาหนดคลาสล)กษณะน;YไวUสอง
แบบคอ คลาสแบบ abstract และอนเตอร#เฟส

4.4.1 คลาสแบบ abstract

      คลาสท;ม; modifier เปyน abstract จะหมายความวLาคลาสน)Yนย)งเปyนคลาสท;ไมLสมบVรณ# โดยม;เมธอดแบบ
abstract ซxงเปyนเมธอดท;ย)งไมLสมบVรณ#อยLางนUอยหนxงเมธอดอยVLในคลาส เมธอดแบบ abstract จะม;รVปแบบการ




ผศ. ธนศา เครอไวศยวรรณ                                                           หล)กการเชงอ5อบเจกต#   109
ประกาศด)งน;Y
           [modifier] abstract return_type methodName([arguments]);


      ท)Yงน;Yเมธอดแบบ abstract เปyนเมธอดท;ย)งไมLสมบVรณ# เนองจากไมLม;บล5อกคZาส)ง ({ }) อยVLภายในเมธอด
โปรแกรมท; 4.6 แสดงต)วอยLางของคลาส Student ท;เปyนคลาสแบบ abstract คลาสน;จะม;เมธอด
                                                                                 Y
showDetails() ซxงเปyนเมธอดแบบ abstract อยVLภายในคลาส



โปรแกรมท 4.6 ต)วอยLางคลาสแบบ abstract

  public abstract class Student {
        protected String id;
        protected String name;
        protected double gpa;
        public void setId(String ID) {
           id = ID;
        }
        public void setName(String n) {
           name = n;
        }
        public void setGpa(double GPA) {
           gpa = GPA;
        }
        public abstract void showDetails();
  }




         คลาสแบบ abstract กZาหนดขxนมาเพอใหUคลาสอนสบทอด โดยคลาสท;มาสบทอดจะตUองกZาหนดบล5อก
                                            Y
คZาส)งในเมธอดท;ย)งไมLสมบVรณ# ท)Yงน;เY ราจะไมLสามารถจะสรUางอ5อบเจกต#ของคลาสแบบ abstract ไดU โปรแกรมท; 4.7
แสดงต)วอยLางของคลาส FullTimeStudent ท;สบทอดมาจากคลาส Student คลาสน;YจะตUองม;การกZาหนดบล5อก
คZาส)งในเมธอด showDetails() เพอทZาใหUเปyนเมธอดท;สมบVรณ# ซxงจะทZาใหUคลาส FullTimeStudent เปyนคลาส
ท;สามารถใชUในการสรUางอ5อบเจกต#ไดU อนxงถxงแมUวาเราจะไมLสามารถสรUางอ5อบเจกต#ของคลาส Student ไดUแตLเรา
                                                   L
สามารถประกาศอ5อบเจกต#ของคลาส Student และสรUางอ5อบเจกต#ของคลาส FullTimeStudent ไดUตามหล)กการ
ของการม;ไดUหลายรVปแบบด)งน;Y
                 Student s1 = new FullTimeStudent();




110    หล)กการเชงอ5อบเจกต#                                                              ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท 4.7 ต)วอยLางคลาสท;สบทอดมาจากคลาสแบบ abstract

   public class FullTimeStudent extends Student {
         private int credit;
         private final int MAX_YEAR = 4;
         public FullTimeStudent(int c) {
               credit = c;
         }
         public void showDetails() {
               System.out.println("ID: "+id);
               System.out.println("Name: "+name);
               System.out.println("GPA: "+gpa);
               System.out.println("Credit: "+credit);
         }
   }




4.4.2 อ,นเตอร.เฟส

         อนเตอร#เฟส (interface) ม;ล)กษณะคลUายก)บคลาสแบบ abstract แตLจะประกอบดUวยเมธอดท;ย)งไมLสมบVรณ#
เทLาน)น โดยม;รVปแบบด)งน;Y
      Y
                 [modifier] interface InterfaceName {
                     [methods();]
                 }

        โดยท;
        • InterfaceName คอชอของอนเตอร#เฟส
        • methods() เปyนเมธอดท;ย)งไมLสมบVรณ# เชLนเด;ยวก)บเมธอดแบบ abstract แตLไมLตUองใชUค;ยเวร#ด
                                                                                            #
            abstract


         โปรแกรมท; 4.8 แสดงต)วอยLางของกรณ;กZาหนดอนเตอร#เฟส Student อนเตอร#เฟสน;Yจะม;เมธอด 4 เมธอดท;
ย)งไมLม;บล5อกคZาส)งคอเมธอด setId(), setName(), setGpa() และ showDetails()




ผศ. ธนศา เครอไวศยวรรณ                                                              หล)กการเชงอ5อบเจกต#   111
โปรแกรมท 4.8 ต)วอยLางอนเตอร#เฟส

  public interface Student {
        public void setId(String ID);
        public void setName(String n);
        public void setGpa(double GPA);
        public void showDetails();
  }




       อนเตอร#เฟสกZาหนดขxนมาเพอใหUคลาสอนนZาไปใชUงานโดยใชUค;ย#เวร#ด implements โดยม;รปแบบด)งน;Y
                         Y                                                            V
              [modifier] class ClassName implements InterfaceName {
                  [methods();]
              }

        โปรแกรมท; 4.9 ไดUแสดงต)วอยLางของคลาส PartTimeStudent ท; implements อนเตอร#เฟส Student
คลาสท; implements อนเตอร#เฟสจะตUองเข;ยนบล5อกคZาส)งในเมธอดทJกเมธอดท;กZาหนดไวUในอนเตอร#เฟส เพอทZาใหU
เมธอดเหลLาน;สมบVรณ# และสามารถสรUางอ5อบเจกต#ของคลาสน)YนไดU
            Y
       อนเตอร#เฟสจะเหมอนก)บคลาสแบบ abstract ตรงท;เราจะไมLสามารถสรUาง อ5อบเจกต#ของอนเตอร#เฟสไดU
ประโยชน#ของอนเตอร#เฟสก5คอการกZาหนดรVปแบบของเมธอดตLางๆ ท;คลาสอนๆ จะตUอง implements ไวUลวงหนUา ซxง
                                                                                          L
สามารถอาศ)ยหล)กการของการม;ไดUหลายรVปแบบมาเร;ยกใชUเมธอดเหลLาน)นไดUจากคลาสท; implements อนเตอร#เฟส
                                                             Y
อาทเชLน คZาส)ง
                Student s1 = new PartTimeStudent(6);
                s1.setId(“1111”);
                s1.setName(“Thana”);
                s1.setGpa(3.00);
                s1.showDetails();

       อนเตอร#เฟสย)งชLวยในการสบทอดแบบหลายคลาสไดU (Multiple Inheritance) เนองจากภาษาจาวากZาหนด
ใหUคลาสใดๆ สามารถสบทอดคลาสอนไดUเพ;ยงคลาสเด;ยวเทLาน)น แตLจะสามารถ implements อนเตอร#เฟสไดUหลาย
                                                    Y
อนเตอร#เฟส อาทเชLน
                public class MyApplet extends Applet implements
                                 MouseListener,ActionListener {
                      ...
                }
       เปyนโปรแกรมจาวาแอปเพล5ตท;สบทอดมาจากคลาส Applet แตLขณะเด;ยวก)นเปyนคลาสท; implements
อนเตอร#เฟส MouseListener และ ActionListener เปyนตUน


112   หล)กการเชงอ5อบเจกต#                                                           ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท 4.9 ต)วอยLางคลาสท; implements อนเตอร#เฟส

   public class PartTimeStudent implements Student {
         private String id;
         private String name;
         private double gpa;
         private int credit;
         private final int MAX_YEAR = 8;
         public PartTimeStudent(int c) {
               credit = c;
         }
         public void setId(String ID) {
               id = ID;
         }
         public void setName(String n) {
               name = n;
         }
         public void setGpa(double GPA) {
               gpa = GPA;
         }
         public void showDetails() {
               System.out.println(“ID: “+id);
               System.out.println(“Name: “+name);
               System.out.println(“GPA: “+gpa);
               System.out.println(“Credit: “+credit);
         }
   }




4.5 แพคเก-จ

        แพคเก5จจะเปyนท;รวบรวมคลาสและอนเตอร#เฟสตLางๆ ท;ม;หนUาท;การทZางานคลUายก)นไวUในท;เด;ยวก)น โดยท)วไป
                       
โปรแกรมภาษาจาวาจะประกอบไปดUวยคลาสหลายคลาสท;ประกาศอยVLในโปรแกรมไฟล#ตLางๆ ไฟล#โปรแกรมภาษา
จาวาแตLละไฟล#อาจม;คลาสท;ประกาศไวUหลายคลาสไดU แตLจะม;คลาสท;ม; access modifier เปyน public ไดUเพ;ยง
คลาสเด;ยว ซxงวธ;การปฏบ)ตท;นยมใชUคอการกZาหนดใหUในแตLละโปรแกรมไฟล#ม;คลาสเพ;ยงคลาสเด;ยว โดยม;ชอไฟล#เปyน
ชอเด;ยวก)บชอคลาส

       การจ)ดระบบไฟล#และคลาสจxงจZาเปyนอยLางยงสZาหร)บการพ)ฒนาโปรแกรมขนาดใหญL เราสามารถท;จะแบLง
โปรแกรมใหUเปyนแพคเก5จตLางๆ โดยจ)ดกลJLมของคลาสท;ทZางานคลUายก)นไวUในแพคเก5จเด;ยวก)น แพคเก5จแตLละแพคเก5จ
จะใชUในการเก5บคลาสหรอแพคเก5จยLอยไดU



ผศ. ธนศา เครอไวศยวรรณ                                                               หล)กการเชงอ5อบเจกต#   113
ซxงโปรแกรมจาวาจะสรUางไดเร5กทอร; (Directory) ท;ม;ชอเด;ยวก)บแพคเก5จ ในการเก5บคลาสหรอแพคเก5จยLอย
เหลLาน)น รVปท; 4.10 แสดงต)วอยLางโครงสรUางไดเร5กทอร;ของโปรแกรมท;มคลาสและแพคเก5จหลายๆ ต)ว โปรแกรมจะ
       Y                                                               ;
อยVLในแพคเก5จ faculty ซxงจะประกอบดUวย แพคเก5จยLอย 3 แพคเก5จคอ domain, GUI และ reports โดย
โปรแกรม Student.class, Teacher.class และ Subject.class จะอยVLในแพคเก5จยLอย domain สLวน
โปรแกรม Report.class จะอยVLในแพคเก5จยLอย reports




                                         รปท 4.10 ตวอย%างแพคเก-จ

4.5.1 การประกาศและใชแพคเก-จ

       โครงสรUางโปรแกรมไฟล#ของภาษาจาวาจะประกอบดUวยคZาส)งด)งน;Y
                [<package_declaration>]
                [<import_declaration>]
                [<class_declaration>]


       โดยท;
       • package_declaration        เปyนการระบJวาโปรแกรมไฟล#อยVLในแพคเก5จใด
                                                  L
       • import_declaration         เปyนคZาส)งในการเร;ยกใชUแพคเก5จอนๆ
       • class_declaration          เปyนคZาส)งในการประกาศคลาส

       คZาส)งในการระบJแพคเก5จจะม;รปแบบด)งน;Y
                                   V



114   หล)กการเชงอ5อบเจกต#                                                               ผศ. ธนศา เครอไวศยวรรณ
package <package_name>[<sub_package_name>]


        ต)วอยLางเชLน
                 package faculty.domain;
        หรอ
                 package faculty;


        โปรแกรมไฟล#หนxงไฟล#จะม;คZาส)ง package ไดUเพ;ยงคZาส)งเด;ยว โดยจะตUองเปyนคZาส)งแรกของโปรแกรม ใน
กรณ;ท;ไมLม;คZาส)ง package โปรแกรมไฟล#นนจะถVกกZาหนดไวUในแพคเก5จ default
                                          )Y

        การเร;ยกใชUแพคเก5จอน ๆ จะทZาไดUโดยการใชUคZาส)ง import ซxงม;รVปแบบของคZาส)งด)งน;Y
               import <package_name>[.<sub_package_name>].<Class_name>
        หรอ
               import <package_name>[.<sub_package_name>].*;



        ต)วอยLางเชLน
                 import faculty.reports.Report;

        หรอ
                 import java.awt.*;


      คZาส)ง import จะตUองกZาหนดไวUกLอนคZาส)งการประกาศคลาส ซxงโปรแกรมไฟล#ภาษาจาวาแตLละโปรแกรม
สามารถม;คZาส)ง import ไดUหลายคZาส)ง


4.6 Unified Modeling Language

        Unified Modeling Language (UML) เปyนภาษาท;ใชUรVปกราฟmกเพอจZาลองระบบซอฟต#แวร# UML ถVก
พ)ฒนาขxนเพอจZาลองโปรแกรมเชงอ5อบเจกต#ในตUนทศวรรษท; 1990 ซxงในปwจจJบ)น UML ไดUกลายเปyนมาตรฐานท;ใชUใน
         Y
การจZาลองระบบซอฟต#แวร#ตามขUอกZาหนดของ OMG (Object Management Group) หน)งสอเลLมน;จะใชUส)ญล)กษณ#
                                                                                        Y
ของ UML ในการจZาลองระบบโปรแกรมตLางๆ แตLเนองจาก UML เปyนภาษาท;ม;ขUอกZาหนดตLางๆ มาก ด)งน)YนเนYอหา
ในบทน;จะกลLาวถxงเฉพาะสLวนตLางๆ ท;จZาเปyนตLอความเขUาใจท;จะใชUในหน)งสอเลLมน;เY ทLาน)น
       Y                                                                            Y




ผศ. ธนศา เครอไวศยวรรณ                                                                   หล)กการเชงอ5อบเจกต#   115
4.6.1 ไดอะแกรมของคลาส

          ไดอะแกรมของคลาส (Class Diagram) เปyนส)ญล)กษณ#ท;ใชUแสดงคลาสใน UML โดยไดอะแกรมของคลาส
จะประกอบดUวยสLวนตLางๆ สามสLวนคอ ชอของคลาส คJณล)กษณะภายในคลาส และเมธอดภายในคลาส ด)งแสดงในรVป
ท; 4.11 ไดอะแกรมของคลาสจะระบJขUอมVลตLางๆ สZาหร)บคJณล)กษณะภายในคลาสคอ ชอของคJณล)กษณะ ชนดขUอมVล
สถานะการเขUาถxง (access modes) และคLาเรมตUน สLวนเมธอดภายในคลาสจะระบJถxงสถานะการเขUาถxง ชอของเมธอด
ชนดขUอมVลของ argument และชนดขUอมVลของคLาท;สLงกล)บ สZาหร)บสถานะการเขUาถxง UML ไดUกZาหนดส)ญล)กษณ#ตLางๆ
ไวUด)งน;Y
          + สZาหร)บ public
          - สZาหร)บ private




                                 รปท 4.11 ตวอย%าง UML ของคลาส Student

       ไดอะแกรมของคลาสสามารถท;จะแสดงความส)มพ)นธ#ของคลาส ท;ม;การสบทอดก)น โดยการใชUลVกศรเปyน
ส)ญล)กษณ#ด)งแสดงต)วอยLางในรVปท; 4.8 นอกจากน;Yไดอะแกรมของคลาสย)งสามารถท;จะแสดงความส)มพ)นธ#หรอแสดง
คJณสมบ)ตอนๆ เชLน แสดงวLาเปyนคลาสแบบ interface ไดUอ;กดUวย

4.6.2 ไดอะแกรมของอ-อบเจกต.

       UML      สามารถท;จะแสดงใหUเห5นไดUวาอ5อบเจกต#ท;สรUางขxนมาเปyนอ5อบเจกต#ของคลาสใด และม;คาของคJณ -
                                          L                   Y                                 L
ล)กษณะตLางๆ อยLางไร โดยใชUไดอะแกรมของอ5อบเจกต# (Object Diagram) ท;ประกอบไปดUวยสLวนตLางๆ สองสLวน
คอ สLวนท;ระบJชอของอ5อบเจกต# และสLวนท;ระบJคLาของคJณล)กษณะภายในอ5อบเจกต# ด)งต)วอยLางในรVปท; 4.12 ซxงเปyนการ



116    หล)กการเชงอ5อบเจกต#                                                                ผศ. ธนศา เครอไวศยวรรณ
แสดงอ5อบเจกต# s1 และ s2 ของคลาส Student จากรVปจะเห5นไดUวาส)ญล)กษณ#ลVกศรท;เปyนเสUนปะจะเปyนการระบJวา
                                                        L                                         L
อ5อบเจกต# s1 เปyนอ5อบเจกต#ของคลาส Student




                        รปท 4.12 ไดอะแกรมของอ-อบเจกต s1 และ s2 ของคลาส Student

4.7 ขนตอนการพฒนาโปรแกรม

       การพ)ฒนาโปรแกรมคอมพวเตอร# ไมLไดUหมายถxงเพ;ยงแคLการเข;ยนโปรแกรมคZาส)งภาษาคอมพวเตอร#ภาษาใด
ภาษาหนxง แตLจะรวมถxงข)นตอนท)Yงหมดในการพ)ฒนาโปรแกรม ซxงข)นตอนการพ)ฒนาโปรแกรมน;Yเร;ยกวLา ว)ฎจ)กรการ
                       Y                                  Y
พ)ฒนาโปรแกรม (Software Development Life Cycle เร;ยกยLอวLา SDLC) ซxงจะประกอบไปดUวยข)นตอนตLางๆ 5
                                                                                     Y
ข)Yนตอนคอ
       1. ข)นตอนการวเคราะห# (Analysis)
             Y
       2. ข)นตอนการออกแบบ (Design)
               Y
       3. ข)นตอนการเข;ยนโปรแกรม (Programming)
                 Y
       4. ข)นตอนการทดสอบ (Testing)
                   Y
       5. ข)นตอนการทZางาน (Operation)
                     Y

        ซxงแตLละข)Yนตอนม)กไมLไดUผลล)พธ#ท;สมบVรณ#ท;จะสามารถทZาข)YนตอนตLอไปไดU โดยไมLตUองกล)บมาทZาข)Yนตอนเดม
อ;ก แตLระหวLางทZางานในแตLละข)YนตอนอาจตUองยUอนกล)บไปทZางานในข)นตอนอนๆ กLอนหนUาน)นด)งแสดงรVปท; 4.13
                                                                    Y                   Y




ผศ. ธนศา เครอไวศยวรรณ                                                                 หล)กการเชงอ5อบเจกต#   117
รปท 4.13 ขนตอนการพฒนาโปรแกรม

       ข)นตอนการวเคราะห# เปyนการศxกษาความเปyนไปไดU (feasibility study) ของปwญหาท;ตUองการพ)ฒนาโปรแกรม
         Y
ท;มพ)ฒนาโปรแกรมจะทZาการวเคราะห#ปwญหาและพจารณาวLาสามารถท;จะพ)ฒนาโปรแกรมคอมพวเตอร#เพอแกUไข
ปwญหาไดUหรอไมL ผลล)พธ#ท;ไดUจากข)นตอนน;คอขUอกZาหนดตามความตUองการ (requirement specification) ซxงจะ
                                 Y     Y
อธบายคJณล)กษณะของโปรแกรม โดยขUอกZาหนดน;จะเข;ยนอยVในรVปแบบตLางๆ เพอใหUผVUใชU ผVปฏบ)ตงาน และน)กพ)ฒนา
                                            Y        L                         U
โปรแกรมสามารถเขUาใจไดU และสามารถทดสอบโปรแกรมท;พ)ฒนาขxนไดUวLาถVกตUองและตรงตามความตUองการของผVUใชU
                                                           Y
หรอไมL

      ข)นตอนการออกแบบ จะเปyนการทZาใหUขUอกZาหนดตามความตUองการเปล;ยนไปอยVLในรVปแบบของรายละเอ;ยด
        Y
ของโปรแกรมท;จะตUองพ)ฒนา ซxงในการออกแบบโดยใชUหล)กการเชงอ5อบเจกต#ก5อาจจะไดUไดอะแกรมตLางๆ ในรVปของ
UML เพอท;จะอธบายคลาสและอ5อบเจกต#ตLางๆ ท;สอดคลUองก)บขUอกZาหนดตามความตUองการ

           ข)นตอนการเข;ยนโปรแกรม จะเปyนการเข;ยนโปรแกรมโดยใชUภาษาคอมพวเตอร#ภาษาใดภาษาหนxงใหUเปyนไป
             Y
ตามโปรแกรมท;ไดUออกแบบไวU ซxงการเลอกใชUภาษาคอมพวเตอร#ควรท;จะตUองสอดคลUองก)บวธ;การท;ไดUออกแบบไวU ใน
กรณ;ท;ขนตอนการออกแบบเปyนการใชUหล)กการเชงอ5อบเจกต#ก5ควรท;จะตUองใชUภาษาคอมพวเตอร#เชงอ5อบเจกต#เชLน
        )Y
ภาษาจาวาในการเข;ยนโปรแกรม ข)นตอนน;จะเปyนข)นตอนท;ไมLยากน)กเนองจากเปyนการเข;ยนโปรแกรมตามขUอกZาหนดท;
                               Y       Y      Y
ไดUจากการออกแบบ ด)งน)Yนการพ)ฒนาโปรแกรมท;ด;จะตUองม;ขนตอนการออกแบบท;ด;เพอใหUไดUโปรแกรมท;ถVกตUอง
                                                     )Y

      ข)นตอนการทดสอบ จะเปyนข)นตอนท;จะทดสอบโปรแกรมท;ไดUพ)ฒนาขxน โดยอาจเปyนการทดสอบการทZางาน
        Y                      Y                               Y
ของโปรแกรมจากขUอมVลท;นZามาทดสอบตLางๆ และตรวจสอบดVวLาโปรแกรมสามารถทZางานไดUถVกตUองตามขUอกZาหนด
ตามความตUองการหรอไมL การทดสอบโปรแกรมเชงอ5อบเจกต#อาจเปyนการทดสอบท;ละยVนต (Unit Testing) หรอการ



118   หล)กการเชงอ5อบเจกต#                                                         ผศ. ธนศา เครอไวศยวรรณ
ทดสอบโดยรวม (Integration Testing) การทดสอบท;ละยVนตเปyนการทดสอบการทZางานของแตLละคลาส สLวนการ
ทดสอบโดยรวมเปyนการทดสอบการทZางานเมอรวมคลาสตLางๆ เขUาดUวยก)น

         ข)นตอนการทZางาน เปyนข)นตอนสJดทUายท;ไดUสLงมอบโปรแกรมใหUก)บผVใชUงานแลUว ซxงโปรแกรมท;สLงมอบก5
           Y                   Y                                      U
เปร;ยบเสมอนสนคUาอนๆ เชLน บUานหรอรถยนต# ท;อาจม;ขUอบกพรLองท;ตUองแกUไขและตUองม;การบZารJงร)กษา ผVUใชUโปรแกรม
อาจพบขUอผดพลาดของโปรแกรมในระหวLางการใชUงาน ซxงขUอผดพลาดเหลLาน;อาจเกดขxนจากข)นตอนการออกแบบ ข)น
                                                                        Y       Y    Y                   Y
ตอนการเข;ยนโปรแกรม หรอแมUกระท)งเกดขxYนในข)นตอนการวเคราะห#โปรแกรม ท;อาจวเคราะห#ความตUองการผดพลาด
                                              Y
ซxงจากขUอผดพลาดเหลLาน;ทZาใหUน)กพ)ฒนาโปรแกรมอาจจะตUองนZาโปรแกรมมาแกUไข ข)นตอนน;Yเปร;ยบเสมอนข)นตอน
                        Y                                                     Y                      Y
การบZารJงร)กษาโปรแกรม (software maintenance) ซxงจะม;ระยะเวลายาวนานตามระยะเวลาการใชUงานของโปรแกรม
ซxงม)กจะพบวLาข)นตอนน;Yจะม;คาใชUจLายในการพ)ฒนาโปรแกรมมากท;สJดเมอเท;ยบก)บข)Yนตอนอนๆ
                Y           L

          จากท;กลLาวมาขUางตUนแลUววLา ว)ฎจ)กรของการพ)ฒนาโปรแกรมไมLสามารถท;จะทZาแตLละข)นตอนใหUสมบVรณ#
                                                                                       Y
100% ไดU แตLจะตUองม;การยUอนกล)บมาทZาข)นตอนอนๆ เสมอ โดยท)วไปน)กพ)ฒนาโปรแกรมท;ด;จะตUองใหUความสZาค)ญ
                                            Y
ก)บข)Yนตอนการวเคราะห# และข)นตอนการออกแบบใหUมากท;สJด เพราะโปรแกรมท;ม;การออกแบบท;ด;จะชLวยลดความยJLง
                               Y
ยากในข)นตอนการทZางาน (บZารJงร)กษา) ซxงจะม;ผลทZาใหUตUนทJนในการพ)ฒนาโปรแกรมถVกลง
        Y


สร%ปเนอหาของบท
        •   โปรแกรมเชงอ5อบเจกต#จะม;คZานยามท;สZาค)ญสองคZาคอ อ5อบเจกต#และคลาส
        •   อ5อบเจกต#คอสงตLางๆ ท;ม;อยVLในช;วตประจZาว)นจะประกอบไปดUวยคJณล)กษณะและ เมธอด
        •   คลาสเปร;ยบเสมอนพมพ#เข;ยวของอ5อบเจกต# อ5อบเจกต#จะถVกสรUางมาจากคลาส อ5อบเจกต#หลายอ5อบเจกต#
             สามารถถVกสรUางจากคลาสหนxงคลาสไดU
        •   คJณล)กษณะของอ5อบเจกต#คอขUอมVลท;เก5บอยVLในอ5อบเจกต# ซxงจะแบLงออกเปyนต)วแปรและคLาคงท;
        •   คJณล)กษณะของคลาสเปyนคJณล)กษณะท;ใชUรวมก)นของทJกอ5อบเจกต#
                                                     L
        •   เมธอดคอวธ;การเพอใชUในการจ)ดการก)บคJณล)กษณะของอ5อบเจกต#หรอคJณล)กษณะของคลาส
        •   ภาษาจาวาม;นยามในการเข;ยนโปรแกรมเชงอ5อบเจกต#เพอประกาศคลาส คJณล)กษณะ เมธอด และอ5อบเจกต#
        •   โปรแกรมเชงอ5อบเจกต#จะม;คณล)กษณะเดLนอยVLสามประการคอ การหLอหJUม การสบทอด และการม;ไดUหลาย
                                          J
             รVปแบบ
        •   การหLอหJUมคอการท;ใหUคJณล)กษณะถVกหLอหJUมอยVLภายในเมธอด โดยกZาหนดใหUคJณล)กษณะม; access modifier
             เปyน private และกZาหนดใหUเมธอดม; ccess modifier เปyน public


ผศ. ธนศา เครอไวศยวรรณ                                                               หล)กการเชงอ5อบเจกต#   119
•   ขUอด;ของการหLอหJUมคอการซLอนเรUนขUอมVลและความเปyนโมดVล
      •   การสบทอดคอการท;คลาสใหมLสามารถนZาเอาคJณล)กษณะและเมธอดของคลาสท;ออกแบบไวUแลUวมาใชUไดU
      •   การม;ไดUหลายรVปแบบคอการท;กZาหนดใหUม;การตอบสนองตLอเมธอดเด;ยวก)นดUวยวธ;การท;ตLางก)น และ
          สามารถกZาหนดอ5อบเจกต#ไดUหลายรVปแบบ
      •   การสบทอดหมายถxง การท;คลาสท;เปyน subclass สบทอดคJณล)กษณะและเมธอดมาจากคลาสท;เปyน
          superclass ซxงภาษาจาวาจะใชUค;ย#เวร#ด extends
      •   คZาส)ง package เปyนการระบJวLาคลาสอยVLในแพคเก5จใด
      •   คZาส)ง import เปyนการเร;ยกใชUคลาสในแพคเก5จตLางๆ
      •   Unified Modeling Language (UML) เปyนภาษาท;ใชUรVปกราฟmกเพอจZาลองระบบซอฟต#แวร# ในท;น;YไดU
          แนะนZาส)ญล)กษณ#ของ UML ท;สZาค)ญสองอยLางคอ ไดอะแกรมของคลาสและไดอะแกรมของอ5อบเจกต#
      •   ว)ฎจ)กรการพ)ฒนาโปรแกรมจะประกอบไปดUวยข)นตอนตLางๆ 5 ข)Yนตอนคอ ข)นตอนการวเคราะห# ข)Yนตอน
                                                      Y                    Y
          การออกแบบ ข)นตอนการเข;ยนโปรแกรม ข)นตอนการทดสอบ และข)YนตอนการบZารJงร)กษาโปรแกรม
                          Y                        Y




120   หล)กการเชงอ5อบเจกต#                                                          ผศ. ธนศา เครอไวศยวรรณ
บทท 5 การสรางส0วนต0อประสานกราฟ3กกบผใช
        เนYอหาในบทน;YเปyนการแนะนZาการเข;ยนโปรแกรมจาวาประยJกต#ท;ม;สLวนตLอประสานกราฟmกก)บผVUใชU โดยจะ
เปyนการแนะนZาคลาสและอนเตอร#เฟสท;สZาค)ญในแพคเก5จ javax.swing อธบายคลาสประเภท Container และ
คลาสท;เปyนสLวนประกอบกราฟmกอนๆ แนะนZาการจ)ดวางสLวนประกอบกราฟmกโดยใชUอ5อบเจกต#ประเภท
LayoutManager และอธบายการสรUางเมนV



5.1 Java Foundation Class

         เนYอหาท;ผานมาเนUนการพ)ฒนาโปรแกรมท;ม;สLวนตLอประสานขUอความก)บผVUใชU (text-mode) แตLระบบ
                   L
ปฏบ)ตการสLวนใหญLจะม;สLวนตLอประสานกราฟmกก)บผVUใชU (Graphical User Interface เร;ยกยLอวLา GUI) ท)Yงน;เY นองจาก
ใชUงานงLายกวLา ด)งน)นการพ)ฒนาโปรแกรมในปwจจJบนควรท;จะม;สLวนตLอประสานกราฟmกก)บผVUใชU ซxงโปรแกรมล)กษณะน;Y
                     Y                       )
เร;ยกวLาโปรแกรม GUI

       การพ)ฒนาโปรแกรม GUI ผVพ)ฒนาโปรแกรมตUองม;ความเขUาใจชJดคZาส)งและองค#ประกอบทางดUานกราฟmกของ
                                  U
ระบบปฏบ)ตการท;ตUองการพ)ฒนา ภาษาคอมพวเตอร#สLวนใหญLจะใชUชJดคZาส)งเฉพาะในแตLละระบบปฏบ)ตการ ด)งน)นผVU
                                                                                                 Y
พ)ฒนาโปรแกรมจะตUองเร;ยนรVUชJดคZาส)งในแตLละระบบปฏบ)ตการและโปรแกรม GUI ท;พ)ฒนาขxนมาจะขxYนอยVLก)บ
                                                                                   Y
แพลตฟอร#ม (Platform Dependent) แตLภาษาจาวาจะสน)บสนJนการพ)ฒนาโปรแกรม GUI ท;สามารถใชUงานไดUหลาย
แพลตฟอร#ม โดยจะใชUชJดคZาส)งเด;ยวก)น อาทเชLน เราสามารถท;จะนZาโปรแกรม GUI ท;พ)ฒนาบนระบบปฏบ)ตการ
Linux มาใชUบนระบบปฏบ)ตการอนๆ ท;ม;สLวนตLอประสานกราฟmกก)บผVUใชUไดU


      ชJดคZาส)งของโปรแกรมภาษาจาวาท;ใชUในการพ)ฒนาโปรแกรม GUI จะอยVLในชJดของแพคเก5จ Java
Foundation Classes (JFC) ด)งแสดงในรVปท; 5.1 ซxงประกอบดUวยแพคเก5จตLางๆ ด)งน;Y




ผศ. ธนศา เครอไวศยวรรณ                                                   การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU   121
รปท 5.1 ส%วนประกอบทสาคญของ JFC

      • Abstract Window Toolkit (AWT) เปyนแพคเก5จท;ใชUในการพ)ฒนาโปรแกรม GUI ข)YนพYนฐาน ซxงจะใหU
          โปรแกรม GUI ท;เปyน look and feel ท;ขxYนอยVLก)บแพลตฟอร#ม ภาษาจาวาไดUกZาหนดแพคเก5จ AWT ขxYนมา
          ต)YงแตLเวอร#ช)นแรก (JDK 1.0) โดยกZาหนดไวUในแพคเก5จ java.awt
      •   Swing เปyนแพคเก5จท;ม;สLวนประกอบกราฟmกท;ม;คJณล)กษณะและรVปแบบท;ด;กวLาสLวนประกอบกราฟmกของ
          แพคเก5จ AWT ซxงจะเหมาะก)บการพ)ฒนาโปรแกรม GUI ท;นZาไปใชUงานจรง ภาษาจาวาไดUกZาหนดแพคเก5จ
                                                                 
          Swing ขxนในจาวาเวอร#ชน 2 (Java 2) โดยกZาหนดในแพคเก5จชอ javax.swing โดยท)วไปโปรแกรมท;
                    Y             )
          ใชUชดคZาส)งในแพคเก5จ Swing จะทZางานชUากวLาโปรแกรม GUI ท;ใชUแพคเก5จ AWT แตLจะม;รVปแบบท;
               J
          สวยงามกวLา
      •   Java 2D เปyนชJดคZาส)งกราฟmกท;ม;คลาสท;ชLวยในการพ)ฒนาโปรแกรมกราฟmกสองมตและคลาสท;ใชUในการ
          จ)ดการก)บรVปภาพ
      •   Accessibility เปyนชJดคZาส)งท;ม;คลาสในการพ)ฒนาโปรแกรมท;ม;อนพJตหรอเอาต#พJตในล)กษณะพเศษ อาท
          เชLน screen reader, screen magnifier และ audio text reader
      •   Drag and Drop เปyนชJดคZาส)งของเทคโนโลย;ท;ชLวยในการแลกเปล;ยนขUอมVลระหวLางโปรแกรมท;พ)ฒนาโดย
          ภาษาจาวาก)บโปรแกรมภาษาอนๆ

5.1.1 แพคเก-จ AWT

      ภาษาจาวาในเวอร#ช)นแรกๆ จะใชUแพคเก5จ AWT ในการพ)ฒนาโปรแกรม กLอนท;จะมาพ)ฒนาโดยใชUแพคเก5จ
Swing ท)Yงน;คลาสและอนเตอร#เฟสของ Swing หลายๆ ต)วสบทอดมาจากคลาสของแพคเก5จ AWT เนอหาในท;น;Yจะ
            Y



122   การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU                                          ผศ. ธนศา เครอไวศยวรรณ
แนะนZาใหUรVUจ)กคลาสและอนเตอร#เฟสตLางๆ ท;สZาค)ญในแพคเก5จ AWT ซxงม;ด)งน;Y
       • Component เปyนคลาสท;เปyน superclass ของคลาสประเภทสLวนประกอบกราฟmกทJกคลาสในแพคเก5จ
            AWT
    • Container    เปyนคลาสท;ใชUในการใสLสLวนประกอบกราฟmก
    •   LayoutManager เปyนอนเตอร#เฟสท;ใชUในการจ)ดตZาแหนLงและขนาดของสLวนประกอบกราฟmก

         • Graphics เปyนคลาสแบบ abstract ท;ใชUในการวาดรVปกราฟmก อาทเชLน วาดเสUน วาดส;เหล;ยม หรอเข;ยน
           ขUอความ เปyนตUน
    •   Color เปyนคลาสท;ใชUในการจ)ดการส;ของสLวนประกอบกราฟmก

    •   Font เปyนคลาสท;ใชUในการจ)ดการฟอนต#ของสLวนประกอบกราฟmก

    •   AWTEvent เปyนคลาสท;เก;ยวขUองก)บเหตJการณ# (Event) ทางกราฟmก


       การเข;ยนโปรแกรม GUI น)นจะเปyนการสรUางอ5อบเจกต#ตLางๆ ท;เปyนอ5อบเจกต#ของคลาสท;เปyนสLวนประกอบ
                              Y
กราฟmก ซxงคลาสเหลLาน;จะสบทอดมาจากคลาสท;ชอ Component ด)งแสดงในรVปท; 5.2 ซxงคลาสท;เปyน subclass ของ
                      Y                   
คลาส Component จะแบLงเปyนสองกลJLมคอ
       1. คลาสท;เปyนคลาสประเภท Container เปyนคลาสท;ใชUในการใสLสLวนประกอบกราฟmกตLางๆ
       2. คลาสท;เปyนสLวนประกอบกราฟmกอนๆ อาทเชLน Button, Choice และ List เปyนตUน




                         รปท 5.2 คลาสต%างๆ ทส0บทอดมาจากคลาสทช0อ Component




ผศ. ธนศา เครอไวศยวรรณ                                                การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU   123
5.1.2 แพคเก-จ Swing

       Swing เปyนแพคเก5จสZาหร)บพ)ฒนาโปรแกรม GUI ซxงม;สLวนประกอบกราฟmกท;มากชนดกวLาท;ม;อยVLในแพคเก5จ
AWT นอกจากน;สLวนประกอบกราฟmกของแพคเก5จ Swing จะม;ล)กษณะท;ด;กวLาสLวนประกอบกราฟmกของแพคเก5จ
            Y
AWT     สLวนประกอบกราฟmกของแพคเก5จ Swing สามารถกZาหนดรVปแบบของ look and feel ท;ทZาใหUไดUโปรแกรม
GUI ท;ม;รVปแบบของกราฟmกเหมอนก)นในทJกแพลตฟอร#ม ซxงจะแตกตLางก)บแพคเก5จ AWT ท;จะม;รVปแบบของกราฟmก
ซxงขxนอยVLก)บ look and feel ของแตLละแพลตฟอร#ม ซxงการกZาหนด look and feel ไดUเองน;ทZาใหUโปรแกรม GUI ท;ใชU
      Y                                                                            Y
อ5อบเจกต#ของแพคเก5จ Swing แสดงผลไดUชากวLาโปรแกรม GUI ท;ใชUอ5อบเจกต#ของแพคเก5จ AWT
                                         U

        แพคเก5จ Swing ประกอบดUวยคลาสตLางๆ ท;เปyนประเภทสLวนประกอบกราฟmก (Graphical Component)
เพอนZาไปใชUในการพ)ฒนาโปรแกรม GUI แพคเก5จ Swing จะชLวยในการสรUางโปรแกรม GUI ประเภท look and
feel โดยจะไมLขนอยVLก)บแพลตฟอร#มท;ใชUงาน ภาษาจาวาไดUกZาหนดแพคเก5จ Swing อยVLในแพคเก5จ javax.swing
               xY
แพคเก5จ Swing จะประกอบไปดUวยคลาสและอนเตอร#เฟสตLางๆ เพอใชUในการพ)ฒนาโปรแกรม GUI โดยคลาสและ
อนเตอร#เฟสตLางๆ เหลLาน;จะม;ความส)มพ)นธ#ด)งแสดงในรVปท; 5.3
                       Y




                                  รปท 5.3 คลาสและอนเตอรเฟสต%างๆ ในแพคเก-จ Swing


124    การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU                                             ผศ. ธนศา เครอไวศยวรรณ
5.2 คลาสประเภท          Container

        อ5อบเจกต#ของคลาส Container จะใชUในการใสLอ5อบเจกต#ของสLวนประกอบกราฟmกหลายๆ อ5อบเจกต#ไวUเพอ
แสดงผล โปรแกรม GUI จะตUองม;การสรUางอ5อบเจกต#ของคลาสประเภท Container อยLางนUอยหนxงอ5อบเจกต# ขxนมา
                                                                                               Y
กLอน เพอใชUในการใสLอ5อบเจกต#ของคลาสท;เปyนสLวนประกอบกราฟmกอนๆ คลาสประเภท Container ท;อยVLในแพคเก5จ
AWT ม;ด)งน;Y
        •   Frame
        •   Panel
        •   Dialog
        •   Applet

        โดยจะม;ลZาด)บช)นของการสบทอดด)งแสดงในรVปท; 5.2
                       Y

        คลาสประเภท Container เปyนคลาสท;สบทอดมาจากคลาสท;ชอ Component ซxงจ)ดเปyนสLวนประกอบ
                                                              
กราฟmกชนดหนxง ด)งน)นเราจxงสามารถท;จะใสLอ5อบเจกต#ประเภท Container บางชนดลงในอ5อบเจกต#ของคลาส
                  Y
ประเภท Container ต)วอนๆ ไดUอาทเชLน ใสLอ5อบเจกต#ของคลาส Panel ลงในอ5อบเจกต#ของคลาส Frame คลาสท;
ชอ Container เปyนคลาสแบบ abstract ซxงเราไมLสามารถท;จะสรUางอ5อบเจกต#ของคลาสด)งกลLาวไดU แตLจะตUอง
สรUางอ5อบเจกต#ของคลาสอนๆ ท;สบทอดมาจากคลาสท;ชอ Container แทน คลาสท;ชอ Container จะม;เมธอด
                                                                           
add() ท;ใชUในการใสLสLวนประกอบกราฟmกอนๆ เมธอดน;Yจะม;รVปแบบท;สZาค)ญด)งน;Y


        • public void add(Component c)
        • public void add(Component c, int position)


        โดยท;
        • c   คออ5อบเจกต#ของสLวนประกอบกราฟmกท;ตUองการใสL
        •   position คอตZาแหนLงท;ตUองการวางสLวนประกอบกราฟmก


      โดยปกตคลาสประเภท Container จะม;การจ)ดวางสLวนประกอบกราฟmกโดยกZาหนดตZาแหนLงและขนาดตาม
รVปแบบการจ)ดวางผ)ง ท;กZาหนดโดยอ5อบเจกต#ประเภท LayoutManager โดยอ)ตโนม)ตซxงจะกลLาวถxงในห)วขUอตLอไป

5.2.1 คลาส Frame

        คลาส Frame เปyนคลาสท;สบทอดมาจากคลาสท;ชอ Window ซxงจ)ดวLาเปyนคลาสประเภท Container แบบ
                                                 
หนxง โดยอ5อบเจกต#ของคลาส Frame จะประกอบดUวย title bar, resizable corner, icon และ menu bar ด)งแสดงใน



ผศ. ธนศา เครอไวศยวรรณ                                               การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU   125
รVปท; 5.4 โปรแกรม GUI สZาหร)บโปรแกรมจาวาประยJกต#จะเรมตUนดUวยการสรUางอ5อบเจกต#ของคลาส Frame อยLางนUอย
หนxงอ5อบเจกต# ซxงคลาส Frame จะม;รVปแบบของ constructor ท;สZาค)ญด)งน;Y
       • public Frame()
       • public Frame(String title)

       โดยท;   title    คอขUอความท;ตUองการจะแสดงตรง title bar ของ Frame




                                             รปท 5.4 รปแบบของ Frame

         โดยท)วไปคลาส Frame จะม;ขนาดเรมตUนเปyน (0, 0) ด)งน)นจxงจZาเปyนจะตUองกZาหนดขนาดของอ5อบเจกต#ของ
                                                             Y
Frame โดยใชUเมธอด setSize() นอกจากน;คลาส Frame จะถVกกZาหนดใหUไมLสามารถมองเห5นไดUในตอนเรมตUน
                                          Y
ด)งน)นจxงตUองม;การเร;ยกใชUเมธอด setVisible(true) เพอกZาหนดใหUอ5อบเจกต#ของคลาส Frame สามารถมองเห5น
     Y
ไดU
         อ5อบเจกต#ของคลาส Frame สามารถท;จะปร)บขนาดไดUโดยการลากเมาส#ปร)บขนาดของเฟรมซxงคลาส Frame
จะม;เมธอดท;เก;ยวขUองก)บการปร)บขนาดของเฟรมด)งน;Y
       • public boolean isResizable()

       เปyนเมธอดเพอตรวจสอบวLาอ5อบเจกต#ของคลาส Frame น;สามารถปร)บขนาดไดUหรอไมL
                                                       Y
       • public void setResizable(boolean canResize)

       เปyนเมธอดเพอกZาหนดใหUอ5อบเจกต#ของคลาส Frame น;Y สามารถปร)บขนาดไดUหรอไมL

        โปรแกรมท; 5.1 แสดงต)วอยLางการสรUางอ5อบเจกต#ของคลาส Frame ท;ชอ fr และกZาหนดใหU fr ม;ขนาดเรม
ตUนเปyน 200x150 พกเซล โดยกZาหนดไวUในคZาส)ง fr.setSize(200,150); สLวนคZาส)ง
fr.setVisible(true); เปyนคZาส)งเพอท;จะทZาใหUสามารถมองเห5นอ5อบเจกต# fr ไดU โปรแกรมน;YจะใหUผลล)พธ#ด)ง

แสดงในรVปท; 5.5


126   การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU                                           ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท 5.1 คลาส FrameSample
  import java.awt.*;

  public class FrameSample {
        private Frame fr;
        public void init() {
              fr = new Frame("Frame Sample");
              fr.setSize(200,150);
              fr.setVisible(true);
        }
        public static void main(String args[]) {
              FrameSample obj = new FrameSample();
              obj.init();
        }
  }




                               รปท 5.5 ผลลพธทได*จากการรนโปรแกรมท 5.1


5.2.2 คลาส Panel

        คลาส Panel จะเปyนคลาสประเภท Container เชLนเด;ยวก)บคลาส Frame แตL Panel จะแตกตLางจาก Frame
ตรงท; Panel จะไมLม; tile bar และไมLม; resizable corner คลาส Panel จะม; subclass ท;ชอ Applet เพอใชUในการ
เข;ยนโปรแกรมจาวาแอปเพล5ต ซxงทZาใหUเราสามารถใสLสLวนประกอบกราฟmกลงในโปรแกรมจาวาแอปเพล5ตไดU
โปรแกรมจาวาประยJกต#ไมLสามารถท;จะสรUางโปรแกรม GUI โดยเรมตUนจากการสรUางอ5อบเจกต#ของคลาส Panel ไดU
โดยตรง ท)Yงน;Yเนองจากโปรแกรม GUI ตUองม;การสรUาง Frame ขxYนมากLอน

         คลาส Panel สามารถท;จะใสLลงไปใน Frame ไดUจxงทZาใหUเราสามารถท;จะสรUางโปรแกรม GUI ท;ม;การวางผ)ง
ท;ซ)บซUอนขxนไดU โดยการใสLอ5อบเจกต#ของคลาสท;เปyนสLวนประกอบกราฟmกตLางๆ ลงในอ5อบเจกต#ของคลาส Panel
            Y
กLอน แลUวจxงนZาอ5อบเจกต#ของคลาส Panel ใสLลงในอ5อบเจกต#ของคลาสประเภท Container อ;กช)Yนหนxง ท)Yงน;Yเรา


ผศ. ธนศา เครอไวศยวรรณ                                                  การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU   127
สามารถท;จะกZาหนดใหU อ5อบเจกต#ของคลาส Panel แตLละต)วสามารถม;ต)วจ)ดวางผ)งท;ตLางก)นไดU และเราย)งสามารถท;
จะใสL อ5อบเจกต#ของคลาส Panel ลงไปในอ5อบเจกต#ของคลาส Panel ต)วอนอ;กท;หนxงก5ไดU

5.2.3 คลาส Dialog

       คลาส Dialog เปyนคลาสท;สบทอดมาจากคลาส Window เพอใชUเปyนอนพJตและเอาต#พJตก)บผVUใชU คลาส
Dialog จะทZางานอยVLภายใตUอ5อบเจกต#ของคลาส Frame ท)Yงน;การสรUางอ5อบเจกต#ของคลาส Dialog จะตUองระบJ
                                                          Y
อ5อบเจกต#ของคลาส Frame ท;คVLก)นซxงเร;ยกวLาเฟรมแมL (parent frame) อ5อบเจกต#ของคลาส Dialog อาจม;โหมดการ
ทZางานแบบ modal ซxงผVUใชUตUองปmดอ5อบเจกต#ของคลาส Dialog กLอนจxงจะกล)บมาทZางานในเฟรมแมLท;คVLก)นไดU
คลาส Dialog ม;รVปแบบของ constructor ท;สZาค)ญด)งน;Y
        •   public      Dialog(Frame           parent)
        •   public      Dialog(Frame           parent,String title)
        •   public      Dialog(Frame           parent, boolean isModal)
        •   public      Dialog(Frame           parent, String title, boolean isModal)

         โดยท;
        • parent คออ5อบเจกต#ของคลาส Frame ท;เปyนเฟรมแมL
        • title คอขUอความท;ตUองการจะแสดงตรง title bar ของ Dialog
        • isModal คอขUอมVลชนด boolean เพอระบJวLาอ5อบเจกต#ของ Dialog ม;โหมดเปyน modal หรอไมL

      นอกจากน;Y Java API ไดUกZาหนดใหUม;คลาสท;สบทอดมาจากคลาส Dialog อนๆ อ;กอาทเชLน คลาส
FileDialog ซxงจะใชUในการระบJชอไฟล#ท;ตUองการใชUงานในโปรแกรม



5.2.4 คลาส JFrame

       แพคเก5จ Swing ม;คลาสประเภท Container ท;แตกตLางจากคลาสประเภท Container ของแพคเก5จ AWT
คอ JFrame, JDialog, JPanel และ JApplet ด)งรVปท; 5.6 โดยท)วไปโปรแกรม GUI ท;เปyนโปรแกรมจาวา
ประยJกต#จะใชU Container ท;เปyนอ5อบเจกต#ของคลาส JFrame

        คลาส JFrame จะสบทอดมาจากคลาส Frame โดยม; constructor ท;สZาค)ญด)งน;Y
      • public JFrame()
      • public JFrame(String title)




128     การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU                                            ผศ. ธนศา เครอไวศยวรรณ
รปท 5.6 คลาสชนด Container ของแพคเก-จ Swing

         อ5อบเจกต#ของคลาส JFrame จะแตกตLางก)บ Frame ตรงท;จะม;หนUาตLาง (Pane) อยVL 4 หนUาตLางด)งแสดงในรVป
ท; 5.7 คอ
    •   root pane
    •   layer pane
    •   glass pane
    •   content pane

         เราไมLสามารถท;จะใสLสLวนประกอบกราฟmกลงใน JFrame ไดUโดยตรง แตLจะตUองใสLลงในหนUาตLางท;เปyน
content pane แทน ท)Yงน;หนUาตLางด)งกลLาวเปyนอ5อบเจกต#ของคลาสประเภท Container แบบหนxง เราสามารถท;จะ
                         Y                                                         
เร;ยกอ5อบเจกต#ของคลาสประเภท Container ด)งกลLาวมาไดUโดยใชUเมธอดท;ชอ getContentPane() และสามารถ
                                                                    
ท;จะใสLสLวนประกอบกราฟmกลงในอ5อบเจกต#ด)งกลLาวไดUโดยใชUเมธอด add() ด)งต)วอยLางเชLน
                 JFrame fr = new JFrame();
                 JButton bn1 = new JButton("Submit");
                 Container content = fr.getContentPane();
                 content.add(bn1);




ผศ. ธนศา เครอไวศยวรรณ                                                 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU   129
รปท 5.7 หนาตางทอยในคลาส JFrame

        โปรแกรม Java SE 5 ไดUกZาหนดใหUเราสามารถท;จะใสLสLวนประกอบกราฟmกลงใน JFrame ไดUโดยตรง โดย
การกZาหนดใหUคZาส)ง add() และ setLayout() ใน JFrame จะเปyนการสLงคZาส)งไปย)ง content pane โดยอ)ตโนม)ต
ด)งน)นเราจxงสามารถท;จะเข;ยนคZาส)งขUางบนใหมLไดUเปyน
     Y
                JFrame fr = new JFrame();
                JButton bn1 = new JButton("Submit");
                fr.add(bn1);


       นอกจากน;คลาส JFrame ย)งม;เมธอดท;จะถVกเร;ยกใชงาน เมอมการปด Jframe ด)งน;Y
               Y
       • public void setDefaultCloseOperation(int operation)

       โดยเราสามารถกZาหนดคLาของ operation ไดUท)Yงหมด 4 คLาด)งน;Y
       • DO_NOTHING_ON_CLOSE (ถVกกZาหนดในอนเตอร#เฟส WindowConstants):
         จะไมLทZาอะไร โดยใหUไปเร;ยกใชUเมธอด windowClosing ของอ5อบเจกต# WindowListener ท;ม;การลง
         ทะเบ;ยนไวUแลUวแทน
       • HIDE_ON_CLOSE (ถVกกZาหนดในอนเตอร#เฟส WindowConstants):
         จะทZาการซLอน JFrame หล)งจากเร;ยกใชUอ5อบเจกต#ของ WindowListener ท;ม;การลงทะเบ;ยนไวUแลUว
       • DISPOSE_ON_CLOSE (ถVกกZาหนดในอนเตอร#เฟส WindowConstants):
         จะทZาการซLอนและทZาลาย JFrame หล)งจากเร;ยกใชUอ5อบเจกต#ของ WindowListener ท;ม;การลงทะเบ;ยน
         ไวUแลUว
       • EXIT_ON_CLOSE (ถVกกZาหนดในคลาส JFrame):
         จะม;การเร;ยกใชUเมธอด exit ของคลาส System


130   การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU                                          ผศ. ธนศา เครอไวศยวรรณ
โดยคLาของ operation จะม;คLาเรมตUนเปyน HIDE_ON_CLOSE
       โปรแกรมท; 5.2 แสดงต)วอยLางการสรUางอ5อบเจกต#ของคลาส JFrame ท;ชอ fr โดยใชUคZาส)ง
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); เพอใหUม;การเร;ยกใชUเมธอด exit ของคลาส

System เมอม;การปmด Jframe และกZาหนดใหU fr ม;ขนาดเรมตUนเปyน 200x150 พกเซล โดยกZาหนดไวUในคZาส)ง

fr.setSize(200,150); สLวนคZาส)ง fr.setVisible(true); เปyนคZาส)งเพอท;จะทZาใหUสามารถมองเห5น

อ5อบเจกต# fr ไดU โปรแกรมน;YจะใหUผลล)พธ#ด)งแสดงในรVปท; 5.8

5.3 การจดวางผงของส0วนประกอบกราฟ3ก

       โปรแกรม GUI ของภาษาจาวาจะจ)ดวางสLวนประกอบกราฟmกตLางๆ ลงในอ5อบเจกต#ของคลาสประเภท
Container โดยอ)ตโนม)ต ท)Yงน;จะกZาหนดขนาดและตZาแหนLงของสLวนประกอบกราฟmกไดUโดยใชUอ5อบเจกต#ของคลาส
                            Y
ประเภท LayoutManager ซxง LayoutManager เปyนอนเตอร#เฟสท;ใช)ในการกZาหนดวธ;การจ)ดวางผ)งสLวนประกอบ
กราฟmก ภาษาจาวาไดUกZาหนดใหUมคลาสท; implements อนเตอร#เฟสท;ชอ LayoutManager เพอใชUเปyนต)วจ)ดวางผ)ง
                              ;
ของสLวนประกอบกราฟmกท)Yงหมดของคลาสคอ
    1.   BorderLayout
    2.   FlowLayout
    3.   GridLayout
    4.   CardLayout
    5.   GridBagLayout


โปรแกรมท 5.2 คลาส JFrameSample

   import javax.swing.JFrame;

   public class JFrameSample {

         private JFrame fr;

         public void init() {
             fr = new JFrame("JFrame Sample");
             fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             fr.setSize(200, 150);
             fr.setVisible(true);
         }

         public static void main(String args[]) {
             JFrameSample obj = new JFrameSample();
             obj.init();
         }
   }




ผศ. ธนศา เครอไวศยวรรณ                                               การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU   131
รปท 5.8 ผลลพธทได*จากการรนโปรแกรมท 5.2


        การกZาหนดวธ;การวางผ)งของอ5อบเจกต#ของคลาสประเภท Container จะทZาไดUโดยการสรUางอ5อบเจกต#
ประเภท LayoutManager ของคลาสใดคลาสหนxงในหUาคลาสขUางตUน จากน)นเราสามารถท;จะกZาหนดการวางผ)งโดย
                                                              Y
การเร;ยกใชUเมธอด setLayout()ของคลาสประเภท Container โดยสLงผLาน argument ท;เปyนอ5อบเจกต#ประเภท
LayoutManager ท;สรUางขxYนมา ต)วอยLางเชLนคZาส)ง

                 JFrame fr = new JFrame(“Demo”);
                 FlowLayout fl = new FlowLayout();
                 fr.setLayout(fl);

         เปyนการกZาหนดใหUอ5อบเจกต#ของคลาส JFrame ท;ชอ fr ซxงม;วธ;การจ)ดวางผ)งในรVปแบบของ FlowLayout
เนองจากคZาส)งในต)วอยLางขUางตUนจะไมLม;การนZาอ5อบเจกต# fl ซxงเปyนอ5อบเจกต#ของคลาส FlowLayout ไปอUางองในคZา
ส)งอนๆ ด)งน)นเราจxงสามารถท;จะเข;ยนคZาส)งในการสรUางอ5อบเจกต#และคZาส)งกZาหนดรVปแบบการวางผ)งภายในคZาส)ง
              Y
เด;ยวก)นไดUด)งน;Y
                 fr.setLayout(new FlowLayout());

       โดยท)วไปคลาสประเภท Container แตLละชนด จะม;การกZาหนดวธ;การวางผ)งของอ5อบเจกต#ของคลาสแตLละ
ชนดไวUเรมตUนอยVLแลUวด)งน;Y
       • คลาส JWindow, JFrame และ JDialog จะกZาหนดใหUเปyน BorderLayout
       • คลาส JPanel และ JApplet จะกZาหนดใหUเปyน FlowLayout


5.3.1 BorderLayout

       BorderLayout    เปyนการจ)ดวางผ)งท;กZาหนดใหUสามารถวางอ5อบเจกต#ของคลาสท;เปyนสLวนประกอบกราฟmกไดU
5 อ5อบเจกต#ตามตZาแหนLงทศตLางๆ ของอ5อบเจกต#ประเภท Container 5 ตZาแหนLงคอ ทศเหนอ (NORTH) ทศใตU



132   การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU                                             ผศ. ธนศา เครอไวศยวรรณ
(SOUTH)  ทศตะว)นออก (EAST) ทศตะว)นตก (WEST) และตรงกลาง (CENTER) ซxงอ5อบเจกต#ท;เปyนสLวน
ประกอบกราฟmกจะถVกใสLในตZาแหนLงทศตLางๆ โดยจะม;การกZาหนดขนาดใหUโดยอ)ตโนม)ต

          โปรแกรมท; 5.3 แสดงต)วอยLางโปรแกรม GUI ท;ประกอบไปดUวยปJšม 5 ปJšม โดยไดUสรUางอ5อบเจกต#ของคลาส
JButton ขxYนมา 5 อ5อบเจกต#ซxงม;ชอเปyน bn1 จนถxง bn5 และม;ขอความบนปJšมเปyน B1 จนถxง B5 ตามลZาด)บ จากน)นไดU
                                                            U                                          Y
ใสLอ5อบเจกต#ชนด JButton แตLละต)วลงไปในอ5อบเจกต#ชนด JFrame ท;ชอ fr โดยใชUเมธอด add() ตามตZาแหนLง
ทศตLางๆ โดยท; อ5อบเจกต# bn1 จะอยVLทางทศเหนอ อ5อบเจกต# bn2 จะอยVLทางทศใตU อ5อบเจกต# bn3 จะอยVLทางทศตะว)น
ออก อ5อบเจกต# bn4 จะอยVLทางทศตะว)นตก และอ5อบเจกต# bn5 จะอยVLตรงกลาง ซxงโปรแกรมน;จะใหUผลล)พธ#ด)งแสดงใน
                                                                                     Y
รVปท; 5.9

         การใชUเมธอด add() ในกรณ;ท;อ5อบเจกต#ประเภท Container ม;การจ)ดวางผ)งแบบ BorderLayout น)น จะ
                                                                                               Y
ตUองม; argument เพอระบJตZาแหนLงทศท;ตUองการวางอ5อบเจกต#ท;เปyนสLวนประกอบกราฟmกอาทเชLน คZาส)ง
                  fr.add(bn1,BorberLayout.NORTH);

        เปyนคZาส)งท;ใชUในการใสLอ5อบเจกต# bn1 ลงใน Jframe ในตZาแหนLงทศเหนอ

      กรณ;ท;เร;ยกใชUเมธอด add() โดยไมLสLงผLาน argument เพอระบJตZาแหนLงทศท;ตUองการวางอ5อบเจกต#ท;เปyนสLวน
ประกอบกราฟmกน)น ภาษาจาวาจะถอวLาเปyนการกZาหนดใหUใสLสLวนประกอบกราฟmกไวUตZาแหนLงตรงกลางของอ5อบเจกต#
                 Y
ของคลาสประเภท Container อาทเชLน คZาส)ง
                  fr.add(bn1);

จะถอวLาเปyนคZาส)งเชLนเด;ยวก)บคZาส)ง
                  fr.add(bn1,BorderLayout.CENTER);




ผศ. ธนศา เครอไวศยวรรณ                                                  การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU   133
โปรแกรมท 5.3 ต)วอยLางการใชUต)วจ)ดวางผ)งแบบ BorderLayout

  import    java.awt.BorderLayout;
  import    java.awt.Container;
  import    javax.swing.JButton;
  import    javax.swing.JFrame;

  public class BorderLayoutSample {

       private JFrame fr;
       private JButton bn1, bn2, bn3, bn4, bn5;

       public void init() {
           fr = new JFrame("Button Sample");
           fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           bn1 = new JButton("B1");
           bn2 = new JButton("B2");
           bn3 = new JButton("B3");
           bn4 = new JButton("B4");
           bn5 = new JButton("B5");
           fr.add(bn1, BorderLayout.NORTH);
           fr.add(bn2, BorderLayout.SOUTH);
           fr.add(bn3, BorderLayout.EAST);
           fr.add(bn4, BorderLayout.WEST);
           fr.add(bn5);
           fr.setSize(200, 150);
           fr.setVisible(true);
       }

       public static void main(String args[]) {
           BorderLayoutSample obj = new BorderLayoutSample();
           obj.init();
       }
  }




                                      รปท 5.9 ผลลพธทได*จากการรนโปรแกรมท 5.3



134   การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU                                    ผศ. ธนศา เครอไวศยวรรณ
การปร)บขนาดของอ5อบเจกต#ของคลาสประเภท Container จะม;ผลทZาใหUขนาดของอ5อบเจกต#ของสLวน
ประกอบกราฟmก เปล;ยนแปลงไปตามขนาดของอ5อบเจกต#ของคลาสประเภท Container ด)งน;Y
      • อ5อบเจกต#ของสLวนประกอบกราฟmกท;อยVLตZาแหนLงทศเหนอ ใตU และตรงกลาง จะปร)บขนาดตามขนาดของ
         อ5อบเจกต#ของคลาสประเภท Container ตามแนวนอน ด)งแสดงในรVปท; 5.10 (ก)
      • อ5อบเจกต#ของสLวนประกอบกราฟmกท;อยVLตZาแหนLงทศตะว)นออก ตะว)นตก และตรงกลางจะปร)บขนาดตาม
         ขนาดของอ5อบเจกต#ของคลาสประเภท Container ตามแนวต)Yง ด)งแสดงในรVปท; 5.10 (ข)




                            (ก) แนวนอน                          (ข) แนวตง
                                 รปท 5.10 ขนาดของอ-อบเจกตทถกปรบ

5.3.2 FlowLayout

        FlowLayout  เปyนการจ)ดวางผ)งสLวนประกอบกราฟmกไวUตZาแหนLงบนสJดของอ5อบเจกต#ของคลาสประเภท
Container โดยจะเร;ยงอ5อบเจกต#ของคลาสท;เปyนสLวนประกอบกราฟmกจากซUายไปขวา และถUาความกวUางของอ5อบเจกต#

ของคลาสประเภท Container ในแตLละแถวไมLพอ ต)วจ)ดวางผ)งแบบ FlowLayout จะนZาอ5อบเจกต#ของคลาสท;เปyน
สLวนประกอบท;เหลอวางในตZาแหนLงถ)ดไปดUานลLาง การจ)ดวางผ)งแบบ FlowLayout จะปร)บขนาดของอ5อบเจกต#ของ
คลาสท;เปyนสLวนประกอบกราฟmกตLางๆ ตามความเหมาะสม ท)Yงน;ขนอยVLก)บขUอกZาหนดตLางๆ อาทเชLน ขนาดของอ5อบเจกต#
                                                       Y xY
ของคลาส JButton จะม;ขนาดตามขนาดของขUอความบนปJšม เปyนตUน
       โปรแกรมท; 5.4 แสดงต)วอยLางโปรแกรม GUI ท;สรUางอ5อบเจกต#ของคลาส JFrame ขxนมา แลUวกZาหนดใหUม;
                                                                                Y
การจ)ดวางผ)งแบบ FlowLayout โดยใชUคZาส)ง
                 fr.setLayout(new FlowLayout());




ผศ. ธนศา เครอไวศยวรรณ                                               การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU   135
โปรแกรมท 5.4 ต)วอยLางการใชUต)วจ)ดวางผ)งแบบ FlowLayout

  import java.awt.*;
  import javax.swing.*;

  public class FlowLayoutSample {

       private JFrame fr;
       private JButton bn1, bn2, bn3;

       public void init() {
           fr = new JFrame("Button Sample");
           fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           fr.setLayout(new FlowLayout());
           bn1 = new JButton("Submit");
           bn2 = new JButton("Cancel");
           bn3 = new JButton("Exit");

             fr.add(bn1);
             fr.add(bn2);
             fr.add(bn3);
             fr.setSize(200, 150);
             fr.setVisible(true);
       }

       public static void main(String args[]) {
           FlowLayoutSample obj = new FlowLayoutSample();
           obj.init();
       }
  }



         โปรแกรม GUI น;จะม;อ5อบเจกต#ของคลาส JButton อยVLสามอ5อบเจกต# โดยกZาหนดใหUม;ขUอความเปyน Submit,
                          Y
Cancel และ Exit จากน)นโปรแกรมไดUใสLอ5อบเจกต#ของคลาส JButton แตLละต)วลงในอ5อบเจกต#ของคลาส JFrame
                        Y
ซxงจะไดUโปรแกรม GUI ท;ม;ปJšมสามปJšมเร;ยงจากซUายไปขวาด)งรVปท; 5.11 (ก) และในกรณ;ท; JFrame ขนาดแคบลงปJšม
บางปJšมก5จะลงมาอยVLในตZาแหนLงถ)ดไปด)งรVปท; 5.11 (ข)




                                    (ก)                                  (ข)
                                     รปท 5.11 ผลลพธทได*จากการรนโปรแกรมท5.4


136   การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU                                            ผศ. ธนศา เครอไวศยวรรณ
5.3.3 GridLayout
        GridLayout    เปyนการจ)ดวางผ)งท;แบLงอ5อบเจกต#ของคลาสประเภท Container เปyนชLองยLอยๆ หลายชLอง โดย
แตLละชLองยLอยจะม;ขนาดความกวUางและความสVงเทLาก)น GridLayout จะอนJญาตใหUใสLอ5อบเจกต#ของคลาสท;เปyนสLวน
ประกอบกราฟmกไดUหนxงอ5อบเจกต# ในแตLละชLองยLอย โดยจะกZาหนดใหUขนาดของอ5อบเจกต#ของคลาสท;เปyนสLวน
                    
ประกอบกราฟmกม;ขนาดเทLาก)บขนาดของชLองยLอย การสรUางต)วจ)ดวางผ)งแบบ GridLayout ทZาไดUโดยการสรUาง
อ5อบเจกต#ของคลาส GridLayout ท;ม;รVปแบบของ constructor เปyนด)งน;Y
                 public GridLayout(int row, int col)

         โดยท; row และ col คอจZานวนแถวและคอล)มน#ท;ตUองการแบLงอ5อบเจกต#ของคลาสประเภท Container ใหU
เปyนชLองยLอย
         การใสLอ5อบเจกต#ของคลาสท;เปyนสLวนประกอบกราฟmกลงในชLองยLอย จะทZาไดUโดยการเร;ยกใชUเมธอด add()
เชLนเด;ยวก)น แตLในกรณ;นโปรแกรม GUI จะใสLอ5อบเจกต#จากชLองยLอยบนสJดเร;ยงจากซUายไปขวา โดยไมLสามารถท;จะ
                        ;Y
ขUามชLองยLอยใดชLองยLอยหนxงไดU
                           

โปรแกรมท( 5.5 ต)วอยางการใชต)วจ)ดวางผ)งแบบ GridLayout
   import java.awt.*;
   import javax.swing.*;

   public class GridLayoutSample {
       private JFrame fr;
       private JButton bn1, bn2, bn3, bn4, bn5;
       public void init() {
           fr = new JFrame("Button Sample");
           fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           bn1 = new JButton("B1");
           bn2 = new JButton("B2");
           bn3 = new JButton("B3");
           bn4 = new JButton("B4");
           bn5 = new JButton("B5");
           fr.setLayout(new GridLayout(3, 2));
           fr.add(bn1, BorderLayout.NORTH);
           fr.add(bn2, BorderLayout.SOUTH);
           fr.add(bn3, BorderLayout.EAST);
           fr.add(bn4, BorderLayout.WEST);
           fr.add(bn5, BorderLayout.CENTER);
           fr.setSize(200, 150);
           fr.setVisible(true);
       }
       public static void main(String args[]) {
           GridLayoutSample obj = new GridLayoutSample();
           obj.init();
       }
   }



ผศ. ธนศา เครอไวศยวรรณ                                                การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU   137
รปท 5.12 ผลลพธทได*จากการรนโปรแกรมท 5.5


5.4 ส0วนประกอบกราฟ3กในแพคเก-จ Swing

           แพคเก5จ AWT ม;คลาสท;เปyนสLวนประกอบกราฟmกท;สZาค)ญด)งน;Y
      •   Button เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เปyนปJšม

      •   Label เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;ม;ไวUในการแสดงขUอความ

      •   TextField เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#เพอใหUผVUใชUป‚อนขUอความไดUสVงสJดหนxงบรรท)ด
                                                                                         
      •   TextArea เปyนท;ทZาหนUาท;คลUายก)บ TextField แตLจะม;หลายบรรท)ด

      •   Checkbox เปyนคลาสท;ทZาหนUาท;คลUายก)บปJšมโดยใชUสวทซ# “ on-off”

      •   Choice เปyนคลาสท;ผVUใชUสามารถเลอกรายการจากท;กZาหนดมาใหUไดU

      •   List เปyนคลาสท;จะทZาหนUาท;คลUาย Choice แตLจะแสดงรายการไดUหลายแถวพรUอมๆ ก)น

      •   Scollbar เปyนคลาสท;ทZาหนUาท;เปyนแถบควบคJมเพอใหUผVUใชUสามารถเลอนไปย)งตZาแหนLงท;ตUองการไดU

      •   Canvas เปyนคลาสท;เปyนพYนท;วางเปลLาเพอใชUในการวาดรVปกราฟmกลงไป
                                        L

       สZาหร)บคลาสท;เปyนสLวนประกอบกราฟmกของแพคเก5จ Swing ทJกคลาสจะสบทอดมาจากคลาส JComponent
ด)งแสดงในรVปท; 5.13 โดยคลาส JComponent จะสบทอดมาจากคลาส Container ในแพคเก5จ AWT อ;กตLอหนxง




138       การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU                                              ผศ. ธนศา เครอไวศยวรรณ
รปท 5.13 คลาสต%างๆ ทส0บทอดมาจากคลาส Jcomponent


          แพคเก5จ Swing จะม;คลาสท;เปyนสLวนประกอบกราฟmกท;สอดคลUองก)บคลาสในแพคเก5จ AWT โดยคลาสเหลLา
น;Yจะม;ชอขxนตUนดUวยต)วอ)กษร ‘J’ โดยม;คลาสท;สZาค)ญด)งน;Y
            Y

    • JButton    เปyนคลาสท;ทZาหนUาท;เปyนปJšมในแพคเก5จ Swing
    •   JLabel เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;ไวUในการแสดงขUอความในแพคเก5จ Swing

    •   JTextField เปyนคลาสท;ใชUในการป‚อนขUอความหนxงบรรท)ดในแพคเก5จ Swing
                                                         
    •   JTextArea เปyนคลาสท;ใชUในการป‚อนขUอความหลายบรรท)ดในแพคเก5จ Swing

    •   JScrollBar เปyนคลาสท;ทZาหนUาท;เปyนแถบควบคJมเพอใหUผVUใชUเลอนไปย)งตZาแหนLงท;ตUองการไดUในแพคเก5จ
         Swing
    • JCheckBox       เปyนคลาสท;ทZาหนUาท;คลUายปJšมในแพคเก5จ Swing
    • JChoice      เปyนคลาสท;ผVUใชUสามารถเลอกรายการไดUในแพคเก5จ Swing

         การเข;ยนโปรแกรม GUI โดยมากจะใชUสLวนประกอบกราฟฟmคของแพคเก5จ Swing ท;ม; Look and Feel ท;ด;
กวLาของแพคเก5จ AWT รVปท; 5.14 แสดงต)วอยLางสLวนประกอบกราฟฟmคของแพคเก5จ Swing บางคลาส ซxงเนYอหาใน
ห)วขUอยLอยตLอไปจะอธบายการใชUงานของคลาสท;สZาค)ญบางคลาส




ผศ. ธนศา เครอไวศยวรรณ                                                    การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU   139
รปท 5.14 ตวอยาง Look and Feel คลาสทเป5นส%วนประกอบกราฟ9กในแพคเกจ Swing

5.4.1 คลาส         JButton

               เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;แสดงเปyนปJšม โดยจะม;ขอความ (text) ปรากฎอยVLบนปJšม ผVUใชU
          JButton                                                       U
สามารถใชUอJปกรณ#อนพJตเชLนเมาส#หรอค;ย#บอร#ดกดเลอกปJšมไดU JButton เปyนคลาสท;สบทอดมาจากคลาส
JComponent เราสามารถท;จะสรUางอ5อบเจกต#ของคลาส JButton โดยเร;ยกใชU constructor ของคลาส JButton ท;ม;

รVปแบบด)งน;Y
      •   public     JButton()
      •   public     JButton(String text)
      •   public     Jbutton(Icon icon)
      •   public     JButton(String text, Icon icon)

           โดยท;
      •   text คอขUอความท;จะปรากฏอยVLบนปJšม

      •   Icon คอไอคอนท;ตUองการแสดง




140       การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU                                         ผศ. ธนศา เครอไวศยวรรณ
คลาส Button ย)งม;เมธอดอนๆ ท;สZาค)ญในการจ)ดการก)บขUอความด)งน;Y
    •   public void setText(String text) เปyนเมธอดท;ใชUในการกZาหนดหรอเปล;ยนขUอความของปJšม

    •   public String getText() เปyนเมธอดท;ใชUในการเร;ยกดVขUอความของปJšม

    •   public void setMnemonic(char c) หรอ void setMnemonic(int i)

           เปyนเมธอดในการกZาหนดค;ย#ท;เปyน shortcut ใหUก)บอ5อบเจกต#ของคลาส JButton
    • public void setIcon(Icon c)
            เปyนเมธอดในการใสLไอคอน (icon) ลงในอ5อบเจกต#ของคลาส JButton

        นอกจากน;เY ราย)งสามารถเร;ยกใชUเมธอดของคลาส JComponent ซxงเปyน superclass ของ JButton ท;ม;เมธอดท;
เพมล)กษณะตLางๆ ใหUก)บอ5อบเจกต#ท;เปyนสLวนประกอบกราฟmก อาทเชLน
    • public void setBorder(Border bd) เปyนเมธอดสZาหร)บกZาหนดขอบใหUก)บสLวนประกอบกราฟmก
        • public void setToolTipText(String text) เปyนเมธอดสZาหร)บกZาหนดขUอความท;จะแสดงเปyน
          tooltip ใหUก)บสLวนประกอบกราฟmก

       ต)วอยLางการสรUางอ5อบเจกต#ของคลาส JButton ท;แสดงขUอความ ค;ย#ท;เปyน shortcut และ tooltip สามารถ
กZาหนดไดUตามคZาส)งด)งน;Y
                 JButton b1 = new JButton("Demo button");
                 b1.setMnemonic(KeyEvent.VK_D);
                 b1.setToolTipText("Click this button ");



5.4.2 คลาส       JLabel

        JLabel  เปyนคลาสท;ใชUสรUางอ5อบเจกต#ท;เปyนสLวนประกอบกราฟmกท;ใชUในการแสดงขUอความ โดยท;คลาส
JLabel ม; constructor ท;สZาค)ญด)งน;Y


    •   public   JLabel(String text)
    •   public   JLabel(String text, int align)
    •   public   Jlabel(Icon icon)
    •   public   Jlabel(Icon icon, int align)
    •   public   JLabel(String text, Icon icon)

         โดยท;
    •   text คอขUอความท;ตUองการแสดง

    •   align คอการกZาหนดการวางแนว(ชดซUาย ขวา หรอตรงกลาง) ของขUอความ




ผศ. ธนศา เครอไวศยวรรณ                                                  การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU   141
• Icon คอไอคอนท;ตUองการแสดง
           คลาส JLabel ย)งม;เมธอดอนๆในการจ)ดการและกZาหนด Look and Feel ของอ5อบเจกต#เชLนเด;ยวก)บ JButton
ซxงคZาส)งเหลLาน;สามารถหาไดUจาก Java API หรอเร;ยกดVจากคZาส)งในโปรแกรม IDE เชLน NetBeans
                  Y

          โปรแกรมท; 5.6 แสดงต)วอยLางการสรUางอ5อบเจกต#ชนด JLabel ขxนมาสามอ5อบเจกต#โดยแตLละอ5อบเจกต#จะใชU
                                                                        Y
คZาส)ง constructor ท;แตกตLางก)น และจะม;ไอคอนประกอบขUอความในอ5อบเจกต#ชอ label1 และ label3 โดยไอคอนจะ
สรUางมาจากไฟล#ท;ชอ testImg.jpg ท;เก5บอยVLในไดเร5กทอร;ท;ชอ images ซxงอยVLภายในไดเร5กทอร;เด;ยวก)บไฟล#ท;ชอ
                                                                                                               
JLabelDemo.class โปรแกรมน;จะทZาการโหลดไฟล#ด)งกลLาวมาไสLในอ5อบเจกต#ท;ชอ icon โดยม;คZาส)งด)งน;Y
                                  Y
            URL imageURL = JLabelDemo.class.getResource("images/testImg.jpg");

            if (imageURL != null) {
                icon = new ImageIcon(imageURL);
            }


         โปรแกรมน;จะใหUผลล)พธ#ด)งรVปท; 5.15
                  Y


โปรแกรมท( 5.6 ต)วอยางการสรางอ9อบเจกตชนด JLabel

  import java.awt.*;
  import java.net.URL;
  import javax.swing.*;

  public class JLabelDemo {

         private JFrame fr;
         private JLabel label1, label2, label3;

         public void init() {
             ImageIcon icon = null;
             fr = new JFrame("JLabel Sample");
             fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             URL imageURL = JLabelDemo.class.getResource("images/testImg.jpg");

               if (imageURL != null) {
                   icon = new ImageIcon(imageURL);
               }

               fr.setLayout(new GridLayout(3, 1));
               //Create the first label.
               label1 = new JLabel("Image and Text", icon, JLabel.CENTER);
               //Set the position of its text, relative to its icon:
               label1.setVerticalTextPosition(JLabel.BOTTOM);
               label1.setHorizontalTextPosition(JLabel.CENTER);




142     การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU                                               ผศ. ธนศา เครอไวศยวรรณ
//Create the other labels.
              label2 = new JLabel("Text-Only Label");
              label3 = new JLabel(icon);

              //Create tool tips, for the heck of it.
              label1.setToolTipText("A label containing both image and text");
              label2.setToolTipText("A label containing only text");
              label3.setToolTipText("A label containing only an image");

              //Add the labels.
              fr.add(label1);
              fr.add(label2);
              fr.add(label3)

              fr.pack();
              fr.setVisible(true);
        }

        public static void main(String args[]) {
            JLabelDemo obj = new JLabelDemo();
            obj.init();
        }
  }




                            รปท 5.15 ผลลพธทได*จากการรนโปรแกรมท 5.6




ผศ. ธนศา เครอไวศยวรรณ                                         การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU   143
5.4.3 คลาส         JTextField


          JTextFieldคอคลาสท;ใชUในการสรUางอ5อบเจกต#เพอใหUผใชUป‚อนขUอความหนxงบรรท)ด โดยท;คลาส
                                                           VU
JTextField ม; constructor ท;สZาค)ญด)งน;Y


      •   public     JTextField()
      •   public     JTextField(int col)
      •   public     JTextField(String text)
      •   public     JTextField(String text, int col)
          โดยท;
      • text     คอขUอความเรมตUนท;ตUองการแสดง
      • col     คอจZานวนคอล)มน#ท;ตUองการแสดง
          คลาส JTextField ม;เมธอดท;สZาค)ญด)งน;Y
      • public int getColumns()
         • public String getText()
      • public boolean isEditable()
      • public void select(int selectionStart, int selectionEnd)
      • public void selectAll()
      • public void setEditable(boolean b)
      • public void setText(String t)
      • public void setColumn(int column)


       เมธอด setText() ใชUในการกZาหนดหรอเปล;ยนขUอความของอ5อบเจกต#ชนด JTextFiled ในกรณ;ท;เรา
ตUองการกZาหนดใหU JTextField สามารถอLานขUอความไดUอยLางเด;ยว เราสามารถทZาไดUโดยเร;ยกใชUเมธอด
setEditable(boolean b) โดยกZาหนดใหU argument ม;คLาเปyน false สLวนเมธอด select()ใชUในการเลอก

ขUอความใน JTextField

        โปรแกรมท; 5.7 แสดงต)วอยLางการสรUางเฟรมท;ม;อ5อบเจกต#ของคลาส Label และ TextField แสดงอยVL โป
แกรมน;จะกZาหนดใหUอ5อบเจกต# fr ของคลาส JFrame ม;การจ)ดวางผ)งแบบ FlowLayout ผลล)พธ#ของโปรแกรมน;เY ปyน
      Y
ด)งแสดงในรVปท; 5.12




144       การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU                                       ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท 5.7 ต)วอยLางการสรUางอ5อบเจกต# JTextField
   import java.awt.*;
   import javax.swing.*;

   public class JTextFieldDemo {

         private JFrame fr;
         private JLabel l;
         private JTextField tf;

         public void init() {
             fr = new JFrame("JTextField Demo");
             fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             l = new JLabel("Name: ");
             tf = new JTextField("Numnonda", 15);
             fr.setLayout(new FlowLayout());
             fr.add(l);
             fr.add(tf);
             fr.pack();
             fr.setVisible(true);
         }

         public static void main(String args[]) {
             JTextFieldDemo obj = new JTextFieldDemo();
             obj.init();
         }
   }




                             รปท 5.16 ผลลพธทได*จากการรนโปรแกรมท 5.7

5.4.4 คลาส JTextArea
        JTextArea     เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;สามารถป‚อนและแกUไขขUอความไดU JTextArea จะแตก
ตLางจาก JTextField ตรงท;จะสามารถกZาหนดจZานวนบรรท)ดไดUหลายบรรท)ด โดยท;คลาส JTextArea ม;
constructor ท;สZาค)ญด)งน;Y
    •   public   JTextArea()
    •   public   JTextArea(String Text)
    •   public   JTextArea(String Text, int row, int col)
    •   public   JTextArea(int row, int col)




ผศ. ธนศา เครอไวศยวรรณ                                               การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU   145
โดยท;
      •   text คอขUอความเรมตUนท;ตUองการแสดง

      •   row และ col คอจZานวนแถวและคอล)มน#ของ TextArea

      •   scrollbar เปyนการกZาหนดการม; scrollbar ของ TextArea

          คลาส JTextArea จะม;เมธอดท;สZาค)ญด)งน;Y
      •   public     int getColumns()
      •   public     int getRows()
      •   public     String getSelectedText()
      •   public     boolean isEditable()
      •   public     void select(int selectionStart, int selectionEnd)
      •   public     void selectAll()
      •   public     void setEditable(boolean b)
      •   public     void setText(String t)
      •   public     void setColumns(int column)
      •   public     void setRows(int rows)


          ท)Yงน;Yเมธอดท;สZาค)ญท;อยVLในคลาส JTextArea จะคลUายก)บเมธอดของคลาส JTextArea แตLจะเพมเมธอดท;
เก;ยวขUองก)บการจ)ดการจZานวนแถวขxนมา อาทเชLน setRow() และ getRow()
                                        Y
          โปรแกรมท; 5.8 แสดงต)วอยLางการสรUาง JFrame ท;ม;อ5อบเจกต#ของคลาส JTextArea โดยโปรแกรมน;จะใหU
                                                                                                   Y
ผลล)พธ#ด)งแสดงในรVปท; 5.8

โปรแกรมท 5.8 ต)วอยLางการสรUางอ5อบเจกต# JTextArea
  import java.awt.*;
  import javax.swing.*;

  public class JTextAreaDemo {
      private JFrame fr;
      private JTextArea ta;

          public void init() {
              fr = new JFrame("JTextArea Demo");
              fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              ta = new JTextArea("Text Area", 5, 30);
              JscrollPane jScrollPane = new JScrollPane(ta);
              fr.setLayout(new FlowLayout());
              fr.add(jScrollPane);
              fr.pack();
              fr.setVisible(true);
          }
          public static void main(String args[]) {
              JTextAreaDemo obj = new JTextAreaDemo();
              obj.init();
          }
  }



146       การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU                                         ผศ. ธนศา เครอไวศยวรรณ
รVปท; 5.17 ผลล)พธ#ท;ไดUจากการร)นโปรแกรมท; 5.8

5.4.5 คลาส JCheckBox และ JRadioButton

        JCheckBox     เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;ทZาหนUาท;คลUายปJšม โดยใหUผVUใชUกดชLองท;เปyนสวทซ#เพอ
เลอกหรอไมLเลอกรายการ JCheckBox จะม;ขUอความอยVLขUางๆ เพออธบายความหมายของรายการ JCheckBox ม;
constructor ท;สZาค)ญด)งน;Y
    •   public    JCheckBox(String label)
    •   public    JCheckBox(String label, boolean state)
    •   public    JCheckBox(Icon icon)
    •   public    JCheckBox(Icon icon, boolean state)
    •   public    JCheckBox(String label, Icon icon)
    •   public    JCheckBox(String label, Icon icon, boolean state)

         โดยท;
    • label คอขUอความท;ตUองการแสดงใน JCheckBox
    • Icon คอไอคอนท;ตUองการแสดง          โดยท;
    •   state เปyนต)วกZาหนดสถานะเรมตUนของ JCheckBox กรณ;ท; constructor ไมLไดUกZาหนดสถานะเรมตUนจะ

         ถอวLาม;คาเปyน false (ไมLถVกเลอก)
                 L
        คลาส JCheckBox ม;เมธอดท;สZาค)ญด)งน;Y
    •   public    String getLabel()
    •   public    Object[] getSelectedObjects()
    •   public    void setLabel(String label)
    •   public    void setSelected(boolean state)

      โปรแกรมท; 5.9 แสดงต)วอยLางการใชU JCheckBox โดยโปรแกรมจะสรUางเฟรมท;ม;อ5อบเจกต#ชนด
JCheckBox เพอใหUผVUใชUเลอกสามอ5อบเจกต#ด)งแสดงในในรVปท; 5.18




ผศ. ธนศา เครอไวศยวรรณ                                                        การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU   147
เราสามารถท;จะสรUางต)วเลอกท;เปyนแบบ Radio Button โดยใชU JRadioButton ในกรณ;น;YจะกZาหนดใหU
อ5อบเจกต# JRadioButton หลายต)วอยVในกลJLมเด;ยวก)น โดยอยVLในกลJLมของอ5อบเจกต#ของคลาส ButtonGroup ซxงจะ
                                       L
ตUองใชUเมธอด add()
         คลาส ButtonGroup ไมLใชLคลาสท;เปyนสLวนประกอบกราฟmก แตLจะใชUในการสรUางอ5อบเจกต#เพอกZาหนด
กลJLมของ AbstractButton โดยม; constructor ด)งน;Y
      • public ButtonGroup()

      โปรแกรมท; 5.10 แสดงต)วอยLางของการสรUาง JRadioButton โดยปร)บเปล;ยน JRadioButton ใน
โปรแกรมท; 5.9 ใหUอยVLในกลJLมของอ5อบเจกต#ท;ชอ chg โปรแกรมน;จะม;ผลล)พธ#ท;เปyนสLวนตดตLอก)บผVUใชUด)งรVปท; 5.19
                                                           Y

โปรแกรมท( 5.9 ต)วอยางการสรางอ9อบเจกต JCheckBox
   import java.awt.FlowLayout;
   import javax.swing.*;

   public class JCheckBoxDemo {

         private JFrame fr;
         private JCheckBox c1, c2, c3;

         public void init() {
             fr = new JFrame("JCheckBox Demo");
             fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             c1 = new JCheckBox("Visual Basic");
             c2 = new JCheckBox("C++", false);
             c3 = new JCheckBox("Java", true);
             fr.setLayout(new FlowLayout());
             fr.add(c1);
             fr.add(c2);
             fr.add(c3);
             fr.pack();
             fr.setVisible(true);
         }

           public static void main(String args[]) {
              JCheckBoxDemo obj = new JCheckBoxDemo();
              obj.init();
         }
   }




                                       รปท 5.18 ผลลพธทได*จากการรนโปรแกรมท 5.9


148     การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU                                                ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท( 5.10 ต)วอยางของการสรางอ9อบเจกต JRadioButton

  import java.awt.GridLayout;
  import javax.swing.*;

  public class JRadioButtonDemo {

        private JFrame fr;
        private JRadioButton c1, c2, c3;
        private ButtonGroup chg;

        public void init() {
            fr = new JFrame("JRadioButton Demo");
            fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            c1 = new JRadioButton("Visual Basic");
            c2 = new JRadioButton("C++", false);
            c3 = new JRadioButton("Java", true);
            chg = new ButtonGroup();
            chg.add(c1);
            chg.add(c2);
            chg.add(c3);
            fr.setLayout(new GridLayout(3,1));
            fr.add(c1);
            fr.add(c2);
            fr.add(c3);

              fr.pack();
              fr.setVisible(true);
        }

        public static void main(String args[]) {
            JRadioButtonDemo obj = new JRadioButtonDemo();
            obj.init();
        }
  }




                           รปท 5.19 ผลลพธทได*จากการรนโปรแกรมท 5.10



ผศ. ธนศา เครอไวศยวรรณ                                        การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU   149
5.4.6 คลาส         JComboBox


          JComboBoxเปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เปyนรายการใหUผใชUสามารถเลอกไดUโดย JComboBox จะ
                                                                     VU
แสดงรายการปรากฏใหUเห5นเฉพาะรายการท;เลอกเพ;ยงรายการเด;ยว ปกตกLอนท;จะม;การเลอกรายการ JComboBox จะ
แสดงรายการแรกท;ม;อยVL และหากม;การคลกเมาส# อ5อบเจกต# JComboBox จะแสดงรายการท)Yงหมดท;ม;อยVL โดยท;คลาส
JComboBox ม; constructor ท;สZาค)ญด)งน;Y


      • public JComboBox()
      • public JcomboBox([]Object objs)

          คลาส JComboBox ม;เมธอดตLางๆ ท;สZาค)ญด)งน;Y
      •   public     void addItem(Object item)
      •   public     void insertItemAt(Object item, int pos)
      •   public     Object getItem(int index)
      •   public     int getItemCount()
      •   public     Object getSelectedIndex()
      •   public     Object getSelectedItem()
      •   public     void setSelectedIndex(int pos)
      •   public     void setSelectedItem(Object item)



       เราสามารถท;จะใสLรายการลงในอ5อบเจกต# JComboBox ไดUโดยใชUเมธอด addItem(Object item) คลาส
JComboBox ย)งม;เมธอด setSelectedIndex(int pos) และ setSelectedItem(Object item) เพอใชUใน

การเลอกใหUอ5อบเจกต# JComboBox แสดงรายการท;ตZาแหนLงหรอขUอความท;ตUองการใหUแสดงไดU สLวนเมธอด
getSelectedIndex() และ getSelectedItem() ใชUในการแสดงตZาแหนLงหรอขUอความท;ถVกเลอก


         โปรแกรมท; 5.11 แสดงต)วอยLางเฟรมท;ม;อ5อบเจกต#ชนด JComboBox แสดงอยVL คZาส)ง cb.addItem() ใชUใน
การใสLรายการตLางๆ ลงในอ5อบเจกต# cb สLวนคZาส)ง cb.setSelectedItem (“Thailand”) เปyนการกZาหนดใหU
อ5อบเจกต# cb เลอกแสดงรายการท;ชอ Thailand โปรแกรมน;YจะใหUผลล)พธ#ท;เปyนสLวนตดตLอก)บผVUใชUด)งรVปแสดงในรVป
ท; 5.20




150       การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU                                        ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท( 5.11 ต)วอยางการสรางอ9อบเจกต JComboBox

   import javax.swing.JComboBox;
   import javax.swing.JFrame;

   public class JComboBoxDemo {

         private JFrame fr;
         private JComboBox cb;

         public void init() {
             fr = new JFrame("JRadioButton Demo");
             fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             cb = new JComboBox();
             cb.addItem("New Zealand");
             cb.addItem("Thailand");
             cb.addItem("USA");
             cb.addItem("Japan");
             cb.setSelectedItem("Thailand");
             fr.add(cb);
             fr.pack();
             fr.setVisible(true);
         }

         public static void main(String args[]) {
             JComboBoxDemo obj = new JComboBoxDemo();
             obj.init();
         }
   }




                                รปท 5.20 ผลลพธทได*จากการรนโปรแกรมท 5.11

5.4.7 คลาส       JList


         JList   เปyนคลาสท;ใชUสรUางอ5อบเจกต#ท;เปyนสLวนประกอบกราฟmกเพอใหUผVUใชUสามารถเลอกรายการคลUายก)บ
JComboBox      แตLจะแตกตLางก)นตรงท; JList จะแสดงรายการหลายรายการโดยท;คลาส JList ม; constructor ท;
สZาค)ญด)งน;Y


ผศ. ธนศา เครอไวศยวรรณ                                                    การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU   151
• public JList()
      • public JList([]Object objs)

        คลาส JList มเมธอดทส%าค&ญด&งน(
        •   public void setSelectedIndex(int index)
        •   public void setSelectedIndices(int[]indices)
        •   public void setSelectedValue(Object item, boolean state)
        •   public void setSelectionMode(int selectionMode)
        •   public int getSelectedIndex()
        •   public int[] getSelectedIndices()
        • public Object getSelectedValue()
        • public Object[] getSelectedValues()
        • public int getSelectionMode()

       เราสามารถท;จะใสLรายการลงในอ5อบเจกต# JList ไดUตอนสรUางอ5อบเจกต# โดยสามารถใสLเขUาไปเปyนแบบอะเรย#
(โดยอะเรย#จะม;การกลLาวถxงอยLางละเอ;ยดในบทท; 8) ด)งต)วอยLางโปรแกรมท; 5.12 ซxงจะไดUผลล)พธ#ด)งแสดงในรVปท;
5.21


โปรแกรมท( 5.12 ต)วอยางการสรางอ9อบเจกต JList
  import java.awt.*;
  import javax.swing.*;

  public class JListDemo {

        private JFrame fr;
        private JList list;
        private String[] choices = {"Java SE", "Java EE", "Java ME"};

        public void init() {
            fr = new JFrame("JList Demo");
            fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            list = new JList(choices);
            list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            fr.setLayout(new FlowLayout());
            fr.add(list);
            fr.pack();
            fr.setVisible(true);
        }

        public static void main(String args[]) {
            JListDemo obj = new JListDemo();
            obj.init();
        }
  }




152     การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU                                           ผศ. ธนศา เครอไวศยวรรณ
รปท 5.21 ผลลพธ!ทไดจากการรนโปรแกรมท 5.12

5.5 การสรางเมน

       โปรแกรมจาวาประยJกต#ท;ม;สLวนตLอประสานกราฟmกก)บผVUใชU สามารถท;จะม;เมนVใหUผVUใชUเลอกรายการไดU เมนVเปyน
อ5อบเจกต#ของคลาสท;สบทอดมาจากคลาส JComponent โดยม;ลZาด)บช)YนของคลาสตLางๆ ท;เก;ยวขUองก)บการสรUางเมนV
ด)งแสดงในรVปท; 5.22 ซxงคลาสตLางๆ ท;สZาค)ญม;ด)งน;Y
    • JMenuBar       เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เก5บกลJLมของอ5อบเจกต#ของคลาส JMenu ซxงจะปรากฏเปyน
         แถบเมนVโดยอ5อบเจกต#ของคลาสน;จะตUองม;อ5อบเจกต#ของคลาส JFrame ท;คVLกน
                                         Y                                        )
    •   JMenu เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เก5บกลJLมของอ5อบเจกต#ของคลาส JMenuItem และต)วแยก

         รายการ (JSeparator)
    •   JMenuItem เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เปyนรายการ

    •   JCheckboxMenuItem เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เปyนรายการโดยจะม;เครองหมายถVกท;จะแสดง

         ขxYนเมอรายการน;ถVกเลอก
                         Y
    •   JRadioButtonMenuItem เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เปyนรายการใหUเลอกเพ;ยงต)วเด;ยวแบบ
        Radio Button




                                 รปท 5.22 คลาสทเกยวข*องกบการสร*างเมน


ผศ. ธนศา เครอไวศยวรรณ                                                    การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU   153
5.5.1 การสราง         JMenuBar


         คลาส JMenuBar เปyนคลาสท;จะแสดงเปyนแถบเมนVท;ปรากฏอยVLบน JFrame และม; constructor ด)งน;Y
         • public JMenuBar()

      เราสามารถท;จะใสLอ5อบเจกต#ชนด JMenuBar ลงในอ5อบเจกต#ประเภท Container ไดU โดยใชUเมธอด
setJMenuBar()ของคลาสประเภท Container



5.5.2 การสราง         JMenu


         JMenu  เปyนคลาสท;ใชUในการสรUางรายการท;จะแสดงอยVLขUางในอ5อบเจกต#ของคลาส JMenuBar โดยม;
constructor ท;สZาค)ญด)งน;Y
         • public JMenu()
         • public JMenu(String label)

         โดยท;
      • label คอขUอความท;ปรากฏอยVLในรายการ

      เราจะใชUเมธอด add() ในคลาส JMenuBar เพอท;จะใสLอ5อบเจกต#ของคลาส JMenu ลงใน JMenuBar
โปรแกรมท; 5.13 แสดงต)วอยLางการสรUางอ5อบเจกต#ของคลาส JMenu เพอใสLลงใน JMenuBar โดยม;ชอรายการตLางๆ
โปรแกรมน;YจะใหUผลล)พธ#ด)งแสดงในรVปท; 5.23




                                      รปท 5.23 ผลลพธทได*จากการรนโปรแกรมท 5.13




154     การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU                                         ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท 5.13 ต)วอยLางการสรUาง   JMenu   ท;ใสLลงในอ5อบเจกต#ของคลาส JMenuBar

   import javax.swing.*;

   public class JMenuDemo {
   private JFrame fr;
      private JMenuBar mb;
      private JMenu m1,m2,m3,m4;
      public void init() {
         fr = new JFrame("JMenu Demo");
         fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         mb = new JMenuBar();
         m1 = new JMenu("File");
         m2 = new JMenu("Edit");
         m3 = new JMenu("View");
         m4 = new JMenu("Help");
         fr.setJMenuBar(mb);
         mb.add(m1);
         mb.add(m2);
         mb.add(m3);
         mb.add(m4);
         fr.setSize(200,150);
         fr.setVisible(true);
      }
      public static void main(String args[]) {
         JMenuDemo mm = new JMenuDemo();
         mm.init();
      }
   }




5.5.3 การสราง       JMenuItem

        JMenuItem     คอคลาสท;ใชUในการสรUางรายการยLอยท;อยVLในอ5อบเจกต#ชนด JMenu คลาส JMenuItem ม;
constructor ท;สZาค)ญด)งน;Y
    • public JMenuItem()
    • public JMenuItem(String label)
    • public JMenuItem(String label, int mnemonic)

      เราสามารถท;จะใสLอ5อบเจกต#ของคลาส JMenuItem ลงในอ5อบเจกต#ของคลาส JMenu โดยเร;ยกใชUเมธอด
add() ในคลาส JMenu นอกจากน;Yเราสามารถท;จะกZาหนดค;ยท;เปyน mnemonic ของรายการท;อยVLในอ5อบเจกต#ของ
                                                   #
คลาส JMenuItem ไดUโดยคZาส)ง setMnemonic()
        เราสามารถท;จะสรJปข)นตอนการสรUางเมนVไดUด)งน;Y
                            Y
        1. สรUางอ5อบเจกต#ของคลาส JMenuBar แลUวใสLลงในอ5อบเจกต#ประเภท Container



ผศ. ธนศา เครอไวศยวรรณ                                                การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU   155
2. สรUางอ5อบเจกต#ของคลาส JMenu หนxงอ5อบเจกต#หรอมากกวLา แลUวใสLลงในอ5อบเจกต#ของคลาส JMenuBar
                                         
       3. สรUางอ5อบเจกต#ของคลาส JMenuItem หนxงอ5อบเจกต#หรอมากกวLา แลUวใสLลงใน อ5อบเจกต#ของคลาส
          JMenu


      โปรแกรมท; 5.14 แสดงต)วอยLางการสรUาง JMenuItem และ JMenu ลงใน JMenuBar โดยจะม;ผลล)พธ#ด)ง
แสดงในรVปท; 5.24


โปรแกรมท 5.14 ต)วอยLางการสรUาง JMenuItem
  import javax.swing.*;

  public class JMenuItemDemo {

      private       JFrame fr;
      private       JMenuBar mb;
      private       JMenu m1, m2, m3, m4;
      private       JMenuItem mi1, mi2, mi3, mi4;

      public void init() {
          fr = new JFrame("MenuItem Demo");
          fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          mb = new JMenuBar();
          m1 = new JMenu("File");
          m1.setMnemonic('F');
          m2 = new JMenu("Edit");
          m3 = new JMenu("View");
          m4 = new JMenu("Help");
          fr.setJMenuBar(mb);
          mb.add(m1);
          mb.add(m2);
          mb.add(m3);
          mb.add(m4);
          mi1 = new JMenuItem("New");
          mi2 = new JMenuItem("Open");
          mi3 = new JMenuItem("Save");
          mi4 = new JMenuItem("Exit");
          m1.add(mi1);
          m1.add(mi2);
          m1.addSeparator();
          m1.add(mi3);
          m1.addSeparator();
          m1.add(mi4);
          fr.setSize(200, 200);
          fr.setVisible(true);
      }
      public static void main(String args[]) {
          JMenuItemDemo mid = new JMenuItemDemo();
          mid.init();
      }
  }



156   การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU                                       ผศ. ธนศา เครอไวศยวรรณ
รปท 5.24 ผลลพธทได*จากการรนโปรแกรมท 5.14


5.5.4 คลาส JCheckBoxMenuItem

        JCheckBoxMenuItem   คอรายการเมนVท;ม;เครองหมายระบJวLารายการน;ถVกเลอก คลาส
                                                                      Y
JCheckBoxMenuItem ม; constructor ท;สZาค)ญด)งน;Y

    • public JCheckBoxMenuItem()
    • public JCheckBoxMenuItem(String label)
    • public JCheckBoxMenuItem(String label, boolean state)

        โดยท;
    • label คอขUอความในรายการเมนV
    • state คอสถานะในการเลอกโดยท)วไป จะม;คาเปyน false
                                           L

        นอกจากน;เY ราสามารถท;จะเปล;ยนสถานะของอ5อบเจกต#ของคลาส JCheckBoxMenuItem โดยใชUเมธอด
setState(boolean b)


      โปรแกรมท; 5.15 แสดงต)วอยLางการสรUางอ5อบเจกต#ของคลาส JCheckBoxMenuItem โดยจะม;ผลล)พธ#ด)ง
แสดงในรVปท; 5.25




ผศ. ธนศา เครอไวศยวรรณ                                              การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU   157
โปรแกรมท 5.15 ต)วอยLางการสรUาง JCheckBoxMenuItem
  import javax.swing.*;

  public class JCheckBoxMenuDemo {
     private JFrame fr;
     private JMenuBar mb;
     private JMenu m1,m2,m3;
     private JMenuItem mi;
     private JCheckBoxMenuItem cbm;
     public void init() {
        fr = new JFrame("JCheckboxMenuItem Demo");
        fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mb = new JMenuBar();
        m1 = new JMenu("File");
        m2 = new JMenu("Edit");
        m3 = new JMenu("View");
        fr.setJMenuBar(mb);
        mb.add(m1);
        mb.add(m2);
        mb.add(m3);
        mi = new JMenuItem("Toolbars");
        cbm = new JCheckBoxMenuItem("Status Bar", true);
        m3.add(mi);
        m3.add(cbm);
        fr.setSize(200,200);
        fr.setVisible(true);
     }
     public static void main(String args[]) {
        JCheckBoxMenuDemo obj= new JCheckBoxMenuDemo();
        obj.init();
     }
  }




                                    รปท 5.25 ผลลพธทได*จากการรนโปรแกรมท 5.15



158   การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU                                    ผศ. ธนศา เครอไวศยวรรณ
5.5.5 การสรางเมนย0อย

        เมนVสามารถท;จะม;เมนVยLอยไดUโดยเมนVยLอยจะเปyนอ5อบเจกต#ของคลาส JMenu ซxงข)YนตอนในการสรUางเฟรมท;ม;
เมนVยLอยม;ด)งน;Y
        1. สรUางอ5อบเจกต#ของคลาส JMenuBar แลUวใสLลงไปในอ5อบเจกต#ของคลาส JFrame
        2. สรUางอ5อบเจกต#ของคลาส JMenu แลUวใสLลงไปในอ5อบเจกต#ของคลาส JMenuBar
        3. สรUางอ5อบเจกต#ของคลาส JMenu สZาหร)บเมนVยLอยแลUวใสLลงไปในอ5อบเจกต#ของคลาส JMenu ท;เปyนเมนV
             หล)ก
        4. สรUางอ5อบเจกต#ของคลาส JMeunItem แลUวใสLลงไปในอ5อบเจกต#ของคลาส JMenu ท;เปyนเมนVยLอย

        โปรแกรมท; 5.16 แสดงต)วอยLางการสรUาง JFrame ท;ม;เมนVยLอยโดยโปรแกรมน;YจะใหUผลล)พธ#ด)งแสดงในรVปท;
5.26




                              รปท 5.26 ผลลพธทได*จากการรนโปรแกรมท 5.16




ผศ. ธนศา เครอไวศยวรรณ                                                  การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU   159
โปรแกรมท 5.16 ต)วอยLางการสรUาง JFrame ท;ม;เมนVยLอย

   import javax.swing.*;

   public class SubmenuDemo {

        private       JFrame fr;
        private       JMenuBar mb;
        private       JMenu m1, m2, m3, ms1;
        private       JMenuItem mi2, mi3, mi4, msi1, msi2;

        public void init() {
            fr = new JFrame("SubMenuItem Demo");
            fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            mb = new JMenuBar();
            m1 = new JMenu("File");
            m2 = new JMenu("Edit");
            m3 = new JMenu("View");
            fr.setJMenuBar(mb);
            mb.add(m1);
            mb.add(m2);
            mb.add(m3);
            ms1 = new JMenu("New");
            mi2 = new JMenuItem("Open");
            mi3 = new JMenuItem("Save");
            mi4 = new JMenuItem("Exit");
            m1.add(ms1);
            m1.add(mi2);
            m1.addSeparator();
            m1.add(mi3);

               m1.addSeparator();
               m1.add(mi4);
               msi1 = new JMenuItem("Window");
               msi2 = new JMenuItem("Message");
               ms1.add(msi1);
               ms1.addSeparator();
               ms1.add(msi2);
               fr.setSize(200, 200);
               fr.setVisible(true);
        }

        public static void main(String args[]) {
            SubmenuDemo obj = new SubmenuDemo();
            obj.init();
        }
   }




160    การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU                      ผศ. ธนศา เครอไวศยวรรณ
5.6 ค%ณลกษณะของคลาส Component

       สLวนประกอบกราฟmกตLางๆ จะม;คJณล)กษณะอนอาทเชLน รVปแบบของฟอนต# ส;ของพYนหล)งหรอส;ของพYนหนUา
(Foreground) เราสามารถท;จะกZาหนดคJณล)กษณะของสLวนประกอบกราฟmกไดU โดยปกตสLวนประกอบกราฟmกจะใชU
คJณล)กษณะแบบเด;ยวก)บอ5อบเจกต#ประเภท Container ท;บรรจJอยVLเวUนแตLจะม;การกZาหนดคJณล)กษณะเฉพาะของสLวน
ประกอบกราฟmกน)นๆ
               Y

       เมธอดท;ใชUในการกZาหนดคJณล)กษณะของสLวนประกอบกราฟmก จะอยVLในคลาส Component โดยม;เมธอดท;
สZาค)ญคอ
    • public void setFont(Font f)
    • public void setForeground(Color c)
    • public void setBackground(Color c)

      เมธอด setFont() ใชUในการกZาหนดรVปแบบของฟอนต# สLวนเมธอด setForeground() และ
setBackground() ใชUในการกZาหนดส;พYนหนUาและพYนหล)งตามลZาด)บ



        คลาส Font เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#เพอกZาหนดรVปแบบของฟอนต# โดยม; constructor ด)งน;Y
    • public Font(String name, int style, int size)
        โดยท;
    • name   คอชอของฟอนต#
    •   style เปyนรVปแบบของฟอนต# ซxงคลาส Font ไดUกZาหนดคLาคงท;ไวUคอ   Font.PLAIN, Font.BOLD                  และ
         Font.ITALIC
    • size       คอขนาดของฟอนต#

        ต)วอยLางของการสรUางอ5อบเจกต#ของคลาส Font ม;ด)งน;Y
    • Font fn1 = new Font(“AngsanaUPC”,Font.PLAIN,16);
    • Font fn2 = new Font(“Time Romans”, Font.BOLD + Font.ITALIC, 14);


        คลาส Color เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#สZาหร)บกZาหนดรVปแบบของส; โดยม; constructor ด)งน;Y
    • public Color(int r, int g, int b)
        โดยท;
    • r, g, b   คอคLาความเขUมของแสงส;แดง เข;ยวและนYZาเงน ตามลZาด)บ
        คลาส Color ม;คJณล)กษณะท;กZาหนดส;ท;ใชUทวไปไวUแลUวหลายๆ ส;อาทเชLน
                                                )


ผศ. ธนศา เครอไวศยวรรณ                                                   การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU    161
yellow = new Color(255,255,0);
                 black = new Color(0,0,0);


         โปรแกรมท; 5.12 แสดงต)วอยLางการกZาหนดคJณล)กษณะของอ5อบเจกต#ของคลาส Frame และคลาส Button
ใหUม;ส;และฟอนต#ตLางๆ โดยจะไดUผลล)พธ#ด)งแสดงในรVปท; 5.27


โปรแกรมท( 5.17 ต)วอยางการก(าหนดคณล)กษณะของอ9อบเจกตประเภทกราฟ;ก
  import java.awt.*;
  import javax.swing.*;


  public class AttributeDemo {

       private JFrame fr;
       private JButton bn1, bn2, bn3;

       public void init() {
           fr = new Jframe("ShowAttribute");
           fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           bn1 = new JButton("OK");
           bn2 = new JButton("Cancel");
           bn3 = new JButton("Help");
           fr.setLayout(new FlowLayout());
           fr.add(bn1);
           fr.add(bn2);
           fr.add(bn3);
           bn2.setFont(new Font("TimesRoman", Font.BOLD, 16));
           fr.getContentPane().setBackground(Color.blue);
           bn2.setForeground(Color.red);
           fr.setSize(200, 150);
           fr.setVisible(true);
       }

       public static void main(String args[]) {
           AttributeDemo ad = new AttributeDemo();
           ad.init();
       }
  }




162   การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU                                     ผศ. ธนศา เครอไวศยวรรณ
รปท 5.27 ผลลพธ!ทไดจากการรนโปรแกรมท 5.12


สร%ปเนอหาของบท
        •   AWT เปyนแพคเก5จท;ใชUในการพ)ฒนาโปรแกรม GUI ข)นพYนฐาน ซxงจะใหUโปรแกรม GUI ท;เปyน look and
                                                            Y
            feel ท;ขนอยVLก)บแพลตฟอร#ม โดยกZาหนดในแพคเก5จชอ java.awt
                     xY
        •   Swing เปyนแพคเก5จท;ม;สLวนประกอบกราฟmกท;ม;คณล)กษณะและรVปแบบท;ด;กวLาสLวนประกอบกราฟmกของ
                                                        J
            แพคเก5จ AWT และสามารถกZาหนดรVปแบบของ look and feel ท;ทZาใหUไดUโปรแกรม GUI ท;ม;รVปแบบของ
            กราฟmกเหมอนก)นในทJกแพลตฟอร#ม โดยกZาหนดในแพคเก5จชอ javax.swing
        •   คลาส Component อยVLในแพคเก5จ AWT เปyน superclass ของคลาสประเภทสLวนประกอบกราฟmกทJกคลาส
        •   คลาส Container อยVLในแพคเก5จ AWT เปyนคลาสประเภทต)วใสLสLวนประกอบกราฟmก สบทอดมาจาก
            คลาสท;ชอ Component
                        
        •   คลาสประเภทต)วใสLสLวนประกอบกราฟmกท;สZาค)ญในแพคเก5จ AWT คอคลาส Frame และ Panel
        •   คลาสประเภทสLวนประกอบกราฟmกท;สZาค)ญในแพคเก5จ AWT คอ Button, Label, TextField,
            TextArea, Checkbox, Choice และ List

        •   รVปแบบการจ)ดวางผ)งสLวนประกอบกราฟmกในต)วใสLสLวนประกอบกราฟmกม;ท)Yงหมด 5 รVปแบบคอ
            BorderLayout, FlowLayout, GridLayout, CardLayout และ GridBagLayout

        •   การจ)ดวางผ)งของสLวนประกอบกราฟmกแบบ BorderLayout จะเปyนการวางตามทศตLางๆ ไดU 5 ทศ สLวน
            FlowLayout จะวางไวUในตZาแหนLงบนสJดโดยเร;ยงจากซUายไปขวา สZาหร)บ GridLayout จะวางเร;ยงจาก

            ซUายไปขวา และบนลงลLางในชLองยLอยท;ม;ขนาดเทLาก)น ตามจZานวนแถวและคอล)มน#ท;ไดUระบJไวU
        •   คลาสประเภทต)วใสLสLวนประกอบกราฟmกท;สZาค)ญในแพคเก5จ Swing คอคลาส JFrame และ JPanel
        •   คลาสประเภทสLวนประกอบกราฟmกท;สZาค)ญในแพคเก5จ Swing คอ JButton, JLabel, JTextField,
            JTextArea, JCheckBox, JRadioButton, JComboBox และ JList




ผศ. ธนศา เครอไวศยวรรณ                                               การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU   163
• JLabel จะแสดงขUอความ ซxงผVUใชUไมLสามารถป‚อนขUอความไดU แตLสZาหร)บ JTextField ผVใชUสามารถป‚อน
                                                                                       U
          ขUอความไดUยาวหนxงบรรท)ด สLวน JtextArea ผVใชUสามารถป‚อนขUอความไดUหลายบรรท)ด
                                                    U
      •   JCheckBox จะเปyนชLองใหUผVUใชUเลอกหรอไมLเลอกโดยสามารถเลอกไดUหลายชLองพรUอมก)น ซxงจะแตกตLาง

          จาก JRadioButton ท;จะสามารถเลอกไดUเพ;ยงชLองเด;ยวเทLาน)น
                                                                 Y
      •   JComboBox จะแสดงรายการท;ถVกเลอกเพ;ยงรายการเด;ยว โดยจะแสดงหลายรายการเมอผVใชUคลกเมาส#
                                                                                     U
          เทLาน)น ซxงจะแตกตLางจาก JList ท;จะสามารถแสดงไดUหลายรายการพรUอมก)น
                Y
      •   คลาสท;จะนZามาใชUในการแสดงแถบเมนVและเมนVยLอยในแพคเก5จ Swing คอ JMenuBar, JMenu และ
          JMenuItem
      •   คลาส Font และ Color จะถVกนZามาใชUในกรณ;ท;ตUองการระบJคJณล)กษณะ ฟอนต#และส;ของต)วใสLสLวน
          ประกอบกราฟmกและสLวนประกอบกราฟmก




164   การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU                                         ผศ. ธนศา เครอไวศยวรรณ
บทท 6 การเขยนโปรแกรมภาษาจาวาเช,งอ-อบเจกต.
        เนYอหาในบทท;ผานมาเปyนการแนะนZาการใชUคZาส)งเบYองตUนตLางๆ ในภาษาจาวา โดยการเข;ยนโปรแกรมใน
                       L
ต)วอยLางท;ผานมาสLวนใหญL เปyนการเข;ยนโปรแกรมภาษาจาวาโดยใชUหล)กการเชงกระบวนการ เนYอหาในบทน;Yจะ
            L
เปyนการแนะนZาการเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# โดยแนะนZาการใชUเมธอด การใชU constructor การเข;ยน
โปรแกรมโดยใชUคณล)กษณะเดLนของโปรแกรมเชงอ5อบเจกต# อาทเชLน การหLอหJUม การสบทอด และการม;ไดUหลาย
                  J
รVปแบบ เปyนตUน จากน)นจะเปyนการแนะนZาคลาสภายใน Generic Type และ Annotation
                     Y

6.1 เมธอด

         เมธอดเปyนสมาชกของคลาสเพอระบJวธ;การหรอพฤตกรรม ท;อ5อบเจกต#ของคลาสสามารถกระทZาไดU เมธอดทZา
หนUาท;ในการสLงขLาวสารระหวLางอ5อบเจกต# ซxงเปร;ยบเท;ยบไดUก)บการใชU function หรอ procedure ท;อยVLในโปรแกรม
เชงกระบวนการ การเข;ยนโปรแกรมโดยใชUหล)กการเชงอ5อบเจกต#จะเปyนการแบLงโปรแกรมออกเปyนโมดVลยLอยๆ โดย
แตLละโมดVลจะม;เมธอดอยVLภายในท;สามารถตดตLอก)บโมดVลโดยการเร;ยกใชUเมธอด ทZาใหUสามารถปร)บเปล;ยนแกUไข
โปรแกรมไดUงLายขxYน และสามารถท;จะใชUล)กษณะเดLนตLางๆ ของหล)กการเชงอ5อบเจกต# ไดUเชLน หล)กการของการหLอหJUม
การสบทอด และการม;ไดUหลายรVปแบบ

6.1.1 การเรยกใชเมธอด

        เมธอดท;กZาหนดขxYนในคลาสใดๆ สามารถเร;ยกใชUงานไดUสองรVปแบบคอ
            1. การเร;ยกใชUงานจากคลาสท;ตLางก)น
            2. การเร;ยกใชUงานภายในคลาสเด;ยวก)น

       การเร;ยกใชUเมธอดจากคลาสท;ตLางก)น จะตUองม;การสรUางอ5อบเจกต#ของคลาสท;ม;เมธอดท;จะถVกเร;ยกใชUงานกLอน
จxงจะสามารถเร;ยกใชUเมธอดไดU ด)งต)วอยLางในโปรแกรมท; 6.1 คลาส MyMain จะตUองสรUางอ5อบเจกต#ของคลาส
NumericalClass กLอน จxงจะเร;ยกใชUงานเมธอด calculate() ไดU โดยใชUคZาส)ง

                 NumericalClass obj = new NumericalClass();
                 obj.calculate();


        ท)Yงน;Yเมธอดท;จะถVกเร;ยกใชUงานจากคลาสท;ตLางก)น จะตUองไมLม; modifier เปyน private



ผศ. ธนศา เครอไวศยวรรณ                                                    การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   165
การเร;ยกใชUเมธอดภายในคลาสเด;ยวก)นสามารถทZาไดUโดยไมLจZาเปyนตUองสรUางอ5อบเจกต#ของคลาสขxYนมากLอน
และสามารถเร;ยกเมธอดไดUทJกเมธอด ยกเวUนเมธอดท;ม; modifier เปyน static จะไมLสามารถเร;ยกใชUเมธอดท;ไมLม;
modifier เปyน static (เร;ยกวLา เมธอดแบบ non-static) ไดU ซxงจะกลLาวถxงภายหล)ง โปรแกรมท; 6.2 แสดงต)วอยLาง
การเร;ยกใชUเมธอดภายในคลาสเด;ยวก)น โปรแกรมน;กZาหนดเมธอดในคลาส NumericalClass ขxYนมาใหมLท;ชอ
                                            Y
callMethod() แลUวเร;ยกใชUเมธอด calculate() ภายในเมธอดท;กZาหนดขxนใหมL   Y


โปรแกรมท 6.1 การเร;ยกใชUเมธอดจากคลาสท;ตLางก)น

  public class NumericalClass {
             public void calculate() {
                       double score = Math.random()*100;
                       if (score >= 80) {
                                  System.out.println("Grade is A");
                       } else if (score >= 70) {
                                  System.out.println("Grade is B");
                       } else if (score >= 60){
                                  System.out.println("Grade is C");
                       } else if (score >= 50){
                                  System.out.println("Grade is D");
                       } else {
                                  System.out.println("Grade is F");
                       }
             }
  }
โปรแกรมท
  --------------------------------------------------------------------------------------------------------------------------------------------------------
                    6.
  public class MyMain {
             public static void main(String args[]) {
                       NumericalClass obj = new NumericalClass();
                       obj.calculate();
             }
  }




6.1.2 การส0งผ0าน argument

          เมธอดท;กZาหนดขxนในคลาสอาจม; argument ท;ร)บคLาเพอนZาไปใชUในเมธอดอาทเชLน เมธอด setGpa() ใน
                          Y
คลาส Student ของโปรแกรมท; 6.3 จะม; argument สZาหร)บร)บคLาขUอมVลท;ม;ชนดขUอมVลเปyน double ในกรณ;นการ ;Y
เร;ยกใชUเมธอดจะตUองสLง argument ท;ม;ชนดขUอมVลท;สอดคลUองก)นไปพรUอมก)น ด)งน)นการเร;ยกใชUเมธอด setGpa() จะ
                                                                            Y
ตUองสLง argument ท;ม;ชนดขUอมVลเปyน double ไปพรUอมก)บชอเมธอด ด)งแสดงในคลาส MyMain2 ในโปรแกรมท; 6.3
(คZาส)ง s1.setGpa(3.0);)



166        การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                                                                                               ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท 6.2 การเร;ยกใชUเมธอดภายในคลาสเด;ยวก)น

  public class NumericalClass {
      public void calculate() {
          double score = Math.random()*100;
          if (score >= 80) {
              System.out.println("Grade is A");
          } else if (score >= 70) {
              System.out.println("Grade is B");
          } else if (score >= 60){
              System.out.println("Grade is C");
          } else if (score >= 50){
              System.out.println("Grade is D");
          } else {
              System.out.println("Grade is F");
          }
      }
      public void callMethod() {
          calculate();
      }
  }




โปรแกรมท 6.3 ต)วอยLางการสLงผLาน argument
   public class Student {
         String id;
         String name;
         double gpa;
         public void setGpa(double GPA) {
            gpa = GPA;
         }
         public double getGpa() {
            return gpa;
         }
   }

   ------------------------------------------------------
   public class MyMain2 {
         public static void main(String args[]) {
               Student s1 = new Student();
               s1.setGpa(3.0);
         }
   }



        argument    ของเมธอดจะม;ชนดขUอมVลเปyนสองแบบตามชนดขUอมVลของต)วแปรด)งน;Y
              1.argument ท;ม;ชนดขUอมVลแบบพYนฐาน
              2.argument ท;ม;ชนดขUอมVลแบบอUางอง



ผศ. ธนศา เครอไวศยวรรณ                                             การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   167
ในกรณ;ของ argument ท;ม;ชนดขUอมVลแบบพYนฐาน เราสามารถท;จะสLงคLาคงท;ขUอมVล ต)วแปร หรอนพจน#ใหU
ก)บ argument ไดUอาทเชLน การเร;ยกใชUเมธอด setGpa() น)น argument ท;จะสLงผLานอาจม;รVปแบบเปyน
                                                    Y

         •   คLาคงท;ขUอมVล เชLน
                   s1.setGpa(3.0);

         •   ต)วแปร เชLน
                   double x = 3.0;
                   s1.setGpa(x);
         •   นพจน# เชLน
                   s1.setGpa(3.0+0.05);


          สLวนกรณ; argument ท;ม;ชนดขUอมVลแบบอUางอง เราจะตUองสLงอ5อบเจกต#ท;ม;ชนดขUอมVลท;สอดคลUองไปเทLาน)น
                                                                                                          Y
ยกเวUนกรณ;ท; argument น)นม;ชนดขUอมVลเปyน String ซxงในกรณ;นจะสามารถสLงขUอมVลคLาคงท;ไดU โปรแกรมท; 6.4
                            Y                                 ;Y
เปyนต)วอยLางของคลาส StudentV1 ท;ม;คJณล)กษณะ dob ซxงม;ชนดขUอมVลเปyนคลาส MyDate ท;กZาหนดไวUในโปรแกรม
ท; 6.5 เพอเก5บว)น เดอน ป}เกดของอ5อบเจกต#ชนด StudentV1 คลาส StudentV1 ม;เมธอด setDOB()เพอใชUในการ
กZาหนดคLาใหUก)บคJณล)กษณะ dob

โปรแกรมท 6.4 ต)วอยLางการสLงผLาน argument ท;เปyนอ5อบเจกต#
    public class StudentV1 {
        String id;
        String name;
        MyDate dob;

          public void setDOB(MyDate d) {
            dob = d;
          }
          public MyDate getDOB() {
            return dob;
          }
    }




         โปรแกรมท; 6.6 แสดงการเร;ยกใชUเมธอดด)งกลLาวโดยตUองสLงผLานอ5อบเจกต#ของคลาส MyDate ใหUก)บเมธอด
ด)งน;Y
                   MyDate d1 = new MyDate(16, 12, 1980);
                   s1.setDOB(d1);

         สZาหร)บกรณ;ของโปรแกรมท; 6.6 เนองจากอ5อบเจกต# d1 ท;สรUางขxYนมา จะไมLม;การอUางองภายในโปรแกรมน;อ;ก
                                                                                                        Y


168      การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                            ผศ. ธนศา เครอไวศยวรรณ
ด)งน)นเราสามารถท;จะสรUางอ5อบเจกต#และสLงผLานไปย)ง argument ในคZาส)งเด;ยวก)นไดUด)งน;Y
     Y
                 s1.setDOB(new MyDate (16, 12, 1980));



โปรแกรมท 6.5 คลาส MyDate เพอเก5บคLาว)น เดอน และป}

   public class MyDate {
       private int day;
       private int month;
       private int year;

         public MyDate(int d, int m, int y) {
             day = d;
             month = m;
             year = y;
         }

         public void setDay(int d) {
             day = d;
         }

         public void setMonth(int m) {
             month = m;
         }

         public void setYear(int y) {
             year = y;
         }

         public void showDetails() {
             System.out.println("Date : " + day + "/" + month + "/" + year);
         }
   }




โปรแกรมท 6.6 ต)วอยLางการเร;ยกใชUเมธอดท;ม; argument เปyนอ5อบเจกต#

   public class TestStudentV1 {
       public static void main(String args[]) {
          StudentV1 s1 = new StudentV1();
          MyDate d1 = new MyDate(16, 12, 1980);
          s1.setDOB(d1);
       }
   }




ผศ. ธนศา เครอไวศยวรรณ                                                    การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   169
ชนดขUอมVลของ argument ท;จะสLงผLานไปย)งเมธอดไมLจZาเปyนท;จะตUองเปyนชนดขUอมVลเด;ยวก)น แตLตUองเปyนชนด
ขUอมVลท;สามารถแปลงขUอมVลใหUกวUางขxYนไดUโดยอ)ตโนม)ตอาทเชLน เราสามารถท;จะสLง argument ท;ม;ชนดขUอมVลเปyน int
ใหUก)บเมธอด setGpa() ท;ตUองการ argument ท;ม;ชนดขUอมVลเปyน double ไดUด)งน;Y s1.setGpa(3);
         เมธอดใดๆ อาจม; argument สZาหร)บร)บคLามากกวLาหนxงต)ว แตLการเร;ยกใชUเมธอดเหลLาน;จะตUองสLง argument ท;
                                                                                        Y
ม;ชนดขUอมVลท;สอดคลUองก)นและม;จZานวนเทLาก)น ยกเวUนกรณ;ท; argument ของเมธอดเปyนแบบ varagrs (Variable
Arguments) โดยม;ส)ญล)กษณ#เปyน ... เชLนถUาม;การประกาศเมธอด calMax(int... x) จะทZาใหUสามารถเร;ยกใชU
เมธอดน;YไดUโดยไมLตUองสLงหรอจะสLง argument ก;ต)วก5ไดU เชLน obj.calMax(); หรอ obj.calMax(1,2,3); จะ
สามารถใชUไดUท)YงสYน
         โปรแกรมท; 6.7 แสดงต)วอยLางของคลาส NumericalSample ซxงม;เมธอด calMax() ท;ร)บ argument สอง
ต)วท;ม;ชนดขUอมVลเปyน int และ double ตามลZาด)บ การเร;ยกใชUเมธอดน;YจะตUองสLงผLาน argument จZานวนสองต)วอาท
เชLน คZาส)ง obj.calMax(3,4.0); ในเมธอด main() นอกจากน;เY ราย)งจะสามารถเร;ยกใชUเมธอด calMax() ในรVป
แบบอนไดUโดยสLง argument ท;ม;ชนดขUอมVลท;สอดคลUองก)นอาทเชLน
                 obj.calMax(3,4);
                 obj.calMax(3,4L);

      แตLเราไมLสามารถท;จะเร;ยกใชUเมธอดโดยม;จZานวน argument ไมLเทLาก)บท;กZาหนด หรอม;ชนดขUอมVลท;ไมL
สอดคลUองก)นอาทเชLน คZาส)ง
                 obj.calMax(3);
                 obj.calMax(4.0);
                 obj.calMax(3L,4.0);
                 obj.calMax(3.0,4);
                 obj.calMax(3,4.0,5);


       จะเปyนคZาส)งในการเร;ยกใชUเมธอดท;ผด

โปรแกรมท 6.7 ต)วอยLางการสLงผLาน argument จZานวนสองต)ว

  public class NumericalSample {
     public void calMax(int i, double d) {
        if (i > d) {
           System.out.println("Max = "+i);
        } else {
           System.out.println("Max = "+d);
        }
     }
     public static void main(String args[]) {
        NumericalSample obj = new NumericalSample();
        obj.calMax(3,4.0);
     }
  }




170    การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                               ผศ. ธนศา เครอไวศยวรรณ
ในกรณ;ท; argument ม;ชนดขUอมVลเปyนแบบพYนฐาน และม;การสLง argument โดยใชUต)วแปรใหUก)บเมธอดท;ถVก
เร;ยกใชUงาน โปรแกรมภาษาจาวาจะถอวLาเปyนการสLงคLาไปใหUเทLาน)น หากม;การเปล;ยนแปลงคLาของ argument ภายใน
                                                               Y
เมธอดท;ถVกเร;ยกใชUงาน จะไมLมผลทZาใหUคาของ argument ท;สLงไปเปล;ยนคLาไปดUวย โปรแกรมท; 6.8 แสดงต)วอยLางการ
                                ;      L
เร;ยกใชUเมธอด method1()ในคลาส ArgumentPassing ซxงร)บ argument ท;เปyนต)วแปร x เขUามา ซxงเมอ x ใน
เมธอดเปล;ยนคLาเปyน 3 จะไมLม;ผลทZาใหUคาของ x ในเมธอด main() เปล;ยนไปดUวย จxงไดUผลล)พธ#ออกมาเปyน 4 เชLนเดม
                                         L
อนxงต)วแปร x ท;อยVLในเมธอด main() และเมธอด method1()เปyนต)วแปรคนละต)วก)น และม;ตZาแหนLงอUางองสZาหร)บ
เก5บขUอมVลในหนLวยความจZาท;ตางก)น เพ;ยงแตLม;ชอเด;ยวก)นเทLาน)น
                              L                              Y

          สLวนกรณ;ท; argument ม;ชนดขUอมVลเปyนแบบอUางองจะเปyนการสLงตZาแหนLงอUางองของอ5อบเจกต#ไปใหUก)บเมธอด
ท;ถVกเร;ยกใชUงาน ด)งน)นการเปล;ยนแปลงคLาของคJณล)กษณะของอ5อบเจกต#จะม;ผลทZาใหUคLาของคJณล)กษณะของอ5อบเจกต#
                       Y
ท;สLงไปเปล;ยนไปดUวย ต)วอยLางเชLนในโปรแกรมท; 6.8 การเร;ยกใชUเมธอด method2()โดยการสLงผLานต)วแปรท;เปyน
อ5อบเจกต#ของคลาส Date ไป แลUวเปล;ยนคLาของคJณล)กษณะว)น เดอน และป}ของอ5อบเจกต#ในเมธอด method2()จะม;
ผลทZาใหUคLาของคJณล)กษณะว)น เดอน และป}ของอ5อบเจกต# d1 ในเมธอด main()เปล;ยนไปดUวย

โปรแกรมท( 6.8 ต)วอยางการเปล%ยนแปลงคาของ argument

   public class ArgumentPassing {
      public void method1(int x) {
           x = 3;
       }

         public void method2(MyDate d) {
             d.setDay(1);
             d.setMonth(1);
             d.setYear(2002);
         }

         public int method3() {
             return 0;
         }

         public static void main(String args[]) {
             int x = 4;
             ArgumentPassing obj = new ArgumentPassing();
             MyDate d1 = new MyDate(16, 12, 1980);
             obj.method1(x);
             System.out.println("x = " + x);
             obj.method2(d1);
             d1.showDetails();
             obj.method3();
         }
   }




ผศ. ธนศา เครอไวศยวรรณ                                                การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   171
6.1.3 การรบค0าทส0งกลบมา

        เมธอดใดๆ ของคลาสสามารถท;จะม;คาท;สLงกล)บมาไดU ท)Yงน;YการประกาศเมธอดจะตUองระบJชนดขUอมVลของคLาท;
                                          L
จะสLงกล)บใน return_type ซxงชนดขUอมVลของคLาท;จะสLงกล)บอาจเปyนชนดขUอมVลแบบพYนฐาน หรอเปyนชนดขUอมVลแบบ
                                             
อUางอง ในกรณ;ท;เมธอดไมLม;ขUอมVลจะสLงกล)บมาจะตUองระบJใหU return_type เปyน void อาทเชLน เมธอด setGpa()
ในคลาส student ของโปรแกรมท; 6.3 นอกจากน;เY มธอดท;มคLาท;จะสLงกล)บมาจะตUองม;คZาส)ง return ซxงจะระบJคาท;
                                                        ;                                              L
สLงกล)บโดยม;รVปแบบด)งน;Y
               return value;



          โดยท; value ขxนอยVLก)บชนดขUอมVลท;จะสLงกล)บ ถUาเปyนชนดขUอมVลแบบพYนฐานอาจเปyนคLาคงท;ขUอมVล ต)วแปร
                           Y
หรอนพจน#ก5ไดU แตLถUาเปyนชนดขUอมVลแบบอUางองตUองเปyนอ5อบเจกต#เทLาน)น ยกเวUนชนดขUอมVล String ท;อาจเปyน
                                                                       Y
ขUอมVลคLาคงท;ไดU คZาส)ง return จะม;ผลใหUโปรแกรมสYนสJดการทZางานในบล5อกของเมธอดน)นแลUวกล)บไปย)งคZาส)งเดม
                                                                                     Y
ท;เร;ยกใชUเมธอดน)นY

       โดยท)วไปการเร;ยกใชUเมธอดท;ม;การสLงคLากล)บมาน)น จะตUองเร;ยกใชUเมธอดน)Yนในนพจน#อาทเชLน การเร;ยกใชU
                                                      Y
เมธอด getGpa() ของคลาส Student ในโปรแกรมท; 6.3 อาจทZาไดUด)งน;Y

                 double d = s1.getGpa();
        หรอ
                 System.out.println("GPA: "+ s1.getGpa());


         ท)YงสองคZาส)งเปyนการเร;ยกใชUเมธอดในนพจน# แตLคZาส)งแรกจะเก5บคLาท;สLงกล)บในต)วแปรท; d สLวนคZาส)งท;สองจะ
ไมLเก5บคLาท;สLงกล)บแตLจะพมพ#คLาออกมา

      นอกจากน;เY ราสามารถท;เร;ยกใชUเมธอดท;ม;การสLงคLากล)บมา โดยไมLอยVLในรVปของนพจน#ไดUอาทเชLน เมธอด
method3() ในโปรแกรมท; 6.8 จะสLงคLาท;ม;ชนดขUอมVลเปyน int กล)บมา แตLเนองจากไมLตUองการใชUคLาด)งกลLาว จxง

สามารถใชUคZาส)ง obj.method3(); ไดUโดยไมLตUองใชUคZาส)งกZาหนดคLา

6.1.4 modifier ของเมธอด

       เมธอดของคลาสจะม; modifier ท;ประกาศไวUหนUา return_type ของเมธอดด)งท;ระบJไวUในห)วขUอท; 4.2.3 ซxง
modifier ของเมธอดแบLงออกเปyน



172    การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                                    ผศ. ธนศา เครอไวศยวรรณ
• access modifier   เพอระบJถxงระด)บการเขUาถxง
        •   static เพอระบJวาเปyนเมธอดแบบ static
                             L
        •   abstract เพอระบJวาเมธอดย)งไมLสมบVรณ#
                                L
        •   synchronized เพอระบJวาเมธอดจะม;การล5อกอ5อบเจกต# ซxงใชUในกรณ;ของโปรแกรมท;เปyนแบบเธรด
                                    L
            (thread)
        • final     เพอระบJวาเมธอดน;YไมLสามารถ
                             L                    override ไดU


access modifier


        modifier ประเภทน;YใชUเพอระบJระด)บการเขUาถxง โดยม;คย#เวร#ดตLางๆ ด)งน;Y
                                                           ;
        • public
        • protected
        • private
        • default (ไมLระบJค;ยเวร#ดใดๆ )
                             #

         เมธอดหรอคJณล)กษณะท;ม; modifier เปyนแบบ public จะทZาใหUเมธอดหรอคJณล)กษณะน)Yนสามารถท;จะถVก
เร;ยกใชUจากเมธอดของคลาสอนไดU สLวนเมธอดหรอคJณล)กษณะท;ม; modifier เปyนแบบ private จะถVกป‚องก)นไมLใหU
เมธอดจากคลาสอนเร;ยกใชUไดU โดยจะสามารถถVกเร;ยกใชUไดUจากเมธอดภายในคลาสเด;ยวก)นเทLาน)น โปรแกรมท; 6.9
                                                                                   Y
แสดงต)วอยLางการประกาศเมธอดและคJณล)กษณะท;ม; modifier เปyนแบบ public และ private ต)วอยLางน;แสดงใหU
                                                                                               Y
เห5นวLาเมธอดและคJณล)กษณะท;ม; modifier เปyนแบบ private ไมLสามารถท;จะใหUคลาสอนเร;ยกใชUงานไดU กรณ;ท;
เมธอดหรอคJณล)กษณะไมLระบJคย#เวร#ดใดๆ สZาหร)บ access modifier ภาษาจาวาจะถอวLาเปyน default ซxงจะทZาใหU
                            ;
เมธอดหรอคJณล)กษณะน)นสามารถท;จะถVกเร;ยกใชUจากเมธอดของคลาสอนท;อยVLในแพคเก5จเด;ยวก)นไดU สZาหร)บความ
                      Y
หมายของ modifier ท;เปyนแบบ protected จะกลLาวถxงตLอไป

6.2 การเขยนโปรแกรมโดยใชหลกการของการห0อห%ม

        ขUอด;ของการหLอหJUมประการหนxงคอการซLอนเรUนขUอมVลโปรแกรมเชงอ5อบเจกต#ท;ด;จะออกแบบใหUอ5อบเจกต#ม;
                                    
เมธอดท;ประกาศใหUอ5อบเจกต#อนๆ เร;ยกใชUงานไดU แตLจะซLอนรายละเอ;ยดหรอวธ;การท;เมธอดน)นใชU และซLอน
                                                                                     Y
คJณล)กษณะตLางๆ ของอ5อบเจกต#ไวU หล)กการหLอหJUมของ อ5อบเจกต#ในภาษาจาวาทZาไดUโดยการระบJ modifier ของ
เมธอดหรอคJณล)กษณะด)งน;Y
        • คJณล)กษณะของอ5อบเจกต#จะม; modifier เปyน private เพอซLอนไมLใหUอ5อบเจกต#อนๆ เร;ยกใชUไดU
        • เมธอดของอ5อบเจกต#ท;ตUองการใหUอ5อบเจกต#อนๆ เร;ยกใชUจะม; modifier เปyน public



ผศ. ธนศา เครอไวศยวรรณ                                                      การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   173
โปรแกรมท 6.9 ต)วอยLางการประกาศเมธอดและคJณล)กษณะ

  public class PrivateStudent {
     private String id;
     private String name;
     private double gpa;
     public void setDetails(String ID,String n,double GPA) {
           id = ID;
           name = n;
           gpa = GPA;
     }
     public void showDetails() {
           System.out.println("ID: "+id);
           System.out.println("Name: "+name);
           System.out.println("GPA: "+gpa);
     }
  }
  ------------------------------------------------------------------
  public class TestPrivateStudent {
     public static void main(String args[]) {
        PrivateStudent ps = new PrivateStudent();
        /*    ps.id = "12345";            illegal
              ps.name = "Thana";          illegal
              ps.gpa = 3.25;              illegal */
        ps.setDetails("12345","Thana",3.25);
        ps.showDetails();
     }
  }




โปรแกรมท 6.10 ต)วอยLางคลาสท;ไมLไดUใชUหล)กการของการหLอหJUม

  public class Student {
     String ID;
     String name;
     public double gpa;
  }

  --------------------------------------------------------------------------------------------------------------------------------------------------------
  public class NoEncapDemo {
          public static void main(String args[]) {
                   Student s1 = new Student();
                   double temp = Double.parseDouble(args[0]);
                   if ((temp<0) || (temp>4.00)) {
                           System.out.println("Incorrect Format!");
                   } else {
                           s1.gpa = temp;
                           System.out.println("GPA: "+s1.gpa);
                   }
          }
  }




174       การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                                                                                                ผศ. ธนศา เครอไวศยวรรณ
รปท 6.1 ตวอย%างผลลพธทได*จากการรนโปรแกรมท 6.10


           โปรแกรมท; 6.10 แสดงต)วอยLางคลาสท;ไมLไดUใชUหล)กการของการหLอหJUม โดยการกZาหนดใหUคJณล)กษณะ gpa
ซxงม; modifier เปyน public ทZาใหUอ5อบเจกต#อนๆ สามารถเร;ยกใชU gpa ไดUโดยตรง คลาส NoEncapDemo ไดUสรUาง
อ5อบเจกต#ของคลาส Student ท;ชอวLา s1 และไดUกZาหนดใหUผใชUสามารถป‚อนคLา gpa ผLานเขUามาทาง command line
                                                               VU
ซxงผVUใชUอาจป‚อนคLา gpa ท;ไมLถVกตUองเชLน เปyนคLาต)วเลขจZานวนลบ หรอม;คLามากกวLา 4.00 ด)งน)นจxงจะตUองม;การตรวจ
                                                                                           Y
สอบคLาท;ป‚อนเขUามากLอนท;จะม;การกZาหนดคLาใหUก)บคJณล)กษณะ gpa ทJกคร)YงโดยใชUคZาส)ง if..else การเข;ยน
                            
โปรแกรมแบบน;ทZาใหUโปรแกรมซ)บซUอนขxนและยากตLอการแกUไข ซxงต)วอยLางของผลล)พธ#ท;ไดUจากการร)นโปรแกรมท;
                  Y                          Y
6.10 เปyนด)งรVปท;6.1

        โปรแกรมท; 6.11 ไดUเปล;ยนคJณล)กษณะของ gpa ใหUม; modifier เปyน private และกZาหนดเมธอดใหมLท;ชอ
setGpa() ท;ม; modifier เปyน public เพอใหUอ5อบเจกต#อนๆ ท;ตUองการกZาหนดคLา gpa เร;ยกใชUไดU ซxงการเข;ยน

โปรแกรมแบบน;เY ปyนการใชUหล)กการของการหLอหJUม ด)งน)นการกZาหนดคLาใหUก)บคJณล)กษณะ gpa ของอ5อบเจกต# s1 ใน
                                                   Y
คลาส EncapDemo จะทZาไดUโดยการเร;ยกใชUเมธอด setGpa() เทLาน)น ซxงในเมธอดด)งกลLาวจะม;การตรวจสอบคLาของ
                                                                Y
gpa อยVLภายใน ทZาใหUการเข;ยนโปรแกรมทZาไดUงLายขxนเพราะไมLจZาเปyนตUองตรวจสอบคLาทJกคร)Yง และงLายตLอการแกUไข
                                               Y
โปรแกรมในกรณ;ท;ขUอกZาหนดของคJณล)กษณะ gpa เปล;ยนแปลงไป เนองจากเปyนคZาส)งเฉพาะในเมธอดเทLาน)Yน

6.2.1 เมธอดแบบ Accessor

       การเขUาถxงคJณล)กษณะของอ5อบเจกต#ท;ม; modifier เปyน private น)นจะตUองใชUเมธอดแบบ accessor ในการ
                                                                    Y
กZาหนดคLาของคJณล)กษณะ หรอดxงคLาของคJณล)กษณะออกมาใชUงาน

        เมธอดแบบ accessor แบLงออกไดUเปyนสองประเภทคอ

            •   เมธอดแบบ setter จะใชUในการกZาหนดคLาของคJณล)กษณะ ซxงเมธอดแบบน;YจะไมLม;การสLงคLากล)บ ด)งน)Yน



ผศ. ธนศา เครอไวศยวรรณ                                                   การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   175
จxงระบJชนดขUอมVลของคLาท;ตUองการสLงกล)บเปyน void โดยท)วไปชอของเมธอดแบบน;จะขxYนตUนดUวยคZา
                                                                                                      Y
                            วLา set แลUวตามดUวยชอของคJณล)กษณะ ซxงม;รVปแบบด)งน;Y
                                   public void setAttributeName(dataType arg) {
                                       attributeName = arg;
                                   }

                  โดยท;
                                   • dataType     คอชนดขUอมVลของคJณล)กษณะท;ตUองการกZาหนดคLา
                                   •    arg คอต)วแปรท;จะร)บคLาของคJณล)กษณะท;ตUองการกZาหนด

                                   •    attributeName คอชอของคJณล)กษณะ


                  ต)วอยLางเชLนคลาส Student ม;เมธอด setGpa() เพอกZาหนดคLาของคJณล)กษณะ gpa ซxงม;คZาส)งด)งน;Y
                            public void setGpa(double GPA) {
                                  gpa = GPA;
                            }



โปรแกรมท 6.11 ต)วอยLางคลาสท;ใชUหล)กการของการหLอหJUม (ต)วอยLางท; 1)
  public class Student {
          String ID;
          String name;
          private double gpa;
          public void setGpa(double GPA) {
                   if ((GPA<0) || (GPA>4.00)) {
                           System.out.println("Incorrect Format!");
                   } else {
                           gpa = GPA;
                   }
          }
          public double getGpa() {
                   return gpa;
          }
  }
  --------------------------------------------------------------------------------------------------------------------------------------------------------
  public class EncapDemo {
          public static void main(String args[]) {
                   Student s1 = new Student();
                   double temp = Double.parseDouble(args[0]);
                   s1.setGpa(temp);
                   System.out.println("GPA: "+s1.getGpa());
          }
  }




176       การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                                                                                                ผศ. ธนศา เครอไวศยวรรณ
•   เมธอดแบบ getter จะใชUในการเร;ยกคLาของคJณล)กษณะ ซxงเมธอดแบบน;จะม;การสLงคLากล)บ ด)งน)นจxงตUอง
                                                                              Y                     Y
                  ระบJชนดขUอมVลของคLาท;สLงกล)บมาดUวยเสมอ โดยท)วไปชอของเมธอดแบบน;จะขxนตUนดUวยคZาวLา get
                                                                                 Y Y
                  แลUวตามดUวยชอของคJณล)กษณะ ซxงม;รVปแบบด)งน;Y
                        public dataType getAttributeName() {
                            return attributeName;
                        }


            ต)วอยLางเชLน คลาส Student ม;เมธอด getGpa() เพอเร;ยกคLา ของ gpa ท;ม;คZาส)งด)งน;Y
                 public double getGpa() {
                       return gpa;
                 }
         ชอของเมธอดแบบ getter สZาหร)บคJณล)กษณะท;ม;ชนดขUอมVลเปyน boolean โดยท)วไปจะกZาหนดใหUขนตUนดUวย
                                                                                                xY
คZาวLา is แทนท;จะเปyนคZาวLา get อาทเชLน เมธอด isGraduate() เปyนเมธอดเพอเร;ยกคLาของคJณล)กษณะ graduate
ของคลาส Student ท;ม;ชนดขUอมVลเปyน boolean

โปรแกรมท 6.12 ต)วอยLางคลาสท;ใชUหล)กการของการหLอหJUม (ต)วอยLางท; 2)
  public class EncapStudent {
     private String id;
     private String name;
     private double gpa;
     public void setId(String ID) {
        id = ID;
     }
     public void setName(String n) {
        name = n;
     }
     public void setGpa(double GPA) {
        if ((GPA<0) || (GPA>4.00)) {
           System.out.println("Incorrect Format!");
        } else {
           gpa = GPA;
        }
     }
     public String getId() {
        return id;
     }
     public String getName() {
        return name;
     }
     public double getGpa() {
        return gpa;
     }
  }




ผศ. ธนศา เครอไวศยวรรณ                                                     การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   177
โปรแกรมท; 6.12 แสดงต)วอยLางของโปรแกรมภาษาจาวาท;ใชUหล)กการของการหLอหJUมโดยกZาหนดใหU
คJณล)กษณะตLางๆ ของอ5อบเจกต#ม; modifier เปyนแบบ private และกZาหนดใหUม;เมธอดแบบ accessor ท)Yงท;เปyนแบบ
setter และ getter เพอทZาใหUสามารถเขUาถxงคJณล)กษณะแตLละต)วไดU

        คJณล)กษณะของอ5อบเจกต#บางกรณ;อาจไมLสามารถกZาหนดเมธอดแบบ setter ไดU ท)Yงน;เY นองจากอาจไมLตUองการ
ใหUม;การกZาหนดคLาไดUโดยตรง โปรแกรมท; 6.13 แสดงต)วอยLางคลาส Account ซxงม;คณล)กษณะ balance เพอเก5บ
                                                                              J
ยอดเงนคงเหลอในบ)ญช; โปรแกรมน;YไดUกZาหนดใหUม;เมธอดแบบ getter ท;ชอ getBalance() เพอเร;ยกดVยอดเงนใน
บ)ญช; แตLไมLม;เมธอดแบบ setter เพอกZาหนดคLา balance ท)Yงน;YเนองจากคJณล)กษณะ balance จะเปล;ยนคLาไปเมอม;
การเร;ยกใชUเมธอด deposit() และ withdraw() ท;ใชUในการฝากและถอนเงนตามลZาด)บ


โปรแกรมท 6.13 ต)วอยLางคลาสท;ใชUหล)กการของการหLอหJUม (ต)วอยLางท; 3)

   public class Account {
      private double balance;
      public double getBalance() {
         return balance;
      }
      public void deposit(double amount) {
         balance += amount;
      }
      public void withdraw(double amount) {
         balance -= amount;
      }
   }




6.2.2 คย.เว,รด this
             .

          ค;ย#เวร#ด this หมายถxงอ5อบเจกต#ของต)วเอง เราสามารถท;จะเร;ยกใชUเมธอดหรอคJณล)กษณะภายในคลาสไดUโดย
ใชUค;ย#เวร#ด this ซxงม;รVปแบบด)งน;Y
               this.methodName();
               this.attirbuteName;


        โดยท)วไปเราจะไมLใชUค;ย#เวร#ด this ในคZาส)ง ยกเวUนในกรณ;ท;จZาเปyน โปรแกรมท; 6.14 เปyนต)วอยLางการเร;ยก
ใชUคJณล)กษณะของออปเจ5ตโดยใชUค;ย#เวร#ด this กรณ;น;YถUาไมLระบJวา this.id, this.name และ this.gpa
                                                               L
คอมไพเลอร#จะเขUาใจวLาหมายถxงต)วแปรท;เปyน argument ของเมธอด ไมLใชLต)วแปรท;เปyนคJณล)กษณะของอ5อบเจกต#


178    การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                                   ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท 6.14 ต)วอยางแสดงการใชค%ยเวรด this

   public class ThisStudent {
      private String id;
      private String name;
      private double gpa;
      public void setDetails (String id, String name, double gpa) {
            this.id = id;
            this.name = name;
            this.gpa = gpa;
      }
      public void showDetails() {
            System.out.println("ID: "+id);
            System.out.println("Name: "+name);
            System.out.println("GPA: "+gpa);
      }
   }




6.3 การเขยนโปรแกรมโดยใชหลกการของการสบทอด

         ขUอด;ของการสบทอดคอ การนZาคลาสท;ม;อยVLแลUวมาใชUใหมLโดยการเพมเตมคJณล)กษณะหรอเมธอดในคลาสใหมL
เพอใหUเขUาใจหล)กการของการสบทอดใหUพจารณาต)วอยLางของคลาส Student ท;กZาหนดไวUในโปรแกรมท; 6.15 ซxง
ถUาหากจZาเปyนท;จะตUองพ)ฒนาคลาสขxนใหมLท;ชอ GradStudent เพอใชUในการสรUางอ5อบเจกต#ท;เปyนน)กศxกษาระด)บ
                               Y
บ)ณฑตศxกษาน)น เราสามารถท;จะเลอกวธ;การไดUสองแบบคอ
               Y

        1.สรUางคลาสขxYนมาใหมLโดยไมLอUางองก)บคลาสเดมท;ชอ Student ด)งโปรแกรมท; 6.16
        2.สรUางคลาสท;สบทอดมาจากคลาสเดมท;ชอ Student ด)งโปรแกรมท; 6.17

       การสรUางคลาสขxYนใหมLตามโปรแกรมท; 6.16 น)นจะเห5นไดUวาม;ความซYZาซUอนในการกZาหนดคJณล)กษณะและ
                                                Y          L
เมธอดของคลาส นอกจากน;Yย)งจะทZาใหUเกดความยJLงยากในการแกUไขโปรแกรมอ;กดUวยอาทเชLน หากตUองม;การเพม
คJณล)กษณะ address จะทZาใหUตUองแกUไขโปรแกรมของท)Yงสองคลาส




ผศ. ธนศา เครอไวศยวรรณ                                               การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   179
โปรแกรมท 6.15 ต)วอยLางคลาสท;ชอ Student
  public class Student {
      private String id;
      private String name;
      private double gpa;
      public void setId(String id) {
          this.id = id;
      }
      public void setName(String name) {
          this.name = name;
      }
      public void setGpa(double gpa) {
          this.gpa = gpa;
      }
      public void showDetails() {
          System.out.println("ID: " + id);
          System.out.println("Name: " + name);
          System.out.println("GPA: " + gpa);
      }
  }




       ภาษาจาวาไดUกZาหนดค;ย#เวร#ดท;ชอ extends เพอระบJการสบทอดของคลาส โดยม;รVปแบบด)งน;Y
                                     
              public class SubClass extends SuperClass {
                   ...
              }


         โดยท; SuperClass คอชอของคลาสท;ตUองการจะใหUม;การสบทอดคJณล)กษณะและเมธอดตLางๆ ไปย)ง
SubClass โปรแกรมท; 6.16 สามารถท;จะเข;ยนไดUใหมLโดยใชUหล)กการของการสบทอดด)งแสดงในโปรแกรมท; 6.17

ซxงจะเห5นไดUวLากรณ;น;YจะลดความซYZาซUอนของคJณล)กษณะและเมธอด และจะทZาใหUการปร)บปรJงและแกUไขโปรแกรมเปyน
ไปไดUงLายยงขxYน ไดอะแกรมคลาสของคลาสท)Yงสองสามารถแสดงด)งรVปท; 6.2 คลาส GradStudent จะสบทอด
คJณล)กษณะและเมธอดของคลาส Student มา ด)งน)นอ5อบเจกต#ของคลาส GradStudent จะม;คJณล)กษณะท;เปyน id,
                                                Y
name และ gpa เชLนเด;ยวก)บอ5อบเจกต#ของคลาส Student




180   การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                          ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท 6.16 ต)วอยLางคลาสท;ชอ GradStudent ท;ไมLไดUใชUหล)กการของการสบทอด

   public class GradStudent {
       private String id;
       private String name;
       private double gpa;
       private String thesisTitle;
       private String supervisor;
       public void setId(String id) {
           this.id = id;
       }
       public void setName(String name) {
           this.name = name;
       }
       public void setGpa(double gpa) {
           this.gpa = gpa;
       }
       public void setThesisTitle(String thesisTitle) {
           this.thesisTitle = thesisTitle;
       }
       public void setSupervisor(String supervisor) {
           this.supervisor = supervisor;
       }
       public void showThesis() {
           System.out.println("ThesisTitle: " + thesisTitle);
           System.out.println("Supervisor: " + supervisor);
       }
   }




โปรแกรมท 6.17 ต)วอยLางคลาสท;ชอ GradStudent ท;ใชUหล)กการของการสบทอด

   public class GradStudent extends Student {
      private String thesisTitle;
      private String supervisor;
      public void setThesisTitle(String t) {
         thesisTitle = t;
      }
      public void setSupervisor(String s) {
         supervisor = s;
      }
      public void showThesis() {
         System.out.println("ThesisTitle: "+thesisTitle);
         System.out.println("Supervisor: "+supervisor);
      }
   }




ผศ. ธนศา เครอไวศยวรรณ                                             การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   181
รปท 6.2 การใช*หลกการของการส0บทอด


6.3.1 การสบทอดทถกตอง

        เราสามารถท;จะกZาหนดใหUคลาสใดๆ สบทอดคลาสอนไดU แตLการออกแบบโปรแกรมเชงอ5อบเจกต#ท;ด;นน ควร )Y
จะใหUคลาสท;จะสบทอดก)นน)Yนม;ความส)มพ)นธ#ท;ถVกตUองก)นดUวยต)วอยLางเชLน หากกZาหนดใหUคลาส Shirt และ Skirt
ม;คJณล)กษณะของคลาสด)งน;Y
                public class Shirt {
                      char size;
                      float price;
                }
                public class Skirt {
                      char size;
                      float price;
                      boolean long;
                }


      น)กพ)ฒนาโปรแกรมอาจเห5นวLาคลาสท)Yงสองม;คJณล)กษณะท;ซYZาซUอนก)นหลายชอ จxงอาจต)ดสนใจกZาหนดใหU
คลาส Skirt สบทอดมาจากคลาส Shirt โดยม;โปรแกรมด)งน;Y


182   การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                           ผศ. ธนศา เครอไวศยวรรณ
public class Shirt {
                        char size;
                        float price;
                  }
                  public class Skirt extends Shirt {
                        boolean long;
                  }


        แตLในความเปyนจรงแลUว Shirt และ Skirt จะไมLม;ความส)มพ)นธ#ในล)กษณะการ สบทอดโดยตรง เราสามารถ
ท;จะทดสอบความส)มพ)นธ#ของการสบทอด โดยใชUคZาวLา “เปyน” (is a) ไดU คลาสท;จะสบทอดก)นจะตUองสามารถบรรยาย
ดUวยวล;ท;วา subclass เปyน superclass (A subclass is a superclass) แตLคZาวLากระโปรงเปyนเสYอ (A skirt is a
           L
shirt) เปyนวล;ท;ไมLถVกตUองจxงทZาใหUคลาสท)YงสองไมLควรจะสบทอดก)นไดU อยLางไรก5ตามเราสามารถท;จะเข;ยนโปรแกรม
ของคลาสท)YงสองไดUใหมLด)งน;Y
                  public class Clothing {
                        char size;
                        float price;
                  }
                  public class Shirt extends Clothing {
                  }
                  public class Skirt extends Clothing {
                        boolean long;
                  }

        ท)Yงน;Yเนองจากท)YงเสYอ (shirt) และกระโปรง (skirt) ตLางก5เปyนเสYอผUา (clothing)

6.3.2 คย.เว,ร.ด    protected


         ถxงแมUวาคลาสท;เปyน subclass จะสบทอดคJณล)กษณะและเมธอดของคลาสท;เปyน superclass มา แตLคลาสท;
                L
เปyน subclass จะไมLสามารถท;จะเร;ยกใชUคJณล)กษณะหรอเมธอดของ superclass ท;ม; modifier เปyนแบบ private
ไดU ภาษาจาวากZาหนดใหUม; access modifier ท;ชอ protected ซxงจะทZาใหUคลาสท;เปyน subclass สามารถท;จะเร;ยกใชU
เมธอดหรอคJณล)กษณะของ superclass ไดU modifier แบบ protected จะแตกตLางจาก modifier แบบ default ใน
กรณ;ท; superclass และ subclass อยVLตLางแพคเก5จก)น ท)Yงน;Yกรณ;ของ default จะไมLสามารถเร;ยกใชUคJณล)กษณะหรอ
เมธอดของคลาสท;อยVLตLางแพคเก5จก)นไดU แตLถาม; modifier เปyนแบบ protected จะสามารถเร;ยกใชUไดUในกรณ;ท;คลาส
                                          U
ท)Yงสองสบทอดก)น ตารางท; 6.1 แสดงการเปร;ยบเท;ยบการกZาหนด modifier แบบตLางๆ เพอเร;ยกใชUคJณล)กษณะหรอ
เมธอด และ โปรแกรมท; 6.18 เปyนโปรแกรมท;แสดงต)วอยLางการใชUคย#เวร#ด protected
                                                                  ;




ผศ. ธนศา เครอไวศยวรรณ                                                      การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   183
ตารางท 6.1 ระด)บการเขUาถxงคJณล)กษณะหรอเมธอดของ modifier แบบตLางๆ
                                                คลาสท;อยVLใน
                   Modifier     คลาสเด;ยวก)น แพคเก5จเด;ยว คลาสท;เปyน      คลาสใดๆ
                                                              subclass
                                                    ก)น
                    public                  √     √             √             √

                  protected                 √     √             √

                   default                  √     √

                   Private                  √




โปรแกรมท 6.18 ต)วอยLางการใชUค;ย#เวร#ด protected

   public class Student {
       protected String id;
       protected String name;
       protected double gpa;
       public void setDetails (String ID,String n,double GPA) {
            id = ID;
            name = n;
            gpa = GPA;
       }
       public void showDetails() {
            System.out.println("ID: "+id);
            System.out.println("Name: "+name);
            System.out.println("GPA: "+gpa);
       }
   }




6.3.3 คลาสทชอ Object

       คลาสทJกคลาสในภาษาจาวาถUาไมLไดUสบทอดจากคลาสใดเลย จะถอวLาคลาสน)นสบทอดจากคลาสท;ชอ Object
                                                                     Y
อาทเชLน คลาส Student จะสบทอดมาจากคลาสท;ชอ Object และคZาส)งประกาศคลาสจะถอเสมอนวLาม;รVปแบบด)งน;Y
                public class Student extends Object {
                      ...
                }


       คลาสท;ชอ Object จะม;เมธอดท;สZาค)ญคอ
               



184   การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                         ผศ. ธนศา เครอไวศยวรรณ
• public String toString() และ
             • public boolean equals(Object o)

      เพอใชUในการแปลงอ5อบเจกต#ของคลาสใหUเปyนอ5อบเจกต#ชนด String และใชUในการเปร;ยบเท;ยบอ5อบเจกต#
ของคลาสน)นก)บอ5อบเจกต#อนๆ
          Y

6.3.4 คย.เว,ร.ด super

              เปyนค;ย#เวร#ดท;ใชUในการอUางองถxง superclass เพอท;จะเร;ยกใชUเมธอดหรอ constructor ของ
             super

superclass โดยม;รVปแบบคZาส)งด)งน;Y

                          super.methodName([arguments])


    ต)วอยLางเชLน คลาส GradStudent อาจกZาหนดใหUม;เมธอดท;ชอ showDetails() โดยม;คZาส)งท;เร;ยกใชUเมธอด
showDetails() ของคลาส Student ด)งแสดงในโปรแกรมท; 6.19



โปรแกรมท 6.19 ต)วอยLางการใชUค;ย#เวร#ด super
   public class Student {
         private String id;
         private String name;
         private double gpa;
         public void showDetails() {
            System.out.println("ID: "+id);
            System.out.println("Name: "+name);
            System.out.println("GPA: "+gpa);
       }
   }

   ------------------------------------------------------------------------------------------------------------------------------------------------------------------
   public class GradStudent extends Student {
                    private String thesisTitle;
                    private String supervisor;
                    public void showDetails() {
                            super.showDetails();
                            System.out.println("Thesis Title: "+ thesisTitle);
                            System.out.println("Supervisor: "+supervisor);
              }
   }




ผศ. ธนศา เครอไวศยวรรณ                                                                                                                            การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   185
6.4 การมไดหลายรปแบบ

        การม;ไดUหลายรVปแบบหมายถxงคJณสมบ)ตของอ5อบเจกต#ของคลาสท;ตLางก)น ท;สามารถจะกZาหนดคLาไดUหลายรVป
แบบ หรอการตอบสนองตLอเมธอดเด;ยวก)นดUวยวธ;การท;ตLางก)นไดU หล)กการของการม;ไดUหลายรVปแบบเปyนหล)กการท;สบ
เนองมาจากหล)กการของการสบทอด

6.4.1 Dynamic Binding

       Dynamic Binding   เปyนหล)กการของการกZาหนดอ5อบเจกต#ของคลาสท;ม;การสบทอดก)นไดUหลายรVปแบบ
ภาษาจาวากZาหนดใหUอ5อบเจกต#ของคลาสใดๆ สามารถสรUางมาจากคลาสน)นหรอคลาสอนๆ ท;เปyน subclass ไดU กลLาว
                                                            Y
คอถUาประกาศคลาส SubClass ซxงสบทอดมาจากคลาส SuperClass แลUว และม;คZาส)งประกาศอ5อบเจกต# obj ใหU
เปyนอ5อบเจกต#ของคลาส SuperClass โดยใชUคZาส)ง
              SuperClass obj;


       เราสามารถใชUหล)กการของการม;ไดUหลายรVปแบบในการสรUางอ5อบเจกต# obj ไดU หลายรVปแบบด)งน;Y
                obj = new SuperClass();
       หรอ      obj = new SubClass();


        ในกรณ;ของต)วอยLางของคลาส Student ท;ม; subclass เปyนคลาส GradStudent โดยท;คลาส
GradStudent ม; subclass อ;กคลาสหนxงท;ชอ PhDStudent น)น เราสามารถท;จะกZาหนดอ5อบเจกต#ของคลาสเหลLาน;Y
                                                         Y
ไดUหลายรVปแบบ ด)งแสดงความส)มพ)นธ#ในรVปท; 6.3 กลLาวคอ เราสามารถท;ประกาศอ5อบเจกต#ของคลาส Student แลUว
สรUางอ5อบเจกต#ไดUหลายรVปแบบด)งน;Y
                Student s1 = new Student();
       หรอ      Student s1 = new GradStudent();

       หรอ      Student s1 = new PhDStudent();


       เชLนเด;ยวก)บกรณ;ของอ5อบเจกต#ของคลาส GradStudent สามารถท;จะสรUางอ5อบเจกต#ไดUหลายรVปแบบด)งน;Y
                GradStudent s2 = new GradStudent();
                GradStudent s2 = new PhDStudent();


       แตLในทางกล)บก)นเราจะไมLสามารถกZาหนดอ5อบเจกต#ของ subclass แลUวสรUางอ5อบเจกต#ของ superclass ไดU


186   การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                           ผศ. ธนศา เครอไวศยวรรณ
กลLาวคอ คZาส)ง
                  GradStudent s3 = new Student();


        จะเปyนคZาส)งท;ไมLถVกตUอง




                                     รปท 6.3 อ-อบเจกตของคลาสทมได*หลายรปแบบ


6.4.2 การกDาหนดเมธอดใหมว,ธการทต0างกน

      หล)กการของการม;ไดUหลายรVปแบบย)งรวมไปถxงการท;เมธอดชอเด;ยวก)นแตLม;วธ;การ (คZาส)ง) ท;ตLางก)น ซxง
สามารถกZาหนดเมธอดไดUสองรVปแบบคอ

        1.   เมธอดแบบ overloaded
        2.   เมธอดแบบ overridden


เมธอดแบบ Overloaded

       ภาษาจาวาอนJญาตใหUคลาสใดๆ ม;เมธอดท;ชอเด;ยวก)นมากกวLาหนxงเมธอดไดU แตLเมธอดเหลLาน)นจะตUองม;
                                                                                         Y
จZานวนหรอชนดขUอมVลของ argument ท;ตLางก)น โปรแกรมท; 6.20 เปyนต)วอยLางของการเข;ยนเมธอดแบบ overloaded
โดยเมธอด setDetails() จะม;สองเมธอด เมธอดแรกจะร)บ argument ท;ม;สองต)ว และเมธอดท;สองจะร)บ
argument ท;ม;สามต)ว ซxงคอมไพเลอร#จะพจารณาวLาโปรแกรมเร;ยกใชUเมธอดใดโดยดVจากจZานวนและชนดของ
argument ท)Yงน;เมธอดแบบ overloaded อาจม;คาท;สLงกล)บมาเปyนชนดเด;ยวก)นหรอตLางก)นก5ไดU
               Y                             L




ผศ. ธนศา เครอไวศยวรรณ                                                   การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   187
โปรแกรมท% 6.20 ต)วอยางของเมธอดแบบ overloaded

   public class StudentV2 {
      private String id;
      private String name;
      private double gpa;
      public void setDetails(String ID,String n) {
         id = ID;
         name = n;
      }
      public void setDetails(String ID,String n,double GPA) {
         id = ID;
         name = n;
         gpa = GPA;
      }
   }




        ต)วอยLางตLอไปน;เY ปyนการเข;ยนเมธอดแบบ   overloaded ท;ถVกตUอง

                 public void setDetails(String ID,String n) {
                 }
                 public void setDetails(String ID,double GPA) {
                 }
                 public double setDetails(double GPA,String ID){
                 }


        ต)วอยLางตLอไปน;เY ปyนการเข;ยนเมธอดแบบ   overloaded ท;ไมLถVกตUอง

                 public void setDetails(String ID,double GPA) {
                 }
                 public void setDetails(String n,double GPA) {
                 }


         กรณ;ต)วอยLางท;ไมLถVกตUองน;YถxงแมUวาจะม;ชอของ argument ท;ตLางก)นก5ตามแตLเนองจากเมธอดท)Yงสองม;จZานวน
                                            L     
และชนดขUอมVลของ argument ท;เหมอนก)น ด)งน)นเมอคอมไพเลอร#เจอคZาส)งเร;ยกใชUเมธอด setDetails() แลUวสLง
                                                    Y
argument ท;ม;ชนดขUอมVลเปyน String และ double มา คอมไพเลอร#จะไมLสามารถแยกไดUวLาจะเร;ยกใชUเมธอดใด ด)ง
น)นถUาชJดคZาส)งในต)วอยLางน;YอยVLในโปรแกรมใดจะทZาใหUโปรแกรมน)นไมLสามารถคอมไพล#ผานไดU
  Y                                                            Y                       L

เมธอดแบบ Overridden
       การกZาหนดเมธอดแบบ overridden เปyนหล)กการท;สบเนองมาจากหล)กการของการสบทอด โดยคลาสท;เปyน
subclass สามารถท;จะเข;ยนเมธอดของ superclass ขxนใหมLไดU วธ;การน;Yเร;ยกวLา เมธอดใน subclass เปyนเมธอดแบบ
                                               Y


188    การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                                 ผศ. ธนศา เครอไวศยวรรณ
overridden การเข;ยนเมธอดแบบ overridden      ม;ขUอกZาหนดด)งน;Y

        •   จZานวนและชนดขUอมVลของ argument จะตUองเหมอนเดม
        •   ชนดขUอมVลของคLาท;สLงกล)บจะตUองเหมอนเดม
        •   access modifier จะตUองไมLม;ระด)บตZากวLาเดมอาทเชLน ถUาเมธอดเดมเปyน public จะไมLสามารถเปล;ยนเปyน
            private ไดU


      โปรแกรมท; 6.21 แสดงต)วอยLางการกZาหนดเมธอดแบบ overridden ท;ชอ showDetails() โดยการเข;ยน
เมธอด showDetails() ของคลาส Student ขxนใหมL
                                          Y


โปรแกรมท 6.21 เมธอดแบบ overridden ท;ชอ showDetails()

   public class         Student {
      protected         String id;
      protected         String name;
      protected         double gpa;

       public void showDetails() {
          System.out.println("ID: "+id);
          System.out.println("Name: "+name);
          System.out.println("GPA: "+gpa);
       }
   }

   ---------------------------------------------------------
   public class GradStudent extends Student {
      private String thesisTitle;
      private String supervisor;

       public void showDetails() {
          System.out.println("ID: "+id);
          System.out.println("Name: "+name);
          System.out.println("GPA: "+gpa);
          System.out.println("ThesisTitle: "+thesisTitle);
          System.out.println("Supervisor: "+supervisor);
       }
   }




ผศ. ธนศา เครอไวศยวรรณ                                                  การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   189
6.4.3 Virtual Method Invocation

      การกZาหนดอ5อบเจกต#ตามหล)กการของ Dynamic Binding ทZาใหUโปรแกรมภาษาจาวาพจารณาเร;ยกใชUเมธอด
จากชนดของอ5อบเจกต#ท;สรUางขxน ต)วอยLางเชLน คZาส)ง
                            Y
                Student s1 = new GradStudent();
                s1.showDetails();

            เปyนคZาส)งท;เร;ยกใชUเมธอด showDetails() ของคลาส GradStudent ไมLใชLเมธอดของคลาส Student
ท)Yงน;เY นองจากอ5อบเจกต# s1 เปyนอ5อบเจกต#ของคลาส GradStudent แตLคอมไพเลอร#ของภาษาจาวาจะไมLอนJญาตใหU
เร;ยกใชUเมธอดใดๆ ก5ตามท;ไมLม;การประกาศอยVLในเมธอดของ superclass ท;กZาหนดไวU กลLาวคอคZาส)ง
                Student s1 = new GradStudent();
                s1.getSupervisor();


       เปyนคZาส)งท;ไมLถVกตUองและจะไมLสามารถคอมไพล#ผานไดU เนองจากคอมไพเลอร#จะไมLรVUจ)กเมธอด
                                                     L
getSupervisor() ท;อยVLในคลาส Student ถxงแมUวLาอ5อบเจกต# s1 จะเปyนอ5อบเจกต#ของคลาส GradStudent ท;ม;

เมธอดด)งกลLาวอยVLก5ตาม

6.4.4 การส0งผ0าน argument ไดหลายรป

        ในกรณ;ท;เมธอดม; argument เปyนขUอมVลชนดคลาส เราสามารถท;จะใชUหล)กการของการม;ไดUหลายรVปแบบใน
การสLง argument ท;เปyนอ5อบเจกต#ใหUก)บเมธอดด)งกลLาวไดU กลLาวคอเราสามารถท;จะสLงอ5อบเจกต#ของคลาสท;เปyน
subclass ของคลาสน)นแทนไดU ต)วอยLางเชLน คZาส)ง
                    Y
                Student s1 = new Student();
                Student s2 = new GradStudent();
       และเมธอด
                public void printInfo(Student s) {
                    ...
                }


       เปyนเมธอดท;ม; argument เปyนขUอมVลชนดคลาส Student เราสามารถท;จะเร;ยกใชUเมธอดน;โดยการสLง
                                                                                      Y
อ5อบเจกต#ท;สบทอดมาจากคลาส Student ไดU อาทเชLน
                printInfo(s1)
                printInfo(s2)
       หรอ
                printInfo(new FullTimeStudent())



190   การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                            ผศ. ธนศา เครอไวศยวรรณ
6.4.5 ตวดDาเน,นการ instanceof

        ค;ย#เวร#ด instanceof เปyนต)วดZาเนนการท;ใชUก)บอ5อบเจกต#และคลาส เพอตรวจสอบวLาอ5อบเจกต#ใดๆ เปyน
อ5อบเจกต#ของคลาสท;ระบJหรอไมL ค;ยเ# วร#ด instanceof จะใหUผลล)พธ#เปyนชนดขUอมVลแบบ boolean ซxงถUาไดUผลล)พธ#
เปyน true จะหมายถxงวLาอ5อบเจกต#ด)งกลLาวเปyนอ5อบเจกต#ของคลาสท;ระบJหรอเปyนอ5อบเจกต#ของคลาสท;เปyน
superclass ของคลาสน)น  Y

        ต)วอยLางเชLน
                 GradStudent s1 = new GradStudent();
        เปyนคZาส)งในการประกาศและสรUางอ5อบเจกต# s1 ของคลาส GradStudent ด)งน)นนพจน#
                                                                            Y
                 (s1 instanceof GradStudent)
        จะใหUผลล)พธ#เปyน true เชLนเด;ยวก)บนพจน#
                 (s1 instanceof Student)
        หรอ
                 (s1 instanceof Object)


      ท;จะใหUผลล)พธ#เปyน true ท)Yงน;เY นองจากคลาส GradStudent สบทอดมาจากคลาส Student และคลาส
Student ก5สบทอดมาจากคลาสท;ชอ Object อ;กตLอหนxง
                                

        สLวนนพจน#
                 (s1 instanceof String)
       จะไมLสามารถคอมไพล#ผานไดU ท)Yงน;เY นองจากอ5อบเจกต#ของคลาส GradStudent จะไมLใชLอ5อบเจกต#ของคลาส
                          L
ท;สบทอดมาจากคลาส String

       นอกจากน;Y ค;ย#เวร#ด instanceof จะใหUผลล)พธ#เปyน false ในกรณ;ท;จะตรวจสอบวLาอ5อบเจกต#ด)งกลLาวเปyน
อ5อบเจกต#ของคลาสท;เปyน subclass หรอไมL ต)วอยLางเชLนคZาส)ง
                 Student s1 = new Student();
        จะไดUนพจน#
                 (s1 instanceof GradStudent)
        ท;ใหUผลล)พธ#เปyน false

        ค;ย#เวร#ด instanceof สามารถใชUในการตรวจสอบวLา argument ท;ร)บขUอมVลมาในเมธอดเปyนอ5อบเจกต#ของ
คลาสใด ต)วอยLางเชLน คZาส)งตLอไปน;เY ปyนการใชUค;ย#เวร#ด instanceof เพอตรวจสอบวLา argument ของอ5อบเจกต# s วLา
เปyนอ5อบเจกต#ของคลาสใด


ผศ. ธนศา เครอไวศยวรรณ                                                  การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   191
public void printInfo(Student s) {
             if (s instanceof PhDStudent) {
                   System.out.println("PhD Student");
             } else if (s instanceof GradStudent) {
                   System.out.println("Graduate Student");
             } else if (s instanceof FullTimeStudent) {
                   System.out.println("Full-Time Student");
             } else if (s instanceof PartTimeStudent) {
                   System.out.println("Part-Time Student");
             } else if (s instanceof Student) {
                   System.out.println("Student");
             }
       }


6.4.6 การ Casting อ-อบเจกต.

       หล)กการของการม;ไดUหลายรVปแบบ ทZาใหUเราสามารถจะกZาหนดอ5อบเจกต#ของคลาสท;เปyน subclass ใหUก)บ
ต)วแปรท;กZาหนดเปyนคลาสท;เปyน superclass ไดU ต)วอยLางเชLน
                 GradStudent s1 = new GradStudent();
                 Student s2 = s1;


        แตLในทางกล)บก)นต)วแปรท;กZาหนดเปyนคลาสท;เปyน subclass จะไมLสามารถกZาหนดคLาใหUเปyนอ5อบเจกต#ของ
คลาสท;เปyน superclass ไดU ต)วอยLางเชLน
                 Student s1 = new GradStudent();
                 GradStudent s2 = s1;

        จะเปyนคZาส)งท;ไมLถVกตUอง และโปรแกรมน;จะไมLสามารถคอมไพล#ผานไดU การกZาหนดคLาในล)กษณะน;YจะตUอง
                                               Y                  L
ทZาการ casting อ5อบเจกต#เพอระบJชนดของอ5อบเจกต# โดยม;รปแบบด)งน;Y
                                                        V
                (ClassName) objectName

       โดยท;
       • ClassName   คอชนดของคลาสท;ตUองการระบJ
       •   objectName คอชอของต)วแปรของอ5อบเจกต#


       ต)วอยLางท;ผLานมาสามารถเข;ยนใหมLไดUเปyน
                 Student s1 = new GradStudent();
                 GradStudent s2 = (GradStudent) s1;


       จxงจะทZาใหUโปรแกรมสามารถคอมไพล#ผLานไดU เชLนเด;ยวก)บคZาส)งในห)วขUอ 187 ท;เปyนต)วอยLางของการเร;ยกใชU



192   การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                                ผศ. ธนศา เครอไวศยวรรณ
เมธอด ก5จะสามารถเข;ยนใหมLไดUเปyน
                  Student s1 = new GradStudent();
                 ((GradStudent) s1).getSupervisor();


      จxงจะทZาใหUโปรแกรมสามารถคอมไพล#ผLานไดU จากต)วอยLางขUางตUนอ5อบเจกต# s1 จะถVกกZาหนดใหUเปyนคลาส
ชนด GradStudent ท;ม;เมธอด getSupervisor()

        ภาษาจาวาจะตรวจสอบชนดของอ5อบเจกต#ในชLวงของการร)นโปรแกรม ด)งน)นถxงแมUวาโปรแกรมจะคอมไพล#
                                                                            Y      L
ผLานไดU แตLถUาเกดตรวจสอบพบวLาอ5อบเจกต#ท;ทZาการ casting ไมLใชLอ5อบเจกต#ของคลาสน)นหรออ5อบเจกต#ของ subclass
                                                                                Y
โปรแกรมจะไมLสามารถร)นผLานไดU

        ต)วอยLางเชLน
                 Student s1 = new Student();
                 GradStudent s2 = (GradStudent) s1;


         จะเปyนคZาส)งท;ทZาใหUเกดขUอผดพลาดในชLวงของการร)นโปรแกรม เนองจากต)วแปร s1 ถVกกZาหนดคLาใหUเปyน
อ5อบเจกต#ของ superclass ซxงไมLสามารถทZาไดU เชLนเด;ยวก)บการเร;ยกใชU เมธอดของอ5อบเจกต#ท;ทZาการ casting ภาษา
จาวาจะตรวจสอบชนดของอ5อบเจกต#ในชLวงของการร)นโปรแกรม วLาอ5อบเจกต#ด)งกลLาวเปyนอ5อบเจกต#ของคลาสใด และ
คลาสน)นม;เมธอดท;เร;ยกใชUหรอไมL หากไมLพบก5จะเกดขUอผดพลาดในชLวงของการร)นโปรแกรม ต)วอยLางเชLน
       Y
                 Student s1 = new Student();
                 ((GradStudent) s1).getSupervisor();

       จะเปyนคZาส)งท;สามารถคอมไพล#ผLานไดU แตLจะเกดขUอผดพลาดในชLวงของการร)นโปรแกรม เนองจากจาวา
อนเตอร#พร;ตเตอร#จะพบวLา s1 เปyนอ5อบเจกต#ของคลาส Student ซxงไมLม;เมธอด getSupervisor() โปรแกรมท;
6.22 แสดงต)วอยLางการเร;ยกใชUอ5อบเจกต#ในรVปแบบตLางๆ ท;อาจเกดขUอผดพลาดในชLวงของการร)นโปรแกรมหรอใน
ชLวงของการคอมไพล#โปรแกรม




ผศ. ธนศา เครอไวศยวรรณ                                                 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   193
โปรแกรมท 6.22 ต)วอยLางการเร;ยกใชUอ5อบเจกต#ในรVปแบบตLางๆ ท;อาจเกดขUอผดพลาด

  public class Student {
     protected String id;
     protected String name;
     protected double gpa;
     public String getId() {
        return id;
     }
     public String getName() {
        return name;
     }
     public double getGpa() {
        return gpa;
     }
  }

  ------------------------------------------------------
  public class GradStudent extends Student {
     private String thesisTitle;
     private String supervisor;
     public String getThesisTitle() {
        return thesisTitle;
     }
     public String getSupervisor() {
        return supervisor;
     }
  }
  public class TestCallingMethods {

      public static void main(String args[]) {
         Student s1 = new GradStudent();
         s1.getSupervisor();
            // compile error

           Student s2 = new Student();
           ((GradStudent) s2).getSupervisor();
              // runtime error
      }
  }




6.5 Constructor

       constructor เปyนเมธอดท;ม;ชอเด;ยวก)บชอคลาสซxงจะถVกเร;ยกใชUงานเมอม;การสรUางอ5อบเจกต#โดยใชUคZาส)ง new
โดย constructor ม;รVปแบบด)งน;Y
               [modifier] ClassName([arguments]) {
                    [statements]
               }



194    การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                                 ผศ. ธนศา เครอไวศยวรรณ
constructor เปyนเมธอดท;ไมLม;คLาท;จะสLงกล)บแตLไมLตUองระบJค;ย#เวร#ด void ซxงแตกตLางก)บเมธอดท)วๆ ไป
modifier ของ constructor จะเปyน access modifier      ซxงโดยท)วไปจะเปyน public กรณ;ท; constructor ม; access
modifier เปyน private จะทZาใหUไมLสามารถสรUางอ5อบเจกต#ของคลาสน)นจากคลาสอนไดU โดยท)วไปคลาสทJกคลาสจะ
                                                                     Y
ม; constructor แบบ default แมUจะไมLม;การเข;ยนคZาส)ง constructor ในโปรแกรม โดย constructor แบบ default
จะม;รVปแบบด)งน;Y
               public ClassName() {
               }

        constructor แบบ default จะเปyน constructor ท;ไมLม;คZาส)งใดๆ อยVLภายใน คอมไพเลอร#ของภาษาจาวาจะใสL
constructor แบบ default ใหUก)บโปรแกรมโดยอ)ตโนม)ต อาทเชLน คลาส Student ในโปรแกรมท; 6.15 จะม;
constructor แบบ default ท;คอมไพเลอร#ใสLใหUก)บโปรแกรม ด)งน;Y

                 public class Student {
                       public Student() {
                       }
                       ...
                 }



6.5.1 การเขยน Constructor

       เราสามารถท;จะเข;ยน constructor ในคลาสใดๆ ขxนมาก5ไดUอาทเชLน คลาส Student อาจกZาหนดใหUม;
                                                   Y
constructor เปyน

                 public class Student {
                       private String id;
                       private String name;
                       private double gpa;
                       public Student(String ID,String n,double GPA) {
                             id = ID;
                             name = n;
                             gpa = GPA;
                       }
                       ...
                 }


        การกZาหนด constructor ขxYนมาใหมLนนจะทZาใหU constructor แบบ default หายไป ด)งน)YนการสรUางอ5อบเจกต#
                                           )Y
ของคลาสท;ม; constructor ใหมLนจะตUองใชUคZาส)ง new ท;สLงผLานจZานวนและชนดขUอมVลของ argument ท;สอดคลUองก)บ
                               ;Y
ท;กZาหนดไวUใน constructor ต)วใหมL จากต)วอยLางขUางตUน การสรUางอ5อบเจกต#ของคลาส Student อาจจะใชUคZาส)ง
                 Student s1 = new Student(“1122”,“Thana”,3.00);




ผศ. ธนศา เครอไวศยวรรณ                                                     การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   195
แตLจะไมLสามารถใชUคZาส)ง
                 Student s1 = new Student();


       ไดUอ;ก เนองจาก constructor แบบ default ของคลาส Student ไมLม;แลUว

6.5.2 ขนตอนการทDางานของคDาสง new
       คZาส)ง new ท;ใชUในการสรUางอ5อบเจกต#ของคลาสจะม;ลZาด)บข)นตอนการทZางานด)งน;Y
                                                               Y
       1. กZาหนดเนYอท;ในหนLวยความจZาใหUก)บอ5อบเจกต#
       2. กZาหนดคLาเรมตUนใหUก)บคJณล)กษณะของอ5อบเจกต#
       3. กZาหนดคLาของคJณล)กษณะของอ5อบเจกต#ตามคZาส)งกZาหนดคLาท;ประกาศไวU
       4. เร;ยกใชU constructor

       ต)วอยLางเชLน ถUาคลาส MyDate ม;โปรแกรมด)งน;Y
                 public class MyDate {
                       private int day = 1;
                       private int month = 1;
                       private int year = 2000;
                       public MyDate(int d,int m,int y) {
                             day = d;
                             month = m;
                             year = y;
                       }
                 }


       คZาส)ง
                 MyDate d1 = new MyDate(16,8,1972);



        จะม;ขนตอนในการทZางานด)งรVปท; 6.4 โดยข)นตอนท;หนxงจะเปyนการกZาหนดเนYอท;ในหนLวยความจZา (รVปท;
             )Y                                Y          
6.4(ก)) ข)นตอนท;สองเปyนการกZาหนดคLาเรมตUนโดยคJณล)กษณะของ อ5อบเจกต#จะม;คา default เปyน 0 (รVปท; 6.4(ข))
          Y                                                                  L
ข)Yนตอนท;สามเปyนการกZาหนดคLาของคJณล)กษณะตามคZาส)งท;กZาหนดคLาไวUเรมตUน โดยท;คJณล)กษณะ day จะม;คLาเปyน 1
คJณล)กษณะ month จะม;คาเปyน 1 และคJณล)กษณะ year จะม;คLาเปyน 2000 (รVปท; 6.4(ค)) และข)นตอนสJดทUายจะ
                         L                                                              Y
เปyนการเร;ยกใชU constructor ทZาใหUคาของคJณล)กษณะเปyนไปตามท;กZาหนดในคZาส)งของ constructor (รVปท; 6.4(ง))
                                   L




196    การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                               ผศ. ธนศา เครอไวศยวรรณ
(ก) ข)Yนตอนท;หนxง                     (ข) ข)Yนตอนท;สอง




                           ค) ข)Yนตอนท;สาม                 (ง) ข)นตอนท;ส;
                                                                  Y
                                  รปท 6.4 ขนตอนการทางานของคาสง new

6.5.3 Constructor แบบ Overloaded

        ภาษาจาวาสามารถกZาหนด constructor แบบ overloaded เชLนเด;ยวก)บการกZาหนดเมธอดแบบ overloaded
โดย constructor แบบ overloaded จะม;จZานวนหรอชนดขUอมVลของ argument ท;ตLางก)น ซxงคZาส)ง new ในการสรUาง
อ5อบเจกต#ของคลาสจะเร;ยกใชU constructor โดยการพจารณาจาก argument ท;สLงผLานมาวLาสอดคลUองก)บ constructor
ท;กZาหนดต)วใด ขUอด;ของการสรUาง constructor แบบ overloaded คอทZาใหUเราสามารถท;จะสรUางอ5อบเจกต#เรมตUนไดU
หลายรVปแบบ

       โปรแกรมท; 6.23 แสดงต)วอยLางของคลาส Student ท;ม; constructor แบบ overloaded ซxงคZาส)งการสรUาง
อ5อบเจกต#
                Student s1 = new Student (“1234”,“Somchai”,3.75);


        จะม;ผลทZาใหUคอมไพเลอร#เร;ยก constructor ของคลาส Student ชJดท;สองซxงม; argument สามต)ว




ผศ. ธนศา เครอไวศยวรรณ                                               การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   197
โปรแกรมท 6.23 ต)วอยางการเข%ยน constructor แบบ overloaded

  public class Student {
        private String id;
        private String name;
        private double gpa;
        public Student(String ID,String n) {
              id = ID;
              name = n;
        }
        public Student(String ID,String n,double GPA) {
              id = ID;
              name = n;
              gpa = GPA;
        }
  }




6.5.4 เมธอด this()

       เมธอดท;ชอ this() เปyนการเร;ยกใชU constructor ของคลาสต)วเอง โดยจะตUองเปyนคZาส)งแรกสJดท;อยVLใน
constructor แบบ overloaded ต)วอยLางเชLน โปรแกรมท; 6.23 สามารถเข;ยน constructor ของคลาส Student ชJดท;
สองใหมLไดUโดยใชUเมธอดท;ชอ this() ด)งแสดงในโปรแกรมท; 6.24

โปรแกรมท 6.24 ต)วอยLางการใชUเมธอดท;ชอ this()
                                     
  public class Student {
        private String id;
        private String name;
        private double gpa;
        public Student(String ID,String n) {
              id = ID;
              name = n;
        }
        public Student(String ID,String n,double GPA) {
              this(ID,n);
              gpa = GPA;
        }
  }




198   การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                           ผศ. ธนศา เครอไวศยวรรณ
6.5.5 เมธอด super()

       โดยท)วไปเมธอดและคJณล)กษณะของ superclass จะสบทอดมาย)ง subclass แตLจะม;ขUอยกเวUนสZาหร)บ
constructor ซxงจะไมLสบทอดมาย)ง subclass กลLาวคอ ถUา superclass ม; constructor รVปแบบใด จะไมLไดUทZาใหU
subclass ม; constructor รVปแบบน)นดUวย ต)วอยLางเชLน
                                Y
                        public class Parent {
                                          ...
                        }
                        public class Child extends Parent {
                              public Child (String s) {
                                    ...
                                    }
                        }


       ในกรณ;นคลาส Parent ม; constructor แบบ default สLวนคลาส Child ท;สบทอดมาจากคลาส Parent ม;
                  ;Y
constructor ท;ม; argument เปyน String เพ;ยงรVปแบบเด;ยว เนองจาก constructor แบบ default จะไมLไดUสบทอด
มาย)งคลาส Child ด)งน)นการสรUาง อ5อบเจกต#โดยใชU constructor แบบ default อาทเชLน
                       Y
                        Child c1 = new Child();


       จxงเปyนคZาส)งท;ไมLถVกตUอง เนองจาก constructor แบบ default ของคลาส Child ไดUถVกแทนท;ดวย
                                                                                               U
constructor แบบใหมLไปแลUว

        เราสามารถท;จะเร;ยกใชU constructor ของ superclass ไดUโดยใชUเมธอดท;ชอ super() โดยสLงผLาน argument
                                                                             
ท;สอดคลUองก)น ท)Yงน;เY มธอด super() จะตUองเปyนคZาส)งแรกของ constructor เชLนเด;ยวก)บเมธอดท;ชอ this() โดย
ท)วไปการทZางานของ constructor ของคลาสใดๆ จะม;ผลทZาใหUม;การเร;ยกใชU constructor ของ superclass น)น ซxงถUา
                                                                                                      Y
ไมLมคZาส)ง super() อยVLในคZาส)งแรกของ constructor ของคลาสน)น ภาษาจาวาจะเร;ยกใชU constructor แบบ default
     ;                                                         Y
ของ superclass น)นโดยอ)ตโนม)ต
                   Y
       ในกรณ;ท; superclass ไมLม; constructor แบบ default และไมLม;คZาส)ง super() อยVLใน constructor ของ
subclass จะทZาใหUโปรแกรมไมLสามารถคอมไพล#ผานไดUด)งต)วอยLางในโปรแกรมท; 6.25 ซxงในกรณ;นจะตUองใชUคZาส)ง
                                               L                                           ;Y
super() ใน constructor ของคลาส GradStudentV1 เพอท;จะทZาใหUโปรแกรมสามารถคอมไพล#ผLานไดU โดยจะตUอง

กZาหนด contructor ของคลาส GradStudentV1 ใหมLด)งน;Y
                 public GradStudentV1(String n){
                       super(n);
                       }
                 }




ผศ. ธนศา เครอไวศยวรรณ                                                  การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   199
โปรแกรมท 6.25 ต)วอยางการเร%ยกใช constructor ของ superclass

   public class StudentV1 {
      protected String name;
      public StudentV1(String n) {
         name = n;
      }
   }

   ------------------------------------------------------
   public class GradStudentV1 extends StudentV1 {
      public GradStudentV1(String n) {
         name = n;         /* compile error
                              should be super(n) */
      }
   }




6.5.6 ขนตอนการทDางานของ Constructor

        อ5อบเจกต#ของคลาสใดๆ จะถVกสรUางขxYนเมอม;การเร;ยกใชUคZาส)ง new ตามข)นตอนการทZางานท;ไดUกลLาวผLานมา
                                                                            Y
แลUว โดยข)YนตอนสJดทUายเปyนการเร;ยกใชU constructor ซxงจะม;ขนตอนการทZางานท;ตUองพจารณาเพมเตมด)งน;Y
                                                           )Y

         1.   ถUาม;คZาส)ง this() ใน constructor ก5จะเร;ยกใชU constructor แบบ overloaded ท;สอดคลUองก)บคZาส)ง
              this() แลUวขUามไปข)Yนตอนท; 4

         2.   เร;ยกใชU constructor ของ superclass ถUาไมLม;คZาส)ง super() จะเร;ยกใชU constructor แบบ default
              ยกเวUนคลาสท;ชอ Object จะไมLม;การเร;ยกใชU constructor ของ superclass เนองจากคลาสท;ชอ
              Object จะไมLม; superclass

         3.   เร;ยกใชUคZาส)งกZาหนดคLาเรมตUนของคJณล)กษณะของอ5อบเจกต#
         4.   เร;ยกใชUคZาส)งภายใน constructor ของคลาสท;ใชUนน )Y

      โปรแกรมท; 6.26 แสดงต)วอยLางคลาสท;ม; constructor ในรVปแบบตLางๆ กรณ;ท;ม;การสรUางอ5อบเจกต#ของคลาส
GradStudent โดยใชUคZาส)ง
                   GradStudent s1 = new GradStudent();


          จะม;ผลทZาใหU constructor ของคลาส GradStudent ทZางานด)งน;Y
      1. เร;ยกใชU constructor ของคลาส GradStudent ท;ม;รVปแบบคZาส)งเปyน    GradStudent()

      2. เร;ยกใชUคZาส)ง this(“ ”)



200      การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                                 ผศ. ธนศา เครอไวศยวรรณ
2.1 เร;ยกใชU constructor ของคลาส                                          GradStudent                      ท;ม;รVปแบบเปyน GradStudent(String                n)

                                 โดยท;จะสLงขUอความ “ ” ใหUก)บ argument ท;ชอ n
                             2.2 เนองจากไมLม;คZาส)ง this() จxงขUามข)Yนตอนน;ไปY
                             2.3 เร;ยกใชU constructor ของคลาส Student จากคZาส)ง super(n)
                                     2.3.1 เร;ยกใชU constructor ของคลาส Student ท;ม;รVปแบบคZาส)งเปyน
                                                                    Student(String n)
                                             2.3.2 เนองจากไมLมคZาส)ง this() จxงขUามข)นตอนน;Yไป
                                                               ;                       Y
                                             2.3.3 เร;ยกใชU constructor ของคลาสท;ชอ Object ท;เปyน constructor แบบ default
                                                              2.3.3.1 เร;ยกใชU constructor แบบ default ของคลาสท;ชอ Object
                                                              2.3.3.2 เนองจากไมLมคZาส)ง this() จxงขUามข)นตอนน;Yไป
                                                                                  ;                       Y
                                                              2.3.3.3 เนองจากคลาสท;ชอ Object ไมLม; superclass จxงขUามข)Yนตอนของการเร;ยก
                                                                              constructor ของ superclass
                                                              2.3.3.4 ไมLม;คZาส)งกZาหนดคLาเรมตUนของคJณล)กษณะของคลาสท;ชอ                                                 Object

                                                              2.3.3.5 ไมLม;คZาส)งภายใน constructor ของคลาสท;ชอ Object
                                               2.3.4 เร;ยกใชUคZาส)งกZาหนดคLาเรมตUนของคJณล)กษณะของอ5อบเจกต#ในคลาส Student
                                             2.3.5 เร;ยกใชUคZาส)ง name
                                                                      ใน constructor ของคลาส Student
                                                                                                  = n

                             2.4 เร;ยกใชUคZาส)งกZาหนดคLาเรมตUนของคJณล)กษณะของอ5อบเจกต#ในคลาส GradStudent
                             2.5 ไมLมคZาส)งอนๆ ภายใน constructor ของคลาส GradStudent
                                      ;


โปรแกรมท 6.26 ต)วอยLางคลาสท;ม; constructor ในรVปแบบตLางๆ

   public class Student {
      protected String name;
      public Student(String n) {
         name = n;
      }
   }

   -----------------------------------------------------------------------------------------------------------------------------------------------------
   public class GradStudent extends Student {
           public GradStudent(String n) {
                    super(n);
           }
           public GradStudent() {
                    this(" ");
           }
   }




ผศ. ธนศา เครอไวศยวรรณ                                                                                                                             การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   201
6.6 เมธอดของคลาสทชอ Object

        คลาสท;ชอ Object จะเปyนคลาสท;ทJกๆ คลาสจะสบทอดมา คลาสท;ชอ Object ม;เมธอดท;สZาค)ญหลายเมธอด
                
อาทเชLน toString()และ equals() ในการท;จะสามารถใชUงานเมธอดเหลLาน;YไดUจะตUองม;การเข;ยนคZาส)งเพอกZาหนด
ใหUเปyนเมธอดแบบ overridden ในคลาสท;ตUองการ

6.6.1 เมธอด toString()
      เมธอด toString() เปyนเมธอดท;ใชUในการแปลงคLาของอ5อบเจกต#ใหUเปyนขUอมVลชนด String คลาสท;อยVLใน
Java API เชLนคลาส Date ไดUกZาหนดคZาส)งสZาหร)บเมธอด toString() ไวUแลUว ด)งน)นการเร;ยกใชUเมธอด
                                                                            Y
System.out.println() โดยท; argument เปyนอ5อบเจกต#ของคลาส Date จะทZาใหUม;การเร;ยกใชUเมธอด

toString() ของคลาส Date โดยอ)ตโนม)ต ต)วอยLางเชLนคZาส)ง

                Date d = new Date();
                System.out.println(d);


       จะไดUผลล)พธ#เปyนขUอความท;ระบJวนเดอนป}ของอ5อบเจกต# d
                                      )

       โปรแกรมท; 6.27 แสดงต)วอยLางของคลาส Student ท;ม;เมธอดแบบ overridden ท;ชอ toString() เพอ
กZาหนดขUอความท;สLงกล)บมาเมอม;การเร;ยกใชUเมธอดด)งกลLาว คZาส)ง System.out.println(s1) จะเร;ยกใชUเมธอด
toString() เพอสLงขUอความท;เปyนคJณล)กษณะ name กล)บมาแลUวแสดงผลล)พธ#ออกทางจอภาพด)งแสดงในรVปท; 6.5



โปรแกรมท 6.27 ต)วอยLางของคลาสท;ม;เมธอดแบบ overridden ท;ชอ toString()

  public class Student {
     private String name;
     public Student(String n) {
        name = n;
     }
     public String toString() {
        return name;
     }
  }
  ------------------------------------------------------
  public class TestToString {
     public static void main(String args[]) {
        Student s1 = new Student("Thana");
        System.out.println(s1);
     }
  }




202   การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                            ผศ. ธนศา เครอไวศยวรรณ
รปท 6.5 ผลลพธทได*จากการรนโปรแกรมท6.27

6.6.2 เมธอด equals()

         เมธอด equals()เปyนเมธอดในคลาสท;ชอ Object เพอเปร;ยบเท;ยบวLาอ5อบเจกต#นม;คLาเทLาก)บอ5อบเจกต#ของท;
                                                                                   ;Y
สLงผLานมาทาง argument หรอไมL คลาสท;จะสามารถเร;ยกใชUเมธอดน;YไดUจะตUองกZาหนดเมธอดแบบ overridden
สZาหร)บเมธอดน;อยVLในคลาสน)นดUวย โปรแกรมท; 6.28 แสดงต)วอยLางของคลาส Student ท;ม;เมธอดแบบ overridden
               Y          Y
ท;ชอ equals() เพอกZาหนดวธ;การเปร;ยบเท;ยบอ5อบเจกต# โดยเมธอดน;YจะใหUคLาเปyน true ถUาอ5อบเจกต#ท;สLงผLานมาทาง
argument ม;คLาของคJณล)กษณะ name เทLาก)บคLาของคJณล)กษณะ name ของอ5อบเจกต#น;Y โปรแกรมน;จะใหUผลล)พธ#ด)ง
                                                                                           Y
แสดงในรVปท; 6.6

โปรแกรมท( 6.28 ต)วอยางของคลาสท%ม%เมธอดแบบ overridden ท%ชอ equals()
   public class Student {
      private String name;
      public Student(String n) {
          name = n;
      }
      public boolean equals(Object obj) {
            if (obj instanceof Student) {
                if (((Student)obj).name == name) {
                    return true;
                }
            }
            return false;
        }
   }
   ------------------------------------------------------
   public class TestEquals {
      public static void main(String args[]) {
          Student s1 = new Student("Thana");
          Student s2 = new Student("Thana");
          System.out.println(s1.equals(s2));
      }
   }




ผศ. ธนศา เครอไวศยวรรณ                                                  การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   203
รปท 6.6 ผลลพธทได*จากการรนโปรแกรมท 6.28


6.7 คลาสประเภท Wrapper

        คลาสประเภท Wrapper เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;ม;คJณล)กษณะสอดคลUองก)บชนดขUอมVลแบบพYน
ฐานท)Yงแปดชนด โดยภาษาจาวาไดUกZาหนดคลาสท;อยVLในแพคเก5จ java.lang ท;เปyนคลาสประเภท Wrapper ไวUแปด
คลาส ด)งแสดงในตารางท; 6.2 คลาสประเภท Wrapper จะชLวยในการสรUางอ5อบเจกต#ท;เก5บชนดขUอมVลแบบพYนฐานไวU
ในคอลเล5กช)นแบบ Heterogeneous ท;จะกลLาวถxงในบทท; 8

        โปรแกรมท; 6.29 แสดงต)วอยLางการใชUคลาสประเภท Wrapper ซxงในต)วอยLางน;YไดUสรUางอ5อบเจกต#ของคลาส
ประเภท Wrapper เพอเก5บชนดขUอมVลแบบพYนฐานสามคLา คอ true, ‘A’ และ 1.234 และไดUพมพ#คาของอ5อบเจกต#
                                                                                           L
ท)Yงสามออกมา โดยจะไดUผลล)พธ#ด)งแสดงในรVปท; 6.7


                                            ตารางท 6.2 คลาสประเภท Wrapper

                                       ชนดขUอมVล                ชอคลาส
                                       boolean                 Boolean
                                          byte                    Byte
                                         short                   Short
                                           int                 Integer
                                          long                    Long
                                         float                   Float
                                        double                  Double
                                          char                Character




204   การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                           ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท 6.29 ต)วอยLางการใชUคลาสประเภท Wrapper
    public class ShowWrapper {
       public static void main(String args[]) {
           Boolean b = new Boolean(true);
           Character c = new Character('A');
           Double d = new Double(1.234);
           System.out.println(b);
1          System.out.println(c);
           System.out.println(d);
        }
    }




                               รปท 6.7 ผลลพธทได*จากการรนโปรแกรมท 6.29


6.7.1 Autoboxing

       ภาษาจาวาต)YงแตLงเวอร#ช)น Java SE 5 ไดUเพมคZาส)ง Auto-boxing และ Auto-unboxing ซxงสามารถแปลงคLา
ระหวLางชนดขUอมVลพYนฐานก)บ คลาสประเภท Wrapper ท;สอดคลUองก)นไดUโดยอ)ตโนม)ต คZาส)ง Autoboxing คอการ
แปลงจากชนดขUอมVลพYนฐานเชLน int ไปเปyนคลาสประเภท Wrapper เชLน Integer สLวนคZาส)ง Auto-unboxing คอการ
แปลงจากคลาสประเภท Wrapper เชLน Byte ไปเปyนชนดขUอมVลพYนฐานเชLน byte

       โปรแกรมท; แสดงต)วอยLางการใชUคZาส)ง Auto-boxing ในการแปลงคLา int ท;ม;คLาเปyน 1 ใหUก)บอ5อบเจกต#ของ
คลาส Integer ท;ชอ myInt และใชUคZาส)ง Auto-unboxing เพอแปลงคLากล)บมาในต)วแปรชนดขUอมVลพYนฐานท;ชอ i
โดยจะไดUผลล)พธ#ด)งรVปท; 6.8




ผศ. ธนศา เครอไวศยวรรณ                                                  การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   205
โปรแกรมท 6.30 ต)วอยLางการใชUคZาส)ง Auto-boxing/Auto-unboxing
  public class ShowWrapper {
     public static void main(String []args) {
          Integer myInt = 1; // int into Integer
          System.out.println(myInt);

              int i = myInt + 3; // mix Integer and int
              System.out.println(i);

        }
  }




                                   รปท 6.8 ผลลพธทได*จากการรนโปรแกรมท 6.30


6.8 คย.เว,ร.ดอนๆ ทสDาคญ

        ภาษาจาวาไดUกZาหนดค;ย#เวร#ดท;เก;ยวขUองก)บคลาส เมธอด และคJณล)กษณะท;สZาค)ญไวUสองต)วคอ static และ
final ค;ย#เวร#ด static เปyนค;ย#เวร#ดเพอระบJวLาต)วแปรหรอคLาคงท;ใดเปyนคJณล)กษณะของคลาสหรอเมธอดใดเปyน

เมธอดของคลาส สLวนค;ย#เวร#ด final จะใชUในคลาส และเมธอดเพอกZาหนดไมLใหUม;การสบทอด หรอใชUในคJณล)กษณะ
เพอกZาหนดใหUเปyนคLาคงท;

6.8.1 ค%ณลกษณะแบบ static

        คJณล)กษณะของคลาสจะเปyนคJณล)กษณะท;ใชUรวมก)นในทJกอ5อบเจกต# และสามารถเร;ยกใชUงานไดUโดยไมLจZาเปyน
                                                L
ตUองสรUางอ5อบเจกต#ของคลาสขxYนมากLอน ต)วแปรหรอคLาคงท;ท;เปyนคJณล)กษณะของคลาสคอต)วแปรหรอคLาคงท;ซxงม;
modifier เปyน static คJณล)กษณะของคลาสน;จะเปyนต)วแปรหรอคLาคงท;ซxงใชUรLวมก)นในทJกอ5อบเจกต# โดยจะแตก
                                           Y
ตLางจากต)วแปรหรอคLาคงท;ท;เปyนคJณล)กษณะของอ5อบเจกต# ซxงอาจม;คาแตกตLางก)นไดUในแตLละอ5อบเจกต# โปรแกรมท;
                                                               L



206    การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                            ผศ. ธนศา เครอไวศยวรรณ
6.31 แสดงต)วอยLางการใชUค;ย#เวร#ด static เพอประกาศต)วแปรท;เปyนคJณล)กษณะของคลาส ในกรณ;นต)วแปร
                                                                                       ;Y
counter จะม;อยVLเพ;ยงต)วเด;ยวและทJกอ5อบเจกต#ใชUตวแปรน;รLวมก)น ด)งน)Yนจxงสามารถท;จะเร;ยกใชUไดUโดยระบJชอคลาส
                                                )     Y
(Student.counter) โปรแกรมน;YจะใหUผลล)พธ#ท;ม;คาเทLาก)นด)งแสดงในรVปท; 6.9
                                                  L

โปรแกรมท 6.31 ต)วอยLางการใชUค;ย#เวร#ด static

  public class Student {
     static int counter;
     public Student() {
        counter++;
     }
  }

  ------------------------------------------------------------
  public class TestStatic {
     public static void main(String args[]) {
        Student s1 = new Student();
        Student s2 = new Student();
        System.out.println(Student.counter);
        System.out.println(s1.counter);
        System.out.println(s2.counter);
     }
  }




                               รปท 6.9 ผลลพธทได*จากการรนโปรแกรมท 6.31

6.8.2 เมธอดแบบ static

      เมธอดแบบ static คอเมธอดท;ม; modifier เปyน static โดยท)วไปเราจะประกาศเมธอดใดๆ ใหUเปyนเมธอด
แบบ static ในกรณ;ท;เมธอดน)นเปyนเมธอดท;ใชUงานท)วไป (Utility Method) เราสามารถท;จะเร;ยกใชUเมธอดแบบ
                            Y
static ไดUโดยเร;ยกผLานชอคลาสเชLนเด;ยวก)บคJณล)กษณะของคลาส ซxงม;รVปแบบการใชUงานด)งน;Y




ผศ. ธนศา เครอไวศยวรรณ                                                  การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   207
ClassName.methodName()


       โดยท;
           • className    คอชอของคลาส
           •    methodName คอชอของเมธอดแบบ static


           ต)วอยLางของเมธอดแบบ static คอเมธอดทJกเมธอดในคลาส Math ท;อยVLใน Java API ท)Yงน;Yเนองจากเมธอด
เหลLาน;จ)ดวLาเปyนเมธอดสZาหร)บใชUงานท)วไปจxงกZาหนดใหUเปyนเมธอดแบบ static ทZาใหUเราสามารถท;จะเร;ยกใชUเมธอด
       Y                             
เหลLาน;ไดUโดยใชUชอคลาส เชLนคZาส)ง
         Y
                 Math.sqrt(4);


       เปyนคZาส)งคZานวณหาคLารากท;สองของ   4   เปyนตUน

       เมธอดท;ชอ main()เปyนอ;กต)วอยLางหนxงของเมธอดแบบ static ท)Yงน;YเนองจากภาษาจาวาไมLตUองการใหU
                                           
JVM ตUองสรUางอ5อบเจกต#ของคลาสท;ม;เมธอด main() ขxYนมากLอนเพอร)นเมธอด main() จxงไดUกZาหนดใหU main()
เปyนเมธอดแบบ static

       ภาษาจาวาไดUกZาหนดเงอนไขของเมธอดแบบ static ท;สZาค)ญไวUด)งน;Y
       • เมธอดแบบ static จะไมLสามารถเร;ยกคJณล)กษณะหรอเมธอดท;ไมLไดUเปyนแบบ static (non-static) ไดU
       • เมธอดแบบ static จะไมLสามารถม;เมธอดแบบ overridden ไดU


6.8.3 Static Initializer

                      คอบล5อกในคลาสใดๆ ท;อยVLนอกเมธอด และม;ค;ย#เวร#ด static เพอนยามใหUเปyนบล5อก
       Static Initializer
แบบ static โดยม;รVปแบบด)งน;Y
                static {
                    ...
                }


         โปรแกรมภาษาจาวาจะร)นคZาส)งท;อยVLในบล5อกแบบ static เพ;ยงคร)Yงเด;ยวเมอ JVM โหลดคลาสท;ม;บล5อกด)ง
กลLาวขxนมา Static Initializer จะใชUในการด;บ)ก (debug) โปรแกรมหรอใชUในกรณ;ท;ตUองการสรUางอ5อบเจกต#ของคลาส
       Y
ขxYนโดยอ)ตโนม)ต เราสามารถท;จะกZาหนดบล5อกแบบ static ไดUมากกวLาหนxงบล5อกในคลาสแตLละคลาส โดยการ
                                                                    
ทZางานของโปรแกรมจะเร;ยกคZาส)งในบล5อกแบบ static จากบนลงลLาง โปรแกรมท; 6.32 แสดงต)วอยLางของคลาสท;ม;


208   การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                             ผศ. ธนศา เครอไวศยวรรณ
Static Initializer ซxงโปรแกรมน;จะใหUผลล)พธ#ด)งแสดงในรVปท; 6.10
                                Y

โปรแกรมท 6.32 ต)วอยLางของคลาสท;ม; Static Initializer
  public class TestStaticBlock {
     static int x=5;
     static {
         x += 1;
     }
     public static void main(String args[]) {
         System.out.println("x = "+x);
     }
     static {
         x /= 2;
     }
  }




                                รปท 6.10 ผลลพธทได*จากการรนโปรแกรมท 6.32

6.8.4 คย.เว,ร.ด final

        ค;ย#เวร#ด final สามารถท;จะใชUเปyน modifier สZาหร)บคลาส ต)วแปร และเมธอด โดยท;

        •   คลาสท;ม; modifier เปyน final จะเปyนคลาสท;ไมLสามารถใหUคลาสอนสบทอดไดUต)วอยLางเชLน คลาส
            String ท;กZาหนดใน Java API เปyนคลาสแบบ final ซxงม;รVปแบบคZาส)งประกาศคลาสด)งน;Y

                        public final class String {
                              ...
                        }

        ด)งน)นเราจxงไมLสามารถท;จะกZาหนดใหUคลาสใดๆ สบทอดคลาส String ไดU
             Y

        •   เมธอดท;ม; modifier เปyน final คอเมธอดท;จะไมLสามารถม;เมธอดแบบ overridden ไดU ต)วอยLางเชLนถUา
            คลาส Student กZาหนดใหUเมธอด showDetails() ม; modifier เปyน final ด)งน;Y



ผศ. ธนศา เครอไวศยวรรณ                                                 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   209
public class Student{
                                 ...
                           public final void showDetails(){
                                 ...
                           }
                     }

       ด)งน)นถUาคลาส GradStudent สบทอดมาจากคลาส Student จะไมLสามารถม;เมธอดแบบ overridden ท;ชอ
            Y
       showDetails() ไดU


       •    ต)วแปรท;ม; modifier เปyน final คอคLาคงท; คLาคงท;จะสามารถกZาหนดคLาไดUเพ;ยงคร)Yงเด;ยว โดยจะตUองม;
            การกZาหนดคLากLอนท;จะม;การเร;ยกใชUงาน ซxงเมอกZาหนดคLาแลUวจะไมLสามารถเปล;ยนแปลงคLาไดU ถUาคLาคงท;
            น)นเปyนคJณล)กษณะของอ5อบเจกต# เราจะตUองกZาหนดคLาในคZาส)งประกาศต)วแปร หรอใชUคZาส)งกZาหนดคLา
              Y
            ภายใน constructor ของคลาส แตLถUาเปyนคLาคงท;ซxงอยVLภายในเมธอด เราจะตUองกZาหนดคLาในคZาส)งประกาศ
            ต)วแปร หรอใชUคZาส)งกZาหนดคLาภายในเมธอดกLอนท;จะม;การเร;ยกใชUงานคLาคงท;นน )Y

6.9 คลาสภายใน
       คลาสภายใน (Inner Class) คอคลาสท;ประกาศอยVLภายในคลาสอนๆ ซxงบางคร)Yงเร;ยกวLาคลาสแบบซUอน
(Nested Class) คลาสภายในอนJญาตใหUประกาศคJณล)กษณะหรอเมธอดภายในคลาสอนไดU คลาสภายในม;ประโยชน#
ในกรณ;ท;ตUองการจะจ)ดกลJLมของคลาสท;ตUองทZางานรLวมก)น โดยตUองการควบคJมไมLใหUม;การเขUาถxงโดยตรงจากคลา
สอนๆ และตUองการเร;ยกใชUคJณล)กษณะหรอเมธอดของคลาสท;อยVLภายนอกไดUโดยตรง

       ภาษาจาวาแบLงคลาสภายในออกเปyนสองแบบคอ
       1.   คลาสภายในท;อยVLภายในคลาสโดยตรง
       2.   คลาสภายในท;อยVLภายในเมธอด

6.9.1 คลาสภายในทอย0ภายในคลาส

        กรณ;น;Yเปyนการประกาศคลาสภายในคลาสอนท;เร;ยกวLา คลาสภายนอก (Outer class) โปรแกรมท; 6.33 เปyน
ต)วอยLางของการประกาศคลาสภายในท;ชอ Inner ซxงถVกประกาศอยVLภายในคลาสท;ชอ Outer คลาสภายในจะแตกตLาง
                                                                        
ก)บคลาสท)วๆ ไปตรงท;เราสามารถท;จะประกาศใหUคลาสภายในม; access modifier เปyน public, private,
default หรอ protected ก5ไดU ขณะท;คลาสท)วๆ ไปจะกZาหนดใหUเปyนไดUเฉพาะ public หรอ default เทLาน)น
                                                                                               Y
นอกจากน;YการสรUางอ5อบเจกต#ของคลาสภายในย)งม;ขUอแตกตLางด)งน;Y


210   การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                                   ผศ. ธนศา เครอไวศยวรรณ
1.   การสรUางอ5อบเจกต#ของคลาสภายในนอกคลาสภายนอก จะตUองทZาการสรUางอ5อบเจกต#ของคลาสภายนอก
             กLอน แลUวจxงสรUางอ5อบเจกต#ของคลาสภายในไดU ต)วอยLางเชLนคZาส)ง
                 Outer.Inner in2 = new Outer().new Inner();


             ในโปรแกรมท; เปyนต)วอยLางการสรUางอ5อบเจกต#ของคลาสภายในท;ชอ in2 (กรณ;นจะไมLสามารถสรUาง
                                                                                  ;Y
             อ5อบเจกต#ของคลาสภายในไดU ถUาคลาสภายในม; modifier เปyน private)

        2.   การสรUางอ5อบเจกต#ภายในเมธอดท;อยVLในคลาสภายนอกสามารถทZาไดUโดยตรง เชLน เด;ยวก)บการสรUาง
             อ5อบเจกต#ท)วๆ ไป ต)วอยLางเชLนถUาเมธอด methodX() เปyนเมธอดในคลาสภายนอก และตUองการจะสรUาง
             อ5อบเจกต#ของคลาสภายใน เราสามารถทZาไดUด)งน;Y
                 public void methodX() {
                      ...
                      Inner in1 = new Inner();
                 }

        คลาสท;อยVLภายในสามารถท;จะเร;ยกใชUคJณล)กษณะ และเมธอดของคลาสภายนอกไดU โปรแกรมท; 6.33 แสดง
ต)วอยLางของการเร;ยกใชUและประกาศต)วแปรของคลาสภายในและภายนอก ต)วอยLางน;จะม;ต)วแปรชอเด;ยวก)นซxงม;
                                                                        Y
ขอบเขตท;ตLางก)น


โปรแกรมท 6.33 ต)วอยLางแสดงคลาสภายในท;อยVLภายในคลาส

   public class Outer {
      public void method1() {
          Inner in1 = new Inner();
          in1.method2();
      }
      public class Inner {
          public void method2() {
            System.out.println("Inner Demo");
          }
      }
   }

   --------------------------------------------------------
   public class InnerDemo {
      public static void main(String args[]) {
          Outer.Inner in2 = new Outer().new Inner();
          in2.method2();
      }
   }




ผศ. ธนศา เครอไวศยวรรณ                                               การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   211
6.9.2 คลาสภายในทอย0ภายในเมธอด

         กรณ;น;Yเปyนการประกาศคลาสภายในท;อยVLภายในเมธอดของคลาสภายนอกด)งต)วอยLางท;แสดงในโปรแกรมท;
6.34 คลาสภายในประเภทน;จะม; access modifier เปyน default เราจะไมLสามารถท;จะสรUางอ5อบเจกต#ของคลาส
                           Y
ภายในประเภทน;นอกเมธอดท;ประกาศคลาสไดU และจะสามารถเร;ยกใชUต)วแปรภายในของเมธอดไดUในกรณ;ท;ต)วแปร
                  Y
น)นประกาศเปyน final เทLาน)น สLวนต)วแปรท;เปyนคJณล)กษณะของคลาสหรอคJณล)กษณะของอ5อบเจกต# สามารถท;จะ
  Y                          Y
เร;ยกใชUไดUเชLนเด;ยวก)บคลาสภายในท;อยVLภายในคลาส

       คลาสภายในท)Yงสองประเภทย)งม;คJณสมบ)ตอนๆ ท;สZาค)ญด)งน;Y

       •   คลาสภายในอาจเปyนคลาสแบบ abstract หรออนเตอร#เฟสไดU
       •   คลาสภายในท;อยVLภายในคลาสภายนอกโดยตรง ถUาม; modifier เปyน static จะกลายเปyนคลาสปกต และ
           สามารถสรUางอ5อบเจกต#โดยการเร;ยกชอของคลาสภายนอกไดUด)งน;Y
                         Outer.Inner in3 = new Outer.Inner();

       •   คลาสภายในไมLสามารถท;ประกาศใหUม;คJณล)กษณะหรอเมธอดเปyนแบบ static ไดUเวUนแตLคลาสภายในจะ
           เปyนคลาสแบบ static
       •   คลาสภายในสามารถท;จะใชUต)วแปรท;เปyนคJณล)กษณะของคลาสหรอคJณล)กษณะของอ5อบเจกต#ของคลาส
           ภายนอกไดU

โปรแกรมท 6.34 คลาสภายในท;อยVLภายในเมธอด
  public class MOuter {
     private int a = 1;
     public void method(final int b) {
         final int c = 2;
         int d = 3;
         class Inner {
           private void iMethod() {
              System.out.println("a = "+a);
              System.out.println("b = "+b);
              System.out.println("c = "+c);
              System.out.println("d = "+d);               //illegal
           }
         }
     }
  }




212   การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                         ผศ. ธนศา เครอไวศยวรรณ
6.10 Generic Types

        เราสามารถท;จะประกาศคลาสหรออนเตอร#เฟสใดๆใหUม;ชนดขUอมVลเปyนแบบท)วไป (Generic Type) แลUวคLอย
ระบJชนดขUอมVลแบบเจาะจงตอนท;สรUางอ5อบเจกต#ไดU โดยการใชUต)วแปรชนดขUอมVล (type variable) ซxงม;รVปแบบการ
ใชUงานด)งน;Y
                 public class ClassName(TypeVariable)


        โดยท;
        • ClassName   คอชอของคลาส
        •   TypeVariable คอชอของต)วแปรชนดขUอมVล


         โปรแกรมท; 6.35 แสดงต)วอยLางคลาสท;ชอ Box ท;ม;คJณล)กษณะท;ใชU Generic Type โดยประกาศต)วแปรชนด
                                                 
ขUอมVลท;ชอ T ซxงจะเห5นไดUวาคJณล)กษณะท;ชอ t ม;ชนดขUอมVลแบบ T ท;ย)งไมLไดUระบJวาเปyนชนดใดท;ช)ดเจน เราสามารถ
                             L                                                    L
ท;จะระบJชนดขUอมVลไดUเมอม;การประกาศและสรUางอ5อบเจกต#ของคลาสน;Y อาทเชLนคZาส)ง
                  Box<Integer> integerBox;


       เปyนการประกาศอ5อบเจกต#ท;ชอ integerBox ของคลาส Box ท;ม;ชนดขUอมVลเปyน Integer ซxงเราสามารถสรUาง
อ5อบเจกต#ของคลาสน;โดยใชUคZาส)ง
                  Y
                  integerBox = new Box<Integer>();

        หรอสามารถท;จะประกาศและสรUางอ5อบเจกต#ในคZาส)งเด;ยวก)นด)งน;Y
                  Box<Integer> integerBox = new Box<Integer>();



       หรอหากท;ตUองการจะใชUชนดขUอมVลอน เราก5สามารถท;จะประกาศและสรUางอ5อบเจกต#โดยระบJชนดขUอมVลท;
ตUองการอาทเชLน
                  Box<Byte> byteBox = new Box<Byte>();


        เปyนการประกาศและสรUางอ5อบเจกต#ชอ byteBox ของคลาส Box ท;ม;ชนดขUอมVลเปyน Byte
                                       

        โปรแกรมท; 6.35 ไดUแสดงต)วอยLางของคลาส BoxDemo ท;แสดงการใชUงานคลาส Box



ผศ. ธนศา เครอไวศยวรรณ                                                   การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   213
โปรแกรมท 6.35 ต)วอยLางแสดงคลาสท;ใชU Generic Type

  public class Box<T> {
      private T t;

       public void add(T t) {
           this.t = t;
       }

       public T get() {
           return t;
       }
  }

  -----------------------------------------------------------
  public class BoxDemo {

       public static void main(String[] args) {
           Box<Integer> integerBox = new Box<Integer>();
           integerBox.add(new Integer(10));
           Integer someInteger = integerBox.get(); // no cast!
           System.out.println(someInteger);
       }
  }




6.10.1 เมธอดแบบ Generic

      เราสามารถท;จะใชU Generic Type ก)บเมธอดหรอ constructor ใดๆก5ไดU ในกรณ;ท;เราตUองการท;จะใหUเมธอด
                                                                                           
หรอ constructor ม; argument ท;ร)บชนดขUอมVลใดๆก5ไดUโดยม;รVปแบบด)งน;Y
                [modifier] <TypeVariable> return_type methodName(TypeVaraible varName) {
                    [method_body]
                }

       โดยท;
            • TypeVariable คอชอของต)วแปรชนดขUอมVล
            • varName คอชอ argument

     โปรแกรมท; 6.36 แสดงต)วอยLางของคลาส BoxMethod ท;ม;เมธอดท;ชอ inspect ทโดย argument ชอ u เปyน
Generic Type แลUวคZาส)งของเมธอด main ในคลาส BoxMethodDemo มาเร;ยกใชUโดยการกZาหนดใหUเปyนชนด
Double (คLาทศนยม 3.2 ถVกแปลงใหUเปyนคลาส Double โดยคZาส)ง auto-boxing) โดยจะไดUผลล)พธ#ของการร)น
โปรแกรมด)งรVปท; 6.11


214   การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                           ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท 6.36 ต)วอยLางแสดงคลาสท;ประกาศเมธอดแบบ Generic

   public class BoxMethod {

        public <U> void inspect(U u) {
            System.out.println("U: " + u.getClass().getName());
        }
   }
   -------------------------------------------------------
   public class BoxMethodDemo {
     public static void main(String[] args) {
           BoxMethod box = new BoxMethod();
           box.inspect(3.2);
       }
   }




                               รปท 6.11 ผลลพธทได*จากการรนโปรแกรมท 6.36

6.11 Annotation

          ภาษาจาวาม;คZาส)ง annotation (เครองหมาย @)) ซxงจะใหUขUอมVลเก;ยวก)บโปรแกรม โดยท;จะไมLม;ผลโดยตรง
ตLอคZาส)งใดๆ ของ code ท;ทZาการบ)นทxก (annotate) อยVL เราสามารถท;จะกZาหนดคZาส)ง annotation ในการประกาศ
คลาส คJณล)กษณะ เมธอด หรอสLวนอนๆ ของโปรแกรม โดยท)วไป annotation จะถVกใชUงานในกรณ;ตLางๆ ด)งน;Y
                                                            

        •   เปyนขUอมVลสZาหร)บคอมไพเลอร# เพอตรวจจ)บขUอผดพลาดหรอ warning ของโปรแกรม
        •   ชLวยในกระบวนการข)นตอนการคอมไพล#และตดต)Yง (deployment) ท)Yงน;ซอฟต#แวร#ในการคอมไพล#
                               Y                                            Y
            สามารถท;จะประมวลผลขUอมVล annotation ในการสรUางโคUดท;เ ปyนไฟล# XML ไดU
        •   ชLวยในกระบวนการข)นตอน runtime ท)Yงน;Yจาก annotation บางคZาส)งจะสามารถตวรสอบไดUในชLวง
                                 Y
            runtime


        คZาส)ง annotation @ ม)กจะถVกประกาศเปyนคZาส)งแรก ตามดUวยชอของ annotation ซxงอาจม; element



ผศ. ธนศา เครอไวศยวรรณ                                                   การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   215
ท;ม; named หรอ unnamed valued ต)วอยLางเชLน
             @Author(
                name = "Benjamin Franklin",
                date = "3/27/2003"
             )
             class MyClass() { }


       คอ annotation ชอ author ท;ม; element สองต)วท;เปyน named valued คอ name และ date

       หรอคZาส)ง
             @SuppressWarnings(value = "unchecked")

             void myMethod() { }


      คอ annotation ท;ชอ SuppressWarnings ท;อยVLหนUาเมธอดท;ม; element เปyน named value ชอ values ซxง
ในกรณ;น;Yเนองจากม; element เด;ยว ด)งน)นเราอาจไมLจZาเปyนตUองกZาหนดชอ (unnamed value) ด)งน;Y
                                       Y
             @SuppressWarnings("unchecked")

             void myMethod() { }


       ในกรณ;ท;ไมLม; element ใดเลย เราไมLจZาเปyนตUองใสLเครองหมายวงเล5บหล)ง annotation ด)งน;Y
             @Override

             void mySuperMethod() { }




6.11.1 Annotation Document

        เราสามารถท;จะนZาคZาส)ง annotation มาใชUในการท;จะเข;ยน document ของ source code อาทเชLน แทนท;จะ
                                                                                                       
ตUองเข;ยน comment ของคลาสตLอไปน;Yในล)กษณะด)งน;Y
                 public class Generation3List extends Generation2List {

                     //   Author: John Doe
                     //   Date: 3/17/2002
                     //   Current revision: 6
                     //   Last modified: 4/12/2004
                     //   By: Jane Doe
                     //   Reviewers: Alice, Bill, Cindy



216    การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                                 ผศ. ธนศา เครอไวศยวรรณ
// class code goes here
                 }


        เราสามารถท;จะกZาหนด annotation type ของอนเตอร#เฟสขxYนมาหนxงต)วด)งน;Y
                 @interface ClassPreamble {
                    String author();
                    String date();
                    int currentRevision() default 1;
                    String lastModified() default "N/A";
                    String lastModifiedBy() default "N/A";
                    String[] reviewers(); // Note use of array
                 }



        จากน)นสรUางคลาสโดยกZาหนดคLาของ annotation ด)งต)วอยLางน;Y
             Y
                 @ClassPreamble (
                    author = "John Doe",
                    date = "3/17/2002",
                    currentRevision = 6,
                    lastModified = "4/12/2004",
                    lastModifiedBy = "Jane Doe",
                    reviewers = {"Alice", "Bob", "Cindy"} // Note array notation
                 )
                 public class Generation3List extends Generation2List {

                 // class code goes here

                 }



6.11.2 Annotation ทใชโดยคอมไพเลอร.

      ภาษาจาวาไดUกZาหนด annotation สZาหร)บคอมไพเลอร#ไวUสามคZาส)งคอ @Depreacted,                @Override       และ
@Suppresswarnings โดยคZาส)ง annotation เหลLาน;Yม;การทZางานด)งน;Y


        • @Deprecated         เราจะใชU annotation น;Y ในกรณ;ท;ตUองการระบJวLาคZาส)งเชLนคลาส เมธอด หรอคJณล)กษณะ
            ใด เปyนคZาส)งท;ไมLควรจะใชUแลUว เพอใหUคอมไพเลอร#สLงคZาส)ง warning ออกมาในชLวงการคอมไพล#
            โปรแกรม ต)วอยLางเชLน
                         // Javadoc comment follows
                         /**
                          * @deprecated
                          * explanation of why it was deprecated
                          */




ผศ. ธนศา เครอไวศยวรรณ                                                     การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#    217
@Deprecated
                      static void deprecatedMethod() { }



      • @Override เราจะใชU annotation น;Yเพอจะบอกคอมไพเลอร#วา element น;Y override คZาส)ง element ของ
                                                             L
          superclass ต)วอยLางเชLน
                    // mark method as a superclass method
                    // that has been overridden
                    @Override
                    int overriddenMethod() { }



      • @SuppressWarnings เราจะใชU annotation น;Yเพอบอกคอมไพเลอร#ไมLตUองแสดงคZาส)ง warning ท;อาจ
          ปรากฎขxนจากการใชUคZาส)งท;ตามมาน;YในชLวงการคอมไพล#โปรแกรม ต)วอยLางเชLน
                 Y
                    // use a deprecated method and tell
                    // compiler not to generate a warning
                    @SuppressWarnings("deprecation")
                    void useDeprecatedMethod() {
                         objectOne.deprecatedMethod(); //deprecation warning-suppressed
                    }




สร%ปเนอหาของบท
      • เมธอดท;กZาหนดขxYนในคลาสใดๆ สามารถเร;ยกใชUงานไดUสองรVปแบบคอ การเร;ยก ใชUงานจากคลาสท;ตLางก)น
          และการเร;ยกใชUงานภายในคลาสเด;ยวก)น
      •   เมธอดท;กZาหนดขxYนในคลาสอาจม; argument ท;ร)บคLาเพอนZาไปใชUในเมธอด
      •   เมธอดใดๆ ของคลาสสามารถท;จะม;คLาท;สLงกล)บมาไดU ท)Yงน;การประกาศเมธอดจะตUองระบJชนดขUอมVลของ
                                                                Y
          คLาท;จะสLงกล)บ
      •   เมธอดสามารถแบLงเปyนเมธอดของอ5อบเจกต# (หรอเร;ยกวLาเมธอดแบบ non-static) และเมธอดของคลาส
          (หรอเร;ยกวLาเมธอดแบบ static)
      •   เมธอดของคลาสใดท;ม; modifier เปyนแบบ static จะทZาใหUสามารถถVกเร;ยกใชUงาน โดยใชUชอของคลาส
          น)นไดUเลย
            Y
      •   เมธอดแบบ overloaded คอ ม;เมธอดท;ม;ชอเด;ยวก)นแตLจะม;จZานวนหรอชนดขUอมVลของ argument ท;ตLาง
          ก)น
      •   โดยท)วไป คJณล)กษณะของคลาสจะม; modifier เปyนแบบ private ท)Yงน;Yเพอป‚องก)นการเขUาถxงจากคลาส


218   การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                              ผศ. ธนศา เครอไวศยวรรณ
อน
        •   โดยท)วไป เมธอดของคลาสจะม; modifier เปyนแบบ public ท)Yงน;YเพอใหUเมธอดจากคลาสอนเร;ยกใชUไดU
        •   ชอของเมธอดท;เก;ยวขUองก)บคJณล)กษณะของคลาส นยมใชU setXxx สZาหร)บ เมธอดท;ม;ไวUเพอกZาหนดคLาใหU
            ก)บคJณล)กษณะ xxx และใชU getXxx สZาหร)บ เมธอดท;จะสLงคLากล)บเปyนคJณล)กษณะ xxx
        •   ค;ย#เวร#ด protected จะทZาใหUคลาสท;เปyน subclass สามารถท;จะอUางองถxงคJณล)กษณะหรอเมธอดของ
            superclass ไดU
        •   คลาสทJกคลาสในภาษาจาวาถUาไมLไดUสบทอดจากคลาสใดเลย จะถอวLาคลาสน)นสบทอดจากคลาสท;ชอ
                                                                                   Y                
            Object
        •   super   เปyนค;ย#เวร#ดท;ใชUในการอUางองถxง superclass เพอท;จะเร;ยกใชUเมธอดหรอ constructor ของ
            superclass
        • การม;ไดUหลายรVปแบบหมายถxง
            −    การท;เราสามารถท;จะสรUางหรออUางถxงอ5อบเจกต#ของคลาสท;สบทอดก)นไดUหลายรVปแบบ
             − การท;เราสามารถท;จะอUางถxงเมธอดชอเด;ยวก)นไดUหลายรVปแบบ
        •   เมธอดแบบ overloaded หมายถxงเมธอดท;ม;ชอเด;ยวก)นมากกวLาหนxงเมธอด โดยม;จZานวนหรอชนดของ
                                                                         
            argument ท;แตกตLางก)น
        •   เมธอดแบบ overridden หมายถxงการท; subclass สรUางเมธอดท;ม;อยVLแลUวใน superclass ขxYนใหมL โดยใชUชอ
            argument และชนดขUอมVลของคLาท;สLงกล)บของเมธอดเหมอนเดม
        •   ค;ย#เวร#ด instanceof เปyนต)วดZาเนนการท;ใชUก)บอ5อบเจกต#และคลาส เพอตรวจสอบวLาอ5อบเจกต#ใดๆ เปyน
            อ5อบเจกต#ของคลาสท;ระบJหรอไมL
        •   การ casting อ5อบเจกต# ทZาใหUเราสามารถจะกZาหนดอ5อบเจกต#ของคลาสท;เปyน superclass ใหUก)บต)วแปรท;
            กZาหนดเปyนคลาสท;เปyน subclass ไดU
        •   Constructor หมายถxง เมธอดท;ม;ชอเด;ยวก)นก)บชอคลาส แตLจะไมLม;การสLงคLากล)บและจะไมLม;การใสL
            ค;ย#เวร#ด void โดยคลาสทJกคลาสจะม; constructor แบบ default มาใหUอยVLแลUว แตLเราสามารถท;จะกZาหนด
            constructor ขxนใหมLเองไดU
                            Y
        •   Constructor แบบ overloaded หมายถxง constructor ท;ม;จZานวนหรอชนดของ argument ท;แตกตLางก)น
        •   เมธอดท;ชอ this() เปyนการเร;ยกใชU constructor ของคลาสต)วเอง โดยจะตUองเปyนคZาส)งแรกสJดท;อยVLใน
            constructor แบบ overloaded
        •   Constructor แบบ default ของคลาสท;เปyน superclass จะถVกเร;ยกใชUโดยอ)ตโนม)ตทJกคร)Yงท;ม;การสรUาง
            อ5อบเจกต#ของคลาสท;เปyน subclass แตLเราสามารถเปล;ยนใหUไปเร;ยกใชU constructor ต)วอนของ
            superclass แทนไดUโดยใชUเมธอด super()




ผศ. ธนศา เครอไวศยวรรณ                                                     การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#   219
• คลาสท;ชอ Object ม;เมธอดท;สZาค)ญอยVLสองเมธอดคอเมธอด toString() และเมธอด equals()
      • เมธอด toString() ใชUในการแปลงคLาของอ5อบเจกต#ใหUเปyนขUอมVลชนด String สLวนเมธอด equals()
          ใชUในการเปร;ยบเท;ยบคLาของอ5อบเจกต#
      •   Auto-boxing / Auto-unboxing คอการแปลงคLาระหวLางชนกขUอมVลพYนฐานก)บคลาสประเภท Wrapper
          ท;สอดคลUองก)นโดยอ)ตโนม)ต
      •   โดยปกตเราจะประกาศเมธอดใดๆ ใหUเปyนเมธอดแบบ static ในกรณ;ท;เมธอดน)นเปyนเมธอดท;ใชUงาน
                                                                                 Y
          ท)วไป และเมธอดแบบ static สามารถถVกเร;ยกใชUจากชอของคลาสไดUโดยไมLจZาเปyนตUองสรUางอ5อบเจกต#
             
      •   คลาสท;ม; modifier เปyน final จะทZาใหUคลาสอนไมLสามารถสบทอดคลาสน;YไดU และเมธอดท;ม; modifier
          เปyน final คอเมธอดท;จะไมLสามารถม;เมธอดแบบ overridden ไดU สLวนต)วแปรท;ม; modifier เปyน final
          คอคLาคงท; ซxงจะทZาใหUสามารถกZาหนดคLาไดUเพ;ยงคร)Yงเด;ยวเทLาน)น
                                                                        Y
      •   คลาสภายในหมายถxงคลาสท;อยVLภายในคลาส หรอคลาสท;อยVLภายในเมธอด
      •   Generic Type สามารถท;จะทZาใหUเราประกาศคลาสหรออนเตอร#เฟสใดๆใหUม;ชนดขUอมVลเปyนแบบท)วไป

          (Generic Type) แลUวคLอยระบJชนดขUอมVลแบบเจาะจงตอนท;สรUางอ5อบเจกต#ไดU
      •   เมธอดแบบ Generic คดเมธอดท;ม; argument ท;เปyน Generic Type
      •   Annotation จะใหUขUอมVลเก;ยวก)บโปรแกรม โดยท;จะไมLมผลโดยตรงตLอคZาส)งใดๆของ code ท;ทZาการ
                                                                    ;
          บ)นทxก




220   การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#                                           ผศ. ธนศา เครอไวศยวรรณ
บทท 7 การจดการกบเหต%การณ.กราฟ3ก
        เนYอหาในบทน;YเปyนการแนะนZาวธ;การเข;ยนโปรแกรม เพอจ)ดการก)บเหตJการณ#กราฟmกในโปรแกรม GUI โดย
จะเรมตUนจากการแนะนZานยามความหมายของเหตJการณ# แนะนZาคลาสประเภท Event ท;เก;ยวขUองก)บเหตJการณ#กราฟmก
ตLางๆ แนะนZาอนเตอร#เฟสประเภท Listener ท;ใชUในการร)บฟwงเหตJการณ# อธบายวธ;การจ)ดการก)บเหตJการณ#กราฟmก
หลายๆ เหตJการณ# และตอนทUายของบทเปyนการแนะนZาคลาสประเภท Event Adapter

7.1 เหต%การณ.

        เหตJการณ# (Event) เปyนสถานการณ#ท;เกดขxนในขณะร)นโปรแกรม อาทเชLน การใชUอนพJต (เมาส#หรอค;ย#บอร#ด)
                                               Y
ตดตLอก)บโปรแกรม GUI การเกดเหตJการณ#ในโปรแกรมภาษาจาวาจะเปyนการสรUางอ5อบเจกต#ของคลาสประเภท Event
ชนดตLางๆ ขxYนมาตามประเภทของเหตJการณ# อาทเชLน

        -   เมอเลอนเมาส#ในเฟรมจะเกดอ5อบเจกต#ของคลาส MouseEvent ขxนมา
                                                                    Y
        -   เมอปmดเฟรมจะเกดอ5อบเจกต#ของคลาส WindowEvent ขxYนมา
        -   เมอกดปJšมท;อยVLในเฟรมจะเกดอ5อบเจกต#ของคลาส ActionEvent ขxYนมา
        -   เมอพมพ#ขUอความใน TextField จะเกดอ5อบเจกต#ของคลาส KeyEvent ขxนมาY

       คลาสประเภท Event จะสบทอดมาจากคลาส ObjectEvent สLวนคลาสประเภท Event สZาหร)บเหตJการณ#
ทางกราฟmกจะม;อยVLสองกลJLมคอ คลาสในแพคเก5จ java.awt.event และ javax.swing.event โดยคลาสประเภท
Event ท;ใชUโดยพYนฐานคอคลาสในแพคเก5จ java.awt.event ซxงสLวนประกอบทางกราฟmกท)งในแพคเก5จ AWT
และ Swing ตLางก5สามารถท;จะใชUคลาสเหลLาน)นไดU รVปท; 7.1 แสดงคลาสประเภท Event และอนเตอร#เฟสตLางๆ ท;อยVL
                                         Y
ในแพคเก5จ java.awt.event

        Java SE ในเวอร#ช)น 1.4 ไดUม;การเพมคลาสประเภท Event และอนเตอร#เฟสตLางๆ ท;เก;ยวขUองสZาหร)บใชUใน
อ5อบเจกต#ของคลาสประเภท Swing มากขxYน โดยคลาสและอนเตอร#เฟสเหลLาน;จะอยVLในแพคเก5จ
                                                                   Y
javax.swing.event รVปท; 7.3 แสดงต)วอยLางของคลาสประเภท Event ท;อยVLในแพคเก5จด)งกลLาว แตLเนYอหาในบทน;Y

จะเนUนเฉพาะการใชUงานของคลาสในแพคเก5จ java.awt.event ท;ม;คZาส)งสLวนใหญLสZาหร)บใชUในอ5อบเจกต#ของคลาส
ประเภท Swing ไดU




ผศ. ธนศา เครอไวศยวรรณ                                                        การจ)ดการก)บเหตJการณ#กราฟmก   221
รปท 7.1 คลาสและอนเตอรเฟสของแพคเก-จ java.awt.Event

      โดยท)วไปองค#ประกอบของเหตJการณ#จะม;สามสLวนด)งแสดงในรVปท; 7.2 คอ

      1. Event      คออ5อบเจกต#ประเภท Event ตามชนดของเหตJการณ#ท;เกดขxYนเชLน อ5อบเจกต#ของคลาส
           WindowEvent
      2. Event Source คออ5อบเจกต#ท;ทZาใหUเกดเหตJการณ#เชLน อ5อบเจกต#ของคลาส JFrame       ท;เปyนสLวนท;ทZาใหU
           เกดเหตJการณ#การปmดเฟรม
      3.   Event Handler คออ5อบเจกต#ท;จะทZาหนUาท;จดการก)บเหตJการณ#ท;เกดขxYน โดยม;เมธอดท;จะร)บอ5อบเจกต#
                                                      )
           ประเภท Event ท;เกดขxYนและม;คZาส)งในการจ)ดการก)บเหตJการณ#เพอโตUตอบก)บผVUใชU



222   การจ)ดการก)บเหตJการณ#กราฟmก                                                        ผศ. ธนศา เครอไวศยวรรณ
รปท 7.2 องคประกอบของเหต(การณ




                        รปท 7.3 คลาสประเภท Event ในแพคเก-จ javax.swing.event


7.2 AWTEvent

        คลาส AWTEvent เปyน superclass ของคลาสประเภท Event สZาหร)บเหตJการณ#ทางดUานกราฟmกซxงจะม;อยVL
ท)Yงหมด 14 คลาสคอ ActionEvent, AdjustmentEvent, ComponentEvent, ItemEvent,
InputMethodEvent,        InvocationEvent, TextEvent, FocusEvent, WindowEvent, InputEvent,
ContainerEvent, PaintEvent, KeyEvent         และ MouseEvent ด)งแสดงในรVปท; เนYอหาในบทน;YจะกลLาวถxง
เมธอดของคลาสประเภท AWTEvent ท;สZาค)ญเทLาน)Yน ซxงคลาส AWTEvent และคลาส ObjectEvent ม;เมธอดท;สZาค)ญ
ด)งน;Y


ผศ. ธนศา เครอไวศยวรรณ                                                     การจ)ดการก)บเหตJการณ#กราฟmก   223
• Object getSource()

                         เปyนเมธอดในคลาส ObjectEvent เพอเร;ยกดVอ5อบเจกต#ประเภท Event     Source

               • int geID()

                          เปyนเมธอดในคลาส AWTEvent ท;สLงคLาจZานวนเต5มเพอระบJชนดของเหตJการณ# เมธอดน;Yม;
                          ประโยชน# สZาหร)บเหตJการณ#ของคลาส MouseEvent ซxงม;เหตJการณ#ไดUหลายชนด โดยม;คLา
                          จZานวนเต5มระบJชนดของเหตJการณ# อาทเชLน MOUSE_CLICKED หรอ MOUSE_DRAGGED
                          เปyนตUน

7.2.1 ActionEvent

           อ5อบเจกต#ของคลาส ActionEvent จะถVกสรUางขxนในกรณ;ท;ม;เหตJการณ#เกดขxYนในโปรแกรม GUI อาทเชLน
                                                    Y

      •   เมอม;การคลกเมาส#บนปJšม (อ5อบเจกต#ของคลาส Button)
      •   เมอม;การป‚อนค;ย# Enter ใน TextField
      •   เมอม;การเลอกรายการในเมนVของ MenuItem
      •   เมอม;การกดด)บเบYลคลก (double click) ใน List

           คลาส ActionEvent ม;เมธอดท;เก;ยวขUองด)งน;Y
               • String getActionCommand()

                         เปyนเมธอดท;จะสLงชอคZาส)งท;เกดขxนจาก ActionEvent ท)Yงน;คZาส)งของ ActionEvent จะ
                                                            Y                      Y
                         กZาหนดขxน โดยอ5อบเจกต#ของ Event Source ในกรณ;ท;เปyนอ5อบเจกต#ของคลาส Button หรอ
                                 Y
                         MenuItem ก5จะคอ ขUอความ (label) ท;ปรากฏบนปJšมหรอเมนV นอกจากน;เราสามารถท;จะ
                                                                                               Y
                         กZาหนดชอคZาส)งของอ5อบเจกต#ของคลาส Button หรอ MenuItem ใหUแตกตLางจากขUอความท;
                         ปรากฏไดUโดยใชUเมธอด setActionCommand()

               • int getModifiers()

                         เปyนเมธอดท;จะสLงสถานะของค;ย# Modifier (ค;ย# Alt, Ctrl, Meta และ Shift) ท;เกดจาก
                         อ5อบเจกต#ของคลาส ActionEvent เมธอดน;YจะสLงชนดขUอมVลแบบ int ท;ม;คาคงท;คนมาคอ
                                                                                                L
                         ALT_MASK, CTRL_MASK, META_MASK และ SHIFT_MASK




224       การจ)ดการก)บเหตJการณ#กราฟmก                                                       ผศ. ธนศา เครอไวศยวรรณ
7.2.2 WindowEvent

       อ5อบเจกต#ของคลาส WindowEvent จะถVกสรUางขxนในกรณ;ท;ม;เหตJการณ#เกดขxYนเปyนอ5อบเจกต#ของคลาส
                                                    Y
ประเภท Window โดยม;เหตJการณ#ท;เกดขxนไดUด)งน;Y
                                      Y
   • opened เปyนเหตJการณ#ท;เกดขxYนเมอม;การเปmด Window
   • closed เปyนเหตJการณ#ท;เกดขxYนเมอม;การปmด Window
   • closing เปyนเหตJการณ#ท;เกดขxYนขณะกZาล)งปmด Window
   • iconified เปyนเหตJการณ#เมออ5อบเจกต#ของคลาส Window อยVLในรVปของไอคอน
   • deiconified เปyนเหตJการณ#เมออ5อบเจกต#ของคลาส Window ไมLไดUอยVLในรVปของไอคอน
   • activated เปyนเหตJการณ#ท;เกดขxนเมอ Window กZาล)งทZางานอยVL
                                    Y
   • deactivated เปyนเหตJการณ#ท;เกดขxYนเมอ Window ไมLไดUทZางานอยVL

        คลาส WindowEvent ม;เมธอดท;สZาค)ญคอ

             • Object getWindow()

                        เปyนเมธอดท;สLงอ5อบเจกต#ของคลาสประเภท Window ท;เปyน Event Source คนมา

7.2.3 MouseEvent

          อ5อบเจกต#ของคลาส MouseEvent จะถVกสรUางขxนในกรณ;ท;ม;การใชUงานเมาส#เพอตดตLอก)บผVUใชUโดยม;เหตJการณ#
                                                       Y
ท;เกดขxYนไดUด)งน;Y
     • dragged เปyนเหตJการณ#ท;เกดขxYนเมอม;การเลอนเมาส#แลUวกดปJšมของเมาส#พรUอมก)น
     • moved เปyนเหตJการณ#ท;เกดขxYนเมอม;การเลอนเมาส#
     • clicked เปyนเหตJการณ#ท;เกดขxYนเมอม;การคลกเมาส#
          • entered เปyนเหตJการณ#ท;เกดขxนเมอม;การเลอนเมาส#เขUาไปในขอบเขตของอ5อบเจกต#ของคลาสท;เปyน
                                           Y
             สLวนประกอบกราฟmกใดๆ
          • exited เปyนเหตJการณ#ท;เกดขxนเมอตZาแหนLงของเมาส#อยVLนอกขอบเขตของอ5อบเจกต#ของคลาสท;เปyน
                                         Y
             สLวนประกอบกราฟmกใดๆ
     • pressed เปyนเหตJการณ#ท;เกดขxนเมอม;การกดปJšมบนเมาส#
                                     Y
     • released เปyนเหตJการณ#ท;เกดขxนเมอม;การปลLอยปJšมท;กดบนเมาส#
                                       Y



ผศ. ธนศา เครอไวศยวรรณ                                                          การจ)ดการก)บเหตJการณ#กราฟmก   225
คลาส     MouseEvent           ม;เมธอดท;สZาค)ญคอ
           • int getX()
                     เปyนเมธอดท;จะสLงตZาแหนLงพก)ดของเมาส#บนแกน x ท;ม;ชนดขUอมVลเปyน int คนมา
           • int getY()
                     เปyนเมธอดท;จะสLงตZาแหนLงพก)ดของเมาส#บนแกน y ท;ม;ชนดขUอมVลเปyน int คนมา
           • Point getPoint()
                     เปyนเมธอดท;จะสLงตZาแหนLงพก)ด (x,y) ของเมาส#คนมา โดยม;ชนดขUอมVลเปyนอ5อบเจกต#ของคลาส
                     Point

           • int getClickCount()
                     เปyนเมธอดท;จะสLงจZานวนคร)งของการคลกเมาส#คนมา
                                               Y


7.2.4 ItemEvent

      อ5อบเจกต#ของคลาส ItemEvent จะถVกสรUางขxนในกรณ;ท;ม;เหตJการณ#เกดขxYนในโปรแกรม GUI ด)งน;Y
                                             Y
          • เมอม;การเลอกหรอยกเลกรายการใน List หรอ Checkbox
          • เมอม;การคลกเมาส#ในรายการใน Choice

      คลาส ItemEvent ม;เมธอดท;สZาค)ญด)งน;Y
           • ItemSelectable getItemSelectable()
                     เปyนเมธอดท;จะสLงอ5อบเจกต#ของคลาสประเภท ItemSelectable ท;เปyน Event Source คนมา
           • Object getItem()
                     เปyนเมธอดท;จะสLงอ5อบเจกต#ของรายการท;ถVกเลอกคนมา
           • int getStateChange()
                     เปyนเมธอดท;จะสLงคLาคงท;ชนด int ท;ม;คLาเปyน SELECTED หรอ DESELECTED เพอระบJ
                     สถานการณ#เลอกของรายการคนมา




226   การจ)ดการก)บเหตJการณ#กราฟmก                                                       ผศ. ธนศา เครอไวศยวรรณ
7.2.5 Event อนๆ

         แพคเก5จ java.awt.event ย)งม;คลาสท;เปyนเหตJการณ#ทางดUานกราฟmกอนๆ ท;สZาค)ญอาทเชLน

    • KeyEvent      เปyนคลาสท;ม;การสรUางอ5อบเจกต#เมอม;เหตJการณ#การกดค;ย#บอร#ด
         •   FocusEvent เปyนคลาสท;ม;การสรUางอ5อบเจกต#เมอผVUใชUเลอนอJปกรณ#อนพJตมาช;Yยงอ5อบเจกต#ของ
                                                                                       )
             สLวนประกอบกราฟmกใดๆ
         •   ComponentEvent เปyนคลาสท;ม;การสรUางอ5อบเจกต#เมอม;เหตJการณ#ซxงอ5อบเจกต#ของสLวนประกอบกราฟmก

             ม;การเปล;ยนแปลงเชLน เคลอนท;หรอปร)บขนาด
         •   ContainerEvent เปyนคลาสท;ม;การสรUางอ5อบเจกต#เมอม;เหตJการณ#ในการใสLหรอยกเลกอ5อบเจกต#ของ

             สLวนประกอบกราฟmก ลงในอ5อบเจกต#ของคลาสประเภท Container
         •   AdjustmentEvent เปyนคลาสท;ม;การสรUางอ5อบเจกต#เมอม;เหตJการณ#ในการปร)บตZาแหนLงช;Yของอ5อบเจกต#

             ของคลาส ScrollBar หรอ ScrollPane
         •   TextEvent เปyนคลาสท;ม;การสรUางอ5อบเจกต#เมอม;เหตJการณ#ในการเปล;ยนแปลงขUอความในอ5อบเจกต#ของ

             คลาส TextArea

7.3 อ,นเตอร.เฟสประเภท Listener

         ภาษาจาวาจะจ)ดการก)บเหตJการณ# โดยการสรUางอ5อบเจกต#ท;สามารถร)บฟwงเหตJการณ#จากคลาสท; implements
อนเตอร#เฟสประเภท Listener ท;สอดคลUองก)นซxงอ5อบเจกต#น;YจะทZาหนUาท;เปyน Event Handler อาทเชLน อ5อบเจกต#ท;
จะจ)ดการก)บเหตJการณ#ประเภท ActionEvent จะตUอง implements อนเตอร#เฟส ActionListener โดยตUองเข;ยน
บล5อกคZาส)งในเมธอด actionPerformed() อนเตอร#เฟสประเภท Listener ม;ท)Yงหมด 13 ชนด ซxงสอดคลUองก)บ
คลาสประเภท Event ด)งน;Y
    • ActionListener เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส ActionEvent
    • AdjustmentListener    เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส AdjustmentEvent
    •   ComponentListener เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส ComponentEvent

    •   ContainerListener เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส ContainerEvent

    •   FocusListener เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส FocusEvent

    •   InputMethodListener เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส InputMethodEvent




ผศ. ธนศา เครอไวศยวรรณ                                                         การจ)ดการก)บเหตJการณ#กราฟmก   227
• ItemListener   เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส ItemEvent
      •   KeyListener เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส KeyEvent

      •   MouseListener เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส MouseEvent

      •   MouseMotionListener เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส MouseEvent

      •   TextListener เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส TextEvent

      •   WindowListener เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส WindowEvent

           • AWTEventListener เปyนอนเตอร#เฟสสZาหร)บใหUเราสามารถท;จะไปพ)ฒนาคลาสประเภท

             EventListener ไดU


        อ5อบเจกต#ใดๆ ท;ตUองการจ)ดการก)บเหตJการณ#จะตUองลงทะเบ;ยน (register) ร)บฟwงเหตJการณ#นนดUวยโดยตUองใชU
                                                                                            )Y
เมธอดท;สอดคลUองก)นด)งแสดงในตารางท; 7.1 สLวนอนเตอร#เฟสประเภท Listener แตLละชนดจะม;เมธอดท;ตUองเข;ยน
บล5อกคZาส)งตLางๆ ด)งแสดงในตารางท; 7.2


                                              ตารางท 7.1 เมธอดท;ใชUร)บฟwงเหตJการณ#
                                        อ,นเตอร.เฟส               เมธอดทใชรบฟOงเหต%การณ.
                           ActionListener                     addActionListener()
                           ItemListener                       addItemListener()
                           KeyListener                        addKeyListener()
                           InputMethodListener                addInputMethodListener()
                           MouseListener                      addMouseListener()
                           MouseMotionListener                addMouseMotionListener()
                           TextListener                       addTextListener()
                           FocusListener                      addFocusListener()
                           AdjustmentListener                 addAdjustmentListener()
                           ComponentListener                  addComponentListener()
                           ContainerListener                  addContainerListener()
                           WindowListener                     addWindowListener()




228       การจ)ดการก)บเหตJการณ#กราฟmก                                                      ผศ. ธนศา เครอไวศยวรรณ
ตารางท7.2 เมธอดท;ตUอง implements ส%าหร&บอ6นเตอร8เฟสประเภท Event
                          อ,นเตอร.เฟส                      เมธอดทตอง implements
                  ActionListener                actionPerformed(ActionEvent)
                  ItemListener                  itemStateChanged(ItemEvent)
                                                mouseDragged(MouseEvent)
                  MouseMotionListener
                                                mouseMoved(MouseEvent)
                                                mouseClicked(MouseEvent)
                                                mouseEntered(MouseEvent)
                  MouseListener                 mouseExited(MouseEvent)
                                                mousePressed(MouseEvent)
                                                mouseReleased(MouseEvent)
                                                keyPressed(KeyEvent)
                  KeyListener                   keyReleased(KeyEvent)
                                                keyTyped(KeyEvent)
                                                caretPositionChanged(InputMethodEvent)
                  InputMethodListener
                                                inputMethodTextChanged(InputMethodEvent)
                                                focusGained(FocusEvent)
                  FocusListener
                                                focusLost(FocusEvent)
                  AdjustmentListener            adjustmentValueChanged(AdjustmentEvent)
                                                componentMoved(ComponentEvent)
                                                componentHidden(ComponentEvent)
                  ComponentListener
                                                componentResized(ComponentEvent)
                                                componentShown(ComponentEvent)
                                                windowOpened(WindowEvent)
                                                windowClosed(WindowEvent)
                                                windowClosing(WindowEvent)
                  WindowListener                windowIconified(WindowEvent)
                                                windowDeiconified(WindowEvent)
                                                windowActivated(WindowEvent)
                                                windowDeactivated(WindowEvent)
                                                componentAdded(ContainerEvent)
                  ContainerListener
                                                componentRemoved(ContainerEvent)
                  TextListener                  textValueChanged(TextEvent)




ผศ. ธนศา เครอไวศยวรรณ                                                         การจ)ดการก)บเหตJการณ#กราฟmก   229
7.4 การจดการกบเหต%การณ.

           ภาษาจาวาจะม;วธ;การจ)ดการก)บเหตJการณ#ท;เร;ยกวLา Delegation Model โดยจะม;หล)กการด)งน;Y
           •   อ5อบเจกต#ของสLวนประกอบกราฟmกใดๆ สามารถเปyนอ5อบเจกต#ประเภท Event Source ไดU อาทเชLน
               อ5อบเจกต#ของคลาส Button สามารถเปyน Event Source ของ ActionEvent ไดU
           •   คลาสใดๆ สามารถร)บฟwงเหตJการณ#ใดๆ ก5ไดU ถUาคลาสน)น implements อนเตอร#เฟสประเภท Listener ท;
                                                                Y
               สอดคลUองก)นอาทเชLน คลาสท;ตUองการร)บฟwงเหตJการณ# ActionEvent จะตUอง implements อนเตอร#เฟส
               ท;ชอ ActionListener
           •   อ5อบเจกต#ประเภท Event ท;เกดจาก Event Source จะถVกสLงไปย)งอ5อบเจกต#ของคลาสท;สามารถร)บฟwง
               เหตJการณ#ประเภทน)Yน

           จากหล)กการขUางตUน โปรแกรมภาษาจาวาจะม;วธ;การเข;ยนคZาส)งเพอจ)ดการก)บเหตJการณ#ตLางๆ ด)งน;Y
           Event Source ใดตUองการท;จะจ)ดการก)บเหตJการณ#ใดตUองลงทะเบ;ยนเพอร)บฟwงเหตJการณ#โดยม;รปแบบด)งน;Y
                                                                                              V
                    eventSource.addXxxListener(listener)

           โดยท;
      • eventSource         เปyนชอของอ5อบเจกต#ท;เปyน Event Source
           • addXxxListener เปyนเมธอดท;ใชUในการลงทะเบ;ยนร)บฟwงเหตJการณ#โดยจะตUองเลอกใชUเมธอดท;
             สอดคลUองก)นในการร)บฟwงเหตJการณ#แตLละชนด ด)งแสดงในตารางท; 7.2 เชLน ใชUเมธอด
             addActionListener() เพอร)บฟwง ActionEvent

           • listener เปyนอ5อบเจกต#ของคลาส Xxxlistener ซxงสามารถร)บฟwงเหตJการณ#ท;ตUองการจ)ดการไดU และ
             ทZาหนUาท;เปyน Event Handler
      •   XxxListener เปyนคลาสท; implements อนเตอร#เฟสประเภท Listener ท;สอดคลUองก)น


           การเข;ยนโปรแกรมเพอจ)ดการก)บเหตJการณ#สามารถท;เข;ยนคลาสท;เปyน Event Handler ไดUหลายรVปแบบด)งน;Y
      •   กZาหนดคลาสภายนอกคลาสท;ใชUในการจ)ดการเหตJการณ#
      •   กZาหนดคลาสท;เปyนคลาสภายในอยVLในคลาสท;ใชUในการจ)ดการเหตJการณ#
            • กZาหนดใหUคลาสท;ใชUในการจ)ดการเหตJการณ# implements อนเตอร#เฟสประเภท Listener ท;สอดคลUอง
              ก)น และสรUางอ5อบเจกต#ของคลาสด)งกลLาวภายในคลาสเอง
      •   กZาหนดคลาสภายในเมธอด (คลาสประเภท anonymous)


230       การจ)ดการก)บเหตJการณ#กราฟmก                                                       ผศ. ธนศา เครอไวศยวรรณ
7.4.1 ก)รสร>)งอdอบเจกตeของคล)สภ)ยนอก

        โปรแกรมท; 7.1 แสดงต)วอยLางการจ)ดการก)บเหตJการณ#ท;เกดจากการกดปJšม โดยกZาหนดคลาส
ActionHandler ใหUเปyนคลาสประเภท Event Handler ซxงคลาสน;จะอยVLภายนอกคลาส EventDemo1 ซxงเปyน
                                                                Y
คลาสท;ใชUในการจ)ดการก)บเหตJการณ#การกดปJšม คลาส EventDemo1 จะม;อ5อบเจกต#ของคลาส JButton ท;ชอ bn1
อ5อบเจกต# bn1 ไดUลงทะเบ;ยนร)บฟwงเหตJการณ# ActionEvent โดยใชUคZาส)ง
                 bn1.addActionListener(new ActionHandler())


        โดยท;คZาส)ง new ActionHandler() เปyนการสรUางอ5อบเจกต#ของคลาส ActionHandler ท;จะทZาหนUาท;
เปyน Event Handler ด)งน)นคลาส ActionHandler จะตUอง implements อนเตอร#เฟส ActionListener โดย
                           Y
ม;เมธอดเด;ยวท;จะตUองเข;ยนบล5อกคZาส)งคอ
                 public void actionPerformed(ActionEvent ev)

        ซxงผลล)พธ#ท;ไดUจากการร)นโปรแกรมท; 7.1 จะไดUด)งแสดงในรVปท; 7.4

โปรแกรมท 7.1 การจ)ดการก)บเหตJการณ#ท;เกดจากการกดปJšม
  import java.awt.FlowLayout;
  import javax.swing.*;

  public class EventDemo1 {
      public void init() {
          JFrame fr = new JFrame("Outer Class Event Demo");
          fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          JButton bn1 = new JButton("Exit");
          fr.setLayout(new FlowLayout());
          bn1.addActionListener(new ActionHandler());
          fr.add(bn1);
          fr.setSize(200, 200);
          fr.setVisible(true);
      }
      public static void main(String[] args) {
          EventDemo1 obj = new EventDemo1();
          obj.init();
      }
  }

  ------------------------------------------------------------
  public class ActionHandler implements ActionListener {
     public void actionPerformed(ActionEvent ev) {
        System.exit(0);
     }
  }




ผศ. ธนศา เครอไวศยวรรณ                                                       การจ)ดการก)บเหตJการณ#กราฟmก   231
รปท 7.4 ผลลพธทได*จากการรนโปรแกรมท 7.1



7.5 ก)รสร>)งอdอบเจกตeของคล)สภ)ยใน

         โปรแกรมท; 7.2 แสดงต)วอยLางการจ)ดการก)บเหตJการณ#ท;เกดขxนจากการเลอนเมาส# โดยกZาหนดคลาสประเภท
                                                                 Y
Event Handler ใหUอยVLภายในคลาสท;ตUองการจ)ดการก)บเหตJการณ# จากต)วอยLางน;คลาส MouseHandler ซxงเปyนคลาส
                                                                        Y
ท;จะร)บฟwงเหตJการณ#ชนด MouseMotionListener โดยเปyนคลาสภายในท;อยVLในคลาส EventDemo2 ท;ม;
อ5อบเจกต#ของคลาส JFrame ท;ชอ fr ซxงการลงทะเบ;ยนร)บฟwงเหตJการณ# MouseEvent โดยใชUคZาส)ง

                fr.addMouseMotionListener(new MouseHandler())



       โดยท;คZาส)ง new MouseHandler() เปyนการสรUางอ5อบเจกต#ของคลาส MouseHandler ท;จะทZาหนUาท;เปyน
Event Handler โปรแกรมน;จะไดUผลล)พธ#ด)งแสดงในรVปท; 7.5
                            Y




232   การจ)ดการก)บเหตJการณ#กราฟmก                                                   ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท( 7.2 การจ)ดการก)บเหตการณท%เกดขนจากการเลอนเมาส

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;

    public class EventDemo2 {

          private JFrame fr;
          private JTextField tf;

          public void init() {
              fr = new JFrame("Same Class Event Demo");
              fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              tf = new JTextField(15);
              fr.setLayout(new FlowLayout());
              fr.add(tf);
              tf.setFont(new Font("TimesRoman", Font.BOLD, 16));
              fr.addMouseMotionListener(new MouseHandler());
              fr.setSize(200, 200);
              fr.setVisible(true);
          }

          public class MouseHandler implements MouseMotionListener {

                public void mouseDragged(MouseEvent ev) {
                    tf.setText("X=" + ev.getX() + " Y=" + ev.getY());
                }

                public void mouseMoved(MouseEvent ev) {
                }
          }

          public static void main(String[] args) {
              EventDemo2 obj = new EventDemo2();
              obj.init();

          }
    }




                             รปท 7.5 ผลลพธทได*จากการรนโปรแกรมท 7.2



ผศ. ธนศา เครอไวศยวรรณ                                                การจ)ดการก)บเหตJการณ#กราฟmก   233
7.5.1 ก)รสร>)งอdอบเจกตeภ)ยในคล)สเด.ยวก+น

        เราสามารถท;จะกZาหนดใหUคลาสท;ตUองการจะจ)ดการก)บเหตJการณ# เปyนคลาสประเภท Event Handler ไดUเอง
โดยการกZาหนดใหUคลาสน)Yน implements อนเตอร#เฟสประเภท Listener ท;สอดคลUองก)น โปรแกรมท; 7.3 แสดง
ต)วอยLางของคลาส EventDemo3 ซxงจะม;อ5อบเจกต#ของคลาส JFrame ท;ชอ fr ซxงจะร)บฟwงเหตJการณ#ประเภท
WindowEvent คลาสน;Yจะเปyนคลาสประเภท Event Handler ดUวย โดยการ implements อนเตอร#เฟส

WindowListener โปรแกรมน;YไดUสรUางอ5อบเจกต#ของคลาส EventDemo ขxนมา และใชUคZาส)ง
                                                                       Y
                fr.addWindowListener(this)



          เพอลงทะเบ;ยนร)บฟwงเหตJการณ#และใหUอ5อบเจกต#ของคลาสน;Y (this) ซxงเปyนอ5อบเจกต#ประเภท Event
Handler ในการจ)ดการก)บเหตJการณ# โปรแกรมน;จะทZาใหUสามารถปmดเฟรมไดUโดยการคลกเมาส#ท;เครองหมายกากบาท
                                               Y
ตรง title bar ท)Yงน;เY นองจากคลาส EventDemo3 ม;คZาส)งในเมธอด windowClosing() เพอออกจากโปรแกรม
(คZาส)ง System.exit(0)) โปรแกรมน;จะไดUผลล)พธ#ด)งแสดงในรVปท; 7.6
                                         Y

โปรแกรมท 7.3 คลาสท;ม;การร)บฟwงเหตJการณ#ประเภท WindowEvent
  import java.awt.event.*;
  import javax.swing.JFrame;

  public class EventDemo3 implements WindowListener{
      public void init() {
          JFrame fr = new JFrame("Same Class Event Demo");
          fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          fr.addWindowListener(this);
          fr.setSize(200, 200);
          fr.setVisible(true);
      }
      public void windowClosing(WindowEvent ev) {
          System.exit(0);
      }
      public void windowOpened(WindowEvent ev) {}
      public void windowClosed(WindowEvent ev) {}
      public void windowIconified(WindowEvent ev) {}
      public void windowDeiconified(WindowEvent ev) {}
      public void windowActivated(WindowEvent ev) {}
      public void windowDeactivated(WindowEvent ev) {}

       public static void main(String[] args) {
           EventDemo3 obj = new EventDemo3();
           obj.init();
       }
  }




234   การจ)ดการก)บเหตJการณ#กราฟmก                                                   ผศ. ธนศา เครอไวศยวรรณ
รปท 7.6 ผลลพธทได*จากการรนโปรแกรมท 7.3

7.5.2 ก)รร+บฟjงเหตlก)รณeหล)ยเหตlก)รณe
          ภาษาจาวาอนJญาตใหUอ5อบเจกต#ของคลาสท;เปyนสLวนกราฟmกแตLละอ5อบเจกต# สามารถท;จะร)บฟwงเหตJการณ#หลาย
ประเภทไดUพรUอมก)นอาทเชLน ถUาอ5อบเจกต# fr เปyนอ5อบเจกต#ของ JFrame เราสามารถท;จะลงทะเบ;ยนร)บฟwงเหตJการณ#
ไดUด)งน;Y
                 fr.addMouseMotionListener(this);
                 fr.addWindowListener(this);


       ซxงเปyนการกZาหนดใหUอ5อบเจกต# fr ร)บฟwงเหตJการณ#ท;เกดจากการเลอนเมาส#และเหตJการณ#ท;เก;ยวขUองก)บเฟรม
พรUอมก)น
       คลาสใดๆ สามารถท;จะ implements อนเตอร#เฟสประเภท Listener ไดUหลายชนดเชLน
                 public class EventDemo4 implements
                           MouseMotionListener, WindowListener {
                      ...
                 }
      เปyนการกZาหนดคลาส EventDemo4 ใหUเปyนคลาสประเภท Event Handler ท; implement อนเตอร#เฟส
MouseMotionListener และ WindowListener ภายในคลาสเด;ยวก)น


       นอกจากน;คลาสประเภท Event Handler ใดๆ สามารถท;ใชUในการสรUางอ5อบเจกต#แลUวจ)ดการก)บอ5อบเจกต#ท;
                 Y
เปyน Event Source ไดUหลายอ5อบเจกต# ท)Yงน;Y argument ท;เปyนอ5อบเจกต#ของคลาสประเภท Event จะม;เมธอดท;ใชUใน
การระบJอ5อบเจกต#ของ Event Source ไดUอาทเชLน (เมธอด getSource())

      โปรแกรมท; 7.4 แสดงต)วอยLางของคลาส EventDemo4 ซxงม;อ5อบเจกต# fr ท;ลงทะเบ;ยนร)บฟwงเหตJการณ#สอง
ชนด และคลาสน;Y implements อนเตอร#เฟสท)Yงสองชนดท;สอดคลUองก)น โปรแกรมน;จะใหUผลล)พธ#ด)งรVปท; 7.7
                                                                        Y




ผศ. ธนศา เครอไวศยวรรณ                                                           การจ)ดการก)บเหตJการณ#กราฟmก   235
โปรแกรมท( 7.4 คลาสท%ลงทะเบ%ยนร)บฟ>งเหตการณสองชนด

  import java.awt.*;
  import java.awt.event.*;
  import javax.swing.*;


  public class EventDemo4 implements MouseMotionListener, WindowListener {

        private JFrame fr;
        private JTextField tf;

        public void init() {
            fr = new JFrame("Multiple Event Demo");
            tf = new JTextField(15);
            fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            fr.setLayout(new FlowLayout());
            fr.add(tf);
            tf.setFont(new Font("TimesRoman", Font.BOLD, 16));
            fr.addMouseMotionListener(this);
            fr.addWindowListener(this);
            fr.setSize(200, 200);
            fr.setVisible(true);
        }

        public void mouseDragged(MouseEvent ev) {
            tf.setText("X=" + ev.getX() + " Y=" + ev.getY());
        }

        public void mouseMoved(MouseEvent ev) { }
        public void windowClosing(WindowEvent ev) {
          System.exit(0);
        }
        public void windowOpened(WindowEvent ev) { }
        public void windowClosed(WindowEvent ev) { }
        public void windowIconified(WindowEvent ev) {   }
        public void windowDeiconified(WindowEvent ev)   { }
        public void windowActivated(WindowEvent ev) {   }
        public void windowDeactivated(WindowEvent ev)   { }

        public static void main(String[] args) {
            EventDemo4 obj = new EventDemo4();
            obj.init();
        }
  }




236   การจ)ดการก)บเหตJการณ#กราฟmก                                  ผศ. ธนศา เครอไวศยวรรณ
รปท 7.7 ผลลพธทได*จากการรนโปรแกรมท 7.4


7.5.3 คล)สประเภท Event Adapter

       คลาสประเภท Event Adapter คอคลาสท;ไดU implements อนเตอร#เฟสประเภท Listener ไวUแลUว โดยไดU
กZาหนดเมธอดตLางๆ ของอนเตอร#เฟสท;ตUองเข;ยนบล5อกคZาส)งไวUแลUว แตLจะเปyนบล5อกคZาส)งท;ไมLม;คZาส)งใดๆ อยVLภายใน
บล5อก คลาสประเภท Event Adapter จะชLวยทZาใหUเข;ยนโปรแกรมท;เปyนคลาสประเภท Event Handler ไดUงLายขxน
                                                                                                Y
โดยลดจZานวนเมธอดท;จะตUองเข;ยนบล5อกคZาส)ง การเข;ยนคลาสประเภท Event Handler น;จะตUองสบทอดมาจากคลาส
                                                                              Y
ประเภท Event Adapter สZาหร)บการร)บฟwงเหตJการณ#ท;สอดคลUองก)นและจะกZาหนดเมธอดแบบ 0verridden
เฉพาะเมธอดท;ตUองการจ)ดการก)บเหตJการณ# คลาสประเภท Event Adapter จะม;อยVL 7 คลาสด)งน;Y

    • MouseAdapter คอคลาสท; implements อนเตอร#เฟสท;ชอ MouseListener
    • MouseMotionAdapter     คอคลาสท; implements อนเตอร#เฟสท;ชอ MouseMotionListener
    •   ComponentAdapter คอคลาสท; implements อนเตอร#เฟสท;ชอ ComponentListener

    •   ContainerAdapter คอคลาสท; implements อนเตอร#เฟสท;ชอ ContainerListener

    •   KeyAdapter คอคลาสท; implements อนเตอร#เฟสท;ชอ KeyListener

    •   WindowAdapter คอคลาสท; implements อนเตอร#เฟสท;ชอ WindowListener

    •   FocusAdapter คอคลาสท; implements อนเตอร#เฟสท;ชอ FocusListener


      โปรแกรมท; 7.5 แสดงต)วอยLางของการกZาหนดคลาสประเภท Event Adapter ท;สบทอดมาจากคลาส
WindowAdapter โปรแกรมน;YจะทZาใหUสามารถปmดเฟรม ซxงผลล)พธ#ท;ไดUจะเปyนเชLนเด;ยวก)บผลล)พธ#ท;ไดUจากการร)น

โปรแกรมท; 7.1




ผศ. ธนศา เครอไวศยวรรณ                                                            การจ)ดการก)บเหตJการณ#กราฟmก   237
โปรแกรมท( 7.5 คลาสประเภทท%สบทอดมาจากคลาส WindowAdapter

  import javax.swing.JFrame;

  public class EventDemo5 {

       public void init() {
           JFrame fr = new JFrame("Adapter Class Event Demo");
           fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           fr.addWindowListener(new WindowHandler());
           fr.setSize(200, 200);
           fr.setVisible(true);
       }

       public static void main(String[] args) {
           EventDemo5 obj = new EventDemo5();
           obj.init();
       }
  }

  ----------------------------------------------------------------
  import java.awt.event.*;

  public class WindowHandler extends WindowAdapter {
      public void windowClosing(WindowEvent ev) {
          System.exit(0);
      }
  }




7.5.4 ก)รสร>)งคล)สแบบ anonymous

       เราสามารถสรUางคลาสประเภท Event Handler ภายในเมธอดท;ใชUในการลงทะเบ;ยนร)บฟwงเหตJการณ# (เมธอด
ประเภท addXXxListener()) คลาสประเภทน;เY ร;ยกวLาคลาสแบบ anonymous ซxงม)กจะใชUคVLก)บคลาสประเภท
Event Adapter โดยนยมใชUก)บการปmดเฟรมอาทเชLน คZาส)ง

                fr.addWindowListener(new WindowAdapter() {
                    public void windowClosing(WindowEvent ev) {
                       System.exit(0);
                    }
                });

      เปyนการสรUางคลาสแบบ anonymous ภายในเมธอด addWindowListener() เพอปmดเฟรมของอ5อบเจกต#
fr โปรแกรมท; 7.6 แสดงต)วอยLางของคลาสในรVปแบบน;Y ซxงผลล)พธ#ท;ไดUจะเปyนเชLนเด;ยวก)บผลล)พธ#ท;ไดUจากการร)น

โปรแกรมท; 7.1



238   การจ)ดการก)บเหตJการณ#กราฟmก                                                       ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท( 7.6 คลาสแบบ anonymous

   import java.awt.event.*;
   import javax.swing.JFrame;

   public class EventDemo6 {
       public void init() {
           JFrame fr = new JFrame("Anonymous Class Event Demo");
           fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           fr.addWindowListener(new WindowAdapter() {
               public void windowClosing(WindowEvent ev) {
                   System.exit(0);
               }
           });
           fr.setSize(200, 200);
           fr.setVisible(true);
       }
       public static void main(String[] args) {
           EventDemo6 obj = new EventDemo6();
           obj.init();
       }
   }




สร"ปเน-อหาของบท

        •   อ5อบเจกต#ของคลาสประเภท Event ในแพจเก5จ java.awt.event จะถVกสรUางขxน เมอม;เหตJการณ#เกดขxน
                                                                                       Y                        Y
            ก)บอ5อบเจกต#ของสLวนประกอบกราฟmก เชLน ActionEvent เกดขxYนเมอม;การกด Button หรอ
            WindowEvent เกดขxนเมอม;การปmด Frame
                               Y
        •   การจะจ)ดการก)บ Event ประเภทใดน)น โดยท)วไปจะตUองสรUางอ5อบเจกต#ของคลาสท; implements
                                            Y
            อนเตอร#เฟสท;สอดคลUองก)นก)บ Event น)นดUวย เชLนถUาตUองการจ)ดการก)บ WindowEvent จะตUองสรUาง
                                                Y
            อ5อบเจกต#ของคลาสท; implements อนเตอร#เฟส WindowListener โดยการสรUางอ5อบเจกต#อาจสรUางจาก
            คลาสใหมL คลาสภายใน คลาสเด;ยวก)น หรอคลาสประเภท anonymous ซxงคลาสประเภทน;จะถVกเร;ยกวLา Y
            คลาสประเภท Event Handler
        •   คลาสใดๆ สามารถ implements อนเตอร#เฟสไดUหลายต)ว ทZาใหUสามารถท;จะขxนทะเบ;ยนร)บฟwงเหตJการณ#
                                                                                    Y
            ไดUหลายเหตJการณ#
        •   คลาสประเภท Event Adapter คอคลาสท; implements อนเตอร#เฟสประเภท Listener ไวUแลUว โดยไดU
            กZาหนดเมธอดตLางๆ ของอนเตอร#เฟสท;ตUองเข;ยนบล5อกคZาส)งไวUแลUว แตLจะเปyนบล5อกคZาส)งท;ไมLมคZาส)งใดๆ
                                                                                                      ;
            อยVLภายในบล5อก


ผศ. ธนศา เครอไวศยวรรณ                                                             การจ)ดการก)บเหตJการณ#กราฟmก   239
240   การจ)ดการก)บเหตJการณ#กราฟmก   ผศ. ธนศา เครอไวศยวรรณ
บทท 8 อะเรย.และคอลเล-กชน
        เนYอหาในบทน;YเปyนการแนะนZาการใชUอะเรย#ของขUอมVลชนดพYนฐาน และชนดคลาส อธบายการประกาศและ
สรUางอะเรย#หลายมต แนะนZาเมธอดท;เก;ยวขUองก)บอะเรย# อธบายความหมายของคอลเล5กช)น แนะนZาอนเตอร#เฟสและ
คลาสตLางๆ ท;อยVLใน Collection API และการนZาไปใชUงาน

8.1 อะเรย.

         อะเรย#ในภาษาจาวา คอต)วแปรท;เปyนชนดขUอมVลแบบอUางองท;สามารถใชUเก5บขUอมVลชนดเด;ยวก)นไดUหลายคLา
ต)วแปรอะเรย#จะเปyนต)วแปรท;ม;ชอเด;ยวก)นแตLจะม;จZานวนสมาชกไดUหลายต)ว โดยตZาแหนLงในหนLวยความจZาท;เ ก5บขUอมVล
เหลLาน;จะอยVLตดก)น ต)วอยLางเชLน หากตUองการกZาหนดต)วแปรใหUม;ชนดขUอมVลเปyน int เพอเก5บขUอมVลไดU 5 คLาโดยต)Yงชอ
       Y
ต)วแปรเปyน x1, x2, x3, x4 และ x5 ด)งน;Y
                 int    x1, x2, x3, x4, x5;


      ต)วแปรด)งกลLาวจะถอวLาเปyนต)วแปรคนละต)วก)น โดยม;ชอตLางก)นและไมLมความส)มพ)นธ#ซxงก)นและก)น แตLหาก
                                                                            ;
ประกาศใหUต)วแปร x เปyนต)วแปรอะเรย#ท;ม;จZานวนสมาชก 5 ต)ว โดยใชUคZาส)งด)งน;Y
                 int []x = new int[5];


        จะทZาใหUต)วแปรอะเรย# x เปyนต)วแปรท;ม;ชนดขUอมVลเปyน int ซxงม;สมาชก 5 ต)ว โดยม;หมายเลขสมาชกต)YงแตL 0
ถxง 4 และเปyนชนดขUอมVลแบบอUางอง กลLาวคอคLาของ x จะเก5บตZาแหนLงของหนLวยความจZาเพออUางองถxงตZาแหนLงท;เก5บ
ขUอมVลสมาชกของอะเรย#แตLละต)ว ด)งแสดงในรVปท; 8.1




                               รปท 8.1 การเก-บตาแหน%งอ*างองของตวแปรอะเรย




ผศ. ธนศา เครอไวศยวรรณ                                                                 อะเรย#และคอลเล5กช)น   241
ภาษาจาวาแบLงต)วแปรอะเรย#เปyนสองประเภทคอ
              1.อะเรย#ของขUอมVลชนดพYนฐาน
              2.อะเรย#ของขUอมVลชนดคลาส

       อะเรย#ของขUอมVลชนดพYนฐาน คออะเรย#ท;สามารถใชUเก5บขUอมVลท;ม;ชนดขUอมVลแบบพYนฐานชนดใดชนดหนxงไดU
                                                                                                
หลายคLา เชLนอะเรย#ของขUอมVลชนด int หรออะเรย#ของขUอมVลชนด boolean เปyนตUน

        อะเรย#ของขUอมVลชนดคลาส คออะเรย#ท;สามารถใชUเก5บขUอมVลท;เปyนอ5อบเจกต#ของคลาสใดๆ ไดUหลายอ5อบเจกต#
เชLนอะเรย#ของขUอมVลชนด String เปyนตUน

8.2 อะเรย.ของขอมลชน,ดพนฐาน

        ภาษาจาวาสามารถท;จะสรUางอะเรย# เพอใชUเก5บขUอมVลท;ม;ชนดขUอมVลแบบพYนฐานไดU การสรUางต)วแปรอะเรย# จะม;
ข)YนตอนเชLนเด;ยวก)บการสรUางต)วแปรท;เปyนชนดขUอมVลแบบอUางองท)วไปสองข)Yนตอนคอ

      1.   ข)Yนตอนแรกเปyนการประกาศชอต)วแปร ข)นตอนน;จะเปyนการจองเนYอท;ในหนLวย ความจZาเพอเก5บคLาของ
                                                Y        Y
           ตZาแหนLงอUางองท;เก5บขUอมVลสมาชกในหนLวยความจZา แตLขนตอนน;Yจะย)งไมLม;การจองเนYอท;ในหนLวยความจZา เพอ
                                                               )Y
           ใชUเก5บคLาขUอมVลสมาชกของอะเรย#แตLละต)ว ด)งน)นคLาของต)วแปรในข)นตอนน;จะเปyน null
                                                       Y                  Y      Y
      2.   ข)Yนตอนท;สองเปyนการสรUางต)วแปร เพอบอกจZานวนสมาชกของอะเรย# และจองเนYอท;ในหนLวยความจZาสZาหร)บ
           เก5บคLาขUอมVลสมาชกของอะเรย#แตLละต)ว โดยใชUคZาส)ง new เชLนเด;ยวก)บการสรUางอ5อบเจกต#ของคลาส ข)นตอนน;Y
                                                                                                        Y
           จะทZาใหUคLาของต)วแปรเปล;ยนไปเปyนคLาของตZาแหนLงอUางองท;เก5บขUอมVลสมาชกของอะเรย#

8.2.1 การประกาศชอตวแปรอะเรย.ของขอมลชน,ดพนฐาน

      การประกาศชอของต)วแปรอะเรย#จะม;รVปแบบคลUายก)บการประกาศชอต)วแปรของชนดขUอมVลแบบพYนฐาน แตL
การประกาศต)วแปรอะเรย#จะตUองม;เครองหมาย [] อยVLดานหนUาหรอดUานหล)งชอต)วแปรด)งน;Y
                                                U
                    [modifier] dataType []variableName;
      หรอ           [modifier] dataType variableName[];


           ต)วอยLางเชLน คZาส)ง
                      int x[];
                      private char []ch;
                      public double y[];




242        อะเรย#และคอลเล5กช)น                                                            ผศ. ธนศา เครอไวศยวรรณ
ตLางก5เปyนการประกาศใหUต)วแปร x,     ch   และ y เปyนต)วแปรอะเรย# โดยม;ชนดขUอมVลเปyน int,char และ
double ตามลZาด)บ


       การประกาศชอต)วแปรย)งเปyนการจองเนYอท;ในหนLวยความจZา เพอเก5บคLาของตZาแหนLงอUางองท;เก5บขUอมVลสมาชก
ในหนLวยความจZา ซxงในข)นตอนน;จะเก5บคLาเปyน null ไวUกLอน เนองจากย)งไมLม;การจองเนYอท;ในหนLวยความจZาเพอเก5บ
                       Y     Y
ขUอมVลสมาชกของอะเรย#

      ภาษาจาวาแตกตLางจากภาษาซ;ตรงท;อนJญาตใหUใชUเครองหมาย [] อยVLดานหนUาชอต)วแปรอะเรย#ท;ตUองการ
                                                                   U
ประกาศไดU สLวนขUอแตกตLางของการใชUเครองหมาย [] ดUานหนUาและดUานหล)งจะเกดขxYน ในกรณ;ท;ตUองการประกาศต)ว
แปรหลายๆ ต)ว ต)วอยLางเชLน คZาส)ง
                 int []x,y;
        จะเปyนการประกาศใหUต)วแปร x และ y เปyนต)วแปรอะเรย#ชนดขUอมVล int ท)YงคVLแตLคZาส)ง
                 int x[],y;
         จะเปyนการประกาศใหUต)วแปร x เปyนต)วแปรอะเรย#ท;ม;ชนดขUอมVลเปyน int สLวนต)วแปร y เปyนต)วแปรปกตท;
ไมLใชLต)วแปรอะเรย#โดยม;ชนดขUอมVลเปyน int

8.2.2 การสรางตวแปรอะเรย.ของขอมลชน,ดพนฐาน

       การประกาศชอต)วแปรอะเรย#จะไมLม;การจองเนYอท;ในหนLวยความจZา เพอเก5บขUอมVลสมาชกของอะเรย# เนYอท;ใน
หนLวยความจZาด)งกลLาวจะถVกจองขxYนเมอม;การใชUคZาส)ง new ซxงม;รVปแบบคZาส)งด)งน;Y
               variableName = new dataType[size];



        โดยท; size คอจZานวนสมาชกของอะเรย#ท;ตUองการ

       คZาส)งน;เY ปyนการระบJจZานวนสมาชกของต)วแปรอะเรย#และเปyนการจองเนYอท;ในหนLวย ความจZาสZาหร)บสมาชก
ของอะเรย#แตLละต)ว นอกจากน;Yย)งจะทZาใหUคLาในหนLวยความจZาท;เก5บตZาแหนLงอUางองของต)วแปรน)Yนเปล;ยนคLาจาก null
ไปเปyนตZาแหนLงท;เก5บขUอมVลด)งแสดงในรVปท; 8.2 ต)วอยLางเชLน คZาส)ง
                 x = new int[5];
                 ch = new char[4];
                 y = new double[6];




ผศ. ธนศา เครอไวศยวรรณ                                                                อะเรย#และคอลเล5กช)น   243
เปyนคZาส)งสรUางต)วแปรอะเรย# x, ch และ y ใหUมชนดขUอมVลเปyน int,
                                                   ;                      char   และ double และม;จZานวน
สมาชกของอะเรย#เทLาก)บ 5, 4 และ 6 ตามลZาด)บ




                               รปท 8.2 การเก-บตาแหน%งอ*างองของตวแปรอะเรย

       ในการสรUางต)วแปรอะเรย# dataType ท;อยVLในคZาส)ง new จะตUองเปyนชนดขUอมVลชนดเด;ยวก)นก)บชนดขUอมVลของ
ต)วแปรอะเรย# ด)งน)นคZาส)ง
                  Y
                  int []x;
                  x = new double[4];
       จxงเปyนคZาส)งในการสรUางต)วแปรอะเรย#ท;ไมLถVกตUอง เนองจากต)วแปรอะเรย# x ถVกประกาศใหUม;ชนดขUอมVลเปyน
int แตLคZาส)ง new เปyนการมาสรUางอะเรย#ของขUอมVลชนด double


      เราสามารถท;จะรวมคZาส)งประกาศชอต)วแปรและคZาส)งการสรUางต)วแปรอะเรย# ไวUในคZาส)งเด;ยวก)นไดU โดยม;
รVปแบบคZาส)งด)งน;Y
                      dataType []variableName = new dataType[size];
        หรอ           dataType variableName[] = new dataType[size];


       ต)วอยLางเชLน
                  int []x = new int[5];




244    อะเรย#และคอลเล5กช)น                                                               ผศ. ธนศา เครอไวศยวรรณ
8.2.3 การเรยกใชสมาช,กของอะเรย.

        ต)วแปรอะเรย#ท;สรUางขxYนจะม;สมาชกท;ม;หมายเลขต)YงแตL 0 จนถxง size-1 การอUางองถxงสมาชกของอะเรย#แตLละต)ว
จะม;รVปแบบด)งน;Y
               variableName[index]



        โดยท; index คอต)วเลขระบJหมายเลขท;ของสมาชกของอะเรย# ซxงจะม;คLาไดUต)YงแตLคLา 0 จนถxง size-1

        ต)วอยLางเชLน
                 x[3]
        หมายถxงขUอมVลของสมาชกหมายเลขท; 3 ของต)วแปรอะเรย# x

       ต)วแปรอะเรย#ท;เปyนชนดขUอมVลแบบพYนฐาน จะแตกตLางจากต)วแปรปกตท;เปyนชนดขUอมVลแบบพYนฐาน โดย
ต)วแปรอะเรย#จะกZาหนดคLาเรมตUนใหUก)บสมาชกทJกต)วเสมอ ซxงม;คาเรมตUนเชLนเด;ยวก)บต)วแปรท;เปyนคJณล)กษณะของ
                                                            L
อ5อบเจกต# (ตารางท; 2.5) ขณะท;ต)วแปรปกตจะถVกกZาหนดคLาเรมตUนเฉพาะต)วแปรท;เปyนคJณล)กษณะของอ5อบเจกต# หรอ
คJณล)กษณะของคลาสเทLาน)น   Y

      เราสามารถท;จะเปล;ยนแปลงคLาของสมาชกของอะเรย#ไดU โดยการใชUคZาส)งกZาหนดคLา โดยตUองอUางองถxง
หมายเลขสมาชกของอะเรย# ต)วอยLางเชLน
                 x[0] = 4;
                 x[2] = 5;
        เปyนการกZาหนดคLาใหUก)บสมาชกหมายเลขท; 0 และ 2 ของต)วแปรอะเรย# x ใหUมคLาเปyน 4 และ 5 ตามลZาด)บ
                                                                            ;

      การอUางองถxงชอต)วแปร x โดยไมLระบJหมายเลขสมาชกจะเปyนการเร;ยกดVคLาตZาแหนLงอUางองของต)วแปรอะเรย#
โปรแกรมท; 8.1 แสดงต)วอยLางการประกาศและสรUางต)วแปรอะเรย# พรUอมท)YงกZาหนดคLาตLางๆ โดยผลล)พธ#ท;ไดUเปyนด)ง
แสดงในรVปท; 8.3




ผศ. ธนศา เครอไวศยวรรณ                                                                 อะเรย#และคอลเล5กช)น   245
โปรแกรมท( 8.1 ต)วอยางการใชอะเรย

  public class SimpleArrays {
     public static void main(String args[]) {
        int []x;
        x = new int[4];
        x[0] = 0;
        x[1] = 2;
        x[2] = 4;
        x[3] = 6;
        System.out.println("x = "+x);
        System.out.println("x[0] = "+x[0]);
        System.out.println("x[1] = "+x[1]);
        System.out.println("x[2] = "+x[2]);
        System.out.println("x[3] = "+x[3]);
     }
  }




                               รปท 8.3 ผลลพธทได*จากการรนโปรแกรมท 8.1

8.2.4 การกDาหนดค0าเร,มตนใหกบสมาช,กของอะเรย.

         เราสามารถท;จะประกาศต)วแปรอะเรย# สรUางต)วแปรอะเรย# และกZาหนดคLาใหUก)บสมาชกของอะเรย#ภายในคZาส)ง
เด;ยวก)น โดยม;รVปแบบของคZาส)งด)งน;Y
               dataType []variableName = {value1,value2,..,valueN};


        โดยท; value1,value2,..,valueN เปyนคLาท;ตUองการกZาหนดใหUก)บสมาชกของอะเรย#แตLละต)ว ซxงจะตUอง
เปyนขUอมVลคLาคงท;ท;ม;ชนดขUอมVลท;สอดคลUองก)บชนดขUอมVลของต)วแปรอะเรย#

       ต)วอยLางเชLน
                 int []x = {4,3,5,1,8};




246   อะเรย#และคอลเล5กช)น                                                            ผศ. ธนศา เครอไวศยวรรณ
เปyนคZาส)งสรUางต)วแปรอะเรย# x ซxงม;จZานวนสมาชก 5 ต)ว โดยท; x[0],x[1],     x[2],x[3]      และ x[4] ม;คา
                                                                                                                 L
เรมตUนเปyน 4, 3, 5, 1 และ 8 ตามลZาด)บ

       การกZาหนดคLาเรมตUนของต)วแปรอะเรย# ทZาไดUเฉพาะในคZาส)งประกาศต)วแปรเทLาน)Yน ท)Yงน;YเราไมLสามารถท;จะ
กZาหนดคLาเรมตUนภายหล)งจากคZาส)งประกาศต)วแปรอะเรย#ไดU กลLาวคอคZาส)ง
                  int []x;
                  x[] = {4, 3, 5, 1, 8};          // illegal
         เปyนคZาส)งท;ไมLถVกตUอง

8.2.5 การใชคDาสง for เพออางอ,งสมาช,กของอะเรย.

         โดยท)วไปเราจะใชUคZาส)ง for ในการอUางองถxงสมาชกของอะเรย#ท;ตUองเร;ยกใชUในคZาส)งท;ซYZาก)นอาทเชLน คZาส)ง
                  int x[] = {4,3,5,1,8};


       จะเปyนการประกาศและสรUางต)วแปรอะเรย#ท;ม;สมาชกหUาต)ว หากตUองการพมพ#คLาขUอมVลสมาชกของอะเรย#แตLละ
ต)วโดยใชUคZาส)งด)งน;Y
                  System.out.println(x[0]);
                  System.out.println(x[1]);
                  System.out.println(x[2]);
                  System.out.println(x[3]);
                  System.out.println(x[4]);


         จะเห5นไดUวาเปyนการเร;ยกใชUคZาส)งท;ซYZาก)น ซxงเราสามารถจะแทนท;ดUวยคZาส)ง for เพอใหUโปรแกรมกระช)บขxน
                   L                                                                                            Y
ด)งน;Y
                  for(int i = 0; i < 5; i++) {
                         System.out.println(x[i]);
                  }

          ท)Yงน;YภาษาจาวากZาหนดใหUต)วแปรอะเรย#ทJกต)วม;คJณล)กษณะ length เพอระบJจZานวนสมาชกของอะเรย#แตLละ
ต)ว ซxงต)วอยLางขUางตUนจะทZาใหU x.length ม;คLาเปyน 5 ด)งน)นสLวนของโปรแกรมขUางตUนสามารถเข;ยนใหมLไดUเปyน
                                                          Y
                  for(int i = 0; i < x.length; i++) {
                          System.out.println(x[i]);
                  }


         นอกจากน;เY ราย)งสามารถท;จะเข;ยนคZาส)ง for ในรVปแบบท;เร;ยกวLา enhanced for เพอแจกแจงคLาของต)วแปร



ผศ. ธนศา เครอไวศยวรรณ                                                                       อะเรย#และคอลเล5กช)น   247
อะเรย#โดยอ)ตโนม)ต ต)วอยLางเชLนคZาส)งขUางตUนสามารถเข;ยนใหมLอ;กคร)YงใหUกระช)บยงขxYนไดUเปyน
                  for(int i : x) {
                         System.out.println(x[i]);
                  }

        โปรแกรมท; 8.2 แสดงต)วอยLางการใชUคZาส)ง for ก)บต)วแปรอะเรย#เพอกZาหนดคLาและพมพ#คาของสมาชกของ
                                                                                         L
อะเรย#แตLละต)ว ซxงผลล)พธ#ท;ไดUจะเปyนเชLนเด;ยวก)นก)บผลล)พธ#ท;ไดUจากโปรแกรมท; 8.1


โปรแกรมท( 8.2 ต)วอยางการใชค(าส)ง for

  public class ForWithArrays {
     public static void main(String args[]) {
        int []x;
        x = new int[4];
        for (int i=0; i<x.length; i++) {
           x[i] = i*2;
        }
        System.out.println("x = "+x);
        for (int i=0; i<x.length; i++) {
           System.out.println("x["+i+"] = "+x[i]);
        }
     }
  }




8.2.6 ขอผ,ดพลาดประเภท          ArrayIndexOutOfBoundsException


      การอUางองถxงหมายเลขสมาชกของอะเรย#ท;ไมLถVกตUอง จะทZาใหUเกดขUอผดพลาดในตอนร)นโปรแกรมโดย
โปรแกรมจะสLงขUอผดพลาด ArrayIndexOutOfBoundsException ออกมาในขณะร)นโปรแกรม

        ต)วอยLางเชLน คZาส)ง
                  int []x = {4,3,5,1,8};


        เปyนคZาส)งประกาศและสรUางต)วแปรอะเรย#ท;ม;จZานวนสมาชกต)YงแตLหมายเลข 0 ถxง 4 การอUางองถxงสมาชกต)วอน
เชLน x[5]จะทZาใหUเกดขUอผดพลาดในตอนร)นโปรแกรม
        โปรแกรมท; 8.3 แสดงต)วอยLางโปรแกรมท;ม;การอUางองสมาชกของต)วแปรอะเรย#ท;ไมLถVกตUอง ซxงผลล)พธ#ท;ไดU
เปyนด)งแสดงในรVปท; 8.4


248    อะเรย#และคอลเล5กช)น                                                                  ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท( 8.3 ต)วอยางโปรแกรมท%จะสงขอผดพลาดออกมา

  public class IncorrectArrays {
     public static void main(String args[]) {
        int []x = {4,3,5,1,8};
        System.out.println(x[5]);
     }
  }




                                 รปท 8.4 ผลลพธทได*จากการรนโปรแกรมท 8.3

8.3 อะเรย.ของขอมลชน,ดคลาส

       ต)วแปรอะเรย#ของขUอมVลชนดคลาสคอ ต)วแปรท;ใชUเก5บกลJLมของขUอมVลสมาชกท;เปyน อ5อบเจกต#ของคลาสใด
คลาสหนxง ข)YนตอนการสรUางต)วแปรอะเรย#ของขUอมVลชนดคลาสจะม;ขนตอนคลUายก)บข)YนตอนการสรUางต)วแปรอะเรย#ของ
                                                           )Y
ขUอมVลชนดพYนฐาน โดยม;ข)YนตอนตLางๆ ด)งน;Y

    1.   ข)Yนตอนแรกเปyนการประกาศต)วแปรอะเรย#ซxงจะจองเนYอท;ในหนLวยความจZา เพอเก5บคLาของตZาแหนLงอUางองของ
         ตZาแหนLงในหนLวยความจZาของสมาชกของอะเรย#แตLละต)ว
    2.   ข)Yนตอนท;สองเปyนการใชUคZาส)ง new เพอสรUางและจองเนYอท;ในหนLวยความจZาเพอเก5บคLาของตZาแหนLงอUางองของ
         สมาชกของอะเรย#ซxงจะช;ไปย)งตZาแหนLงท;เก5บขUอมVลจรงๆ
                                Y
    3.   ข)YนตอนสJดทUายเปyนการสรUางอ5อบเจกต#ของคลาสใหUก)บสมาชกแตLละต)วของอะเรย#โดยใชUคZาส)ง new ซxงจะ
         เปyนการจองเนYอท;ในหนLวยความจZาเพอเก5บขUอมVลจรงๆ ของอ5อบเจกต#


         ต)วอยLางเชLน ถUาคลาส Student ม;นยามด)งน;Y



ผศ. ธนศา เครอไวศยวรรณ                                                                  อะเรย#และคอลเล5กช)น   249
public class Student {
                         private String name;
                         public Student() {
                                name = “NoName”;
                         }
                         public Student(String n) {
                                name = n;
                         }
                         public String getName() {
                                return name;
                         }
                    }


         เราสามารถท;จะประกาศต)วแปรอะเรย# s ใหUม;ชนดขUอมVลเปyนคลาส Student ตามข)นตอนแรก โดยใชUคZาส)ง
                                                                                Y
ด)งน;Y
                    Student     []s;


        ข)นตอนท;สองเปyนการกZาหนดขนาดและสรUางต)วแปรอะเรย# ซxงหากตUองการใหUม;จZานวนสมาชก 3 ต)ว จะทZาไดU
          Y
โดยใชUคZาส)งด)งน;Y
                    s = new Student[3];


         ข)นตอนท;สามจะเปyนการอUางองสมาชกของอะเรย#แตLละต)ว หรอสรUางอ5อบเจกต#ของคลาส Student โดยใชUคZา
           Y
ส)ง new เพอเปyนการเร;ยกใชU constructor เหมอนก)บการสรUางอ5อบเจกต#ท)วไปด)งน;Y
                    s[0] = new Student(“Thana”);
                    s[1] = new Student(“Somchai”);
                    s[2] = new Student(“Somsak”);


       อนxงเราสามารถท;จะใชUคZาส)ง for ในกรณ;ท;ตUองการจะสรUางอ5อบเจกต#ของสมาชกแตLละต)ว โดยเร;ยกใชU
          
constructor แบบ default ไดUด)งน;Y

                    for(int i=0, i<s.length; i++) {
                            s[i] = new Student();
                    }


           นอกจากน;เY ราย)งสามารถท;จะรวมคZาส)งท;ใชUในการประกาศ และสรUางต)วแปรอะเรย#ของขUอมVลชนดคลาส และคZา
ส)งท;ใชUในการสรUางอ5อบเจกต#ใหUก)บสมาชกของอะเรย#แตLละต)ว ด)งต)วอยLางตLอไปน;Y
                    Student []s = {new Student(“Thana”);
                                   new Student(“Somchai”);
                                   new Student(“Somsak”)};




250      อะเรย#และคอลเล5กช)น                                                            ผศ. ธนศา เครอไวศยวรรณ
8.3.1 การเก-บค0าของตวแปรอะเรย.ของขอมลชน,ดคลาส

          ต)วแปรของขUอมVลชนดคลาสโดยท)วไปจะเปyนต)วแปรแบบอUางอง อาทเชLน คZาส)ง
                 Student s1 = new Student(“Somsri”);


       จะเปyนการสรUางต)วแปรแบบอUางอง s1 ซxงคLาท; s1 เก5บในหนLวยความจZาจะเปyนตZาแหนLงท;อUางองไปย)งเนYอท;ใน
หนLวยความจZาท;เก5บขUอมVลของอ5อบเจกต#ของคลาส Student

         กรณ;ของต)วแปรอะเรย#ของขUอมVลชนดคลาส ขUอมVลสมาชกของอะเรย#แตLละต)วก5จะเก5บตZาแหนLงอUางองไปย)ง
เนYอท;ในหนLวยความจZาท;เก5บขUอมVลของอ5อบเจกต#ของคลาส Student แตLละอ5อบเจกต#

          รVปท; 8.5 แสดงต)วอยLางการเก5บคLาในหนLวยความจZาของต)วแปร s1 และต)วแปรอะเรย# s ท;สรUางขxYนจากคZาส)ง
ขUางตUน




                              รปท 8.5 ตวอย%างการเก-บค%าของตวแปรในหน%วยความจา


       โปรแกรมท; 8.4 แสดงต)วอยLางโปรแกรมท;ม;การสรUางต)วแปรอะเรย#ชนดขUอมVลคลาส Student และม;การเร;ยก
ใชUเมธอด getName() ของอ5อบเจกต#แตLละต)ว ซxงผลล)พธ#ท;ไดUเปyนด)งแสดงในรVปท; 8.6




ผศ. ธนศา เครอไวศยวรรณ                                                                   อะเรย#และคอลเล5กช)น   251
โปรแกรมท( 8.4 ต)วอยางอะเรยของขอม1ลชนดคลาส

      public class Student {
            private String name;
            public Student(String n) {
               name = n;
            }
            public String getName() {
               return name;
            }
      }

      -----------------------------------------------------------
      public class TestClassArrays {
          public static void main(String args[]) {
               Student []s = {new Student(“Thana”),
                               new Student(“Somchai”),
                               new Student(“Somsak”)};
               for(int i=0; i<s.length; i++) {
                     System.out.print(s[i].getName()+" ");
               }
          }
      }




                               รปท 8.6 ผลลพธทได*จากการรนโปรแกรมท8.4

8.4 อะเรย.หลายม,ต,

       ภาษาจาวากZาหนดใหUม;ต)วแปรอะเรย#ท;เปyนหลายมตอาทเชLน การกZาหนดต)วแปรท;ม;ล)กษณะเปyนเมตรกซ#
(matrix) หรอตารางจะตUองใชUต)วแปรอะเรย#ท;เปyนสองมต การประกาศ ต)วแปรอะเรย#ท;ม;ขนาดมากกวLาหนxงมตทZาไดU
โดยการเพมเครองหมาย [ ] ในแตLละมต ด)งน)YนรVปแบบการประกาศต)วแปรอะเรย#สองมตม;ด)งน;Y
                     [modifier] dataType [][]variableName;




252   อะเรย#และคอลเล5กช)น                                                           ผศ. ธนศา เครอไวศยวรรณ
หรอ             [modifier] dataType variableName[][];


ต)วอยLางเชLน
                  int [][]x;


        เปyนการประกาศต)วแปรอะเรย#สองมต x ซxงม;ชนดขUอมVลเปyน int

      การสรUางต)วแปรอะเรย#หลายมตจะตUองระบJจZานวนสมาชกของอะเรย#ในแตLละมตโดยใชUคZาส)ง new ด)งน)นรVป
                                                                                              Y
แบบการสรUางต)วแปรอะเรย#สองมตเปyนด)งน;Y

                 variableName = new dataType[row][col];



        โดยท;
               • row คอจZานวนสมาชกในแตLละแถว
               • col คอจZานวนสมาชกในแตLละคอล)มน#

        ต)วอยLางเชLน
                  x = new int[3][4];


        เปyนการสรUางต)วแปรอะเรย#สองมต x ซxงม;ขนาด 3 แถว 4 คอล)มน#

        การเร;ยกใชUสมาชกของอะเรย#สองมตจะตUองระบJตZาแหนLงของแถวและคอล)มน# โดยม;รVปแบบด)งน;Y
                 variableName[row_number][col_number]


        โดยท;
               • row_number คอหมายเลขแถวของสมาชกของอะเรย#สองมต
               • col_number คอหมายเลขคอล)มน#ของสมาชกของอะเรย#สองมต

        ต)วอยLางเชLน
                  x[2][3]


        หมายถxงสมาชกของอะเรย# x ตZาแหนLงแถวท; 2 คอล)มน#ท; 3 เปyนตUน



ผศ. ธนศา เครอไวศยวรรณ                                                           อะเรย#และคอลเล5กช)น   253
8.4.1 การเขยนโปรแกรมเพอจดการกบเมตร,กซ.

        โปรแกรมทางดUานคณตศาสตร#ท;เก;ยวขUองก)บการจ)ดการเมตรกซ# จะตUองใชUต)วแปร อะเรย#ขนาดสองมต
โปรแกรมท; 8.5 เปyนต)วอยLางแสดงการบวกและคVณเมตรกซ#สองเมตรกซ#โดยการบวกเมตรกซ#สองเมตรกซ#น)Yนเมตรกซ#
ท)YงสองจะตUองม;ขนาดเทLาก)น ผลล)พธ#ท;ไดUจะเปyนการรวมสมาชกแตLละต)วของเมตรกซ#เขUาดUวยก)น อาทเชLน

                        a 11      a 12      a 13      a 14       a 15     b 11         b 12       b 13     b 14       b 15 
                       a                                                 b
                        21        a 22      a 23      a 24       a 25     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 
                                                                                                                              


       สLวนการคVณเมตรกซ# A ก)บเมตรกซ# B น)นจZานวนคอล)มน#ของเมตรกซ# A จะตUองม;ขนาดเทLาก)บจZานวนแถวของ
                                             Y
เมตรกซ# B โดยถUาเมตรกซ# C เปyนผลล)พธ#ท;ไดUจากการคVณ เมตรกซ#ด)งน;Y

                                                     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                                              b
                                 21       a 22      a 23       a 24    a 25     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 
                                                                                                                                   

       จะไดUสมาชกของเมตรกซ# C แตLละต)วม;คาด)งน;Y
                                         L



254   อะเรย#และคอลเล5กช)น                                                                                                             ผศ. ธนศา เครอไวศยวรรณ
cij = ai1x b1j + ai2x b2j + ai3x b3j + ai4x b4j + ai5x b5j

       โปรแกรมท; 8.5 จะม;คZาส)ง int[][]a = new int[5][5]; ท;ใชUในการสรUางต)วแปรอะเรย#สองมต โดยม;
คLาของสมาชกของอะเรย#จากการสJLมต)วเลขจZานวนระหวLาง 0 ถxง 9 จากคZาส)ง
                        a[i][j] = (int)(Math.random()*10);


      โปรแกรมน;จะใชUคZาส)ง for ท;ม;โครงสรUางแบบซUอนอยVLหลายท; ท)Yงน;YเพอชLวยในการจ)ดการประมวลผลขUอมVล
               Y
ของสมาชกต)วแปรอะเรย#คลาส Matrices ม;เมธอดด)งน;Y

        • addMatrices(int[][] m1, int[][] m2) ใชUเพอคZานวณหาผลล)พธ#ท;ไดUจากการบวกเมตรกซ# โดย
           ร)บ argument เขUามาเปyนต)วแปรอะเรย#สองมต 2 ต)ว
        • mulMatrices(int[][] m1, int[][] m2) ใชUเพอคZานวณหาผลล)พธ#ท;ไดUจากการคVณเมตรกซ# โดย
           ร)บ argument เขUามาเปyนต)วแปรอะเรย#สองมต 2 ต)ว
        • printMatrix(int[][] m) ใชUเพอแสดงคLาสมาชกแตLละต)วของเมตรกซ#ท;ร)บเขUามาเปyน argument
        ต)วอยLางผลล)พธ#ท;ไดUจากโปรแกรมน;Yเปyนด)งแสดงในรVปท; 8.7


โปรแกรมท( 8.5 ต)วอยางการค(านวณเมตรกซ

   public class CalMatrices {

         public static void main(String args[]) {
             int[][] a = new int[5][5];
             int[][] b = new int[5][5];
             int[][] c = new int[5][5];
             for (int i = 0; i < a.length; i++) {
                 for (int j = 0; j < a[i].length; j++) {
                     a[i][j] = (int) (Math.random() * 10);
                     b[i][j] = (int) (Math.random() * 10);
                 }
             }
             Matrices mt = new Matrices();
             System.out.println("Matrix A:");
             mt.printMatrix(a);
             System.out.println("Matrix B:");
             mt.printMatrix(b);
             c = mt.addMatrices(a, b);
             System.out.println("Matrix A+B:");
             mt.printMatrix(c);
             c = mt.mulMatrices(a, b);
             System.out.println("Matrix A*B:");
             mt.printMatrix(c);
         }
   }



ผศ. ธนศา เครอไวศยวรรณ                                                               อะเรย#และคอลเล5กช)น   255
public class Matrices {
    int [][]m = new int[5][5];
    public int[][] addMatrices(int[][] m1, int[][] m2) {
        for (int i=0; i<m1.length; i++) {
           for (int j=0; j<m1[i].length; j++) {
              m[i][j] = m1[i][j] + m2[i][j];
           }
        }
        return m;
    }
    public int[][] mulMatrices(int[][] m1, int[][] m2) {
        int sum;
        for (int i=0; i<m1.length; i++) {
           for (int j=0; j<m1[i].length; j++) {
              sum = 0;
              for (int k = 0;k < m1[i].length; k++) {
                  sum += m1[i][k] * m2[k][j];
              }
              m[i][j] = sum;
           }
        }
        return m;
    }
    public void printMatrix(int[][] m) {
        for (int i=0; i<m.length; i++) {
           for (int j=0; j<m[i].length; j++) {
              System.out.print(m[i][j]+"t");
           }
           System.out.println();
        }
    }
  }




      อนxงคJณล)กษณะ length เมอนZามาใชUก)บต)วแปรอะเรย#สองมตจะใหUคLาด)งน;Y x.length จะไดUคาเทLาก)บจZานวน
                                                                                        L
แถวของต)วแปรอะเรย# สLวน x[i].length จะไดUคาเทLาก)บจZานวนคอล)มน#ในแถวท; i ของต)วแปรอะเรย#
                                            L




256   อะเรย#และคอลเล5กช)น                                                          ผศ. ธนศา เครอไวศยวรรณ
รปท 8.7 ตวอย%างผลลพธทได*จากการรนโปรแกรมท 8.5


8.4.2 อะเรย.สองม,ต,ทมจDานวนคอลมน.ต0างกน

       ภาษาจาวาอนJญาตใหUม;การสรUางอะเรย#สองมตท;ม;ขนาดของคอล)มน#ในแตLละแถวไมLเทLาก)นไดU โดยจะตUองระบJ
จZานวนแถวโดยใชUคZาส)ง new กLอน แลUวระบJจZานวนคอล)มน#ในแตLละแถว ต)วอยLางเชLนคZาส)ง
                 int [][]x;
                 x    = new   int[3][];
                 x[0] = new   int[4]
                 x[1] = new   int[2];
                 x[2] = new   int[3]


        เปyนการสรUางต)วแปรอะเรย# x ซxงม;สมาชกจZานวน 3 แถว โดยท;แถวท;หนxงม; 4 คอล)มน# แถวท;สองม; 2
คอล)มน# และแถวท;สามม; 3 คอล)มน#


ผศ. ธนศา เครอไวศยวรรณ                                                                อะเรย#และคอลเล5กช)น   257
โปรแกรมท; 8.6 แสดงการสรUางต)วแปรอะเรย#สองมตท;แตLละแถวม;จZานวนคอล)มน#ตLางก)น โปรแกรมน;จะไดU
                                                                                               Y
ผลล)พธ#ด)งแสดงในรVปท; 8.8 และรVปท; 8.9 แสดงขUอมVลท;อยVLในสมาชกแตLละต)วของอะเรย#


โปรแกรมท( 8.6 ต)วอยางการสรางอะเรยสองมตท%แตละแถวม%จ(านวนคอล)มนตางก)น
  public class TwoDimensionArrays {
     public static void main(String args[]) {
        int x[][] = new int[3][];
        x[0] = new int[4];
        x[1] = new int[2];
        x[2] = new int[3];
        for(int i=0; i<x.length; i++) {
           for(int j=0; j<x[i].length; j++) {
              x[i][j] = (i+j)*2;
           }
        }
        for(int i=0; i<x.length; i++) {
           for(int j=0; j<x[i].length; j++) {
              System.out.print(x[i][j]+" ");
           }
           System.out.println();
        }
     }
  }




                              รปท 8.8 ผลลพธทได*จากการรนโปรแกรมท 8.6




              รปท 8.9 แสดงตวอย%างข*อมลทอย%ในอะเรย ซ4งเป5นผลลพธทได*จากการรนโปรแกรมท 8.6



258   อะเรย#และคอลเล5กช)น                                                          ผศ. ธนศา เครอไวศยวรรณ
8.4.3 เมธอดทเกยวของกบอะเรย.

      ภาษาจาวาม;เมธอดหลายเมธอดท;ร)บ argument เปyนอะเรย#ของขUอมVลชนดตLางๆ ต)วอยLางเชLนแพคเก5จ
java.lang ม;คลาสท;ชอ Arrays ซxงม;เมธอดท;เก;ยวขUองก)บอะเรย#ท;สZาค)ญด)งน;Y


        • sort()        เปyนเมธอดท;ใชUในการเร;ยงคLาขUอมVลสมาชกของอะเรย#จากนUอยไปมาก
        •   binarySearch() เปyนเมธอดท;ใชUในการคUนหาคLาขUอมVลท;ตUองการจากชJดขUอมVลท)Yงหมดของสมาชกของ

            อะเรย# ซxงถVกเร;ยงจากนUอยไปมากหรอมากไปนUอยไวUแลUว
        •   fill() เปyนเมธอดท;ใชUในการกZาหนดคLาขUอมVลเด;ยวก)นใหUก)บสมาชกท)Yงหมดของอะเรย#


      เนองจากเมธอดท)Yงสามเมธอดท;กลLาวมาขUางตUนเปyนเมธอดแบบ static ด)งน)นการเร;ยกใชUงานเมธอดเหลLาน;Yจxง
                                                                           Y
สามารถเร;ยกโดยใชUชอคลาส Arrays ไดUเลย ไมLจZาเปyนตUองสรUางอ5อบเจกต#ของคลาส Arrays ขxYนมากLอนการเร;ยกใชU
งาน

       โปรแกรมท; 8.7 แสดงต)วอยLางการเร;ยกใชUเมธอดของคลาส Arrays ท;กลLาวไวUขางตUน โปรแกรมน;เY ร;ยกใชU
                                                                             U
เมธอด sort() โดยสLง argument ท;เปyนต)วแปรอะเรย# d ไปเพอเร;ยงคLาขUอมVลของสมาชกของต)วแปรอะเรย# d
จากนUอยไปมาก เมธอด binarySearch() จะใชUในการคUนหาสมาชกของต)วแปรอะเรย# d ท;ม;คLาเทLาก)บ 1.65 สLวน
เมธอด fill() ใชUในการกZาหนดคLาของสมาชกของต)วแปรอะเรย# d ทJกต)วใหUม;คาเปyน 1.0 โปรแกรมน;จะใหU
                                                                        L                 Y
ผลล)พธ#ด)งแสดงในรVปท; 8.10

        ภาษาจาวาไมLยอมใหUม;การเปล;ยนแปลงขนาดของอะเรย# ด)งน)นการใชUคZาส)ง new เพอประกาศขนาดของต)วแปร
                                                            Y
อะเรย#ใหมL จะทZาใหUคาของขUอมVลเดมหายไป ต)วอยLางเชLนคZาส)ง
                    L
                 int []x = {4,7,9};
                 x = new int[4];


        จะเปyนคZาส)งในการประกาศต)วแปรอะเรย# x และสรUางอะเรย#พรUอมก)บกZาหนดคLาเรมตUนใหUก)บสมาชกท)Yง 3 ต)ว
ของอะเรย# โดยม;คLาขUอมVลเปyน 4, 7 และ 9 ตามลZาด)บ แตLคZาส)งถ)ดมาจะเปyนการสรUางอะเรย# x ขxนมาใหมLโดยไมLสามารถ
                                                                                           Y
นZาคLาของขUอมVลเดมกล)บมาไดU จxงทZาใหUคาขUอมVลสมาชกของอะเรย#ท)Yง 4 ต)วม;คLาเทLาก)บ 0 ท&(งหมด
                                       L




ผศ. ธนศา เครอไวศยวรรณ                                                                อะเรย#และคอลเล5กช)น   259
โปรแกรมท( 8.7 ต)วอยางการเร%ยกใชเมธอดของคลาส Arrays
  import java.util.Arrays;

  public class MethodsArrays {
     public static void main(String args[]) {
        double d[] = {5.3, 3.56, 0.5, 1.65, 7.8};
        Arrays.sort(d);
        for(int i=0; i<d.length; i++) {
           System.out.print(d[i]+" ");
        }
        System.out.println();
        int pos = Arrays.binarySearch(d,1.65);
        System.out.println("arrays["+pos+"] = 1.65");
        Arrays.fill(d,1.0);
        for(int i=0; i<d.length; i++) {
           System.out.print(d[i]+" ");
        }
        System.out.println();
     }
  }




                             รปท 8.10 ผลลพธธทได*จากการรนโปรแกรมท 8.7

      ภาษาจาวาม;คZาส)ง System.arraycopy() ใชUสZาหร)บค)ดลอกคLาขUอมVลของสมาชกของอะเรย#โดยม;โครงสรUาง
รVปแบบคZาส)งด)งน;Y
       System.arraycopy(Object src,int src_pos,Object dst,int dst_pos,int length);


         โปรแกรมท; 8.8 แสดงต)วอยLางการใชUคZาส)ง System.arrayCopy() โดยสLง argument ซxงเปyนต)วแปรอะเรย#
scr ซxงเปyนอะเรย#ตนแบบ เรมจากคLาขUอมVลของสมาชกลZาด)บท; 3 ของอะเรย# src ไปย)งสมาชกลZาด)บท; 0 ของอะเรย#
                   U
dst โดยใหUทZาการค)ดลอกขUอมVลท)YงสYน 4 คLาขUอมVล โดยโปรแกรมน;YจะไดUผลล)พธ#ด)งแสดงในรVปท; 8.11




260   อะเรย#และคอลเล5กช)น                                                            ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท( 8.8 ต)วอยางการใชค(าส)ง   System.arraycopy();


   public class CopyArrays {
      public static void main(String args[]) {
         String []scr = {"Copy","an","array","from",
                  " source"," to"," destination."};
         String []dst = new String[4];
         System.arraycopy(scr,3,dst,0,4);
         for(int i=0; i<dst.length; i++) {
            System.out.print(dst[i]);
         }
         System.out.println();
      }
   }




                              รปท 8.11 ผลลพธทได*จากการรนโปรแกรมท 8.8

8.5 คอลเล-กชน

        ต)วแปรอะเรย#เปyนชนดขUอมVลแบบอUางอง ซxงเมอม;การสรUางอะเรย#โดยใชUคZาส)ง new แลUวจะไมLสามารถ
เปล;ยนแปลงขนาดของจZานวนสมาชกท;เก5บในอะเรย#ไดU ในกรณ;ท;ตUองการจะเก5บกลJLมของขUอมVลท;สามารถเปล;ยนแปลง
ขนาดของจZานวนสมาชกไดU ภาษาจาวาจะใชUคลาสประเภทคอลเล5กช)น (Collection) ซxงเปyนคลาสท;ใชUในการเก5บกลJLม
ของขUอมVลชนดคลาสท;ชอ Object ซxงคลาสทJกๆ คลาสในภาษาจาวาจะสบทอดมาจากคลาสท;ชอ Object น;Y ด)งน)น
                                                                                                     Y
คลาสประเภทคอลเล5กช)นสามารถเก5บอ5อบเจกต#ของคลาสใดๆ ในภาษาจาวาไดUตามหล)กการ Dynamic Binding ของ
                      
การม;ไดUหลายรVปแบบ ท;ไดUกลLาวถxงไปในบทท; 4

         คลาสประเภทคอลเล5กช)นถVกกZาหนดไวUใน Java API ท;ชอ Collection API โดยจะประกอบไปดUวย
อนเตอร#เฟสและคลาสตLางๆ ด)งแสดงในรVปท; 8.12 Collection API ไดUกZาหนดอนเตอร#เฟสตLางๆ ท;ม;เงอนไขในการ
ใสLขUอมVลของสมาชกของคอลเล5กช)นท;แตกตLางก)นด)งน;Y
                              



ผศ. ธนศา เครอไวศยวรรณ                                                             อะเรย#และคอลเล5กช)น   261
• Collection เปyนอนเตอร#เฟสท;กZาหนดเมธอดในการจ)ดการขUอมVลของสมาชก สZาหร)บคลาสประเภท
           คอลเล5กช)นท;จะตUอง implements อนเตอร#เฟสน;Y
                        
       •   Set เปyนอนเตอร#เฟสท;ใชU implements คลาสประเภทคอลเล5กช)นท;ม;สมาชกท;ม;ขอมVลไมLซYZาก)น และไมLม;
                                                                                    U
           ลZาด)บการใสLขUอมVล
       •   List เปyนอนเตอร#เฟสท;ใชU implements คลาสประเภทคอลเล5กช)นท;ม;สมาชกซxงอาจม;ขUอมVลซYZาก)นไดU
                                                                         
           แตLจะม;ลZาด)บของสมาชกของการใสLขUอมVล
       •   Map เปyนอนเตอร#เฟสท;ใชU implements คลาสประเภทคอลเล5กช)นซxงสมาชกจะม;องค#ประกอบสองสLวน

           คอ ขUอมVลและค;ย# (key) ขUอมVลของสมาชกประเภทน;YอาจซYZาก)นไดU แตLค;ยของสมาชกแตLละต)วจะตUองไมLซYZา
                                                                             #
           ก)น

      คลาสใน Collection API ท; implements อนเตอร#เฟสเหลLาน;คอ
                                                            Y              HashSet, ArrayList,

LinkedList, Vector และ HashMap




                             รปท   8.12 อนเตอรเฟสและคลาสต%างๆ       ใน Collection API


8.5.1 อ,นเตอร.เฟส        Collection


       Collection        เปyนชออนเตอร#เฟสท;กZาหนดไวUใน Collection API โดยม;เมธอดท;สZาค)ญด)งน;Y

       • boolean add (Object element)

                     เปyนเมธอดท;ใชUในการใสLสมาชกลงในคอลเล5กช)น โดยสมาชกท;จะใสLตUองเปyนอ5อบเจกต#ของคลาส


262   อะเรย#และคอลเล5กช)น                                                                    ผศ. ธนศา เครอไวศยวรรณ
ใดคลาสหนxง เมธอดน;จะสLงคLากล)บมาเปyนชนดขUอมVลแบบ boolean โดยจะใหUคาเปyน true ถUา
                                           Y                                               L
                        สามารถใสLขUอมVลไดU

         • boolean remove (Object element)

                        เปyนเมธอดท;ใชUในการลบสมาชกออกจากคอลเล5กช)น โดยตUองสLงผLาน argument ท;เปyนอ5อบเจกต#
                        ท;ตUองการลบออก เมธอดน;จะสLงคLากล)บมาเปyนชนดขUอมVลแบบ boolean โดยจะใหUคาเปyน
                                               Y                                                    L
                        true ในกรณ;ท;ลบขUอมVลไดU


         • int size()

                        เปyนเมธอดท;ใชUในการหาจZานวนสมาชกท;ม;อยVLในคอลเล5กช)น
                                                                             

         • boolean isEmpty()

                        เปyนเมธอดท;ใชUในการตรวจวLาคอลเล5กช)นม;สมาชกอยVLหรอไมL โดยจะสLงคLากล)บมาเปyน     true    ถUา
                        ไมLม;สมาชกอยVLในคอลเล5กช)น

         • boolean contains(Object element)

                        เปyนเมธอดท;ใชUในการตรวจสอบวLา คอลเล5กช)นม;สมาชกท;ม;คาเปyนอ5อบเจกต#ของ argument ท;สLง
                                                                             L
                        ผLานมาหรอไมL

         • Iterator iterator()

                        เปyนเมธอดท;ใชUในการแจกแจงขUอมVลของสมาชกในคอลเล5กช)น
                                                                           


8.5.2 อ,นเตอร.เฟส         Set

        Set    เปyนอนเตอร#เฟสท;สบทอดมาจากอนเตอร#เฟส Collection โดยม;คลาสท;สZาค)ญท; implements
อนเตอร#เฟสน;Yคอคลาส HashSet คลาส HashSet ใชUในการสรUางอ5อบเจกต#ประเภทคอลเล5กช)นซxงจะม;สมาชกของ
                                                                                      
ขUอมVลซYZาก)นไมLไดU โปรแกรมท; 8.9 แสดงต)วอยLางการใชUคลาส HashSet โปรแกรมน;YจะตUองม;คZาส)ง import
java.util.*; เพอท;จะเร;ยกใชUคลาสตLางๆ ท;กZาหนดใน Collection API โปรแกรมน;YไดUสรUางอ5อบเจกต# s ซxงเปyน

อ5อบเจกต#ของคลาส HashSet และเร;ยกใชUเมธอด add() ในการใสLขUอมVลลงในอ5อบเจกต# s โดยปกตแลUว argument
ของเมธอด add() จะตUองเปyน อ5อบเจกต#ของคลาสท;ชอ Object แตLโปรแกรมน;YจะสLง argument ท;เปyนอ5อบเจกต#



ผศ. ธนศา เครอไวศยวรรณ                                                                    อะเรย#และคอลเล5กช)น    263
ของคลาส String ซxงสามารถทZาไดUเนองจากคลาส String เปyนคลาสท;สบทอดมาจากคลาสท;ชอ Object
โปรแกรมน;YตUองการจะแสดงใหUเห5นวLาเราไมLสามารถท;จะใสLขUอมVลท;ซYZาก)น (ขUอความ “Java”) ลงในอ5อบเจกต#ชนด
HashSet ไดU ซxงโปรแกรมน;จะไดUผลล)พธ#ด)งแสดงในรVปท; 8.13
                         Y

โปรแกรมท( 8.9 ต)วอยางการใชคลาส HashSet

  import java.util.*;
  public class SampleSet {
     public static void main(String args[]) {
        Set s = new HashSet();
        s.add("C#");
        s.add("Java");
        s.add("Pascal");
        System.out.println("The size of this set is " + s.size());
        System.out.println("The contents are " + s);
        System.out.println("Removing C#");
        s.remove("C#");
        System.out.println("Now this set contains C#: " + s.contains("C#"));
        s.add("Java");
        System.out.println("Now the size is " + s.size());
        System.out.println("The contents are " + s);
     }
  }




                                 รปท 8.13 ผลลพธทได*จากการรนโปรแกรมท 8.9


8.5.3 อ,นเตอร.เฟส         List


        List    เปyนอนเตอร#เฟสท;สบทอดมาจากอนเตอร#เฟส Collection แตLจะแตกตLางจากอนเตอร#เฟส Set ตรง
ท;จะม;ลZาด)บของสมาชกอยVL (index) และสามารถท;ม;สมาชกซxงม;ขอมVลซxงซYZาก)น ซxงอนเตอร#เฟส List จะเพมเมธอดท;
                                                            U


264    อะเรย#และคอลเล5กช)น                                                               ผศ. ธนศา เครอไวศยวรรณ
เก;ยวขUองก)บขUอมVลลZาด)บของสมาชก ด)งน;Y

         • void add(int index,Object element)

                        เปyนเมธอดในการใสLสมาชกลงในคอลเล5กช)นท;เปyนอ5อบเจกต#ท;ม;คาเปyน argument ท;สLงผLาน โดยม;
                                                                                 L
                        ลZาด)บท;เ ปyนเลขจZานวนเต5มใน argument ท;ชอ index
         • Object remove(int index)

                        เปyนเมธอดในการลบสมาชกลZาด)บท;ซxงม;เลขจZานวนเต5มใน argument ท;ชอ     index     ออกจาก
                        คอลเล5กช)น

         • Object get(int index)

                        เปyนเมธอดน;YใชUในการเร;ยกขUอมVลของสมาชกลZาด)บท;ม;เลขจZานวนเต5มใน argument ท;ชอ         index


         • int indexOf(Object element)

                        เปyนเมธอดน;YใชUในการตรวจสอบวLาอ5อบเจกต#ท;ม;คLาใน argument ท;สLงผLานมาเปyนสมาชกลZาด)บท;
                        เทLาไรของคอลเล5กช)น
                                          

         • ListIterator listIterator()

                        เปyนเมธอดน;YใชUในการแจกแจงขUอมVลของสมาชกในคอลเล5กช)นแบบ List

         คลาสสZาค)ญท; implements อนเตอร#เฟส List ซxงระบJไวUใน Collection API คอคลาส LinkedList และ
ArrayList โปรแกรมท; 8.10 แสดงต)วอยLางการใชUคลาส LinkedList โปรแกรมน;Yจะม;คZาส)ง l.get(0)

เปyนการเร;ยกขUอมVลของสมาชกลZาด)บท; 0 ในอ5อบเจกต# l ท;เปyนอ5อบเจกต#ของคลาส LinkedList สLวนคZาส)ง
l.indexOf(“Java”) เปyนคZาส)งเร;ยกดVลZาด)บท;ของสมาชกในอ5อบเจกต# l ซxงม;ขUอมVลเปyนอ5อบเจกต# String ท;ม;
                                            
ขUอความใน “Java” โปรแกรมน;แสดงต)วอยLางของขUอแตกตLางระหวLางคลาสประเภท Set และ List ท)Yงน;จะเห5นไดU
                              Y                                                                 Y
จากคZาส)ง l.add(“Java”) สามารถท;จะใสLขUอมVลท;ซYZาก)นไดUโดยโปรแกรมจะไดUผลล)พธ#ด)งแสดงในรVปท; 8.14




ผศ. ธนศา เครอไวศยวรรณ                                                                      อะเรย#และคอลเล5กช)น    265
โปรแกรมท( 8.10 ต)วอยางการใชคลาส LinkedList

  import java.util.*;

  public class SampleList {
     public static void main(String args[]) {
        List l = new LinkedList();
        l.add("C#");
        l.add("Java");
        l.add("Pascal");
        System.out.println("The size is "+l.size());
        System.out.println("The contents are "+l);
        System.out.println("The first one is "+l.get(0));
        l.add("Java");
        System.out.println("The contents are "+l);
        System.out.println("The index of Java is "+
        l.indexOf("Java"));
     }
  }




                                รปท 8.14 ผลลพธทได*จากการรนโปรแกรมท 8.10


8.5.4 อ,นเตอร.เฟส         Map


        Map เปyนอนเตอร#เฟสท;สบทอดมาจากอนเตอร#เฟส Collection ซxงสมาชกแตLละต)วของคอลเล5กช)นท;เปyน
Map จะม;ขUอมVลอยVLสองสLวนคอ สLวนท;เปyนค;ย#และสLวนท;เปyนขUอมVลซxงเปyนอ5อบเจกต#ของคลาสใดๆ ค;ย#จะทZาหนUาท;ชวย
                                                                                                          L
ในการสบคUนสLวนท;เปyนขUอมVลสมาชกของ Map โดยจะตUองม;คย#ท;ไมLซYZาก)นแตLอาจม;สLวนท;เปyนขUอมVลซYZาก)นไดU
                                                         ;
อนเตอร#เฟส Map จะม;เมธอดตLางๆ ท;เพมขxYนมาเพอชLวยสน)บสนJนการทZางานของค;ย#ด)งน;Y




266    อะเรย#และคอลเล5กช)น                                                               ผศ. ธนศา เครอไวศยวรรณ
• Object put(Object key, Object value)

                        เปyนเมธอดท;ใชUในการใสLสมาชกลงในคอลเล5กช)น โดยตUองใสLอ5อบเจกต#ท)YงสLวนท;เปyนค;ย#และสLวนท;
                        เปyนขUอมVลตาม argument ท;ชอ key และ value ตามลZาด)บ

         • Object remove(Object key)

                        เปyนเมธอดท;ใชUในการลบสมาชกออกจากคอลเล5กช)น โดยสมาชกท;ถVกลบจะม;คาของค;ย#เปyน
                                                                                          L
                        อ5อบเจกต#ท;ม;คLาตาม argument ท;ชอ key
         • Object get(Object key)

                        เปyนเมธอดท;ใชUในการเร;ยกดVขUอมVลของสมาชกในคอลเล5กช)นท;ม;คาของค;ย#เปyนคLาของอ5อบเจกต#ท;
                                                                                  L
                        ชอ key ท;ผานมาย)ง argument
                                    L

         • Set entrySet()

                        เปyนเมธอดท;ใชUเร;ยกดVขUอมVลของสมาชกท)Yงหมดในคอลเล5กช)น
                                                                              

         • Set keySet()

                        เปyนเมธอดท;ใชUเร;ยกดVค;ยของสมาชกท)Yงหมดในคอลเล5กช)น
                                                 #

         • int size()

                        เปyนเมธอดท;ใชUในการหาจZานวนสมาชกของคอลเล5กช)น
                                                                     

        คลาสท;สZาค)ญท; implements อนเตอร#เฟส Map คอคลาส HashMap โปรแกรมท; 8.11 แสดงต)วอยLางการ
สรUางอ5อบเจกต#ของคลาสน;แลUวเร;ยกใชUเมธอด put() ในการใสLสมาชกลงในคอลเล5กช)น ท)Yงน;Yเมธอดน;จะตUองสLงผLาน
                          Y                                                               Y
argument สองต)ว ในท;น;Yท)Yงสองต)วจะสLงผLานอ5อบเจกต#ชนด String เมธอด remove() ในท;นจะใชUในการลบ
                                                                                        ;Y
สมาชกท;ม;คาของค;ย#เปyน String ท;ม;คLาเปyน “3” โปรแกรมน;YจะใหUผลล)พธ#ด)งแสดงในรVปท; 8.15
           L




ผศ. ธนศา เครอไวศยวรรณ                                                                       อะเรย#และคอลเล5กช)น   267
โปรแกรมท( 8.11 ต)วอยางการใชคลาส HashMap

  import java.util.*;

  public class SampleMap {
     public static void main(String args[]) {
        Map m = new HashMap();
        m.put("1","C#");
        m.put("2","Java");
        m.put("3","Pascal");
        System.out.println("Removing Pascal");
        m.remove("3");
        System.out.println("The size is "+m.size());
        System.out.println("The first one is "+
        m.get("1"));
        m.put("3","Java");
        System.out.println("The key of this map are "+
        m.keySet());
        System.out.println("The contents are "+ m.entrySet());
     }
  }




                                รปท 8.15 ผลลพธทได*จากการรนโปรแกรมท 8.11

8.5.5 อ,นเตอร.เฟส        Iterator

       Iterator    เปyนอนเตอร#เฟสท;ใชUในการเร;ยกดVสมาชกของคอลเล5กช)น ท)Yงน;อนเตอร#เฟส Collection จะม;
                                                                           Y
เมธอด iterator() ซxงจะสLงอ5อบเจกต#ของคลาสประเภท Iterator กล)บคนมา อนเตอร#เฟส Iterator จะม;
เมธอดตLางๆ ท;ใชUในการเร;ยกดVขUอมVลด)งน;Y
       • boolean hasNext()

                     เปyนเมธอดท;จะตรวจสอบวLาย)งม;ขUอมVลอยVLใน Iterator อ;กหรอไมL


268   อะเรย#และคอลเล5กช)น                                                           ผศ. ธนศา เครอไวศยวรรณ
• Object next()

                        เปyนเมธอดท;จะเร;ยกดVคาของอ5อบเจกต#ของสมาชกต)วถ)ดไปของ Iterator โดยจะสLงคLากล)บมา
                                              L
                        เปyนอ5อบเจกต#ของคลาสท;ชอ Object
         • void remove()

                        เปyนเมธอดท;ใชUในการลบสมาชกตZาแหนLงปwจจJบ)นออกจาก Iterator

        โดยท)วไปตZาแหนLงเรมตUนของ Iterator จะช;Yไปท;ตZาแหนLงกLอนสมาชกของ Iterator ต)วแรกและจะใชU
เมธอด next() ในการเร;ยกดVสมาชกต)วตLอๆ ไป โปรแกรมท; 8.12 แสดงต)วอยLางการใชUอนเตอร#เฟส Iterator ใน
การเร;ยกดVขUอมVลของสมาชกของอ5อบเจกต#ชนด ArrayList โปรแกรมน;จะใหUผลล)พธ#ด)งแสดงในรVปท; 8.16
                                                                  Y


โปรแกรมท( 8.12 ต)วอยางการใชอนเตอรเฟส            Iterator


  import java.util.*;

  public class SampleIterator {
     public static void main(String args[]) {
        Set scrSet = new HashSet();
        scrSet.add("C#");
        scrSet.add("Java");
        scrSet.add("Pascal");
        Iterator it = scrSet.iterator();
        Set dstSet = new HashSet();
        for(int i=0; i<scrSet.size(); i++) {
           if(it.hasNext()) {
              dstSet.add(it.next());
           }
        }
        System.out.println(dstSet);
     }
  }




                                  รปท 8.16 ผลลพธทได*จากการรนโปรแกรมท 8.12


ผศ. ธนศา เครอไวศยวรรณ                                                                อะเรย#และคอลเล5กช)น   269
Collection API ย)งม;อนเตอร#เฟสประเภท Iterator ท;สZาค)ญอ;กสองต)วคอ ListIterator และ
Enumeration      อนเตอร#เฟส ListIterator จะใชUในการเร;ยกดVขUอมVลของคอลเล5กช)นประเภท List โดยม;เมธอดท;
                                                                            
สZาค)ญท;เพมมาจากเมธอดของอนเตอร#เฟส Iterator ด)งน;Y
       • boolean hasPrevious()

                     เปyนเมธอดท;จะตรวจสอบวLาม;ขUอมVลในตZาแหนLงกLอนหนUาน;ใน ListIterator หรอไมL
                                                                         Y

       • Object previous()

                     เปyนเมธอดท;จะเร;ยกดVคาของอ5อบเจกต#ของสมาชก ในตZาแหนLงกLอนหนUาน;ของ ListIterator
                                           L                                         Y
                     โดยจะสLงคLากล)บมาเปyนอ5อบเจกต#ของคลาสท;ชอ Object

       • void add(Object element)

                     เปyนเมธอดในการใสLสมาชกต)วใหมLลงใน ListIterator
       • void set(Object element)

                     เปyนเมธอดท;ใชUในการแทนคLาสมาชกของ ListIterator ในตZาแหนLงปwจจJบ)นดUวยคLาท;สLงผLานมา
                     ทาง argument

       อนเตอร#เฟส      List   จะม;เมธอด listIterator() ซxงเปyนเมธอดท;สLงคLากล)บเปyนอ5อบเจกต#ประเภท
ListIterator()        เพอใชUในการแจกแจงขUอมVลของสมาชกของ คอลเล5กช)นประเภท List
                                                                    
        อนเตอร#เฟส Enumeration จะม;ล)กษณะคลUายก)บอนเตอร#เฟส Iterator โดยจะใชUในการแจกแจงของ
ขUอมVลของคอลเล5กช)นตLางๆ อนเตอร#เฟสน;Yจะม;เมธอดท;สZาค)ญสองเมธอดคอ
                  

       • boolean hasMoreElement()

                     เปyนเมธอดท;ใชUในการตรวจสอบวLาย)งม;สมาชกใน Enumeration อ;กหรอไมL

       • Object nextElement()

                     เปyนเมธอดท;ใชUในการเร;ยกดVคาของสมาชกใน Enumeration ท;อยVLในตZาแหนLงถ)ดไป
                                                 L




270   อะเรย#และคอลเล5กช)น                                                              ผศ. ธนศา เครอไวศยวรรณ
โดยท)วไปการเร;ยกดVคาของสมาชกของอ5อบเจกต#ประเภท Enumeration จะม;รVปแบบของคZาส)งด)งน;Y
                               L
                    while(e.hasMoreElements()){
                          System.out.print(e.nextElement() + “ ”);
                    }




8.5.6 คลาส          Vector


               เปyนคลาสประเภทคอลเล5กช)นท;กZาหนดไวUใน Collection API คลาส Vector ใชUเก5บกลJLมของ
           Vector

อ5อบเจกต#ของคลาสใดๆ โดยไมLจZาก)ดจZานวน คลาส Vector เปyนคลาสท; implements อนเตอร#เฟส List เรา
สามารถสรUางอ5อบเจกต#ของคลาส Vector โดยเร;ยกใชU constructor ในรVปแบบตLางๆ ด)งน;Y
           • Vector()
           • Vector(int initialCapacity)
           • Vector(int initialCapacity, int capacityIncrement)

           โดยท;
           • initialCapacity   คอขนาดเรมตUนของ Vector
           •   capacityIncrement คอขนาดท;จะเพมขxYนเมอ Vector ม;ขนาดเต5มแลUว


        โปรแกรมท; 8.13 เปyนต)วอยLางการใชUอ5อบเจกต#ของคลาส Vector และใชUอนเตอร#เฟส Enumeration ใน
การเร;ยกดVขUอมVล โปรแกรมน;YจะใหUผลล)พธ#ด)งแสดงในรVปท; 8.17

โปรแกรมท( 8.13 ต)วอยางการใชอ9อบเจกตของคลาส Vector
  import java.util.*;

  public class SampleEnumeration {
     public static void main(String args[]) {
        Vector     v = new Vector();
        v.add("C#");
        v.add("Java");
        v.add("Pascal");
        Enumeration e = v.elements();
        while (e.hasMoreElements()) {
               System.out.print(e.nextElement()+"               ");

               }
       }
  }




ผศ. ธนศา เครอไวศยวรรณ                                                              อะเรย#และคอลเล5กช)น   271
รปท 8.17 ผลลพธทได*จากการรนโปรแกรมท 8.13


8.5.7 การใชคDาสง for และ Generic

       เราสามารถท;จะใชUคZาส)ง Generic ในการกZาหนดชนดขUอมVลของอ5อบเจกต#ท;อยVLในคอลเล5กช)น อาทเชLนถUา
                                                                                          
ตUองการกZาหนดใหUอ5อบเจกต# myList ชนด LinkedList เปyนอ5อบเจกต#ท;เก5บขUอมVลชนด String เราสามารถท;
จะประกาศอ5อบเจกต#นโดยใชUคZาส)ง
                    ;Y

                 List<String> myList = new LinkedList<String>();


        และเราสามารถท;จะใชUคZาส)ง for ในการท;จะแจกแจงคLาของอ5อบเจกต#ประเภทคอลเล5กช)นแทนท;จะใชU
                                                                                      
อนเตอร#เฟส Iterator อาทเชLนอ5อบเจกต# myList ท;เปyนม;คาของขUอมVลภายในคอลเล5กช)นเปyน String สามารถ
                                                          L                      
ท;จะแจงขUอมVลโดยใชUคZาส)ง for ด)งน;Y

                 for (String stringList : myList) {
                       System.out.println(stringList);
                 }


       โปรแกรมท; 8.14 เปyนต)วอยLางการใชU Generic ในการสรUางอ5อบเจกต#ของคลาส HashSet ท;จะใสLอ5อบเจกต#
ชนด Integer และใชUคZาส)ง for ในการแจกแจงขUอมVล โปรแกรมน;จะใหUผลล)พธ#ด)งแสดงในรVปท; 8.18
                                                           Y




272   อะเรย#และคอลเล5กช)น                                                           ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท( 8.14 ต)วอยางการใช Generic

  public class SampleGeneric {

        public static void main(String args[]) {
            Set<Integer> scrSet = new HashSet<Integer>();
            int[] myInt = {1, 3, 5, 7, 11};
            for (int i : myInt) {
                scrSet.add(i);
            }
            for (Integer num : scrSet) {
                System.out.print(num + " ");
            }
            System.out.println();
        }
  }




                              รปท 8.18 ผลลพธทได*จากการรนโปรแกรมท 8.14


สร%ปเนอหาของบท
        • โดยท)วไปโครงสรUางขUอมVลแบบอะเรย#จะถVกนZามาใชU เมอตUองการเก5บขUอมVลชนดเด;ยวก)นหลายคLา แตLใชU
            ต)วแปรอะเรย#ตวเด;ยวก)น
                           )
        •   อะเรย#แบLงออกไดUเปyน 2 ประเภท คออะเรย#ของขUอมVลชนดพYนฐาน และอะเรย#ของขUอมVลชนดคลาสข)Yนตอน
            ในการสรUางอะเรย#ของขUอมVลชนดพYนฐานคอ การประกาศต)วแปรอะเรย# และการสรUางอะเรย#
        •   ข)YนตอนในการสรUางอะเรย#ของขUอมVลชนดคลาสคอ การประกาศต)วแปรอะเรย# การสรUางอะเรย# และการ
            สรUางอ5อบเจกต#ใหUก)บสมาชกของอะเรย#แตLละต)ว
        •   ขนาดของอะเรย#สามารถหาไดUจากคJณล)กษณะ length
        •   คZาส)ง for นยมนZามาใชUในการอUางถxงสมาชกของอะเรย#



ผศ. ธนศา เครอไวศยวรรณ                                                               อะเรย#และคอลเล5กช)น   273
• เราสามารถสรUางอะเรย#หลายมตไดU โดยจZานวนเครองหมาย [ ] บLงบอกถxงจZานวนมตของอะเรย#
      • สZาหร)บอะเรย#สองมต จZานวนคอล)มน#ในแตLละแถวไมLจZาเปyนตUองเทLาก)น
      • ในคลาสท;ชอ Arrays ม;เมธอดสZาค)ญท;เ ก;ยวขUองก)บอะเรย#คอ sort(),   binarySearch()     และ
           fill()
      • เมธอด arraycopy() จากคลาส System ใชUในการค)ดลอกคLาของสมาชกของอะเรย#
      •   Collection, Set, List        และ Map เปyนอนเตอร#เฟสสZาค)ญท;อยVLใน Collection API โดยท;
          อนเตอร#เฟส Set และ List สบทอดมาจากอนเตอร#เฟส Collection
      •   อนเตอร#เฟส Set จะไมLสามารถม;คาขUอมVลของสมาชกท;ซYZาก)นไดU และไมLม;ลZาด)บของสมาชก
                                          L
      •   สLวนอนเตอร#เฟส List จะสามารถม;คาขUอมVลของสมาชกท;ซYZาก)นไดU และม;ลZาด)บของสมาชก
                                             L
      •   สZาหร)บอนเตอร#เฟส Map จะม;การเก5บคLาค;ย#คVLก)บคLาขUอมVลของสมาชก โดยท;คาค;ย#ของสมาชกจะตUองไมLซYZา
                                                                                 L
          ก)น แตLคLาขUอมVลของสมาชกสามารถซYZาก)นไดU
      •   เราสามารถนZาคลาสท; implements อนเตอร#เฟสเหลLาน;YไปใชUในการเก5บขUอมVลท;เปyนอ5อบเจกต#ไดUหลายต)ว
          คลUายก)บอะเรย# แตLสามารถเปล;ยนแปลงขนาดไดU
      •   อนเตอร#เฟส Iterator,ListIterator และ Enumeration ใชUในการอUางถxงขUอมVลสมาชกของคลาสท;
          อยVLใน Collection API
      •   คลาส Vector เปyนคลาสท;ใชUในการเก5บกลJLมของอ5อบเจกต#ของคลาสใดๆ โดยไมLจZาก)ดจZานวน
      •   เราสามารถท;ใชU Generic ในการกZาหนดชนดของอ5อบเจกต#ท;จะใสLขUอมVลลงอ5อบเจกต#คลาสประเภท
          คอลเล5กช)น
      •   คZาส)ง for สามารถท;จะใชUในการแจกแจงขUอมVลแทนการใชU Iterator หรอ Enumeration ไดU
      •   เราสามารถใชUคZาส)ง Generic ในการกZาหนดชนดขUอมVลของอ5อบเจกต#ท;อยVLในคอลเล5กช)นไดU
                                                                                          




274   อะเรย#และคอลเล5กช)น                                                             ผศ. ธนศา เครอไวศยวรรณ
บทท 9 การจดการกบขอผ,ดพลาด
       เนYอหาในบทน;Y เปyนการแนะนZาหล)กการของการจ)ดการก)บขUอผดพลาดในภาษาจาวา แนะนZาคลาสท;เก;ยวขUอง
ก)บการจ)ดการก)บขUอผดพลาดท;กZาหนดไวUใน Java API อธบายคZาส)งท;ใชUในการจ)ดการก)บขUอผดพลาดคอคZาส)ง try,
catch และ finally อธบายกฎการจ)ดการก)บขUอผดพลาด และตอนทUายของบทจะเปyนการแนะนZาการสรUางคลาส

ประเภทขUอผดพลาดขxนมาใหมL
                   Y


9.1 ขอผ,ดพลาด

         โปรแกรมภาษาจาวาอาจเกดขUอผดพลาด (Exception) ขxนในข)นตอนการร)นโปรแกรม โดยท;ขอผดพลาดเหลLา
                                                      Y    Y                        U
น;YจะไมLสามารถตรวจสอบไดUในข)นตอนการคอมไพล#โปรแกรม ต)วอยLาง เชLน คZาส)ง
                            Y
                offset = x/n;


        สZาหร)บต)วแปรท;ม;ชนดขUอมVลเปyน int ท;ชอ offset, x และ n จะเปyนคZาส)งท;สามารถคอมไพล#ผLานไดU แตLถUา
คLาของ n เปyนศVนย# โปรแกรมน;YจะเกดขUอผดพลาดขxYนในข)นตอนการร)นโปรแกรม ซxงโปรแกรมภาษาจาวาจะตรวจสอบ
                                                      Y
พบขUอผดพลาดในการหารดUวยจZานวนเต5มศVนย# และจะสLงขUอผดพลาด (throwing an exception) ท;เกดขxนกล)บมา
                                                                                               Y

         โปรแกรมภาษาจาวาแบLงขUอผดพลาดท;อาจเกดขxYนขณะร)นโปรแกรมเปyนสองประเภทคอ
    1. Error     เปyนขUอผดพลาดท;ไมLสามารถแกUไขและจ)ดการไดU เชLน Virtual MemoryError และ
         OutOfMemoryError เปyนตUน เราจะไมLกลLาวถxง Error เนองจาก Error เปyนขUอผดพลาดท;เราไมLสามารถเข;ยน

         โปรแกรมเพอแกUไขและจ)ดการไดU
    2.   Exception เปyนขUอผดพลาดท;สามารถแกUไขและจ)ดการไดU เชLน ขUอผดพลาดจากการเปmดไฟล#ท;ไมLม;อยVLใน
         ไดเร5กทอร; (FileNotFoundException) หรอขUอผดพลาดจากการอUางองหมายเลขของสมาชกของอะเรย#ท;
         ไมLถVกตUอง คอไมLไดUม;อยVLจรง (ArrayIndexOutOfBoundsException)

       ขUอผดพลาดในภาษาจาวาจะกZาหนดเปyนอ5อบเจกต#ของคลาสตLางๆ มากกวLาหกสบคลาส โดยม;ลZาด)บการสบทอด
ด)งแสดงในรVปท; 9.1 ซxงคลาสของขUอผดพลาดเหลLาน;จะสบทอดมาจากคลาส Throwable ซxงเปyนคลาสราก
                                               Y




ผศ. ธนศา เครอไวศยวรรณ                                                              การจ)ดการก)บขUอผดพลาด   275
รปท 9.1 คลาสของข*อผดพลาดต%างๆทส0บทอดมาจากคลาสทช0อ        Throwable




9.2 Exception

      คลาสท;ชอ Exception เปyนคลาสท;กZาหนดใน Java API เพอระบJขUอผดพลาดท;เกดขxYนในขณะร)นโปรแกรม
ภาษาจาวา Exception แบLงออกเปyนสองประเภทคอ

       1. RuntimeException เปyนขUอผดพลาดท;อาจหล;กเล;ยงไดUหากม;การเข;ยนโปรแกรมท;ถVกตUอง ต)วอยLางเชLน
            ArrayIndexOutOfBoundsException          ซxงเปyนขUอผดพลาดเพราะม;การอUางองสมาชกของอะเรย#ท;ไมL
            ถVกตUอง สามารถแกUไขโปรแกรมใหUด;ขนไดUถUาม;การตรวจสอบหมายเลขสมาชกของอะเรย#กLอนท;จะอUางอง
                                              xY
            โดยใชUคZาส)ง if
       2.   IOException เปyนขUอผดพลาดท;อาจจะไมLสามารถแกUไขโดยการปร)บปรJงโปรแกรมใหUสมบVรณ#ขนไดU  xY
            เชLน UnknownHostException ท;อาจเกดขxYนในขณะท;โปรแกรมกZาล)งพยายามตดตLอก)บระบบ
            อนเทอร#เน5ต แตLเครองคอมพวเตอร#ไมLสามารถตดตLอก)บระบบเครอขLายไดU ซxงขUอผดพลาดประเภทน;YไมL
            สามารถตรวจสอบไดUโดยใชUคZาส)ง if แตLการเร;ยกใชUเมธอดท;อาจเกดขUอผดพลาดประเภท IOException
            จะตUองม;การเข;ยนคZาส)ง try/catch ในการจ)ดการก)บขUอผดพลาดท;เกดขxYน




276   การจ)ดการก)บขUอผดพลาด                                                           ผศ. ธนศา เครอไวศยวรรณ
คลาสประเภท Exception ท;สZาค)ญและพบบLอยในโปรแกรมภาษาจาวาม;ด)งน;Y
        • ArithmeticException เปyนการระบJวLาม;ขUอผดพลาดในนพจน#คณตศาสตร#เชLน การหารดUวยเลขจZานวน
           เต5มศVนย#
        • ArrayIndexOutOfBoundsException เปyนการระบJวLาม;การอUางองสมาชกของอะเรย#ไมLถVกตUอง (เปyน
           เลขจZานวนเต5มลบหรอม;คLามากกวLาหมายเลขสมาชกของอะเรย#ท;ม;อยVL)
        • EOFException เปyนการระบJวLาตZาแหนLงสYนสJดของไฟล#ไดUผLานมาแลUว
        • FileNotFoundException เปyนการระบJวLาไมLพบไฟล#ท;ตUองการอUางอง
        • InterruptedException เปyนการระบJวLา process บาง process ถVกระง)บ (interrupt)
        • IOException เปyนการระบJขUอผดพลาดท;เกดขxนจากขบวนการอนพJตหรอเอาท#พJตใดๆ
                                                          Y
        • NullPointerException เปyนการระบJวLาม;การเร;ยกใชUเมธอดของคลาสจากอ5อบเจกต#ท;ย)งม;ตZาแหนLง
           อUางองเปyน null อยVL (อ5อบเจกต#ย)งไมLไดUถVกสรUาง)
        • NumberFormatException เปyนการระบJวLารVปแบบของต)วเลขท;ใชUอยVLไมLถVกตUอง
                                                                   

        โปรแกรมท; 9.1 แสดงต)วอยLางโปรแกรมท;เกดขUอผดพลาดท;ชอ ArrayIndexOutOfBoundsException แตL
เนองจากโปรแกรมน;YไมLม;การจ)ดการก)บขUอผดพลาดด)งกลLาว จxงหยJดทZางานเมอพบขUอผดพลาดขณะร)นโปรแกรม โดย
จะใหUผลล)พธ#ด)งแสดงในรVปท; 9.2


โปรแกรมท( 9.1 ต)วอยางแสดงขอผดพลาดท%ชอ ArrayIndexOutOfBoundsException
  public class ExceptionDemo {
     public static void main(String args[]) {
        System.out.println(args[2]);
        System.out.println("Hello");
     }
  }




                             รปท 9.2 ผลลพธทได*จากการรนโปรแกรมท 9.1


ผศ. ธนศา เครอไวศยวรรณ                                                      การจ)ดการก)บขUอผดพลาด   277
9.3 คDาสง try..catch

       ภาษาจาวาม;ค;ย#เวร#ด try ท;เปyนคZาส)งท;ใชUในการจ)ดการก)บเมธอดหรอคZาส)งท;อาจเกดขUอผดพลาดซxงจะสLง
อ5อบเจกต#ประเภท Exception ในขณะร)นโปรแกรม ค;ย#เวร#ด try จะม;ชJดคZาส)งอยVLภายในบล5อกโดยม;รปแบบด)งน;Y
                                                                                                V
                try {
                    [statements]
                }


          โปรแกรมภาษาจาวาจะส)งงานชJดคZาส)งท;อยVLในบล5อกท;ละคZาส)ง และหากเกดขUอผดพลาดขxนในคZาส)งใด ก5จะม;
                                                                                              Y
การสLงอ5อบเจกต#ของขUอผดพลาดประเภท Exception น)นขxนมา ซxงโปรแกรมจะยกเลกการทZางานคZาส)งท;อยVLในบล5อกท;
                                                         Y Y
เหลอท)Yงหมด แตLหากทJกคZาส)งท;อยVLในบล5อกไมLม;ขUอผดพลาดใดเกดขxYน โปรแกรมจาวาก5จะทZางานตLอไปตามปกตเสมอน
วLาไมLม;ค;ยเ# วร#ด try อยVL ในกรณ;ท;ตUองการจ)ดการก)บขUอผดพลาดท;เกดขxYน โปรแกรมจะตUองม;ชJดคZาส)งอยVLในบล5อกของ
ค;ย#เวร#ด catch ท;จะระบJชนดของอ5อบเจกต#ในคลาสประเภท Exception ท;ตUองการจ)ดการโดยม;รVปแบบคZาส)งด)งน;Y
                catch(ExceptionType argumentName){
                    [statements]
                }


       โดยท;
            •    ExceptionType    คอชอคลาสประเภท Exception ท;ตUองการจะจ)ดการเมอม;ขUอผดพลาดเกดขxYน
            •    argumentName     คอชอของอ5อบเจกต#ท;จะเปyน argument ท;ใชUในบล5อกคZาส)งของ catch

        โปรแกรมภาษาจาวาจะทZาชJดคZาส)งในบล5อก catch ถUาม;คZาส)งในบล5อก try คZาส)งใดคZาส)งหนxงเกดขUอผด
พลาดโดยสLงอ5อบเจกต#ประเภท Exception ตามชนดท;สอดคลUองก)บคลาสท;ระบJใน ExceptionType และโปรแกรม
จะขUามคZาส)งท;เหลออยVLในบล5อก try ท)Yงหมด สLวนในกรณ;ท;ไมLม;คZาส)งใดในบล5อก try เกดขUอผดพลาดขxYน โปรแกรม
ภาษาจาวาจะไมLม;การทZาชJดคZาส)งในบล5อก catch โปรแกรมท; 9.2 แสดงต)วอยLางการจ)ดการก)บขUอผดพลาดท;อาจเกด
ขxYนในโปรแกรมท; 9.1 โปรแกรมน;ไดUเพมชJดคZาส)ง try และ catch ขxYนมา ซxงโปรแกรมน;จะใหUผลล)พธ#ด)งแสดงในรVป
                                  Y                                                  Y
ท; 9.3




278    การจ)ดการก)บขUอผดพลาด                                                               ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท( 9.2 ต)วอยางการจ)ดการก)บขอผดพลาดท%อาจเกดขน

   public class ExceptionHandlingDemo {
      public static void main(String args[]) {
         try {
            System.out.println(args[2]);
         } catch(ArrayIndexOutOfBoundsException ex) {
            System.out.println("There is no third command line argument");
         }
      }
   }




                                รปท 9.3 ผลลพธทได*จากการรนโปรแกรมท 9.2


9.4 การจดการกบขอผ,ดพลาดหลายๆ ประเภท

        โปรแกรมภาษาจาวาสามารถจะม;ชJดคZาส)งของบล5อก catch ไดUมากกวLาหนxงชJดสZาหร)บในแตLละบล5อกคZาส)ง
try โดยท;ชนดของอ5อบเจกต#ประเภท Exception ท;อยVLในชJดคZาส)งของบล5อก catch จะตUองเร;ยงตามลZาด)บการ

สบทอด โปรแกรมท; 9.3 แสดงต)วอยLางการจ)ดการก)บขUอผดพลาดมากกวLาหนxงประเภท โดยม;ชJดคZาส)งในบล5อก catch
สองชJดเพอจ)ดการก)บขUอผดพลาดสองชนดคอ ArithmeticException และ
ArrayIndexOutOfBoundsException โปรแกรมน;Yจะร)บ argument ผLานทาง command line ซxงจะเปyนต)วเลข

ท;ม;ชนดขUอมVลเปyน String แลUวจxงจะถVกแปลงใหUม;ชนดขUอมVลเปyน int ซxงหากขUอมVลเปyนจZานวนเต5มศVนย#ก5จะทZาใหUเกด
ขUอผดพลาดชนด ArithmeticException ขxYนไดU โดยโปรแกรมจะขUามมาทZาชJดคZาส)งในบล5อก catch ท;ตรวจจ)บอ5
อบเจกต#ชนดด)งกลLาว และโปรแกรมจะจ)ดการก)บขUอผดพลาดชนด NumberFormatException ถUา argument ท;ร)บ
ผLานทาง command line ไมLใชLขUอความท;แปลงเปyนต)วเลขจZานวนเต5มไดU โดยโปรแกรมจะขUามมาทZาชJดคZาส)งในบล5อก
catch ท;ตรวจจ)บอ5อบเจกต#ชนด NumberFormatException โดยม;ผลล)พธ#ของโปรแกรมด)งต)วอยLางท;แสดงในรVปท;
9.4




ผศ. ธนศา เครอไวศยวรรณ                                                              การจ)ดการก)บขUอผดพลาด   279
ในกรณ;ท;ม;ขUอผดพลาดเกดขxYน ภาษาจาวาจะพจารณาวLาเปyนขUอผดพลาดชนดใด ซxงการท;จะจ)ดการก)บอ5อบเจกต#
ประเภท Exception น)นจะพจารณาจากคลาสท;ม;การสบทอดตาม ลZาด)บช)Yน ท)Yงน;Yเราสามารถจะจ)ดการก)บอ5อบเจกต#
                        Y
ประเภท Exception โดยใชUคลาสท;เปyน superclass ของอ5อบเจกต#นนไดU อาทเชLนอ5อบเจกต#ชนด
                                                              )Y
FileNotFoundException สามารถจ)ดการไดUโดยใชUคลาส IOException หรอ Exception แทนไดUเนองจาก

คลาส FileNotFoundException สบทอดมาจากคลาส IOException ซxงสบทอดมาจากคลาส Exception อ;ก
ช)Yนหนxง

โปรแกรมท( 9.3 ต)วอยางการจ)ดการก)บขอผดพลาดมากกวาหนงประเภท

  public class ExceptionHandlingDemoV2 {
     public static void main(String args[]) {
        try {
           int i = Integer.parseInt(args[0]);
           System.out.println(4 / i);
        } catch(ArithmeticException ex) {
           System.out.println(ex.toString());
        } catch(NumberFormatException ex) {
           System.out.println("Invalid numeric format");
        }
     }
  }




                               รปท 9.4 ผลลพธทได*จากการรนโปรแกรมท 9.3


         ภาษาจาวากZาหนดใหUชJดคZาส)งในบล5อก catch จะตUองเร;ยงอ5อบเจกต#ของคลาสประเภท Exception ตาม
ลZาด)บการสบทอด ต)วอยLางเชLน โปรแกรมท; 9.3 ถxงแมUวLาจะม;คลาสประเภท Exception ท;จะตรวจจ)บสองชนด แตL
เนองจากคลาสท)YงสองตLางก5สบทอดมาจาก RunTimeException และอยVLในลZาด)บช)Yนเด;ยวก)นจxงสามารถท;จะสล)บชJด
คZาส)งในบล5อก catch ท)YงสองไดU แตLในกรณ;ของโปรแกรมท; 9.4 ชJดคZาส)งในบล5อก catch ท;จะจ)ดการก)บคลาส
RunTimeException อยVLลZาด)บกLอนหนUาชJดคZาส)งในบล5อก catch ท;จะจ)ดการก)บคลาส




280   การจ)ดการก)บขUอผดพลาด                                                            ผศ. ธนศา เครอไวศยวรรณ
ArrayIndexOutOfBoundsException ด)งน)นโปรแกรมน;YจงไมLม;โอกาสท;จะทZาชJดคZาส)งท;สองไดUเนองจากคลาส
                                    Y           x
ArrayIndexOutOfBoundsException สบทอดมาจากคลาส RunTimeException จxงทZาใหUโปรแกรมน;YไมL

สามารถคอมไพล#ผานไดU
              L


โปรแกรมท( 9.4 ต)วอยางการจ)ดวางล(าด)บคลาสท%จะมาจ)ดการก)บขอผดพลาดท%ไมถ1กตอง
  public class ExceptionHandlingDemoV3 {
     public static void main(String args[]) {
        try {
           int i = Integer.parseInt(args[0]);
           System.out.println(4 / i);
           System.out.println(args[2]);
        } catch(RuntimeException ex) {
           System.out.println(ex.toString());
        } catch(ArrayIndexOutOfBoundsException ex) {
           System.out.println("There is no third command
           line argument");
        }
     }
  }




9.5 บล-อก finally

       ภาษาจาวาม;ค;ย#เวร#ด finally ท;จะม;ชJดคZาส)งอยVLในบล5อก เพอระบJใหUโปรแกรมทZาชJดคZาส)งด)งกลLาวหล)งจาก
สYนสJดการทZางานของชJดคZาส)งในบล5อก try หรอ catch โปรแกรมท; 9.5 แสดงต)วอยLางการกZาหนดชJดคZาส)งในบล5อก
finally ซxงโปรแกรมน;YจะใหUผลล)พธ#ด)งแสดงในรVปท; 9.5


          ภาษาจาวาจะทZาชJดคZาส)งในบล5อก finally เสมอ แมUวLาจะม;คZาส)ง return ในบล5อก try หรอ catch กLอน
ก5ตาม กรณ;เด;ยวท;จะไมLทZาชJดคZาส)งในบล5อก finally คอม;คZาส)ง System.exit(); เพอท;จะออกจากโปรแกรม
โปรแกรมท; 9.6 แสดงต)วอยLางท;ม;คZาส)ง return อยVLกLอนชJดคZาส)งในบล5อก finally โดยโปรแกรมน;จะไดUผลล)พธ#ด)ง
                                                                                             Y
รVปท; 9.6




ผศ. ธนศา เครอไวศยวรรณ                                                              การจ)ดการก)บขUอผดพลาด   281
โปรแกรมท( 9.5 ต)วอยางการก(าหนดชดค(าส)งในบล9อก finally
  public class FinallyDemo {
     public static void main(String args[]) {
        try {
           System.out.println(args[2]);
           System.out.println("Hello");
        } catch(ArrayIndexOutOfBoundsException ex) {
           System.out.println("There is no third argument");
        } finally {
           System.out.println("Finish running the program");
        }
     }
  }




                              รปท 9.5 ผลลพธทได*จากการรนโปรแกรมท 9.5


โปรแกรมท( 9.6 ต)วอยางท%ม%ค(าส)ง return อย1กอนชดค(าส)งในบล9อก finally
  public class FinallyDemoV2 {
      public static void main(String args[]) {
         FinallyDemoV2 obj = new FinallyDemoV2();
         obj.myMethod(args);
      }
      public int myMethod(String args[]) {
         try {
               System.out.println(args[2]);
               return 0;
         } catch(ArrayIndexOutOfBoundsException ex) {
               System.out.println("There is no third argument");
         } finally {
               System.out.println("Finish running the program");
               return 1;
         }
      }
  }




282   การจ)ดการก)บขUอผดพลาด                                            ผศ. ธนศา เครอไวศยวรรณ
รปท 9.6 ผลลพธทได*จากการรนโปรแกรมท 9.6


9.6 การจดการกบเมธอดทส0งอ-อบเจกต.ประเภท Exception

         เมธอดบางเมธอดท;กZาหนดใน Java API อาจสLงอ5อบเจกต#ประเภท Exception เมอเกดขUอผดพลาดขxนในการ
                                                                                             Y
เร;ยกใชUคZาส)ง อาทเชLน constructor ของคลาส FileInputStream อาจสLงอ5อบเจกต#ของคลาส
FileNotFoundException ถUาไมLพบไฟล#ด)งกลLาว หรอเมธอด getLocalHost() ของคลาส InetAddress อาจ

สLงอ5อบเจกต#ของคลาส UnknownHostException ถUาไมLทราบ IP address ของเครอง ภาษาจาวากZาหนดใหUเราตUองเข;ยน
โปรแกรมจ)ดการก)บขUอผดพลาด เมอม;การเร;ยกใชUเมธอดท;อาจสLงอ5อบเจกต#ประเภท IOException สZาหร)บเมธอด
ซxงการจ)ดการก)บขUอผดพลาดแบLงออกเปyน

        1.   ใชUคZาส)ง try/catch ด)งท;กลLาวไวUในห)วขUอท;ผานมา
                                                            L
        2.   ใชUคZาส)ง throws ในการประกาศเมธอดท;จะม;การเร;ยกใชUเมธอดใดๆท;อาจสLง
             อ5อบเจกต#ประเภท Exception ในกรณ;นหมายความวLาเมธอดท;ประกาศไมLตUองการจ)ดการก)บอ5อบเจกต#
                                                     ;Y
             ประเภท Exception ด)งกลLาวเอง แตLตUองการจะใหUเมธอดอนๆท;เร;ยกใชUเมธอดน;Yเปyนต)วจ)ดการแทน
             รVปแบบการใชUคZาส)ง throws ม;ด)งน;Y
               [modifier] return_type methodName([arguments]) throws ExceptionType
                                                                     [,ExceptionType2]{
                      ...
               }


        ต)วอยLางเชLน
        public void openFile(String s)throws FileNotFoundException {
        }


         เมธอดใดๆ สามารถท;จะจ)ดการก)บอ5อบเจกต#ประเภท Exception โดยใชUคZาส)ง throws ไดUมากกวLาหนxงชนด
                                                                                                  
ต)วอยLางเชLน


ผศ. ธนศา เครอไวศยวรรณ                                                          การจ)ดการก)บขUอผดพลาด   283
public void openFile(String s)throws FileNotFoundException,
                                                       UnknownHostException {
       }


         กรณ;ท;ม;การใชUคZาส)ง throws แลUวสLงตLอใหUเมธอดอนๆท;เร;ยกใชUเปyนต)วจ)ดการก)บอ5อบเจกต#ประเภท
Exception ด)งกลLาวไปเรอยๆ แตLถาเมธอดท;ชอ main() ซxงเร;ยกใชUเมธอดสJดทUายท;ใชUคZาส)ง throws ไมLม;การจ)ดการ
                                    U
ก)บอ5อบเจกต#ประเภท Exception ด)งกลLาว โปรแกรมจะเกดขUอผดพลาดในข)นตอนการร)นโปรแกรม เมอม;ขUอผดพลาด
                                                                            Y
ของอ5อบเจกต#ประเภท Exception ด)งกลLาวเกดขxน ต)วอยLางเชLนโปรแกรมท; 9.7 ซxงผลล)พธ#ท;ไดUจากการร)นเปyนด)งแสดง
                                                 Y
ในรVปท; 9.7


โปรแกรมท( 9.7 ต)วอยางท%ไมม%การจ)ดการก)บอ9อบเจกตประเภท Exception
  public class ExceptionDemo1 {
     public static void main(String args[]) {
        ExceptionDemo1 ex1 = new ExceptionDemo1();
        ex1.method1();
     }
     public void method1() throws ArithmeticException {
        method2();
     }
     public void method2() throws ArithmeticException {
        System.out.println(2/0);
     }
  }




                                รปท 9.7 ผลลพธทได*จากการรนโปรแกรมท 9.7

        เราสามารถท;จะใชUคZาส)ง throws ในเมธอดท;ชอ main() ไดU แตLจะเปyนการยกเลกการจ)ดการใดๆก)บขUอผด
พลาดท)Yงหมดท;อาจเกดขxYน นอกจากน;ภาษาจาวาไมLไดUกZาหนดใหUเราจะตUองเข;ยนคZาส)งในการจ)ดการก)บเมธอด ท;อาจสLง
                                    Y
ขUอผดพลาดของอ5อบเจกต#ประเภท RuntimeException แตLจะกZาหนดไวUเฉพาะเมธอดท;อาจสLงขUอผดพลาดของ
อ5อบเจกต#ประเภท IOException


284    การจ)ดการก)บขUอผดพลาด                                                              ผศ. ธนศา เครอไวศยวรรณ
เมธอดท;มคZาส)ง throws จะม;ผลตLอการสบทอด ท)Yงน;เY นองจากกฎของการกZาหนดเมธอดแบบ overridden จะ
                ;
ไมLอนJญาตใหUม;การจ)ดการอ5อบเจกต#ประเภท Exception โดยใชUคZาส)ง throws มากชนดกวLาท;เมธอดเดมจ)ดการอยVL
โปรแกรมท; 9.8 และโปรแกรมท; 9.9 แสดงต)วอยLางโปรแกรมท;ม;เมธอดแบบ overridden ท;ถVกตUองและไมLถVกตUองตาม
ลZาด)บ

โปรแกรมท( 9.8 ต)วอยางท%ม%เมธอดแบบ overridden ท%ถ1กตอง
   import java.io.*;

   public class Parent {
         public void myMethods() throws IOException { }
   }

   public class OverrideException extends Parent{
         public void myMethods() throws IOException {
               new FileInputStream("temp.txt");
         }
   }




โปรแกรมท( 9.9 ต)วอยางท%ม%เมธอดแบบ overridden ท%ไมถ1กตอง
   import java.io.*;

   public class Parent {
     public void myMethods() throws FileNotFoundException { }
   }

   public class OverrideExceptionV2 extends Parent{
       public void myMethods() throws
                        FileNotFoundException,IOException {
            new FileInputStream("temp.txt");
       }
   }




9.7 การสรางคลาสประเภท Exception ขKนใหม0

        Java API ม;คลาสประเภท Exception อยVLหลายชนดแตLในบางคร)YงเราอาจตUองการท;จะกZาหนดคลาสประเภท
                                                                               
Exception ขxนมาใหมL
            Y         เพอใชUในการระบJขUอผดพลาดเฉพาะเจาะจงเชLน โปรแกรมระบบทะเบ;ยนน)กศxกษาอาจม;คลาสท;
ชอ StudentIDNotFoundException เพอใชUในการสรUางอ5อบเจกต#ท;จะสLงขUอผดพลาด เมอไมLสามารถตรวจพบรห)ส
น)กศxกษาท;ตUองการ การสรUางคลาสประเภท Exception ขxนมาใหมL สามารถทZาไดUโดยนยามคลาสใดๆใหUสบทอดมาจาก
                                                  Y


ผศ. ธนศา เครอไวศยวรรณ                                                         การจ)ดการก)บขUอผดพลาด   285
คลาสท;ชอ Exception ในกรณ;ท;ตUองการบ)งค)บใหUเมธอดใดๆ จ)ดการก)บอ5อบเจกต#ของคลาสน)นในกรณ;ท;เกดขUอผด
                                                                                  Y
พลาดขxYน หรอนยามคลาสใดๆใหUสบทอดมาจากคลาส Runtime Exception ในกรณ;ท;ไมLตUองการใหUเมธอดใดๆ
จZาเปyนตUองจ)ดการก)บขUอผดพลาดด)งกลLาว

       โดยท)วไปคลาสท;ชอ Exception จะม; constructor สองรVปแบบคอ
            •   public Exception()
            •   public Exception(String s)


       ด)งน)นคลาสท;สบทอดมาจากคลาสท;ชอ Exception ควรจะม; constructor ท)Yงสอง โดยรVปแบบหนxงจะม;
             Y                                                                                   
argument ท;ม;ชนดขUอมVลเปyน String เพอร)บขUอความท;จะอธบายขUอผดพลาดและคZาส)งแรกใน constructor ด)งกลLาว
ควรเปyนคZาส)ง super(s); เพอสLงขUอความด)งกลLาวใหUก)บ constructor ของ superclass (คลาสท;ชอ Exception)
โปรแกรมท; 9.10 แสดงต)วอยLางของคลาส MyOwnException ซxงเปyนคลาสประเภท Exception ท;กZาหนดขxนใหมL   Y


โปรแกรมท( 9.10 ต)วอยางคลาสประเภท Exception ท%ก(าหนดขนใหม
  public class MyOwnException extends Exception {
     public MyOwnException (String s) {
        super(s);
     }
  }




9.7.1 การเขยนเมธอดเพอส0งอ-อบเจกต.ประเภท Exception

      เมธอดท;ตUองการสLงอ5อบเจกต#ประเภท Exception เมอเกดขUอผดพลาดขxนในคZาส)งใด จะตUองเร;ยกใชUคZาส)งท;ชอ
                                                                    Y
throw เพอจะสรUางอ5อบเจกต#ของคลาสประเภท Exception ขxYนมา โดยม;รVปแบบคZาส)งด)งน;Y

       throw new ExceptionType([arguments])

       โดยท;
            •   ExceptionType     คอชอของคลาสประเภท Exception ท;ตUองการจะสรUาง
                อ5อบเจกต#โดยม; argument สอดคลUองก)บท;ระบJใน constructor ของคลาสด)งกลLาว

          นอกจากน;คZาส)งประกาศเมธอดน)YนจะตUองม;คZาส)ง throws เพอกZาหนดใหUคZาส)งในเมธอดอนๆท;เร;ยกใชUเมธอด
                     Y
น;YตUองเข;ยนคZาส)งในการจ)ดการก)บขUอผดพลาดน;Y โปรแกรมท; 9.11 แสดงต)วอยLางการเข;ยนคลาส FileHandler โดยม;
เมธอด openFile() ซxงจะสLงอ5อบเจกต#ของคลาส MyOwnException ขxYนมาเมอไมLพบไฟล#ท;ระบJ สLวนโปรแกรมท;


286    การจ)ดการก)บขUอผดพลาด                                                              ผศ. ธนศา เครอไวศยวรรณ
9.12   แสดงต)วอยLางโปรแกรมท;ม;การจ)ดการก)บขUอผดพลาดด)งกลLาว

โปรแกรมท( 9.11 ต)วอยางคลาส FileHandler
   import java.io.*;

   public class FileHandler {
      public static void openFile(String filename) throws
                                             MyOwnException {
         File f = new File(filename);
         if (!f.exists()) {
            throw new MyOwnException("File Not Found");
         }
      }
   }




โปรแกรมท( 9.12 ต)วอยางท%ม%การจ)ดการก)บขอผดพลาด

   public class FileOpener {
      public static void main(String args[]) {
         try {
               FileHandler.openFile(args[0]);
               System.out.println("Open successful");
         } catch (MyOwnException ex) {
               System.out.println(ex);
         }
      }
   }




สร"ปเน-อหาของบท
         •   ขUอด;ประการหนxงของภาษาจาวาคอ เราสามารถเข;ยนโปรแกรมใหUม;การตรวจจ)บและจ)ดการก)บขUอผดพลาด
             ท;อาจเกดขxYนไดU โดยท;การทZางานไมLตUองหยJดลง
         •   Error เปyนขUอผดพลาดท;ไมLสามารถแกUไขและจ)ดการไดU สLวน Exception เปyนขUอผดพลาดท;สามารถแกUไข
             หรอจ)ดการไดU
         •   คZาส)ง try และ catch เปyนคZาส)งท;ใชUในการตรวจจ)บและจ)ดการก)บขUอผดพลาดท;อาจเกดขxนไดU โดยบล5อก
                                                                                                         Y
             คZาส)ง catch สามารถม;ไดUมากกวLาหนxงบล5อกสZาหร)บในแตLละบล5อกคZาส)ง try
                                                     
         •   คZาส)ง finally เปyนคZาส)งท;อยVLตLอจากคZาส)ง try/catch ถVกใชUเมอม;บางคZาส)งท;ตUองการใหUม;การทZาเสมอ


ผศ. ธนศา เครอไวศยวรรณ                                                                     การจ)ดการก)บขUอผดพลาด   287
ยกเวUนเจอคZาส)ง System.exit(0); กLอนเทLาน)น Y
       • คZาส)ง throws จะใสLไวUตรงคZาส)งประกาศเมธอด สZาหร)บเมธอดท;ย)งไมLตUองการจ)ดการก)บขUอผดพลาดแตLจะ
         ใหUเมธอดท;เร;ยกใชUเมธอดน;เY ปyนต)วจ)ดการแทน
       • เราสามารถสรUางคลาสประเภท Exception ชนดใหมLขนไดU โดยจะตUองสบทอดมาจากคลาส
                                                              xY
         Exception และตUองม;การเร;ยกใชU constructor ของคลาส Exception ดUวย




288   การจ)ดการก)บขUอผดพลาด                                                           ผศ. ธนศา เครอไวศยวรรณ
บทท 10 คลาสอ,นพ%ตและเอาต.พ%ต
        เนYอหาในบทน;YเปyนการแนะนZาคลาสและเมธอดตLางๆ ท;เก;ยวก)บอนพJตและเอาต#พJต และอธบายความหมายของ
stream โดยอธบายคลาสท;เก;ยวขUองก)บอนพJตและเอาต#พJตท;อยVLในแพคเก5จ java.io แนะนZาคลาส InputStream,
OutputStream, Reader และ Writer อธบายการสรUางและใชU stream แบบตLางๆ แนะนZาคลาสและเมธอดของ

คลาส File และ RandomAccessFile อธบายการใชUอนเตอร#เฟสท;ชอ Serializable และอธบายวธ;การเข;ยนและ
อLานขUอมVลของอ5อบเจกต#ผาน stream
                        L


10.1 Stream

          ภาษาจาวาจ)ดการก)บขบวนการอนพJตและเอาต#พJตโดยใชUหล)กการของ stream ซxงเปร;ยบเสมอนทLอสLงขUอมVล
จากตUนทาง (source) ไปย)งปลายทาง (sink) โดยท;ตUนทางเปyนตZาแหนLงเรมตUนของ stream ท;เร;ยกวLา input stream
และปลายทางเปyนตZาแหนLงสYนสJดของ stream ท;เร;ยกวLา output stream ด)งแสดงในรVปท; 10.1 stream จะชLวยใหU
น)กพ)ฒนาโปรแกรมสามารถท;เข;ยนโปรแกรมเพอสLงขUอมVลจากตUนทางไปย)งปลายทางไดU โดยไมLจZาเปyนตUองทราบ
รายละเอ;ยดภายในของการตดตLอก)บฮาร#ดแวร#หรอซอฟต#แวร#ท;ในการสLงขUอมVล ซxงสามารถเข;ยนโปรแกรมไดUโดยเพ;ยง
แตLรเVU มธอดท;ใชUในการร)บหรอสLงขUอมVลเทLาน)น
                                            Y




                                      รปท 10.1 หลกการของ stream

       ตUนทางและปลายทางของ stream อาจเปyนฮาร#ดแวร#หรอซอฟต#แวร# โดยจะเร;ยกวLา โหนด(node) เชLน ไฟล#
หนLวยความจZา หรอ socket เปyนตUน ซxงตUนทางและปลายทางอาจม;ชนดของโหนดท;ตLางก)น อาทเชLน การอLานขUอมVลจาก
ต)วแปรท;เก5บในหนLวยความจZาท;เปyนตUนทางผLาน stream ลงไปเก5บไวUในไฟล#ท;เปyนปลายทาง




ผศ. ธนศา เครอไวศยวรรณ                                                            คลาสอนพJตและเอาต#พJต   289
stream ท;ใชUในการสLงขUอมVลของภาษาจาวาจะแบLงออกเปyนสองประเภทคอ

       –    byte stream เปyน stream ท;ใชUในการร)บหรอสLงขUอมVลชนด byte

       –    character stream เปyน stream ท;ใชUในการร)บหรอสLงขUอมVลชนด char

        โดยท)วไปคZาวLา stream จะหมายถxง byte stream สLวน character stream ภาษาจาวาจะใชUคZาวLา reader และ
write สZาหร)บ stream ในการร)บและสLงชนดขUอมVล char ตามลZาด)บ



10.1.1 แพคเก%จ java.io

      คลาสท;เก;ยวก)บอนพJตและเอาต#พJตจะถVกกZาหนดโดย Java API ในแพคเก5จ java.io ซxงจะม;คลาสพYนฐานอยVL
4 คลาสคอ

       •   InputStream       เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เปyน stream ในการร)บชนดขUอมVลแบบ byte
       •   OutputStream       เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เปyน stream ในการสLงชนดขUอมVลแบบ byte
       •   Reader     เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เปyน stream ในการร)บชนดขUอมVลแบบ char
       •   Writer     เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เปyน stream ในการสLงชนดขUอมVลแบบ char
       ซxงคลาสท)Yงส;น;Yจะเปyนคลาสท;เปyนคลาสรากของคลาสอนๆท;จะสบทอดมา ด)งแสดงในร1ปท% 10.2 ถxงรVปท; 10.5




                                    รปท 10.2 คลาสประเภท InputStream


290   คลาสอนพJตและเอาต#พJต                                                             ผศ. ธนศา เครอไวศยวรรณ
รปท 10.3 คลาสประเภท OutputStream




                           รปท 10.4 คลาสประเภท Reader




                           รปท 10.5 คลาสประเภท Writer


ผศ. ธนศา เครอไวศยวรรณ                                      คลาสอนพJตและเอาต#พJต   291
10.1.2 คลาสประเภท Byte Stream

         ภาษาจาวาจะม;คลาสพYนฐานในการจ)ดการก)บอนพJตและเอาต#พJต ท;เปyนชนดขUอมVลแบบ byte อยVLสองคลาสท;
คVLก)นคอ InputStream และ OutputStream คลาสท)Yงสองเปyนคลาสแบบ abstract ซxงเราไมLสามารถท;จะสรUาง
อ5อบเจกต#ของคลาสท)YงสองไดU แตLคลาสท)Yงสองจะม;คลาสท;เปyน subclass ซxงจะใชUในการสรUางอ5อบเจกต#สZาหร)บการร)บ
และสLงขUอมVลแบบ byte ของโหนดท;ม;ตUนทางและปลายทางแบบตLางๆอาทเชLน
            •      FileInputStream    และ FileOutputStream เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#สZาหร)บตUนทาง
                   และปลายทางท;เปyนไฟล#
            •      ByteArrayInputStream    และ ByteArrayOutputStream เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#
                   สZาหร)บตUนทางและปลายทาง ท;เปyนอะเรย#ของชนดขUอมVลแบบ byte


10.1.3 คลาส InputStream

        คลาส InputStream จะใชUในการอLานขUอมVลของ stream ท;เปyนชนดขUอมVลแบบ byte คลาส InputStream
จะนZาขUอมVลจากโหนดตUนทางเขUามาใน stream และการอLานขUอมVลจาก stream จะเปyนการลบขUอมVลท;อานออกจาก
                                                                                             L
stream ด)งแสดงในรVปท; 10.6 โดยม;เมธอดท;ใชUสZาหร)บการอLานขUอมVลท;เปyน byte หรออะเรย#ของ byte เทLาน)นด)งน;Y
                                                                                                     Y
            •      int read()

                เปyนเมธอดท;ใชUในการอLานขUอมVลจาก stream มาหนxงไบท#โดยจะสLงคLากล)บมาเปyนคLาท;อานไดUระหวLาง 0
                                                                                              L
                ถxง 255 และจะสLงคLากล)บเปyน –1 ถUาไมLม;ขUอมVลจากโหนดตUนทาง เมธอดน;YจะสLงอ5อบเจกต#ชนด
                IOException ในกรณ;ท;ม;ขUอผดพลาดเกดขxนจากการอLานขUอมVล ต)วอยLางเชLนไฟล#ท;อLานขUอมVลเส;ย เมธอด
                                                          Y
                น;Yเปyนเมธอดแบบ abstract ซxงคลาสท;เปyน subclass จะตUองกZาหนดบล5อกคZาส)งสZาหร)บเมธอดน;Y
            •      int read(byte []b)

            เปyนเมธอดท;ใชUในการอLานขUอมVลจากโหนดตUนทางท;ละหลายไบท# โดยจะอLานขUอมVลคร)YงละไมLเกนจZานวน
            สมาชกของอะเรย#ของ argument ท;ชอ b โดยจะเก5บขUอมVลท;อLานเขUาไวUในอะเรย#ของ byte เมธอดน;จะสLง
                                                                                                     Y
            จZานวนไบท#ท;อLานไดUคนมาและจะม;คLาเปyน –1 ถUาไมLสามารถอLานขUอมVลไดU
            •      int read (byte []b, int offset, int length)

                เปyนเมธอดท;ใชUในการอLานขUอมVลจากโหนดตUนทางท;ละหลายไบท#เชLนก)น แตLจะสามารถกZาหนดตZาแหนLง
                ในการเก5บขUอมVลท;อานลงในอะเรย#ของ argument ท;ชอ b ไดU โดยเรมท;ตZาแหนLง offset และอLานคร)Yง
                                   L


292    คลาสอนพJตและเอาต#พJต                                                                 ผศ. ธนศา เครอไวศยวรรณ
ละ length ไบท# ซxงเมธอดจะสLงจZานวนขUอมVลท;อานไดUจรงคนมา การอLานขUอมVลเปyนอะเรย#ของชนด
                                                              L
                 ขUอมVล byte จะชLวยเพมประสทธภาพ ท)Yงน;จะอLานขUอมVลไดUเร5วกวLา
                                                       Y




                                        รปท 10.6 การอ%านข*อมลจาก stream

        คลาส InputStream ย)งม;เมธอดอนๆ ท;สZาค)ญอ;กด)งน;Y
             •     int available()

                   เมธอดน;YจะสLงจZานวนไบท#ท;ย)งสามารถอLานไดUจาก stream คนมา
             •     void close()

                   เมธอดน;YใชUในการปmด stream การเร;ยกใชUเมธอดจะชLวยทZาใหUลดการใชUทร)พยากรในระบบ (หนLวย
                   ความจZาหรอจZานวนไฟล#ท;เปmด)
             •     int skip(long n)

                   เมธอดน;YจะเปyนการลบขUอมVลจZานวน n ไบท#ออกจาก stream และขUามไปขUอมVลตZาแหนLงถ)ดไป
             •     void mark(int readlimit)

                   เมธอดน;YใชUระบJตZาแหนLงของขUอมVลใน stream ท;ตUองการจะระบJไวUเพอท;จะตUองการใหU stream กล)บ
                   มาท;ตZาแหนLงน;หล)งจากเร;ยกใชUเมธอด reset()
                                  Y
             •     void reset()

                   เมธอดน;YใชUเพอใหU stream กล)บมาช;YในตZาแหนLงท;ระบJไวUในเมธอด mark()
             •     boolean markSupported()

                   เมธอดน;YใชUตรวจสอบวLา stream ท;ใชUอยVLสน)บสนJนการใชUเมธอด mark() และ reset() หรอไมL




ผศ. ธนศา เครอไวศยวรรณ                                                                  คลาสอนพJตและเอาต#พJต   293
10.1.4 คลาส OutputStream

       คลาส OutputStream จะใชUการสLงขUอมVลของ stream ท;เปyนชนดขUอมVลแบบ byte การสLงขUอมVลของ
อ5อบเจกต#ชนด Outputstream จะเปyนการเพมขUอมVลลงใน stream ด)งแสดงในรVปท; 10.7 คลาส OutputStream จะ
ม;เมธอดในการสLงขUอมVลชนด byte ท;สอดคลUองก)บเมธอด read() ในคลาส InputStream โดยคลาสน;Yจะม;เมธอด
write() ท;เปyนเมธอดแบบ abstract ในรVปแบบตLางๆ ด)งน;Y


           •   void write(int i)

               เมธอดน;YใชUการเข;ยน (สLง) ขUอมVลลงใน stream โดยจะสLงขUอมVลเพ;ยงแปดบตทUายของ argument ท;ชอ
               i อาทเชLน ถUา i ม;คาเปyน 781 ก5จะเข;ยนขUอมVล 00001101 ลงใน stream ท)Yงน;เพราะ 781 ม;คLาเปyน
                                  L                                                    Y
               00000000 00000000 00000011 00001101 ในเลขฐานสอง เมธอดน;YจะสLงอ5อบเจกต#ประเภท
               IOException คนมากรณ;ท;เกดขUอผดพลาดในการเข;ยนขUอมVล


           •   void write(byte [] b)

               เมธอดน;YใชUในการเข;ยนอะเรย#ของชนดขUอมVล byte ลงใน stream ซxงเมธอดน;YอาจสLงอ5อบเจกต#ชนด
               NullPointerException ในกรณ;ท;ต)วแปรอะเรย# b ย)งไมLม;การสรUางขxYนมาโดยใชUคZาส)ง new


           •   int write (byte []b, int offset, int length)

               เมธอดน;YใชUในการเข;ยนอะเรย#ของชนดขUอมVล byte ลงใน stream โดยจะเข;ยน ขUอมVลของอะเรย#ของ
               argument ท;ชอ b ต)YงแตLตZาแหนLงท; offset ไปจZานวน length ไบท# เมธอดจะสLงจZานวนไบท#ท;
               สามารถเข;ยนลงใน stream ไดUจรงกล)บคนมา และอาจสLงอ5อบเจกต#ชนด
               IndexOutOfBoundsException เพมขxYนมาในกรณ;ท;หมายเลขของสมาชกของอะเรย#ใน argument

               ท;ชอ b ไมLอยVLในชLวงท;ถVกตUอง




                                   รปท 10.7 การเพมข*อมลลงใน stream


294   คลาสอนพJตและเอาต#พJต                                                             ผศ. ธนศา เครอไวศยวรรณ
นอกจากน;คลาส OutputStream ย)งม;เมธอดอนๆท;สZาค)ญอาทเชLน
                Y
             •   void close()

                 เปyนเมธอดท;ใชUในการปmด stream
             •   void flush()

                 เปyนเมธอดท;ใชUในกรณ;ท; stream ม;บ)ฟเฟอร# (buffer) ในการเก5บขUอมVลท;เข;ยนไวUช)วคราว ซxงการเร;ยก
                 ใชUเมธอดน;จะเปyนการเข;ยนขUอมVลท;อยVLในบ)ฟเฟอร#ลง stream
                           Y


10.1.5 คลาสประเภท Character Stream

       ภาษาจาวากZาหนดคลาสพYนฐานในการจ)ดการก)บอนพJตและเอาต#พJตท;เปyนชนดขUอมVลแบบ char อยVLสองคลาส
คอ Reader และ Writer คลาสท)Yงสองเปyนคลาสแบบ abstract โดยม; subclass ท;สบทอดมาเพอใชUในการสรUาง
อ5อบเจกต#สZาหร)บจ)ดการก)บโหนดตUนทางและปลายทางในรVปแบบตLางๆเชLน ไฟล# หนLวยความจZา และไบท# เปyนตUน
        Reader เปyนคลาสท;ใชUในการอLานขUอมVลของ stream ท;เปyนชนดขUอมVลแบบ char Reader จะม;เมธอดท;
เหมอนก)บคลาส InputStream และม;หล)กการทZางานท;สอดคลUองก)นแตLจะร)บขUอมVลหรอ argument ท;เปyนชนดขUอมVล
char โดยม;เมธอดตLางๆ ด)งน;Y

             •   int read()
             •   int read(char []c)
             •   int read(char []c, int offset, int length)
             •   void close()
             •   void skip(long n)
             •   boolean markSupported()
             •   void mark(int readAheadlimit)
             •   void reset()
             •   boolean ready()



        Writerเปyนคลาสท;ใชUในการเข;ยนขUอมVลของ stream ท;เปyนชนดขUอมVลแบบ char Writer จะม;เมธอดท;
เหมอนก)บคลาส OutputStream และม;หล)กการท;สอดคลUองก)นแตLจะร)บขUอมVลหรอ argument ท;เปyนชนดขUอมVล
char โดยม;เมธอดตLางๆ ด)งน;Y

             •   void write(int c)




ผศ. ธนศา เครอไวศยวรรณ                                                                    คลาสอนพJตและเอาต#พJต   295
•   void write(char []c)
              •   void write(char []c, int offset, int length)
              •   void close()
              •   void flush()

         นอกจากน;คลาส Writer จะม;เมธอดเพมเตมขxนมาเพอเข;ยนชนดขUอมVลท;เปyน String ด)งน;Y
                 Y                             Y
              •   void write(String s)
              •   void write(String s, int offset, int length)




10.2     โหนดสDาหรบ Stream

         ภาษาจาวากZาหนดโหนดท;เปyนตUนทางและปลายทางของ stream ไวUสามแบบคอ ไฟล# หนLวยความจZา และไปปœ
(pipe)
         •    ไฟล#คอโหนดสZาหร)บ stream ท;เปyนไฟล#สZาหร)บอLานหรอเข;ยนขUอมVลชนด byte คลาสท;เปyนโหนดแบบ
              ไฟล#สZาหร)บ byte stream คอ FileInputStream และ FileOutputStream สLวนคลาสท;เปyนโหนด
              แบบไฟล#สZาหร)บ character stream คอ FileReader และ FileWriter
         •    หนLวยความจZาคอโหนดสZาหร)บ stream ท;ใชUสZาหร)บอLานหรอเข;ยนขUอมVลท;เปyน อะเรย#หรอ String คลาส
              ท;เปyนโหนดแบบหนLวยความจZา สZาหร)บ byte stream คอ ByteArrayInputStream และ
              ByteArrayOutputStream สLวนคลาสท;เปyนโหนดแบบหนLวยความจZาสZาหร)บ character stream ใน

              ภาษาจาวาจะม;สองแบบคอ อะเรย#ของชนดขUอมVลแบบ char และ string โดยม;คลาสท;ชอ        
              CharArrayReader, CharArrayWriter, StringReader และ StringWriter ตามลZาด)บ

         •    ไปปœคอโหนดสZาหร)บ stream ท;จะสLงหรอร)บขUอมVลระหวLาง process หรอโปรแกรมเธรด อาทเชLน stream
              แบบไปปœท;เปyนเอาต#พJต (output pipe stream) ของ process หนxงอาจเชอมตLอก)บ stream แบบไปปœท;เปyนอนพJต
              (input pipe stream) ของอ;ก process หนxง คลาสท;เปyนโหนดแบบไปปœสZาหร)บ byte stream คอ
              PipedInputStream และ PipedOutputStream สLวนคลาสท;เปyนโหนดแบบไปปœสZาหร)บ character

              stream คอ PipedReader และ PipedWriter

       ตารางท; 10.1 สรJปชอคลาสท;เปyนโหนดสZาหร)บ stream ตLางๆ ของโหนดท)Yงสามแบบ และโปรแกรมท; 10.1
แสดงต)วอยLางของการก5อบป}•ขUอมVลของไฟล#หนxงไฟล#ไปย)งไฟล#อน โดยใชU byte stream โปรแกรมน;จะเปmดไฟล#ท;ม;ชอ
                                                                                        Y
ตาม argument ท;ชอ args[0] สZาหร)บอLานขUอมVลชนด byte โดยสรUางอ5อบเจกต#ของคลาส FileInputStream ท;


296      คลาสอนพJตและเอาต#พJต                                                                  ผศ. ธนศา เครอไวศยวรรณ
ชอ fin และโปรแกรมน;จะเปmดไฟล#ท;ม;ชอตาม argument ท;ชอ args[1] สZาหร)บเข;ยนขUอมVลชนด byte โดยสรUาง
                       Y
อ5อบเจกต#ของคลาส FileOutputStream ท;ชอ fout จากน)นโปรแกรมจะอLานขUอมVลจากอ5อบเจกต# fin ท;ละ 100
                                                       Y
ไบท# แลUวนZาไปเข;ยนลงในอ5อบเจกต# fout จนกระท)งไมLม;ขอมVลท;จะอLานตLอไปจxงทZาการปmดไฟล#ท)Yงสอง
                                                     U
       โปรแกรมท; 10.2 แสดงต)วอยLางของก5อปป}•ขUอมVลของไฟล#เชLนเด;ยวก)บโปรแกรมท; 10.1 แตLจะใชU character
stream โดยสรUางอ5อบเจกต#ของคลาส FileReader และ FileWriter แทน



                            ตารางท( 10.1 คลาสท%เปนโหนดส(าหร)บ stream ตางๆ




โปรแกรมท 10.1 การก5อบป}•ขUอมVลของไฟล#หนxงไฟล#ไปย)งไฟล#อนโดยใชU byte stream
                                        
  import java.io.*;

  public class FileCopy {
      public static void main(String args[]) {
          try {
              FileInputStream fin = new FileInputStream(args[0]);
              FileOutputStream fout = new FileOutputStream(args[1]);
              byte b[] = new byte[100];
              int i = fin.read(b);
              while (i != -1) {
                  fout.write(b, 0, i);
                  i = fin.read(b);
              }
              fin.close();
              fout.close();
          } catch (IOException ex) {
              ex.printStackTrace();
          }
      }
  }




ผศ. ธนศา เครอไวศยวรรณ                                                            คลาสอนพJตและเอาต#พJต   297
โปรแกรมท 10.2 การก5อบป}•ขUอมVลของไฟล#หนxงไฟล#ไปย)งไฟล#อนโดยใชU character stream
                                        
  import java.io.*;

  public class FileCopyReader {
      public static void main(String args[]) {
          try {
              FileReader fr = new FileReader(args[0]);
              BufferedReader br = new BufferedReader(fr);
              FileWriter fw = new FileWriter(args[1]);
              BufferedWriter bw = new BufferedWriter(fw);
              String line = br.readLine();
              while (line != null) {
                  bw.write(line, 0, line.length());
                  bw.newLine();
                  line = br.readLine();
              }
              br.close();
              bw.close();
          } catch (IOException ex) {
              ex.printStackTrace();
          }
      }
  }




10.3   คลาสประเภท Stream ระดบสง
        โดยท)วไปโปรแกรมภาษาจาวาจะใชUอ5อบเจกต#ประเภท stream มากกวLาหนxงอ5อบเจกต#โดยจะเชอมอ5อบเจกต#
ของ stream ตLางๆ เขUาดUวยก)นเพอใชUในการแปลงชนดขUอมVลประเภทตLางๆ ต)วอยLางเชLนรVปท; 10.8 เปyนการเชอมตLอ
อ5อบเจกต#ของคลาส FileInputStream เขUาก)บอ5อบเจกต#ของคลาส DataInputStream โดยอ5อบเจกต#ของคลาส
FileInputStream จะอLานขUอมVลของไฟล#เขUามาโดยม;ชนดขUอมVลแบบ byte สLวนอ5อบเจกต#ของคลาส

DataInputStream จะทZาการแปลงชนดขUอมVลแบบ byte ใหUเปyนชนดขUอมVลอนๆทZาใหUม;เมธอดในการอLานขUอมVล

มากขxYน การเชอมตLออ5อบเจกต#ประเภท stream สามารถทZาไดUโดยการเข;ยนคZาส)งในโปรแกรม เพอนZาอ5อบเจกต#ของ
คลาสประเภท stream ชนดหนxงไปเปyน argument ใน constructor ของคลาสประเภท stream ท;ตUองการเชอมตLอ
อาทเชLน ต)วอยLางในรVปท; 10.8 สามารถเข;ยนเปyนคZาส)งไดUด)งน;Y

       FileInputStream fin = new FileInputStream(“test.dat”);
       DataInputStream din = new DataInputStream(fin);




298    คลาสอนพJตและเอาต#พJต                                                            ผศ. ธนศา เครอไวศยวรรณ
รปท 10.8 การเช0อมต%ออ-อบเจกตของคลาส

        อ5อบเจกต#ท;ใชUในการเชอมตLอ stream จะเปyนอ5อบเจกต#ของคลาสประเภท steam ระด)บสVง (high-level stream)
ซxงสามารถท;จะอLานหรอเข;ยนขUอมVลท;เปyนชนดขUอมVลอนๆแลUวแปลงขUอมVลใหUเปyนชนดขUอมVลแบบ byte หรอม;บ)ฟเฟอร#
ในการเพมประสทธภาพในการอLานหรอเข;ยนขUอมVล คลาสเหลLาน;จะไมLสามารถอLานหรอเข;ยนขUอมVลไปย)งโหนดตUนทาง
                                                            Y
หรอปลายทางท;เปyนไฟล# หนLวยความจZา หรอ Pipe ไดUโดยตรง แตLจะร)บขUอมVลมาจาก stream อนๆ ท;เปyนคลาสพYนฐาน
ในการอLานหรอเข;ยนขUอมVลตามตารางท; 10.1 แทน ตารางท; 10.2 แสดงคลาสประเภท steam ระด)บสVงท;กZาหนดไวUใน
Java API ซxงม;คลาสท;สZาค)ญด)งน;Y

    •   DataInputStream     และ DataOutputStream
        เปyนคลาสท;ใชUในการแปลงชนดขUอมVลระหวLางชนดขUอมVลแบบ byte ก)บชนดขUอมVลแบบอนๆ
    •   BufferedInputStream      และ BufferedOutputStream
        เปyนคลาสท;ม;บ)ฟเฟอร#สZาหร)บชนดขUอมVล byte อยVLภายในเพอใหUสามารถอLานหรอเข;ยนขUอมVลขนาดใหญLไดU ซxง
        จะชLวยเพมประสทธภาพในการอLานหรอเข;ยนขUอมVล
    •   PrintStream

        เปyนคลาสท;ใชUในการเข;ยนขUอความท;เปyน String ท;แปลงมาจากชนดขUอมVลแบบ byte อ5อบเจกต# out และ
        err ท;อยVLในคลาส System เปyนต)วอยLางของอ5อบเจกต#ท;ใชUคลาสน;Y

    •   PushbackInputStream

        เปyนคลาสท;อนJญาตใหUสLงขUอมVลชนด byte ท;เพงอLานมากล)บไปย)ง stream ไดU
    •   BufferedReader     และ BufferedWriter
        เปyนคลาสท;ม;บ)ฟเฟอร#สZาหร)บชนดขUอมVลแบบ char เพอใหUสามารถอLานหรอเข;ยนขUอมVลขUอใหญLไดU
    •   InputStreamReader     และ OutputStreamWriter
        เปyนคลาสท;ใชUในการแปลงชนดขUอมVลระหวLางชนดขUอมVลแบบ char ก)บชนดขUอมVลแบบอนๆ



ผศ. ธนศา เครอไวศยวรรณ                                                             คลาสอนพJตและเอาต#พJต   299
•   PrintWriter

          เปyนคลาสท;ใชUในการเข;ยนขUอความท;เปyน String ท;แปลงมาจากชนดขUอมVลแบบ char
      •   PushbackReader

          เปyนคลาสท;อนJญาตใหUสLงขUอมVลชนด char ท;เพงอLานมากล)บไปย)ง stream ไดU

                                  ตารางท( 10.2 คลาสประเภท stream ระด)บส1ง




         การเชอมตLออ5อบเจกต#ของคลาสประเภท stream ระด)บสVงเหลLาน;สามารถท;จะเชอมตLอก)นไดUหลายๆ ช)น อาทเชLน
                                                                 Y                                Y
รVปท; 10.9 แสดงต)วอยLางของการเชอมอ5อบเจกต#ของคลาส FileInputStream เขUาก)บอ5อบเจกต#ของคลาส
BufferedInputStream เพอเพมประสทธภาพในการอLานขUอมVลแลUวจxงไปเชอมตLอก)บอ5อบเจกต#ของคลาส

DataInputStream เพอใชUในการแปลงชนดขUอมVลแบบ byte ใหUเปyนชนดขUอมVลแบบอนๆโดยจะม;รVปแบบคZาส)ง

ด)งน;Y

          FileInputStream f = new FileInputStream(“test.dat”);
          BufferedInputStream b = new BufferedInputStream(f);
          DataInputStream d = new DataInputStream(b);




300       คลาสอนพJตและเอาต#พJต                                                          ผศ. ธนศา เครอไวศยวรรณ
รปท 10.9 การเช0อมอ-อบเจกตของคลาสหลายๆ ชน

10.3.1   DataInputStream และ DataOutputStream
       คลาส DataInputStream เปyนคลาสท;ใชUในการแปลงชนดขUอมVลแบบ byte ใหUเปyนชนดขUอมVลแบบอนๆ
คลาส DataInputStream เปyนคลาสท;สบทอดมาจากคลาส FilterInputStream และ implements อนเตอร#เฟส
DataInput โดยจะม;เมธอดในการอLานชนดขUอมVลแบบตLางๆเพมขxนมาด)งน;Y
                                                      Y
             •   boolean readBoolean() throws IOException

                 เปyนเมธอดท;ใชUในการอLานชนดขUอมVลแบบ boolean มาหนxงคLา
                                                                   
             •   byte readByte() throws IOException

                 เปyนเมธอดท;ใชUในการอLานชนดขUอมVลแบบ byte มาหนxงไบท#
                                                                
             •   char readChar() throws IOException

                 เปyนเมธอดท;ใชUในการอLานชนดขUอมVลแบบ char มาหนxงต)วอ)กษร
                                                                
             •   double readDouble() throws IOException

                 เปyนเมธอดท;ใชUในการอLานชนดขUอมVลแบบ double มาหนxงคLา
                                                                  
             •   float readFloat() throws IOException

                 เปyนเมธอดท;ใชUในการอLานชนดขUอมVลแบบ float มาหนxงคLา
                                                                 
             •   int readInt() throws IOException

                 เปyนเมธอดท;ใชUในการอLานชนดขUอมVลแบบ int มาหนxงคLา
                                                               
             •   long readLong() throws IOException

                 เปyนเมธอดท;ใชUในการอLานชนดขUอมVลแบบ long มาหนxงคLา
                                                                
             •   short readShort() throws IOException

                 เปyนเมธอดท;ใชUในการอLานชนดขUอมVลแบบ short มาหนxงคLา
                                                                 
             •   String readUTF() throws IOException

                 เปyนเมธอดท;ใชUในการอLานชนดขUอมVลแบบ String มาหนxงคLาโดยใชUรVปแบบการเขUารหUสขUอมVลเปyน
                                                                  



ผศ. ธนศา เครอไวศยวรรณ                                                           คลาสอนพJตและเอาต#พJต   301
UTF-8

      คลาส DataOutputStream เปyนคลาสท;ใชUในการแปลงชนดขUอมVลใดๆมาเปyนชนดขUอมVลแบบ byte
DataOutputStream เปyนคลาสท;สบทอดมาจากคลาส FilterOutputStream และ implements อนเตอร#เฟส

DataOutput โดยจะม;เมธอดในการอLานชนดขUอมVลแบบตLางๆ เพมขxYนมาด)งน;Y



           •   void writeBoolean(boolean b) throws IOException

               เปyนเมธอดท;ใชUในการเข;ยนชนดขUอมVลแบบ boolean หนxงคLา
                                                                
           •   void writeByte(int b) throws IOException

               เปyนเมธอดท;ใชUในการเข;ยนชนดขUอมVลแบบ byte หนxงไบท#
                                                             
           •   void writeBytes(String s) throws IOException

               เปyนเมธอดท;ใชUในการเข;ยนชนดขUอมVลแบบ String หนxงคLา
                                                               
           •   void writeChar(int c) throws IOException

               เปyนเมธอดท;ใชUในการเข;ยนชนดขUอมVลแบบ char หนxงต)วอ)กขระ
                                                             
           •   void writeDouble(double b) throws IOException

               เปyนเมธอดท;ใชUในการเข;ยนชนดขUอมVลแบบ double หนxงคLา
                                                               
           •   void writeFloat(float f) throws IOException

               เปyนเมธอดท;ใชUในการเข;ยนชนดขUอมVลแบบ float หนxงคLา
                                                              
           •   void writeInt(int i) throws IOException

               เปyนเมธอดท;ใชUในการเข;ยนชนดขUอมVลแบบ int หนxงคLา
                                                            
           •   void writeLong(long l) throws IOException

               เปyนเมธอดท;ใชUในการเข;ยนชนดขUอมVลแบบ long หนxงคLา
                                                             
           •   void writeShort(int s) throws IOException

               เปyนเมธอดท;ใชUในการเข;ยนชนดขUอมVลแบบ short หนxงคLา
                                                              
           •   void writeUTF(String s) throws IOException

               เปyนเมธอดท;ใชUในการเข;ยนชนดขUอมVลแบบ String หนxงคLาโดยใชUรVปแบบการเขUารห)สแบบ UTF-8
                                                               

        โปรแกรมท; 10.3 แสดงต)วอยLางของการใชUคลาส DataOutputStream เพอเก5บชนดขUอมVลแบบตLางๆ ลงใน
ไฟล# สLวนโปรแกรมท; 10.4 แสดงต)วอยLางของการใชUคลาส DataInputStream เพอนZาขUอมVลท;เก5บไวUในไฟล#ด)งกลLาว


302   คลาสอนพJตและเอาต#พJต                                                           ผศ. ธนศา เครอไวศยวรรณ
มาแสดงผล โดยจะไดUผลล)พธ#ด)งแสดงในรVปท; 10.4
โปรแกรมท 10.3 ต)วอยางของการใชคลาส DataOutputStream

  import java.io.*;

  public class DataWriterDemo {
      public static void main(String args[]) {
          try {
              FileOutputStream fout = new FileOutputStream("c:/data.dat");
              DataOutputStream dout = new DataOutputStream(fout);
              dout.writeInt(124);
              dout.writeDouble(2.45);
              dout.writeChar('a');
              dout.writeUTF("test");
              dout.close();
          } catch (IOException ex) {
              ex.printStackTrace();
          }
      }
  }




โปรแกรมท 10.4 ต)วอยางของการใชคลาส DataInputStream

  import java.io.*;

  public class DataReaderDemo {
      public static void main(String args[]) {
          try {
              FileInputStream fin = new FileInputStream("c:/data.dat");
              DataInputStream 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();
          } catch (IOException ex) {
              System.out.println(ex.toString());
          }
      }
  }




ผศ. ธนศา เครอไวศยวรรณ                                          คลาสอนพJตและเอาต#พJต   303
รปท 10.10 ผลลพธทได*จากการรนโปรแกรมท 10.3 และโปรแกรมท 10.4


10.3.2   InputStreamReader และ OutputStreamWriter


      เราสามารถท;จะแปลง stream ระหวLางชนดขUอมVลแบบ byte และชนดขUอมVลแบบ char ไดUโดยใชUคลาส
InputStreamReader ซxงจะอLานชนดขUอมVลแบบ byte แลUวแปลงเปyนชนดขUอมVลแบบ char และคลาส

OutputStreamWriter ซxงจะอLานชนดขUอมVลแบบ char แลUวแปลงเปyนชนดขUอมVลแบบ byte

      โปรแกรมท; 10.5 แสดงต)วอยLางของการใชUคลาสด)งกลLาว เพอเก5บขUอความลงในไฟล#ท;เปyนชนดขUอมVลแบบ
byte โปรแกรมน;YจะสรUางอ5อบเจกต#ของคลาส FileOutputStream แลUวนZาไปเชอมตLอก)บอ5อบเจกต#ของคลาส

OutputStreamWriter เพอจะแปลงชนดขUอมVลแบบ char ใหUมาเปyนชนดขUอมVลแบบ byte สLวนอ5อบเจกต#ของ

คลาส PrintWriter ท;เชอมตLอก)บอ5อบเจกต#ของคลาส OutputStreamWriter จะทZาหนUาท;แปลงชนดขUอมVลแบบ
String ใหUเปyนชนดขUอมVลแบบ char สLวนโปรแกรมท% 11.6 จะเปyนต)วอยLางในการอLานขUอมVลจากไฟล#แลUวมาแสดง

ผลโดยใชUอ5อบเจกต#ของคลาส BufferedReader




304   คลาสอนพJตและเอาต#พJต                                                       ผศ. ธนศา เครอไวศยวรรณ
โปรแกรมท 10.5 ต)วอยางของการใชคลาสเพอเก9บขอความลงในไฟล

  import java.io.*;

  public class FileWriter {
      public static void main(String args[]) {
          String line1 = "This is a test message";
          String line2 = "This is another line";
          try {
              FileOutputStream fout = new FileOutputStream("c:data.dat");
              OutputStreamWriter oout = new OutputStreamWriter(fout);
              PrintWriter p = new PrintWriter(oout);
              p.println(line1);
              p.println(line2);
              p.close();
          } catch (IOException ex) {
              ex.printStackTrace();
          }
      }
  }




10.4    คลาส File

       คลาสท;ชอ File เปyนคลาสท;อยVLในแพคเก5จ java.io เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เปyนไฟล#หรอ
                
ไดเร5กทอร; คลาส File จะม;เมธอดในการจ)ดการก)บไฟล#หรอไดเร5กทอร; และเมธอดในการสบคUนขUอมVลตLางๆ อยVLหลาย
เมธอด อ5อบเจกต#ของคลาส File จะสรUางมาจาก constructor ท;ม;รVปแบบด)งน;Y
        •    public File(String name)
        •    public File(String dir, String name)
        •    public File(File dir, String name)

        โดยท;
        •    name   คอชอของไฟล#หรอไดเร5กทอร;ท;ตUองการเปmดขxนมา
                                                              Y
        •    dir   คอชอของไดเร5กทอร;ในกรณ;ท;ไฟล#หรอไดเร5กทอร;นนอยVLภายในไดเร5กทอร;อน
                                                                  )Y

      ในกรณ;ท;ไมLพบไฟล#หรอไดเร5กทอร;ตามชอท;ระบJ constructor จะสLงอ5อบเจกต#ของคลาส
FileNotFoundException เพอระบJวLาม;ขUอผดพลาดจากการเปmดไฟล#หรอไดเร5กทอร;




ผศ. ธนศา เครอไวศยวรรณ                                                                คลาสอนพJตและเอาต#พJต   305
โปรแกรมท 10.6 ต)วอยางของการใชคลาสเพออานขอม1ลจากไฟล
 import java.io.*;

 public class FileReader {
     public static void main(String args[]) {
         try {
             FileInputStream fin = new FileInputStream("c:data.dat");
             InputStreamReader in = new InputStreamReader(fin);
             BufferedReader bin = new BufferedReader(in);
             System.out.println(bin.readLine());
             System.out.println(bin.readLine());
             bin.close();
         } catch (IOException ex) {
             ex.printStackTrace();
         }
     }
 }




      เมธอดของคลาส File ท;ใชUในการสบคUนขUอมVลหรอจ)ดการก)บไฟล#ท;สZาค)ญม;ด)งน;Y
      •    boolean exists()

           เปyนเมธอดท;ใชUในการตรวจสอบวLาไฟล#หรอไดเร5กทอร;วาม;ปรากฏอยVLจรงหรอไมL
                                                            L
      •    boolean isDirectory()

           เปyนเมธอดท;ใชUในการตรวจสอบวLาอ5อบเจกต#ของคลาส File น;Yเปyนไดเร5กทอร;หรอไมL
      •    boolean isFile()

           เปyนเมธอดท;ใชUในการตรวจสอบวLาอ5อบเจกต#ของคลาส File น;Yเปyนไฟล#หรอไมL
      •    boolean canRead()

           เปyนเมธอดท;ใชUในการตรวจสอบวLาไฟล#น;YสามารถใชUในการอLานขUอมVลไดUหรอไมL
      •    boolean canWrite()

           เปyนเมธอดท;ใชUในการตรวจสอบวLาไฟล#น;YสามารถใชUในการเข;ยนขUอมVลไดUหรอไมL
      •    String getName()

           เปyนเมธอดท;ใชUในการเร;ยกดVชอไฟล#หรอไดเร5กทอร;ของอ5อบเจกต#ของคลาส File น;Y
                                                          
      •    String getParent()




306   คลาสอนพJตและเอาต#พJต                                                           ผศ. ธนศา เครอไวศยวรรณ
เปyนเมธอดท;ใชUในการเร;ยกดVชอไดเร5กทอร;รากของอ5อบเจกต#ของคลาส File น;Y
                                         
        •    String []list()

             เปyนเมธอดท;ใชUในการเร;ยกดVชอไฟล#หรอไดเร5กทอร;ยLอยท)Yงหมด ท;อยVLในอ5อบเจกต#ของคลาส File น;ใน
                                                                                                          Y
             กรณ;ท;เปyนไดเร5กทอร;
        •    boolean mkdir()

             เปyนเมธอดท;ใชUในการสรUางไดเร5กทอร;ยLอย
        •    boolean renameTo(File newName)

             เปyนเมธอดท;ใชUในการเปล;ยนชออ5อบเจกต#ของคลาส File น;YใหUเปyนชอใหมLตามท;ระบJไวUในอ5อบเจกต#ของ
                                                                                       
             argument ท;ชอ newName


        คลาส File สามารถใชUในการจ)ดการก)บการเปmดไฟล#เพอตรวจสอบวLาม;ไฟล#ด)งกลLาวหรอไมL ซxง constructor
ของคลาส FileInputStream และ FileOutputStream หรอ FileReader และ FileWriter จะม;รVปแบบท;
ม; argument เปyนอ5อบเจกต#ของคลาส File เพอชLวยในการตรวจสอบไฟล#กLอนท;จะใชUในการอLานหรอเข;ยนขUอมVลด)ง
ต)วอยLางตLอไปน;Y
                 File f = new File(“Test.dat”);
                 if (f.exists()) {
                        FileInputStream fir = new FileInputStream(f);
                 }




10.4.1 คลาส RandomAccessFile

       ภาษาจาวาม;คลาสท;สน)บสนJนการอLานหรอเข;ยนไฟล#เปyนแบบ random access กลLาวคอไมLจZาเปyนจะตUอง
อLานหรอเข;ยนขUอมVลของไฟล#เร;ยงตามลZาด)บจากตZาแหนLงแรกสJดไปย)งตZาแหนLงสJดทUายของไฟล# คลาสประเภทน;คอ
                                                                                                Y
คลาส RandomAccessFile ซxงจะใชUเวลาในการอLานหรอเข;ยนขUอมVลในตZาแหนLงตLางๆเทLาก)น คลาส
RandomAccessFile จะม; constructor อยVLสองรVปแบบด)งน;Y

        •    public RandomAccessFile(String name, String mode)
        •    public RandomAccessFile(File file, String mode)

        โดยท;



ผศ. ธนศา เครอไวศยวรรณ                                                               คลาสอนพJตและเอาต#พJต   307
•    name   คอชอของไฟล#
         •    file   คออ5อบเจกต#ของคลาสไฟล#
         •    mode   คอรVปแบบในการเปmดไฟล#ท;ม;ด)งน;Y “r” เปyนการเปmดไฟล#หรออLานขUอมVลหรอ “rw” เปyนการเปmด
              ไฟล#เพออLานและเข;ยนขUอมVล

         ต)วอยLางเชLนคZาส)ง
                  RandomAccessFile myFile = new RandomAccessFile(“test.dbf”,”rw”);

         เปyนการเปmดไฟล#ท;ชอ test.dbf สZาหร)บการอLานและเข;ยนขUอมVล

        คลาส RandomAccessFile จะม;เมธอดสZาหร)บการอLานและเข;ยนขUอมVลท;เปyนชนดขUอมVลแบบพYนฐานชนด
ตLางๆ คลUายก)บคลาส DataInputStream และ DataOutputStream และม;เมธอดอนๆท;สZาค)ญเพมเตมมาด)งน;Y
         •    long getFilePointer()

              เปyนเมธอดท;ใชUในการเร;ยกดVตZาแหนLงช;Yของไฟล#
         •    void seek(long pos)

              เปyนเมธอดท;ใชUในการเลอนตZาแหนLงช;Yของไฟล#ไปท;ตZาแหนLง pos
         •    long length()

              เปyนเมธอดท;ใชUในการเร;ยกดVความยาวของไฟล#


10.4.2       ObjectInputStream          และ ObjectOutputStream

       ภาษาจาวาม;คลาสท;ใชUในการร)บและสLงขUอมVลของอ5อบเจกต# ObjectInputStream และ
ObjectOutputStream ท)Yงน;อ5อบเจกต#ท;จะสามารถสLงผLาน stream เหลLาน;ไดUจะตUองเปyนอ5อบเจกต#ของคลาสท;
                              Y                                             Y
implements อนเตอร#เฟส Serializable ซxงเปyนอนเตอร#เฟสในแพคเก5จ java.io ซxงไมLม;เมธอดใดๆ อยVL แตLจะ

เปyนอนเตอร#เฟสท;ใชUระบJวา อ5อบเจกต#ด)งกลLาวสามารถเก5บขUอมVลหรอดxงขUอมVลของอ5อบเจกต#กล)บคนมาไดU อ5อบเจกต#ท;
                         L
สามารถเก5บหรอดxงขUอมVลไดUเปyนอ5อบเจกต#ประเภทท;เร;ยกวLา persistence ซxงขUอมVลท;จะเก5บหรอเร;ยกดVไดUจะม;เฉพาะ
คJณล)กษณะของอ5อบเจกต#หรอคJณล)กษณะของคลาสเทLาน)น สLวนเมธอดจะไมLสามารถเก5บไดU
                                                     Y



308    คลาสอนพJตและเอาต#พJต                                                               ผศ. ธนศา เครอไวศยวรรณ
อ5อบเจกต#บางประเภทจะไมLสามารถท;จะ implements อนเตอร#เฟส Serializable ไดU เนองจากขUอมVลของ
อ5อบเจกต#อาจเปล;ยนแปลงไดUตลอดเวลา อาทเชLน อ5อบเจกต#ของคลาส Thread หรอ FileInputStream ในกรณ;ท;
อ5อบเจกต#ใดเปyนอ5อบเจกต#ประเภท Serializable แลUวม;สมาชกท;เปyนอ5อบเจกต#ประเภท non-serializable อยVL การ
เก5บหรอเร;ยกดVขUอมVลของอ5อบเจกต#จะไมLสามารถทZาไดUและจะเกดขUอผดพลาดประเภท
NotSerializableException ขxYนมา

         เราสามารถจะระบJคณล)กษณะของอ5อบเจกต#หรอคJณล)กษณะของคลาสท;ไมLตUองการจะเก5บหรอเร;ยกดVขUอมVล
                         J
ผLาน stream ไดUโดยการระบJใหUคJณล)กษณะด)งกลLาวม; modifier เปyนค;ย#เวร#ด transient ต)วอยLางเชLน

                 public class Student implements Serializable {
                        private String id,name;
                        private double gpa;
                        private transient String parent;
                 }



        เปyนคลาสท;ม;ค;ย#เวร#ด transient ในคJณล)กษณะชอ parent ซxงจะม;ผลทZาใหUคJณล)กษณะน;YไมLสามารถเก5บ
หรอเร;ยกดVขUอมVลผLาน stream ค;ย#เวร#ด transient สามารถใชUก)บคJณล)กษณะท;เปyนอ5อบเจกต#ประเภท non-
serializable เพอป‚องก)นไมLใหUเกดขUอผดพลาดในการเก5บหรอเร;ยกดVขUอมVลเชLน
                 public class Student implements Serializable {
                        public transient Thread myThread;
                        private String id,name;
                        private double gpa;
                 }

         คลาส ObjectOutputStream เปyนคลาสท;ใชUในการเข;ยนอ5อบเจกต#ใดๆลงใน stream โดยม;เมธอด
writeObject() ท;ใชUในการเข;ยนขUอมVล สLวนคลาส ObjectInputStream เปyนคลาสท;ใชUในการร)บอ5อบเจกต#ใดๆ

มาจาก stream โดยม;เมธอด readObject() ท;ใชUในการอLานขUอมVลซxงจะไดUอ5อบเจกต#ของคลาสท;ชอ Object คนมา
ด)งน)นจxงจZาเปyนท;จะตUองทZาการ casting อ5อบเจกต#ใหUสอดคลUองก)บชนดขUอมVลของคลาสท;ตUองการ โปรแกรมท; 10.6
     Y
แสดงต)วอยLางของการเข;ยนและอLานขUอมVลของอ5อบเจกต#ลงในไฟล# data.dat โดยจะใหUผลล)พธ#ด)งแสดงในร1ปท% 10.3




ผศ. ธนศา เครอไวศยวรรณ                                                            คลาสอนพJตและเอาต#พJต   309
โปรแกรมท 10.7 การเข%ยนและอานขอม1ลของอ9อบเจกตลงในไฟล

 import java.io.*;

 public class ObjectPersistenceDemo {
     public static void main(String args[]) {
         Student s = new Student("451442-1", "Somchai", 3.21);
         try {
             FileOutputStream fout = new FileOutputStream("c:/data.dat");
             ObjectOutputStream oout = new ObjectOutputStream(fout);
             oout.writeObject(s);
             System.out.println("Write to file successfully");
             oout.close();

                   FileInputStream fin = new FileInputStream("c:/data.dat");
                   ObjectInputStream oin = new ObjectInputStream(fin);
                   Student s2 = (Student) oin.readObject();
                   oin.close();

                s2.showAllDetails();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
      }
 }




                             รปท 10.11 ผลลพธทได*จากการรนโปรแกรมท 10.6



สร"ปเน-อหาของบท

      • stream เปร(ยบเสมอนทอสงขอม)ล สามารถแบงออกไดเป$น 2 ประเภทคอ byte stream และ character
        stream
      • byte stream ม%คลาสพนฐานคอ คลาส InputStream และ OutputStream



310   คลาสอนพJตและเอาต#พJต                                                  ผศ. ธนศา เครอไวศยวรรณ
• character stream ม%คลาสพนฐานคอ คลาส Reader และ Writer
         •   คลาส InputStream และ OutputStream เปน low-level stream ท%สามารถอานหรอเข%ยนขอม1ล
             ชนด byte ไดเทาน)น
         •   คลาส Reader และ Writer เปน low-level stream ท%สามารถอานหรอเข%ยนขอม1ลชนด char ได
             เทาน)น
         •   คลาสท%เปน high-level stream ส(าหร)บ byte stream จะสบทอดมาจากคลาส FilterInputStream
             หรอ FilterOutputStream
         •   คลาสท%เปน high-level stream ส(าหร)บ character stream คอคลาส BufferedReader,
             BufferedWriter, InputStreamReader, OutputStreamReader, LineNumberReader,
             PrintWriter     และ PushbackReader
         •   การเชอมตอ stream หลายช)น จะท(าใหสามารถเร%ยกใชเมธอดไดหลายร1ปแบบตามความตองการในการ
             ใชงาน
         •   คลาส File ใชในการสรางอ9อบเจกตของไฟลหรอไดเร9กทอร% โดยจะม%เมธอดท%ใชในการจ)ดการก)บไฟล
         •   คลาส RandomAccessFile จะม%ร1ปแบบในการอานและเข%ยนขอม1ลเปนแบบ random access
         •   อ5อบเจกต#ท;จะสามารถร)บหรอสLงผLาน stream ไดUจะตUองเปyนอ5อบเจกต#ของคลาสท; implements
             อนเตอร#เฟส Serializable




ผศ. ธนศา เครอไวศยวรรณ                                                      คลาสอนพJตและเอาต#พJต   311

More Related Content

PDF
Compitition
PDF
ความรู้เบื้องต้นเกี่ยวกับคอมพิวเตอร์กราฟิก
PDF
Lesson1.1
DOCX
แผนการจัดการเรียนรู้ที่1
PDF
หนังสือ Yii framework 2 Web Application Basic ฉบับพื้นฐาน
PDF
ตัวอย่าง Workshop โปรแกรม Photoshop
PDF
Lesson 1.1 Photoshop
DOCX
แผนการจัดการเรียนรู้ที่5
Compitition
ความรู้เบื้องต้นเกี่ยวกับคอมพิวเตอร์กราฟิก
Lesson1.1
แผนการจัดการเรียนรู้ที่1
หนังสือ Yii framework 2 Web Application Basic ฉบับพื้นฐาน
ตัวอย่าง Workshop โปรแกรม Photoshop
Lesson 1.1 Photoshop
แผนการจัดการเรียนรู้ที่5

What's hot (6)

DOCX
แผนการจัดการเรียนรู้ที่4
DOCX
แผนการจัดการเรียนรู้ที่6
DOCX
แผนการจัดการเรียนรู้ที่9
DOCX
แผนการจัดการเรียนรู้ที่3
PDF
ความรู้เบื้องต้นเกี่ยวกับคอมพิวเตอร์
DOCX
แผนการจัดการเรียนรู้ที่2
แผนการจัดการเรียนรู้ที่4
แผนการจัดการเรียนรู้ที่6
แผนการจัดการเรียนรู้ที่9
แผนการจัดการเรียนรู้ที่3
ความรู้เบื้องต้นเกี่ยวกับคอมพิวเตอร์
แผนการจัดการเรียนรู้ที่2
Ad

Viewers also liked (6)

PPT
Java Development with MongoDB (James Williams)
PDF
Griffon for the Enterprise
PPT
Using MongoDB With Groovy
PPT
Ratpack - Classy and Compact Groovy Web Apps
PDF
Introduction to Griffon
PPTX
วิธีใช้ Git เบื้องต้น
Java Development with MongoDB (James Williams)
Griffon for the Enterprise
Using MongoDB With Groovy
Ratpack - Classy and Compact Groovy Web Apps
Introduction to Griffon
วิธีใช้ Git เบื้องต้น
Ad

Similar to Intermediate Java Programming Language (in Thai) (20)

PDF
Hand-on Exercise Java Web Programming
PDF
Java Web Programming Using NetBeans 6.5
PDF
Java Web Programming [Servlet/JSP] Using GlassFish and NetBeans
PDF
Java Web programming Using NetBeans
PDF
PDF
การเขียนรายงานโครงงานคอมพิวเตอร์
PDF
การเขียนรายงานโครงงานคอมพิวเตอร์
PDF
การเขียนรายงานโครงงานคอมพิวเตอร์
PDF
การเขียนรายงานโครงงานคอมพิวเตอร์
PDF
Java Web programming Using Eclipse
PDF
webprogramming eclipse-jsp
PDF
Java Web Programming (JSP/Servlet) Using Eclipse and Tomcat
PDF
การเขียนรายงานโครงงานคอมพิวเตอร์
PDF
การเขียนรายงานโครงงานคอมพิวเตอร์
PDF
การเขียนรายงานโครงงานคอมพิวเตอร์
PDF
การเขียนรายงานโครงงานคอมพิวเตอร์
PDF
การเขียนรายงานโครงงานคอมพิวเตอร์
PDF
ใบงานที่ 1
PDF
Microsoft Office Word 2007
Hand-on Exercise Java Web Programming
Java Web Programming Using NetBeans 6.5
Java Web Programming [Servlet/JSP] Using GlassFish and NetBeans
Java Web programming Using NetBeans
การเขียนรายงานโครงงานคอมพิวเตอร์
การเขียนรายงานโครงงานคอมพิวเตอร์
การเขียนรายงานโครงงานคอมพิวเตอร์
การเขียนรายงานโครงงานคอมพิวเตอร์
Java Web programming Using Eclipse
webprogramming eclipse-jsp
Java Web Programming (JSP/Servlet) Using Eclipse and Tomcat
การเขียนรายงานโครงงานคอมพิวเตอร์
การเขียนรายงานโครงงานคอมพิวเตอร์
การเขียนรายงานโครงงานคอมพิวเตอร์
การเขียนรายงานโครงงานคอมพิวเตอร์
การเขียนรายงานโครงงานคอมพิวเตอร์
ใบงานที่ 1
Microsoft Office Word 2007

More from Thanachart Numnonda (20)

PDF
Thailand Digital Industry Survey Result 2021
PDF
ประวัติ (ศาสตร์) อันแสนสุขของ แถมสุข
PDF
Planning on Mobile Strategy
PDF
ข้อบังคับ สมาคมสถาปนิกเทคโนโลยีสารสนเทศประเทศไทย
PDF
Software Trends Towards AEC 2015
PDF
Personal Cloud
PDF
How would cloud computing Effect to Software Industry?
PDF
Impact of cloud computing to Asian IT Industry
PDF
พิชิตคู่แข่ง แซงหน้าด้วยไอที ยุคใหม่
PDF
รายชื่อผู้สมควรได้รับใบประกาศเกียรติคุณโครงการวิทยาศาสตร์สู่ความเป็นเลิศ]
PDF
พิชิตคู่แข่ง แซงหน้าด้วยไอที ยุคใหม่
PDF
ไอซีทีกับการเปลี่ยนแปลงของสังคมไทย
PDF
Cloud Computing กับการใช้งานในองค์กรต่างๆ
PDF
3G กับอนาคต ธุรกิจแอพพลิเคชันในเมืองไทย
PDF
บทความ Google vs. Android
PDF
IT trends for co-creation
PDF
Technology Trends & The Impact for Software Industry
PDF
อยากอยู่ 110 ปี
PDF
Java Programming: คลาสอินพุตและเอาต์พุต
Thailand Digital Industry Survey Result 2021
ประวัติ (ศาสตร์) อันแสนสุขของ แถมสุข
Planning on Mobile Strategy
ข้อบังคับ สมาคมสถาปนิกเทคโนโลยีสารสนเทศประเทศไทย
Software Trends Towards AEC 2015
Personal Cloud
How would cloud computing Effect to Software Industry?
Impact of cloud computing to Asian IT Industry
พิชิตคู่แข่ง แซงหน้าด้วยไอที ยุคใหม่
รายชื่อผู้สมควรได้รับใบประกาศเกียรติคุณโครงการวิทยาศาสตร์สู่ความเป็นเลิศ]
พิชิตคู่แข่ง แซงหน้าด้วยไอที ยุคใหม่
ไอซีทีกับการเปลี่ยนแปลงของสังคมไทย
Cloud Computing กับการใช้งานในองค์กรต่างๆ
3G กับอนาคต ธุรกิจแอพพลิเคชันในเมืองไทย
บทความ Google vs. Android
IT trends for co-creation
Technology Trends & The Impact for Software Industry
อยากอยู่ 110 ปี
Java Programming: คลาสอินพุตและเอาต์พุต

Intermediate Java Programming Language (in Thai)

  • 1. Java 101: Intermediate Java Programming Language หลกสตร Mini Master of Java Technology ผศ.ธนศา เครอไวศยวรรณ คณะเทคโนโลยสารสนเทศ สถาบนเทคโนโลยพระจอมเกล!าเจ!าค"ณทหารลาดกระบง ผศ. ธนศา เครอไวศยวรรณ Java Programming i
  • 2. สารบญ บทท 1 ความรเบองตนภาษาจาวา.......................................................................................................................................1 1.1 ระบบคอมพวเตอร#เบราว#เซอร#.................................................................................................................................1 1.2 ภาษาคอมพวเตอร#....................................................................................................................................................2 1.3 ต)วแปลภาษา ............................................................................................................................................................6 1.4 หล)กการของโปรแกรมเชงอ5อบเจกต# ......................................................................................................................7 1.5 ประว)ตภาษาจาวา.....................................................................................................................................................9 1.6 เทคโนโลย;จาวา......................................................................................................................................................10 1.6.1 Java Virtual Machine....................................................................................................................................11 1.6.2 Java Runtime Environment...........................................................................................................................12 1.6.3 Java Development Kit...................................................................................................................................13 1.7 จJดเดLนของภาษาจาวา.............................................................................................................................................15 1.8 แพลตฟอร#มของเทคโนโลย;จาวา...........................................................................................................................16 1.8.1 Java Platform, Standard Edition...................................................................................................................18 1.8.2 Java Platform, Enterprise Edition.................................................................................................................18 1.8.3 Java Platform, Micro Edition........................................................................................................................19 1.9 โปรแกรมภาษาจาวา...............................................................................................................................................20 1.9.1 การสรUางโปรแกรมจาวาประยJกต#..................................................................................................................20 1.9.2 การสรUางโปรแกรมจาวาแอปเพล5ต................................................................................................................22 1.10 คVLมอ Java API......................................................................................................................................................24 สรJปเนYอหาของบท.......................................................................................................................................................25 บทท 2 พนฐานโปรแกรมภาษาจาวา.................................................................................................................................27 2.1 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต#..........................................................................................................27 2.2 ไวยากรณ#ระด)บของคZา...........................................................................................................................................29 2.2.1 คอมเม5นต# ......................................................................................................................................................29 2.2.2 Identifier........................................................................................................................................................30 2.2.3 ค;ย#เวร#ด...........................................................................................................................................................31 ii Java Programming ผศ. ธนศา เครอไวศยวรรณ
  • 3. 2.2.4 ส)ญล)กษณ#แยกคZา...........................................................................................................................................32 2.2.5 ชLองวLาง .........................................................................................................................................................33 2.2.6 ขUอมVลคLาคงท;. .................................................................................................................................................33 2.3 ชนดขUอมVลแบบพYนฐาน.........................................................................................................................................33 2.3.1 ชนดขUอมVลตรรกะ..........................................................................................................................................35 2.3.2 ชนดขUอมVลต)วอ)กขระ.....................................................................................................................................35 2.3.3 ชนดขUอมVลต)วเลขจZานวนเต5ม ........................................................................................................................36 2.3.4 ชนดขUอมVลต)วเลขทศนยม..............................................................................................................................37 2.4 ต)วแปรและคLาคงท;.................................................................................................................................................38 2.4.1 คZาส)งกZาหนดคLา .............................................................................................................................................39 2.4.2 คLาคงท;. ...........................................................................................................................................................41 2.4.3 ขอบเขตของต)วแปรและคLาคงท;....................................................................................................................42 2.5 ต)วดZาเนนการ .........................................................................................................................................................45 2.5.1 ต)วดZาเนนการทางคณตศาสตร#.......................................................................................................................46 2.5.2 ต)วดZาเนนการแบบส)มพ)นธ#............................................................................................................................48 2.5.3 ต)วดZาเนนการทางตรรกศาสตร#......................................................................................................................50 2.5.4 ต)วดZาเนนการแบบบต....................................................................................................................................52 2.5.5 ลZาด)บความสZาค)ญของต)วดZาเนนการ..............................................................................................................53 2.6 การแปลงชนดขUอมVล..............................................................................................................................................54 2.6.1 การแปลงขUอมVลในคZาส)งกZาหนดคLา...............................................................................................................55 2.6.2 Typecasting...................................................................................................................................................57 2.7 ชนดขUอมVลแบบอUางอง...........................................................................................................................................58 2.7.1 คลาส String...................................................................................................................................................60 2.7.2 คลาส Math...................................................................................................................................................62 2.8 คZาส)งอนพJตและเอาต#พJต........................................................................................................................................64 2.8.1 System.out.println()......................................................................................................................................64 2.8.2 การร)บขUอมVลเขUามาทาง Command Line.......................................................................................................65 สรJปเนYอหาของบท.......................................................................................................................................................66 บทท 3 โครงสรางควบค%ม.................................................................................................................................................69 ผศ. ธนศา เครอไวศยวรรณ Java Programming iii
  • 4. 3.1 คZาส)งโครงสรUางควบคJม.........................................................................................................................................69 3.2 โครงสรUางแบบเลอกทZา..........................................................................................................................................70 3.2.1 คZาส)ง if...........................................................................................................................................................70 3.2.2 คZาส)ง if..else..................................................................................................................................................72 3.2.3 คZาส)ง if แบบซUอน..........................................................................................................................................74 3.2.4 คZาส)ง switch..................................................................................................................................................78 3.3 โครงสรUางแบบทZาซYZา .............................................................................................................................................80 3.3.1 คZาส)ง while....................................................................................................................................................81 3.3.2 คZาส)ง do..while..............................................................................................................................................83 3.3.3 คZาส)ง for........................................................................................................................................................84 3.4 โครงสรUางแบบซUอน (Nested Structure)................................................................................................................86 3.4.1 คZาส)ง break, continue และ label ...............................................................................................................88 สรJปเนYอหาของบท.......................................................................................................................................................90 บทท 4 หลกการเช,งอ-อบเจกต.............................................................................................................................................93 4.1 องค#ประกอบของโปรแกรมเชงอ5อบเจกต#.............................................................................................................93 4.1.1 อ5อบเจกต#.......................................................................................................................................................93 4.1.2 คลาส..............................................................................................................................................................94 4.1.3 คJณล)กษณะ ...................................................................................................................................................95 4.1.4 เมธอด...........................................................................................................................................................97 4.2 การเข;ยนโปรแกรมเชงอ5อบเจกต#โดยใชUภาษาจาวา...............................................................................................98 4.2.1 การประกาศคลาส..........................................................................................................................................98 4.2.2 การประกาศคJณล)กษณะ................................................................................................................................99 4.2.3 การประกาศเมธอด........................................................................................................................................99 4.2.4 การประกาศและสรUางอ5อบเจกต#..................................................................................................................101 4.2.5 การเร;ยกใชUสมาชกของอ5อบเจกต#................................................................................................................102 4.3 คJณล)กษณะเดLนของโปรแกรมเชงอ5อบเจกต#........................................................................................................104 4.3.1 การหLอหJUม ...................................................................................................................................................104 4.3.2 การสบทอด ................................................................................................................................................106 iv Java Programming ผศ. ธนศา เครอไวศยวรรณ
  • 5. 4.3.3 การม;ไดUหลายรVปแบบ..................................................................................................................................107 4.4 การเข;ยนโปรแกรมเชงอ5อบเจกต#เพอสรUางคลาสแบบ abstract และอนเตอร#เฟส................................................109 4.4.1 คลาสแบบ abstract......................................................................................................................................109 4.4.2 อนเตอร#เฟส.................................................................................................................................................111 4.5 แพคเก5จ................................................................................................................................................................113 4.5.1 การประกาศและใชUแพคเก5จ........................................................................................................................114 4.6Unified Modeling Language................................................................................................................................115 4.6.1 ไดอะแกรมของคลาส .................................................................................................................................116 4.6.2 ไดอะแกรมของอ5อบเจกต#............................................................................................................................116 4.7 ข)นตอนการพ)ฒนาโปรแกรม...............................................................................................................................117 Y สรJปเนYอหาของบท.....................................................................................................................................................119 บทท 5 การสรางส0วนต0อประสานกราฟ3กกบผใช............................................................................................................121 5.1 Java Foundation Class ........................................................................................................................................121 5.1.1 แพคเก5จ AWT.............................................................................................................................................122 5.1.2 แพคเก5จ Swing............................................................................................................................................124 5.2 คลาสประเภท Container ....................................................................................................................................125 5.2.1 คลาส Frame................................................................................................................................................125 5.2.2 คลาส Panel..................................................................................................................................................127 5.2.3 คลาส Dialog................................................................................................................................................128 5.2.4 คลาส JFrame...............................................................................................................................................128 5.3 การจ)ดวางผ)งของสLวนประกอบกราฟmก...............................................................................................................131 5.3.1 BorderLayout..............................................................................................................................................132 5.3.2 FlowLayout.................................................................................................................................................135 5.3.3 GridLayout..................................................................................................................................................137 5.4 สLวนประกอบกราฟmกในแพคเก5จ Swing..............................................................................................................138 5.4.1 คลาส JButton.............................................................................................................................................140 5.4.2 คลาส JLabel...............................................................................................................................................141 5.4.3 คลาส JTextField........................................................................................................................................144 ผศ. ธนศา เครอไวศยวรรณ Java Programming v
  • 6. 5.4.4 คลาส JTextArea.........................................................................................................................................145 5.4.5 คลาส JcheckBox และ JRadioButton........................................................................................................147 5.4.6 คลาส JComboBox.....................................................................................................................................150 5.4.7 คลาส JList..................................................................................................................................................151 5.5 การสรUางเมนV........................................................................................................................................................153 5.5.1 การสรUาง JMenuBar...................................................................................................................................154 5.5.2 การสรUาง JMenu.........................................................................................................................................154 5.5.3 การสรUาง JMenuItem..................................................................................................................................155 5.5.4 คลาส JCheckBoxMenuItem......................................................................................................................157 5.5.5 การสรUางเมนVยLอย.........................................................................................................................................159 5.6 คJณล)กษณะของคลาส Component......................................................................................................................161 สรJปเนYอหาของบท.....................................................................................................................................................163 บทท 6 การเขยนโปรแกรมภาษาจาวาเช,งอ-อบเจกต.........................................................................................................165 6.1 เมธอด .................................................................................................................................................................165 6.1.1 การเร;ยกใชUเมธอด........................................................................................................................................165 6.1.2 การสLงผLาน argument ..................................................................................................................................166 6.1.3 การร)บคLาท;สLงกล)บมา..................................................................................................................................172 6.1.4 modifier ของเมธอด....................................................................................................................................172 6.2 การเข;ยนโปรแกรมโดยใชUหล)กการของการหLอหJม.............................................................................................173 U 6.2.1 เมธอดแบบ Accessor..................................................................................................................................175 6.2.2 ค;ย#เวร#ด this..................................................................................................................................................178 6.3 การเข;ยนโปรแกรมโดยใชUหล)กการของการสบทอด...........................................................................................179 6.3.1 การสบทอดท;ถVกตUอง...................................................................................................................................182 6.3.2 ค;ย#เวร#ด protected ......................................................................................................................................183 6.3.3 คลาสท;ชอ Object........................................................................................................................................184 6.3.4 ค;ย#เวร#ด super ..............................................................................................................................................185 6.4 การม;ไดUหลายรVปแบบ..........................................................................................................................................186 6.4.1 Dynamic Binding........................................................................................................................................186 vi Java Programming ผศ. ธนศา เครอไวศยวรรณ
  • 7. 6.4.2 การกZาหนดเมธอดใหUม;วธ;การท;ตางก)น.......................................................................................................187 L 6.4.3 Virtual Method Invocation..........................................................................................................................190 6.4.4 การสLงผLาน argument ไดUหลายรVป.............................................................................................................190 6.4.5 ต)วดZาเนนการ instanceof.............................................................................................................................191 6.4.6 การ Casting อ5อบเจกต#................................................................................................................................192 6.5 Constructor..........................................................................................................................................................194 6.5.1 การเข;ยน Constructor..................................................................................................................................195 6.5.2 ข)นตอนการทZางานของคZาส)ง new ..............................................................................................................196 Y 6.5.3 Constructor แบบ Overloaded.....................................................................................................................197 6.5.4 เมธอด this()...............................................................................................................................................198 6.5.5 เมธอด super()..............................................................................................................................................199 6.5.6 ข)นตอนการทZางานของ Constructor............................................................................................................200 Y 6.6 เมธอดของคลาสท;ชอ Object...............................................................................................................................202 6.6.1 เมธอด toString().........................................................................................................................................202 6.6.2 เมธอด equals()............................................................................................................................................203 6.7 คลาสประเภท Wrapper.......................................................................................................................................204 6.7.1 Autoboxing..................................................................................................................................................205 6.8 ค;ย#เวร#ดอนๆ ท;สZาค)ญ...........................................................................................................................................206 6.8.1 คJณล)กษณะแบบ static.................................................................................................................................206 6.8.2 เมธอดแบบ static.........................................................................................................................................207 6.8.3 Static Initializer...........................................................................................................................................208 6.8.4 ค;ย#เวร#ด final................................................................................................................................................209 6.9 คลาสภายใน.........................................................................................................................................................210 6.9.1 คลาสภายในท;อยVLภายในคลาส.....................................................................................................................210 6.9.2 คลาสภายในท;อยVLภายในเมธอด...................................................................................................................212 6.10 Generic Types....................................................................................................................................................213 6.10.1 เมธอดแบบ Generic..................................................................................................................................214 6.11Annotation..........................................................................................................................................................215 6.11.1 Annotation Document...............................................................................................................................216 ผศ. ธนศา เครอไวศยวรรณ Java Programming vii
  • 8. 6.11.2 Annotation ท;ใชUโดยคอมไพเลอร#..............................................................................................................217 สรJปเนYอหาของบท.....................................................................................................................................................218 บทท 7 การจดการกบเหต%การณ.กราฟ3ก...........................................................................................................................221 7.1 เหตJการณ#.............................................................................................................................................................221 7.2 AWTEvent...........................................................................................................................................................223 7.2.1 ActionEvent......................................................................................................................................................224 7.2.2 WindowEvent...................................................................................................................................................225 7.2.3 MouseEvent......................................................................................................................................................225 7.2.4 ItemEvent..........................................................................................................................................................226 7.2.5 Event อนๆ .......................................................................................................................................................227 7.3 อนเตอร#เฟสประเภท Listener..............................................................................................................................227 7.4 การจ)ดการก)บเหตJการณ#.......................................................................................................................................230 7.4.1 การสรUางอ5อบเจกต#ของคลาสภายนอก..............................................................................................................231 7.5 การสรUางอ5อบเจกต#ของคลาสภายใน....................................................................................................................232 7.5.1 การสรUางอ5อบเจกต#ภายในคลาสเด;ยวก)น..........................................................................................................234 7.5.2 การร)บฟwงเหตJการณ#หลายเหตJการณ#.................................................................................................................235 7.5.3 คลาสประเภท Event Adapter..........................................................................................................................237 7.5.4 การสรUางคลาสแบบ anonymous .....................................................................................................................238 สรJปเนYอหาของบท.....................................................................................................................................................239 บทท 8 อะเรย.และคอลเล-กชน..........................................................................................................................................241 8.1 อะเรย#....................................................................................................................................................................241 8.2 อะเรย#ของขUอมVลชนดพYนฐาน..............................................................................................................................242 8.2.1 การประกาศชอต)วแปรอะเรย#ของขUอมVลชนดพYนฐาน.................................................................................242 8.2.2 การสรUางต)วแปรอะเรย#ของขUอมVลชนดพYนฐาน...........................................................................................243 8.2.3 การเร;ยกใชUสมาชกของอะเรย#......................................................................................................................245 8.2.4 การกZาหนดคLาเรมตUนใหUก)บสมาชกของอะเรย# ...........................................................................................246 8.2.5 การใชUคZาส)ง for เพออUางองสมาชกของอะเรย#.............................................................................................247 viii Java Programming ผศ. ธนศา เครอไวศยวรรณ
  • 9. 8.2.6 ขUอผดพลาดประเภท ArrayIndexOutOfBoundsException .......................................................................248 8.3 อะเรย#ของขUอมVลชนดคลาส..................................................................................................................................249 8.3.1 การเก5บคLาของต)วแปรอะเรย#ของขUอมVลชนดคลาส......................................................................................251 8.4 อะเรย#หลายมต.....................................................................................................................................................252 8.4.1 การเข;ยนโปรแกรมเพอจ)ดการก)บเมตรกซ#..................................................................................................254 8.4.2 อะเรย#สองมตท;ม;จZานวนคอล)มน#ตLางก)น......................................................................................................257 8.4.3 เมธอดท;เก;ยวขUองก)บอะเรย#..........................................................................................................................259 8.5 คอลเล5กช)น...........................................................................................................................................................261 8.5.1 อนเตอร#เฟส Collection..............................................................................................................................262 8.5.2 อนเตอร#เฟส Set .........................................................................................................................................263 8.5.3 อนเตอร#เฟส List ........................................................................................................................................264 8.5.4 อนเตอร#เฟส Map .......................................................................................................................................266 8.5.5 อนเตอร#เฟส Iterator ..................................................................................................................................268 8.5.6 คลาส Vector .............................................................................................................................................271 8.5.7 การใชUคZาส)ง for และ Generic......................................................................................................................272 สรJปเนYอหาของบท.....................................................................................................................................................273 บทท 9 การจดการกบขอผ,ดพลาด...................................................................................................................................275 9.1 ขUอผดพลาด..........................................................................................................................................................275 9.2 Exception.............................................................................................................................................................276 9.3 คZาส)ง try..catch....................................................................................................................................................278 9.4 การจ)ดการก)บขUอผดพลาดหลายๆ ประเภท..........................................................................................................279 9.5 บล5อก finally........................................................................................................................................................281 9.6 การจ)ดการก)บเมธอดท;สLงอ5อบเจกต#ประเภท Exception......................................................................................283 9.7 การสรUางคลาสประเภท Exception ขxYนใหมL.........................................................................................................285 9.7.1 การเข;ยนเมธอดเพอสLงอ5อบเจกต#ประเภท Exception.......................................................................................286 สรJปเนYอหาของบท.....................................................................................................................................................287 บทท 10 คลาสอ,นพ%ตและเอาต.พ%ต...................................................................................................................................289 ผศ. ธนศา เครอไวศยวรรณ Java Programming ix
  • 10. 10.1 Stream ...............................................................................................................................................................289 10.1.1 แพคเก5จ java.io..........................................................................................................................................290 10.1.2 คลาสประเภท Byte Stream.......................................................................................................................292 10.1.3 คลาส InputStream.....................................................................................................................................292 10.1.4 คลาส OutputStream..................................................................................................................................294 10.1.5 คลาสประเภท Character Stream...............................................................................................................295 10.2 โหนดสZาหร)บ Stream.........................................................................................................................................296 10.3 คลาสประเภท Stream ระด)บสVง.........................................................................................................................298 10.3.1 DataInputStream และ DataOutputStream................................................................................................301 10.3.2 InputStreamReader และ OutputStreamWriter.........................................................................................304 10.4 คลาส File...........................................................................................................................................................305 10.4.1 คลาส RandomAccessFile.........................................................................................................................307 10.4.2ObjectInputStream และ ObjectOutputStream...........................................................................................308 สรJปเนYอหาของบท.....................................................................................................................................................310 x Java Programming ผศ. ธนศา เครอไวศยวรรณ
  • 12. บทท 1 ความรเบองตนภาษาจาวา เนYอหาในบทน;เY ปyนการแนะนZาภาษาจาวา โดยจะเรมจากการแนะนZาหล)กการของภาษาคอมพวเตอร#โดยท)วๆ ไป ประว)ตความเปyนมาโดยยLอของภาษาจาวา ขUอแตกตLางของภาษาจาวาก)บภาษาคอมพวเตอร#อนๆ หล)กการการทZางานของ โปรแกรมภาษาจาวา และความหมายของเครองจ)กรสมมJตท;ใชUในภาษาจาวา พรUอมท)YงแนะนZาเทคโนโลย;และ แพลตฟอร#มตLางๆ ของภาษาจาวา แนะนZาต)วอยLางการเข;ยนโปรแกรมจาวาประยJกต#และโปรแกรมจาวาแอปเพล5ต และ ในสLวนทUายของบทไดUม;การแนะนZาวธ;การใชUคVLมอ Java API 1.1 ระบบคอมพ,วเตอร. เครองคอมพวเตอร#เปyนเครองอเล5กทรอนกส# ท;ใชUในการคZานวณและจ)ดการก)บระบบขUอมVล องค#ประกอบของ ระบบคอมพวเตอร#โดยท)วไปจะเปyนด)งแสดงในรVปท; 1.1 ซxงจะประกอบไปดUวยสLวนหล)กสามสLวนคอ 1. ฮาร#ดแวร# (Hardware) คอสLวนประกอบท;เปyนต)วเครองคอมพวเตอร#ท;ประกอบดUวยหนLวยประมวลผล กลาง (Central Processing Unit หรอ CPU) อJปกรณ#สLวนอนพJต อJปกรณ#สLวนเอาต#พJต หนLวยความจZา และอJปกรณ#เก5บขUอมVล 2. ระบบปฏบ)ตการ (Operating System) คอระบบซอฟต#แวร#ท;ตดต)YงเพอใหUโปรแกรมประยJกต#ตLางๆ สามารถตดตLอก)บฮาร#ดแวร#ไดU ระบบปฏบ)ตการท;นยมใชUในปwจจJบนม;อยVLหลายระบบ อาทเชLน Windows ) Vista, Linux และ Solaris เปyนตUน ท)Yงน;Yฮาร#ดแวร#ชนดเด;ยวก)นสามารถท;จะม;ระบบปฏบ)ตการท;แตกตLาง ก)นไดU 3. โปรแกรมประยJกต# (Application Program) คอโปรแกรมท;ใชUงานท)วๆ ไป เชLน โปรแกรม Word Processor, เกมส# หรอโปรแกรมเว5บเบราวเซอร# (Web Browser) เปyนตUน โปรแกรมเหลLาน;จะถVกพ)ฒนา Y โดยใชUภาษาคอมพวเตอร#ตLางๆ อาทเชLน ภาษาฟอร#แทรน (FORTRAN) ภาษาโคบอล (COBOL) ภาษา C# ภาษา C++ หรอภาษาจาวา เปyนตUน โปรแกรมประยJกต#จะทZางานภายใตUระบบปฏบ)ตการ ด)งน)น Y โปรแกรมประยJกต#ท;ทZางานบนระบบปฏบ)ตการระบบใดระบบหนxงจะไมLสามารถนZาไปใชUในระบบ ปฏบ)ต การอนไดU ผศ. ธนศา เครอไวศยวรรณ ความรVUเบYองตUนภาษาจาวา 1
  • 13. รปท 1.1 องคประกอบของระบบคอมพวเตอร เกร%ดความร! EDSAC เปนเครองคอมพวเตอรรนแรกๆของโลกสรางขนเมอเดอนพฤษภาคม คศ. 1949 โดยม% หนวยความจ(าหล)กเพ%ยง 512 ค(า (words) และสามารถค(านวณค(าส)งได 600 ค(าส)งตอวนาท% และม%ขนาด ใหญด)งร1ป 1.2 ภาษาคอมพ,วเตอร. ภาษาคอมพวเตอร#คอคZาส)งท;น)กพ)ฒนาโปรแกรม (programmer) พ)ฒนาขxนเพอส)งใหUเครองคอมพวเตอร# Y ทZางานตามท;ตUองการ ภาษาคอมพวเตอร#แบLงออกเปyนสามประเภทคอ 2 ความรVUเบYองตUนภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 14. 1. ภาษาเครอง (Machine Language) เปyนภาษาเด;ยวท;เครองคอมพวเตอร#สามารถเขUาใจไดU ภาษาเครองจะ ประกอบไปดUวยคZาส)งท;เปyนชJดของเลขฐานสองเชLน 01010110 ซxงจะถVกกZาหนดโดยฮาร#ดแวร#ของเครอง คอมพวเตอร# ท)Yงน;YภาษาเครองจะขxนอยVLก)บชนดของหนLวยประมวลผลกลางของเครองคอมพวเตอร#แตLละ Y เครอง โดยปกตแลUวน)กพ)ฒนาโปรแกรมไมLสามารถท;จะพ)ฒนาโปรแกรมโดยเข;ยนภาษาเครองไดUโดยตรง ท)Yงน;Yเนองจากเปyนภาษาท;ใชUเลขฐานสองซxงไมLใชLชJดคZาส)งท;มนJษย#จะสามารถเขUาใจไดUโดยงLาย ต)วอยLางของ คZาส)งภาษาเครองม;ด)งน;Y 10110011 00011001 01111010 11010001 10010100 10011111 00011001 01011100 11010001 10010000 10111011 11010001 10010110 2. ภาษาแอสเซมบล; (Assembly Language) เปyนภาษาคอมพวเตอร#ท;แทนชJดคZาส)งเลขฐานสองดUวยคZา ส)ญล)กษณ#ท;เปyนภาษาอ)งกฤษ เชLน 10110011 อาจแทนดUวย MOV เปyนตUน ทZาใหUน)กพ)ฒนาโปรแกรมเข;ยน และเขUาใจโปรแกรมไดUงLายขxYน การทZางานของโปรแกรมภาษาแอสเซมบล; จะตUองม;การแปลภาษา แอส เซมบล;ใหUเปyนภาษาเครองกLอนจxงจะทZางานไดU แมUภาษาแอสเซมบล;จะม;ชJดคZาส)งท;เปyนคZาภาษาอ)งกฤษ แตL น)กพ)ฒนาโปรแกรมภาษาแอสเซมบล;จะตUองม;ความเขUาใจโครงสรUางฮาร#ดแวร#ของระบบคอมพวเตอร#จxงจะ สามารถเข;ยนโปรแกรมไดU ด)งน)YนทZาใหUภาษาแอสเซมบล;ไมLเปyนท;นยมใชU ต)วอยLางของโปรแกรมภาษาแอส เซมบล;ม;ด)งน;Y MOV 0, SUM MOV NUM, AC ADD SUM, AC STO SUM, TOT 3. ภาษาระด)บสVง (High-level Language) การพ)ฒนาโปรแกรมโดยท)วไปจะใชUโปรแกรมภาษาคอมพวเตอร# ระด)บสVง ภาษาคอมพวเตอร#ระด)บสVงจะใชUชJดคZาส)งท;คนท)วไปเขUาใจไดUงLาย เหมอนการใชUคZาส)งในภาษา อ)งกฤษหรอการเข;ยนสมการคณตศาสตร#ทวไป น)กพ)ฒนาโปรแกรมไมLจZาเปyนตUองเขUาใจหล)กการทZางานของ ) ฮาร#ดแวร#ก5สามารถท;จะพ)ฒนาโปรแกรมภาษาคอมพวเตอร#ระด)บสVงไดU โปรแกรมภาษาคอมพวเตอร#ระด)บ สVง จะตUองการต)วแปลภาษาท;ทZาหนUาท;เปล;ยนชJดคZาส)งใหUมาเปyนภาษาแอสเซมบล;หรอภาษาเครองจxงจะ ทZางานไดU เมอเท;ยบก)บภาษาแอสเซมบล;แลUว ภาษาคอมพวเตอร#ระด)บสVงจะชLวยใหUน)กพ)ฒนาโปรแกรม พ)ฒนาโปรแกรมไดUรวดเร5วกวLา แตLโปรแกรมท;พ)ฒนาขxนจะทZางานไดUชUากวLา Y ในปwจจJบ)นม;โปรแกรมภาษาคอมพวเตอร#ระด)บสVงอยVLหลายรUอยภาษา แตLท;นยมใชUและไดUร)บการยอมร)บม;เพ;ยง ผศ. ธนศา เครอไวศยวรรณ ความรVUเบYองตUนภาษาจาวา 3
  • 15. ไมLก;ภาษา ภาษาคอมพวเตอร#ในยJคแรกท;นยมใชUม;หลายภาษาอาทเชLน • ภาษาฟอร#แทรน (FORTRAN ยLอมาจาก FORmula TRANslator) พ)ฒนาโดยบรษ)ท IBM ระหวLางป} ค.ศ. 1954 ถxง ค.ศ. 1957 ภาษาน;ใชUสZาหร)บการพ)ฒนาโปรแกรมประยJกต#ดUานวทยาศาสตร#และ Y วศวกรรมศาสตร# ท;ตUองใชUในการคZานวณสมการคณตศาสตร#ท;ซ)บซUอน ปwจจJบนภาษาฟอร#แทรนย)งเปyนท; ) นยมใชUในการพ)ฒนาโปรแกรมดUานวทยาศาสตร#และวศวกรรมศาสตร# • ภาษาโคบอล (COBOL ยLอมาจาก COmmon Business Oriented Language) พ)ฒนาขxนในป} ค.ศ. Y 1959 เปyนภาษาท;พ)ฒนาขxนมาเพอใชUในการพ)ฒนาโปรแกรมประยJกต#ดUานธJรกจและการคUา ปwจจJบ)น Y โปรแกรมท;ใชUในดUานธJรกจจZานวนมากอาทเชLนโปรแกรมในสถาบ)นการเงน ย)งเปyนโปรแกรมท;พ)ฒนามา จากภาษาโคบอล • ภาษาเบสก (BASIC ยLอมาจาก Beginners All-purpose Symbolic Instructional Code) เปyนภาษาท; พ)ฒนาขxนโดยม;จดประสงค#เพอใหUผเVU รมตUนพ)ฒนาโปรแกรมสามารถเร;ยนรVและเขUาใจการพ)ฒนาโปรแกรม Y J U อยLางงLาย ภาษาเบสกเปyนภาษา คอมพวเตอร#ภาษาแรกท;ใชUในเครองไมโครคอมพวเตอร# เกร%ดความร! การเข%ยนโปรแกรมภาษาฟอรแทรนหรอภาษาโคบอลในยคแรกจะใชเครองคอมพวเตอรท%อาน โปรแกรมจาก punch card ท%ตองใชการดหนงใบตอหนงค(าส)ง ซงเครองคอมพวเตอรท%ใช punch card ย)งม%การใชในการเร%ยนการสอนในประเทศไทยจนถงป6 พ.ศ. 2529 จนกระท)งเครองคอมพวเตอรพ%ซ%เขา มาแทนท% ภาษาคอมพวเตอร#ท;พ)ฒนาขxYนในยJคแรก ย)งม;ขUอจZาก)ดในการท;จะพ)ฒนาโปรแกรมขนาดใหญL ท)Yงน;เY นองจาก ภาษาคอมพวเตอร#เหลLาน)YนขาดโครงสรUางท;ด; ทZาใหUการพ)ฒนาโปรแกรมท;ม;ขนาดใหญLและม;ความซ)บซUอนเปyนไปไดU ยาก ในชLวงตUนป} ค.ศ. 1970 จxงม;ภาษาคอมพวเตอร#ท;เปyนภาษาเชงกระบวนการ (Procedural หรอ Structural Language) เกดขxYน ภาษาคอมพวเตอร#ประเภทน;จะม;ความยดหยJLนในการพ)ฒนาโปรแกรม ทZาใหUสามารถแกUไขและ Y บZารJงร)กษาไดUงLาย เนองจากโปรแกรมถVกแยกออกเปyนสLวนๆ ภาษาคอมพวเตอร#ท;เปyนภาษาเชงกระบวนการท;สZาค)ญคอ 4 ความรVUเบYองตUนภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 16. ภาษาปาสคาล (Pascal) พ)ฒนาโดย Nicklaus Wirth ในป} ค.ศ. 1971 โดยม;จJดประสงค#เพอใชUในการ สอนการเข;ยนโปรแกรมภาษาเชงกระบวนการ ในมหาวทยาล)ย แตLเนองจากภาษาปาสคาลไมLม;คJณล)กษณะท; จะสน)บสนJนการพ)ฒนาโปรแกรมดUานธJรกจและอJตสาหกรรมจxงไมLไดUร)บความนยมมากน)ก • ภาษาซ; (C) พ)ฒนาขxนในชLวงเด;ยวก)บภาษาปาสคาล โดยน)กวจ)ยท;หUองปฏบ)ตการ AT&T Bell ซxงไดUนZาเอา Y จJดเดLนของภาษา BCPL และภาษา B มาใชUและไดUเพมคJณล)กษณะและชนดขUอมVลอนเขUามาดUวย เดมภาษาซ; ถอวLาเปyนภาษาคอมพวเตอร#ท;สZาค)ญในการพ)ฒนาโปรแกรมบนระบบปฏบ)ตการยVนกส# (Unix) ซxงเปyนภาษา คอมพวเตอร#ท;สามารถสรUางโปรแกรมประยJกต#ท;ทZางานไดUรวดเร5วมาก เมอเท;ยบก)บภาษาคอมพวเตอร#อนๆ จJดดUอยของการพ)ฒนาโปรแกรมภาษาเชงกระบวนการคอ จะม;ตUนทJนในการพ)ฒนาโปรแกรมท;คLอนขUางสVง เนองจากจะตUองม;การออกแบบโปรแกรมใหUแยกออกเปyนสLวนๆ ท;เร;ยกวLาโมดVล (module) ซxงจะตUองเปyนอสระจากก)น การออกแบบใหUมความเปyนอสระตLอก)นน)นทZาไดUยาก ซxงหากออกแบบมาไมLด;จะทZาใหUการแกUไขและบZารJงร)กษา ; Y โปรแกรมเปyนไปไดUยาก ด)งน)นจxงม;การพ)ฒนาภาษาคอมพวเตอร#ในแบบท;เร;ยกวLา ภาษาเชงอ5อบเจกต# (Object- Y Oriented Programming) ท;พยายามใหUการพ)ฒนาโปรแกรมเปyนการเล;ยนแบบการทZางานของอ5อบเจกต#ตLางๆ ในโลก ท)Yงน;เY พอใหUงLายตLอการพ)ฒนาโปรแกรมและสามารถนZาโปรแกรมกล)บมาใชUใหมL (reuse) ไดUด;กวLาภาษาเชงกระบวนการ ภาษาคอมพวเตอร#ท;เปyนภาษาเชงอ5อบเจกต#ท;สZาค)ญคอ • ภาษา C++ เปyนภาษาท;พ)ฒนามาจากภาษาซ;เมอตUน ค.ศ. 1980 โดยน)กวจ)ยท;หUองปฏบ)ตการ Bell โดยไดU เพมหล)กการเชงอ5อบเจกต#ขxYนมาจากภาษาซ; ด)งน)นน)กพ)ฒนาโปรแกรมภาษา C++ สามารถท;จะพ)ฒนา Y โปรแกรมท)Yงในเชงอ5อบเจกต#และเชงกระบวนการ (ตามแบบภาษาซ;) ไดU ทZาใหUปwจจJบนภาษา C++ ย)งเปyนท; ) นยมใชUก)นอยLางแพรLหลาย • ภาษา Smalltalk เปyนภาษาเชงอ5อบเจกต#ท;พ)ฒนาโดยน)กวจ)ยท; Xerox’s Palo Alto Research Center (PARC) ซxงเปyนภาษาคอมพวเตอร#ท;เปyนภาษาเชงอ5อบเจกต# อยLางแทUจรง แตLภาษา Smalltalk ไมLไดUร)บ ความนยมในการนZาไปใชUงานมากน)กเมอเท;ยบก)บภาษา C++ หรอภาษาจาวา • ภาษาจาวาเปyนภาษาคอมพวเตอร#ท;พ)ฒนาโดย น)กวจ)ยของบรษ)ทซ)นไมโครซสเต5มส# (Sun Microsystems) โดยเรมม;การนZามาเผยแพรLเมอป} ค.ศ. 1995 ปwจจJบ)นเปyนภาษาเชงอ5อบเจกต#ท;เปyนท;นยมใชUก)นมากภาษา หนxง ซxงไดUร)บการยอมร)บในการพ)ฒนาโปรแกรมทางธJรกจและอJตสาหกรรม และย)งเปyนท;นยมใชUเพอการ ศxกษาหล)กการการเข;ยนโปรแกรมคอมพวเตอร#โดยใชUภาษาเชงอ5อบเจกต#อ;กดUวย นอกจากน;Yภาษาจาวาย)ง เปyนซอฟต#แวร#แบบเปmดเผยซอร#สโคUด (Open source code) • ภาษา C# เปyนภาษาคอมพวเตอร#ท;ม;ล)กษณะคลUายก)บภาษาจาวาท;พ)ฒนาโดยบรษ)ท Microsoft โดยม; จJดประสงค#เพอใหUน)กพ)ฒนาโปรแกรมสามารถพ)ฒนาโปรแกรมเชงอ5อบเจกต#ท;จะร)นบนระบบปฎบ)ตการ Windows ไดUงLายขxน Y ผศ. ธนศา เครอไวศยวรรณ ความรVUเบYองตUนภาษาจาวา 5
  • 17. 1.3 ตวแปลภาษา ภาษาคอมพวเตอร#ระด)บสVงจะตUองการต)วแปลภาษา (Language Translator) เพอแปลโปรแกรมท;เข;ยนขxน Y หรอท;เร;ยกวLาซอร#ดโคUด (Source Code) ของภาษาคอมพวเตอร#แตLละภาษาใหUเปyนภาษาแอสเซมบล;หรอภาษาเครองท; เครองคอมพวเตอร#สามารถเขUาใจไดU ต)วแปลภาษาแบLงออกเปyนสองแบบคอ 1. คอมไพเลอร# (Compiler) ต)วแปลภาษาประเภทน;YจะแปลชJดคZาส)งในซอร#ดโคUดท)YงหมดใหUเปyนโปรแกรม executable code ด)งแสดงในรVปท; 1.2 ต)วอยLางเชLน แปลซอร#ดโคUดภาษาซ;จากโปรแกรม Hello.c ใหU เปyนโปรแกรม executable code ท;ชอ Hello.exe โดยโปรแกรม executable code ท;ไดUจากการแปล ภาษาคอมพวเตอร#ระด)บสVงจะสามารถทZางานไดUอยLางรวดเร5ว ท)Yงน;YเนองจากโคUดอยVLในรVปของเลขฐานสอง ท;สามารถตดตLอก)บเครองคอมพวเตอร#ไดUโดยตรง ต)วอยLางของภาษา คอมพวเตอร#ท;ใชUคอมไพเลอร# คอ ภาษาซ; C++ ฟอร#แทรน และปาสคาล เปyนตUน คอมไพเลอร#จะสรUางโปรแกรม executable code ท;ขxYนอยVLก)บแพลตฟอร#ม (ฮาร#ดแวร#และระบบ ปฏบ)ตการ) ด)งน)นผVUใชUจะไมLสามารถนZาโปรแกรม executable code ท;ไดUจากการแปลของคอมไพเลอร# Y บนแพลตฟอร#มหนxงไปใชUบนแพลตฟอร#มอนๆ ไดU ในกรณ;ท;น)กพ)ฒนาโปรแกรมตUองการนZาโปรแกรมท; พ)ฒนาขxนไปใชUบนแพลตฟอร#มอนๆ น)กพ)ฒนาโปรแกรมจะตUองทZาการแปลซอร#ดโคUด ของโปรแกรม Y ใหมL โดยจะตUองใชUคอมไพเลอร#ท;สรUางโปรแกรม executable code สZาหร)บแพลตฟอร#มท;ตUองการใชU งานน)นๆ Y รปท 1.2 ขนตอนการทางานของคอมไพเลอร 6 ความรVUเบYองตUนภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 18. 2. อนเตอร#พร;ตเตอร# (Interpreter) ต)วแปลภาษาประเภทน;จะแปลชJดคZาส)งของภาษาคอมพวเตอร#ระด)บสVง Y ท;ละคZาส)งใหUเปyนโปรแกรม executable code แลUวจะส)งใหUเครองคอมพวเตอร#ทZางานท)นท;ด)งแสดงใน รVปท; 1.3 โปรแกรมภาษาคอมพวเตอร#ท;ใชUอนเตอร#พร;ตเตอร# จะทZางานไดUชากวLาโปรแกรมภาษา U คอมพวเตอร#ท;ใชUคอมไพเลอร# แตLขUอด;ของโปรแกรมภาษาคอมพวเตอร#ทใชUอนเตอร#พร;ตเตอร#คอจะ ; สามารถใชUงานขUามแพลตฟอร#มไดU ท)Yงน;Yเนองจากข)YนตอนการแปลภาษากระทZาอยVLในชLวงการร)น โปรแกรม นอกจากน;โปรแกรมอนเตอร#พร;ตเตอร#จะพ)ฒนาไดUงLายกวLาเนองจากม;ขนาดเล5ก ต)วอยLางของ Y ภาษาคอมพวเตอร#ท;ใชUอนเตอร#พร;ตเตอร#คอ ภาษาเบสก โปรล5อก (Prolog) และ Smalltalk เปyนตUน รปท 1.3 ขนตอนการทางานของอนเตอรพรตเตอร 1.4 หลกการของโปรแกรมเช,งอ-อบเจกต. การเข;ยนโปรแกรมโดยใชUภาษาคอมพวเตอร#ระด)บสVงในปwจจJบนจะม;แนววธ;การคดอยVLสองรVปแบบท;สZาค)ญคอ ) แนวคดเชงกระบวนการ และแนวคดเชงอ5อบเจกต# ด)งท;กลLาวไวUในห)วขUอท; 1.2 การเข;ยนโปรแกรมโดยใชUภาษาเชง กระบวนการ จะเรมตUนจากการวเคราะห#ปญหาโดยพจารณาจากกระบวนการและลZาด)บการทZางาน และจะพยายามแบLง w โปรแกรมออกเปyนสLวนๆ ตามฟwงก#ช)นของการทZางานอาทเชLน การพ)ฒนาโปรแกรมระบบทะเบ;ยนน)กเร;ยนโดยใชU โปรแกรมเชงกระบวนการอาจจะพจารณาแบLงโปรแกรมตามลZาด)บการทZางาน โดยอาจม;ฟwงก#ชนในการทZางานสZาหร)บ ) การลงทะเบ;ยนรายวชา การชZาระเงน หรอการเพมหรอถอนรายวชา เปyนตUน ผศ. ธนศา เครอไวศยวรรณ ความรVUเบYองตUนภาษาจาวา 7
  • 19. ฟwงก#ชนแตLละสLวนของโปรแกรมเชงกระบวนการ จะม;ต)วแปรท;จะสLงผLานขUอมVลระหวLางก)น การออกแบบ ) โปรแกรมเชงกระบวนการท;ด;จะตUองพยายามแบLงฟwงก#ชนใหUเปyนอสระตLอก)นใหUมากท;สJด และตUองพยายามท;จะเข;ยนข)น ) Y ตอนหรอลZาด)บการทZางานใหUสมบVรณ#ท;สJดต)YงแตLขนตอนการออกแบบ จxงทZาใหUการปร)บปรJงหรอแกUไขโปรแกรมท; )Y พ)ฒนาจากภาษาเชงกระบวนการทZาไดUยากเมอเท;ยบก)บโปรแกรมท;พ)ฒนาจากภาษาเชงอ5อบเจกต# ท)Yงน;เY นองจาก กระบวนการการพ)ฒนาโปรแกรมน)นไมLสามารถท;จะออกแบบโปรแกรมใหUสมบVรณ#ต)YงแตLตUนโดยไมLม;การนZากล)บมา Y แกUไขปร)บปรJงอ;กไดU การพ)ฒนาโปรแกรมเชงอ5อบเจกต#จะม;แนวคดในการแกUปwญหา โดยมองปwญหาวLาประกอบไปดUวยอ5อบเจกต# ตLางๆ ซxงแนวคดน;YจะเขUาใกลUเค;ยงก)บธรรมชาตของมนJษย#มากท;สJด เนองจากมนJษย#มองสงตLางๆ รอบต)วเปyนอ5อบเจกต# ท)Yงท;เปyนรVปธรรม (ว)ตถJ) เชLน ปากกา น)กศxกษา หรอใบลงทะเบ;ยน เปyนตUน และท;เปyนนามธรรมเชLน คะแนน หรอราย ชอวชา เปyนตUน การเข;ยนโปรแกรมเชงอ5อบเจกต#จะเปyนขบวนการการวเคราะห#ปญหา โดยการจZาลองคJณล)กษณะและ w พฤตกรรมของอ5อบเจกต#ในระบบจรง ใหUอยVLในรVปของโปรแกรมคอมพวเตอร# ต)วอยLางเชLน การพ)ฒนาโปรแกรมระบบ ทะเบ;ยนน)กศxกษาอาจแบLงโปรแกรมใหUประกอบดUวยอ5อบเจกต#ตLางๆ อาทเชLน น)กศxกษา ใบลงทะเบ;ยน และรายวชา เปyนตUน อ5อบเจกต#ชนดน)กศxกษาอาจม;คJณล)กษณะตLางๆ เชLน ชอ รห)ส และเกรดเฉล;ย เปyนตUน และอาจม;พฤตกรรมท; น)กศxกษาสามารถกระทZาไดUเชLน ลงทะเบ;ยน และเพมหรอถอนวชา เปyนตUน การพ)ฒนาโปรแกรมโดยใชUภาษาคอมพวเตอร#เชงอ5อบเจกต# จะทZาใหUขบวนการพ)ฒนาโปรแกรมทZาไดUรวดเร5ว ขxYนและสามารถปร)บปรJงแกUไขโปรแกรมไดUงLาย ซxงเหมาะก)บการพ)ฒนาโปรแกรมขนาดใหญLท;จะตUองม;การปร)บปรJง แกUไขโปรแกรมอยVLตลอด นอกจากน;โปรแกรมเชงอ5อบเจกต#ย)งม;คJณล)กษณะเดLนอนๆ อ;กด)งน;Y Y • การหLอหJUม (Encapsulation) เปyนคJณล)กษณะท;ทZาใหUอ5อบเจกต#แตLละต)วเปyนอสระตLอก)น ซxงทZาใหUสามารถ แบLงการพ)ฒนาโปรแกรมออกเปyนสLวนๆ ไดUงLาย • การสบทอด (Inheritance) เปyนคJณล)กษณะท;ทZาใหUสามารถนZาโปรแกรมท;พ)ฒนาแลUวกล)บมาใชUใหมLไดU งLายกวLาการเข;ยนโปรแกรมเชงกระบวนการ • การม;ไดUหลายรVปแบบ (Polymorphism) เปyนคJณล)กษณะท;ทZาใหUน)กพ)ฒนาโปรแกรมสามารถเพมเตมสLวน ตLางๆ ของโปรแกรมไดUงLาย 8 ความรVUเบYองตUนภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 20. 1.5 ประวต,ภาษาจาวา ภาษาจาวาเปyนภาษาคอมพวเตอร#ท;พ)ฒนาขxYน โดยท;มวจ)ยของบรษ)ทซ)นไมโครซสเต5มส# ซxงเรมตUนเมอป} ค .ศ. 1991 โดยทางบรษ)ทซ)นไมโครซสเต5มส#ไดUสน)บสนJนใหUม;การพ)ฒนาโครงการท;ชอ Green Project ท;ม;จJดมJLงหมายท; จะออกแบบภาษาคอมพวเตอร#ขนาดเล5กเพอใชUก)บอJปกรณ#อเล5กทรอนกส#ตLางๆ เชLน สวทซ#บล5อกของเคเบYลท;ว; ซxง อJปกรณ#เหลLาน;Yจะม;ขUอจZาก)ดในดUานหนLวยความจZาและหนLวยประมวลผลกลางท;จะม;ความแตกตLางก)น ด)งน)นภาษาY คอมพวเตอร#ท;พ)ฒนาขxนจะตUองไมLขนอยVLก)บแพลตฟอร#ม (Platform Independent) ผลงานของท;มวจ)ยน;YทZาใหUไดUภาษา Y xY คอมพวเตอร#ใหมLท;ชอวLา “Oak” ซxงม;โครงสรUางและคZาส)งคลUายภาษา C++ ท)Yงน;เY นองจากท;มวจ)ยของบรษ)ทซ)นไมโคร ซสเต5มส#ม;ความคJนเคยก)บระบบปฏบ)ตการยVนกส#ซxงม)กจะใชUภาษา C++ ในการพ)ฒนาโปรแกรม ภาษา “Oak” ตLอมาไดU U เปล;ยนมาเปyนชอ “จาวา” ท)Yงน;Yเนองจากท;มวจ)ยไดUทราบภายหล)งวLา ” Oak” เปyนชอภาษาคอมพวเตอร#ท;ม;อยVLแลUว ภาษาจาวาเปyนภาษาคอมพวเตอร#เชงอ5อบเจกต# (Object Oriented Programming หรอเร;ยกยLอวLา OOP) โดย ม;จJดเดLนตรงท;สามารถทZางานไดUก)บระบบคอมพวเตอร#หลายแพลตฟอร#ม ท;มวจ)ยของโครงการ Green Project ไดU สรUางเครองตUนแบบท;เร;ยกวLา “*7” ซxงเปyนร;โมทคอนโทรล เพอสาธตเทคโนโลย;ภาษาจาวาท;คUนคดขxนมาน;Yเมอป} ค .ศ. Y 1992 โดยทางบรษ)ทซ)นไมโครซสเต5มส#ไดUพยายามหาผVซYอเทคโนโลย;ด)งกลLาว แตLก5ไมLประสบความสZาเร5จมากน)ก U เกร%ดความร! James Gosling เปนผ1ท%คดคนภาษาจาวาจนไดร)บการยกยองวาเปนบดาของ ภาษาจาวา โดยเขาเกดท%ประเทศ Canada จบการศกษาระด)บปรญญาเอกท% มหาวทยาล)ย Carnegie Mellon และเขาท(างานท%บรษ)ท Sun Microsystems ต)งแตป6 ค.ศ. 1984 และในป6 ค.ศ. 2007 เขาไดร)บการยกยองจากประเทศ Canada ใหเปน Officer ของ Order of Canada ซงเปนเก%ยรตยศท%มอบใหก)บพลเมองของประเทศ โลโกของภาษาจาวาจะเปนร1ปแกวกาแฟท%ม%คว)นรอนระอขนมา โดยทางบรษ)ท Sun Microsystems ไดเปล%ยนร1ปโลโกเดมมาเปนร1ปลาสดด)งท%แสดงใหเห9น Duke เปน mascot ของภาษาจาวา ซงจะม%การใชส)ญล)กษณในทาทางท%แตก ตางก)น และในงานประชม Java One Conference ท%จ)ดเปนประจ(าทกป6 ก9จะ ม%การมอบรางว)ลใหแกซอฟตแวรหรอน)กพ)ฒนาท%ใชเทคโนโลย%จาวาและม%นว)ต กรรมด%เดนท%เร%ยกวา Duke's Choice Awards ผศ. ธนศา เครอไวศยวรรณ ความรVUเบYองตUนภาษาจาวา 9
  • 21. ในชLวงด)งกลLาว ระบบอนเทอร#เน5ตไดUเรมม;การใชUงานอยLางแพรLหลายมากขxYน โดย เฉพาะการใชUงานของ โปรแกรมเว5บเบราวเซอร# (Web Browser) เพอท;จะเร;ยกดVเอกสารในรVปแบบของไฟล# HTML เนองจากระบบ อนเทอร#เน5ตจะประกอบไปดUวยเครองคอมพวเตอร#ท;ม;แพลตฟอร#มแตกตLางก)น ทางบรษ)ทซ)นไมโครซสเต5มส#จxงไดUเห5น ความจZาเปyนท;จะตUองม;ภาษาคอมพวเตอร#ท;สามารถสรUางโปรแกรมท;ทZางานบนแพลตฟอร#มใดๆ ก5ไดU จxงไดUนZาภาษา จาวามาพ)ฒนาอ;กคร)Yงหนxง โดยไดUพ)ฒนาโปรแกรมเว5บเบราว#เซอร#ท;ชอ Hot Java ท;สามารถร)นโปรแกรมจาวา แอปเพล5ต (Java Applet) ไดUเพอพสVจน#การทZางานของเทคโนโลย;จาวา (Proof of Technology) และไดUนZาผลงาน ด)งกลLาวมาแสดงในงาน Sun World’95 ในเดอนพฤษภาคม ป} ค.ศ. 1995 จากน)นภาษาจาวาเรมเปyนท;นยมแพรLหลายขxนในชLวงปลายป} ค.ศ. 1995 เมอบรษ)ท Netscape ไดUพ)ฒนาโปร Y Y แกรมเว5บเบราว#เซอร# Netscape 2.0 และไดUรวมเอาการทZางานของ โปรแกรมจาวาแอปเพล5ต (Java Applet) เขUามา เปyนคJณล)กษณะเดLนของโปรแกรม ซxงบรษ)ทอนๆ อาทเชLน IBM, Symantec, Inspire หรอ Microsoft ตLางก5ประกาศ สน)บสนJนการใชUงานของโปรแกรมภาษาจาวาในเวลาตLอมา ในชLวงเด;ยวก)นทางบรษ)ทซ)นไมโครซสเต5มส#ไดUนZาชJด พ)ฒนาโปรแกรมภาษาจาวาเวอร#ช)นแรก (Java Development Kit 1.0 หรอท;เร;ยกยLอวLา JDK 1.0) ออกมาแจกจLาย ตLอมาในป} ค.ศ. 1998 ทางบรษ)ทซ)นไมโครซสเต5มส#ไดUเผยแพรLโปรแกรมภาษาจาวา JDK 1.2 (แตLตLอมาไดUเปล;ยนชอ เปyน Java 2) และไดUแยกแพลตฟอร#มในการพ)ฒนาโปรแกรมภาษาจาวาเปyนหลายแพลตฟอร#มคอ J2EE สZาหร)บการ พ)ฒนาโปรแกรมประยJกต#บนเครองแมLขLาย (Server) J2ME สZาหร)บการพ)ฒนาโปรแกรมบนเครองโทรศ)พท#มอถอ และ J2SE สZาหร)บโปรแกรมมาตรฐานจาวาท;พ)ฒนาบนเครองคอมพวเตอร#พYนฐาน และป} ค .ศ. 2006 ทางซ)นไมโครซสเต5ม ส#ไดUเปล;ยนชอ J2 ท)Yงสามเปyน JavaEE, JavaME และ JavaSE ตามลZาด)บ ในเดอนมกราคม ป} ค.ศ. 2010 บรษ)ทออราเคล (Oracle Corporation) ซxงเปyนซอฟต#แวร#ท;พ)ฒนาโปรแกรม ฐานขUอมVล และซอฟต#แวร#ประยJกต#อนๆ ไดUเขUามาซYอกจการบรษ)ทซ)นไมโครซสเต5มส# ทZาใหUผVUพ)ฒนาเทคโนโลย;จาวาราย สZาค)ญไดUเปล;ยนเปyนบรษ)ทออราเคล ซxงไดUใชUเทคโนโลย;จาวาในซอฟต#แวร#ตางๆ จZานวนมาก ท)Yงน;Y บรษ)ทออราเคลก5จะ L ย)งคงไวUในหล)กการของเทคโนโลย;จาวาท;จะใหUมาตรฐานเปmด โปรแกรมเปmดรห)ส (Open Source) และสามารถทZางาน บนแพลตฟอร#มท;หลากหลายไดUเชLนเดม 1.6 เทคโนโลยจาวา เทคโนโลย;จาวาประกอบไปดUวยองค#ประกอบหล)กๆ สามสLวนด)งแสดงในรVปท; 1.4 คอ 1. Java Virtual Machine (JVM) เปyนเทคโนโลย;จาวาท;ทZาหนUาท;เปyนอนเตอร#พร;ตเตอร# ท;จะแปลโปรแกรม จาวาไบท#โคUด (Java Bytecode) ใหUเปyนภาษาท;เครองเขUาใจไดU 10 ความรVUเบYองตUนภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 22. 2. Java Runtime Environment (JRE) เปyนเทคโนโลย;จาวาท;ใชUในการร)นโปรแกรมภาษาจาวาอาทเชLน โปรแกรมจาวาประยJกต# (Java Application) และโปรแกรมจาวาแอปเพล5ต (Java Applet) JRE จะ ประกอบดUวย JVM และ Java Application Programming Interface (Java API) ท;จะรวบรวมคลาส และอนเตอร#เฟสตLางๆ ท;จZาเปyนตLอการใชUงานของโปรแกรมภาษาจาวา 3. Java Software Developer Kit (JDK) เปyนชJดพ)ฒนาโปรแกรมภาษาจาวาท;จะประกอบไปดUวย JVM ต)ว แปลภาษาจาวา (Java Compiler) เครองมอ (tool) อนๆ ในการพ)ฒนาโปรแกรม และ API ท)Yงหมดใน ภาษาจาวา ซxง API จะเปyนมาตรฐานคZาส)งตLางๆ ของภาษาจาวา รปท 1.4 องคประกอบของเทคโนโลยจาวา 1.6.1 Java Virtual Machine ภาษาจาวาออกแบบมาเพอใหUสามารถประมวลผลไดUก)บทJกแพลตฟอร#ม โดยไดUรวมหล)กการของต)วแปลภาษา ท)Yงคอมไพเลอร#และอนเตอร#พร;ตเตอร#ไวU โดยคอมไพเลอร#ของภาษาจาวาจะทZาหนUาท;แปลซอร#ดโคUดของโปรแกรม (ชอ ไฟล#.java) ใหUเปyนโปรแกรมไบท#โคUด (ชอไฟล#.class) โปรแกรมไบท#โคUดจะแตกตLางจากโปรแกรมภาษาเครองท; สามารถประมวลผลบนระบบปฏบ)ตการไดUโดยตรง แตLโปรแกรมไบท#โคUดจะประมวลผลไดUโดยผLานอนเตอร#พร;ตเตอร# ซxงจะแปลโปรแกรมไบท#โคUดแลUวส)งงานไปย)งเครองคอมพวเตอร# อนเตอร#พร;ตเตอร#แบบน;ม;ชอเร;ยกวLา JVM (Java Y Virtual Machine หรอเครองจ)กรสมมJตจาวา) ซxงข)YนตอนการทZางานของโปรแกรมภาษาจาวาสามารถแสดงไดUด)งรVปท; 1.5 JVM จะทZาหนUาท;แปลโปรแกรมไบท#โคUดใหUเปyนภาษาเครองท;ขxYนอยVLก)บแพลตฟอร#มโปรแกรมไบท#โคUดท; ประมวลผลโดยใชU JVM จะทZางานไดUเร5วกวLาโปรแกรมภาษาคอมพวเตอร#อนๆ ท;ใชUอนเตอร#พร;ตเตอร#ปกตในการ ประมวลผล ท)Yงน;เY นองจาก JVM จะม;ชJดคZาส)งท;ใกลUเค;ยงก)บชJดคZาส)งภาษาเครองของหนLวยประมวลผลกลางท;ใชUงาน ด)งน)น JVM จxงสามารถแปลคZาส)งของโปรแกรมไบท#โคUดไปเปyนคZาส)งภาษาเครองของหนLวยประมวลผลกลางท;ใชUงาน Y ไดUงLายกวLา นอกจากน;โปรแกรมไบท#โคUดจะไมLขxYนอยVLก)บแพลตฟอร#ม ด)งน)นเราสามารถท;จะนZาโปรแกรมไบท#โคUดท; Y Y ผศ. ธนศา เครอไวศยวรรณ ความรVUเบYองตUนภาษาจาวา 11
  • 23. คอมไพล#จากระบบปฏบ)ตการหนxง มาประมวลผลบนระบบปฏบ)ตการอ;นๆ ไดU หากระบบปฏบ)ตการน)นม; JVM อยVL Y JVM เปyนเครองจ)กรกลสมมJตท;ทZาหนUาท;เหมอนก)บระบบคอมพวเตอร#จรง โดยมาตรฐานของ JVM ท;กZาหนด โดยบรษ)ทซ)นไมโครซสเต5มส#จะม;ขUอกZาหนดตLางๆ เชLนเด;ยวก)บองค#ประกอบของระบบคอมพวเตอร#เชLน ชJดคZาส)ง (instruction set) และชJดร;จ;สเตอร# (register set) เปyนตUน และย)งม;ขอกZาหนดอนๆ เชLน เนYอท;ของหนLวยความจZา U (memory area) สแต5ก (stack), heap, garbage collection และรVปแบบของคลาสไฟล# (class file format) เปyนตUน ท)Yงน;ขUอกZาหนดของ JVM เปyนมาตรฐานท;เปmดเผย ทZาใหUบรษ)ทตLางๆ สามารถท;จะพ)ฒนา JVM ขxนมาเองไดU โดยไมL Y Y จZาก)ดอยVLเพ;ยง JVM ของบรษ)ทซ)นไมโครซสเต5มส#เทLาน)น และลLาสJดในเดอนพฤศจกายน ค.ศ. 2006 ทางซ)นไมโคร- Y ซสเต5มส# ไดUเปmดเผยซอร#สโคUดในการพ)ฒนาซอฟต#แวร#จาวาท)Yงหมด รปท 1.5 ขนตอนการทางานของโปรแกรมภาษาจาวา JVM ท;พ)ฒนามาใชUในปwจจJบ)นสLวนใหญLจะเปyนซอฟต#แวร# แตLก5ไดUม;การพ)ฒนา JVMในรVปแบบของฮาร#ดแวร# ขxYนมาบUางแลUวเชLน Java Chip ในปwจจJบ)น JVM ม;ใชUในระบบ ปฏบ)ตการคอมพวเตอร#ตางๆ โปรแกรมเว5บเบราว# L เซอร# เครองใชUไฟฟ‚าตLางๆ โทรศ)พท# เครองมอสอสารตLางๆ และสมารตคารด (Smart Card) จxงทZาใหUอJปกรณ#ตLางๆ เหลLาน;สามารถประมวลผลโปรแกรมท;พ)ฒนาโดยใชUภาษาจาวาไดU Y 1.6.2 Java Runtime Environment JRE จะร)นโปรแกรมไบท#โคUดท;แปลมาจาก JVM โดยจะม;ขนตอนการทZางานสาม ข)นตอนด)งแสดงในรVป )Y Y ท; 1.6 คอ 1. โหลดโปรแกรมไบท#โคUด ข)Yนตอนน;YจะเปyนการโหลดคลาสทJกคลาสท;จZาเปyนตLอการร)นโปรแกรม โดย 12 ความรVUเบYองตUนภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 24. ใชU Class Loader 2. ตรวจสอบโปรแกรมไบท#โคUด ข)นตอนน;เปyนการตรวจสอบโดยใชU Byte Code Verifier วLาโปรแก Y Y รมไบท#โคUดถVกตUองตามขUอกZาหนดของ JVM หรอไมL และโปรแกรมจะตUองไมLม;คZาส)งใดท;ส)งงานแลUวจะ ทZาใหUเกดขUอผดพลาดก)บระบบ เชLน การแปลงขUอมVลท;ผดพลาด หรอการพยายามบJกรJกเขUาสVLระบบ ภายใน 3. ร)นโปรแกรมไบท#โคUด ข)นตอนน;Yจะเปyนการร)นโปรแกรมไบท#โคUด โดยใชU Runtime Interpreter Y รปท 1.6 ขนตอนการทางานของ JRE 1.6.3 Java Development Kit JDK คอชJดพ)ฒนาโปรแกรมภาษาจาวาของบรษ)ทซ)นไมโครซสเต5มส# ซxงแตLเดมเร;ยกวLา JDK ท)Yงน;Yบรษ)ทซ)น ไมโครซสเต5มส#ไดUเปล;ยนชอมาเปyน Java 2 ต)YงแตL JDK เวอร#ช)น 1.2 ชJดโปรแกรม JDK ท;ใชUในปwจจJบนคอเวอร#ช)น 6 ) (สามารถ download ไดUท; http://java.sun.com) จะประกอบไปดUวยโปรแกรมตLางๆ อาทเชLน โปรแกรมคอมไพเลอร# (javac.exe) โปรแกรมอนเตอร#พร;ตเตอร# (java.exe) และโปรแกรมด;บ)กเกอร# เปyนตUน แตLชJดโปรแกรม JDK จะ เปyนเพ;ยงเซ5ตยLอยของโปรแกรมประเภท Software Development Kit (SDK) ท)Yงน;Yเนองจาก JDK จะไมLม;โปรแกรม อ;ดเตอร#สZาหร)บการเข;ยนซอร#ดโคUดหรอร)นโปรแกรม ด)งน)นผVUใชUจะตUองใชUโปรแกรม SDK อนชLวยในการเข;ยนซอร#ด Y โคUด นอกจากน;โปรแกรมท;อยVLใน JDK จะเปyนโปรแกรมท;ตUองเร;ยกใชUงานผLานทาง command line จxงไมLสะดวก Y ผศ. ธนศา เครอไวศยวรรณ ความรVUเบYองตUนภาษาจาวา 13
  • 25. ในการใชUงาน แตLก5ม;ขUอด;ตรงท;ทZาใหUผVUท;เรมตUนในการพ)ฒนาโปรแกรมสามารถเขUาใจข)YนตอนตLางๆ ของการพ)ฒนา โปรแกรมโดยใชUภาษาจาวาไดUด;ขxYน โดยไมLมJLงเนUนการใชUเครองมอหรอคZาส)งตLางๆ ท;ม;อยVLในชJดพ)ฒนาโปรแกรมภาษา จาวาโปรแกรมอนๆ นอกจากโปรแกรม JDK ท;พ)ฒนาโดยบรษ)ทซ)นไมโครซสเต5มส#แลUว บรษ)ทอนๆ ก5ม;การพ)ฒนาโปรแกรม JDK ขxYนมา โดยบางสLวนอาจใชUซอร#โคUดของทางซ)นไมโครซสเต5มส# ซxงโปรแกรม JDK เหลLาน;Yจะม;มาตรฐานคZาส)งท;เหมอน ก)นแตLอาจจะม;ขUอแตกตLางในคJณล)กษณะอนๆ เชLน คอมไพเลอร#หรอ Garbage Collection ต)วอยLางของโปรแกรม JDK อนๆ ม;อาทเชLน J9 ของบรษ)ทไอบ;เอ5ม หรอ JRockit ของบรษ)ทออราเคล เกร%ดความร! NetBeans เปนชดพ)ฒนาโปรแกรมแบบเป;ดซอรสโคดของบรษ)ทซ)น ไมโครซสเต9มสซงสามารถดาวนโหลดมาใชไดจากเว9บไซต www.netbeans.org โปรแกรม NetBeans ถ1กพ)ฒนาเรมตนโดย กลมน)กศกษาท%มหาวทยาล)ย Charles ท%ประเทศสาธารณร)ฐเชค ซง ภายหล)งก9จดต)งเปนบรษ)ทเพอขายโปรแกรม NetBeans ในป6 1997 ) กอนท%จะถ1กบรษ)ทซ)นไมโครซสเต9มสเขามาซอในป6 1999 แลวจ)ดให เปนโปรแกรมแบบฟร%แวร ป>จจบ)นโปรแกรม NetBeans เปนเวอรช)น 6.8 (เดอนม%นาคม ป6 ค.ศ. 2010)ท% สามารถใชพ)ฒนาโปรแกรมจาวาไดทกแพลตฟอรมท)ง Java SE, Java ME และ Java EE รวมถงการ พ)ฒนา SOA และเข%ยนโปรแกรมภาษาอนๆ อาทเชน C/C++, PHP และ Ruby เปนตน สLวน SDK สZาหร)บการพ)ฒนาโปรแกรมภาษาจาวาท;ม;อยVLในปwจจJบนจะม;ท)Yงท;เปyนโปรแกรมแบบฟร;แวร# ) (freeware) หรอโปรแกรมเพอการคUา (commercial software) อาทเชLน • Netbeans ของบรษ)ท Sun Microsystems (http://www.netbeans.org) • Eclipse ของบรษ)ท IBM (http://eclipse.org) • JDeveloper ของบรษ)ท Oracle (http://www.oracle.com) • intelliJ IDEA ของบรษ)ท JetBrains (http://www.jetbrains.com/idea) โปรแกรม SDK เหลLาน;จะม;เครองมอเพอชLวยในการสรUางโปรแกรมภาษาจาวาในรVปแบบตLางๆ ไดUงLายขxYนอาท Y เชLน เครองมอชLวยในการออกแบบโปรแกรมกราฟmก สZาหร)บชJดพ)ฒนาโปรแกรม JDK น)นจZาเปyนตUองม;โปรแกรมอด;เตอร# (Editor)เพอใชUในการเข;ยนซอร#ดโคUด Y 14 ความรVUเบYองตUนภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 26. ของโปรแกรมภาษาจาวา ซxงสามารถท;จะใชUโปรแกรม Text Editor ท)วไปไดUเชLน โปรแกรม Notepad ในระบบ ปฏบ)ตการ Windows แตLหากตUองการพ)ฒนาโปรแกรมใหUเร5วขxน ผVUใชUควรเลอกใชUโปรแกรมอด;เตอร#ท;ออกแบบมาเพอ Y เข;ยนซอร#ดโคUดของโปรแกรมภาษาจาวาโดยเฉพาะ ซxงโปรแกรมเหลLาน;จะทZางานคลUายก)บโปรแกรมแบบ SDK โดยผVU Y ใชUสามารถเร;ยกคZาส)งในการคอมไพล# หรอการร)นโปรแกรมท;พ)ฒนาขxนจากเมนVท;กZาหนดไวUไดUตวอยLางโปรแกรม Y ) อด;เตอร#แบบน;คอ Y • EditPlus ของบรษ)ท ES-Computing (http://www.editplus.com) • JCreator ของบรษ)ท Xinox Software (http://www.jcreator.com) 1.7 จ%ดเด0นของภาษาจาวา บรษ)ทซ)นไมโครซสเต5มส#ไดUระบJถxงจJดเดLนของภาษาจาวาไวUด)งน;Y • ความงLาย (Simple) ภาษาจาวาเปyนภาษาท;งLายตLอการศxกษาและพ)ฒนาโปรแกรม ท)Yงน;เพราะภาษาจาวา Y พ)ฒนาโดยต)ดขUอดUอยของภาษา C++ ออกไปอาทเชLน เรองของการใชU pointer • ภาษาเชงอ5อบเจกต# (Object-Oriented) ภาษาจาวาเปyนภาษาคอมพวเตอร#เชงอ5อบเจกต#ท;สมบVรณ#โดยม; คJณล)กษณะเดLนของโปรแกรมเชงอ5อบเจกต#คอ การสบทอด การหLอหJม และการม;ไดUหลายรVปแบบ U • การกระจาย (Distributed) ภาษาจาวาม;ชดคZาส)งท;เปyนแพคเก5จ (Package) ในการจ)ดการก)บโปรโตคอล J TCP/IP ทZาใหUสามารถพ)ฒนาโปรแกรมเชงอ5อบเจกต#แบบกระจาย (Distributed Object) ผLานระบบ เครอขLายอนเทอร#เน5ตไดUงLาย • การป‚องก)นการผดพลาด (Robust) ภาษาจาวาเปyนภาษาคอมพวเตอร#ท;ออกแบบมาเพอใหUโปรแกรมท; พ)ฒนาขxนม;ความนLาเชอถอ โดยม;การตรวจสอบการผดพลาดท;อาจเกดขxนในข)นตอนตLางๆ เชLน ข)นตอนการ Y Y Y Y คอมไพล# และการร)นโปรแกรม เปyนตUน • ความปลอดภ)ย (Secure) ภาษาจาวาออกแบบมาเพอพ)ฒนาโปรแกรมบนระบบเครอขLาย และม;การกระจา ยการทZางานบนระบบเครอขLายอนเทอร#เน5ต ด)งน)นจxงตUองสรUางระบบป‚องก)นความปลอดภ)ยจากไวร)ส Y คอมพวเตอร# และการแกUไขโปรแกรมจากภายนอก • สถาปwตยกรรมกลาง (Architecture Neutral) โปรแกรมภาษาจาวาจะคอมไพล#ไดUโปรแกรมไบท#โคUด (byte code) ซxงสามารถทZางานบนสถาปwตยกรรมคอมพวเตอร#ท;ม;หนLวยประมวลผลกลางและระบบปฏบ)ต การตLางๆ ไดU • เคลอนยUายงLาย (Portable) ขUอกZาหนดของภาษาจาวาจะไมLขนอยVLก)บระบบคอมพวเตอร#ใดโดยเฉพาะ xY ด)งน)นโปรแกรมภาษาจาวาจxงสามารถประมวลผลไดUก)บระบบคอมพวเตอร#ทJกประเภท Y ผศ. ธนศา เครอไวศยวรรณ ความรVUเบYองตUนภาษาจาวา 15
  • 27. อนเตอร#พร;ต (Interpreted) ภาษาจาวาจะใชUอนเตอร#พร;ตเตอร#ในการแปลโปรแกรมไบท#โคUดใหUเปyนภาษา เครอง ด)งน)นจxงทZาใหUขบวนการการพ)ฒนาโปรแกรมเปyนไปไดUอยLางรวดเร5ว เชLนเด;ยวก)บภาษาคอมพวเตอร# Y อนๆ ท;ใชUอนเตอร#พร;ตเตอร# • ประสทธภาพสVง (High Performance) โดยปกตโปรแกรมอนเตอร#พร;ตเตอร#ท;ทZาหนUาท;แปลโปรแก รมไบท#โคUดจะทZางานชUา แตLเทคโนโลย;จาวาไดUพ)ฒนาใหUม;การแปลโปรแกรมไบท#โคUด ในข)นตอนการร)น Y โปรแกรมใหUเปyนภาษาเครองแบบท)นท; ท)นใด (Just In Time) ท;ทZางานไดUรวดเร5วเท;ยบเทLาก)บคอมไพเลอร# เพอไดUโปรแกรมจาวาท;ม;ประสทธภาพในการประมวลผลสVง • ม)ลตเธรด (Multithreaded) ภาษาจาวาม;ความสามารถท;จะประมวลผลหลายๆ งานไดUพรUอมก)น • พลว)ต (Dynamic) ภาษาจาวาออกแบบมาเพอท;จะใหUปร)บเปล;ยนเพมเตมไลบาร; (library) ตLางๆ ไดUงLาย ซxงแตกตLางจากภาษาซ; หรอ C++ 1.8 แพลตฟอร.มของเทคโนโลยจาวา แพลตฟอร#ม (Platform) คอฮาร#ดแวร#และสภาวะแวดลUอมทางซอฟต#แวร# (Software Environment) ท; โปรแกรมจะใชUในการประมวลผลโดยท)วไป แพลตฟอร#มจะนยามโดยพจารณาจากองค#ประกอบของฮาร#ดแวร#และระบบปฏบ)ตการท;ใชUเชLน แพลตฟอร#ม ของระบบปฏบ)ตการ Windows XP บนเครองไมโครคอมพวเตอร# Pentium IV แตLนยามของแพลตฟอร#มสZาหร)บ เทคโนโลย;จาวาจะแตกตLางจากนยามท;ใชUกนท)วไป ท)Yงน;จะพจารณาจากองค#ประกอบของซอฟต#แวร#เทLาน)นด)งแสดงใน ) Y Y รVปท; 1.7 ซxงแพลตฟอร#มของเทคโนโลย;จาวาจะประกอบดUวย • Java Virtual Machine (JVM) • Java Application Programming Interface (Java API) รปท 1.7 แพลตฟอรมของเทคโนโลยจาวา 16 ความรVUเบYองตUนภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 28. โดยท; JVM จะเปyนสLวนฐานของแพลตฟอร#มเพอใชUในการตดตLอก)บแพลตฟอร#มสLวนท;เปyนฮาร#ดแวร# สLวน Java API เปyนชJดแพคเก5จท;รวบรวมคลาสและอนเตอร#เฟสตLางๆ ท;เปyนประโยชน#ตLอการใชUงานของโปรแกรมท;พ)ฒนา โดยภาษาจาวาเชLน คลาสท;เก;ยวขUองก)บสLวนตLอประสานกราฟmกก)บผVUใชU (Graphical User Interface) เปyนตUน บรษ)ทซ)นไมโครซสเต5มส#ไดUกZาหนดแพลตฟอร#มของเทคโนโลย;จาวาใหUม;สามรVปแบบคอ • Java Platform, Standard Edition (Java SE) • Java Platform, Enterprise Edition (Java EE) • Java Platform, Micro Edition (Java ME) โดยแตLละแพลตฟอร#มจะม; JVM และ API ท;แตกตLางก)น และมJLงเนUนท;จะใชUในการพ)ฒนาโปรแกรมภาษาจาวา สZาหร)บระบบคอมพวเตอร#หรออJปกรณ#ท;แตกตLางก)น ด)งแสดงในรVปท; 1.8 รปท 1.8 แพลตฟอรมของ Java 2 ในรปแบบต%างๆ โปรแกรมจาวาท;ใชUบนเครองคอมพวเตอร#โดยท)วไป จะใชUแพลตฟอร#มท;เปyน Java SE สLวนแพลตฟอร#ม Java EE มJLงเนUนการพ)ฒนาโปรแกรมภาษาจาวาท;ใชUงานบนเครองแมLขLาย (Server) สZาหร)บระบบงานในองค#กร (Enterprise) และแพลตฟอร#ม Java ME ใชUในการพ)ฒนาโปรแกรมจาวาบนอJปกรณ#ขนาดเล5ก เชLน โทรศ)พท#เคลอนท; หรอ PDA เปyนตUน ผศ. ธนศา เครอไวศยวรรณ ความรVUเบYองตUนภาษาจาวา 17
  • 29. 1.8.1 Java Platform, Standard Edition แพลตฟอร#ม Java SE เปyนแพลตฟอร#มจาวามาตรฐานท;ใชUในการพ)ฒนาโปรแกรมภาษาจาวาเพอใชUงานก)บ เครองคอมพวเตอร#ท)วไป Virtual Machine ท;กZาหนดไวUในแพลตฟอร#มน;Yคอ JVM และม; Java API ท;กZาหนดไวU ตLางๆ อาทเชLน java.lang, java.util, java.io และ java.net แพลตฟอร#ม Java SE ใชUในการพ)ฒนาโปรแกรมจาวาท;ใชUในเครองคอมพวเตอร#ลVกขLาย โดยแบLงออกเปyน 2 ประเภท คอ • โปรแกรมจาวาประยJกต# (Java Application) คอ โปรแกรมท;ใชUงานท)วไป • โปรแกรมจาวาแอปเพล5ต (Java Applet) คอโปรแกรมภาษาจาวาท;รนบนเว5บเบราว#เซอร# ) เวอร#ชนลLาสJดของ Java SE คอเวอร#ช)น 7 (เดอนม;นาคม ค.ศ. 2010) ซxงผVUใชUสามารถ download ไดUฟร;ทาง ) เว5บไซต#ท;ชอ java.sun.com 1.8.2 Java Platform, Enterprise Edition แพลตฟอร#มจาวารJนน;Y ม;จJดประสงค#เพอใชUพ)ฒนาโปรแกรมภาษาจาวาสZาหร)บเครองแมLขาย โดยมJLงเนUนการ L L พ)ฒนาโปรแกรมท;เปyน N-tier สZาหร)บงานในองค#กร โดยใชUโปรแกรม Application Server หรอโปรแกรม Web Server ท;เร;ยกวLาโปรแกรมจาวาแบบ Servlet โปรแกรม Application Server เปyนโปรแกรมท;ชLวยในการพ)ฒนา โปรแกรมภาษาจาวาท;สามารถเปล;ยนแปลง แกUไข และนZากล)บมาใชUใหมLไดUงLาย โดยพ)ฒนาเปyนสLวนประกอบอ5อบเจกต# (Object Component) ท;เร;ยกวLา Enterprise Java Bean (EJB) โปรแกรม Web Server หรอ Application Server ท;ใชUก)บภาษาจาวาในปwจจJบนม;ท)Yงโปรแกรมท;เปyนแบบเปmดซอร#สโคUด อาทเชLน Tomcat, GlassFish ) หรอ JBoss และโปรแกรมเพอการคUา เชLน WebLogic หรอ WebSphere สZาหร)บ เวอร#ชนลLาสJดของ Java EE ) คอ Java EE6 (เดอนม;นาคม ค.ศ. 2010) เกร%ดความร! การพ)ฒนาโปรแกมบน Web Server จะตองม%เครองล1กขายในการแสดงผลผานทางอนเทอรเน9ต ซงโดยมากจะใชโปรแกรมเว9บเบราวเซอรในการแสดงผล การพ)ฒนาโปรแกรม Web Server จะตองม% การตดต)งเครองแมขายและโปรแกรม Web Server ท%อาจใชเครองคอมพวเตอรแมขายท%ม%ประสทธภาพ ส1งและใชระบบปฎบ)ตการส(าหร)บแมขายเชน Windows Server, Linux และ Solaris เปนตน ภาษาท% นยมใชในการพ)ฒนาโปรแกรมบน Web Server ท%นยมในป>จจบ)นคอ Java, PHP และ ASP.NET 18 ความรVUเบYองตUนภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 30. ส(าหร)บโปรแกม Web Server ท%เปนท%นยมต)วหนงในภาษาจาวาคอ Tomcat ซงเปนโปรแกรมแบบเป;ดเผยซอรสโคด ท%พ)ฒนาโดยองคกร Apache Software Foundation ซงสามารถท(างานไดบนระบบปฎบ)ตการตางๆ อาท เชน Linux และ Windows โดยเวอรช)นป>จจบ)นคอ Tomcat 6.0 (เดอน ม%นาคม ค.ศ. 2010) 1.8.3 Java Platform, Micro Edition แพลตฟอร#ม Java ME เปyนแพลตฟอร#มจาวาท;ใชUในการพ)ฒนาโปรแกรมภาษาจาวา เพอใชUงานก)บอJปกรณ# ไฟฟ‚า และเครองมอสอสารตLางๆ อาทเชLน โทรศ)พท#มอถอ หรอ PDA (Personal Digital Assistant) เปyนตUน แพลตฟอร#ม Java ME จะใชU Virtual Machine ท;ม;ขนาดเล5กกวLา JVM ท;ใชUในเครองคอมพวเตอร#ท)วไป ท)Yงน;Y เนองจากอJปกรณ#เหลLาน)นจะม;หนLวยความจZานUอยกวLา และจะม;หนLวยประมวลผลกลางท;มความเร5วชUากวLา Y ; แตLเนองจากปwจจJบนม;การออกโทรศ)พท#มอถอรJLนตLางๆออกมามากโดยใชUระบบปฎบ)ตการท;ตางก)นเชLน คLาย ) L โนเก;ยจะใชUระบบ Symbian คLาย Apple จะใชU iPhone และคLาย Google จะใชU Andriod จxงทZาใหUแพลตฟอร#มในการ พ)ฒนาโปรแกรมจาวาบนโทรศ)พท#มอถอม;ความหลากหลายมากขxYน กลLาวคอนอกจากแพลตฟอร# Java ME ท;สามารถ ทZางานบนโทรศ)พท#สLวนใหญLรวมท)Yงระบบปฎบ)ตการ Symbian แลUว ย)งม;แพลตฟอร#ม Android ท;พ)ฒนาโปรแกรม จาวาโดยใชUคZาส)งมาตรฐานท;อยVLใน Java SE และแพลตฟอร#ม Java FX ท;พ)ฒนาลLาสJดโดยบรษ)ทซ)นไมโครซสเต5มส# เกร%ดความร! Android เปนแพลตฟอรมส(าหร)บโทรศ)พทมอถอท%พ)ฒนาโดยกลม Open Handset Alliance ท%ประกอบดวยบรษ)ทตางๆ อาทเชน Google, HTC, Intel และ Samsung เปนตน โดยก(าหนด แพลตฟอรมท%ใชระบบปฎบ)ตการ Linux บนเครองโทรศ)พทมอถอ และค(าส)งในการพ)ฒนาโปรแกรมโดยใชภาษาจาวา โทรศ)พทมอถอ ท%ใชมาตรฐาน Android รนแรกคอ T1-Mobile G1 โดยบรษ)ท HTC เมอปลายป6ค.ศ. 2008 และไดม%การน(าเขามาจ(าหนายใน ประเทศไทยแลว ภายหล)งจากท;ทางบรษ)ทออราเคลไดUเขUามาซYอกจการของบรษ)ทซ)นไมโครซสเต5มส# ทางบรษ)ทก5ไดUประกาศ สน)บสนJนใหUเทคโนโลย;จาวาเปyนแบบระบบเปmด ท;สามารถร)นไดUหลากหลายอJปกรณ#เชLนเดม (Complete. Open. Integrated) โดยกZาหนดใหUม; API และ JVM ท;หลากหลายเชLนเดมด)งแสดงในรVปท; 1.9 ผศ. ธนศา เครอไวศยวรรณ ความรVUเบYองตUนภาษาจาวา 19
  • 31. รปท 1.9 แพลตฟอรมล%าส(ดของ Java Technology 1.9 โปรแกรมภาษาจาวา โปรแกรมจาวาท;อยVLบนแพลตฟอร#ม Java SE สามารถพ)ฒนาไดUสองรVปแบบคอ 1. โปรแกรมจาวาประยJกต# (Java Application) คอโปรแกรมประยJกต#ใชUงานท)วไป โดยโปรแกรมแบบน;จะ Y ทZางานภายใตUโปรแกรมอนเตอร#พร;ตเตอร#โดยตรง ซxงโปรแกรมล)กษณะน;เY ปyน stand-alone 2. โปรแกรมจาวาแอปเพล5ต (Java Applet) คอโปรแกรมภาษาจาวาท;จะทZางานภายใตUโปรแกรมเว5บ เบราว#เซอร#ท;ม; JVM อยVL 1.9.1 การสรางโปรแกรมจาวาประย%กต. การสรUางโปรแกรมจาวาประยJกต#จะม;ขนตอนด)งแสดงในรVปท; 1.10 ซxงสามารถอธบายพอส)งเขปไดUด)งน;Y )Y 1. ข)นตอนแรกจะเปyนการเข;ยนซอร#ดโคUดโดยใชUโปรแกรมอด;เตอร#ใดๆ โปรแกรมท; 1.1 เปyนต)วอยLาง Y โปรแกรมเพอพมพ#ขUอความ Hello World ออกทางจอภาพ โปรแกรมน;ใชUชอคลาสวLา HelloWorld ซxง Y ผVเU ข;ยนโปรแกรมจะตUองเข;ยนซอร#ดโคUดแลUวเก5บลงในไฟล#ท;ม;ชอเด;ยวก)บชอคลาส โดยม; extension เปyน .java กลLาวคอโปรแกรมน;Yจะเก5บไวUในชอ HelloWorld.java โปรแกรมน;จะม;เมธอด main()เปyนจJด Y เรมตUน 20 ความรVUเบYองตUนภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 32. 2. ข)นตอนท;สองจะเปyนการคอมไพล#โปรแกรม เพอแปลโปรแกรมซอร#ดโคUดใหUอยVLในรVปของโปรแกรมไบท# Y โคUด ชJดพ)ฒนาโปรแกรม JDK จะม;โปรแกรมชอ javac.exe ท;ทZาหนUาท;เปyนคอมไพล#เลอร# ซxงใน ต)วอยLางน;สามารถทZาการคอมไพล#โปรแกรมโดยใชUคZาส)งตLอไปน;Y Y javac HelloWorld.java ผลล)พธ#ท;ไดUจากการคอมไพล#โปรแกรมน;คอ โปรแกรมไบท#โคUดท;ชอ HelloWorld.class ใน Y กรณ;ท;โปรแกรมซอร#ดโคUดม;ขUอผดพลาด คอมไพเลอร#จะระบJขUอผดพลาดท;เกดขxน เพอใหUผVUเข;ยนโปรแกรม Y ทZาการแกUไขโปรแกรมซอร#ดโคUดกLอนท;จะทZาการคอมไพล#โปรแกรมใหมL 3. ข)นตอนการประมวลผลหรอร)นโปรแกรม เปyนการเร;ยกใชUอนเตอร#พร;ตเตอร#เพอแปลโปรแกรมไบท#โคUด Y ชJดพ)ฒนาโปรแกรม Java 2 SDK จะม;โปรแกรมชอ java.exe ท;ทZาหนUาท;เปyนโปรแกรมอนเตอร#-พร;ต เตอร# ซxงในต)วอยLางน;Yจะสามารถร)นโปรแกรมไบท#โคUดไดUโดยใชUคZาส)งตLอไปน;Y java HelloWorld โดยโปรแกรมจะใหUผลล)พธ#ด)งแสดงในรVปท; 1.11 โปรแกรมท( 1.1 เปนโปรแกรมเพอพมพขอความ Hello World public class HelloWorld { public static void main(String args[]){ System.out.println("Hello World"); } } รปท 1.10 ขนตอนการสร*างโปรแกรมจาวาประย(กต ผศ. ธนศา เครอไวศยวรรณ ความรVUเบYองตUนภาษาจาวา 21
  • 33. รปท 1.11 ผลลพธทได*จากการรนโปรแกรมท 1.1 1.9.2 การสรางโปรแกรมจาวาแอปเพล-ต การสรUางโปรแกรมจาวาแอปเพล5ต จะม;ขนตอนคลUายก)บการสรUางโปรแกรมจาวาประยJกต# แตLโปรแกรมจาวา )Y แอปเพล5ตจะประกอบดUวยไฟล#ท;เข;ยนขxนสองไฟล#คอ Y • โปรแกรมซอร#ดโคUด (.java) • โปรแกรมเว5บเพจ (.html) โปรแกรมท; 1.2 เปyนต)วอยLางของโปรแกรมจาวาแอปเพล5ตเพอแสดงขUอความ Hello World โปรแกรมน;Yจะ แตกตLางจากโปรแกรมจาวาประยJกต#ตรงท;ไมLม;เมธอด main() และจะไมLสามารถทZางานตามลZาพ)งไดU แตLจะตUองเร;ยก ใชUโดยผLานโปรแกรมภาษา HTML ต)วอยLางเชLน โปรแกรมท; 1.3 เปyนโปรแกรมภาษา HTML ท;เร;ยกใชUโปรแกรม HelloWorldApplet.class เพอประมวลผลภายใตUโปรแกรมเว5บเบราว#เซอร#ท;ม; JVM อยVL ข)นตอนการสรUาง Y โปรแกรมน;Yม;ด)งน;Y โปรแกรมท( 1.2 โปรแกรมจาวาแอปเพล9ตเพอพมพขอความ Hello World import java.awt.*; import javax.swing.*; public class HelloWorldApplet extends JApplet { public void paint(Graphics g) { g.drawString("Hello World",20,20); } } 22 ความรVUเบYองตUนภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 34. โปรแกรมท( 1.3 โปรแกรมภาษา HTML ท%เร%ยกใช HelloWorldApplet.class <HTML> <HEAD> <TITLE>HelloWorld Example</TITLE> </HEAD> <BODY> <APPLET CODE=”HelloWorldApplet.class” WIDTH=”300” HEIGHT=”300”> </APPLET> </BODY> </HTML> รปท 1.12 ขนตอนการสร*างโปรแกรมจาวาแอปเพล-ต 1. เข;ยนโปรแกรมซอร#ดโคUด (HelloWorldApplet.java) และโปรแกรม เว5บเพจ (HelloWord.html) โดยใชUโปรแกรมอด;เตอร#ใดๆ 2. คอมไพล#โปรแกรม HelloWorldApplet.java โดยใชUคอมไพเลอร#ด)งน;Y javac HelloWorldApplet.java ต)วอยLางน;จะไดUโปรแกรมไบท#โคUดท;ชอ HelloWorldApplet.class Y 3. ใชUโปรแกรมเว5บเบราว#เซอร#ใดๆ เชLน Internet Explorer หรอ Netscape เปmดโปรแกรมเว5บเพจท;ชอ HelloWorld.html ซxงจะเร;ยกโปรแกรมไบท#โคUดท;ชอ HelloWorldApplet.class โดยอ)ตโนม)ต และจะม;ผลร)นด)งรVปท; 1.13 ผศ. ธนศา เครอไวศยวรรณ ความรVUเบYองตUนภาษาจาวา 23
  • 35. รปท 1.13 ผลลพธทได*จากการรนโปรแกรมท 1.3 บนเว-บเบราวเซอร 1.10 ค0มอ Java API Java API เปyนขUอกZาหนดท;วLาดUวยคลาสและอนเตอร#เฟสตLางๆ ท;กZาหนดไวUในแพคเก5จมาตรฐานของภาษาจาวา แพคเก5จจะเปyนท;รวบรวมคลาสและอนเตอร#เฟสตLางๆ ท;มหนUาท;การทZางานคลUายก)นไวUในท;เด;ยวก)น Java API ม;แพค- ; เก5จท;สZาค)ญอยVหลายแพคเก5จ อาทเชLน java.lang, java.util, java.awt และ java.io เปyนตUน L เนองจาก Java API ม;แพคเก5จและคลาสตLางๆ อยVLเปyนจZานวนมาก จxงเปyนเรองยากในการท;จะจดจZาคลาสและ เมธอดตLางๆ ท)Yงหมดท;ม;อยVLไดU ด)งน)นชJดพ)ฒนาโปรแกรม JDK จะม;ไฟล#คVLมอ Java API ท;อยVLในรVปของไฟล# HTML Y ด)งแสดงในรVปท; 1.14 ซxงคVLมอ Java API จะประกอบไปดUวยเฟรมสามเฟรมคอ สLวนท;เ ปyนชอแพคเก5จ (มJมบนซUาย) สLวนท;เปyนชอคลาสและอนเตอร#เฟสตLางๆ ของแพคเก5จ (มJมลLางซUาย) และสLวนท;เปyนรายละเอ;ยดของคลาสหรอ อนเตอร#เฟส (ตรงกลาง) ซxงรVปท; 1.14 แสดงคVLมอ Java API ท;ระบJคลาสและอนเตอร#เฟสตLางๆ ในแพคเก5จ java.lang และเฟรมหล)กตรงกลางแสดงรายละเอ;ยดของคลาส String คVLมอ Java API จะแสดงรายละเอ;ยดตLางๆ ของคลาสหรออนเตอร#เฟสด)งน;Y • ลZาด)บการสบทอดของคลาส • คZาอธบายเก;ยวก)บคลาสและจJดประสงค#ท)วไป • รายชอคJณล)กษณะตLางๆ ของคลาส 24 ความรVUเบYองตUนภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 36. รายชอเมธอดตLางๆ ของคลาส • รายชอ Constructor ตLางๆ ของคลาส • คZาอธบายรายละเอ;ยดของคJณล)กษณะแตLละต)วของคลาส • คZาอธบายรายละเอ;ยดของเมธอดแตLละต)วของคลาส • คZาอธบายรายละเอ;ยดของ Constructor แตLละต)วของคลาส รปท 1.14 ค%ม0อ Java API สร%ปเนอหาของบท • ระบบคอมพวเตอรประกอบไปดวยสวนหลกสามสวนคอ ฮารดแวร ระบบปฏบตการ และโปรแกรม ประยกต • ภาษาคอมพวเตอรแบงออกเป$นสามประเภทคอ ภาษาเคร&อง ภาษาแอสเซมบล( และภาษาระดบส)ง • ภาษาระดบส)งแบงออกเป$นสองประเภทคอ ภาษาเชงกระบวนการ และภาษาเชงอ+อบเจกต ผศ. ธนศา เครอไวศยวรรณ ความรVUเบYองตUนภาษาจาวา 25
  • 37. ตวแปลภาษาแบงออกเป$นสองแบบคอ คอมไพเลอร และอนเตอรพร(ตเตอร • ภาษาจาวาเป$นภาษาเชงอ+อบเจกตท(&ใชท.งตวแปลภาษาแบบคอมไพเลอรและอนเตอรพร(ตเตอรในการ คอมไพลและรนโปรแกรม • คอมไพเลอรของภาษาจาวาจะท1าหนาท(&แปลโปรแกรมภาษาจาวาใหเป$นโปรแกรมไบทโคด และจะใชจาวา อนเตอรพร(ตเตอร (JVM) ในการแปลโปรแกรมไบทโคดใหเป$นภาษาเคร&อง • โปรแกรมภาษาจาวาสามารถท1างานขามแพลตฟอรมได ถาระบบคอมพวเตอรน.นม( JVM อย) • แพลตฟอรมของ Java ประกอบไปดวย JVM และ Java API ซ4&ง Java ม(แพลตฟอรม 3 แบบคอ Java SE, Java EE และ Java ME • ชดพฒนาโปรแกรมภาษาจาวา JDK ประกอบไปดวยโปรแกรมตางๆ ท(&ส1าคญคอ โปรแกรมคอมไพเลอร (javac.exe) และโปรแกรมอนเตอรพร(ตเตอร (java.exe) • โปรแกรมจาวาท(&อย)บนแพลตฟอรม Java SE สามารถพฒนาไดสองร)ปแบบคอโปรแกรมจาวาประยกตซ4&ง จะท1างานภายใต JVM โดยตรง และโปรแกรมจาวาแอปเพล+ตซ4&งจะท1างานภายใตเว+บเบราวเซอรท(&ม( JVM • ค)มอ Java API จะชวยในการคนหารายละเอ(ยดของแพคเก+จและคลาสตางๆ ท(&ม(อย)ในชดพฒนาโปรแกรม JDK 26 ความรVUเบYองตUนภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 38. บทท 2 พนฐานโปรแกรมภาษาจาวา เนYอหาในบทน;YเปyนการแนะนZาไวยากรณ#ของภาษาจาวา ซxงประกอบไปดUวยส)ญล)กษณ#หรอคZาตLางๆ ท;ใชUใน ภาษาจาวา ชนดขUอมVลแบบพYนฐาน และขUอมVลคLาคงท; การประกาศและเร;ยกใชUคZาส)งกZาหนดคLาต)วแปร นพจน#และต)ว ดZาเนนการประเภทตLางๆ วธ;การแปลงชนดขUอมVล ชนดขUอมVลแบบอUางอง และแนะนZาคZาส)งท;ใชUในการร)บขUอมVลเขUาและ แสดงผล ซxงเนYอหาในบทน;จะเปyนการแนะนZาการเข;ยนโปรแกรมเบYองตUนเพอกZาหนดคLาขUอมVลตLางๆ และแสดงผลล)พธ# Y ของการประมวลผล 2.1 การเขยนโปรแกรมภาษาจาวาเช,งอ-อบเจกต. ภาษาจาวาเปyนภาษาคอมพวเตอร# ท;ใชUหล)กการการพ)ฒนาโปรแกรมเชงอ5อบเจกต#ท;เร;ยกยLอวLาเปyนภาษา คอมพวเตอร#แบบ OOP การพ)ฒนาโปรแกรมเชงอ5อบเจกต#จะเปyนขบวนการการวเคราะห#ปญหาโดยการจZาลองปwญหา w วLาประกอบไปดUวยอ5อบเจกต#ใดบUาง แลUวจxงเข;ยนใหUอยVLในรVปแบบของโปรแกรมคอมพวเตอร# โปรแกรมเชงอ5อบเจกต#จะ ม;คZานยามท;สZาค)ญสองคZาคอ อ5อบเจกต# (Object) และคลาส (Class) คลาสเปร;ยบเสมอนพมพ#เข;ยวของอ5อบเจกต# อ5อบเจกต#ท;ถVกสรUางมาจากคลาสบางคร)Yงจะเร;ยกวLาเปyน instance ของคลาส ซxงอ5อบเจกต#ใดๆ จะตUองเปyน instance ของคลาสใดคลาสหนxง การเข;ยนโปรแกรมเชงอ5อบเจกต# ตUองม;การ กZาหนดนยามของคลาสกLอนท;จะสามารถสรUางอ5อบเจกต# (หรอ instance) ของคลาสไดU ซxงคลาสหนxงคลาสสามารถท; จะสรUางอ5อบเจกต#ไดUหลายอ5อบเจกต# ภายในคลาสจะประกอบดUวยคJณล)กษณะ (Attribute) ซxงก5คอขUอมVลท;เก5บอยVLในอ5อบเจกต# โดยจะแบLงออกเปyน สองประเภท คอต)วแปร (Variable) และคLาคงท; (Constant) คJณล)กษณะท;เปyนต)วแปรจะสามารถเปล;ยนคLาไดU สLวน คJณล)กษณะท;เปyนคLาคงท;จะไมLสามารถเปล;ยนคLาไดU และเมธอด (Method) ซxงก5คอวธ;การหรอการกระทZาท;นยามอยVLใน คลาส อ5อบเจกต#ท;สรUางมาจากคลาสน)น อาจม;คาคJณล)กษณะตLางก)นแตLจะม;การเร;ยกใชUเมธอดท;เหมอนก)น ต)วอยLางของ Y L การนยามคลาสท;ชอ Student ซxงม;คJณล)กษณชอ name และ เมธอดท;ชอ sayHi ม;ด)งน;Y public class Student { public String name; public void sayHi() { System.out.println(“Hello”); } } จากคZาส)งการประกาศจะเห5นวLาคZาส)งในภาษาจาวาจะถVกกZาหนดใหUอยVLบล5อกของ {} เชLนคJณล)กษณะและเมธอด ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 27
  • 39. ของคลาสก5จะอยVLในบล5อก {} ทZานองเด;ยวก)นคZาส)งตLางๆท;อยVLในเมธอดก5จะอยVLภายในบล5อก {} โดยท)วไปคลาสแตLละ คลาสจะม;คJณล)กษณะและเมธอดไดUไมLจZาก)ดจZานวน โดยท)วไปภาษาจาวาจะกZาหนดใหUชอไฟล#และชอคลาสตUองเปyนชอเด;ยวก)น และเปyนแบบ Case-sensitive กลLาวคอจะตUองใชUอ)กษรต)วเล5กต)วใหญLอยLางถVกตUอง กรณ;น;Yคลาสท;ชอ Student จะเข;ยนโปรแกรมในไฟล#ท;ชอ Student.java คลาสจะถVกเร;ยกใชUงานไดUเมอม;การสรUางอ5อบเจกต#ของคลาส โดยเร;ยกใชUคZาส)ง new จะตUองม;การกZาหนดชอ ของอ5อบเจกต#นน ต)วอยLางเชLนคZาส)งขUางลLางน;เY ปyนการสรUางอ5อบเจกต#ของคลาส Student ท;ชอ s1 )Y Student s1 = new Student(); โปรแกรมท;ร)นภาษาจาวาอาจม;หลายคลาส ซxงคลาสบางคลาสเปyนคลาสท;ถVกเร;ยกใชUมากจากคลาสอนเชLน คลาสท;ชอ String หรอ System แตLสZาหร)บโปรแกรมประเภทจาวาประยJกต# โปรแกรม JVM จะเร;ยกคลาสท;ม; เมธอดท;ชอ main ซxงม;รVปแบบด)งน;Y มาร)นเปyนเมธอดแรก public static void main(String args[]) { } โปรแกรมท; 2.2 แสดงต)วอยLางของคลาสท;ชอ Main ท;ม;เมธอดท;ชอ main ซxงม;คZาส)งในการสรUางอ5อบเจกต# ชนด Student แลUวเร;ยกใชUเมธอด sayHi ผลล)พธ#ของโปรแกรมน;Yจะเปyนการพมพ#ขUอความวLา Hello ด)งแสดงใน รVปท; 2.1 โปรแกรมท( 2.1 ต)วอยางการเข%ยนโปรแกรมท%เร%ยกใชคลาส Student public class Main { public static void main(String args[]) { Student s1 = new Student(); s1.sayHi(); } } การเข;ยนโปรแกรมในบทน;Y จะเนUนการเข;ยนแบบเชงอ5อบเจกต#โดยโปรแกรมสLวนใหญLจะเปyนการสรUางคลาส 28 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 40. ขxYนมาหนxงคลาสเชLน Student.java แลUวจะม;อ;กหนxงคลาสเชLน Main.java เพอมาสรUางอ5อบเจกต#ของคลาสแรกแลUว เร;ยกใชUเมธอดท;อยVLภายใน รปท 2.1 ผลลพธจากการรนโปรแกรมท 2.2 ภาษาจาวาต)YงแตLเวอร#ชน Java SE 5 ไดUกZาหนดรVปแบบเมธอดท;ชอ main ใหUสามารถท;จะเข;ยนไดUอ;กรVปแบบ ) หนxงด)งน;Y public static void main(String... args) { } 2.2 ไวยากรณ.ระดบของคDา คZาหรอขUอความท;สามารถเข;ยนในโปรแกรมภาษาจาวา จะตUองเปyนคZาหรอขUอความในรVปแบบใดรVปแบบหนxง ของประเภทตLางๆ เหลLาน;Y • คอมเม5นต# (Comment) • Identifier • ค;ย#เวร#ด (Keyword) • ส)ญล)กษณ#แยกคZา (Separator) • ชLองวLาง (Whitespace) • ขUอมVลคLาคงท; (Literals) 2.2.1 คอมเม-นต. คอมเม5นต#คอขUอความท;แทรกอยVLภายในโปรแกรม ซxงคอมไพเลอร#จะไมLแปลขUอความน;ใหUเปyนสLวนหนxงของ Y โปรแกรม กลLาวคอขUอความน;YจะไมLม;ผลตLอการทZางานของโปรแกรม คอมเม5นต#เข;ยนไวUเพออธบายโปรแกรม เพอใหUผVU อLานเขUาใจโปรแกรมงLายยงขxYน และชLวยทZาใหUการแกUไขและปร)บปรJงโปรแกรมเปyนไปไดUงLายขxน Y ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 29
  • 41. ภาษาจาวากZาหนดรVปแบบของการเข;ยนคอมเม5นต#ไวUสามรVปแบบด)งน;Y 1. คอมเม5นต#สZาหร)บขUอความบรรท)ดเด;ยว จะใชUเครองหมาย // นZาหนUาขUอความท;ตUองการเข;ยน ซxงจะอยVLสLวน ไหนของบรรท)ดก5ไดU 2. คอมเม5นต#สZาหร)บขUอความต)YงแตLหนxงบรรท)ดขxนไป จะเรมตUนดUวยเครองหมาย /* และสYนสJดดUวยเครอง- Y หมาย */ 3. คอมเม5นต#สZาหร)บขUอความท;ตUองการสรUางเปyนไฟล#เอกสาร ท;เปyนไฟล#ประเภท HTML จะเรมตUนดUวย เครองหมาย /** และสYนสJดดUวยเครองหมาย */ คอมเม5นต# รVปแบบน;YสามารถสรUางเปyนไฟล#เอกสารไดUโดย ใชUโปรแกรม javadoc.exe โปรแกรมท( 2.2 แสดงการเข%ยนคอมเม9นตในร1ปแบบตางๆ /* This program is to show how to write comments */ public class CommentDemo { // Main method public static void main(String args[]) { /** This is a comment for documentation */ System.out.println("Document"); } } 2.2.2 Identifier identifier คอชอท;ต)Yงขxนในภาษาจาวา ซxงอาจเปyนชอของคลาส ชอของต)วแปร ชอของเมธอด หรอชอของคLา Y คงท; ซxงจะตUองเปyนไปตามกฎการต)Yงชอ ด)งน;Y • identifier จะตUองขxYนตUนดUวยอ)กขระ A-Z, a-z, _ หรอ $ เทLาน)น Y • identifier ท;ประกอบไปดUวยต)วอ)กขระมากกวLาหนxงต)ว ต)วอ)กขระหล)งจากต)วแรกน)นจะตUองเปyนต)วอ)กขระ Y ขUางตUน หรอเปyนต)วเลข 0 ถxง 9 เทLาน)น Y • identifier จะตUองไมLตรงก)บค;ย#เวร#ด identifier ในภาษาจาวาจะถอวLาต)วอ)กษรพมพ#ใหญLและต)วอ)กษรพมพ#เล5กตLางก)น (Case Sensitive) ด)งน)นY identifier ท;ชอ myVariable จะแตกตLางจาก MyVariable ต)วอยLางของ identifier ท;ถVกตUอง • MyVariable • _MyVariable • $x 30 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 42. • This_is_also_a_variable ต)วอยLางของ identifier ท;ไมLถVกตUอง • My Variable • 9pns • a+c • Hello’World • public หลกการตงชอทน,ยมปฏ,บต,กนโดยทวไป แนวทางปฏบ)ตท;ใชUในการต)Yงชอจะม;ขUอกZาหนดด)งน;Y • การต)Yงชอคลาส – จะขxนตUนดUวยต)วอ)กษรพมพ#ใหญLแลUวตามดUวยต)วอ)กษรพมพ#เล5กหรอต)วเลข โดยจะใชUต)วอ)กษรพมพ# Y ใหญLสZาหร)บอ)กษรนZาของแตLละคZาท;ตามมาในชอ – ควรเปyนคZานาม – ต)วอยLางเชLน Main, HelloWorld, Student หรอ GraduateStudent เปyนตUน • การต)Yงชอต)วแปร ชอคJณล)กษณะ หรออ5อบเจกต# – จะขxนตUนดUวยต)วอ)กษรพมพ#เล5ก โดยจะใชUต)วอ)กษรพมพ#ใหญLสZาหร)บอ)กษรนZาของแตLละคZาท;ตามมาใน Y ชอ – ควรเปyนคZานามหรอเปyนชอส)Yนๆ – ต)วอยLางเชLน x, s1, id, name หรอ thesisTitle เปyนตUน • การต)Yงชอเมธอด – จะใชUหล)กการเด;ยวก)บการต)Yงชอต)วแปร แตLควรเปyนคZากรยา – ต)วอยLางเชLน getName, sayHi, setName หรอ showDetails เปyนตUน • การต)YงชอคLาคงท; – จะใชUตวอ)กษรพมพ#ใหญLท)Yงหมด และจะแยกคZาโดยใชUเครองหมาย_ (underscore) ) – ควรเปyนคZานาม – ต)วอยLางเชLน MINIMUM, MIN_GPA เปyนตUน 2.2.3 คย.เว,ร.ด ค;ย#เวร#ดคอชอท;ม;ความหมายพเศษในภาษาจาวา คอมไพเลอร#ของภาษาจาวาจะเขUาใจความหมายและคZาส)งท;จะ ตUองดZาเนนการสZาหร)บค;ย#เวร#ดแตLละต)ว ภาษาจาวาไดUกZาหนดค;ย#เวร#ดตLางๆ ไวUด)งแสดงในตารางท; 2.1 ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 31
  • 43. ตารางท 2.1 ค;ย#เวร#ดท;ใชUในภาษาจาวา abstract continue for new switch assert default goto package synchronied boolean do if private this break double implements protected throw byte else import public throws case enum instanceof return transient catch extends int short try char final interface static void class finally long strictfp volatile const float native super while ค;ย#เวร#ดเหลLาน;YไมLสามารถจะนZามาต)Yงเปyน identifier ไดU ซxงจากค;ย#เวร#ดขUางตUนจะเห5นวLาค;ย#เวร#ดทJกต)วจะเปyนต)ว อ)กษรพมพ#เล5ก และจะม;ค;ย#เวร#ด goto และ const เปyนค;ย#เวร#ดท;ไมLไดUตรงก)บคZาส)งใดในภาษาจาวา สLวนคZาวLา true และ false ไมLไดUเปyนค;ย#เวร#ดในภาษาจาวาแตLจะเปyนขUอมVลคLาคงท;ชนดตรรกะ เชLนเด;ยวก)บคZาวLา null ซxงเปyน ขUอมVลคLาคงท;ของต)วแปรท;ม;ชนดขUอมVลแบบอUางองท;จะกลLาวถxงตLอไป 2.2.4 สญลกษณ.แยกคDา ภาษาจาวาม;ส)ญล)กษณ#แยกคZาตLางๆ ท;สามารถนZาไปใชUเข;ยนในโปรแกรมไดUด)งตารางท; 2.2 ตารางท 2.2 หนUาท;ของเครองหมายตLางๆ ท;ใชUในภาษาจาวา สญลกษณ.แยกคDา หนาท ; เพอระบ%การส,นส%ดของคDาสงต0างๆ ภายในภาษาจาวา สDาหรบต0อทายเมธอดหรอคDาสงอนๆ ในภาษาจาวา เช0น () if,for เปHนตน , สDาหรบแยกตวแปรหรอคDาสงในภาษาจาวา เพอใชในการระบ%คณลกษณะหรอเมธอดของอ-อบเจกต. หรอใช % . ในการระบ%แพคเก-จของภาษาจาวา 32 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 44. เพอระบ%บล-อกคDาสงของภาษาจาวา คDาสงต0างๆ ของภาษาจาวา จะอย0ภายในบล-อกอาท,เช0น คDาสงทอย0ภายในคลาส ภายใน {} เมธอด หรออย0ภายในช%ดคDาสงโครงสรางควบค%มต0างๆ เช0น if,while หรอ for เปHนตน โดยปกต,บล-อกเหล0านสามารถ ซอนกนได 2.2.5 ช0องว0าง โปรแกรมภาษาจาวาสามารถท;จะม;ชLองวLางเพอแยกคZา ประโยค หรอคZาส)งตLางๆ ภายในโปรแกรมไดU โดยชLอง วLางจะม;ขนาดเทLาไรก5ไดU ท)Yงน;Yคอมไพเลอร#ของภาษาจาวาจะไมLนZาสLวนท;เปyนชLองวLางมาเก;ยวขUองก)บขนาดของโปรแก รมไบท#โคUด ชLองวLางจะชLวยทZาใหUรVปแบบของโปรแกรมซอร#ดโคUดดVงLายขxน ซxงรVปแบบของชLองวLางประกอบดUวย Y • ชLองวLาง (กดค;ย# Space บนค;ยบอร#ด) # • แท5ป (กดค;ย# Tab บนค;ยบอร#ด) # • การขxYนบรรท)ดใหมL (กดค;ย# Enter บนค;ย#บอร#ด) 2.2.6 ขอมลค0าคงท ขUอมVลคLาคงท;คอคZาท;ใชUแสดงขUอมVลท;เปyนต)วเลข ต)วอ)กขระ ขUอความ หรอคLาทางตรรกะ ซxงในภาษาจาวาไดU กZาหนดขUอมVลคLาคงท;ไวU 5 ประเภทด)งน;Y 1. ตรรกะ (Boolean) 2. ต)วอ)กขระ (Character) 3. ต)วเลขจZานวนเต5ม (Integral) 4. ต)วเลขทศนยม (Floating Point) 5. ขUอความ (String) ซxงรVปแบบของการเข;ยนขUอมVลคLาคงท;และประเภทของชนดขUอมVล จะกลLาวถxงในห)วขUอตLอไป 2.3 ชน,ดขอมลแบบพนฐาน ภาษาจาวาเปyนภาษาท;ตUองระบJชนดขUอมVลอยLางช)ดเจน (Strongly Typed Language) กลLาวคอขUอมVลท;เปyน ต)วแปรหรอคLาคงท;ทJกต)วท;ปรากฏอยVLในโปรแกรม จะตUองม;การประกาศ และจะตUองระบJชนดขUอมVลดUวยเสมอ โดยชนด ขUอมVลในภาษาจาวาแบLงเปyนสองประเภทใหญLๆ คอ ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 33
  • 45. 1. ชนดขUอมVลแบบพYนฐาน (Primitive Data Type) 2. ชนดขUอมVลแบบอUางอง (Reference Data Type) ชนดขUอมVลแบบพYนฐานคอชนดขUอมVลท;กZาหนดไวUในภาษาจาวา ซxงภาษาจาวากZาหนดไวU 8 ชนดคอ boolean, char, byte, short, int, long, float และ double ด)งแสดงในตารางท; 2.3 ซxงท)Yง 8 ชนดสามารถแบLง ออกไดUเปyน 4 ประเภทคอ 1. ชนดขUอมVลตรรกะ (Logical) คอชนด boolean 2. ชนดขUอมVลอ)กขระ (Textual) คอชนด char 3. ชนดขUอมVลต)วเลขจZานวนเต5ม (Integral) คอชนด byte,short,int และ long 4. ชนดขUอมVลต)วเลขทศนยม (Floating Point) คอชนด float และ double ตารางท 2.3 ขนาดและชLวงคLาของชนดขUอมVลแบบพYนฐานของภาษาจาวา ชน,ดขอมล ขนาด ช0วงค0า หมายเหต% (บ,ต) boolean 1 true หรอ false ‘u0000’ ถKง ‘uFFFF’ ขอมลอกขระแบบ char 16 Unicode byte 8 -128 ถKง +127 short 16 -32,768 ถKง +32,767 int 32 -231 ถKง +231-1 long 64 -263 ถKง +263-1 IEEE 754 single -3.40E+38 ถKง float 32 precision +3.40E+38 floating point. IEEE 754 double -1.80E+308 ถKง double 64 precision +1.80E+308 floating point. ชนดขUอมVลแบบอUางองคอชนดขUอมVลอนๆ ท;ไมLใชLชนดขUอมVลแบบพYนฐาน ชนดขUอมVลท)Yงสองประเภทจะม;ความ แตกตLางก)นในเรองของการเก5บขUอมVลในหนLวยความจZา และวธ;การเร;ยกใชUงาน ซxงจะกลLาวถxงตLอไป 34 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 46. 2.3.1 ชน,ดขอมลตรรกะ ในภาษาจาวาชนดขUอมVล boolean คอชนดขUอมVลตรรกะ โดยขUอมVลชนดตรรกะเปyนขUอมVลท;ประกอบดUวยคLา สองคLาคอจรงและเท5จ ซxงตรงก)บ true และ false คLาคงท;หรอต)วแปรท;ม;ชนดขUอมVลเปyน boolean จะม;คาเปyนใดคLา L หนxงภายในสองคLาน;YเทLาน)น คZาวLา true และ false แมUจะไมLใชLคย#เวร#ดในภาษาจาวา แตLเนองจากเปyนคZาท;สงวนไวU Y ; (Reserved Word) จxงไมLอนJญาตใหUต)Yงชอ identifier ตรงก)บคZาท)Yงสอง ภาษาจาวาเปyนภาษาท;ตUองระบJชนดขUอมVลอยLาง ช)ดเจน ด)งน)นจxงสามารถใชUชนดขUอมVล boolean ในกรณ;ท;ตUองการคLาขUอมVลชนดตรรกะเทLาน)นโดยไมLอนJญาตใหUใชU Y Y ชนดขUอมVลอนๆ ซxงกรณ;นจะแตกตLางจากภาษาซ;หรอ C++ ท;อนJญาตใหUแปลงขUอมVลชนดต)วเลขจZานวนเต5มใหUเปyน ;Y ขUอมVลคLาคงท;ชนดตรรกะไดU ต)วอยLางเชLน คZาส)ง boolean flag = true; เปyนการประกาศต)วแปร flag ใหUมชนดขUอมVลเปyน boolean โดยกZาหนดใหUม;คาเปyน true ; L 2.3.2 ชน,ดขอมลตวอกขระ ในภาษาจาวาชนดขUอมVล char คอชนดขUอมVลต)วอ)กขระ โดยขUอมVลชนดต)วอ)กขระใชUเพอแสดงต)วอ)กขระหนxง ต)ว ซxงในภาษาจาวาจะถVกเก5บอยVLในรVปของมาตรฐาน Unicode ซxงจะม;ขนาด 16 บต ขUอมVลคLาคงท;ซxงเปyนต)วอ)กขระ แบบ Unicode จะอยVLในเครองหมาย ‘ ‘ โดยจะขxนตUนดUวยส)ญล)กษณ# u และตามดUวยเลขฐานสบหก (Hexadecimal Y number) โดยจะม;คาต)YงแตL ‘u0000’ ถxง ‘uFFFF’ เพอเก5บต)วอ)กขระของภาษาตLางๆ ไดUท)Yงหมด 65,536 ต)วต)วอยLาง L เชLน ต)วอ)กขระแบบ Unicode สZาหร)บภาษาไทยจะม;คาต)YงแตLชLวง ‘u0E00’ ถxง ‘u0E7F’ เปyนตUน L ต)วอยLางเชLน คZาส)ง char letter = ‘u0041’; จะเปyนการประกาศต)วแปร letter ใหUมชนดขUอมVลเปyน char โดยม;คาเปyน u0041 ซxงม;คLาเทLาก)บต)วอ)กษร A ; L สZาหร)บรห)ส ASCII ท;ใชUในระบบคอมพวเตอร#ท)วไป ต)วอ)กขระแบบ Unicode จะกZาหนดคLาในชLวง ‘u0000’ ถxง ‘u00FF’ ใหUสอดคลUองก)บรห)ส ASCII 128 ต)วแรก นอกจากน;Yเราสามารถท;จะกZาหนดขUอมVลคLาคงท;ชนดต)วอ)กขระ โดยกZาหนดต)วอ)กขระภายในเครองหมาย ‘ ’ อาทเชLน ‘x’, ‘1’ และ ‘$’ ต)วอยLางเชLน คZาส)ง char letter = ‘A’; จะเปyนการประกาศต)วแปร letter ใหUมชนดขUอมVลเปyน char โดยม;คาเปyน ต)วอ)กษร A เชLนเด;ยวก)บคZาส)งกLอน ; L หนUาน;Y ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 35
  • 47. ภาษาจาวาสามารถท;จะเข;ยนขUอมVลคLาคงท;ท;เปyนอ)กขระพเศษตLางๆ ไดU โดยใชUส)ญล)กษณ# นZาหนUาต)วอ)กษร ภาษาอ)งกฤษตLางๆ อาทเชLน ‘n’ คออ)กขระสZาหร)บการขxนบรรท)ดใหมL เปyนตUน ต)วอ)กขระพเศษท;นยมใชUท)วไปจะเปyน Y ไปตามตารางท; 2.4 ตารางท 2.4 ต)วอ)กขระพเศษท;นยมใชUทวไป ) อกขระ Unicode ความหมาย ‘b’ ‘u000B’ Backspace ‘t’ ‘u0009’ Tab ‘n’ ‘u000A’ New line ‘r’ ‘u000D’ Return ‘’ ‘u005C’ Backslash ‘’’ ‘u0027’ Single quote ‘’’’ ‘u0022’ Double quote 2.3.3 ชน,ดขอมลตวเลขจDานวนเต-ม ในภาษาจาวาชนดขUอมVล byte, short, int และ long คอชนดขUอมVลต)วเลขจZานวนเต5มโดยขUอมVลชนดน;Yคอ ขUอมVลท;เปyนจZานวนเต5มใดๆ ในทางคณตศาสตร# โดยท;แตLละชนดจะม;ขนาดในการเก5บขUอมVลไมLเทLาก)นทZาใหUม;ชLวงของ ขUอมVลตLางก)น ด)งท;กลLาวมาแลUวในตารางท; 2.3 ซxงโดยท)วไปภาษาจาวาจะกZาหนดใหUเลขจZานวนเต5มม;ชนดขUอมVลเปyน int การเข;ยนขUอมVลคLาคงท;ท;เปyนขUอมVลชนดต)วเลขจZานวนเต5มใดๆ จะไมLม;การใชUเครองหมาย , (comma) เชLน 10,000 จะตUองเข;ยนเปyน 10000 โดยภาษาจาวาจะสามารถเข;ยนคLาคงท;ขUอมVลไดUสามแบบด)งน;Y 1. เลขฐานสบคอการเข;ยนเลขจZานวนเต5มท)วไป อาทเชLน -121 และ 75362 เปyนตUน 2. เลขฐานแปดคอการเข;ยนเลขจZานวนเต5มท;ขxYนตUนดUวยเลข 0 แลUวตามดUวยต)วเลขต)YงแตL 0 ถxง 7 อาทเชLน 016 (ม;คาเทLาก)บ 14 ในเลขฐานสบ) L 3. เลขฐานสบหกคอการเข;ยนเลขจZานวนเต5มท;ขxYนตUนดUวย 0x หรอ 0X แลUวตามดUวยต)วเลขต)YงแตL 0 ถxง 9 หรอต)วอ)กษร A ถxง F อาทเชLน 0xA2 (ม;คาเทLาก)บ 162 ในเลขฐานสบ) L การประกาศต)วแปรใดๆ ใหUม;ชนดขUอมVลเปyนต)วเลขจZานวนเต5มชนดใดชนดหนxง จะม;ผลใหUภาษาจาวากZาหนด ขนาดของเนYอท;สZาหร)บหนLวยความจZา และชLวงในการเก5บขUอมVลใหUสอดคลUองก)บชนดขUอมVลน)นโดยอ)ตโนม)ตอาทเชLน Y คZาส)ง int x = 4; byte b = 4; เปyนการประกาศต)วแปร x ใหUมชนดขUอมVลเปyน int ม;ขนาดของเนYอท;ในหนLวยความจZา 32 บต และต)วแปร b ; ใหUม;ชนดขUอมVลเปyน byte ม;ขนาดของเนYอท;ในหนLวยความจZา 8 บต ถxงแมUวาต)วแปรท)Yงสองจะเก5บคLาเรมตUนเปyน 4 L 36 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 48. เหมอนก)น แตLต)วแปร x จะสามารถเก5บขUอมVลต)วเลขจZานวนเต5มในชLวงท;กวUางกวLา (-231 ถxง 231-1) ขUอมVลคLาคงท;ของต)วเลขจZานวนเต5มโดยท)วไปจะถVกกZาหนดใหUม;ชนดขUอมVลเปyน int แตLภาษาจาวาสามารถ กZาหนดขUอมVลคLาคงท;ของต)วเลขจZานวนเต5มใหUม;ชนดขUอมVลเปyน long ไดUโดยใสLต)วอ)กษร l หรอ L ตLอทUาย อาทเชLน • 2l หมายถxงเลขฐานสบท;ม;คLาเทLาก)บ 2 และม;ชนดขUอมVลเปyน long • 077L หมายถxงเลขฐานแปดท;ม;คาเทLาก)บ 63 และม;ชนดขUอมVลเปyน long L • 0xBAACL หมายถxงเลขฐานสบหกท;ม;ชนดขUอมVลเปyน long 2.3.4 ชน,ดขอมลตวเลขทศน,ยม ขUอมVลชนดต)วเลขทศนยมคอเลขจZานวนจรง (real number) ซxงในระบบคอมพวเตอร#จะเก5บขUอมVลประเภทน;Y โดยแบLงจZานวนบตท;เก5บขUอมVลเปyนสองสLวนคอสLวนท;เปyนความละเอ;ยดของต)วเลข (mantissa) และสLวนท;เปyนจZานวน เลขยกกZาล)ง (exponent) โดยสLวนท;เปyนความละเอ;ยดของต)วเลขจะเก5บคLาในชLวงต)YงแตL -1.0 ถง 1.0 และสLวนท;เปyน เลขยกกZาล)งจะเก5บคLาท;เปyนเลขยกกZาล)งสอง ภาษาจาวาเก5บเลขจZานวนจรงตามมาตรฐาน IEEE 754 ซxงจะแบLง เลขจZานวนจรงออกเปyน single precision และ double precision โดยท;ต)วเลขแบบ single precision จะใชUเนYอท; หนLวยความจZาจZานวน 32 บต แบLงเปyนสLวนท;เปyนความละเอ;ยดของต)วเลขจZานวน 24 บต และสLวนท;เปyนจZานวนเลขยก กZาล)งจZานวน 8 บต ด)งแสดงในรVปท; 2.2 สLวนต)วเลขแบบ double precision จะใชUเนYอท;หนLวยความจZาจZานวน 64 บต แบLงเปyนสLวนท;เปyนความละเอ;ยดของต)วเลขจZานวน 53 บต และสLวนท;เปyนจZานวนเลขยกกZาล)งจZานวน 11 บต รปท 2.2 จานวนบตของ mantissa และ exponent สาหรบตวเลขแบบ single precision ภาษาจาวากZาหนดชนดขUอมVลต)วเลขทศนยมไวUสองชนดคอ float และ double โดยท;ชนดขUอมVล float จะ เก5บขUอมVลขนาด 32 บตตามมาตรฐานแบบ single precision สLวนขUอมVลชนด double จะเก5บขUอมVลขนาด 64 บตตาม มาตรฐานแบบ double precision ภาษาจาวากZาหนดขUอมVลชนดต)วเลขทศนยมใหUเปyนเลขท;ม;เครองหมายจJดทศนยม อาทเชLน 3.14 หรอ 3.0 นอกจากน;ย)งสามารถเข;ยนอยVLในรVปแบบของเลขยกกZาล)งสบ (exponential form) ไดUโดยใชU Y ต)วอ)กษร E หรอ e ระบJจZานวนท;เ ปyนเลขยกกZาล)งสบอาทเชLน 6.02E23 หรอ 2e-7 ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 37
  • 49. ขUอมVลคLาคงท;ชนดต)วเลขทศนยม โดยท)วไปจะถVกกZาหนดใหUม;ชนดขUอมVลเปyน double แตLภาษาจาวาสามารถ กZาหนดขUอมVลคLาคงท;ใหUม;ชนดขUอมVลเปyน float ไดU โดยใสLต)วอ)กษร f หรอ F ตLอทUาย อาทเชLน 2.718F หรอ 3.14f เปyนตUน นอกจากน;ภาษาจาวาจะกZาหนดขUอมVลคLาคงท;ชนดต)วเลขทศนยมท;ม;อ)กษร D หรอ d ตLอทUายวLาเปyนขUอมVลคLา Y คงท;ท;ม;ชนดขUอมVลเปyน double อาทเชLน 3.14D แตLเนองจากโดยท)วไปขUอมVลคLาคงท;ชนดต)วเลขทศนยมจะถVกกZาหนด ใหUเปyนชนด double อยVLแลUว จxงไมLม;ความจZาเปyนตUองใสLต)วอ)กษร D หรอ d ตLอทUาย ต)วอยLางขUอมVลคLาคงท;ของต)วเลขทศนยมท;ถVกตUอง 12. 12E2 12.0e2 12.0e2F -3.14F ต)วอยLางขUอมVลคLาคงท;ของต)วเลขทศนยมท;ไมLถVกตUอง 1,234.0 1.2E108F 2.4 ตวแปรและค0าคงท ขUอมVลท;เก5บอยVLในโปรแกรมเชLนขUอมVลท;เปyนคJณล)กษณะของอ5อบเจกต# คJณล)กษณะของคลาส และขUอมVลใน เมธอด จะแบLงเปyนสองประเภทคอต)วแปรและคLาคงท; ซxงต)วแปรคอขUอมVลท;สามารถเปล;ยนแปลงคLาไดUในโปรแกรมโดย ใชUคZาส)งกZาหนดคLา สLวนคLาคงท;คอขUอมVลท;กZาหนดคLาไดUเพ;ยงคร)Yงเด;ยวและไมLสามารถเปล;ยนแปลงคLาไดUในโปรแกรม ท)Yงต)วแปรและคLาคงท;จะตUองม;การประกาศชอและชนดของขUอมVล เพอท;จะเตร;ยมเนYอท;ในหนLวยความจZาสZาหร)บเก5บ ขUอมVล คZาส)งในการประกาศต)วแปรของภาษาจาวาม;รVปแบบด)งน;Y [modifier] dataType variableName[,variableName]; โดยท; • modifier คอค;ย#เวร#ดระบJคJณสมบ)ตตLางๆ ของต)วแปรเชLน access modifier สLวนกรณ;ท;ไมLระบJจะถอวLา เปyน default • dataType คอชนดขUอมVล • variableName คอชอของต)วแปรท;เปyนไปตามกฎการต)Yงชอ ต)วอยLางเชLน คZาส)ง int amount; เปyนการประกาศต)วแปร amount ใหUม;ชนดขUอมVลเปyน int double x; 38 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 50. เปyนการประกาศต)วแปร x ใหUมชนดขUอมVลเปyน double ; นอกจากน;ภาษาจาวาย)งอนJญาต ใหUสามารถประกาศชอต)วแปรท;เปyนชนดขUอมVลเด;ยวก)นไดUหลายๆ ต)วแปร Y ภายในคZาส)งเด;ยวก)น ต)วอยLางเชLน float price, wholeSalePrice; เปyนคZาส)งประกาศต)วแปร price และ wholeSalePrice ใหUม;ชนดขUอมVลเปyน float 2.4.1 คDาสงกDาหนดค0า ต)วแปรท;ม;การประกาศชนดขUอมVลแลUวสามารถท;จะกZาหนดหรอเปล;ยนแปลงคLาไดUโดยใชUคZาส)งกZาหนดคLา (assignment statement) ซxงม;รVปแบบด)งน;Y variableName = expression; โดยท; • variableName คอชอต)วแปร • expression คอนพจน#ซxงเปyนผลล)พธ#ท;ไดUจากการคZานวณขUอความท;อาจประกอบไปดUวยคLาคงท;ขUอมVล ต)วแปร และต)วดZาเนนการ (operator) ตLางๆ ซxงนพจน#อาจเปyนนพจน#ท;ใหUผลล)พธ#เปyนขUอมVลคLาคงท;ชนด ต)วเลขจZานวนเต5ม ตรรกะ ต)วเลขทศนยม อ)กขระ หรอขUอความ ท)Yงน;ขxYนอยVLก)บชนดขUอมVลและคZาส)งท;ใชU Y ต)วอยLางตLอไปน;แสดงการใชUคZาส)งกZาหนดคLาสZาหร)บต)วแปร ท;ไดUทZาการประกาศชนดขUอมVลไวUแลUว Y x = 1; radius = 3.14; c = ‘a’; y = x+4*3; คZาส)งกZาหนดคLาจะส)งงานใหUเครองคอมพวเตอร#ทZางานสองข)นตอนคอ คZานวณหาผลล)พธ#ของนพจน# แลUวเก5บ Y ผลล)พธ#ท;ไดUไวUในต)วแปรอาทเชLน คZาส)ง amount = 121+14; จะม;ขนตอนคอคZานวณหาผลล)พธ#ซxงจะไดUคLาเปyน 135 แลUวเก5บผลล)พธ#ท;ไดUลงในต)วแปร amount )Y คZาส)งกZาหนดคLาจะตUองม;ชอต)วแปรอยVLทางดUานซUายมอ การใชUคZาส)งเชLน 1 = x; เปyนการใชUคZาส)งท;ไมLถVกตUอง เพราะคLาคงท;ใดๆ ไมLสามารถท;จะเก5บผลล)พธ#ท;ไดUจากนพจน# (คLาของ x) ไดU ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 39
  • 51. นอกจากน;เY ราสามารถท;จะนZาชอต)วแปรท;จะกZาหนดคLามาประกอบในนพจน#ไดU อาทเชLน x = x+1; เปyนคZาส)งท;ใหUนพจน#เพมคLาของต)วแปร x ท;ม;อยVLแลUวไปอ;ก 1 แลUวนZาผลล)พธ#ท;ไดUเก5บไวUในต)วแปร x เชLนเดม อาทเชLน ถUา x ม;คาเปyน 5 จะกลายเปyน 6 L เราสามารถท;จะประกาศและกZาหนดคLาเรมตUนของต)วแปร ภายในคZาส)งเด;ยวก)นไดU โดยม;รVปแบบคZาส)งด)งน;Y [modifier] dataType variableName = expression [,variableName = expression]; อาทเชLน int amount = 123; float price = 12.0f; double x = 4.0, y = 2.5; โปรแกรมท; 2.3 เปyนต)วอยLางท;แสดงการประกาศต)วแปรและการใชUคZาส)งกZาหนดคLาของต)วแปรท;ม;ชนดขUอมVล ตLางๆ ซxงโปรแกรมน;YจะใหUผลล)พธ#ด)งแสดงในรVปท; 2.3 โปรแกรมท( 2.3 ต)วอยางการใชค(าส)งก(าหนดคา public class VariableAssignDemo { public void showDemo() { int x,y; boolean b1; float z = 3.414f; /* The program will not be compiled successfully if a character f is missing */ double w; x = 5; y = 4; b1 = (x > y); w = x * 3.2; System.out.println("x = " + x + " y = " + y); System.out.println("b1 = " + b1); System.out.println("z = " + z + " w = " + w); } } ----------------------------------------------------------------- public class Main { public static void main(String args[]) { VariableAssignDemo obj = new VariableAssignDemo(); obj.showDemo(); } } 40 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 52. รปท 2.3 ผลลพธทได*จากการรนโปรแกรมท 2.3 2.4.2 ค0าคงท การประกาศคLาคงท;ในภาษาจาวาทZาไดUโดยการใสLค;ย#เวร#ด final หนUาคZาส)งประกาศชอ โดยม;รVปแบบด)งน;Y [modifier] final dataType CONSTANT_NAME = expression; โดยท; • modifier คอค;ย#เวร#ดระบJคJณสมบ)ตตLางๆ ของคLาคงท;เชLน access modifier • dataType คอชนดขUอมVลของคLาคงท; • CONSTANT_NAME คอชอของคLาคงท;ซxงโดยท)วไปนยมใชUตวอ)กษรพมพ#ใหญL และแยกคZาดUวยเครองหมาย _ ) • expression คอนพจน#ท;ใหUผลล)พธ#เปyนชนดขUอมVลท;สอดคลUองก)บชนดขUอมVลของคLาคงท; ต)วอยLางเชLน คZาส)ง final int MINIMUM = 4; final double MIN_GPA = 2.00; เปyนการประกาศคLาคงท; MINIMUM ใหUม;ชนดขUอมVลเปyน int โดยม;คLาเปyน 4 และคLาคงท; MIN_GPA ใหUม;ชนด ขUอมVลเปyน double โดยม;คาเปyน 2.00 L คLาคงท;จะกZาหนดคLาไดUเพ;ยงคร)Yงเด;ยว โดยจะตUองม;การกZาหนดคLากLอนท;จะม;การเร;ยกใชUงาน ซxงเมอกZาหนดคLา แลUวจะไมLสามารถเปล;ยนแปลงคLาไดU โปรแกรมท; 2.4 เปyนต)วอยLางท;แสดงการประกาศคLาคงท;และการใชUคาคงท; ซxงจะใหUผลล)พธ#ด)งแสดงในรVปท; L 2.4 ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 41
  • 53. โปรแกรมท( 2.4 ต)วอยางแสดงการประกาศคาคงท% public class ConstantDemo { public void showDemo() { final int MAXIMUM = 10; final double MIN_GPA; System.out.println("Maximum is " + MAXIMUM); MIN_GPA = 2.00; System.out.println("Minimum GPA is " + MIN_GPA); // MIN_GPA = 3.00; //illegal } } -------------------------------------------------------- public class Main { public static void main(String args[]) { ConstantDemo obj = new ConstantDemo(); obj.showDemo(); } } รปท 2.4 ผลลพธทได*จากการรนโปรแกรมท 2.4 2.4.3 ขอบเขตของตวแปรและค0าคงท ต)วแปรและคLาคงท;ซxงประกาศขxนจะสามารถใชUงานภายในบล5อกคZาส)ง { } ท;ประกาศเทLาน)น โดยภาษาจาวา Y Y แบLงต)วแปรและคLาคงท;เปyนสองประเภทคอ 1. ต)วแปรหรอคLาคงท;ท;เปyนคJณล)กษณะของอ5อบเจกต# หรอคJณล)กษณะของคลาส 2. ต)วแปรหรอคLาคงท;ท;อยVLในบล5อกของเมธอดท;เร;ยกวLาคLาคงท;ภายใน (Local Constant) หรอต)วแปรภายใน (Local Variable) 42 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 54. ต)วแปรหรอคLาคงท; ท;เปyนคJณล)กษณะของอ5อบเจกต#หรอคJณล)กษณะของคลาส คอ ต)วแปรหรอคงท;ท;ประกาศ ภายในบล5อกของคลาส ซxงอยVLนอกเมธอดของคลาส ต)วแปรหรอคLาคงท;ประเภทน;จะม;ขอบเขตใชUงานอยVLภายในคลาส Y โดยท;ทJกๆ เมธอดในคลาสสามารถเร;ยกใชUไดU สZาหร)บต)วแปรประเภทน;YจะถVกกZาหนดคLาเรมตUนใหUโดยอ)ตโนม)ตด)ง ตารางท; 2.5 ตารางท 2.5 คLาเรมตUนท;ถVกกZาหนดใหUอ)ตโนม)ต ชน,ดขอมล ค0าเร,มตน boolean false byte 0 short 0 int 0 long 0L float 0.0f double 0.0 char ‘u0000’ คลาส null สZาหร)บคLาคงท;หรอต)วแปรท;อยVLภายในบล5อกของเมธอด จะม;ขอบเขตการใชUงานอยVLภายในบล5อกเทLาน)น Y โปรแกรมท; 2.5 แสดงต)วอยLางต)วแปรท;เปyนคJณล)กษณะของอ5อบเจกต#และต)วแปรท;เปyนต)วแปรภายใน โดยโปรแกรมน;Y ม;ต)วแปร i ท;เปyนคJณล)กษณะของอ5อบเจกต# สLวนต)วแปร j และ k ในเมธอด method1()เปyนต)วแปรภายใน และ ต)วแปร j ในเมธอด method2() ก5เปyนต)วแปรภายในอ;กต)วหนxง เราไมLสามารถท;จะเร;ยกใชUต)วแปร k นอกเมธอด method1()ไดU นอกจากน;Yต)วแปร j ในเมธอดท)YงสองจะถอวLาเปyนต)วแปรคนละต)วก)น โปรแกรมท( 2.5 ต)วอยางแสดงขอบเขตของต)วแปร public class VariableScopeDemo { public int i; // object variable public void method1() { int j = 4; // local variable int k = 2; // another local variable } public void method2() { int j = 0; // local variable System.out.println(i); // calling an object variable i // System.out.println(k); // illegal } } ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 43
  • 55. ต)วแปรท;เปyนคJณล)กษณะของอ5อบเจกต#จะสามารถเก5บ และเปล;ยนแปลงคLาท;เ ก5บไวUในหนLวยความจZาไดU ตราบใดท;อ5อบเจกต#ย)งถVกอUางองในโปรแกรม ต)วแปรภายในจะเปyนต)วแปรท;กZาหนดในบล5อกของเมธอด ซxงจะม; ขอบเขตการใชUงานอยVLภายในบล5อกท;กZาหนดขxนเทLาน)น ต)วแปรประเภทน;จะถVกสรUางขxนเมอม;การเร;ยกใชUงานเมธอดท; Y Y Y Y ต)วแปรประกาศอยVL และจะถVกลบทYงเมอสYนสJดการทZางานของเมธอด ด)งน)นในบางคร)Yงจะเร;ยกต)วแปรประเภทน;Yวา Y L ต)วแปรช)วคราว (temporary variable) ต)วแปรท;ประกาศอยVLใน argument ของเมธอด ก5จ)ดอยVLในต)วแปรประเภทน;Y เชLนก)น โปรแกรมท; 2.6 แสดงต)วอยLางของการประกาศและใชUงานต)วแปรภายในและต)วแปรของอ5อบเจกต# คลาส ScopeExample จะม;ต)วแปรของอ5อบเจกต# i ท;ถVกสรUางขxนเมอม;การสรUางอ5อบเจกต#ของคลาสและจะเก5บอยVLใน Y Heap Memory ด)งแสดงในรVปท; 2.5 และเมอม;การเร;ยกใชUเมธอด method1() และ method2() ต)วแปรภายใน i และ j จะถVกสรUางขxนและถVกลบทYงไปเมอออกจากเมธอดด)งแสดงในรVปท; 2.5 Y โปรแกรมท( 2.6 ต)วอยางแสดงต)วแปรภายในและต)วแปรของอ9อบเจกต public class ScopeExample { private int i=1; public void method1() { int i=4, j=5; 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(); } } 44 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 56. รปท 2.5 การเก-บค%าของตวแปรในหน%วยความจา ภาษาจาวากZาหนดวLาตUองม;การกZาหนดคLาเรมตUนใหUก)บต)วแปรท;ประกาศไวU กLอนท;จะสามารถเร;ยกใชUงานไดU ใน กรณ;ของต)วแปรของอ5อบเจกต#หรอต)วแปรของคลาส ภาษาจาวาจะกZาหนดคLาเรมตUนใหUโดยอ)ตโนม)ตด)งตารางท; 2.5 แตL ในกรณ;ของต)วแปรภายใน จะตUองม;คZาส)งในการกZาหนดคLาเรมตUนเอง มฉะน)นจะเกดขUอผดพลาดในข)Yนตอนคอมไพล# Y (Compile Error) ต)วอยLางเชLน คZาส)ง public void demoMethod(){ int x = (int)(Math.random()*10); int y,z; if (x > 5) { y = 6; } z = x+y; } จะทZาใหUโปรแกรมไมLสามารถคอมไพล#ผLานไดU เนองจากคLา y ม;โอกาสท;จะไมLถVกกZาหนดคLาเรมตUนกLอนใชUงาน 2.5 ตวดDาเน,นการ นพจน#ในภาษาจาวาอาจจะประกอบดUวยขUอมVลคLาคงท; ต)วแปร หรอคLาคงท;ตLางๆ โดยจะม;ต)วดZาเนนการตLางๆ ไวUเพอคZานวณหาผลล)พธ#ท;เปyนชนดขUอมVลตLางๆ ต)วดZาเนนการในภาษาจาวาแบLงออกเปyน 4 ประเภทคอ 1. ต)วดZาเนนการทางคณตศาสตร# (Arithmetic Operator) 2. ต)วดZาเนนการแบบส)มพ)นธ# (Relational Operator) 3. ต)วดZาเนนการทางตรรกศาสตร# (Logical Operator) 4. ต)วดZาเนนการแบบบต (Bitwise Operator) ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 45
  • 57. ท)Yงน;Yต)วดZาเนนการทางคณตศาสตร#และต)วดZาเนนการแบบบต จะใหUผลล)พธ#เปyนขUอมVลชนดจZานวนเต5มหรอ จZานวนทศนยม สLวนต)วดZาเนนการแบบส)มพ)นธ#และต)วดZาเนนการทางตรรกศาสตร#จะใหUผลล)พธ#เปyนขUอมVลชนดตรรกะ 2.5.1 ตวดDาเน,นการทางคณ,ตศาสตร. ต)วดZาเนนการทางคณตศาสตร#สZาหร)บภาษาจาวาจะประกอบไปดUวยเครองหมาย +, -, *, / และ % ด)งแสดง ในตารางท; 2.6 ตารางท 2.6 ต)วดZาเนนการทางคณตศาสตร# เครองหมาย ความหมาย ตวอย0างน,พจน. + บวก a+b - ลบ a-b * คณ a*b / หาร a/b % เศษจากการหาร a%b ต)วดZาเนนการ / จะใหUผลล)พธ#เปyนเลขจZานวนทศนยม ถUาต)วถVกดZาเนนการ (operand) ต)วใดต)วหนxงเปyนขUอมVล ชนดจZานวนทศนยม สLวนกรณ;ท;ต)วกระทZาท)Yงสองต)วเปyนขUอมVลชนดจZานวนเต5ม ต)วดZาเนนการจะใหUผลล)พธ#เปyนคLา จZานวนเต5ม กลLาวคอ 1/2.0 จะไดUผลล)พธ#เปyน 0.5 สLวน 1/2 จะไดUผลล)พธ#เปyน 0 ต)วดZาเนนการ % ใชUก)บต)วถVกดZาเนนการท;เปyนต)วเลขจZานวนเต5ม โดยจะใหUผลล)พธ#เปyนต)วเลขจZานวนเต5มท;เปyน เศษของการหาร อาทเชLน 7%3 จะไดUผลล)พธ#เปyน 1 ต)วดZาเนนการสLวนใหญLจะตUองม;ต)วถVกดZาเนนการสองต)ว ยกเวUนต)ว ดZาเนนการ + และ - ท;อาจม;ต)วถVกดZาเนนการต)วเด;ยวไดUเชLน –3 หรอ +4.0 เปyนตUน ต)วอยLางตLอไปน;เY ปyนการกZาหนดคLา โดยม;ต)วดZาเนนการอยVในนพจน#คZาส)ง L int i = 34+2; double d1 = 34.0–0.2; long l = 300*30; int j = 1/2; double d2 = 1.0/2.0; byte b1 = 20%3; 46 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 58. ตวดDาเน,นการแบบย0อ ภาษาจาวาไดUกZาหนดต)วดZาเนนการแบบยLอ (shortcut operator) เพอใชUแทนต)วดZาเนนการทางคณตศาสตร# ท; ตUองการเปล;ยนแปลงคLาของต)วแปรทางดUานซUายของคZาส)งกZาหนดคLา อาทเชLน คZาส)ง x = x+1; ซxงเปyนคZาส)งท;ตUองการ เพมคLาของ x ขxYนอ;ก 1 สามารถเข;ยนใหมLโดยใชUต)วดZาเนนการแบบยLอไดUด)งน;Y x += 1; ขUอด;ของการเข;ยนคZาส)งโดยใชUต)วดZาเนนการแบบยLอคอจะชLวย ทZาใหUโปรแกรมทZางานไดUเร5วขxน ภาษาจาวาม; Y ต)วดZาเนนการแบบยLอ 5 ต)ว คอ +=, -=, *=, /= และ %= ด)งแสดงในตารางท; 2.7 ตารางท 2.7 ต)วดZาเนนการแบบยLอ เครองหมาย ตวอย0าง ความหมาย += 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; ตวดDาเน,นการเพ,มค0าและลดค0า ภาษาจาวาย)งม;ต)วดZาเนนการแบบยLออ;กสองต)วคอต)วดZาเนนการเพมคLา (increment operator) ท;ใชU เครองหมาย ++ และต)วดZาเนนการลดคLา (decrement operator) ท;ใชUเครองหมาย -- ต)วดZาเนนการท)Yงสองต)วใชUในการ เพมคLาท;ละ 1 หรอลดคLาท;ละ 1 ต)วดZาเนนการท)YงสองสามารถใสLไวUขางหนUาหรอขUางหล)งต)วแปรก5ไดU ต)วอยLางเชLน U x++ คอ x = x+1 ++x คอ x = x+1 x-- คอ x = x-1 --x คอ x = x-1 ต)วดZาเนนการเพมคLาและต)วดZาเนนการลดคLาสามารถใชUก)บต)วแปร ท)Yงท;ม;ชนดขUอมVลเปyนต)วเลขจZานวนเต5มและ ต)วเลขจZานวนทศนยม การวางเครองหมายไวUดานหนUาต)วแปรจะม;ผลใหUโปรแกรมทZาการเพมหรอลดคLากLอนแลUวจxงทZา U คZาส)งของนพจน#นน สLวนการวางเครองหมายไวUดUานหล)งต)วแปร จะม;ผลใหUโปรแกรมทZาการเพมหรอลดคLา หล)งจากทZา )Y คZาส)งของนพจน#นน )Y ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 47
  • 59. โปรแกรมท; 2.7 แสดงต)วอยLางของการใชUต)วดZาเนนการเพมคLา โดยการเปร;ยบเท;ยบผลล)พธ#ท;ไดUจากการวาง ตZาแหนLงของเครองหมาย ++ ไวUดUานหนUาและดUานหล)งต)วแปร ซxงผลล)พธ#ท;ไดUจะเปyนด)งแสดงในรVปท; 2.6 โปรแกรมท( 2.7 ต)วอยางการใชต)วด(าเนนการเพมคา public class IncrementDemo { public void showDemo() { int x; int y; x = 5; y = x++; System.out.println("x = "+x+" y = "+y); y = ++x; System.out.println("x = "+x+" y = "+y); } } ------------------------------------------------------ public class Main { public static void main(String args[]) { IncrementDemo obj = new IncrementDemo(); obj.showDemo(); } } รปท 2.6 ผลลพธทได*จากการรนโปรแกรมท 2.7 2.5.2 ตวดDาเน,นการแบบสมพนธ. ต)วดZาเนนการแบบส)มพ)นธ#ใชUในการเปร;ยบเท;ยบคLาของขUอมVลชนดใดๆ สองคLา โดยจะใหUผลล)พธ#ของการ เปร;ยบเท;ยบเปyนขUอมVลคLาคงท;ชนดตรรกะ ภาษาจาวากZาหนดต)วดZาเนนการแบบส)มพ)นธ#ไวU 6 ต)ว คอ <, <=, >, >=, == และ != ด)งแสดงในตารางท; 2.8 48 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 60. ตารางท 2.8 แสดงต)วดZาเนนการแบบส)มพ)นธ# เครองหมาย ความหมาย ตวอย0าง ผลลพธ. < นอยกว0า 3<4 true <= นอยกว0าหรอเท0ากบ 3<=4 true > มากกว0า 3>4 false >= มากกว0าหรอเท0ากบ 3>=4 false == เท0ากบ 3==4 false != ไม0เท0ากบ 3!=4 true ชนดขUอมVลท;จะนZามาเปร;ยบเท;ยบจะตUองเปyนชนดขUอมVลท;สอดคลUองก)นอาทเชLน การเปร;ยบเท;ยบต)วเลขก)บ ต)วเลข ต)วอ)กขระก)บต)วอ)กขระ หรออ5อบเจกต#ก)บอ5อบเจกต# เปyนตUน ต)วอยLางเชLน ‘x’ > ‘y’ 342 <= 431.50 “Test” == “test” ต)วถVกดZาเนนการท;จะนZาเปร;ยบเท;ยบอาจเปyนต)วแปรหรอนพจน#ก5ไดU แตLจะตUองม;ชนดขUอมVลท;สอดคลUองก)นดUวย ต)วอยLางเชLนถUานพจน#เปyน x < 4.23 ต)วแปร x จะตUองเปyนต)วแปรชนดต)วเลขทศนยมหรอจZานวนเต5ม โปรแกรมท; 2.8 แสดงต)วอยLางของการใชUต)วดZาเนนการแบบส)มพ)นธ#เพอเปร;ยบเท;ยบต)วแปร x และ y ท;ม;ชนด ขUอมVลเปyน int และเก5บผลล)พธ#ลงในต)วแปร b1 ท;ม;ชนดขUอมVลเปyน boolean ซxงโปรแกรมน;YจะใหUผลล)พธ#ด)งแสดง ในรVปท; 2.7 ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 49
  • 61. โปรแกรมท( 2.8 การใชต)วด(าเนนการแบบส)มพ)นธ public class BooleanDemo { public void showDemo() { 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)); } } ---------------------------------------------------------------- public class Main { public static void main(String args[]) { BooleanDemo obj = new BooleanDemo(); obj.showDemo(); } } รปท 2.7 ผลลพธทได*จากการรนโปรแกรมท 2.8 2.5.3 ตวดDาเน,นการทางตรรกศาสตร. ต)วดZาเนนการทางตรรกศาสตร# จะใชUก)บต)วถVกดZาเนนการท;เ ปyนนพจน#ตรรกศาสตร# หรอชนดขUอมVล boolean ต)วดZาเนนการประเภทน;จะใหUผลล)พธ#เปyนขUอมVลคLาคงท;ชนดตรรกะ โดยภาษาจาวากZาหนดต)วดZาเนนการทาง Y ตรรกศาสตร#ไวUหกต)วด)งแสดงในตารางท; 2.9 ต)วดZาเนนการทJกต)วจะตUองม;ต)วถVกดZาเนนการสองต)ว ยกเวUนต)วดZาเนนการท;เปyนต)วดZาเนนการท;ใชUในการกล)บ คLา ซxงตUองการต)วถVกดZาเนนการเพ;ยงหนxงต)วตารางท; 2.10 ถxง ตารางท; 2.13 แสดงผลล)พธ#ท;เปyนขUอมVลคLาคงท;ชนด ตรรกะซxงไดUจากการดZาเนนการท;เปyนการกล)บคLา, AND, OR และ Exclusive-OR คLาทางตรรกะ ต)วอยLางของนพจน#ทใชUต)วดZาเนนการทางตรรกศาสตร#ม;ด)งน;Y ; 50 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 62. (7>6) & (2<1) จะไดUผลล)พธ#ม;คาเปyน L false (7>6) | (2<1) จะไดUผลล)พธ#ม;คาเปyน L true !(7>6) จะไดUผลล)พธ#ม;คาเปyน L false ตารางท 2.9 ต)วดZาเนนการทางตรรกศาสตร# เครองหมาย ความหมาย ! กลบค0าทางตรรกะ && หรอ & AND ค0าทางตรรกะ || หรอ | OR ค0าทางตรรกะ ^ Exclusive-OR ค0าทางตรรกะ ตารางท 2.10 ผลล)พธ#ของการกล)บคLาทางตรรกะ op !op true false false true ตารางท 2.11 ผลล)พธ#ของการ AND คLาทางตรรกะ op1 op2 op1 & op2 true true true true false false false true false false false false ตารางท 2.12 ผลล)พธ#ของการ OR คLาทางตรรกะ op1 op2 op1 | op2 true true true true false true false true true false false false ตารางท 2.13 ผลล)พธ#ของการ Exclusive-OR คLาทางตรรกะ op1 op2 op1 ^ op2 true true false true false true false true true false false false ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 51
  • 63. ต)วดZาเนนการท;ม;เครองหมาย && และ || เร;ยกวLา ต)วดZาเนนการทางตรรกศาสตร#แบบ short circuit โดยท; && เปyนการ AND คLาทางตรรกะ ซxงจะแตกตLางจาก & ตรงท; && จะหยJดการเปร;ยบเท;ยบถUานพจน#ต)วแรกเปyนเท5จ เชLนเด;ยวก)บ || ท;เปyนการ OR คLาทางตรรกะ ซxงจะแตกตLางจาก | ตรงท; || จะหยJดการเปร;ยบเท;ยบถUานพจน#ตวแรกเปyน ) จรง ต)วอยLางเชLน int x = 10; if ( (x > 0) || (x++ < -5) ) { System.out.println(x); } ผลล)พธ#ของ x จะม;คLาเปyน 10 เนองจาก || จะไมLเร;ยกคZาส)งในนพจน#ท;สอง แตLคZาส)ง int x = 10; if ( (x > 0) | (x++ < -5) ) { System.out.println(x); } ผลล)พธ#ของ x จะม;คาเปyน L 11 2.5.4 ตวดDาเน,นการแบบบ,ต ต)วดZาเนนการแบบบตเปyนต)วดZาเนนการท;ใชUก)บขUอมVลชนดต)วเลขจZานวนเต5ม เพอจ)ดการก)บขUอมVลเชงบตหรอ เพอเลอนบต โดยม;เครองหมายตLางๆ ด)งแสดงในตารางท; 2.14 และตารางท; 2.15 ตารางท 2.14 ต)วดZาเนนการเพอจ)ดการก)บขUอมVลเชงบต เครองหมาย ความหมาย ~ Complement & AND | OR ^ XOR ตารางท 2.15 ต)วดZาเนนการเพอเลอนบต เครองหมาย ความหมาย >> signed right shift >>> unsigned right shift << left shift เครองหมาย ~, &, | และ ^ ใชUในการจ)ดการขUอมVลเชงบต เชLน 4 ^ 3 คอ 0100 ท;ทZาการ XOR ก)บ 0011 จะม; 52 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 64. คLาเปyน 0111 สLวนเครองหมาย >>, >>> และ << เปyนต)วดZาเนนการเพอเลอนบต โดยจะใชUก)บชนดขUอมVลจZานวนเต5ม ท;เปyน int หรอ long โดยต)วถVกดZาเนนการท;เปyนจZานวนบตท;จะเลอนไปจะเปyนเศษของการหารดUวย 32 และ 64 สZาหร)บชนดขUอมVล int และ long ตามลZาด)บ ด)งน)นคZาส)ง Y int x = 8; System.out.println(x >> 32); หมายถxงการเลอนบตของต)วแปร x ไป 0 บต ไมLใชL 32 บต เครองหมาย >> เปyนการเลอนบตโดยพจารณาจากเครองหมาย ซxงถUาบตทางซUายเปyนคLา 1 ก5จะใสLคา 1 แทน L แตLถUาเปyนคLา 0 ก5จะใสLคLา 0 แทน สLวนเครองหมาย >>> และ << จะเปyนการเลอนบตโดยไมLพจารณาเครองหมาย กลLาวคอจะใสLคา 0 เสมอ การเลอนบตไปทางขวา (>>) คอการหารของจZานวนเต5มดUวยคLา 2 ยกกZาล)งจZานวนบตท;จะ L เลอน สLวนการเลอนบตไปทางซUาย (<<) จะเปyนการคVณเลขจZานวนเต5มดUวยคLา 2 ยกกZาล)งจZานวนบตท;จะเลอน ต)วอยLาง เชLน 128 >> 1 คอ 128/21 = 64 -128 >> 4 คอ -128/24 = -8 128 << 2 คอ 128 * 22 = 512 2.5.5 ลDาดบความสDาคญของตวดDาเน,นการ กรณ;ท;นพจน#ใดๆ ม;ต)วดZาเนนการมากกวLาหนxงต)ว ภาษาจาวาจะจ)ดลZาด)บความสZาค)ญของต)วดZาเนนการเพอ คZานวณหาผลล)พธ#ตามลZาด)บความสZาค)ญของต)วดZาเนนการ โดยม;ลZาด)บความสZาค)ญด)งแสดงในตารางท; 2.16 ตารางท 2.16 ลZาด)บความสZาค)ญของต)วดZาเนนการ ล()ด+บท./ เร.ยงจ)ก ต+วด()เน9นก)ร 1 ขว)ไปซ>)ย (R to L) ++, --, +, -, ~, ! (data type) 2 ซ>)ยไปขว) (L to R) *, /, % 3 ซ>)ยไปขว) (L to R) +, - 4 ซ>)ยไปขว) (L to R) <<, >>, >>> 5 ซ>)ยไปขว) (L to R) <, >, <=, >=, instanceof 6 ซ>)ยไปขว) (L to R) ==, != 7 ซ>)ยไปขว) (L to R) & 8 ซ>)ยไปขว) (L to R) ^ ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 53
  • 65. 9 ซ>)ยไปขว) (L to R) | 10 ซ>)ยไปขว) (L to R) && 11 ซ>)ยไปขว) (L to R) || 12 ขว)ไปซ>)ย (R to L) ?: =, +=, -=, *=, /=, %=, <<=, 13 ขว)ไปซ>)ย (R to L) >>=, >>>=, &=, ^=, |= ต)วอยLางเชLน คZาส)ง x = 2+3*4-(7+2); จะคZานวณหาผลล)พธ#ตามลZาด)บด)งน;Y 1. คZานวณหาผลล)พธ#คา 7+2 ทZาใหUไดU L x = 2+3*4-9 2. คZานวณหาผลล)พธ#คา 3*4 ทZาใหUไดU L x = 2+12-9 3. คZานวณหาผลล)พธ#คา 2+12 ทZาใหUไดU L x = 14-9 4. คZานวณหาผลล)พธ#คา 14-5 ทZาใหUไดU L x=5 2.6 การแปลงชน,ดขอมล นพจน#ทางคณตศาสตร#ในภาษาจาวาอาจม;ต)วถVกดZาเนนการทางคณตศาสตร# ท;ม;ชนดขUอมVลเปyนประเภทตLางๆ ภาษาจาวาไดUกZาหนดใหUผลล)พธ#ของนพจน#เปyนด)งน;Y • ในกรณ;ท;ต)วถVกดZาเนนการท)Yงสองต)วม;ชนดขUอมVลเปyน double เหมอนก)น จะทZาใหUไดUผลล)พธ#ท;ม;ชนด ขUอมVลเปyน double • ในกรณ;ท;ต)วถVกดZาเนนการท)Yงสองต)วม;ชนดขUอมVลเปyน float เหมอนก)น จะทZาใหUไดUผลล)พธ#ท;ม;ชนดขUอมVล เปyน float • ในกรณ;ท;ต)วถVกดZาเนนการท)Yงสองม;ชนดขUอมVลท;ตLางก)น ภาษาจาวาจะม;หล)กการแปลงชนดขUอมVล (type conversion) ด)งน;Y o ถUาต)วถVกดZาเนนการต)วหนxงม;ชนดขUอมVลเปyน double ต)วถVกดZาเนนการอ;กต)วหนxงจะถVกแปลงใหUม;ชนด ขUอมVลเปyน double โดยอ)ตโนม)ต o ถUาต)วถVกดZาเนนการท)YงสองไมLไดUม;ชนดขUอมVลเปyน double แตLม;ต)วถVกดZาเนนการต)วหนxงท;ม;ชนดขUอมVล 54 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 66. เปyน float ต)วถVกดZาเนนการอ;กต)วหนxงจะถVกแปลงใหUม;ชนดขUอมVลเปyน float โดยอ)ตโนม)ต o ถUาต)วถVกดZาเนนการท)YงสองไมLไดUม;ชนดขUอมVลเปyน double หรอ float แตLม;ต)วถVกดZาเนนการต)วหนxง ท;ม;ชนดขUอมVลเปyน long ต)วถVกดZาเนนการอ;กต)วหนxงจะถVกแปลงใหUม;ชนดขUอมVลเปyน long โดย อ)ตโนม)ต o กรณ;อนๆ ต)วถVกดZาเนนการท)YงสองจะแปลงใหUมชนดขUอมVลเปyน int ; จากหล)กการขUางตUนจะเห5นไดUวาผลล)พธ#ท;ไดUจากการคZานวณนพจน#คณตศาสตร# จะม;ชนดขUอมVลเปyน L int เปyนอยLางนUอย ด)งน)นคZาส)งตLอไปน;Y Y byte b1, b2, b3; b1 = 2; b2 = 4; b3 = b1+b2; // illegal จxงเปyนคZาส)งท;ไมLถVกตUอง เนองจาก b1+b2 จะใหUคLาผลล)พธ#ท;ม;ชนดขUอมVลเปyน int ซxงไมLสามารถ กZาหนดคLาใหUก)บต)วแปรท;ม;ชนดขUอมVลเปyน byte ไดU 2.6.1 การแปลงขอมลในคDาสงกDาหนดค0า ภาษาจาวากZาหนดใหUคZาส)งกZาหนดคLาจะตUองม;ชนดขUอมVลของต)วแปรทางดUานซUายและชนดขUอมVลของนพจน#ทาง ดUานขวาสอดคลUองก)น อาทเชLน int i = 4; double x = 3.0; ในกรณ;ท;ต)วแปรและนพจน#ม;ชนดขUอมVลท;แตกตLางก)น คอมไพเลอร#ของภาษาจาวาจะทZาการแปลงชนดขUอมVล ท)YงสองชนดใหUสอดคลUองก)น โดยการแปลงชนดขUอมVลม;สองรVปแบบคอ 1. การแปลงขUอมVลท;กวUางขxYน (widening conversion) คอการแปลงจากชนดขUอมVลท;ม;ขนาดเล5กกวLาไปเปyน ชนดขUอมVลท;ม;ขนาดใหญLกวLา 2. การแปลงขUอมVลท;แคบลง (narrowing conversion) คอการแปลงจากชนดขUอมVลท;ม;ขนาดใหญLกวLาไปเปyน ชนดขUอมVลท;ม;ขนาดเล5กลง ซxงอาจม;ผลใหUเส;ยความละเอ;ยดของขUอมVลบางสLวนไป ภาษาจาวากZาหนดขนาดของชนดขUอมVลตLางๆ ท;สามารถแปลงขUอมVลใหUกวUางขxYนไดU ด)งแสดงในรVปท; 2.8 ซxงม; หล)กการด)งน;Y • ชนดขUอมVลต)วเลขจZานวนเต5มสามารถแปลงใหUเปyนชนดขUอมVลต)วเลขทศนยมไดU • ชนดขUอมVล float สามารถแปลงใหUเปyนชนดขUอมVล double ไดU • ชนดขUอมVลต)วเลขจZานวนเต5มม;ขนาดเร;ยงก)นจากนUอยไปมากด)งน;Y ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 55
  • 67. byte → short → int → long • ชนดขUอมVล char สามารถแปลงใหUเปyนชนดขUอมVล int ไดU • ชนดขUอมVล boolean จะไมLม;ความส)มพ)นธ#ก)บชนดขUอมVลแบบพYนฐานอนๆ รปท 2.8 การแปลงชนดข*อมล ในคZาส)งกZาหนดคLา ถUาผลล)พธ#ของนพจน#เปyนชนดขUอมVลท;ม;ขนาดเล5กกวLาชนดขUอมVลของต)วแปร ภาษาจาวาจะ ทZาการแปลงขUอมVลใหUเปyนชนดขUอมVลของต)วแปรด)งกลLาวโดยอ)ตโนม)ตอาทเชLน คZาส)ง int i = 4; long l = i; นพจน# i จะถVกปร)บชนดขUอมVลจาก int ใหUเปyน long โดยอ)ตโนม)ต หรอคZาส)ง double x = 3; นพจน#ท;ม;คาเปyน 3 จะถVกปร)บชนดขUอมVลจาก int ใหUเปyน double โดยอ)ตโนม)ต L ในกรณ;ทคZาส)งกZาหนดคLาม;ชนดขUอมVลของต)วแปรท;ม;ขนาดเล5กกวLา ชนดขUอมVลของนพจน# ภาษาจาวาจะไมL ; สามารถแปลงชนดขUอมVลของนพจน#ใหUเปyนขนาดท;เล5กลงเทLาก)บชนดขUอมVลของต)วแปรโดยอ)ตโนม)ต แตLคอมไพเลอร# จะแจUงขUอผดพลาดในข)นตอนการคอมไพล# (compile error) ต)วอยLางเชLน คZาส)ง Y int amount = 123L; หรอ float f = 4.0; จะไมLสามารถคอมไพล#ผานไดU เนองจากชนดขUอมVลของนพจน#ม;ขนาดใหญLกวLาชนดขUอมVลของต)วแปร L โปรแกรมท; 2.9 แสดงต)วอยLางของขUอผดพลาดในการแปลงชนดขUอมVล ซxงจะทZาใหUโปรแกรมน;YไมLสามารถคอมไพล# ผLานไดU 56 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 68. โปรแกรมท( 2.9 โปรแกรมท%ม%ขอผดพลาดในการแปลงชนดขอม1ล public class PromotionDemo { public void showDemo() { int i; long l; float fl = 4.2f; i = 4; l = i; fl = i; double x = fl; fl = 4.2; //illegal } } 2.6.2 Typecasting ภาษาจาวาจะสามารถทZาการแปลงชนดขUอมVล ใหUเปyนชนดขUอมVลท;ม;ขนาดเล5กลงไดU โดยใชUวธ;การท;เร;ยกวLา typecasting ซxงม;รVปแบบด)งน;Y (targetType) expression โดยท; • targetType คอชนดขUอมVลท;ตUองการ การใชU typecasting จะชLวยทZาใหUโปรแกรมท;มคZาส)งซxงจZาเปyนตUองแปลงชนดขUอมVลใหUม;ขนาดเล5กลงสามารถ ; คอมไพล#ผานไดU แตLจะทZาใหUขUอมVลบางสLวนสVญหายไปในบางกรณ; L ต)วอยLางเชLน คZาส)ง int amount = (int)3.0; จะทZาการแปลงนพจน# 3.0 ท;ม;ชนดขUอมVลเปyน double ใหUเปyน 3 ท;ม;ชนดขUอมVลเปyน int หรอต)วอยLางคZาส)ง int x; double y = 1.25; x = (int)y; จะทZาการแปลงนพจน# y ท;ม;คา 1.25 ใหUมชนดขUอมVลเปyน int ท;ม;คา 1 แตLจะทZาใหUตวเลขท;เปyนสLวนทศนยม L ; L ) หายไป ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 57
  • 69. โปรแกรมท;2.10 แสดงต)วอยLางการใชU typecasting ในการแปลงชนดขUอมVล โดยนพจน# b1+b2 จะใหUผลล)พธ# ท;ม;ชนดขUอมVลเปyน int จxงตUองแปลงชนดขUอมVลใหUเปyน byte เพอท;จะสามารถกZาหนดคLาใหUก)บต)วแปร b3 ซxงม;ชนด ขUอมVลเปyน byte ไดU เชLนเด;ยวก)นก)บคLา 3.2 ซxงม;ชนดขUอมVลเปyน double จะถVกแปลงชนดขUอมVลใหUเปyน float โปรแกรมท( 2.10 การใช typecasting ในการแปลงชนดขอม1ล public class TypecastingDemo { public void showDemo() { byte b1 = 4; byte b2 = 3; byte b3; b3 = (byte) (b1 + b2); float f1; f1 = (float) 3.2; } } ---------------------------------------------------------------- public class Main { public static void main(String args[]) { TypecastingDemo obj = new TypecastingDemo(); obj.showDemo(); } } 2.7 ชน,ดขอมลแบบอางอ,ง ต)วแปรหรอคLาคงท;ท;ประกาศเปyนชนดขUอมVลอนๆ ซxงไมLใชLชนดขUอมVลแบบพYนฐาน จะเปyนชนดขUอมVลแบบ อUางองซxงก5คออ5อบเจกต#ในภาษาจาวา โดยแบLงออกเปyนสองแบบคอ 1. ชนดขUอมVลท;เปyนคลาส 2. ชนดขUอมVลท;เปyนอะเรย# ต)วอยLางของชนดขUอมVลท;เปyนคลาสคอ ชนดขUอมVล String โดย String ไมLใชLชนดขUอมVลแบบพYนฐาน แตL เปyนคลาสท;นยามไวUใน Java API อาทเชLน คZาส)ง String id; เปyนคZาส)งประกาศต)วแปร id ใหUเปyนอ5อบเจกต#ของคลาส String สZาหร)บต)วอยLางของชนดขUอมVลท;เปyน อะเรย#จะถVกกลLาวถxงในบทท; 8 58 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 70. ชนดขUอมVลแบบอUางองจะม;วธ;การเก5บขUอมVลในหนLวยความจZาท;แตกตLางจาก การเก5บขUอมVลของชนดขUอมVลแบบ พYนฐาน ท)Yงน;ขUอมVลท;เก5บในหนLวยความจZาของชนดขUอมVลแบบอUางองจะเปyนตZาแหนLงอUางองท;เก5บขUอมVลในหนLวยความ Y จZา แตLในกรณ;ของชนดขUอมVลแบบพYนฐาน ขUอมVลท;เก5บในหนLวยความจZาจะเปyนคLาของขUอมVลจรงๆ อาทเชLน คZาส)ง int x = 7; String s = new String(“Thana”); เปyนการประกาศต)วแปรท;ม;ชนดขUอมVลแบบพYนฐาน int ท;ชอ x และใหUเก5บคLาเปyน 7 และเปyนการประกาศ ต)วแปรชนดขUอมVลแบบอUางอง (ซxงก5คออ5อบเจกต#) s ของคลาส String และใหUเก5บคLาเปyนขUอความวLา Thana ซxง ต)วแปรท)Yงสองต)วอาจจะม;การเก5บขUอมVลในหนLวยความจZาด)งแสดงในรVปท; 2.9 ซxงคLาท;เก5บในต)วแปร x จะเปyนคLาขUอมVล ท;เปyนคLา 7 สLวนคLาของต)วแปร s จะเปyนตZาแหนLงอUางองในหนLวยความจZาท;ใชUเก5บขUอความวLา Thana รปท 2.9 ตวอย%างของการเก-บข*อมลในหน%วยความจา การประกาศต)วแปร (หรออ5อบเจกต#) ของชนดขUอมVลแบบอUางองจะเปyนเพ;ยงการประกาศชอต)วแปร (หรอ อ5อบเจกต#) แตLจะไมLม;การจองเนYอท;ในหนLวยความจZาเพอเก5บขUอมVล ในกรณ;ท;ต)วแปรด)งกลLาวเปyนคJณล)กษณะของ อ5อบเจกต# หรอคJณล)กษณะของคลาส ภาษาจาวาจะกZาหนดตZาแหนLงอUางองเรมตUนใหUม;คาเปyน null โดยอ)ตโนม)ต ซxง L เนYอท;ในหนLวยความจZาเพอเก5บขUอมVลตLางๆ ของต)วแปรชนดขUอมVลแบบอUางองจะถVกสรUางขxYน เมอม;การเร;ยกใชUคZาส)ง new อาทเชLน คZาส)ง Date d; เปyนคZาส)งในการประกาศต)วแปร (หรออ5อบเจกต#) d ใหUเปyนคลาสชนด Date ท;กZาหนดไวUใน Java API และ จะไดUคLาในหนLวยความจZาด)งแสดงในรVปท; 2.10 (ก) และคZาส)ง d = new Date(16, 8, 2002); จะเปyนคZาส)งในการจองเนYอท;ในหนLวยความจZาเพอเก5บคJณล)กษณะของอ5อบเจกต#ท;ชอ d ท;ม;อยVL 3 ต)ว คอ day, month และ year ซxงม;ชนดขUอมVลเปyน int ด)งแสดงในรVปท; 2.10 (ข) ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 59
  • 71. (ก) (ข) รปท 2.10 ตวอย%างของการเก-บข*อมลในหน%วยความจา 2.7.1 คลาส String • String เปyนคลาสท;กZาหนดไวUใน Java API ต)วแปรท;ม;ชนดขUอมVลเปyน String ก5คออ5อบเจกต#ชนดหนxง ซxง String ม;ขUอแตกตLางจากอ5อบเจกต#ท)วๆ ไปด)งน;Y • String เปyนอ5อบเจกต#ท;ม;คาคงท;ขUอมVลซxงก5คอขUอความใดๆ ท;อยVLภายในเครองหมาย double quote L (“ ”) ต)วอยLางเชLน “This is a java course” • String เปyนอ5อบเจกต#ท;สามารถถVกสรUางขxนและกZาหนดคLาไดUโดยไมLจZาเปyนตUองใชUคZาส)ง new ต)วอยLางเชLน Y เราสามารถใชUคZาส)ง String s = “Thana”; โดยไมLจZาเปyนท;จะตUองใชUคZาส)ง String s = new String(“Thana”); • ในกรณ;ท;ไมLใชUคZาส)ง new ภาษาจาวาจะกZาหนดตZาแหนLงอUางองในหนLวยความจZาของขUอความท;ระบJใน เครอง (“ ”) โดยพจารณาจาก String Pool วLาม;ขอความเดมอยVLหรอไมL หากม;ก5จะใชUตZาแหนLงอUางองท;ซYZา U ก)น แตLถาย)งไมLม;ก5จะสรUางขUอความขxYนมาใหมLและกZาหนดตZาแหนLงอUางองของขUอความน)น สLวนกรณ;ท;ใชUคZา U Y ส)ง new ภาษาจาวาจะสรUางขUอความใหมLและจองเนYอท;ในหนLวยความจZาเสมอ โปรแกรมท; 2.11 แสดง 60 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 72. ต)วอยLางการสรUางและกZาหนดคLาอ5อบเจกต#ชนด String ท)Yงในกรณ;ท;ใชUและไมLใชUคZาส)ง new อ5อบเจกต# s1 และ s2 จะม;ขUอมVลในหนLวยความจZาเปyนตZาแหนLงอUางองท;เด;ยวก)น สLวน s3 จะม;ขUอมVลในหนLวยความ จZาเปyนตZาแหนLงอUางองท;ตLางก)นเนองจากม;การสรUางขUอความขxนมาใหมLด)งแสดงในรVปท; 2.11 Y โปรแกรมท( 2.11 ต)วอยางการประกาศและสรางอ9อบเจกตชนด String public class StringDemo { public void showDemo() { String s1 = "Thana"; String s2 = "Thana"; String s3 = new String("Thana"); } } ------------------------------------------------------------- public class Main { public static void main(String args[]) { StringDemo obj = new StringDemo(); obj.showDemo(); } } รปท 2.11 ตวอย%างการเก-บข*อมลชนด String ในหน%วยความจา • String เปyนอ5อบเจกต#ท;เปล;ยนคLาไมLไดU (Immutable Object) การกZาหนดคLาใหUก)บอ5อบเจกต#ชนด String ใหมL เปyนการเปล;ยนตZาแหนLงอUางองในหนLวยความจZาของอ5อบเจกต#ด)งกลLาว แตLจะไมLไดUม;การ เปล;ยนคLาภายในตZาแหนLงอUางองเดม ต)วอยLางเชLน คZาส)ง String s1; s1 = “Thanachart”; s1 = “Somchai”; จะม;ผลทZาใหUตZาแหนLงอUางองในหนLวยความจZาของอ5อบเจกต# s1 เปล;ยนไป ด)งแสดงในรVปท; 2.12 ซxงเปyน ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 61
  • 73. ต)วอยLางของการเปล;ยนตZาแหนLงอUางองในการเก5บขUอมVลชนด String ในหนLวยความจZา รปท 2.12 ตวอย%างการเปลยนตาแหน%งอ*างองในการเก-บข*อมล • String เปyนอ5อบเจกต#ท;ม;ต)วดZาเนนการท;ใชUในการเชอมขUอความสองขUอความเขUาดUวยก)น โดยใชU เครองหมาย + อาทเชLน String s1 = “Hello”+“ World”; ต)วดZาเนนการในการเชอมขUอความสามารถใชUเชอมขUอมVลชนด String ก)บต)วถVกดZาเนนการท;เปyนชนดขUอ มVลอนๆ ท;ไมLใชLชนด String ไดU ซxงภาษาจาวาจะแปลงชนดขUอมVลด)งกลLาวใหUเปyนชนด String โดย อ)ตโนม)ตอาทเชLน คZาส)ง String s1 = “This”; String s2 = s1+ “ is a test ”; String s3 = s1+4; จะทZาใหUไดUขUอความของต)วแปร s2 เปyน “This is a test” และ s3 เปyน “This4” ต)วดZาเนนการเพอเชอมขUอความจะม;ต)วดZาเนนการแบบยLอท;ใชUเครองหมาย += เพอเชอมขUอความ แลUว กZาหนดคLาในอ5อบเจกต#ของคลาส String โดยใชUชอเดมอาทเชLน คZาส)ง String s1 = “This”; s1 += “ is a test”; เปyนคZาส)งเชอมขUอความของอ5อบเจกต# s1 เดมก)บขUอความท;วา “ is a test” แลUวเก5บลงในอ5อบเจกต# s1 เชLน L เดม โดยทZาใหU s1 ม;ขUอความเปyน “This is a test” 2.7.2 คลาส Math Java API ไดUกZาหนดใหUม;คลาส Math ท;อยVLในแพคเก5จ java.lang ซxงจะม;เมธอดตLางๆ ในการจ)ดการก)บ ฟwงก#ช)นหรอคZาส)งทางคณตศาสตร#ตLางๆ คลาส Math เปyนคลาสแบบ final และเมธอดทJกเมธอด จะเปyนเมธอดของ คลาส (ม;ค;ยเ# วร#ด static อยVL ซxงจะกลLาวถxงในบทท; 6) การเร;ยกใชUเมธอดเหลLาน;YทZาไดUโดยไมLจZาเปyนตUองสรUาง อ5อบเจกต# แตLสามารถเร;ยกผLานชอคลาสไดUโดยตรงอาทเชLน Math.exp(4.0); เปyนการคZานวณหาคLา exponential 62 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 74. ของ 4.0 คลาส Math ไดUประกาศคLาคงท;สองต)วด)งน;Y - final static double E = 2.7182818284590452354; - final static double PI = 3.14158265358979323846; ซxงการเร;ยกใชU Math.E จะม;คLาเปyน 2.718281828… และ Math.PI จะม;คLาเปyน 3.141582653… เมธอดอนๆ ในคลาส Math ท;สZาค)ญม;ด)งน;Y - static int abs(int x); - static long abs(long x); - static float abs(float x); - static double abs(double x); - static double acos(double x); - static double asin(double x); - static double atan(double x); - static double atan2(double x, double y); - static double ceil(double x); - static double cos(double x); - 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); ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 63
  • 75. 2.8 คDาสงอ,นพ%ตและเอาต.พต % โปรแกรมคอมพวเตอร#โดยท)วไป จะตUองม;การอLานขUอมVลเขUาเพอใชUในการประมวลผล และจะม;การนZาผลล)พธ# ท;ไดUจากการประมวลผลออกมาแสดง ขบวนการในการอLานขUอมVลเขUาและแสดงผลล)พธ#เร;ยกวLา อนพJต/เอาต#พJต (Input/Output) ภาษาจาวาม;วธ;การหลายวธ;การในการจ)ดการก)บอนพJต /เอาต#พJต และม;คลาสหลายคลาสท;เก;ยวขUองก)บ ขบวนการอนพJต/เอาต#พJต แตLวธ;การงLายๆ วธ;การหนxงคอการใชUอนพJตมาตรฐาน (Standard Input) และการใชU เอาต#พJตมาตรฐาน (standard output) ภาษาจาวาม;อ5อบเจกต#ท;เปyนอนพJต/เอาต#พJตมาตรฐานสามอ5อบเจกต#คอ System.in, System.out และ System.err • อ5อบเจกต# System.in เปyนอ5อบเจกต#ท;ม;เมธอดสZาหร)บการอLานขUอมVลทางอJปกรณ#อนพJตมาตรฐาน ซxงโดย ท)วไปก5คอค;ย#บอร#ด • อ5อบเจกต# System.out เปyนอ5อบเจกต#ท;ม;เมธอดสZาหร)บการแสดงขUอมVลออกทางอJปกรณ#เอาต#พJต มาตรฐานซxงโดยท)วไปคอจอภาพ • อ5อบเจกต# System.err เปyนอ5อบเจกต#ท;ม;เมธอดสZาหร)บการแสดงขUอผดพลาด (Error) ออกทางอJปกรณ# ท;ใชUในการแสดงขUอผดพลาด ซxงโดยท)วไปจะกZาหนดเปyนจอภาพ 2.8.1 System.out.println() อ5อบเจกต# System.out หมายถxงอ5อบเจกต#ท;ชอ out ซxงเปyนคJณล)กษณะของคลาส System อ5อบเจกต#ท; ชอ out เปyนอ5อบเจกต#ของคลาส PrintStream ท;ม;เมธอดท;เก;ยวขUองก)บการแสดงผลอยVLหลายเมธอด แตLเมธอดท; นยมใชUทวไปคอ ) print(String s) และ println(String s) ซxงเมธอดท)YงสองใชUในการแสดงผลขUอมVลท;ม; argument เปyนชนดขUอมVล String เมธอด println() จะม;ผลใหUโปรแกรมขxนบรรท)ดใหมLหล)งจากพมพ#ขUอมVลท;ตUองการแสดง เมธอด Y print() และ println() สามารถร)บ argument ท;เปyนชนดขUอมVลอน ซxงโปรแกรมจะแปลงเปyนชนดขUอมVล String ใหUโดยอ)ตโนม)ตต)วอยLางเชLน คZาส)ง int x = 3; System.out.println(x); เปyนชJดคZาส)งในการพมพ#คาของต)วแปร x ท;ม;ชนดขUอมVลเปyน int ออกทางจอภาพ โดยโปรแกรมจะแปลงชนด L ขUอมVล int ใหUเปyน String แลUวจxงพมพ#ขUอความออกมา โปรแกรมท; 2.12 แสดงต)วอยLางของการใชUคZาส)ง 64 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 76. System.out.print() และ System.out.println() เพอแสดงขUอมVลชนดตLางๆ ออกทางจอภาพด)งแสดง ในรVปท; 2.13 โปรแกรมท( 2.12 การใชค(าส)งเพอพมพขอความตางๆ ออกทางจอภาพ public class PrintDemo { public void showDemo() { int x = 3, y = 4, z = 5; System.out.print("x = "+x); System.out.println(" y = "+y); System.out.println("z = "+z); } } --------------------------------------------------------------- public class Main { public static void main(String args[]) { PrintDemo obj = new PrintDemo(); obj.showDemo(); } } รปท 2.13 ผลลพธทได*จากการรนโปรแกรมท 2.12 2.8.2 การรบขอมลเขามาทาง Command Line เมธอด main() ท;เปyนตZาแหนLงเรมตUนการทZางานของโปรแกรมจาวาประยJกต# จะม; argument เปyน String args[] ซxงหมายถxงต)วแปรอะเรย# (จะกลLาวถxงในบทท; 8) args ท;ม;ชนดขUอมVลเปyน String ซxงสามารถร)บ argument ท;สLงผLานมาจาก command line ไดUโดยม;ตวอยLางของการทZางานด)งรVปท; 2.14 ซxงเปyนการกZาหนดใหU ) args[0]ม;คLาเปyน Tommy และต)วแปร args[1] ม;คาเปyน boy โปรแกรมท; 2.13 เปyนต)วอยLางการป‚อนอนพJตทาง L command line แลUวแสดงผลออกทางจอภาพ ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 65
  • 77. โปรแกรมท( 2.13 โปรแกรมแสดงการป@อนอนพตทาง command line public class InputDemo { public static void main(String args[]) { System.out.println("My name is "+ args[0] + " and I am a " + args[1]); } } รปท 2.14 ผลลพธทได*จากการรนโปรแกรมท 2.12 สร%ปเนอหาของบท • ภาษาจาวาเปyนภาษาเชงอ5อบเจกต# ท;ม;คZานยามท;สZาค)ญสองคZาคอคลาสและอ5อบเจกต# • คลาสเปร;ยบเสมอนพมพ#เข;ยวของอ5อบเจกต# อ5อบเจกต#ท;ถVกสรUางมาจากคลาส • คลาสจะประกอบดUวยคJณล)กษณะและเมธอด • คลาสจะถVกเร;ยกใชUงานไดUเมอม;การสรUางอ5อบเจกต#ของคลาสโดยเร;ยกใชUคZาส)ง new แลUวเร;ยกใชUเมธอด • คอมเม5นต# คอขUอความท;แทรกอยVLภายในโปรแกรม ซxงคอมไพเลอร#จะไมLแปลขUอความน;YใหUเปyนสLวนหนxง ของโปรแกรม • identifier คอชอท;ต)Yงขxนในภาษาจาวา ซxงอาจเปyนชอของคลาส ชอของต)วแปร ชอของเมธอด หรอชอของ Y คLาคงท; ซxงจะตUองเปyนไปตามกฎการต)Yงชอ • การต)Yงชอในภาษาจาวา – สZาหร)บคลาส นยมขxนตUนดUวยต)วอ)กษรพมพ#ใหญL Y – สZาหร)บเมธอดและต)วแปร นยมขxนตUนดUวยต)วอ)กษรพมพ#เล5ก Y – ถUาชอท;ต)YงขxYนม;มากกวLา 1 คZา นยมขxนตUนคZาใหมLดUวยต)วอ)กษรพมพ#ใหญL Y – ตUองไมLตรงก)บค;ย#เวร#ด • ค;ย#เวร#ด คอชอท;ม;ความหมายพเศษในภาษาจาวา คอมไพเลอร#ของภาษาจาวาจะเขUาใจความหมายและคZาส)งท; จะตUองดZาเนนการสZาหร)บค;ย#เวร#ดแตLละต)ว 66 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 78. ขUอมVลคLาคงท; คอคZาท;ใชUแสดงขUอมVลท;เปyนต)วเลข ต)วอ)กขระ ขUอความ หรอคLาทางตรรกะ • ชนดขUอมVลในภาษาจาวาแบLงเปyนสองประเภท คอชนดขUอมVลแบบพYนฐาน และชนดขUอมVลแบบอUางอง • ชนดขUอมVลแบบพYนฐานท;ใชUในภาษาจาวาม;ท)Yงหมด 8 ชนดคอ char, byte, short, int, long, float, double และ boolean • ขUอมVลท;เก5บอยVLในโปรแกรมแบLงเปyนสองประเภท คอต)วแปรและคLาคงท; ซxงต)วแปรคอขUอมVลท;สามารถ เปล;ยนแปลงคLาไดUในโปรแกรมโดยใชUคZาส)งกZาหนดคLา สLวนคLาคงท;คอขUอมVลท;กZาหนดคLาไดUเพ;ยงคร)Yงเด;ยว และไมLสามารถเปล;ยนแปลงคLาไดUในโปรแกรม • ต)วแปรท;ม;การประกาศชนดขUอมVลแลUวสามารถท;จะกZาหนดหรอเปล;ยนแปลงคLาไดUโดยใชUคZาส)งกZาหนดคLา • การประกาศคLาคงท;ในภาษาจาวาทZาไดUโดยการใสLค;ย#เวร#ด final หนUาคZาส)งประกาศชอ • คLาคงท;หรอต)วแปรท;อยVLภายในบล5อกของเมธอด จะม;ขอบเขตการใชUงานอยVLภายในบล5อกเทLาน)น Y • ต)วดZาเนนการท;ใชUในภาษาจาวาม;ท)Yงหมด 4 แบบคอ – ต)วดZาเนนการทางคณตศาสตร# : +, -, *, /, %, +=, -=, *=, /=, %=, ++ และ -- – ต)วดZาเนนการทางตรรกศาสตร# : !, &&, &, || และ | – ต)วดZาเนนการแบบส)มพ)นธ# : <, <=, >, >=, == และ != – ต)วดZาเนนการแบบบต : ~, &, |, ^, >>, >>>, << • กรณ;ท;นพจน#ใดๆ ม;ต)วดZาเนนการมากกวLาหนxงต)ว ภาษาจาวาจะจ)ดลZาด)บความสZาค)ญของต)วดZาเนนการ เพอ คZานวณหาผลล)พธ#ตามลZาด)บความสZาค)ญของต)วดZาเนนการ • ความแตกตLางระหวLางการแปลงขUอมVลชนดอ)ตโนม)ตและ Typecasting – การแปลงขUอมVลโดยอ)ตโนม)ตคอ การท;ชนดขUอมVลท;ม;ขนาดเล5กกวLาถVกแปลงใหUเปyนชนดขUอมVลท;ม; ขนาดใหญLกวLาโดยอ)ตโนม)ต – Typecasting คอการท;จะตUองระบJชนดขUอมVลท;ม;ขนาดเล5กกวLาใหUก)บนพจน#ท;ม;ชนดขUอมVลขนาดใหญL กวLา • ชนดขUอมVลแบบอUางองซxงก5คออ5อบเจกต#ในภาษาจาวา โดยแบLงออกเปyนสองแบบคอชนดขUอมVลท;เปyนคลาส และชนดขUอมVลท;เปyนอะเรย# • ขUอมVลท;เก5บในหนLวยความจZาของชนดขUอมVลแบบอUางอง จะเปyนตZาแหนLงอUางองท;เก5บขUอมVลในหนLวยความจZา แตLในกรณ;ของชนดขUอมVลแบบพYนฐาน ขUอมVลท;เก5บในหนLวยความจZาจะเปyนคLาของขUอมVลจรงๆ • String เปyนชนดขUอมVลแบบคลาส ไมLใชLชนดขUอมVลแบบพYนฐาน • คลาส Math จะม;เมธอดตLางๆ ในการจ)ดการก)บฟwงก#ช)นหรอคZาส)งทางคณตศาสตร#ตLางๆ • ค1าส&งท(&ใชในการแสดงผลลพธของขอม)ลในภาษาจาวาคอค1าส&ง System.out.println() ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 67
  • 79. 68 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
  • 80. บทท 3 โครงสรางควบค%ม เนYอหาในบทน;YเปyนการแนะนZาคZาส)งท;เก;ยวขUองก)บโครงสรUางควบคJมในภาษาจาวา ซxงเปyนการควบคJมลZาด)บการ ทZางานของคZาส)งตLางๆ ในโปรแกรมภาษาจาวา โดยจะกลLาวถxงคZาส)งโครงสรUางควบคJมสองประเภทคอ คZาส)งโครงสรUาง แบบเลอกทZาซxงไดUแกLคZาส)ง if,if..else และ switch และคZาส)งโครงสรUางแบบทZาซYZาซxงไดUแกLคZาส)ง while, do..while และ for และในตอนทUายของบทน;จะกลLาวถxงคZาส)งโครงสรUางควบคJมแบบซUอน Y 3.1 คDาสงโครงสรางควบค%ม คZาส)งโครงสรUางควบคJม (Control Structure) เปyนคZาส)งท;ใชUในการกZาหนดลZาด)บการทZางานของคZาส)งตLางๆ ภาษาจาวาม;โครงสรUางควบคJมสามรVปแบบคอ 1. โครงสรUางแบบตามลZาด)บ (Sequential Structure) 2. โครงสรUางแบบเลอกทZา (Selection Structure) 3. โครงสรUางแบบทZาซYZา (Repetition Structure) โดยท)วไปคZาส)งในภาษาจาวาจะม;โครงสรUางควบคJมแบบตามลZาด)บ โดยจะทZางานตามลZาด)บของคZาส)งท;ม;อยVLใน โปรแกรม ซxงจะเรมทZางานจากเมธอด main()โดยจะทZางานจากคZาส)งแรกของเมธอด main()และทZางานเร;ยงตาม ลZาด)บคZาส)งตLอไปเรอยๆ กรณ;ท;ม;การเร;ยกใชUเมธอดของอ5อบเจกต# โปรแกรมจะเขUาไปทZาคZาส)งภายในเมธอดน)น และ Y เมอสYนสJดคZาส)งสJดทUายของเมธอดก5จะกล)บมาทZาคZาส)งท;เร;ยกใชUเมธอด ด)งแสดงในรVปท; 3.1 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.1 ขนตอนการทางานตามลาดบของคาสงทมอย%ในโปรแกรม ผศ. ธนศา เครอไวศยวรรณ โครงสรUางควบคJม 69
  • 81. 3.2 โครงสรางแบบเลอกทDา โครงสรUางแบบเลอกทZาเปyนการใหUเลอกทZาชJดคZาส)งในกรณ;ท;นพจน#ตรรกศาสตร#ม;คLาเปyนจรงตามเงอนไข ซxง ชJดคZาส)งโครงสรUางแบบเลอกทZาจะประกอบไปดUวยคZาส)งด)งตLอไปน;Y • คZาส)ง if • คZาส)ง if..else • คZาส)ง if แบบซUอน (nested if) • คZาส)ง switch 3.2.1 คDาสง if คZาส)ง if จะม;รVปแบบด)งน;Y if (logical expression) { statements } โดยท; • logical expression คอนพจน#ตรรกศาสตร#ท;ใหUผลล)พธ#เปyนขUอมVลคLาคงท;ชนด boolean • statements คอชJดคZาส)งใดๆ ชJดคZาส)งท;อยVLในบล5อก { } จะทZางานในกรณ;ท;นพจน#ตรรกศาสตร#ใหUคาเปyนจรง ซxงคZาส)ง if สามารถแสดง L ลZาด)บการทZางานเปyนโฟว#ชาร#ต (flowchart) ไดUด)งแสดงในรVปท; 3.2 รปท 3.2 โฟวชารตของคาสง if 70 โครงสรUางควบคJม ผศ. ธนศา เครอไวศยวรรณ
  • 82. ต)วอยLางของการใชUคZาส)ง if ม;ด)งน;Y if (radius >= 0) { area = radius*radius*Math.PI; System.out.println(area); } จากต)วอยLางน;YชJดคZาส)งท;อยVLในบล5อก (คZาส)งกZาหนดคLาต)วแปร area และคZาส)งแสดงผล) จะทZางานในกรณ;ท; นพจน# radius >=0 เปyนจรง กลLาวคอต)วแปร radius ม;คามากกวLาหรอเทLาก)บ 0 L กรณ;ท;ชJดคZาส)งในบล5อก { } ม;เพ;ยงคZาส)งเด;ยวเราสามารถท;จะต)ดเครองหมาย { } ออกไปไดUอาทเชLน คZาส)ง if((x > 0) && (x < 10)) { System.out.println(x); } สามารถเข;ยนใหมLไดUเปyน if((x > 0) && (x < 10)) System.out.println(x); แตLอยLางไรก5ตามการเข;ยนโปรแกรมท;ด;ควรใชUบล5อก { } เพอใหUเกดความเขUาใจงLาย และงLายตLอการเพมคZาส)ง (กลLาวคอถUาม;มากกวLาหนxงคZาส)งตUองใชUบล5อก { } เสมอ) โปรแกรมท( 3.1 ต)วอยางการใชค(าส)ง if import javax.swing.JOptionPane; public class SampleIf { public void showDemo() { String inputStr = JOptionPane.showInputDialog("Enter value"); int score = Integer.parseInt(inputStr); if (score >= 50) { JOptionPane.showMessageDialog(null, "You pass"); // null to tell that there is no parent frame } } } ------------------------------------------------------------------------ public class Main { public static void main(String[] args) { SampleIf obj = new SampleIf(); obj.showDemo(); } } ผศ. ธนศา เครอไวศยวรรณ โครงสรUางควบคJม 71
  • 83. โปรแกรมท; 3.1 เปyนต)วอยLางของโปรแกรมท;ใชUคZาส)ง if โดยโปรแกรมจะร)บต)วเลขเขUามาทางไดอะล5อก ซxง จะเปyนขUอมVลชนด String ท;จะเก5บอยVLในต)วแปรท;ชอ inputStr โดยการเร;ยกใชUเมธอดท;ชอ showInputDialog ของคลาส JOptionPane แลUวจxงสLงคLาเปyน argument ของเมธอด Integer.parseInt() เพอทZาการแปลงชนด ขUอมVล String ใหUเปyนชนดขUอมVล int แลUวกZาหนดไวUในต)วแปร score ซxงคZาส)ง if จะตรวจสอบวLาถUาต)วแปร score ม;คLามากกวLาหรอเทLาก)บ 50 จะพมพ#ขUอความ You pass ออกมาทางไดอะล5อกท;เร;ยกใชUเมธอด showMessageDialog ของคลาส JOptionPane ต)วอยLางของผลล)พธ#ท;ไดUจากการร)นโปรแกรมท; 3.1 แสดงด)งรVปท; 3.3 รปท 3.3 ผลลพธทได*จากการรนโปรแกรมท 3.1 คลาส JOptionPane คลาส JOptionPane เปนคลาสท%ก(าหนดมาในภาษาจาวาเพอใชในการสราง DialogBox แบบ มาตรฐาน คลาสน%เปนคลาสขนาดใหญท%ม%เมธอดหลายๆ เมธอดแตเมธอดท%ส(าค)ญคอ - showConfirmDialog เปนไดอะล9อกเพอยนย)นค(าถามเชน yes/no/cancel - showInputDialog เปนไดอะล9อกส(าหร)บร)บคาขอม1ลชนด String - showMessageDialog เปนไดอะล9อกเพอแสดงขอความออกมา 3.2.2 คDาสง if..else คZาส)ง if จะไมLม;การทZาคZาส)งใด ถUานพจน#ตรรกศาสตร#ม;คLาเปyนเท5จ ด)งน)นถUาตUองการทZาคZาส)งบางคZาส)งเมอ Y นพจน#ตรรกศาสตร#ม;คาเปyนเท5จ จะตUองใชUคZาส)ง if..else แทน ซxงม;รVปแบบของคZาส)งด)งน;Y L if (logical expression) { true statements } else { false statements } 72 โครงสรUางควบคJม ผศ. ธนศา เครอไวศยวรรณ
  • 84. โดยท; • true statements คอชJดคZาส)งสZาหร)บคLาจรง • false statements คอชJดคZาส)งสZาหร)บคLาเท5จ โดยม;โฟว#ชาร#ตของการทZางานของคZาส)งน;Yด)งแสดงในรVปท; 3.4 รปท 3.4 โฟวชารตของคาสง if..else ต)วอยLางของการใชUคZาส)ง if..else ม;ด)งน;Y if (radius >= 0) { area = radius*radius*Math.PI; System.out.println(area); } else { System.out.println(“Negative radius”); } จากต)วอยLางน;Yถาต)วแปร radius ม;คามากกวLาหรอเทLาก)บ 0 (นพจน#ม;คาเปyนจรง) โปรแกรมจะทZาการคZานวณ U L L คLา กZาหนดคLาและพมพ#คLาของต)วแปร area ออกมา แตLถUาต)วแปร radius ม;คานUอยกวLา 0 (นพจน#เปyนเท5จ) โปรแกรม L จะแสดงขUอความ Negative radius ออกมาแทน ผศ. ธนศา เครอไวศยวรรณ โครงสรUางควบคJม 73
  • 85. โปรแกรมท( 3.2 ต)วอยางการใชค(าส)ง if..else import javax.swing.JOptionPane; public class SampleIfElse { public void showDemo() { String inputStr = JOptionPane.showInputDialog("Enter value"); int score = Integer.parseInt(inputStr); if (score >= 50) { JOptionPane.showMessageDialog(null, "You pass"); } else { JOptionPane.showMessageDialog(null, "You fail"); } } } โปรแกรมท; 3.2 เปyนต)วอยLางของการใชUคZาส)ง if..else โดยโปรแกรมจะพมพ#ขUอความ You pass ถUาคLา ของต)วแปร score ท;ร)บเขUามาทางไดอะล5อก ม;คามากกวLาหรอเทLาก)บ 50 และจะพมพ#ขUอความ You fail ถUาคLาของ L score ม;คLานUอยกวLา 50 โดยม;ต)วอยLางของผลล)พธ#ด)งแสดงในรVปท; 3.5 รปท 3.5 ผลลพธทได*จากการรนโปรแกรมท 3.2 3.2.3 คDาสง if แบบซอน คZาส)ง if หรอ if..else สามารถท;จะซUอนอยVขUางในคZาส)ง if หรอ if..else อนไดUอาทเชLน โฟว#ชาร#ตท; L แสดงในรVปท; 3.6 ซxงม;ขนตอนการทZางานคอ โปรแกรมจะทZาชJดคZาส)งท; 3 ถUานพจน#ตรรกศาสตร#ท; 1 เปyนเท5จ แตLถUาเปyน )Y จรงจะตรวจสอบผลล)พธ#ของนพจน#ตรรกศาสตร#ท; 2 ซxงถUาม;คาเปyนจรง จะทZาชJดคZาส)งท; 1 แตLถUาม;คาเปyนเท5จจะทZาชJด L L คZาส)งท; 2 74 โครงสรUางควบคJม ผศ. ธนศา เครอไวศยวรรณ
  • 86. รปท 3.6 โฟวชารตของคาสง if แบบซ*อน จากโฟว#ชาร#ตในรVปท; 3.6 สามารถท;จะเข;ยนเปyนคZาส)ง if แบบซUอนไดUด)งน;Y if (logical expression 1) { if (logical expression 2) { statements 1 } else { statements 2 } } else { statements 3 } ต)วอยLางเชLน 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”); } ผศ. ธนศา เครอไวศยวรรณ โครงสรUางควบคJม 75
  • 87. รปท 3.7 โฟวชารตของคาสง if แบบซ*อน โครงสรUางเลอกทZาแบบซUอนย)งม;กรณ;ท;เปyนด)งโฟว#ชาร#ตในรVปท; 3.7 ซxงจะม;ขนตอนการทZางานคอ โปรแกรม )Y จะทZาชJดคZาส)งท; 1 ถUานพจน#ตรรกศาสตร#ท; 1 เปyนจรง แตLถาเปyนเท5จจะตรวจสอบผลล)พธ#ของนพจน#ตรรกศาสตร#ท; 2 U ซxงถUาม;คาเปyนจรง จะทZาชJดคZาส)งท; 2 แตLถUาม;คาเปyนเท5จจะทZาชJดคZาส)งท; 3 ซxงจะม;รVปแบบของคZาส)งด)งน;Y L L if (logical expression 1) { statements 1 } else { if (logical expression 2) { statements 2 } else { statements 3 } } ในกรณ;น;Yสามารถท;เข;ยนคZาส)ง if แบบซUอนไดUใหมL ในรVปของ if..else if..else โดยม;รปแบบของ V คZาส)งด)งน;Y 76 โครงสรUางควบคJม ผศ. ธนศา เครอไวศยวรรณ
  • 88. if (logical expression 1) { statements 1 } else if (logical expression 2) { statements 2 } else { statements 3 } ต)วอยLางของการใชUคZาส)ง if..else if..else ม;ด)งน;Y if (score >= 80) { System.out.println(‘A’); } else if(score >= 70) { System.out.println(‘B’); } else if(score >= 60) { System.out.println(‘C’); } else if(score >= 50) { System.out.println(‘D’); } else { System.out.println(‘F’); } ต)วอยLางน;Yจะพมพ#ต)วอ)กษร A ถUาต)วแปร score ม;คLามากกวLาหรอเทLาก)บ 80 พมพ#ต)วอ)กษร B ถUาต)วแปร score ม;คLาต)YงแตL 70 จนถxง 79 พมพ#ต)วอ)กษร C ถUาต)วแปร score ม;คLาต)YงแตL 60 จนถxง 69 พมพ#ต)วอ)กษร D ถUา ต)วแปร score ม;คาต)YงแตL 50 จนถxง 59 และพมพ#ต)วอ)กษร F ถUาต)วแปร score ม;คาตZากวLา 50 L L โปรแกรมท 3.3 การใชUคZาส)ง if..else if..else import javax.swing.JOptionPane; public class SampleIfElseIf { public void showDemo() { String inputStr = JOptionPane.showInputDialog("Enter value"); int x = Integer.parseInt(inputStr); if (x == 1) { JOptionPane.showMessageDialog(null, "Value is one"); } else if (x == 2) { JOptionPane.showMessageDialog(null, "Value is two"); } else { JOptionPane.showMessageDialog(null, "Other than 1 and 2 "); } } } โปรแกรมท; 3.3 แสดงต)วอยLางการใชUคZาส)ง if..else if..else โปรแกรมน;จะอLานคLาท;ป‚อนเขUามาทาง Y ไดอะล5อกบล5อก โดยโปรแกรมจะพมพ#ขUอความวLา “Value is one” ถUาคLาท;ป‚อนเขUามาเปyน 1 พมพ#ขUอความวLา ผศ. ธนศา เครอไวศยวรรณ โครงสรUางควบคJม 77
  • 89. ”Value is two” ถUาคLาท;ป‚อนเขUามาเปyน 2 และพมพ#ขUอความวLา “Other than 1 or 2” ถUาคLาท;ป‚อนเขUามาเปyนคLา อนๆ 3.2.4 คDาสง switch คZาส)ง switch เปyนคZาส)งโครงสรUางแบบเลอกทZา โดยม;รVปแบบด)งน;Y 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; } โดยท; • expression คอนพจน#ท;ตUองม;ชนดขUอมVลเปyน char, byte, short หรอ int เทLาน)น Y • value 1 .. value N คอขUอมVลคLาคงท;ซxงม;ชนดขUอมVลท;สอดคลUองก)บชนดขUอมVลของ expression คZาส)ง switch จะตรวจสอบคLาของนพจน#ท;อาจเปyนชนดขUอมVล char, byte, short หรอ int กรณ;ท;คLา ของนพจน#ม;คาตรงก)บคLาท; 1 โปรแกรมจะทZาชJดคZาส)งท; 1 ถUาม;คาตรงก)บคLาท; 2 ก5จะทZาชJดคZาส)งท; 2 ถUาม;คาตรงก)บคLาท; L L L N ก5จะทZาชJดคZาส)งท; N สLวนกรณ;ท;ม;คาไมLตรงก)บคLาใดๆ เลยในคZาส)ง case ก5จะทZาชJดคZาส)งใน default คอชJดคZาส)งท; L N+1 ซxงแสดงข)YนตอนการทZางานไดUด)งโฟว#ชาร#ตในรVปท; 3.8 78 โครงสรUางควบคJม ผศ. ธนศา เครอไวศยวรรณ
  • 90. รปท 3.8 โฟวชารตของคาสง switch ต)วอยLางของการใชUคZาส)ง switch ม;ด)งน;Y switch (x) { case 1 : System.out.println(“One”); break; case 2 : System.out.println(“Two”); break; case 3 : System.out.println(“Three”); break; default : System.out.println(“Other”); } ต)วอยLางน;จะพมพ#ขUอความตามคLาของ x ต)YงแตL 1 ถxง 3 และจะพมพ#ขUอความวLา other ถUาคLาของ x เปyนคLาอนๆ Y คZาส)ง switch ม;ขUอกZาหนดตLางๆ ด)งน;Y • นพจน#ตUองม;ชนดขUอมVลเปyน char,byte,short หรอ int เทLาน)น Y • ชนดขUอมVลของนพจน#และคLาท; 1 ถxง N ตUองเปyนชนดขUอมVลเด;ยวก)น • คZาส)ง break จะหยJดการทZางานภายในบล5อก { } ถUาไมLม;คZาส)ง break โปรแกรมจะทZาคZาส)งถ)ดไป ต)วอยLาง ผศ. ธนศา เครอไวศยวรรณ โครงสรUางควบคJม 79
  • 91. เชLน switch (x) { case 1 : System.out.println(“One”); case 2 : System.out.println(“Two”); break; default : System.out.println(“Other”); } จะพมพ#ขUอความ One ตามดUวย Two ในกรณ;ท; x ม;คLาเปyน 1 • เงอนไข default จะม;หรอไมLม;ก5ไดU โปรแกรมท; 3.4 แสดงต)วอยLางของการใชUคZาส)ง switch ซxงจะไดUผลล)พธ#เปyนขUอความวLา Value is one ถUา ต)วเลขท;ป‚อนเขUามาม;คLาเปyน 1 เปyนขUอความวLา Value is two ถUาต)วเลขท;ป‚อนเขUามาม;คาเปyน 2 และเปyนขUอความวLา L Other than 1 or 2 ถUาต)วเลขท;ป‚อนเขUามาม;คLาอนๆ โปรแกรมท( 3.4 ต)วอยางการใชค(าส)ง switch import javax.swing.JOptionPane; public class SampleSwitch { public void showDemo() { String inputStr = JOptionPane.showInputDialog("Enter value"); int x = Integer.parseInt(inputStr); switch (x) { case 1: JOptionPane.showMessageDialog(null, "Value is one"); break; case 2: JOptionPane.showMessageDialog(null, "Value is two"); break; default: JOptionPane.showMessageDialog(null, "Other than 1 and 2"); } } } 3.3 โครงสรางแบบทDาซDา โครงสรUางแบบทZาซYZา เปyนคZาส)งท;ใชUในการส)งใหUชJดคZาส)งใดๆ ทZาซYZาหลายคร)Yงตามเงอนไขท;ระบJ ซxงชJดคZาส)ง โครงสรUางแบบทZาซYZาประกอบดUวยคZาส)ง • คZาส)ง while • คZาส)ง do..while • คZาส)ง for 80 โครงสรUางควบคJม ผศ. ธนศา เครอไวศยวรรณ
  • 92. 3.3.1 คDาสง while คZาส)ง while จะม;รVปแบบด)งน;Y initial statements while (logical expression) { statements update statements } โดยท; • initial statements คอคZาส)งท;ใชUในการกZาหนดคLาเรมตUน • logical expression คอนพจน#ตรรกศาสตร# • update statements คอคZาส)งท;ใชUในการเปล;ยนแปลงคLา คZาส)ง while จะทZาชJดคZาส)งและคZาส)งเปล;ยนแปลงคLาท;อยVLในบล5อก { } ตราบใดท;นพจน#ตรรกศาสตร#ย)งม;คLา เปyนจรง คZาส)งท;อยVLในบล5อก { } จะตUองม;คZาส)งในการเปล;ยนแปลงคLา เพอเปล;ยนคLานพจน#ตรรกศาสตร#ใหUม;คาเปyนเท5จ L มฉะน)นแลUวโปรแกรมจะทZาคZาส)งท;อยVLในบล5อกแบบไมLม;ท;สYนสJด คZาส)ง while สามารถเข;ยนเปyนโฟว#ชาร#ตไดU ด)ง Y แสดงในรVปท; 3.9 รปท 3.9 โฟวชารตของคาสง while ผศ. ธนศา เครอไวศยวรรณ โครงสรUางควบคJม 81
  • 93. ต)วอยLางของการใชUคZาส)ง while เพอพมพ#ขUอความวLา Hello World สบคร)Yง ม;ด)งน;Y int count = 1; while(count <= 10) { System.out.println(“Hello World”); count++; } ต)วอยLางน;ม;คZาส)ง int count = 1; เปyนคZาส)งกZาหนดคLาเรมตUน โดยม;นพจน#ตรรกศาสตร#คอ count <= Y 10 ซxงโปรแกรมจะทZาคZาส)งในบล5อก { } ตราบเทLาท;นพจน#ตรรกศาสตร#ม;คาเปyนจรง (กลLาวคอคLาของต)วแปร count L นUอยกวLาหรอเทLาก)บ 10) สLวนคZาส)ง count++; เปyนคZาส)งเปล;ยนแปลงคLาของต)วแปร count โดยจะเพมคLาท;ละหนxง ในแตLละรอบจนกระท)งม;คาเปyน 11 ซxงจะม;ผลทZาใหUนพจน# count <= 10 ม;คLาเปyนเท5จ หากไมLมคZาส)ง count++; L ; ในบล5อก { } จะทZาใหUคา count ม;คาเปyน 1 ตลอด และจะทZาใหUนพจน# count <= 10 ม;คาเปyนจรงเสมอ ซxงก5จะ L L L ทZาใหUโปรแกรมพมพ#ขUอความ Hello World โดยไมLม;ท;สYนสJด โปรแกรมท( 3.5 ต)วอยางการใชค(าส)ง while public class SampleWhile { public void showDemo() { int i = 1; while(i <= 10) { System.out.print(i+" "); i++; } } } โปรแกรมท(& 3.5 แสดงตวอยางการใชค1าส&ง while เพ&อพมพคาตวเลข 1 ถ4ง 10 ซ4&งผลลพธของโปรแกรมเป$นดง แสดงในร)ปท(& 3.10 รปท 3.10 ผลลพธทได*จากการรนโปรแกรมท 3.5 82 โครงสรUางควบคJม ผศ. ธนศา เครอไวศยวรรณ
  • 94. 3.3.2 คDาสง do..while คZาส)ง do..while เปyนคZาส)งท;เปyนโครงสรUางแบบทZาซYZาท;ม;การทZางานคลUายก)บคZาส)ง while โดยม;รVปแบบ คZา ส)งด)งน;Y initial statements do { statements update statements } while(logical expression); โดยม;โฟว#ชาร#ตของการทZางานของคZาส)งน;ด)งแสดงในรVปท; 3.11 ขUอแตกตLางของคZาส)ง while ก)บคZาส)ง Y do..while คอคZาส)ง do..while จะทZาคZาส)งในบล5อก { } อยLางนUอยหนxงคร)YงแลUวจxงทZาการตรวจสอบเงอนไขใน นพจน#ตรรกศาสตร# ขณะท;คZาส)ง while จะทZาการตรวจสอบเงอนไขในนพจน#ตรรกศาสตร#กLอนซxงหากม;คาเปyนจรงถxง L จะทZาคZาส)งในบล5อก { } รปท 3.11 โฟวชารตของคาสง do..while ต)วอยLางของการใชUคZาส)ง do..while เพอพมพ#ขUอความวLา Hello World สบคร)Yงม;ด)งน;Y int count = 1; do { System.out.println(“Hello World”); count++; } while(count <= 10); ผศ. ธนศา เครอไวศยวรรณ โครงสรUางควบคJม 83
  • 95. โปรแกรมท( 3.6 ต)วอยางการใชค(าส)ง do..while public class SampleDoWhile { public void showDemo() { int i = 1; do { System.out.print(i+" "); i++; } while (i <= 10); } } โปรแกรมท; 3.6 แสดงต)วอยLางการใชUคZาส)ง do..while เพอพมพ#คาต)วเลข 1 ถxง 10 ซxงจะไดUผลล)พธ#เชLน L เด;ยวก)บโปรแกรมท; 3.5 3.3.3 คDาสง for คZาส)ง for เปyนคZาส)งท;เปyนโครงสรUางแบบทZาซYZา ท;ม;รปแบบของคZาส)งด)งน;Y V for(initial statements; expression; update statements) { statements } โดยม;โฟว#ชาร#ตของการทZางานของคZาส)งน;YเชLนเด;ยวก)บโฟว#ชาร#ตชองคZาส)ง while ในรVปท; 3.9 คZาส)ง for จะ ใชUในกรณ;ท;ทราบจZานวนคร)YงในการทZาซYZาท;แนLนอน สLวนคZาส)ง while หรอ do..while นยมใชUในกรณ;ท;ไมLทราบ จZานวนคร)YงในการทZาซYZาลLวงหนUา ต)วอยLางเชLนคZาส)งพมพ#ขUอความ Hello World สบคร)Yง ควรใชUคZาส)ง for มากกวLาใชUคZาส)ง while หรอ do..while โดยสามารถเข;ยนคZาส)งไดUด)งน;Y for (int count = 1; count <= 10; count++) { System.out.println(“Hello World”); } ในกรณ;นจะเห5นไดUวาชJดคZาส)งท;ใชUคZาส)ง for จะม;รVปแบบท;กระช)บกวLาเมอเท;ยบก)บกรณ;ของคZาส)ง while ;Y L หรอ do..while คZาส)งกZาหนดคLาเรมตUนหรอคZาส)งเปล;ยนแปลงคLาท;อยVLในคZาส)ง for สามารถท;จะม;มากกวLาอยLางละหนxงคZาส)ง โดยจะใชUเครองหมาย , ในการแยกคZาส)ง อาทเชLน 84 โครงสรUางควบคJม ผศ. ธนศา เครอไวศยวรรณ
  • 96. for (int i = 0, j = 0; i < 4; i++, j += 2) { System.out.println(i + “ ” + j); } เปyนคZาส)งท;จะพมพ#คาของต)วแปร i และ j ท;กZาหนดขxนภายในคZาส)ง for ส;คร)Yง โดยต)วแปร i จะเพมคLาขxYนท; L Y ละหนxง และต)วแปร j จะเพมคLาขxYนท;ละสอง โปรแกรมท( 3.7 ต)วอยางการใชค(าส)ง for public class SampleFor { public void showDemo() { for (int i=1; i<=10; i++) { System.out.print(i+" "); } } } โปรแกรมท; 3.7 แสดงต)วอยLางการใชUคZาส)ง for เพอพมพ#ต)วเลข 1 ถxง 10 ซxงจะไดUผลล)พธ#เชLนเด;ยวก)บ โปรแกรมท; 3.5 และโปรแกรมท; 3.6 ต)วแปรท;ประกาศในคZาส)งกZาหนดคLาของคZาส)ง for จะม;ขอบเขตการใชUงานไดUเฉพาะภายในบล5อก { } ของคZา ส)ง for เทLาน)น การใชUงานต)วแปรนอกบล5อก { } จะเกด compile error ด)งแสดงในต)วอยLางของโปรแกรมท; 3.8 Y โปรแกรมท( 3.8 ขอบเขตการใชงานของต)วแปร public class VariableScope { public void showDemo() { for (int i=1; i<10; i++) { System.out.print(i+" "); } System.out.println("i = "+i); //illegal } } เราไมLสามารถใชUคZาส)ง for ในกรณ;ท;ไมLทราบจZานวนคร)งในการทZาซYZาท;แนLนอนต)วอยLางเชLนโปรแกรมท; 3.9 Y เปyนการสJLมต)วเลขสองต)วท;ม;คLาระหวLาง 1 ถxง 10 โดยใหUทZาการสJLมต)วเลขท)YงสองจนกวLาผลการสJLมของเลขท)Yงสองม;คLา เทLาก)น เมธอด Math.random() เปyนเมธอดท;ใชUในการสJLมเลขจZานวนทศนยมระหวLาง 0 ถxง 1 และคZาส)ง ผศ. ธนศา เครอไวศยวรรณ โครงสรUางควบคJม 85
  • 97. i = (int)(Math.random()*10) + 1; เปyนคZาส)งท;ใชUในการสJLมต)วเลขระหวLาง 1 ถxง 10 แลUวกZาหนดคLาใหUก)บต)วแปร i โปรแกรมน;Yสามารถเข;ยนใหมL โดยใชUคZาส)ง while ไดU แตLไมLสามารถท;จะเข;ยนโดยใชUคZาส)ง for เนองจากไมLทราบจZานวนคร)Yงท;ตUองการสJLมต)วเลขท; แนLนอนไดU โปรแกรมท 3.9 การสJLมต)วเลขสองต)วท;ม;คาระหวLาง 1 ถxง 10 L public class ShowNotFor { public void showDemo() { int i,j; do { i = (int)(Math.random()*10)+1; j = (int)(Math.random()*10)+1; } while (i != j); } } 3.4 โครงสรางแบบซอน (Nested Structure) คZาส)งโครงสรUางควบคJมสามารถเข;ยนซUอนก)นไดUอาทเชLน ใชUคZาส)ง if แบบซUอน คZาส)ง for แบบซUอน โครงสรUางแบบซUอนสามารถท;จะม;คZาส)งโครงสรUางควบคJมท;อยVLภายในและภายนอกแตกตLางก)นไดU อาทเชLน คZาส)ง for (int i = 1; i <= 40; i++) { if ((i%5) == 0) { System.out.println(i); } } เปyนคZาส)ง if ท;อยVLภายในคZาส)ง for เพอท;จะพมพ#ต)วเลขระหวLาง 1 ถxง 40 ท;หาร 5 ลงต)วออกมา ภาษาจาวาอนJญาตใหUเข;ยนคZาส)งโครงสรUางควบคJมซUอนก)นหลายๆ ช)YนไดU คZาส)งโครงสรUางแบบซUอนท;ใชUก)น ท)วไปแบบหนxงคอคZาส)ง for แบบซUอน ต)วอยLางเชLน คZาส)ง for (int i = 1; i <= 3; i++) { for (int j = 1; j <= 4; j++) { System.out.println(“i =”+i+“ j =” +j); } } ม;คZาส)ง for ท;อยVLภายนอกท;จะทZาซYZาสามคร)ง โดยกZาหนดใหUต)วแปร i ม;คาเรมตUนเปyน 1 และเพมท;ละหนxง Y L สLวนคZาส)ง for ท;อยVLภายในจะทZาซYZาส;คร)Yง ในแตLละรอบของคZาส)ง for ภายนอก โดยกZาหนดใหUต)วแปร j ม;คLาเรมตUน เปyน 1 และเพมคLาท;ละหนxง ด)งน)นคZาส)งแสดงผล (System.out.println()) จะทZาซYZาท)Yงหมด 12 คร)Yง Y 86 โครงสรUางควบคJม ผศ. ธนศา เครอไวศยวรรณ
  • 98. โปรแกรมท; 3.10 เปyนต)วอยLางการใชUคZาส)ง for แบบซUอน โดยคZาส)ง for ท;อยVLภายในจะพมพ#เครองหมาย ‘*’ เทLาก)บจZานวนคอล)มน# (5 คร)Yง) และคZาส)ง for ท;อยVLภายนอกจะทZาคZาส)ง for ท;อยVLภายในซYZาเทLาก)บจZานวนแถว (3 คร)ง) Y โปรแกรมจะไดUผลล)พธ#ด)งรVปท; 3.12 โปรแกรมท( 3.10 ต)วอยางการใชค(าส)ง for แบบซอน public class NestedFor { public void showDemo() { for (int i=1; i<=3; i++) { for (int j=1; j<=5; j++) { System.out.print('*'); } System.out.println(); } } } รปท 3.12 ผลลพธทได*จากการรนโปรแกรมท 3.10 โปรแกรมท; 3.11 แสดงต)วอยLางโปรแกรมท;ม;คZาส)งโปรแกรมแบบซUอนหลายๆ รVปแบบอยVLภายใน โปรแกรมน;Y จะสJLมเลขจZานวนเต5มมาสองคLา แลUวจะพมพ#ต)วเลขเฉพาะ (Prime Number) ท;อยVLระหวLางเลขท)Yงสองน)นออกมา ซxงรVป Y ท; 3.13 แสดงต)วอยLางผลล)พธ#ท;ไดUจากการร)นโปรแกรมท; 3.11 ผศ. ธนศา เครอไวศยวรรณ โครงสรUางควบคJม 87
  • 99. โปรแกรมท( 3.11 ต)วอยางการใชค(าส)งโครงสรางแบบซอนหลายร1ป public class SampleNested { public void showDemo() { int n1 = (int) (Math.random()*10)+2; int n2 = (int) (Math.random()*50); boolean flag = false; int j = 0; System.out.println("The prime number between n1+" to "+n2+" are "); for (int i=n1; i<=n2; i++) { flag = false; j = 2; do { if ((i % j++) == 0) flag = true; } while ((j < i) & (!flag)); if (!flag) System.out.print(i+" "); } } } รปท 3.13 ตวอย%างผลลพธทได*จากการรนโปรแกรมท 3.11 3.4.1 คDาสง break, continue และ label คZาส)ง break และ continue เปyนคZาส)งท;ใชUในโครงสรUางแบบทZาซYZา เพอท;จะควบคJมการทZางานของคZาส)งใน บล5อก { } โดยคZาส)ง break จะทZาใหUหยJดสYนสJดการทZางานของโครงสรUางแบบทZาซYZา สLวนคZาส)ง continue จะขUาม การทZางานคZาส)งท;เหลอภายในบล5อก { } โดยไปเรมการทZาซYZาในรอบตLอไปใหมL ต)วอยLางเชLน คZาส)ง for (int i = 1; i <= 5; i++) { if (i == 3) break; System.out.println(i); } จะพมพ#คLา i ต)YงแตL 1 ถxง 2 ออกมา แลUวจะหยJดการทZางานของคZาส)ง แตLถUาเปล;ยนจากคZาส)ง break ไปเปyน 88 โครงสรUางควบคJม ผศ. ธนศา เครอไวศยวรรณ
  • 100. คZาส)ง continue ด)งน;Y for (int i = 1; i <= 5; i++) { if (i == 3) continue; System.out.println(i); } โปรแกรมจะพมพ#คLา i ต)YงแตL 1 ถxง 5 โดยขUามคLาท; 3 ท)Yงน;YเนองจากเจอคZาส)ง continue ในกรณ;ของคZาส)งโครงสรUางควบคJมแบบซUอน ถUาคZาส)ง break หรอ continue ปรากฏอยVLในคZาส)งโครงสรUาง แบบทZาซYZาท;อยVLขางใน คZาส)งโครงสรUางแบบทZาซYZาท;อยVขUางนอกจะย)งทZาซYZาตLอ โปรแกรมท; 3.12 แสดงต)วอยLางของการ U L ใชUคZาส)งโครงสรUางควบคJมแบบซUอนท;มคZาส)ง break อยVLในคZาส)งโครงสรUางแบบทZาซYZาท;อยVขUางใน โปรแกรมน;Yจะร)น ; L คZาส)ง break เมอ j ม;คาเปyน 3 โดยคZาส)งในคZาส)ง for ภายในจะหยJดทZางาน แตLคZาส)ง for ภายนอกจะย)งทZางาน L ตLอ โดยจะไดUผลล)พธ#ด)งแสดงในรVปท; 3.14 โปรแกรมท( 3.12 ต)วอยางการใชค(าส)ง break public class SampleBreak1 { public void showDemo() { int i, j, product; for (i=1; i<=3; i++) { for (j=1; j<=3; j++) { product = i*j; if (j==3) break; System.out.println(i+" * "+j+" = "+product); } } } } รปท 3.14 ผลลพธทได*จากการรนโปรแกรมท 3.12 ผศ. ธนศา เครอไวศยวรรณ โครงสรUางควบคJม 89
  • 101. ในกรณ;ท;ตUองการจะหยJดการทZางานของคZาส)งโครงสรUางควบคJมท;อยVLภายนอก เราจะตUองกZาหนด label ขxนมาY เตม ด)งต)วอยLางในโปรแกรมท; 3.13 ซxงกZาหนด label ท;ชอ outer และม;คZาส)ง break outer; เพอท;จะทZาใหU โปรแกรมหยJดการทZางานของคZาส)ง for ภายนอก โดยจะไดUผลล)พธ#ด)งแสดงในรVปท; 3.15 โปรแกรมท( 3.13 ต)วอยางการใชค(าส)ง break และ label public class SampleBreak2 { public void showDemo() { int i, j, product; outer: for (i=1; i<=3; i++) { for (j=1; j<=3; j++) { product = i*j; if (j==3) break outer; System.out.println(i+" * "+j+" = "+product); } } System.out.println("Outside nested loops."); } } รปท 3.15 ผลลพธทได*จากการรนโปรแกรมท 3.13 สร%ปเนอหาของบท • คZาส)งโครงสรUางควบคJม เปyนคZาส)งท;ใชUในการกZาหนดลZาด)บการทZางานของคZาส)งตLางๆ โดยม;สามรVปแบบคอ โครงสรUางแบบตามลZาด)บ โครงสรUางแบบเลอกทZา และ โครงสรUางแบบทZาซYZา • คZาส)งท;เปyนคZาส)งของโครงสรUางแบบเลอกทZาคอ คZาส)ง if, if..else หรอ switch • คZาส)ง if..else แตกตLางจากคZาส)ง if ตรงท; คZาส)ง if..else จะม;การทZาคZาส)งสZาหร)บคLาเท5จถUานพจน# ตรรกศาสตร#เปyนเท5จ สLวนคZาส)ง if จะไมLม;การทZาคZาส)งใดถUานพจน#ตรรกศาสตร#เปyนเท5จ 90 โครงสรUางควบคJม ผศ. ธนศา เครอไวศยวรรณ
  • 102. • คZาส)ง if หรอ if..else สามารถท;จะซUอนอยVLขางในคZาส)ง if หรอ if..else อนไดU U • คZาส)ง switch จะม;ล)กษณะโครงสรUางการทZางานคลUายคลxงก)บคZาส)ง if..else if..else .. แตLชนด ขUอมVลของต)วแปรท;จะนZามาใชUก)บคZาส)ง switch จะตUองเปyนชนด char, byte, short หรอ int เทLาน)นY • คZาส)งท;เปyนคZาส)งของโครงสรUางแบบทZาซYZาคอ คZาส)ง while, do..while หรอ for • คZาส)ง while แตกตLางจากคZาส)ง do..while ตรงท; คZาส)ง while จะไมLม;การทZาชJดคZาส)งเลยถUานพจน# ตรรกศาสตร#เปyนเท5จ สLวนคZาส)ง do..while จะม;การทZาชJดคZาส)งหนxงคร)YงถUานพจน#ตรรกศาสตร#เปyนเท5จ • คZาส)ง for ม;ล)กษณะการทZางานท;เหมอนก)บคZาส)ง while แตLจะม;การรวมคZาส)งกZาหนดคLาเรมตUน นพจน# ตรรกศาสตร#และคZาส)งเปล;ยนแปลงคLาไวUหล)งคZาส)ง for • คZาส)ง for จะใชUในกรณ;ท;ทราบจZานวนคร)YงในการทZาซYZาท;แนLนอน สLวนคZาส)ง while หรอ do..while นยมใชUในกรณ;ท;ไมLทราบจZานวนคร)งในการทZาซYZาลLวงหนUา Y • คZาส)งโครงสรUางท)Yงหมดท;กลLาวมาแลUวขUางตUน สามารถนZามาใชUรLวมก)นเปyนล)กษณะแบบซUอนไดU เชLน คZาส)ง switch อยVLภายในคZาส)ง while หรอคZาส)ง for อยVLภายในคZาส)ง for ซxงเร;ยกโครงสรUางในล)กษณะน;วาYL โครงสรUางแบบซUอน • คZาส)ง break จะทZาใหUหยJดสYนสJดการทZางานของโครงสรUางแบบทZาซYZา สLวนคZาส)ง continue จะขUามการ ทZางานคZาส)งท;เหลอภายในบล5อก { } โดยไปเรมการทZาซYZาในรอบตLอไปใหมL ผศ. ธนศา เครอไวศยวรรณ โครงสรUางควบคJม 91
  • 103. 92 โครงสรUางควบคJม ผศ. ธนศา เครอไวศยวรรณ
  • 104. บทท 4 หลกการเช,งอ-อบเจกต. เนYอหาในบทน;YเปyนการแนะนZาหล)กการการพ)ฒนาโปรแกรมเชงอ5อบเจกต# อธบายความ หมายของคZานยาม ตLางๆ ท;ใชUในการพ)ฒนาโปรแกรมเชงอ5อบเจกต#เชLน คลาส อ5อบเจกต# คJณล)กษณะ และเมธอด แนะนZาการประกาศ คZานยามด)งกลLาวโดยใชUภาษาจาวา อธบายคJณล)กษณะเดLนของโปรแกรมเชงอ5อบเจกต# แนะนZาคลาสท;ใชUในการจZาลอง ขUอกZาหนดของโปรแกรมเชงอ5อบเจกต# และในสLวนทUายของบทจะเปyนการแนะนZาข)นตอนการพ)ฒนาโปรแกรมโดยใชU Y หล)กการเชงอ5อบเจกต# 4.1 องค.ประกอบของโปรแกรมเช,งอ-อบเจกต. ภาษาจาวาเปyนภาษาคอมพวเตอร# ท;ใชUหล)กการการพ)ฒนาโปรแกรมเชงอ5อบเจกต#ท;เร;ยกยLอวLาเปyนภาษา คอมพวเตอร#แบบ OOP การพ)ฒนาโปรแกรมเชงอ5อบเจกต#จะเปyนขบวนการการวเคราะห#ปญหาโดยการจZาลองปwญหา w วLาประกอบไปดUวยอ5อบเจกต#ใดบUาง แลUวจxงเข;ยนใหUอยVLในรVปแบบของโปรแกรมคอมพวเตอร# โปรแกรมเชงอ5อบเจกต# จะม;คZานยามท;สZาค)ญสองคZาคอ อ5อบเจกต# (Object) และคลาส (Class) 4.1.1 อ-อบเจกต. อ5อบเจกต#คอสงตLางๆ ท;ม;อยVLในช;วตประจZาว)นแบLงไดUเปyนสองประเภทคอ 1. สงท;เปyนรVปธรรม (Tangible) คอสงท;เปyนว)ตถJและจ)บตUองไดUอาทเชLน น)กศxกษา ใบลงทะเบ;ยน ปากกา และรถ เปyนตUน 2. สงท;เปyนนามธรรม (Intangible) คอสงท;ไมLสามารถจ)บตUองไดUอาทเชLน คะแนนรายชอวชา บ)ญช;เงนฝาก และตารางเท;ยวบน เปyนตUน อ5อบเจกต#ตLางๆ จะประกอบไปดUวยคJณล)กษณะ (Attribute) และพฤตกรรม (Behavior) คJณล)กษณะก5คอ ขUอมVลของอ5อบเจกต# สLวนพฤตกรรมหรอเร;ยกวLาเมธอด (Method) คอสงท;อ5อบเจกต#สามารถกระทZาไดU ซxงในโปรแกรม เชงอ5อบเจกต#ก5คอคZาส)งในการทZางาน โปรแกรมเชงอ5อบเจกต#จะประกอบดUวยอ5อบเจกต#ตLางๆ หลายอ5อบเจกต# ซxงแตLละ อ5อบเจกต#จะม;คJณล)กษณะตLางๆ ท;เปyนขUอมVลของอ5อบเจกต# และโปรแกรมสามารถจ)ดการก)บขUอมVลเหลLาน;YไดUโดยการ เร;ยกใชUเมธอดตLางๆ ผศ. ธนศา เครอไวศยวรรณ หล)กการเชงอ5อบเจกต# 93
  • 105. ต)วอยLางของอ5อบเจกต# • น)กศxกษา อาจจะประกอบไปดUวยคJณล)กษณะเชLน รห)ส ชอ และเกรดเฉล;ย และอาจจะม;เมธอดเชLน การ ลงทะเบ;ยน สอบ และเดน • รถยนต# อาจจะประกอบไปดUวยคJณล)กษณะเชLน ย;หUอ รJน และส; และอาจจะม;เมธอดเชLน เคลอนท; หยJดและ L เล;Yยว • สJนข อาจจะประกอบไปดUวยคJณล)กษณะเชLน ชอ พ)นธJ# และส; และอาจจะม;เมธอดเชLน เหLา คลาน และกระดก ) หาง ต)วอยLางของโปรแกรมเชงอ5อบเจกต#อาจยกต)วอยLางของโปรแกรมระบบจ)ดการบ)ญช;เงนฝากของธนาคาร ซxง อาจประกอบไปดUวยอ5อบเจกต#ตLางๆ อาทเชLน บ)ญช; (Account) ลVกคUา (Customer) เครองเอท;เอ5ม (ATM) และรายการ (Transaction) อ5อบเจกต#ชนดบ)ญช;อาจจะม;ขUอมVลภายในตLางๆ อาทเชLน เลขท;บญช; ชอเจUาของบ)ญช; ว)นท;เปmดบ)ญช; ) และยอดเงนคงเหลอ เปyนตUน อ5อบเจกต#ชนดบ)ญช;อาจจะม;เมธอดตLางๆ อาทเชLน ฝาก ถอน และการโอนเงน เปyนตUน 4.1.2 คลาส โดยท)วไปโปรแกรมเชงอ5อบเจกต#แตLละโปรแกรมจะประกอบไปดUวยอ5อบเจกต# ท;เปyนชนดเด;ยวก)นหลายๆ อ5อบเจกต# แตLอาจม;ขUอมVลหรอคJณล)กษณะท;ตLางก)นอาทเชLน โปรแกรมระบบจ)ดการบ)ญช;เงนฝากของธนาคารอาจม; อ5อบเจกต# ชนดบ)ญช;หลายๆ อ5อบเจกต# โดยท;แตLละอ5อบเจกต#อาจจะม;ขUอมVลท;เปyนเลขท;บญช;หรอชอเจUาของบ)ญช;ท;ตLาง ) ก)น โปรแกรมเชงอ5อบเจกต#จะม;คZาส)งในการสรUางอ5อบเจกต#โดยสรUางมาจากคลาส ซxงเปyนต)วกZาหนดนยามของ อ5อบเจกต#วาจะตUองประกอบดUวยคJณล)กษณะและเมธอดใดบUาง L คลาสเปร;ยบเสมอนพมพ#เข;ยวของอ5อบเจกต# อ5อบเจกต#ท;ถVกสรUางมาจากคลาสบางคร)Yงจะเร;ยกวLาเปyน instance ของคลาส ซxงอ5อบเจกต#ใดๆ จะตUองเปyน instance ของคลาสใดคลาสหนxง การเข;ยนโปรแกรมเชงอ5อบเจกต# ตUองม;การ กZาหนดนยามของคลาสกLอนท;จะสามารถสรUางอ5อบเจกต# (หรอ instance) ของคลาสไดU ซxงคลาสหนxงคลาสสามารถท; จะสรUางอ5อบเจกต#ไดUหลายอ5อบเจกต# รVปท; 4.1 แสดงต)วอยLางของคลาส Student ซxงสรUางอ5อบเจกต#ขxYนมาสาม อ5อบเจกต#ท;ชอ s1, s2 และ s3 เปyนตUน 94 หล)กการเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 106. รปท 4.1 ตวอย%างของอ-อบเจกตและคลาส 4.1.3 ค%ณลกษณะ คJณล)กษณะของอ5อบเจกต# คอขUอมVลท;เก5บอยVLในอ5อบเจกต# ซxงจะแบLงออกเปyนสองประเภท คอต)วแปร (Variable) และคLาคงท; (Constant) โดยท;คJณล)กษณะท;เปyนต)วแปรจะสามารถเปล;ยนคLาไดU สLวนคJณล)กษณะท;เปyนคLา คงท;จะไมLสามารถเปล;ยนคLาไดU รVปท; 4.2 แสดงต)วอยLางของอ5อบเจกต# s1,s2 และ s3 ท;เปyนอ5อบเจกต#ของคลาส Student ซxงม;คJณล)กษณะของอ5อบเจกต#ท;เปyนรห)ส ชอ และคะแนนเฉล;ยสะสมท;ตLางก)น โดยกZาหนดในคLาของต)วแปร id, name และ gpa ตามลZาด)บ รปท 4.2 ตวอย%างค(ณลกษณะของอ-อบเจกต ผศ. ธนศา เครอไวศยวรรณ หล)กการเชงอ5อบเจกต# 95
  • 107. โปรแกรมเชงอ5อบเจกต#ไดUกZาหนดนยามคJณล)กษณะอ;กประเภทหนxง ท;เ ร;ยกวLา คJณล)กษณะของคลาส (Class Data Value) ซxงจะเปyนคJณล)กษณะท;ทJกอ5อบเจกต#ใชUรวมก)น อาทเชLน คลาส Student อาจกZาหนดใหUม;คJณล)กษณะ L ของคลาสท;เปyนคLาคงท;ท;ชอ MIN_GPA เพอเก5บคLาคะแนนเฉล;ยสะสมข)นตZาของน)กศxกษาทJกคน ท)Yงน;น)กศxกษาทJกคนจะ Y Y ตUองม;คาคะแนนเฉล;ยสะสมสVงกวLาคะแนนเฉล;ยสะสมข)นตZา การเก5บคJณล)กษณะท;เหมอนก)นเชLนน;YถากZาหนดใหUเปyน L Y U คJณล)กษณะของอ5อบเจกต# จะทZาใหUสYนเปลองเนYอท;ในหนLวยความจZา ด)งแสดงใหUเห5นในรVปท; 4.3 แตLถUากZาหนดใหUเปyน คJณล)กษณะของคลาส จะทZาใหUสามารถประหย)ดพYนท;ในหนLวยความจZาไดUด)งแสดงใหUเห5นในรVปท; 4.4 รปท 4.3 ค(ณลกษณะ MIN_GPA ซ4งเป5นค(ณลกษณะของอ-อบเจกต 96 หล)กการเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 108. รปท 4.4 ค(ณลกษณะ MIN_GPA ซ4งเป5นค(ณลกษณะของคลาส 4.1.4 เมธอด เมธอดเปyนวธ;การหรอการกระทZาท;นยามอยVLในคลาสหรออ5อบเจกต#เพอใชUในการจ)ดการก)บคJณล)กษณะของ อ5อบเจกต#หรอคJณล)กษณะของคลาสอาทเชLน อ5อบเจกต#ชนดบ)ญช;เงนฝากอาจม;คณล)กษณะ balance เพอเก5บยอดเงน J คงเหลอท;อยVLในบ)ญช; และอาจม;เมธอด deposit()เพอเปyนวธ;การในการฝากเงนใหUก)บอ5อบเจกต# ในเมธอดจะม;คZาส)ง เพอจ)ดการก)บวธ;การฝากเงนและจะทZาการปร)บเปล;ยนคLาของคJณล)กษณะ balance เราสามารถเปร;ยบเท;ยบเมธอดไดU ก)บฟwงก#ชน Procedure หรอ Subroutine ของโปรแกรมเชงกระบวนการ ) การเข;ยนโปรแกรมเชงอ5อบเจกต#จะกZาหนดใหUอ5อบเจกต#ตLางๆ สอสารก)น โดยการผLานขLาวสาร (Message) ระหวLางอ5อบเจกต#ท;เปyนผVUสLง (Sender) ก)บอ5อบเจกต#ท;เปyนผVUรบ (Receiver) โดยการเร;ยกใชUเมธอดอาทเชLน รVปท; 4.5 ) แสดงต)วอยLางของการสLงขLาวสารจากอ5อบเจกต# objA ท;เปyนผVสLง เพอเร;ยกการทZางานของเมธอด method4()ของ U อ5อบเจกต# objB ท;เปyนผVร)บ การสLงขLาวสารระหวLางก)นอาจม;การสLงขUอมVลจาก objA ผLานไปย)ง objB โดยผLานทาง U argument ของเมธอด (ต)วอยLางเชLน คLา 1 และ 2 ในรVปท; 4.5) และผVUร)บก5อาจสLงคLากล)บ (Return Value) มาย)งผVUสLง ผศ. ธนศา เครอไวศยวรรณ หล)กการเชงอ5อบเจกต# 97
  • 109. รปท 4.5 ตวอย%างของการส%งข%าวสารระหว%างอ-อบเจกต 4.2 การเขยนโปรแกรมเช,งอ-อบเจกต.โดยใชภาษาจาวา 4.2.1 การประกาศคลาส โปรแกรมภาษาจาวาแตLละโปรแกรมจะประกอบไปดUวย คลาสอยLางนUอยหนxงคลาส โดยม;รVปแบบการประกาศ ด)งน;Y [modifier] class ClassName { [class member] } โดยท; • modifier คอค;ย#เวร#ด (Keyword) ของภาษาจาวาท;ใชUเปyน access modifier เชLน public หรออธบาย คJณสมบ)ตอนๆ ของคลาส เชLน abstract และ final ซxงเปyนเงอนไขเพมเตม (Option) • class คอค;ย#เวร#ดของภาษาจาวาเพอระบJวLาเปyนการประกาศคลาส • ClassName คอชอของคลาสท;เปyนชอ identifier ใดๆ ท;สอดคลUองก)บกฎการต)Yงชอ • class member คอเมธอดหรอคJณล)กษณะของคลาส ต)วอยLางการประกาศคลาส Student สามารถทZาไดUด)งน;Y public class Student { } 98 หล)กการเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 110. 4.2.2 การประกาศค%ณลกษณะ คJณล)กษณะของอ5อบเจกต# คอต)วแปรหรอคLาคงท;ซxงประกาศภายในอ5อบเจกต# โดยม;รVปแบบการประกาศด)งน;Y j [modifier] dataType attributeName; โดยท; • modifier คอค;ย#เวร#ดของภาษาจาวาท;อธบายคJณสมบ)ตตLางๆ ของต)วแปรหรอคLาคงท;อาทเชLน public, private, static, final และ transient เปyนตUน • dataType คอชนดขUอมVลซxงอาจเปyนชนดขUอมVลแบบพYนฐานหรอชนดขUอมVลแบบอUางองท;จะกลLาวถxงในบท ตLอไป • attributeName คอชอของคJณล)กษณะท;เปyนชอ identifier ใดๆ ซxงสอดคลUองก)บกฎการต)Yงชอ ต)วอยLางการประกาศคJณล)กษณะ id, name และ gpa ซxงม;ชนดขUอมVลเปyน String และ double ในคลาส Student สามารถทZาไดUด)งน;Y public class Student { public String id; public String name; public double gpa; } 4.2.3 การประกาศเมธอด ภาษาจาวากZาหนดรVปแบบของการประกาศเมธอดท;อยVLในคลาสไวUด)งน;Y [modifier] return_type methodName([arguments]) { [method_body] } โดยท; • modifier คอค;ย#เวร#ดของภาษาจาวาท;เปyน access modifier เชLน public หรอ private หรออธบาย คJณสมบ)ตอนๆ ของเมธอดเชLน abstract หรอ static เปyนตUน • return_type คอชนดขUอมVลของคLาท;สLงกล)บหล)งจากเสร5จสYนการทZางานของคZาส)งในเมธอดน;Y โดยชนด ขUอมVลของคLาท;สLงกล)บอาจเปyนชนดขUอมVลแบบพYนฐานหรอชนดขUอมVลแบบอUางอง ในกรณ;ท;ไมLม;การสLงคLาใดๆ กล)บจะตUองระบJชนดขUอมVลเปyน void ผศ. ธนศา เครอไวศยวรรณ หล)กการเชงอ5อบเจกต# 99
  • 111. • methodName คอชอของเมธอดท;เปyนชอ identifier ใดๆ ซxงสอดคลUองก)บกฎการต)Yงชอ • arguments คอต)วแปรท;ใชUในการร)บขUอมVลท;อ5อบเจกต#สLงมาใหU โดยอาจม;มากกวLาหนxงต)วแปร หรอไมLม;เลย ก5ไดUขนอยVLก)บการกZาหนดเมธอด xY • method_body คอคZาส)งตLางๆ ของภาษาจาวาท;อยVLในเมธอด โปรแกรมท; 4.1 แสดงต)วอยLางโปรแกรมภาษาจาวาท;ประกาศคลาส Student โดยม;คJณล)กษณะคอ id, name, gpa และ MIN_GPA และม;เมธอดคอ setId(), setName(), setGpa() และ showDetails() โปรแกรมท( 4.1 คลาส Student public class Student { public String id; public String name; public double gpa; public static final double MIN_GPA = 2.00; public void setId(String ID) { id = ID; } public void setName(String n) { name = n; } public void setGpa(double GPA) { gpa = GPA; } public void showDetails() { System.out.println("ID: "+id); System.out.println("Name: "+name); System.out.println("GPA: "+gpa); } } เมธอด main() โปรแกรมภาษาจาวาท;เ ปyนโปรแกรมจาวาประยJกต# (Java Application) จะเรมตUนการทZางานในคลาสท;ม; เมธอด main() โดยม;รปแบบของเมธอดด)งน;Y V public static void main (String args[]) { [method_body] } 100 หล)กการเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 112. 4.2.4 การประกาศและสรางอ-อบเจกต. อ5อบเจกต#ทJกอ5อบเจกต#ในโปรแกรมภาษาจาวาจะตUองม;คZาส)งประกาศเพอระบJวาอ5อบเจกต#น)Yนเปyนอ5อบเจกต# L ของคลาสใด โดยม;รVปแบบด)งน;Y [modifier] ClassName objectName; โดยท; • modifier คอค;ย#เวร#ดท;อธบายคJณสมบ)ตตLางๆ ของอ5อบเจกต# • ClassName คอชอของคลาส • objectName คอชอของอ5อบเจกต#ท;เปyนชอ identifier ใดๆ ซxงสอดคลUองก)บกฏการต)Yงชอ ต)วอยLางเชLน คZาส)ง Student s1; เปyนคZาส)งประกาศอ5อบเจกต# s1 ใหUเปyนอ5อบเจกต#ของคลาส Student ท)Yงน;คลาสท;ระบJในคZาส)งประกาศ Y อ5อบเจกต#จะตUองเปyนคลาสท;ม;การนยามไวUแลUว กลLาวคอจะตUองม;คลาส Student ท;นยามไวUแลUว คZาส)งในการประกาศอ5อบเจกต#ไมLไดUเปyนคZาส)งท;ใชUในการสรUางอ5อบเจกต# คZาส)งท;ใชUในการสรUางอ5อบเจกต#จะม; รVปแบบด)งน;Y objectName = new ClassName([arguments]); โดยท; • objectName คอชอของอ5อบเจกต# • new คอค;ย#เวร#ดของภาษาจาวาเพอใชUในการสรUางอ5อบเจกต# • ClassName คอชอของคลาส • arguments คอคLาท;ตUองการสLงผLานในการเร;ยกเมธอดในการสรUางอ5อบเจกต#ซxงอาจม;หรอไมLม;ก5ไดU การสรUางอ5อบเจกต#โดยเร;ยกใชUคZาส)ง new น;Yจะเปyนการเร;ยกใชUเมธอดในการสรUางอ5อบเจกต#ท;เร;ยกวLา constructor ของคลาสน)นๆ ซxงจะม;การอธบายการทZางานของ constructor ในบทท; 6 Y ต)วอยLางคZาส)งในการสรUางอ5อบเจกต# s1 ทZาไดUด)งน;Y s1 = new Student(); ผศ. ธนศา เครอไวศยวรรณ หล)กการเชงอ5อบเจกต# 101
  • 113. นอกจากน;คZาส)งในการประกาศและสรUางอ5อบเจกต#สามารถท;จะรวมเปyนคZาส)งเด;ยวก)นไดUโดยม;รVปแบบคZาส)ง Y ด)งน;Y [modifier] ClassName objectName = new className([arguments]); อาทเชLน Student s1 = new Student(); 4.2.5 การเรยกใชสมาช,กของอ-อบเจกต. สมาชกของอ5อบเจกต#ประกอบดUวยคJณล)กษณะและเมธอด การเร;ยกใชUสมาชกของอ5อบเจกต#ทZาไดUโดยการใชU เครองหมายจJด (.) กลLาวคอคJณล)กษณะของอ5อบเจกต#สามารถเร;ยกใชU โดยม;รVปแบบด)งน;Y objectName.attributeName; โดยท; • objectName คอชอของอ5อบเจกต#ท;สรUางขxYน • attributeName คอชอของคJณล)กษณะของอ5อบเจกต#นน )Y นอกจากน;เY ราสามารถท;จะสLงขLาวสารไปย)งอ5อบเจกต#ภายหล)งจากท;ม;การสรUางอ5อบเจกต#ขxYนมาไดUโดยการเร;ยก ใชUเมธอดของอ5อบเจกต#นน รVปแบบคZาส)งในการเร;ยกใชUเมธอดม;ด)งน;Y )Y objectName.methodName([arguments]); โดยท; • objectName คอชอของอ5อบเจกต#ท;สรUางขxYน • methodName คอชอของเมธอดของอ5อบเจกต#นน )Y • arguments คอคLาท;ตUองการสLงผLานไปใหUก)บเมธอดของอ5อบเจกต#นน โดยท;จะตUองม;ชนดขUอมVลและ )Y จZานวน argument ใหUสอดคลUองก)บท;ประกาศในเมธอดของอ5อบเจกต#น)Yน ต)วอยLางเชLน คZาส)ง s1.setName(“Thana”); เปyนการเร;ยกใชUเมธอด setName() ของอ5อบเจกต# s1 ซxงเปyนอ5อบเจกต#ของคลาส Student โดยจะสLงผLาน argument ชนด String ท;ม;คLาเปyนขUอความ Thana ใหUก)บเมธอดด)งกลLาว โปรแกรมท; 4.2 แสดงต)วอยLางโปรแกรม 102 หล)กการเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 114. ของคลาส Sample ท;ม;เมธอด main()อยVL โดยโปรแกรมน;จะสรUางอ5อบเจกต#ของคลาส Student ขxนมาสามอ5อบเจกต# Y Y คอ อ5อบเจกต# s1, s2 และ s3 จากน)นจะทZาการเร;ยกเมธอด setName() เพอกZาหนดคLาใหUกZาหนดคLาใหUก)บ Y คJณล)กษณะ name ของอ5อบเจกต#แตLละต)ว ซxงผลล)พธ#ของโปรแกรมน;จะไดUอ5อบเจกต#ด)งแสดงใน รVปท; 4.6 Y โปรแกรมท( 4.2 คลาส Sample ท%เร%ยกใชเมธอดของคลาส Student public class Sample { public static void main(String args[]) { Student s1 = new Student(); Student s2 = new Student(); Student s3 = new Student(); s1.setId("1234"); s1.setName("Thana"); s1.setGpa(3.25); s2.setId("1122"); s2.setName("Somchai"); s2.setGpa(2.90); s3.setId("2211"); s3.setName("Somsri"); s3.setGpa(3.00); } } รปท 4.6 ผลลพธของโปรแกรมท 4.2 ผศ. ธนศา เครอไวศยวรรณ หล)กการเชงอ5อบเจกต# 103
  • 115. 4.3 ค%ณลกษณะเด0นของโปรแกรมเช,งอ-อบเจกต. โปรแกรมเชงอ5อบเจกต# จะม;คJณล)กษณะเดLนอยVLสามประการคอ การหLอหJUม (Encapsulation) การสบทอด (Inheritance) และการม;ไดUหลายรVปแบบ (Polymorphism) 4.3.1 การห0อห%ม หล)กการท;สZาค)ญประการหนxงของการเข;ยนโปรแกรมเชงอ5อบเจกต#คอการหLอหJUม ซxงคJณล)กษณะของอ5อบเจกต# จะถVกหLอหJมอยVLภายใน เพอไมLใหUอ5อบเจกต#อนๆ สามารถเขUาถxงขUอมVลท;เปyนคJณล)กษณะไดUโดยตรง การจะเร;ยกใชUคJณ - U ล)กษณะของอ5อบเจกต#จะทZาไดUโดยการเร;ยกผLานเมธอดเทLาน)นด)งแสดงในรVปท; 4.7 Y รปท 4.7 หลกการของการห%อห(*ม อ5อบเจกต#แตLละอ5อบเจกต#จะประกอบไปดUวยสLวนท;เปyน interface และสLวนท;เปyน implementation สLวนท; เปyน interface คอสLวนของอ5อบเจกต#ท;อนJญาตใหUอ5อบเจกต#อนสามารถเร;ยกใชUงานไดU ซxงในภาษาจาวาก5คอคJณล)กษณะ หรอเมธอดท;ถVกประกาศใหUม; access modifier เปyน public สZาหร)บสLวนท;เปyน implementation คอสLวนของ อ5อบเจกต#ท;ไมLสามารถเขUาถxงไดUจากภายนอก อ5อบเจกต#อนๆ จะไมLสามารถเห5นสLวนท;เปyน implementation ของ อ5อบเจกต#ไดU ในภาษาจาวาก5คอคJณล)กษณะหรอเมธอดท;ถVกประกาศใหUม; access modifier เปyน private การเข;ยนโปรแกรมเชงอ5อบเจกต#โดยใชUหล)กการของการหLอหJUม สามารถทZาไดUโดยกZาหนดใหUคJณล)กษณะของ อ5อบเจกต#ม; access modifier เปyน private และกZาหนดใหUเมธอดท;สามารถเร;ยกจากอ5อบเจกต#ภายนอกไดUม; access modifier เปyน public ด)งแสดงต)วอยLางในโปรแกรมท; 4.3 104 หล)กการเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 116. โปรแกรมท 4.3 การใชUหล)กการของการหLอหJUม public class Student { private String id; private String name; private double gpa; private static final double MIN_GPA = 2.00; public void setId(String ID) { id = ID; } public void setName(String n) { name = n; } public void setGpa(double GPA) { gpa = GPA; } public void showDetails() { System.out.println("ID: "+id); System.out.println("Name: "+name); System.out.println("GPA: "+gpa); } } ขUอด;ของการหLอหJUมคอ • การซLอนเรUนขUอมVล (Information Hiding) ทZาใหUอ5อบเจกต#สามารถตดตLอก)บอ5อบเจกต#ภายนอกผLานเมธอด ท;เปyนสLวนของ interface เทLาน)น ซxงถUาม;การเปล;ยนแปลงคJณล)กษณะหรอเมธอดท;อยVLภายในอ5อบเจกต# ก5จะ Y ไมLม;ผลกระทบใดๆ ตLออ5อบเจกต#ภายนอกท;เร;ยกใชU • ความเปyนโมดVล (Modularity) การพ)ฒนาโปรแกรมเชงอ5อบเจกต#จะสามารถกZาหนดใหUอ5อบเจกต#แตLละ อ5อบเจกต#ม;ความเปyนอสระตLอก)น ถUาม;การเปล;ยนแปลงเกดขxYนภายในอ5อบเจกต#หนxงก5จะไมLมผลกระทบตLอ ; อ5อบเจกต#อน เครองโทรศ)พท#เปyนต)วอยLางหนxง ของการแสดงคJณล)กษณะเดLนดUานการหLอหJUมของอ5อบเจกต# สLวนท;เปyน interface ก5คอปJšมของโทรศ)พท#ท;ผVUใชUสามารถตดตLอก)บเครองไดU สZาหร)บระบบอเล5กทรอนกส#ท;อยVLในเครองโทรศ)พท# คอสLวนท;เปyน implementation ซxงผVUใชUไมLสามารถมองเห5นและไมLจZาเปyนตUองเขUาใจการทZางานของระบบด)งกลLาว และ หากระบบอเล5กทรอนกส#ภายในเปล;ยนแปลงไป ผVใชUย)งสามารถท;จะตดตLอก)บเครองไดUโดยใชUปJšมท;เปyนสLวน interface U เชLนเดม ผศ. ธนศา เครอไวศยวรรณ หล)กการเชงอ5อบเจกต# 105
  • 117. 4.3.2 การสบทอด คJณล)กษณะเดLนประการหนxงของการโปรแกรมเชงอ5อบเจกต#คอ ความสามารถท;จะนZาเอาโปรแกรมท;ออกแบบ ไวUแลUวมาใชUใหมLไดU ซxงสZาหร)บโปรแกรมเชงกระบวนการจะทZาไดUโดยการกZาหนดคZาส)งท;ตUองใชUบLอยไวUในโปรแกรม ยLอย (ฟwงก#ชน หรอ Procedure) ซxงจะม;ความซ)บซUอนในการออกแบบเพอใหUไดUโปรแกรมยLอยท;เหมาะสม ทZาใหUการนZา ) โปรแกรมมาใชUใหมLของโปรแกรมเชงกระบวนการคLอนขUางจะเปyนไปไดUยากกวLา และเมอโปรแกรมม;ความซ)บซUอนขxYน การนZาโปรแกรมมาใชUใหมLก5เปyนไปไดUยากขxน เนองจากเราไมLสามารถออกแบบโปรแกรมครอบคลJมปwญหาท)Yงหมด ไวU Y ลLวงหนUาไดU วธ;การนZาโปรแกรมมาใชUใหมLของโปรแกรมเชงอ5อบเจกต# จะใชUหล)กการของการสบทอด ซxงเปyนการนยาม คลาสใหมLจากรVปแบบของคลาสท;ม;อยVLแลUว โดยคลาสใหมLจะนZาคJณล)กษณะและเมธอดของคลาสเดมมาใชUไดU โดยท)วไป คลาสตLางๆ ท;ม;อยVLจะม;โครงสรUางท;ม;ความส)มพ)นธ#ก)นตามลZาด)บช)Yน เราสามารถท;จะออกแบบโปรแกรมเชงอ5อบเจกต# เพอสรUางคลาสท;เปyนคลาสแบบท)วไป (Generalized Class) ซxงจะม;คJณล)กษณะและเมธอดเพอใหUคลาสอนๆ ท;เปyน คลาสเฉพาะ (Specific Class) สบทอดไดU คลาสท;เปyนคลาสแบบท)วไปจะเร;ยกวLาเปyน superclass หรอ parent class สLวนคลาสท;เปyนคลาสเฉพาะท;สบทอดมาจะเร;ยกวLาเปyน subclass หรอ child class รVปท; 4.8 แสดงต)วอยLางของคลาสท;ใชUหล)กการของการสบทอด ต)วอยLางน;จะม;คลาส Student เปyนคลาสแบบ Y ท)วไป และม;คลาส GradStudent, PartTimeStudent และ FullTimeStudent สบทอดมาจากคลาส Student และคลาส PhDStudent จะสบทอดมาจากคลาส GradStudent อ;กช)Yนหนxง การสบทอดจะม;ผลใหUคJณล)กษณะและ เมธอดของ Superclass สบทอดไปย)ง Subclass ต)วอยLางเชLน ถUาคลาส Student ในรVปท; 4.8 ม;คJณล)กษณะ id, name, gpa และ MIN_GPA และม;เมธอด setId(), setName(), setGpa() และ showDetails() คลาส GradStudent, PartTimeStudent และ FullTimeStudent ก5จะสบทอดคJณล)กษณะและเมธอดเหลLาน)นมาดUวย Y นอกจากน;คลาส PhDStudent ท;สบทอดมาจากคลาส GradStudent ก5จะไดUรบคJณล)กษณะและเมธอดท;สบทอดมา Y ) จากคลาส Student ท;เปyน superclass ของคลาส GradStudent ดUวย ขUอด;ของการสบทอดคอ ความสามารถในการท;จะนZาโปรแกรมเดมมาพ)ฒนาเพมเตมใหมLไดUงLายขxน และย)งชLวย Y ทZาใหUโปรแกรมแตLละโปรแกรมม;ขนาดเล5ก ซxงทZาใหUงLายตLอการเขUาใจและการปร)บปรJงแกUไขโปรแกรมทZาไดUงLายขxน Y โดยในภาษาจาวาจะใชUคย#เวร#ด extends เพอระบJการสบทอด โปรแกรมท; 4.4 แสดงต)วอยLางของคลาสท;ใชUหล)กการ ; ในการสบทอดตามไดอะแกรมของคลาสในรVปท; 4.8 106 หล)กการเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 118. รปท 4.8 ตวอย%างของคลาสทใช*หลกการของการส0บทอด โปรแกรมท 4.4 ต)วอยLางการใชUหล)กการในการสบทอด public class PartTimeStudent extends Student { } ------------------------------------------------------ public class FullTimeStudent extends Student { } ------------------------------------------------------ public class GradStudent extends Student { private String thesisTitle; private String supervisor; public void setThesisTitle(String t) { thesisTitle = t; } public void setSupervisor(String s) { supervisor = s; } } ------------------------------------------------------ public class PhDStudent extends GradStudent { public boolean passQualify; public boolean isPassQualify() { return passQualify; } } 4.3.3 การมไดหลายรปแบบ หล)กการของการม;ไดUหลายรVปแบบคอ คJณสมบ)ตของโปรแกรมเชงอ5อบเจกต#ท;สามารถตอบสนองตLอขLาวสาร (เมธอด) เด;ยวก)นดUวยวธ;การท;ตLางก)น และสามารถกZาหนดอ5อบเจกต#ไดUหลายรVปแบบ หล)กการของการม;ไดUหลายรVป ผศ. ธนศา เครอไวศยวรรณ หล)กการเชงอ5อบเจกต# 107
  • 119. แบบเปyนหล)กการท;สบเนองมาจากหล)กการของการสบทอด ต)วอยLางเชLน รVปท; 4.9 ม;คลาส Ball ซxงเปyน superclass ของคลาส SoccerBall และ TennisBall รปท 4.9 ตวอย%างของคลาส Ball คลาส Ball อาจม;เมธอด throwBall() เพอกZาหนดพฤตกรรมการโยนลVกบอล ซxง subclass ท;ชอ SoccerBall และ TennisBall อาจกZาหนดวธ;การการโยนลVกบอลแตLละชนดท;ตLางก)นกลLาวคอเข;ยนคZาส)งในเมธอด throwBall() ท;สบทอดมาดUวยชJดคZาส)งท;ตLางก)นด)งแสดงในโปรแกรมท; 4.5 หล)กการของการม;ไดUหลายรVปแบบย)ง รวมไปถxงความ สามารถท;จะอUางองอ5อบเจกต#ท;สบทอดมาไดUหลายรVปแบบ ต)วอยLางเชLนคลาส SoccerBall ท;สบทอด มาจากคลาส Ball สามารถท;จะอUางองอ5อบเจกต#ของคลาส SoccerBall ไดUท)YงในรVปแบบของ SoccerBall หรอ Ball ไดU ต)วอยLางเชLนคZาส)ง SoccerBall b2 = new SoccerBall(); Ball b3 = new SoccerBall(); ซxงขUอด;ของการใชUหล)กการของการม;ไดUหลายรVปแบบคอ ทZาใหUโปรแกรมสามารถปร)บเปล;ยนหรอเพมเตมไดU งLายขxน Y 108 หล)กการเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 120. โปรแกรมท( 4.5 ต)วอยางการใชหล)กการของการม%ไดหลายร1ปแบบ public class Ball { public void throwBall() { } } -------------------------------------------------------------- public class SoccerBall extends Ball { public void throwBall() { System.out.println(“Throwing soccerball”); } } -------------------------------------------------------------- public class TennisBall extends Ball { public void throwBall() { System.out.println(“Throwing tennisball”); } } -------------------------------------------------------------- public class TestBall { public static void main(String args[]) { Ball b1 = new Ball(); SoccerBall b2 = new SoccerBall(); Ball b3 = new SoccerBall(); } } 4.4 การเขยนโปรแกรมเช,งอ-อบเจกต.เพอสรางคลาสแบบ abstract และอ,นเตอร.เฟส โปรแกรมเชงอ5อบเจกต#นอกเหนอจากการนยามคลาสแลUว ในบางกรณ;เราอาจจZาเปyนท;จะตUองนยามเมธอดตLางๆ ภายในคลาส ขxนมากLอนไดU โดยย)งไมLตUองระบJคZาส)งหรอวธ;การของคลาสน)น อาทเชLนเราอาจตUองการกZาหนดคลาสชอ Y Y Vehicle (ยานพาหนะ) ซxงอาจม;เมธอดท;ชอ move() อยVL ท)Yงน;อาจม;คลาสอนๆท;จะสบทอดจาก Vehicle เชLน Car Y หรอ Motorbike ซxงจะม;วธ;การหรอคZาส)งในการ move() ท;แตกตLางก)นภาษาจาวาไดUกZาหนดคลาสล)กษณะน;YไวUสอง แบบคอ คลาสแบบ abstract และอนเตอร#เฟส 4.4.1 คลาสแบบ abstract คลาสท;ม; modifier เปyน abstract จะหมายความวLาคลาสน)Yนย)งเปyนคลาสท;ไมLสมบVรณ# โดยม;เมธอดแบบ abstract ซxงเปyนเมธอดท;ย)งไมLสมบVรณ#อยLางนUอยหนxงเมธอดอยVLในคลาส เมธอดแบบ abstract จะม;รVปแบบการ ผศ. ธนศา เครอไวศยวรรณ หล)กการเชงอ5อบเจกต# 109
  • 121. ประกาศด)งน;Y [modifier] abstract return_type methodName([arguments]); ท)Yงน;Yเมธอดแบบ abstract เปyนเมธอดท;ย)งไมLสมบVรณ# เนองจากไมLม;บล5อกคZาส)ง ({ }) อยVLภายในเมธอด โปรแกรมท; 4.6 แสดงต)วอยLางของคลาส Student ท;เปyนคลาสแบบ abstract คลาสน;จะม;เมธอด Y showDetails() ซxงเปyนเมธอดแบบ abstract อยVLภายในคลาส โปรแกรมท 4.6 ต)วอยLางคลาสแบบ abstract public abstract class Student { protected String id; protected String name; protected double gpa; public void setId(String ID) { id = ID; } public void setName(String n) { name = n; } public void setGpa(double GPA) { gpa = GPA; } public abstract void showDetails(); } คลาสแบบ abstract กZาหนดขxนมาเพอใหUคลาสอนสบทอด โดยคลาสท;มาสบทอดจะตUองกZาหนดบล5อก Y คZาส)งในเมธอดท;ย)งไมLสมบVรณ# ท)Yงน;เY ราจะไมLสามารถจะสรUางอ5อบเจกต#ของคลาสแบบ abstract ไดU โปรแกรมท; 4.7 แสดงต)วอยLางของคลาส FullTimeStudent ท;สบทอดมาจากคลาส Student คลาสน;YจะตUองม;การกZาหนดบล5อก คZาส)งในเมธอด showDetails() เพอทZาใหUเปyนเมธอดท;สมบVรณ# ซxงจะทZาใหUคลาส FullTimeStudent เปyนคลาส ท;สามารถใชUในการสรUางอ5อบเจกต#ไดU อนxงถxงแมUวาเราจะไมLสามารถสรUางอ5อบเจกต#ของคลาส Student ไดUแตLเรา L สามารถประกาศอ5อบเจกต#ของคลาส Student และสรUางอ5อบเจกต#ของคลาส FullTimeStudent ไดUตามหล)กการ ของการม;ไดUหลายรVปแบบด)งน;Y Student s1 = new FullTimeStudent(); 110 หล)กการเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 122. โปรแกรมท 4.7 ต)วอยLางคลาสท;สบทอดมาจากคลาสแบบ abstract public class FullTimeStudent extends Student { private int credit; private final int MAX_YEAR = 4; public FullTimeStudent(int c) { credit = c; } public void showDetails() { System.out.println("ID: "+id); System.out.println("Name: "+name); System.out.println("GPA: "+gpa); System.out.println("Credit: "+credit); } } 4.4.2 อ,นเตอร.เฟส อนเตอร#เฟส (interface) ม;ล)กษณะคลUายก)บคลาสแบบ abstract แตLจะประกอบดUวยเมธอดท;ย)งไมLสมบVรณ# เทLาน)น โดยม;รVปแบบด)งน;Y Y [modifier] interface InterfaceName { [methods();] } โดยท; • InterfaceName คอชอของอนเตอร#เฟส • methods() เปyนเมธอดท;ย)งไมLสมบVรณ# เชLนเด;ยวก)บเมธอดแบบ abstract แตLไมLตUองใชUค;ยเวร#ด # abstract โปรแกรมท; 4.8 แสดงต)วอยLางของกรณ;กZาหนดอนเตอร#เฟส Student อนเตอร#เฟสน;Yจะม;เมธอด 4 เมธอดท; ย)งไมLม;บล5อกคZาส)งคอเมธอด setId(), setName(), setGpa() และ showDetails() ผศ. ธนศา เครอไวศยวรรณ หล)กการเชงอ5อบเจกต# 111
  • 123. โปรแกรมท 4.8 ต)วอยLางอนเตอร#เฟส public interface Student { public void setId(String ID); public void setName(String n); public void setGpa(double GPA); public void showDetails(); } อนเตอร#เฟสกZาหนดขxนมาเพอใหUคลาสอนนZาไปใชUงานโดยใชUค;ย#เวร#ด implements โดยม;รปแบบด)งน;Y Y V [modifier] class ClassName implements InterfaceName { [methods();] } โปรแกรมท; 4.9 ไดUแสดงต)วอยLางของคลาส PartTimeStudent ท; implements อนเตอร#เฟส Student คลาสท; implements อนเตอร#เฟสจะตUองเข;ยนบล5อกคZาส)งในเมธอดทJกเมธอดท;กZาหนดไวUในอนเตอร#เฟส เพอทZาใหU เมธอดเหลLาน;สมบVรณ# และสามารถสรUางอ5อบเจกต#ของคลาสน)YนไดU Y อนเตอร#เฟสจะเหมอนก)บคลาสแบบ abstract ตรงท;เราจะไมLสามารถสรUาง อ5อบเจกต#ของอนเตอร#เฟสไดU ประโยชน#ของอนเตอร#เฟสก5คอการกZาหนดรVปแบบของเมธอดตLางๆ ท;คลาสอนๆ จะตUอง implements ไวUลวงหนUา ซxง L สามารถอาศ)ยหล)กการของการม;ไดUหลายรVปแบบมาเร;ยกใชUเมธอดเหลLาน)นไดUจากคลาสท; implements อนเตอร#เฟส Y อาทเชLน คZาส)ง Student s1 = new PartTimeStudent(6); s1.setId(“1111”); s1.setName(“Thana”); s1.setGpa(3.00); s1.showDetails(); อนเตอร#เฟสย)งชLวยในการสบทอดแบบหลายคลาสไดU (Multiple Inheritance) เนองจากภาษาจาวากZาหนด ใหUคลาสใดๆ สามารถสบทอดคลาสอนไดUเพ;ยงคลาสเด;ยวเทLาน)น แตLจะสามารถ implements อนเตอร#เฟสไดUหลาย Y อนเตอร#เฟส อาทเชLน public class MyApplet extends Applet implements MouseListener,ActionListener { ... } เปyนโปรแกรมจาวาแอปเพล5ตท;สบทอดมาจากคลาส Applet แตLขณะเด;ยวก)นเปyนคลาสท; implements อนเตอร#เฟส MouseListener และ ActionListener เปyนตUน 112 หล)กการเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 124. โปรแกรมท 4.9 ต)วอยLางคลาสท; implements อนเตอร#เฟส public class PartTimeStudent implements Student { private String id; private String name; private double gpa; private int credit; private final int MAX_YEAR = 8; public PartTimeStudent(int c) { credit = c; } public void setId(String ID) { id = ID; } public void setName(String n) { name = n; } public void setGpa(double GPA) { gpa = GPA; } public void showDetails() { System.out.println(“ID: “+id); System.out.println(“Name: “+name); System.out.println(“GPA: “+gpa); System.out.println(“Credit: “+credit); } } 4.5 แพคเก-จ แพคเก5จจะเปyนท;รวบรวมคลาสและอนเตอร#เฟสตLางๆ ท;ม;หนUาท;การทZางานคลUายก)นไวUในท;เด;ยวก)น โดยท)วไป โปรแกรมภาษาจาวาจะประกอบไปดUวยคลาสหลายคลาสท;ประกาศอยVLในโปรแกรมไฟล#ตLางๆ ไฟล#โปรแกรมภาษา จาวาแตLละไฟล#อาจม;คลาสท;ประกาศไวUหลายคลาสไดU แตLจะม;คลาสท;ม; access modifier เปyน public ไดUเพ;ยง คลาสเด;ยว ซxงวธ;การปฏบ)ตท;นยมใชUคอการกZาหนดใหUในแตLละโปรแกรมไฟล#ม;คลาสเพ;ยงคลาสเด;ยว โดยม;ชอไฟล#เปyน ชอเด;ยวก)บชอคลาส การจ)ดระบบไฟล#และคลาสจxงจZาเปyนอยLางยงสZาหร)บการพ)ฒนาโปรแกรมขนาดใหญL เราสามารถท;จะแบLง โปรแกรมใหUเปyนแพคเก5จตLางๆ โดยจ)ดกลJLมของคลาสท;ทZางานคลUายก)นไวUในแพคเก5จเด;ยวก)น แพคเก5จแตLละแพคเก5จ จะใชUในการเก5บคลาสหรอแพคเก5จยLอยไดU ผศ. ธนศา เครอไวศยวรรณ หล)กการเชงอ5อบเจกต# 113
  • 125. ซxงโปรแกรมจาวาจะสรUางไดเร5กทอร; (Directory) ท;ม;ชอเด;ยวก)บแพคเก5จ ในการเก5บคลาสหรอแพคเก5จยLอย เหลLาน)น รVปท; 4.10 แสดงต)วอยLางโครงสรUางไดเร5กทอร;ของโปรแกรมท;มคลาสและแพคเก5จหลายๆ ต)ว โปรแกรมจะ Y ; อยVLในแพคเก5จ faculty ซxงจะประกอบดUวย แพคเก5จยLอย 3 แพคเก5จคอ domain, GUI และ reports โดย โปรแกรม Student.class, Teacher.class และ Subject.class จะอยVLในแพคเก5จยLอย domain สLวน โปรแกรม Report.class จะอยVLในแพคเก5จยLอย reports รปท 4.10 ตวอย%างแพคเก-จ 4.5.1 การประกาศและใชแพคเก-จ โครงสรUางโปรแกรมไฟล#ของภาษาจาวาจะประกอบดUวยคZาส)งด)งน;Y [<package_declaration>] [<import_declaration>] [<class_declaration>] โดยท; • package_declaration เปyนการระบJวาโปรแกรมไฟล#อยVLในแพคเก5จใด L • import_declaration เปyนคZาส)งในการเร;ยกใชUแพคเก5จอนๆ • class_declaration เปyนคZาส)งในการประกาศคลาส คZาส)งในการระบJแพคเก5จจะม;รปแบบด)งน;Y V 114 หล)กการเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 126. package <package_name>[<sub_package_name>] ต)วอยLางเชLน package faculty.domain; หรอ package faculty; โปรแกรมไฟล#หนxงไฟล#จะม;คZาส)ง package ไดUเพ;ยงคZาส)งเด;ยว โดยจะตUองเปyนคZาส)งแรกของโปรแกรม ใน กรณ;ท;ไมLม;คZาส)ง package โปรแกรมไฟล#นนจะถVกกZาหนดไวUในแพคเก5จ default )Y การเร;ยกใชUแพคเก5จอน ๆ จะทZาไดUโดยการใชUคZาส)ง import ซxงม;รVปแบบของคZาส)งด)งน;Y import <package_name>[.<sub_package_name>].<Class_name> หรอ import <package_name>[.<sub_package_name>].*; ต)วอยLางเชLน import faculty.reports.Report; หรอ import java.awt.*; คZาส)ง import จะตUองกZาหนดไวUกLอนคZาส)งการประกาศคลาส ซxงโปรแกรมไฟล#ภาษาจาวาแตLละโปรแกรม สามารถม;คZาส)ง import ไดUหลายคZาส)ง 4.6 Unified Modeling Language Unified Modeling Language (UML) เปyนภาษาท;ใชUรVปกราฟmกเพอจZาลองระบบซอฟต#แวร# UML ถVก พ)ฒนาขxนเพอจZาลองโปรแกรมเชงอ5อบเจกต#ในตUนทศวรรษท; 1990 ซxงในปwจจJบ)น UML ไดUกลายเปyนมาตรฐานท;ใชUใน Y การจZาลองระบบซอฟต#แวร#ตามขUอกZาหนดของ OMG (Object Management Group) หน)งสอเลLมน;จะใชUส)ญล)กษณ# Y ของ UML ในการจZาลองระบบโปรแกรมตLางๆ แตLเนองจาก UML เปyนภาษาท;ม;ขUอกZาหนดตLางๆ มาก ด)งน)YนเนYอหา ในบทน;จะกลLาวถxงเฉพาะสLวนตLางๆ ท;จZาเปyนตLอความเขUาใจท;จะใชUในหน)งสอเลLมน;เY ทLาน)น Y Y ผศ. ธนศา เครอไวศยวรรณ หล)กการเชงอ5อบเจกต# 115
  • 127. 4.6.1 ไดอะแกรมของคลาส ไดอะแกรมของคลาส (Class Diagram) เปyนส)ญล)กษณ#ท;ใชUแสดงคลาสใน UML โดยไดอะแกรมของคลาส จะประกอบดUวยสLวนตLางๆ สามสLวนคอ ชอของคลาส คJณล)กษณะภายในคลาส และเมธอดภายในคลาส ด)งแสดงในรVป ท; 4.11 ไดอะแกรมของคลาสจะระบJขUอมVลตLางๆ สZาหร)บคJณล)กษณะภายในคลาสคอ ชอของคJณล)กษณะ ชนดขUอมVล สถานะการเขUาถxง (access modes) และคLาเรมตUน สLวนเมธอดภายในคลาสจะระบJถxงสถานะการเขUาถxง ชอของเมธอด ชนดขUอมVลของ argument และชนดขUอมVลของคLาท;สLงกล)บ สZาหร)บสถานะการเขUาถxง UML ไดUกZาหนดส)ญล)กษณ#ตLางๆ ไวUด)งน;Y + สZาหร)บ public - สZาหร)บ private รปท 4.11 ตวอย%าง UML ของคลาส Student ไดอะแกรมของคลาสสามารถท;จะแสดงความส)มพ)นธ#ของคลาส ท;ม;การสบทอดก)น โดยการใชUลVกศรเปyน ส)ญล)กษณ#ด)งแสดงต)วอยLางในรVปท; 4.8 นอกจากน;Yไดอะแกรมของคลาสย)งสามารถท;จะแสดงความส)มพ)นธ#หรอแสดง คJณสมบ)ตอนๆ เชLน แสดงวLาเปyนคลาสแบบ interface ไดUอ;กดUวย 4.6.2 ไดอะแกรมของอ-อบเจกต. UML สามารถท;จะแสดงใหUเห5นไดUวาอ5อบเจกต#ท;สรUางขxนมาเปyนอ5อบเจกต#ของคลาสใด และม;คาของคJณ - L Y L ล)กษณะตLางๆ อยLางไร โดยใชUไดอะแกรมของอ5อบเจกต# (Object Diagram) ท;ประกอบไปดUวยสLวนตLางๆ สองสLวน คอ สLวนท;ระบJชอของอ5อบเจกต# และสLวนท;ระบJคLาของคJณล)กษณะภายในอ5อบเจกต# ด)งต)วอยLางในรVปท; 4.12 ซxงเปyนการ 116 หล)กการเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 128. แสดงอ5อบเจกต# s1 และ s2 ของคลาส Student จากรVปจะเห5นไดUวาส)ญล)กษณ#ลVกศรท;เปyนเสUนปะจะเปyนการระบJวา L L อ5อบเจกต# s1 เปyนอ5อบเจกต#ของคลาส Student รปท 4.12 ไดอะแกรมของอ-อบเจกต s1 และ s2 ของคลาส Student 4.7 ขนตอนการพฒนาโปรแกรม การพ)ฒนาโปรแกรมคอมพวเตอร# ไมLไดUหมายถxงเพ;ยงแคLการเข;ยนโปรแกรมคZาส)งภาษาคอมพวเตอร#ภาษาใด ภาษาหนxง แตLจะรวมถxงข)นตอนท)Yงหมดในการพ)ฒนาโปรแกรม ซxงข)นตอนการพ)ฒนาโปรแกรมน;Yเร;ยกวLา ว)ฎจ)กรการ Y Y พ)ฒนาโปรแกรม (Software Development Life Cycle เร;ยกยLอวLา SDLC) ซxงจะประกอบไปดUวยข)นตอนตLางๆ 5 Y ข)Yนตอนคอ 1. ข)นตอนการวเคราะห# (Analysis) Y 2. ข)นตอนการออกแบบ (Design) Y 3. ข)นตอนการเข;ยนโปรแกรม (Programming) Y 4. ข)นตอนการทดสอบ (Testing) Y 5. ข)นตอนการทZางาน (Operation) Y ซxงแตLละข)Yนตอนม)กไมLไดUผลล)พธ#ท;สมบVรณ#ท;จะสามารถทZาข)YนตอนตLอไปไดU โดยไมLตUองกล)บมาทZาข)Yนตอนเดม อ;ก แตLระหวLางทZางานในแตLละข)YนตอนอาจตUองยUอนกล)บไปทZางานในข)นตอนอนๆ กLอนหนUาน)นด)งแสดงรVปท; 4.13 Y Y ผศ. ธนศา เครอไวศยวรรณ หล)กการเชงอ5อบเจกต# 117
  • 129. รปท 4.13 ขนตอนการพฒนาโปรแกรม ข)นตอนการวเคราะห# เปyนการศxกษาความเปyนไปไดU (feasibility study) ของปwญหาท;ตUองการพ)ฒนาโปรแกรม Y ท;มพ)ฒนาโปรแกรมจะทZาการวเคราะห#ปwญหาและพจารณาวLาสามารถท;จะพ)ฒนาโปรแกรมคอมพวเตอร#เพอแกUไข ปwญหาไดUหรอไมL ผลล)พธ#ท;ไดUจากข)นตอนน;คอขUอกZาหนดตามความตUองการ (requirement specification) ซxงจะ Y Y อธบายคJณล)กษณะของโปรแกรม โดยขUอกZาหนดน;จะเข;ยนอยVในรVปแบบตLางๆ เพอใหUผVUใชU ผVปฏบ)ตงาน และน)กพ)ฒนา Y L U โปรแกรมสามารถเขUาใจไดU และสามารถทดสอบโปรแกรมท;พ)ฒนาขxนไดUวLาถVกตUองและตรงตามความตUองการของผVUใชU Y หรอไมL ข)นตอนการออกแบบ จะเปyนการทZาใหUขUอกZาหนดตามความตUองการเปล;ยนไปอยVLในรVปแบบของรายละเอ;ยด Y ของโปรแกรมท;จะตUองพ)ฒนา ซxงในการออกแบบโดยใชUหล)กการเชงอ5อบเจกต#ก5อาจจะไดUไดอะแกรมตLางๆ ในรVปของ UML เพอท;จะอธบายคลาสและอ5อบเจกต#ตLางๆ ท;สอดคลUองก)บขUอกZาหนดตามความตUองการ ข)นตอนการเข;ยนโปรแกรม จะเปyนการเข;ยนโปรแกรมโดยใชUภาษาคอมพวเตอร#ภาษาใดภาษาหนxงใหUเปyนไป Y ตามโปรแกรมท;ไดUออกแบบไวU ซxงการเลอกใชUภาษาคอมพวเตอร#ควรท;จะตUองสอดคลUองก)บวธ;การท;ไดUออกแบบไวU ใน กรณ;ท;ขนตอนการออกแบบเปyนการใชUหล)กการเชงอ5อบเจกต#ก5ควรท;จะตUองใชUภาษาคอมพวเตอร#เชงอ5อบเจกต#เชLน )Y ภาษาจาวาในการเข;ยนโปรแกรม ข)นตอนน;จะเปyนข)นตอนท;ไมLยากน)กเนองจากเปyนการเข;ยนโปรแกรมตามขUอกZาหนดท; Y Y Y ไดUจากการออกแบบ ด)งน)Yนการพ)ฒนาโปรแกรมท;ด;จะตUองม;ขนตอนการออกแบบท;ด;เพอใหUไดUโปรแกรมท;ถVกตUอง )Y ข)นตอนการทดสอบ จะเปyนข)นตอนท;จะทดสอบโปรแกรมท;ไดUพ)ฒนาขxน โดยอาจเปyนการทดสอบการทZางาน Y Y Y ของโปรแกรมจากขUอมVลท;นZามาทดสอบตLางๆ และตรวจสอบดVวLาโปรแกรมสามารถทZางานไดUถVกตUองตามขUอกZาหนด ตามความตUองการหรอไมL การทดสอบโปรแกรมเชงอ5อบเจกต#อาจเปyนการทดสอบท;ละยVนต (Unit Testing) หรอการ 118 หล)กการเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 130. ทดสอบโดยรวม (Integration Testing) การทดสอบท;ละยVนตเปyนการทดสอบการทZางานของแตLละคลาส สLวนการ ทดสอบโดยรวมเปyนการทดสอบการทZางานเมอรวมคลาสตLางๆ เขUาดUวยก)น ข)นตอนการทZางาน เปyนข)นตอนสJดทUายท;ไดUสLงมอบโปรแกรมใหUก)บผVใชUงานแลUว ซxงโปรแกรมท;สLงมอบก5 Y Y U เปร;ยบเสมอนสนคUาอนๆ เชLน บUานหรอรถยนต# ท;อาจม;ขUอบกพรLองท;ตUองแกUไขและตUองม;การบZารJงร)กษา ผVUใชUโปรแกรม อาจพบขUอผดพลาดของโปรแกรมในระหวLางการใชUงาน ซxงขUอผดพลาดเหลLาน;อาจเกดขxนจากข)นตอนการออกแบบ ข)น Y Y Y Y ตอนการเข;ยนโปรแกรม หรอแมUกระท)งเกดขxYนในข)นตอนการวเคราะห#โปรแกรม ท;อาจวเคราะห#ความตUองการผดพลาด Y ซxงจากขUอผดพลาดเหลLาน;ทZาใหUน)กพ)ฒนาโปรแกรมอาจจะตUองนZาโปรแกรมมาแกUไข ข)นตอนน;Yเปร;ยบเสมอนข)นตอน Y Y Y การบZารJงร)กษาโปรแกรม (software maintenance) ซxงจะม;ระยะเวลายาวนานตามระยะเวลาการใชUงานของโปรแกรม ซxงม)กจะพบวLาข)นตอนน;Yจะม;คาใชUจLายในการพ)ฒนาโปรแกรมมากท;สJดเมอเท;ยบก)บข)Yนตอนอนๆ Y L จากท;กลLาวมาขUางตUนแลUววLา ว)ฎจ)กรของการพ)ฒนาโปรแกรมไมLสามารถท;จะทZาแตLละข)นตอนใหUสมบVรณ# Y 100% ไดU แตLจะตUองม;การยUอนกล)บมาทZาข)นตอนอนๆ เสมอ โดยท)วไปน)กพ)ฒนาโปรแกรมท;ด;จะตUองใหUความสZาค)ญ Y ก)บข)Yนตอนการวเคราะห# และข)นตอนการออกแบบใหUมากท;สJด เพราะโปรแกรมท;ม;การออกแบบท;ด;จะชLวยลดความยJLง Y ยากในข)นตอนการทZางาน (บZารJงร)กษา) ซxงจะม;ผลทZาใหUตUนทJนในการพ)ฒนาโปรแกรมถVกลง Y สร%ปเนอหาของบท • โปรแกรมเชงอ5อบเจกต#จะม;คZานยามท;สZาค)ญสองคZาคอ อ5อบเจกต#และคลาส • อ5อบเจกต#คอสงตLางๆ ท;ม;อยVLในช;วตประจZาว)นจะประกอบไปดUวยคJณล)กษณะและ เมธอด • คลาสเปร;ยบเสมอนพมพ#เข;ยวของอ5อบเจกต# อ5อบเจกต#จะถVกสรUางมาจากคลาส อ5อบเจกต#หลายอ5อบเจกต# สามารถถVกสรUางจากคลาสหนxงคลาสไดU • คJณล)กษณะของอ5อบเจกต#คอขUอมVลท;เก5บอยVLในอ5อบเจกต# ซxงจะแบLงออกเปyนต)วแปรและคLาคงท; • คJณล)กษณะของคลาสเปyนคJณล)กษณะท;ใชUรวมก)นของทJกอ5อบเจกต# L • เมธอดคอวธ;การเพอใชUในการจ)ดการก)บคJณล)กษณะของอ5อบเจกต#หรอคJณล)กษณะของคลาส • ภาษาจาวาม;นยามในการเข;ยนโปรแกรมเชงอ5อบเจกต#เพอประกาศคลาส คJณล)กษณะ เมธอด และอ5อบเจกต# • โปรแกรมเชงอ5อบเจกต#จะม;คณล)กษณะเดLนอยVLสามประการคอ การหLอหJUม การสบทอด และการม;ไดUหลาย J รVปแบบ • การหLอหJUมคอการท;ใหUคJณล)กษณะถVกหLอหJUมอยVLภายในเมธอด โดยกZาหนดใหUคJณล)กษณะม; access modifier เปyน private และกZาหนดใหUเมธอดม; ccess modifier เปyน public ผศ. ธนศา เครอไวศยวรรณ หล)กการเชงอ5อบเจกต# 119
  • 131. ขUอด;ของการหLอหJUมคอการซLอนเรUนขUอมVลและความเปyนโมดVล • การสบทอดคอการท;คลาสใหมLสามารถนZาเอาคJณล)กษณะและเมธอดของคลาสท;ออกแบบไวUแลUวมาใชUไดU • การม;ไดUหลายรVปแบบคอการท;กZาหนดใหUม;การตอบสนองตLอเมธอดเด;ยวก)นดUวยวธ;การท;ตLางก)น และ สามารถกZาหนดอ5อบเจกต#ไดUหลายรVปแบบ • การสบทอดหมายถxง การท;คลาสท;เปyน subclass สบทอดคJณล)กษณะและเมธอดมาจากคลาสท;เปyน superclass ซxงภาษาจาวาจะใชUค;ย#เวร#ด extends • คZาส)ง package เปyนการระบJวLาคลาสอยVLในแพคเก5จใด • คZาส)ง import เปyนการเร;ยกใชUคลาสในแพคเก5จตLางๆ • Unified Modeling Language (UML) เปyนภาษาท;ใชUรVปกราฟmกเพอจZาลองระบบซอฟต#แวร# ในท;น;YไดU แนะนZาส)ญล)กษณ#ของ UML ท;สZาค)ญสองอยLางคอ ไดอะแกรมของคลาสและไดอะแกรมของอ5อบเจกต# • ว)ฎจ)กรการพ)ฒนาโปรแกรมจะประกอบไปดUวยข)นตอนตLางๆ 5 ข)Yนตอนคอ ข)นตอนการวเคราะห# ข)Yนตอน Y Y การออกแบบ ข)นตอนการเข;ยนโปรแกรม ข)นตอนการทดสอบ และข)YนตอนการบZารJงร)กษาโปรแกรม Y Y 120 หล)กการเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 132. บทท 5 การสรางส0วนต0อประสานกราฟ3กกบผใช เนYอหาในบทน;YเปyนการแนะนZาการเข;ยนโปรแกรมจาวาประยJกต#ท;ม;สLวนตLอประสานกราฟmกก)บผVUใชU โดยจะ เปyนการแนะนZาคลาสและอนเตอร#เฟสท;สZาค)ญในแพคเก5จ javax.swing อธบายคลาสประเภท Container และ คลาสท;เปyนสLวนประกอบกราฟmกอนๆ แนะนZาการจ)ดวางสLวนประกอบกราฟmกโดยใชUอ5อบเจกต#ประเภท LayoutManager และอธบายการสรUางเมนV 5.1 Java Foundation Class เนYอหาท;ผานมาเนUนการพ)ฒนาโปรแกรมท;ม;สLวนตLอประสานขUอความก)บผVUใชU (text-mode) แตLระบบ L ปฏบ)ตการสLวนใหญLจะม;สLวนตLอประสานกราฟmกก)บผVUใชU (Graphical User Interface เร;ยกยLอวLา GUI) ท)Yงน;เY นองจาก ใชUงานงLายกวLา ด)งน)นการพ)ฒนาโปรแกรมในปwจจJบนควรท;จะม;สLวนตLอประสานกราฟmกก)บผVUใชU ซxงโปรแกรมล)กษณะน;Y Y ) เร;ยกวLาโปรแกรม GUI การพ)ฒนาโปรแกรม GUI ผVพ)ฒนาโปรแกรมตUองม;ความเขUาใจชJดคZาส)งและองค#ประกอบทางดUานกราฟmกของ U ระบบปฏบ)ตการท;ตUองการพ)ฒนา ภาษาคอมพวเตอร#สLวนใหญLจะใชUชJดคZาส)งเฉพาะในแตLละระบบปฏบ)ตการ ด)งน)นผVU Y พ)ฒนาโปรแกรมจะตUองเร;ยนรVUชJดคZาส)งในแตLละระบบปฏบ)ตการและโปรแกรม GUI ท;พ)ฒนาขxนมาจะขxYนอยVLก)บ Y แพลตฟอร#ม (Platform Dependent) แตLภาษาจาวาจะสน)บสนJนการพ)ฒนาโปรแกรม GUI ท;สามารถใชUงานไดUหลาย แพลตฟอร#ม โดยจะใชUชJดคZาส)งเด;ยวก)น อาทเชLน เราสามารถท;จะนZาโปรแกรม GUI ท;พ)ฒนาบนระบบปฏบ)ตการ Linux มาใชUบนระบบปฏบ)ตการอนๆ ท;ม;สLวนตLอประสานกราฟmกก)บผVUใชUไดU ชJดคZาส)งของโปรแกรมภาษาจาวาท;ใชUในการพ)ฒนาโปรแกรม GUI จะอยVLในชJดของแพคเก5จ Java Foundation Classes (JFC) ด)งแสดงในรVปท; 5.1 ซxงประกอบดUวยแพคเก5จตLางๆ ด)งน;Y ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 121
  • 133. รปท 5.1 ส%วนประกอบทสาคญของ JFC • Abstract Window Toolkit (AWT) เปyนแพคเก5จท;ใชUในการพ)ฒนาโปรแกรม GUI ข)YนพYนฐาน ซxงจะใหU โปรแกรม GUI ท;เปyน look and feel ท;ขxYนอยVLก)บแพลตฟอร#ม ภาษาจาวาไดUกZาหนดแพคเก5จ AWT ขxYนมา ต)YงแตLเวอร#ช)นแรก (JDK 1.0) โดยกZาหนดไวUในแพคเก5จ java.awt • Swing เปyนแพคเก5จท;ม;สLวนประกอบกราฟmกท;ม;คJณล)กษณะและรVปแบบท;ด;กวLาสLวนประกอบกราฟmกของ แพคเก5จ AWT ซxงจะเหมาะก)บการพ)ฒนาโปรแกรม GUI ท;นZาไปใชUงานจรง ภาษาจาวาไดUกZาหนดแพคเก5จ Swing ขxนในจาวาเวอร#ชน 2 (Java 2) โดยกZาหนดในแพคเก5จชอ javax.swing โดยท)วไปโปรแกรมท; Y ) ใชUชดคZาส)งในแพคเก5จ Swing จะทZางานชUากวLาโปรแกรม GUI ท;ใชUแพคเก5จ AWT แตLจะม;รVปแบบท; J สวยงามกวLา • Java 2D เปyนชJดคZาส)งกราฟmกท;ม;คลาสท;ชLวยในการพ)ฒนาโปรแกรมกราฟmกสองมตและคลาสท;ใชUในการ จ)ดการก)บรVปภาพ • Accessibility เปyนชJดคZาส)งท;ม;คลาสในการพ)ฒนาโปรแกรมท;ม;อนพJตหรอเอาต#พJตในล)กษณะพเศษ อาท เชLน screen reader, screen magnifier และ audio text reader • Drag and Drop เปyนชJดคZาส)งของเทคโนโลย;ท;ชLวยในการแลกเปล;ยนขUอมVลระหวLางโปรแกรมท;พ)ฒนาโดย ภาษาจาวาก)บโปรแกรมภาษาอนๆ 5.1.1 แพคเก-จ AWT ภาษาจาวาในเวอร#ช)นแรกๆ จะใชUแพคเก5จ AWT ในการพ)ฒนาโปรแกรม กLอนท;จะมาพ)ฒนาโดยใชUแพคเก5จ Swing ท)Yงน;คลาสและอนเตอร#เฟสของ Swing หลายๆ ต)วสบทอดมาจากคลาสของแพคเก5จ AWT เนอหาในท;น;Yจะ Y 122 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
  • 134. แนะนZาใหUรVUจ)กคลาสและอนเตอร#เฟสตLางๆ ท;สZาค)ญในแพคเก5จ AWT ซxงม;ด)งน;Y • Component เปyนคลาสท;เปyน superclass ของคลาสประเภทสLวนประกอบกราฟmกทJกคลาสในแพคเก5จ AWT • Container เปyนคลาสท;ใชUในการใสLสLวนประกอบกราฟmก • LayoutManager เปyนอนเตอร#เฟสท;ใชUในการจ)ดตZาแหนLงและขนาดของสLวนประกอบกราฟmก • Graphics เปyนคลาสแบบ abstract ท;ใชUในการวาดรVปกราฟmก อาทเชLน วาดเสUน วาดส;เหล;ยม หรอเข;ยน ขUอความ เปyนตUน • Color เปyนคลาสท;ใชUในการจ)ดการส;ของสLวนประกอบกราฟmก • Font เปyนคลาสท;ใชUในการจ)ดการฟอนต#ของสLวนประกอบกราฟmก • AWTEvent เปyนคลาสท;เก;ยวขUองก)บเหตJการณ# (Event) ทางกราฟmก การเข;ยนโปรแกรม GUI น)นจะเปyนการสรUางอ5อบเจกต#ตLางๆ ท;เปyนอ5อบเจกต#ของคลาสท;เปyนสLวนประกอบ Y กราฟmก ซxงคลาสเหลLาน;จะสบทอดมาจากคลาสท;ชอ Component ด)งแสดงในรVปท; 5.2 ซxงคลาสท;เปyน subclass ของ Y คลาส Component จะแบLงเปyนสองกลJLมคอ 1. คลาสท;เปyนคลาสประเภท Container เปyนคลาสท;ใชUในการใสLสLวนประกอบกราฟmกตLางๆ 2. คลาสท;เปyนสLวนประกอบกราฟmกอนๆ อาทเชLน Button, Choice และ List เปyนตUน รปท 5.2 คลาสต%างๆ ทส0บทอดมาจากคลาสทช0อ Component ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 123
  • 135. 5.1.2 แพคเก-จ Swing Swing เปyนแพคเก5จสZาหร)บพ)ฒนาโปรแกรม GUI ซxงม;สLวนประกอบกราฟmกท;มากชนดกวLาท;ม;อยVLในแพคเก5จ AWT นอกจากน;สLวนประกอบกราฟmกของแพคเก5จ Swing จะม;ล)กษณะท;ด;กวLาสLวนประกอบกราฟmกของแพคเก5จ Y AWT สLวนประกอบกราฟmกของแพคเก5จ Swing สามารถกZาหนดรVปแบบของ look and feel ท;ทZาใหUไดUโปรแกรม GUI ท;ม;รVปแบบของกราฟmกเหมอนก)นในทJกแพลตฟอร#ม ซxงจะแตกตLางก)บแพคเก5จ AWT ท;จะม;รVปแบบของกราฟmก ซxงขxนอยVLก)บ look and feel ของแตLละแพลตฟอร#ม ซxงการกZาหนด look and feel ไดUเองน;ทZาใหUโปรแกรม GUI ท;ใชU Y Y อ5อบเจกต#ของแพคเก5จ Swing แสดงผลไดUชากวLาโปรแกรม GUI ท;ใชUอ5อบเจกต#ของแพคเก5จ AWT U แพคเก5จ Swing ประกอบดUวยคลาสตLางๆ ท;เปyนประเภทสLวนประกอบกราฟmก (Graphical Component) เพอนZาไปใชUในการพ)ฒนาโปรแกรม GUI แพคเก5จ Swing จะชLวยในการสรUางโปรแกรม GUI ประเภท look and feel โดยจะไมLขนอยVLก)บแพลตฟอร#มท;ใชUงาน ภาษาจาวาไดUกZาหนดแพคเก5จ Swing อยVLในแพคเก5จ javax.swing xY แพคเก5จ Swing จะประกอบไปดUวยคลาสและอนเตอร#เฟสตLางๆ เพอใชUในการพ)ฒนาโปรแกรม GUI โดยคลาสและ อนเตอร#เฟสตLางๆ เหลLาน;จะม;ความส)มพ)นธ#ด)งแสดงในรVปท; 5.3 Y รปท 5.3 คลาสและอนเตอรเฟสต%างๆ ในแพคเก-จ Swing 124 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
  • 136. 5.2 คลาสประเภท Container อ5อบเจกต#ของคลาส Container จะใชUในการใสLอ5อบเจกต#ของสLวนประกอบกราฟmกหลายๆ อ5อบเจกต#ไวUเพอ แสดงผล โปรแกรม GUI จะตUองม;การสรUางอ5อบเจกต#ของคลาสประเภท Container อยLางนUอยหนxงอ5อบเจกต# ขxนมา Y กLอน เพอใชUในการใสLอ5อบเจกต#ของคลาสท;เปyนสLวนประกอบกราฟmกอนๆ คลาสประเภท Container ท;อยVLในแพคเก5จ AWT ม;ด)งน;Y • Frame • Panel • Dialog • Applet โดยจะม;ลZาด)บช)นของการสบทอดด)งแสดงในรVปท; 5.2 Y คลาสประเภท Container เปyนคลาสท;สบทอดมาจากคลาสท;ชอ Component ซxงจ)ดเปyนสLวนประกอบ กราฟmกชนดหนxง ด)งน)นเราจxงสามารถท;จะใสLอ5อบเจกต#ประเภท Container บางชนดลงในอ5อบเจกต#ของคลาส Y ประเภท Container ต)วอนๆ ไดUอาทเชLน ใสLอ5อบเจกต#ของคลาส Panel ลงในอ5อบเจกต#ของคลาส Frame คลาสท; ชอ Container เปyนคลาสแบบ abstract ซxงเราไมLสามารถท;จะสรUางอ5อบเจกต#ของคลาสด)งกลLาวไดU แตLจะตUอง สรUางอ5อบเจกต#ของคลาสอนๆ ท;สบทอดมาจากคลาสท;ชอ Container แทน คลาสท;ชอ Container จะม;เมธอด add() ท;ใชUในการใสLสLวนประกอบกราฟmกอนๆ เมธอดน;Yจะม;รVปแบบท;สZาค)ญด)งน;Y • public void add(Component c) • public void add(Component c, int position) โดยท; • c คออ5อบเจกต#ของสLวนประกอบกราฟmกท;ตUองการใสL • position คอตZาแหนLงท;ตUองการวางสLวนประกอบกราฟmก โดยปกตคลาสประเภท Container จะม;การจ)ดวางสLวนประกอบกราฟmกโดยกZาหนดตZาแหนLงและขนาดตาม รVปแบบการจ)ดวางผ)ง ท;กZาหนดโดยอ5อบเจกต#ประเภท LayoutManager โดยอ)ตโนม)ตซxงจะกลLาวถxงในห)วขUอตLอไป 5.2.1 คลาส Frame คลาส Frame เปyนคลาสท;สบทอดมาจากคลาสท;ชอ Window ซxงจ)ดวLาเปyนคลาสประเภท Container แบบ หนxง โดยอ5อบเจกต#ของคลาส Frame จะประกอบดUวย title bar, resizable corner, icon และ menu bar ด)งแสดงใน ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 125
  • 137. รVปท; 5.4 โปรแกรม GUI สZาหร)บโปรแกรมจาวาประยJกต#จะเรมตUนดUวยการสรUางอ5อบเจกต#ของคลาส Frame อยLางนUอย หนxงอ5อบเจกต# ซxงคลาส Frame จะม;รVปแบบของ constructor ท;สZาค)ญด)งน;Y • public Frame() • public Frame(String title) โดยท; title คอขUอความท;ตUองการจะแสดงตรง title bar ของ Frame รปท 5.4 รปแบบของ Frame โดยท)วไปคลาส Frame จะม;ขนาดเรมตUนเปyน (0, 0) ด)งน)นจxงจZาเปyนจะตUองกZาหนดขนาดของอ5อบเจกต#ของ Y Frame โดยใชUเมธอด setSize() นอกจากน;คลาส Frame จะถVกกZาหนดใหUไมLสามารถมองเห5นไดUในตอนเรมตUน Y ด)งน)นจxงตUองม;การเร;ยกใชUเมธอด setVisible(true) เพอกZาหนดใหUอ5อบเจกต#ของคลาส Frame สามารถมองเห5น Y ไดU อ5อบเจกต#ของคลาส Frame สามารถท;จะปร)บขนาดไดUโดยการลากเมาส#ปร)บขนาดของเฟรมซxงคลาส Frame จะม;เมธอดท;เก;ยวขUองก)บการปร)บขนาดของเฟรมด)งน;Y • public boolean isResizable() เปyนเมธอดเพอตรวจสอบวLาอ5อบเจกต#ของคลาส Frame น;สามารถปร)บขนาดไดUหรอไมL Y • public void setResizable(boolean canResize) เปyนเมธอดเพอกZาหนดใหUอ5อบเจกต#ของคลาส Frame น;Y สามารถปร)บขนาดไดUหรอไมL โปรแกรมท; 5.1 แสดงต)วอยLางการสรUางอ5อบเจกต#ของคลาส Frame ท;ชอ fr และกZาหนดใหU fr ม;ขนาดเรม ตUนเปyน 200x150 พกเซล โดยกZาหนดไวUในคZาส)ง fr.setSize(200,150); สLวนคZาส)ง fr.setVisible(true); เปyนคZาส)งเพอท;จะทZาใหUสามารถมองเห5นอ5อบเจกต# fr ไดU โปรแกรมน;YจะใหUผลล)พธ#ด)ง แสดงในรVปท; 5.5 126 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
  • 138. โปรแกรมท 5.1 คลาส FrameSample import java.awt.*; public class FrameSample { private Frame fr; public void init() { fr = new Frame("Frame Sample"); fr.setSize(200,150); fr.setVisible(true); } public static void main(String args[]) { FrameSample obj = new FrameSample(); obj.init(); } } รปท 5.5 ผลลพธทได*จากการรนโปรแกรมท 5.1 5.2.2 คลาส Panel คลาส Panel จะเปyนคลาสประเภท Container เชLนเด;ยวก)บคลาส Frame แตL Panel จะแตกตLางจาก Frame ตรงท; Panel จะไมLม; tile bar และไมLม; resizable corner คลาส Panel จะม; subclass ท;ชอ Applet เพอใชUในการ เข;ยนโปรแกรมจาวาแอปเพล5ต ซxงทZาใหUเราสามารถใสLสLวนประกอบกราฟmกลงในโปรแกรมจาวาแอปเพล5ตไดU โปรแกรมจาวาประยJกต#ไมLสามารถท;จะสรUางโปรแกรม GUI โดยเรมตUนจากการสรUางอ5อบเจกต#ของคลาส Panel ไดU โดยตรง ท)Yงน;Yเนองจากโปรแกรม GUI ตUองม;การสรUาง Frame ขxYนมากLอน คลาส Panel สามารถท;จะใสLลงไปใน Frame ไดUจxงทZาใหUเราสามารถท;จะสรUางโปรแกรม GUI ท;ม;การวางผ)ง ท;ซ)บซUอนขxนไดU โดยการใสLอ5อบเจกต#ของคลาสท;เปyนสLวนประกอบกราฟmกตLางๆ ลงในอ5อบเจกต#ของคลาส Panel Y กLอน แลUวจxงนZาอ5อบเจกต#ของคลาส Panel ใสLลงในอ5อบเจกต#ของคลาสประเภท Container อ;กช)Yนหนxง ท)Yงน;Yเรา ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 127
  • 139. สามารถท;จะกZาหนดใหU อ5อบเจกต#ของคลาส Panel แตLละต)วสามารถม;ต)วจ)ดวางผ)งท;ตLางก)นไดU และเราย)งสามารถท; จะใสL อ5อบเจกต#ของคลาส Panel ลงไปในอ5อบเจกต#ของคลาส Panel ต)วอนอ;กท;หนxงก5ไดU 5.2.3 คลาส Dialog คลาส Dialog เปyนคลาสท;สบทอดมาจากคลาส Window เพอใชUเปyนอนพJตและเอาต#พJตก)บผVUใชU คลาส Dialog จะทZางานอยVLภายใตUอ5อบเจกต#ของคลาส Frame ท)Yงน;การสรUางอ5อบเจกต#ของคลาส Dialog จะตUองระบJ Y อ5อบเจกต#ของคลาส Frame ท;คVLก)นซxงเร;ยกวLาเฟรมแมL (parent frame) อ5อบเจกต#ของคลาส Dialog อาจม;โหมดการ ทZางานแบบ modal ซxงผVUใชUตUองปmดอ5อบเจกต#ของคลาส Dialog กLอนจxงจะกล)บมาทZางานในเฟรมแมLท;คVLก)นไดU คลาส Dialog ม;รVปแบบของ constructor ท;สZาค)ญด)งน;Y • public Dialog(Frame parent) • public Dialog(Frame parent,String title) • public Dialog(Frame parent, boolean isModal) • public Dialog(Frame parent, String title, boolean isModal) โดยท; • parent คออ5อบเจกต#ของคลาส Frame ท;เปyนเฟรมแมL • title คอขUอความท;ตUองการจะแสดงตรง title bar ของ Dialog • isModal คอขUอมVลชนด boolean เพอระบJวLาอ5อบเจกต#ของ Dialog ม;โหมดเปyน modal หรอไมL นอกจากน;Y Java API ไดUกZาหนดใหUม;คลาสท;สบทอดมาจากคลาส Dialog อนๆ อ;กอาทเชLน คลาส FileDialog ซxงจะใชUในการระบJชอไฟล#ท;ตUองการใชUงานในโปรแกรม 5.2.4 คลาส JFrame แพคเก5จ Swing ม;คลาสประเภท Container ท;แตกตLางจากคลาสประเภท Container ของแพคเก5จ AWT คอ JFrame, JDialog, JPanel และ JApplet ด)งรVปท; 5.6 โดยท)วไปโปรแกรม GUI ท;เปyนโปรแกรมจาวา ประยJกต#จะใชU Container ท;เปyนอ5อบเจกต#ของคลาส JFrame คลาส JFrame จะสบทอดมาจากคลาส Frame โดยม; constructor ท;สZาค)ญด)งน;Y • public JFrame() • public JFrame(String title) 128 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
  • 140. รปท 5.6 คลาสชนด Container ของแพคเก-จ Swing อ5อบเจกต#ของคลาส JFrame จะแตกตLางก)บ Frame ตรงท;จะม;หนUาตLาง (Pane) อยVL 4 หนUาตLางด)งแสดงในรVป ท; 5.7 คอ • root pane • layer pane • glass pane • content pane เราไมLสามารถท;จะใสLสLวนประกอบกราฟmกลงใน JFrame ไดUโดยตรง แตLจะตUองใสLลงในหนUาตLางท;เปyน content pane แทน ท)Yงน;หนUาตLางด)งกลLาวเปyนอ5อบเจกต#ของคลาสประเภท Container แบบหนxง เราสามารถท;จะ Y เร;ยกอ5อบเจกต#ของคลาสประเภท Container ด)งกลLาวมาไดUโดยใชUเมธอดท;ชอ getContentPane() และสามารถ ท;จะใสLสLวนประกอบกราฟmกลงในอ5อบเจกต#ด)งกลLาวไดUโดยใชUเมธอด add() ด)งต)วอยLางเชLน JFrame fr = new JFrame(); JButton bn1 = new JButton("Submit"); Container content = fr.getContentPane(); content.add(bn1); ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 129
  • 141. รปท 5.7 หนาตางทอยในคลาส JFrame โปรแกรม Java SE 5 ไดUกZาหนดใหUเราสามารถท;จะใสLสLวนประกอบกราฟmกลงใน JFrame ไดUโดยตรง โดย การกZาหนดใหUคZาส)ง add() และ setLayout() ใน JFrame จะเปyนการสLงคZาส)งไปย)ง content pane โดยอ)ตโนม)ต ด)งน)นเราจxงสามารถท;จะเข;ยนคZาส)งขUางบนใหมLไดUเปyน Y JFrame fr = new JFrame(); JButton bn1 = new JButton("Submit"); fr.add(bn1); นอกจากน;คลาส JFrame ย)งม;เมธอดท;จะถVกเร;ยกใชงาน เมอมการปด Jframe ด)งน;Y Y • public void setDefaultCloseOperation(int operation) โดยเราสามารถกZาหนดคLาของ operation ไดUท)Yงหมด 4 คLาด)งน;Y • DO_NOTHING_ON_CLOSE (ถVกกZาหนดในอนเตอร#เฟส WindowConstants): จะไมLทZาอะไร โดยใหUไปเร;ยกใชUเมธอด windowClosing ของอ5อบเจกต# WindowListener ท;ม;การลง ทะเบ;ยนไวUแลUวแทน • HIDE_ON_CLOSE (ถVกกZาหนดในอนเตอร#เฟส WindowConstants): จะทZาการซLอน JFrame หล)งจากเร;ยกใชUอ5อบเจกต#ของ WindowListener ท;ม;การลงทะเบ;ยนไวUแลUว • DISPOSE_ON_CLOSE (ถVกกZาหนดในอนเตอร#เฟส WindowConstants): จะทZาการซLอนและทZาลาย JFrame หล)งจากเร;ยกใชUอ5อบเจกต#ของ WindowListener ท;ม;การลงทะเบ;ยน ไวUแลUว • EXIT_ON_CLOSE (ถVกกZาหนดในคลาส JFrame): จะม;การเร;ยกใชUเมธอด exit ของคลาส System 130 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
  • 142. โดยคLาของ operation จะม;คLาเรมตUนเปyน HIDE_ON_CLOSE โปรแกรมท; 5.2 แสดงต)วอยLางการสรUางอ5อบเจกต#ของคลาส JFrame ท;ชอ fr โดยใชUคZาส)ง fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); เพอใหUม;การเร;ยกใชUเมธอด exit ของคลาส System เมอม;การปmด Jframe และกZาหนดใหU fr ม;ขนาดเรมตUนเปyน 200x150 พกเซล โดยกZาหนดไวUในคZาส)ง fr.setSize(200,150); สLวนคZาส)ง fr.setVisible(true); เปyนคZาส)งเพอท;จะทZาใหUสามารถมองเห5น อ5อบเจกต# fr ไดU โปรแกรมน;YจะใหUผลล)พธ#ด)งแสดงในรVปท; 5.8 5.3 การจดวางผงของส0วนประกอบกราฟ3ก โปรแกรม GUI ของภาษาจาวาจะจ)ดวางสLวนประกอบกราฟmกตLางๆ ลงในอ5อบเจกต#ของคลาสประเภท Container โดยอ)ตโนม)ต ท)Yงน;จะกZาหนดขนาดและตZาแหนLงของสLวนประกอบกราฟmกไดUโดยใชUอ5อบเจกต#ของคลาส Y ประเภท LayoutManager ซxง LayoutManager เปyนอนเตอร#เฟสท;ใช)ในการกZาหนดวธ;การจ)ดวางผ)งสLวนประกอบ กราฟmก ภาษาจาวาไดUกZาหนดใหUมคลาสท; implements อนเตอร#เฟสท;ชอ LayoutManager เพอใชUเปyนต)วจ)ดวางผ)ง ; ของสLวนประกอบกราฟmกท)Yงหมดของคลาสคอ 1. BorderLayout 2. FlowLayout 3. GridLayout 4. CardLayout 5. GridBagLayout โปรแกรมท 5.2 คลาส JFrameSample import javax.swing.JFrame; public class JFrameSample { private JFrame fr; public void init() { fr = new JFrame("JFrame Sample"); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); fr.setSize(200, 150); fr.setVisible(true); } public static void main(String args[]) { JFrameSample obj = new JFrameSample(); obj.init(); } } ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 131
  • 143. รปท 5.8 ผลลพธทได*จากการรนโปรแกรมท 5.2 การกZาหนดวธ;การวางผ)งของอ5อบเจกต#ของคลาสประเภท Container จะทZาไดUโดยการสรUางอ5อบเจกต# ประเภท LayoutManager ของคลาสใดคลาสหนxงในหUาคลาสขUางตUน จากน)นเราสามารถท;จะกZาหนดการวางผ)งโดย Y การเร;ยกใชUเมธอด setLayout()ของคลาสประเภท Container โดยสLงผLาน argument ท;เปyนอ5อบเจกต#ประเภท LayoutManager ท;สรUางขxYนมา ต)วอยLางเชLนคZาส)ง JFrame fr = new JFrame(“Demo”); FlowLayout fl = new FlowLayout(); fr.setLayout(fl); เปyนการกZาหนดใหUอ5อบเจกต#ของคลาส JFrame ท;ชอ fr ซxงม;วธ;การจ)ดวางผ)งในรVปแบบของ FlowLayout เนองจากคZาส)งในต)วอยLางขUางตUนจะไมLม;การนZาอ5อบเจกต# fl ซxงเปyนอ5อบเจกต#ของคลาส FlowLayout ไปอUางองในคZา ส)งอนๆ ด)งน)นเราจxงสามารถท;จะเข;ยนคZาส)งในการสรUางอ5อบเจกต#และคZาส)งกZาหนดรVปแบบการวางผ)งภายในคZาส)ง Y เด;ยวก)นไดUด)งน;Y fr.setLayout(new FlowLayout()); โดยท)วไปคลาสประเภท Container แตLละชนด จะม;การกZาหนดวธ;การวางผ)งของอ5อบเจกต#ของคลาสแตLละ ชนดไวUเรมตUนอยVLแลUวด)งน;Y • คลาส JWindow, JFrame และ JDialog จะกZาหนดใหUเปyน BorderLayout • คลาส JPanel และ JApplet จะกZาหนดใหUเปyน FlowLayout 5.3.1 BorderLayout BorderLayout เปyนการจ)ดวางผ)งท;กZาหนดใหUสามารถวางอ5อบเจกต#ของคลาสท;เปyนสLวนประกอบกราฟmกไดU 5 อ5อบเจกต#ตามตZาแหนLงทศตLางๆ ของอ5อบเจกต#ประเภท Container 5 ตZาแหนLงคอ ทศเหนอ (NORTH) ทศใตU 132 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
  • 144. (SOUTH) ทศตะว)นออก (EAST) ทศตะว)นตก (WEST) และตรงกลาง (CENTER) ซxงอ5อบเจกต#ท;เปyนสLวน ประกอบกราฟmกจะถVกใสLในตZาแหนLงทศตLางๆ โดยจะม;การกZาหนดขนาดใหUโดยอ)ตโนม)ต โปรแกรมท; 5.3 แสดงต)วอยLางโปรแกรม GUI ท;ประกอบไปดUวยปJšม 5 ปJšม โดยไดUสรUางอ5อบเจกต#ของคลาส JButton ขxYนมา 5 อ5อบเจกต#ซxงม;ชอเปyน bn1 จนถxง bn5 และม;ขอความบนปJšมเปyน B1 จนถxง B5 ตามลZาด)บ จากน)นไดU U Y ใสLอ5อบเจกต#ชนด JButton แตLละต)วลงไปในอ5อบเจกต#ชนด JFrame ท;ชอ fr โดยใชUเมธอด add() ตามตZาแหนLง ทศตLางๆ โดยท; อ5อบเจกต# bn1 จะอยVLทางทศเหนอ อ5อบเจกต# bn2 จะอยVLทางทศใตU อ5อบเจกต# bn3 จะอยVLทางทศตะว)น ออก อ5อบเจกต# bn4 จะอยVLทางทศตะว)นตก และอ5อบเจกต# bn5 จะอยVLตรงกลาง ซxงโปรแกรมน;จะใหUผลล)พธ#ด)งแสดงใน Y รVปท; 5.9 การใชUเมธอด add() ในกรณ;ท;อ5อบเจกต#ประเภท Container ม;การจ)ดวางผ)งแบบ BorderLayout น)น จะ Y ตUองม; argument เพอระบJตZาแหนLงทศท;ตUองการวางอ5อบเจกต#ท;เปyนสLวนประกอบกราฟmกอาทเชLน คZาส)ง fr.add(bn1,BorberLayout.NORTH); เปyนคZาส)งท;ใชUในการใสLอ5อบเจกต# bn1 ลงใน Jframe ในตZาแหนLงทศเหนอ กรณ;ท;เร;ยกใชUเมธอด add() โดยไมLสLงผLาน argument เพอระบJตZาแหนLงทศท;ตUองการวางอ5อบเจกต#ท;เปyนสLวน ประกอบกราฟmกน)น ภาษาจาวาจะถอวLาเปyนการกZาหนดใหUใสLสLวนประกอบกราฟmกไวUตZาแหนLงตรงกลางของอ5อบเจกต# Y ของคลาสประเภท Container อาทเชLน คZาส)ง fr.add(bn1); จะถอวLาเปyนคZาส)งเชLนเด;ยวก)บคZาส)ง fr.add(bn1,BorderLayout.CENTER); ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 133
  • 145. โปรแกรมท 5.3 ต)วอยLางการใชUต)วจ)ดวางผ)งแบบ BorderLayout import java.awt.BorderLayout; import java.awt.Container; import javax.swing.JButton; import javax.swing.JFrame; public class BorderLayoutSample { private JFrame fr; private JButton bn1, bn2, bn3, bn4, bn5; public void init() { fr = new JFrame("Button Sample"); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); bn1 = new JButton("B1"); bn2 = new JButton("B2"); bn3 = new JButton("B3"); bn4 = new JButton("B4"); bn5 = new JButton("B5"); fr.add(bn1, BorderLayout.NORTH); fr.add(bn2, BorderLayout.SOUTH); fr.add(bn3, BorderLayout.EAST); fr.add(bn4, BorderLayout.WEST); fr.add(bn5); fr.setSize(200, 150); fr.setVisible(true); } public static void main(String args[]) { BorderLayoutSample obj = new BorderLayoutSample(); obj.init(); } } รปท 5.9 ผลลพธทได*จากการรนโปรแกรมท 5.3 134 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
  • 146. การปร)บขนาดของอ5อบเจกต#ของคลาสประเภท Container จะม;ผลทZาใหUขนาดของอ5อบเจกต#ของสLวน ประกอบกราฟmก เปล;ยนแปลงไปตามขนาดของอ5อบเจกต#ของคลาสประเภท Container ด)งน;Y • อ5อบเจกต#ของสLวนประกอบกราฟmกท;อยVLตZาแหนLงทศเหนอ ใตU และตรงกลาง จะปร)บขนาดตามขนาดของ อ5อบเจกต#ของคลาสประเภท Container ตามแนวนอน ด)งแสดงในรVปท; 5.10 (ก) • อ5อบเจกต#ของสLวนประกอบกราฟmกท;อยVLตZาแหนLงทศตะว)นออก ตะว)นตก และตรงกลางจะปร)บขนาดตาม ขนาดของอ5อบเจกต#ของคลาสประเภท Container ตามแนวต)Yง ด)งแสดงในรVปท; 5.10 (ข) (ก) แนวนอน (ข) แนวตง รปท 5.10 ขนาดของอ-อบเจกตทถกปรบ 5.3.2 FlowLayout FlowLayout เปyนการจ)ดวางผ)งสLวนประกอบกราฟmกไวUตZาแหนLงบนสJดของอ5อบเจกต#ของคลาสประเภท Container โดยจะเร;ยงอ5อบเจกต#ของคลาสท;เปyนสLวนประกอบกราฟmกจากซUายไปขวา และถUาความกวUางของอ5อบเจกต# ของคลาสประเภท Container ในแตLละแถวไมLพอ ต)วจ)ดวางผ)งแบบ FlowLayout จะนZาอ5อบเจกต#ของคลาสท;เปyน สLวนประกอบท;เหลอวางในตZาแหนLงถ)ดไปดUานลLาง การจ)ดวางผ)งแบบ FlowLayout จะปร)บขนาดของอ5อบเจกต#ของ คลาสท;เปyนสLวนประกอบกราฟmกตLางๆ ตามความเหมาะสม ท)Yงน;ขนอยVLก)บขUอกZาหนดตLางๆ อาทเชLน ขนาดของอ5อบเจกต# Y xY ของคลาส JButton จะม;ขนาดตามขนาดของขUอความบนปJšม เปyนตUน โปรแกรมท; 5.4 แสดงต)วอยLางโปรแกรม GUI ท;สรUางอ5อบเจกต#ของคลาส JFrame ขxนมา แลUวกZาหนดใหUม; Y การจ)ดวางผ)งแบบ FlowLayout โดยใชUคZาส)ง fr.setLayout(new FlowLayout()); ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 135
  • 147. โปรแกรมท 5.4 ต)วอยLางการใชUต)วจ)ดวางผ)งแบบ FlowLayout import java.awt.*; import javax.swing.*; public class FlowLayoutSample { private JFrame fr; private JButton bn1, bn2, bn3; public void init() { fr = new JFrame("Button Sample"); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); fr.setLayout(new FlowLayout()); bn1 = new JButton("Submit"); bn2 = new JButton("Cancel"); bn3 = new JButton("Exit"); fr.add(bn1); fr.add(bn2); fr.add(bn3); fr.setSize(200, 150); fr.setVisible(true); } public static void main(String args[]) { FlowLayoutSample obj = new FlowLayoutSample(); obj.init(); } } โปรแกรม GUI น;จะม;อ5อบเจกต#ของคลาส JButton อยVLสามอ5อบเจกต# โดยกZาหนดใหUม;ขUอความเปyน Submit, Y Cancel และ Exit จากน)นโปรแกรมไดUใสLอ5อบเจกต#ของคลาส JButton แตLละต)วลงในอ5อบเจกต#ของคลาส JFrame Y ซxงจะไดUโปรแกรม GUI ท;ม;ปJšมสามปJšมเร;ยงจากซUายไปขวาด)งรVปท; 5.11 (ก) และในกรณ;ท; JFrame ขนาดแคบลงปJšม บางปJšมก5จะลงมาอยVLในตZาแหนLงถ)ดไปด)งรVปท; 5.11 (ข) (ก) (ข) รปท 5.11 ผลลพธทได*จากการรนโปรแกรมท5.4 136 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
  • 148. 5.3.3 GridLayout GridLayout เปyนการจ)ดวางผ)งท;แบLงอ5อบเจกต#ของคลาสประเภท Container เปyนชLองยLอยๆ หลายชLอง โดย แตLละชLองยLอยจะม;ขนาดความกวUางและความสVงเทLาก)น GridLayout จะอนJญาตใหUใสLอ5อบเจกต#ของคลาสท;เปyนสLวน ประกอบกราฟmกไดUหนxงอ5อบเจกต# ในแตLละชLองยLอย โดยจะกZาหนดใหUขนาดของอ5อบเจกต#ของคลาสท;เปyนสLวน ประกอบกราฟmกม;ขนาดเทLาก)บขนาดของชLองยLอย การสรUางต)วจ)ดวางผ)งแบบ GridLayout ทZาไดUโดยการสรUาง อ5อบเจกต#ของคลาส GridLayout ท;ม;รVปแบบของ constructor เปyนด)งน;Y public GridLayout(int row, int col) โดยท; row และ col คอจZานวนแถวและคอล)มน#ท;ตUองการแบLงอ5อบเจกต#ของคลาสประเภท Container ใหU เปyนชLองยLอย การใสLอ5อบเจกต#ของคลาสท;เปyนสLวนประกอบกราฟmกลงในชLองยLอย จะทZาไดUโดยการเร;ยกใชUเมธอด add() เชLนเด;ยวก)น แตLในกรณ;นโปรแกรม GUI จะใสLอ5อบเจกต#จากชLองยLอยบนสJดเร;ยงจากซUายไปขวา โดยไมLสามารถท;จะ ;Y ขUามชLองยLอยใดชLองยLอยหนxงไดU โปรแกรมท( 5.5 ต)วอยางการใชต)วจ)ดวางผ)งแบบ GridLayout import java.awt.*; import javax.swing.*; public class GridLayoutSample { private JFrame fr; private JButton bn1, bn2, bn3, bn4, bn5; public void init() { fr = new JFrame("Button Sample"); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); bn1 = new JButton("B1"); bn2 = new JButton("B2"); bn3 = new JButton("B3"); bn4 = new JButton("B4"); bn5 = new JButton("B5"); fr.setLayout(new GridLayout(3, 2)); fr.add(bn1, BorderLayout.NORTH); fr.add(bn2, BorderLayout.SOUTH); fr.add(bn3, BorderLayout.EAST); fr.add(bn4, BorderLayout.WEST); fr.add(bn5, BorderLayout.CENTER); fr.setSize(200, 150); fr.setVisible(true); } public static void main(String args[]) { GridLayoutSample obj = new GridLayoutSample(); obj.init(); } } ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 137
  • 149. รปท 5.12 ผลลพธทได*จากการรนโปรแกรมท 5.5 5.4 ส0วนประกอบกราฟ3กในแพคเก-จ Swing แพคเก5จ AWT ม;คลาสท;เปyนสLวนประกอบกราฟmกท;สZาค)ญด)งน;Y • Button เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เปyนปJšม • Label เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;ม;ไวUในการแสดงขUอความ • TextField เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#เพอใหUผVUใชUป‚อนขUอความไดUสVงสJดหนxงบรรท)ด • TextArea เปyนท;ทZาหนUาท;คลUายก)บ TextField แตLจะม;หลายบรรท)ด • Checkbox เปyนคลาสท;ทZาหนUาท;คลUายก)บปJšมโดยใชUสวทซ# “ on-off” • Choice เปyนคลาสท;ผVUใชUสามารถเลอกรายการจากท;กZาหนดมาใหUไดU • List เปyนคลาสท;จะทZาหนUาท;คลUาย Choice แตLจะแสดงรายการไดUหลายแถวพรUอมๆ ก)น • Scollbar เปyนคลาสท;ทZาหนUาท;เปyนแถบควบคJมเพอใหUผVUใชUสามารถเลอนไปย)งตZาแหนLงท;ตUองการไดU • Canvas เปyนคลาสท;เปyนพYนท;วางเปลLาเพอใชUในการวาดรVปกราฟmกลงไป L สZาหร)บคลาสท;เปyนสLวนประกอบกราฟmกของแพคเก5จ Swing ทJกคลาสจะสบทอดมาจากคลาส JComponent ด)งแสดงในรVปท; 5.13 โดยคลาส JComponent จะสบทอดมาจากคลาส Container ในแพคเก5จ AWT อ;กตLอหนxง 138 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
  • 150. รปท 5.13 คลาสต%างๆ ทส0บทอดมาจากคลาส Jcomponent แพคเก5จ Swing จะม;คลาสท;เปyนสLวนประกอบกราฟmกท;สอดคลUองก)บคลาสในแพคเก5จ AWT โดยคลาสเหลLา น;Yจะม;ชอขxนตUนดUวยต)วอ)กษร ‘J’ โดยม;คลาสท;สZาค)ญด)งน;Y Y • JButton เปyนคลาสท;ทZาหนUาท;เปyนปJšมในแพคเก5จ Swing • JLabel เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;ไวUในการแสดงขUอความในแพคเก5จ Swing • JTextField เปyนคลาสท;ใชUในการป‚อนขUอความหนxงบรรท)ดในแพคเก5จ Swing • JTextArea เปyนคลาสท;ใชUในการป‚อนขUอความหลายบรรท)ดในแพคเก5จ Swing • JScrollBar เปyนคลาสท;ทZาหนUาท;เปyนแถบควบคJมเพอใหUผVUใชUเลอนไปย)งตZาแหนLงท;ตUองการไดUในแพคเก5จ Swing • JCheckBox เปyนคลาสท;ทZาหนUาท;คลUายปJšมในแพคเก5จ Swing • JChoice เปyนคลาสท;ผVUใชUสามารถเลอกรายการไดUในแพคเก5จ Swing การเข;ยนโปรแกรม GUI โดยมากจะใชUสLวนประกอบกราฟฟmคของแพคเก5จ Swing ท;ม; Look and Feel ท;ด; กวLาของแพคเก5จ AWT รVปท; 5.14 แสดงต)วอยLางสLวนประกอบกราฟฟmคของแพคเก5จ Swing บางคลาส ซxงเนYอหาใน ห)วขUอยLอยตLอไปจะอธบายการใชUงานของคลาสท;สZาค)ญบางคลาส ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 139
  • 151. รปท 5.14 ตวอยาง Look and Feel คลาสทเป5นส%วนประกอบกราฟ9กในแพคเกจ Swing 5.4.1 คลาส JButton เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;แสดงเปyนปJšม โดยจะม;ขอความ (text) ปรากฎอยVLบนปJšม ผVUใชU JButton U สามารถใชUอJปกรณ#อนพJตเชLนเมาส#หรอค;ย#บอร#ดกดเลอกปJšมไดU JButton เปyนคลาสท;สบทอดมาจากคลาส JComponent เราสามารถท;จะสรUางอ5อบเจกต#ของคลาส JButton โดยเร;ยกใชU constructor ของคลาส JButton ท;ม; รVปแบบด)งน;Y • public JButton() • public JButton(String text) • public Jbutton(Icon icon) • public JButton(String text, Icon icon) โดยท; • text คอขUอความท;จะปรากฏอยVLบนปJšม • Icon คอไอคอนท;ตUองการแสดง 140 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
  • 152. คลาส Button ย)งม;เมธอดอนๆ ท;สZาค)ญในการจ)ดการก)บขUอความด)งน;Y • public void setText(String text) เปyนเมธอดท;ใชUในการกZาหนดหรอเปล;ยนขUอความของปJšม • public String getText() เปyนเมธอดท;ใชUในการเร;ยกดVขUอความของปJšม • public void setMnemonic(char c) หรอ void setMnemonic(int i) เปyนเมธอดในการกZาหนดค;ย#ท;เปyน shortcut ใหUก)บอ5อบเจกต#ของคลาส JButton • public void setIcon(Icon c) เปyนเมธอดในการใสLไอคอน (icon) ลงในอ5อบเจกต#ของคลาส JButton นอกจากน;เY ราย)งสามารถเร;ยกใชUเมธอดของคลาส JComponent ซxงเปyน superclass ของ JButton ท;ม;เมธอดท; เพมล)กษณะตLางๆ ใหUก)บอ5อบเจกต#ท;เปyนสLวนประกอบกราฟmก อาทเชLน • public void setBorder(Border bd) เปyนเมธอดสZาหร)บกZาหนดขอบใหUก)บสLวนประกอบกราฟmก • public void setToolTipText(String text) เปyนเมธอดสZาหร)บกZาหนดขUอความท;จะแสดงเปyน tooltip ใหUก)บสLวนประกอบกราฟmก ต)วอยLางการสรUางอ5อบเจกต#ของคลาส JButton ท;แสดงขUอความ ค;ย#ท;เปyน shortcut และ tooltip สามารถ กZาหนดไดUตามคZาส)งด)งน;Y JButton b1 = new JButton("Demo button"); b1.setMnemonic(KeyEvent.VK_D); b1.setToolTipText("Click this button "); 5.4.2 คลาส JLabel JLabel เปyนคลาสท;ใชUสรUางอ5อบเจกต#ท;เปyนสLวนประกอบกราฟmกท;ใชUในการแสดงขUอความ โดยท;คลาส JLabel ม; constructor ท;สZาค)ญด)งน;Y • public JLabel(String text) • public JLabel(String text, int align) • public Jlabel(Icon icon) • public Jlabel(Icon icon, int align) • public JLabel(String text, Icon icon) โดยท; • text คอขUอความท;ตUองการแสดง • align คอการกZาหนดการวางแนว(ชดซUาย ขวา หรอตรงกลาง) ของขUอความ ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 141
  • 153. • Icon คอไอคอนท;ตUองการแสดง คลาส JLabel ย)งม;เมธอดอนๆในการจ)ดการและกZาหนด Look and Feel ของอ5อบเจกต#เชLนเด;ยวก)บ JButton ซxงคZาส)งเหลLาน;สามารถหาไดUจาก Java API หรอเร;ยกดVจากคZาส)งในโปรแกรม IDE เชLน NetBeans Y โปรแกรมท; 5.6 แสดงต)วอยLางการสรUางอ5อบเจกต#ชนด JLabel ขxนมาสามอ5อบเจกต#โดยแตLละอ5อบเจกต#จะใชU Y คZาส)ง constructor ท;แตกตLางก)น และจะม;ไอคอนประกอบขUอความในอ5อบเจกต#ชอ label1 และ label3 โดยไอคอนจะ สรUางมาจากไฟล#ท;ชอ testImg.jpg ท;เก5บอยVLในไดเร5กทอร;ท;ชอ images ซxงอยVLภายในไดเร5กทอร;เด;ยวก)บไฟล#ท;ชอ JLabelDemo.class โปรแกรมน;จะทZาการโหลดไฟล#ด)งกลLาวมาไสLในอ5อบเจกต#ท;ชอ icon โดยม;คZาส)งด)งน;Y Y URL imageURL = JLabelDemo.class.getResource("images/testImg.jpg"); if (imageURL != null) { icon = new ImageIcon(imageURL); } โปรแกรมน;จะใหUผลล)พธ#ด)งรVปท; 5.15 Y โปรแกรมท( 5.6 ต)วอยางการสรางอ9อบเจกตชนด JLabel import java.awt.*; import java.net.URL; import javax.swing.*; public class JLabelDemo { private JFrame fr; private JLabel label1, label2, label3; public void init() { ImageIcon icon = null; fr = new JFrame("JLabel Sample"); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); URL imageURL = JLabelDemo.class.getResource("images/testImg.jpg"); if (imageURL != null) { icon = new ImageIcon(imageURL); } fr.setLayout(new GridLayout(3, 1)); //Create the first label. label1 = new JLabel("Image and Text", icon, JLabel.CENTER); //Set the position of its text, relative to its icon: label1.setVerticalTextPosition(JLabel.BOTTOM); label1.setHorizontalTextPosition(JLabel.CENTER); 142 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
  • 154. //Create the other labels. label2 = new JLabel("Text-Only Label"); label3 = new JLabel(icon); //Create tool tips, for the heck of it. label1.setToolTipText("A label containing both image and text"); label2.setToolTipText("A label containing only text"); label3.setToolTipText("A label containing only an image"); //Add the labels. fr.add(label1); fr.add(label2); fr.add(label3) fr.pack(); fr.setVisible(true); } public static void main(String args[]) { JLabelDemo obj = new JLabelDemo(); obj.init(); } } รปท 5.15 ผลลพธทได*จากการรนโปรแกรมท 5.6 ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 143
  • 155. 5.4.3 คลาส JTextField JTextFieldคอคลาสท;ใชUในการสรUางอ5อบเจกต#เพอใหUผใชUป‚อนขUอความหนxงบรรท)ด โดยท;คลาส VU JTextField ม; constructor ท;สZาค)ญด)งน;Y • public JTextField() • public JTextField(int col) • public JTextField(String text) • public JTextField(String text, int col) โดยท; • text คอขUอความเรมตUนท;ตUองการแสดง • col คอจZานวนคอล)มน#ท;ตUองการแสดง คลาส JTextField ม;เมธอดท;สZาค)ญด)งน;Y • public int getColumns() • public String getText() • public boolean isEditable() • public void select(int selectionStart, int selectionEnd) • public void selectAll() • public void setEditable(boolean b) • public void setText(String t) • public void setColumn(int column) เมธอด setText() ใชUในการกZาหนดหรอเปล;ยนขUอความของอ5อบเจกต#ชนด JTextFiled ในกรณ;ท;เรา ตUองการกZาหนดใหU JTextField สามารถอLานขUอความไดUอยLางเด;ยว เราสามารถทZาไดUโดยเร;ยกใชUเมธอด setEditable(boolean b) โดยกZาหนดใหU argument ม;คLาเปyน false สLวนเมธอด select()ใชUในการเลอก ขUอความใน JTextField โปรแกรมท; 5.7 แสดงต)วอยLางการสรUางเฟรมท;ม;อ5อบเจกต#ของคลาส Label และ TextField แสดงอยVL โป แกรมน;จะกZาหนดใหUอ5อบเจกต# fr ของคลาส JFrame ม;การจ)ดวางผ)งแบบ FlowLayout ผลล)พธ#ของโปรแกรมน;เY ปyน Y ด)งแสดงในรVปท; 5.12 144 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
  • 156. โปรแกรมท 5.7 ต)วอยLางการสรUางอ5อบเจกต# JTextField import java.awt.*; import javax.swing.*; public class JTextFieldDemo { private JFrame fr; private JLabel l; private JTextField tf; public void init() { fr = new JFrame("JTextField Demo"); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); l = new JLabel("Name: "); tf = new JTextField("Numnonda", 15); fr.setLayout(new FlowLayout()); fr.add(l); fr.add(tf); fr.pack(); fr.setVisible(true); } public static void main(String args[]) { JTextFieldDemo obj = new JTextFieldDemo(); obj.init(); } } รปท 5.16 ผลลพธทได*จากการรนโปรแกรมท 5.7 5.4.4 คลาส JTextArea JTextArea เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;สามารถป‚อนและแกUไขขUอความไดU JTextArea จะแตก ตLางจาก JTextField ตรงท;จะสามารถกZาหนดจZานวนบรรท)ดไดUหลายบรรท)ด โดยท;คลาส JTextArea ม; constructor ท;สZาค)ญด)งน;Y • public JTextArea() • public JTextArea(String Text) • public JTextArea(String Text, int row, int col) • public JTextArea(int row, int col) ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 145
  • 157. โดยท; • text คอขUอความเรมตUนท;ตUองการแสดง • row และ col คอจZานวนแถวและคอล)มน#ของ TextArea • scrollbar เปyนการกZาหนดการม; scrollbar ของ TextArea คลาส JTextArea จะม;เมธอดท;สZาค)ญด)งน;Y • public int getColumns() • public int getRows() • public String getSelectedText() • public boolean isEditable() • public void select(int selectionStart, int selectionEnd) • public void selectAll() • public void setEditable(boolean b) • public void setText(String t) • public void setColumns(int column) • public void setRows(int rows) ท)Yงน;Yเมธอดท;สZาค)ญท;อยVLในคลาส JTextArea จะคลUายก)บเมธอดของคลาส JTextArea แตLจะเพมเมธอดท; เก;ยวขUองก)บการจ)ดการจZานวนแถวขxนมา อาทเชLน setRow() และ getRow() Y โปรแกรมท; 5.8 แสดงต)วอยLางการสรUาง JFrame ท;ม;อ5อบเจกต#ของคลาส JTextArea โดยโปรแกรมน;จะใหU Y ผลล)พธ#ด)งแสดงในรVปท; 5.8 โปรแกรมท 5.8 ต)วอยLางการสรUางอ5อบเจกต# JTextArea import java.awt.*; import javax.swing.*; public class JTextAreaDemo { private JFrame fr; private JTextArea ta; public void init() { fr = new JFrame("JTextArea Demo"); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ta = new JTextArea("Text Area", 5, 30); JscrollPane jScrollPane = new JScrollPane(ta); fr.setLayout(new FlowLayout()); fr.add(jScrollPane); fr.pack(); fr.setVisible(true); } public static void main(String args[]) { JTextAreaDemo obj = new JTextAreaDemo(); obj.init(); } } 146 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
  • 158. รVปท; 5.17 ผลล)พธ#ท;ไดUจากการร)นโปรแกรมท; 5.8 5.4.5 คลาส JCheckBox และ JRadioButton JCheckBox เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;ทZาหนUาท;คลUายปJšม โดยใหUผVUใชUกดชLองท;เปyนสวทซ#เพอ เลอกหรอไมLเลอกรายการ JCheckBox จะม;ขUอความอยVLขUางๆ เพออธบายความหมายของรายการ JCheckBox ม; constructor ท;สZาค)ญด)งน;Y • public JCheckBox(String label) • public JCheckBox(String label, boolean state) • public JCheckBox(Icon icon) • public JCheckBox(Icon icon, boolean state) • public JCheckBox(String label, Icon icon) • public JCheckBox(String label, Icon icon, boolean state) โดยท; • label คอขUอความท;ตUองการแสดงใน JCheckBox • Icon คอไอคอนท;ตUองการแสดง โดยท; • state เปyนต)วกZาหนดสถานะเรมตUนของ JCheckBox กรณ;ท; constructor ไมLไดUกZาหนดสถานะเรมตUนจะ ถอวLาม;คาเปyน false (ไมLถVกเลอก) L คลาส JCheckBox ม;เมธอดท;สZาค)ญด)งน;Y • public String getLabel() • public Object[] getSelectedObjects() • public void setLabel(String label) • public void setSelected(boolean state) โปรแกรมท; 5.9 แสดงต)วอยLางการใชU JCheckBox โดยโปรแกรมจะสรUางเฟรมท;ม;อ5อบเจกต#ชนด JCheckBox เพอใหUผVUใชUเลอกสามอ5อบเจกต#ด)งแสดงในในรVปท; 5.18 ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 147
  • 159. เราสามารถท;จะสรUางต)วเลอกท;เปyนแบบ Radio Button โดยใชU JRadioButton ในกรณ;น;YจะกZาหนดใหU อ5อบเจกต# JRadioButton หลายต)วอยVในกลJLมเด;ยวก)น โดยอยVLในกลJLมของอ5อบเจกต#ของคลาส ButtonGroup ซxงจะ L ตUองใชUเมธอด add() คลาส ButtonGroup ไมLใชLคลาสท;เปyนสLวนประกอบกราฟmก แตLจะใชUในการสรUางอ5อบเจกต#เพอกZาหนด กลJLมของ AbstractButton โดยม; constructor ด)งน;Y • public ButtonGroup() โปรแกรมท; 5.10 แสดงต)วอยLางของการสรUาง JRadioButton โดยปร)บเปล;ยน JRadioButton ใน โปรแกรมท; 5.9 ใหUอยVLในกลJLมของอ5อบเจกต#ท;ชอ chg โปรแกรมน;จะม;ผลล)พธ#ท;เปyนสLวนตดตLอก)บผVUใชUด)งรVปท; 5.19 Y โปรแกรมท( 5.9 ต)วอยางการสรางอ9อบเจกต JCheckBox import java.awt.FlowLayout; import javax.swing.*; public class JCheckBoxDemo { private JFrame fr; private JCheckBox c1, c2, c3; public void init() { fr = new JFrame("JCheckBox Demo"); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); c1 = new JCheckBox("Visual Basic"); c2 = new JCheckBox("C++", false); c3 = new JCheckBox("Java", true); fr.setLayout(new FlowLayout()); fr.add(c1); fr.add(c2); fr.add(c3); fr.pack(); fr.setVisible(true); } public static void main(String args[]) { JCheckBoxDemo obj = new JCheckBoxDemo(); obj.init(); } } รปท 5.18 ผลลพธทได*จากการรนโปรแกรมท 5.9 148 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
  • 160. โปรแกรมท( 5.10 ต)วอยางของการสรางอ9อบเจกต JRadioButton import java.awt.GridLayout; import javax.swing.*; public class JRadioButtonDemo { private JFrame fr; private JRadioButton c1, c2, c3; private ButtonGroup chg; public void init() { fr = new JFrame("JRadioButton Demo"); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); c1 = new JRadioButton("Visual Basic"); c2 = new JRadioButton("C++", false); c3 = new JRadioButton("Java", true); chg = new ButtonGroup(); chg.add(c1); chg.add(c2); chg.add(c3); fr.setLayout(new GridLayout(3,1)); fr.add(c1); fr.add(c2); fr.add(c3); fr.pack(); fr.setVisible(true); } public static void main(String args[]) { JRadioButtonDemo obj = new JRadioButtonDemo(); obj.init(); } } รปท 5.19 ผลลพธทได*จากการรนโปรแกรมท 5.10 ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 149
  • 161. 5.4.6 คลาส JComboBox JComboBoxเปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เปyนรายการใหUผใชUสามารถเลอกไดUโดย JComboBox จะ VU แสดงรายการปรากฏใหUเห5นเฉพาะรายการท;เลอกเพ;ยงรายการเด;ยว ปกตกLอนท;จะม;การเลอกรายการ JComboBox จะ แสดงรายการแรกท;ม;อยVL และหากม;การคลกเมาส# อ5อบเจกต# JComboBox จะแสดงรายการท)Yงหมดท;ม;อยVL โดยท;คลาส JComboBox ม; constructor ท;สZาค)ญด)งน;Y • public JComboBox() • public JcomboBox([]Object objs) คลาส JComboBox ม;เมธอดตLางๆ ท;สZาค)ญด)งน;Y • public void addItem(Object item) • public void insertItemAt(Object item, int pos) • public Object getItem(int index) • public int getItemCount() • public Object getSelectedIndex() • public Object getSelectedItem() • public void setSelectedIndex(int pos) • public void setSelectedItem(Object item) เราสามารถท;จะใสLรายการลงในอ5อบเจกต# JComboBox ไดUโดยใชUเมธอด addItem(Object item) คลาส JComboBox ย)งม;เมธอด setSelectedIndex(int pos) และ setSelectedItem(Object item) เพอใชUใน การเลอกใหUอ5อบเจกต# JComboBox แสดงรายการท;ตZาแหนLงหรอขUอความท;ตUองการใหUแสดงไดU สLวนเมธอด getSelectedIndex() และ getSelectedItem() ใชUในการแสดงตZาแหนLงหรอขUอความท;ถVกเลอก โปรแกรมท; 5.11 แสดงต)วอยLางเฟรมท;ม;อ5อบเจกต#ชนด JComboBox แสดงอยVL คZาส)ง cb.addItem() ใชUใน การใสLรายการตLางๆ ลงในอ5อบเจกต# cb สLวนคZาส)ง cb.setSelectedItem (“Thailand”) เปyนการกZาหนดใหU อ5อบเจกต# cb เลอกแสดงรายการท;ชอ Thailand โปรแกรมน;YจะใหUผลล)พธ#ท;เปyนสLวนตดตLอก)บผVUใชUด)งรVปแสดงในรVป ท; 5.20 150 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
  • 162. โปรแกรมท( 5.11 ต)วอยางการสรางอ9อบเจกต JComboBox import javax.swing.JComboBox; import javax.swing.JFrame; public class JComboBoxDemo { private JFrame fr; private JComboBox cb; public void init() { fr = new JFrame("JRadioButton Demo"); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); cb = new JComboBox(); cb.addItem("New Zealand"); cb.addItem("Thailand"); cb.addItem("USA"); cb.addItem("Japan"); cb.setSelectedItem("Thailand"); fr.add(cb); fr.pack(); fr.setVisible(true); } public static void main(String args[]) { JComboBoxDemo obj = new JComboBoxDemo(); obj.init(); } } รปท 5.20 ผลลพธทได*จากการรนโปรแกรมท 5.11 5.4.7 คลาส JList JList เปyนคลาสท;ใชUสรUางอ5อบเจกต#ท;เปyนสLวนประกอบกราฟmกเพอใหUผVUใชUสามารถเลอกรายการคลUายก)บ JComboBox แตLจะแตกตLางก)นตรงท; JList จะแสดงรายการหลายรายการโดยท;คลาส JList ม; constructor ท; สZาค)ญด)งน;Y ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 151
  • 163. • public JList() • public JList([]Object objs) คลาส JList มเมธอดทส%าค&ญด&งน( • public void setSelectedIndex(int index) • public void setSelectedIndices(int[]indices) • public void setSelectedValue(Object item, boolean state) • public void setSelectionMode(int selectionMode) • public int getSelectedIndex() • public int[] getSelectedIndices() • public Object getSelectedValue() • public Object[] getSelectedValues() • public int getSelectionMode() เราสามารถท;จะใสLรายการลงในอ5อบเจกต# JList ไดUตอนสรUางอ5อบเจกต# โดยสามารถใสLเขUาไปเปyนแบบอะเรย# (โดยอะเรย#จะม;การกลLาวถxงอยLางละเอ;ยดในบทท; 8) ด)งต)วอยLางโปรแกรมท; 5.12 ซxงจะไดUผลล)พธ#ด)งแสดงในรVปท; 5.21 โปรแกรมท( 5.12 ต)วอยางการสรางอ9อบเจกต JList import java.awt.*; import javax.swing.*; public class JListDemo { private JFrame fr; private JList list; private String[] choices = {"Java SE", "Java EE", "Java ME"}; public void init() { fr = new JFrame("JList Demo"); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); list = new JList(choices); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); fr.setLayout(new FlowLayout()); fr.add(list); fr.pack(); fr.setVisible(true); } public static void main(String args[]) { JListDemo obj = new JListDemo(); obj.init(); } } 152 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
  • 164. รปท 5.21 ผลลพธ!ทไดจากการรนโปรแกรมท 5.12 5.5 การสรางเมน โปรแกรมจาวาประยJกต#ท;ม;สLวนตLอประสานกราฟmกก)บผVUใชU สามารถท;จะม;เมนVใหUผVUใชUเลอกรายการไดU เมนVเปyน อ5อบเจกต#ของคลาสท;สบทอดมาจากคลาส JComponent โดยม;ลZาด)บช)YนของคลาสตLางๆ ท;เก;ยวขUองก)บการสรUางเมนV ด)งแสดงในรVปท; 5.22 ซxงคลาสตLางๆ ท;สZาค)ญม;ด)งน;Y • JMenuBar เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เก5บกลJLมของอ5อบเจกต#ของคลาส JMenu ซxงจะปรากฏเปyน แถบเมนVโดยอ5อบเจกต#ของคลาสน;จะตUองม;อ5อบเจกต#ของคลาส JFrame ท;คVLกน Y ) • JMenu เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เก5บกลJLมของอ5อบเจกต#ของคลาส JMenuItem และต)วแยก รายการ (JSeparator) • JMenuItem เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เปyนรายการ • JCheckboxMenuItem เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เปyนรายการโดยจะม;เครองหมายถVกท;จะแสดง ขxYนเมอรายการน;ถVกเลอก Y • JRadioButtonMenuItem เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เปyนรายการใหUเลอกเพ;ยงต)วเด;ยวแบบ Radio Button รปท 5.22 คลาสทเกยวข*องกบการสร*างเมน ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 153
  • 165. 5.5.1 การสราง JMenuBar คลาส JMenuBar เปyนคลาสท;จะแสดงเปyนแถบเมนVท;ปรากฏอยVLบน JFrame และม; constructor ด)งน;Y • public JMenuBar() เราสามารถท;จะใสLอ5อบเจกต#ชนด JMenuBar ลงในอ5อบเจกต#ประเภท Container ไดU โดยใชUเมธอด setJMenuBar()ของคลาสประเภท Container 5.5.2 การสราง JMenu JMenu เปyนคลาสท;ใชUในการสรUางรายการท;จะแสดงอยVLขUางในอ5อบเจกต#ของคลาส JMenuBar โดยม; constructor ท;สZาค)ญด)งน;Y • public JMenu() • public JMenu(String label) โดยท; • label คอขUอความท;ปรากฏอยVLในรายการ เราจะใชUเมธอด add() ในคลาส JMenuBar เพอท;จะใสLอ5อบเจกต#ของคลาส JMenu ลงใน JMenuBar โปรแกรมท; 5.13 แสดงต)วอยLางการสรUางอ5อบเจกต#ของคลาส JMenu เพอใสLลงใน JMenuBar โดยม;ชอรายการตLางๆ โปรแกรมน;YจะใหUผลล)พธ#ด)งแสดงในรVปท; 5.23 รปท 5.23 ผลลพธทได*จากการรนโปรแกรมท 5.13 154 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
  • 166. โปรแกรมท 5.13 ต)วอยLางการสรUาง JMenu ท;ใสLลงในอ5อบเจกต#ของคลาส JMenuBar import javax.swing.*; public class JMenuDemo { private JFrame fr; private JMenuBar mb; private JMenu m1,m2,m3,m4; public void init() { fr = new JFrame("JMenu Demo"); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mb = new JMenuBar(); m1 = new JMenu("File"); m2 = new JMenu("Edit"); m3 = new JMenu("View"); m4 = new JMenu("Help"); fr.setJMenuBar(mb); mb.add(m1); mb.add(m2); mb.add(m3); mb.add(m4); fr.setSize(200,150); fr.setVisible(true); } public static void main(String args[]) { JMenuDemo mm = new JMenuDemo(); mm.init(); } } 5.5.3 การสราง JMenuItem JMenuItem คอคลาสท;ใชUในการสรUางรายการยLอยท;อยVLในอ5อบเจกต#ชนด JMenu คลาส JMenuItem ม; constructor ท;สZาค)ญด)งน;Y • public JMenuItem() • public JMenuItem(String label) • public JMenuItem(String label, int mnemonic) เราสามารถท;จะใสLอ5อบเจกต#ของคลาส JMenuItem ลงในอ5อบเจกต#ของคลาส JMenu โดยเร;ยกใชUเมธอด add() ในคลาส JMenu นอกจากน;Yเราสามารถท;จะกZาหนดค;ยท;เปyน mnemonic ของรายการท;อยVLในอ5อบเจกต#ของ # คลาส JMenuItem ไดUโดยคZาส)ง setMnemonic() เราสามารถท;จะสรJปข)นตอนการสรUางเมนVไดUด)งน;Y Y 1. สรUางอ5อบเจกต#ของคลาส JMenuBar แลUวใสLลงในอ5อบเจกต#ประเภท Container ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 155
  • 167. 2. สรUางอ5อบเจกต#ของคลาส JMenu หนxงอ5อบเจกต#หรอมากกวLา แลUวใสLลงในอ5อบเจกต#ของคลาส JMenuBar 3. สรUางอ5อบเจกต#ของคลาส JMenuItem หนxงอ5อบเจกต#หรอมากกวLา แลUวใสLลงใน อ5อบเจกต#ของคลาส JMenu โปรแกรมท; 5.14 แสดงต)วอยLางการสรUาง JMenuItem และ JMenu ลงใน JMenuBar โดยจะม;ผลล)พธ#ด)ง แสดงในรVปท; 5.24 โปรแกรมท 5.14 ต)วอยLางการสรUาง JMenuItem import javax.swing.*; public class JMenuItemDemo { private JFrame fr; private JMenuBar mb; private JMenu m1, m2, m3, m4; private JMenuItem mi1, mi2, mi3, mi4; public void init() { fr = new JFrame("MenuItem Demo"); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mb = new JMenuBar(); m1 = new JMenu("File"); m1.setMnemonic('F'); m2 = new JMenu("Edit"); m3 = new JMenu("View"); m4 = new JMenu("Help"); fr.setJMenuBar(mb); mb.add(m1); mb.add(m2); mb.add(m3); mb.add(m4); mi1 = new JMenuItem("New"); mi2 = new JMenuItem("Open"); mi3 = new JMenuItem("Save"); mi4 = new JMenuItem("Exit"); m1.add(mi1); m1.add(mi2); m1.addSeparator(); m1.add(mi3); m1.addSeparator(); m1.add(mi4); fr.setSize(200, 200); fr.setVisible(true); } public static void main(String args[]) { JMenuItemDemo mid = new JMenuItemDemo(); mid.init(); } } 156 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
  • 168. รปท 5.24 ผลลพธทได*จากการรนโปรแกรมท 5.14 5.5.4 คลาส JCheckBoxMenuItem JCheckBoxMenuItem คอรายการเมนVท;ม;เครองหมายระบJวLารายการน;ถVกเลอก คลาส Y JCheckBoxMenuItem ม; constructor ท;สZาค)ญด)งน;Y • public JCheckBoxMenuItem() • public JCheckBoxMenuItem(String label) • public JCheckBoxMenuItem(String label, boolean state) โดยท; • label คอขUอความในรายการเมนV • state คอสถานะในการเลอกโดยท)วไป จะม;คาเปyน false L นอกจากน;เY ราสามารถท;จะเปล;ยนสถานะของอ5อบเจกต#ของคลาส JCheckBoxMenuItem โดยใชUเมธอด setState(boolean b) โปรแกรมท; 5.15 แสดงต)วอยLางการสรUางอ5อบเจกต#ของคลาส JCheckBoxMenuItem โดยจะม;ผลล)พธ#ด)ง แสดงในรVปท; 5.25 ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 157
  • 169. โปรแกรมท 5.15 ต)วอยLางการสรUาง JCheckBoxMenuItem import javax.swing.*; public class JCheckBoxMenuDemo { private JFrame fr; private JMenuBar mb; private JMenu m1,m2,m3; private JMenuItem mi; private JCheckBoxMenuItem cbm; public void init() { fr = new JFrame("JCheckboxMenuItem Demo"); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mb = new JMenuBar(); m1 = new JMenu("File"); m2 = new JMenu("Edit"); m3 = new JMenu("View"); fr.setJMenuBar(mb); mb.add(m1); mb.add(m2); mb.add(m3); mi = new JMenuItem("Toolbars"); cbm = new JCheckBoxMenuItem("Status Bar", true); m3.add(mi); m3.add(cbm); fr.setSize(200,200); fr.setVisible(true); } public static void main(String args[]) { JCheckBoxMenuDemo obj= new JCheckBoxMenuDemo(); obj.init(); } } รปท 5.25 ผลลพธทได*จากการรนโปรแกรมท 5.15 158 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
  • 170. 5.5.5 การสรางเมนย0อย เมนVสามารถท;จะม;เมนVยLอยไดUโดยเมนVยLอยจะเปyนอ5อบเจกต#ของคลาส JMenu ซxงข)YนตอนในการสรUางเฟรมท;ม; เมนVยLอยม;ด)งน;Y 1. สรUางอ5อบเจกต#ของคลาส JMenuBar แลUวใสLลงไปในอ5อบเจกต#ของคลาส JFrame 2. สรUางอ5อบเจกต#ของคลาส JMenu แลUวใสLลงไปในอ5อบเจกต#ของคลาส JMenuBar 3. สรUางอ5อบเจกต#ของคลาส JMenu สZาหร)บเมนVยLอยแลUวใสLลงไปในอ5อบเจกต#ของคลาส JMenu ท;เปyนเมนV หล)ก 4. สรUางอ5อบเจกต#ของคลาส JMeunItem แลUวใสLลงไปในอ5อบเจกต#ของคลาส JMenu ท;เปyนเมนVยLอย โปรแกรมท; 5.16 แสดงต)วอยLางการสรUาง JFrame ท;ม;เมนVยLอยโดยโปรแกรมน;YจะใหUผลล)พธ#ด)งแสดงในรVปท; 5.26 รปท 5.26 ผลลพธทได*จากการรนโปรแกรมท 5.16 ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 159
  • 171. โปรแกรมท 5.16 ต)วอยLางการสรUาง JFrame ท;ม;เมนVยLอย import javax.swing.*; public class SubmenuDemo { private JFrame fr; private JMenuBar mb; private JMenu m1, m2, m3, ms1; private JMenuItem mi2, mi3, mi4, msi1, msi2; public void init() { fr = new JFrame("SubMenuItem Demo"); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mb = new JMenuBar(); m1 = new JMenu("File"); m2 = new JMenu("Edit"); m3 = new JMenu("View"); fr.setJMenuBar(mb); mb.add(m1); mb.add(m2); mb.add(m3); ms1 = new JMenu("New"); mi2 = new JMenuItem("Open"); mi3 = new JMenuItem("Save"); mi4 = new JMenuItem("Exit"); m1.add(ms1); m1.add(mi2); m1.addSeparator(); m1.add(mi3); m1.addSeparator(); m1.add(mi4); msi1 = new JMenuItem("Window"); msi2 = new JMenuItem("Message"); ms1.add(msi1); ms1.addSeparator(); ms1.add(msi2); fr.setSize(200, 200); fr.setVisible(true); } public static void main(String args[]) { SubmenuDemo obj = new SubmenuDemo(); obj.init(); } } 160 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
  • 172. 5.6 ค%ณลกษณะของคลาส Component สLวนประกอบกราฟmกตLางๆ จะม;คJณล)กษณะอนอาทเชLน รVปแบบของฟอนต# ส;ของพYนหล)งหรอส;ของพYนหนUา (Foreground) เราสามารถท;จะกZาหนดคJณล)กษณะของสLวนประกอบกราฟmกไดU โดยปกตสLวนประกอบกราฟmกจะใชU คJณล)กษณะแบบเด;ยวก)บอ5อบเจกต#ประเภท Container ท;บรรจJอยVLเวUนแตLจะม;การกZาหนดคJณล)กษณะเฉพาะของสLวน ประกอบกราฟmกน)นๆ Y เมธอดท;ใชUในการกZาหนดคJณล)กษณะของสLวนประกอบกราฟmก จะอยVLในคลาส Component โดยม;เมธอดท; สZาค)ญคอ • public void setFont(Font f) • public void setForeground(Color c) • public void setBackground(Color c) เมธอด setFont() ใชUในการกZาหนดรVปแบบของฟอนต# สLวนเมธอด setForeground() และ setBackground() ใชUในการกZาหนดส;พYนหนUาและพYนหล)งตามลZาด)บ คลาส Font เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#เพอกZาหนดรVปแบบของฟอนต# โดยม; constructor ด)งน;Y • public Font(String name, int style, int size) โดยท; • name คอชอของฟอนต# • style เปyนรVปแบบของฟอนต# ซxงคลาส Font ไดUกZาหนดคLาคงท;ไวUคอ Font.PLAIN, Font.BOLD และ Font.ITALIC • size คอขนาดของฟอนต# ต)วอยLางของการสรUางอ5อบเจกต#ของคลาส Font ม;ด)งน;Y • Font fn1 = new Font(“AngsanaUPC”,Font.PLAIN,16); • Font fn2 = new Font(“Time Romans”, Font.BOLD + Font.ITALIC, 14); คลาส Color เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#สZาหร)บกZาหนดรVปแบบของส; โดยม; constructor ด)งน;Y • public Color(int r, int g, int b) โดยท; • r, g, b คอคLาความเขUมของแสงส;แดง เข;ยวและนYZาเงน ตามลZาด)บ คลาส Color ม;คJณล)กษณะท;กZาหนดส;ท;ใชUทวไปไวUแลUวหลายๆ ส;อาทเชLน ) ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 161
  • 173. yellow = new Color(255,255,0); black = new Color(0,0,0); โปรแกรมท; 5.12 แสดงต)วอยLางการกZาหนดคJณล)กษณะของอ5อบเจกต#ของคลาส Frame และคลาส Button ใหUม;ส;และฟอนต#ตLางๆ โดยจะไดUผลล)พธ#ด)งแสดงในรVปท; 5.27 โปรแกรมท( 5.17 ต)วอยางการก(าหนดคณล)กษณะของอ9อบเจกตประเภทกราฟ;ก import java.awt.*; import javax.swing.*; public class AttributeDemo { private JFrame fr; private JButton bn1, bn2, bn3; public void init() { fr = new Jframe("ShowAttribute"); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); bn1 = new JButton("OK"); bn2 = new JButton("Cancel"); bn3 = new JButton("Help"); fr.setLayout(new FlowLayout()); fr.add(bn1); fr.add(bn2); fr.add(bn3); bn2.setFont(new Font("TimesRoman", Font.BOLD, 16)); fr.getContentPane().setBackground(Color.blue); bn2.setForeground(Color.red); fr.setSize(200, 150); fr.setVisible(true); } public static void main(String args[]) { AttributeDemo ad = new AttributeDemo(); ad.init(); } } 162 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
  • 174. รปท 5.27 ผลลพธ!ทไดจากการรนโปรแกรมท 5.12 สร%ปเนอหาของบท • AWT เปyนแพคเก5จท;ใชUในการพ)ฒนาโปรแกรม GUI ข)นพYนฐาน ซxงจะใหUโปรแกรม GUI ท;เปyน look and Y feel ท;ขนอยVLก)บแพลตฟอร#ม โดยกZาหนดในแพคเก5จชอ java.awt xY • Swing เปyนแพคเก5จท;ม;สLวนประกอบกราฟmกท;ม;คณล)กษณะและรVปแบบท;ด;กวLาสLวนประกอบกราฟmกของ J แพคเก5จ AWT และสามารถกZาหนดรVปแบบของ look and feel ท;ทZาใหUไดUโปรแกรม GUI ท;ม;รVปแบบของ กราฟmกเหมอนก)นในทJกแพลตฟอร#ม โดยกZาหนดในแพคเก5จชอ javax.swing • คลาส Component อยVLในแพคเก5จ AWT เปyน superclass ของคลาสประเภทสLวนประกอบกราฟmกทJกคลาส • คลาส Container อยVLในแพคเก5จ AWT เปyนคลาสประเภทต)วใสLสLวนประกอบกราฟmก สบทอดมาจาก คลาสท;ชอ Component • คลาสประเภทต)วใสLสLวนประกอบกราฟmกท;สZาค)ญในแพคเก5จ AWT คอคลาส Frame และ Panel • คลาสประเภทสLวนประกอบกราฟmกท;สZาค)ญในแพคเก5จ AWT คอ Button, Label, TextField, TextArea, Checkbox, Choice และ List • รVปแบบการจ)ดวางผ)งสLวนประกอบกราฟmกในต)วใสLสLวนประกอบกราฟmกม;ท)Yงหมด 5 รVปแบบคอ BorderLayout, FlowLayout, GridLayout, CardLayout และ GridBagLayout • การจ)ดวางผ)งของสLวนประกอบกราฟmกแบบ BorderLayout จะเปyนการวางตามทศตLางๆ ไดU 5 ทศ สLวน FlowLayout จะวางไวUในตZาแหนLงบนสJดโดยเร;ยงจากซUายไปขวา สZาหร)บ GridLayout จะวางเร;ยงจาก ซUายไปขวา และบนลงลLางในชLองยLอยท;ม;ขนาดเทLาก)น ตามจZานวนแถวและคอล)มน#ท;ไดUระบJไวU • คลาสประเภทต)วใสLสLวนประกอบกราฟmกท;สZาค)ญในแพคเก5จ Swing คอคลาส JFrame และ JPanel • คลาสประเภทสLวนประกอบกราฟmกท;สZาค)ญในแพคเก5จ Swing คอ JButton, JLabel, JTextField, JTextArea, JCheckBox, JRadioButton, JComboBox และ JList ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 163
  • 175. • JLabel จะแสดงขUอความ ซxงผVUใชUไมLสามารถป‚อนขUอความไดU แตLสZาหร)บ JTextField ผVใชUสามารถป‚อน U ขUอความไดUยาวหนxงบรรท)ด สLวน JtextArea ผVใชUสามารถป‚อนขUอความไดUหลายบรรท)ด U • JCheckBox จะเปyนชLองใหUผVUใชUเลอกหรอไมLเลอกโดยสามารถเลอกไดUหลายชLองพรUอมก)น ซxงจะแตกตLาง จาก JRadioButton ท;จะสามารถเลอกไดUเพ;ยงชLองเด;ยวเทLาน)น Y • JComboBox จะแสดงรายการท;ถVกเลอกเพ;ยงรายการเด;ยว โดยจะแสดงหลายรายการเมอผVใชUคลกเมาส# U เทLาน)น ซxงจะแตกตLางจาก JList ท;จะสามารถแสดงไดUหลายรายการพรUอมก)น Y • คลาสท;จะนZามาใชUในการแสดงแถบเมนVและเมนVยLอยในแพคเก5จ Swing คอ JMenuBar, JMenu และ JMenuItem • คลาส Font และ Color จะถVกนZามาใชUในกรณ;ท;ตUองการระบJคJณล)กษณะ ฟอนต#และส;ของต)วใสLสLวน ประกอบกราฟmกและสLวนประกอบกราฟmก 164 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
  • 176. บทท 6 การเขยนโปรแกรมภาษาจาวาเช,งอ-อบเจกต. เนYอหาในบทท;ผานมาเปyนการแนะนZาการใชUคZาส)งเบYองตUนตLางๆ ในภาษาจาวา โดยการเข;ยนโปรแกรมใน L ต)วอยLางท;ผานมาสLวนใหญL เปyนการเข;ยนโปรแกรมภาษาจาวาโดยใชUหล)กการเชงกระบวนการ เนYอหาในบทน;Yจะ L เปyนการแนะนZาการเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# โดยแนะนZาการใชUเมธอด การใชU constructor การเข;ยน โปรแกรมโดยใชUคณล)กษณะเดLนของโปรแกรมเชงอ5อบเจกต# อาทเชLน การหLอหJUม การสบทอด และการม;ไดUหลาย J รVปแบบ เปyนตUน จากน)นจะเปyนการแนะนZาคลาสภายใน Generic Type และ Annotation Y 6.1 เมธอด เมธอดเปyนสมาชกของคลาสเพอระบJวธ;การหรอพฤตกรรม ท;อ5อบเจกต#ของคลาสสามารถกระทZาไดU เมธอดทZา หนUาท;ในการสLงขLาวสารระหวLางอ5อบเจกต# ซxงเปร;ยบเท;ยบไดUก)บการใชU function หรอ procedure ท;อยVLในโปรแกรม เชงกระบวนการ การเข;ยนโปรแกรมโดยใชUหล)กการเชงอ5อบเจกต#จะเปyนการแบLงโปรแกรมออกเปyนโมดVลยLอยๆ โดย แตLละโมดVลจะม;เมธอดอยVLภายในท;สามารถตดตLอก)บโมดVลโดยการเร;ยกใชUเมธอด ทZาใหUสามารถปร)บเปล;ยนแกUไข โปรแกรมไดUงLายขxYน และสามารถท;จะใชUล)กษณะเดLนตLางๆ ของหล)กการเชงอ5อบเจกต# ไดUเชLน หล)กการของการหLอหJUม การสบทอด และการม;ไดUหลายรVปแบบ 6.1.1 การเรยกใชเมธอด เมธอดท;กZาหนดขxYนในคลาสใดๆ สามารถเร;ยกใชUงานไดUสองรVปแบบคอ 1. การเร;ยกใชUงานจากคลาสท;ตLางก)น 2. การเร;ยกใชUงานภายในคลาสเด;ยวก)น การเร;ยกใชUเมธอดจากคลาสท;ตLางก)น จะตUองม;การสรUางอ5อบเจกต#ของคลาสท;ม;เมธอดท;จะถVกเร;ยกใชUงานกLอน จxงจะสามารถเร;ยกใชUเมธอดไดU ด)งต)วอยLางในโปรแกรมท; 6.1 คลาส MyMain จะตUองสรUางอ5อบเจกต#ของคลาส NumericalClass กLอน จxงจะเร;ยกใชUงานเมธอด calculate() ไดU โดยใชUคZาส)ง NumericalClass obj = new NumericalClass(); obj.calculate(); ท)Yงน;Yเมธอดท;จะถVกเร;ยกใชUงานจากคลาสท;ตLางก)น จะตUองไมLม; modifier เปyน private ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 165
  • 177. การเร;ยกใชUเมธอดภายในคลาสเด;ยวก)นสามารถทZาไดUโดยไมLจZาเปyนตUองสรUางอ5อบเจกต#ของคลาสขxYนมากLอน และสามารถเร;ยกเมธอดไดUทJกเมธอด ยกเวUนเมธอดท;ม; modifier เปyน static จะไมLสามารถเร;ยกใชUเมธอดท;ไมLม; modifier เปyน static (เร;ยกวLา เมธอดแบบ non-static) ไดU ซxงจะกลLาวถxงภายหล)ง โปรแกรมท; 6.2 แสดงต)วอยLาง การเร;ยกใชUเมธอดภายในคลาสเด;ยวก)น โปรแกรมน;กZาหนดเมธอดในคลาส NumericalClass ขxYนมาใหมLท;ชอ Y callMethod() แลUวเร;ยกใชUเมธอด calculate() ภายในเมธอดท;กZาหนดขxนใหมL Y โปรแกรมท 6.1 การเร;ยกใชUเมธอดจากคลาสท;ตLางก)น public class NumericalClass { public void calculate() { double score = Math.random()*100; if (score >= 80) { System.out.println("Grade is A"); } else if (score >= 70) { System.out.println("Grade is B"); } else if (score >= 60){ System.out.println("Grade is C"); } else if (score >= 50){ System.out.println("Grade is D"); } else { System.out.println("Grade is F"); } } } โปรแกรมท -------------------------------------------------------------------------------------------------------------------------------------------------------- 6. public class MyMain { public static void main(String args[]) { NumericalClass obj = new NumericalClass(); obj.calculate(); } } 6.1.2 การส0งผ0าน argument เมธอดท;กZาหนดขxนในคลาสอาจม; argument ท;ร)บคLาเพอนZาไปใชUในเมธอดอาทเชLน เมธอด setGpa() ใน Y คลาส Student ของโปรแกรมท; 6.3 จะม; argument สZาหร)บร)บคLาขUอมVลท;ม;ชนดขUอมVลเปyน double ในกรณ;นการ ;Y เร;ยกใชUเมธอดจะตUองสLง argument ท;ม;ชนดขUอมVลท;สอดคลUองก)นไปพรUอมก)น ด)งน)นการเร;ยกใชUเมธอด setGpa() จะ Y ตUองสLง argument ท;ม;ชนดขUอมVลเปyน double ไปพรUอมก)บชอเมธอด ด)งแสดงในคลาส MyMain2 ในโปรแกรมท; 6.3 (คZาส)ง s1.setGpa(3.0);) 166 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 178. โปรแกรมท 6.2 การเร;ยกใชUเมธอดภายในคลาสเด;ยวก)น public class NumericalClass { public void calculate() { double score = Math.random()*100; if (score >= 80) { System.out.println("Grade is A"); } else if (score >= 70) { System.out.println("Grade is B"); } else if (score >= 60){ System.out.println("Grade is C"); } else if (score >= 50){ System.out.println("Grade is D"); } else { System.out.println("Grade is F"); } } public void callMethod() { calculate(); } } โปรแกรมท 6.3 ต)วอยLางการสLงผLาน argument public class Student { String id; String name; double gpa; public void setGpa(double GPA) { gpa = GPA; } public double getGpa() { return gpa; } } ------------------------------------------------------ public class MyMain2 { public static void main(String args[]) { Student s1 = new Student(); s1.setGpa(3.0); } } argument ของเมธอดจะม;ชนดขUอมVลเปyนสองแบบตามชนดขUอมVลของต)วแปรด)งน;Y 1.argument ท;ม;ชนดขUอมVลแบบพYนฐาน 2.argument ท;ม;ชนดขUอมVลแบบอUางอง ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 167
  • 179. ในกรณ;ของ argument ท;ม;ชนดขUอมVลแบบพYนฐาน เราสามารถท;จะสLงคLาคงท;ขUอมVล ต)วแปร หรอนพจน#ใหU ก)บ argument ไดUอาทเชLน การเร;ยกใชUเมธอด setGpa() น)น argument ท;จะสLงผLานอาจม;รVปแบบเปyน Y • คLาคงท;ขUอมVล เชLน s1.setGpa(3.0); • ต)วแปร เชLน double x = 3.0; s1.setGpa(x); • นพจน# เชLน s1.setGpa(3.0+0.05); สLวนกรณ; argument ท;ม;ชนดขUอมVลแบบอUางอง เราจะตUองสLงอ5อบเจกต#ท;ม;ชนดขUอมVลท;สอดคลUองไปเทLาน)น Y ยกเวUนกรณ;ท; argument น)นม;ชนดขUอมVลเปyน String ซxงในกรณ;นจะสามารถสLงขUอมVลคLาคงท;ไดU โปรแกรมท; 6.4 Y ;Y เปyนต)วอยLางของคลาส StudentV1 ท;ม;คJณล)กษณะ dob ซxงม;ชนดขUอมVลเปyนคลาส MyDate ท;กZาหนดไวUในโปรแกรม ท; 6.5 เพอเก5บว)น เดอน ป}เกดของอ5อบเจกต#ชนด StudentV1 คลาส StudentV1 ม;เมธอด setDOB()เพอใชUในการ กZาหนดคLาใหUก)บคJณล)กษณะ dob โปรแกรมท 6.4 ต)วอยLางการสLงผLาน argument ท;เปyนอ5อบเจกต# public class StudentV1 { String id; String name; MyDate dob; public void setDOB(MyDate d) { dob = d; } public MyDate getDOB() { return dob; } } โปรแกรมท; 6.6 แสดงการเร;ยกใชUเมธอดด)งกลLาวโดยตUองสLงผLานอ5อบเจกต#ของคลาส MyDate ใหUก)บเมธอด ด)งน;Y MyDate d1 = new MyDate(16, 12, 1980); s1.setDOB(d1); สZาหร)บกรณ;ของโปรแกรมท; 6.6 เนองจากอ5อบเจกต# d1 ท;สรUางขxYนมา จะไมLม;การอUางองภายในโปรแกรมน;อ;ก Y 168 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 180. ด)งน)นเราสามารถท;จะสรUางอ5อบเจกต#และสLงผLานไปย)ง argument ในคZาส)งเด;ยวก)นไดUด)งน;Y Y s1.setDOB(new MyDate (16, 12, 1980)); โปรแกรมท 6.5 คลาส MyDate เพอเก5บคLาว)น เดอน และป} public class MyDate { private int day; private int month; private int year; public MyDate(int d, int m, int y) { day = d; month = m; year = y; } public void setDay(int d) { day = d; } public void setMonth(int m) { month = m; } public void setYear(int y) { year = y; } public void showDetails() { System.out.println("Date : " + day + "/" + month + "/" + year); } } โปรแกรมท 6.6 ต)วอยLางการเร;ยกใชUเมธอดท;ม; argument เปyนอ5อบเจกต# public class TestStudentV1 { public static void main(String args[]) { StudentV1 s1 = new StudentV1(); MyDate d1 = new MyDate(16, 12, 1980); s1.setDOB(d1); } } ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 169
  • 181. ชนดขUอมVลของ argument ท;จะสLงผLานไปย)งเมธอดไมLจZาเปyนท;จะตUองเปyนชนดขUอมVลเด;ยวก)น แตLตUองเปyนชนด ขUอมVลท;สามารถแปลงขUอมVลใหUกวUางขxYนไดUโดยอ)ตโนม)ตอาทเชLน เราสามารถท;จะสLง argument ท;ม;ชนดขUอมVลเปyน int ใหUก)บเมธอด setGpa() ท;ตUองการ argument ท;ม;ชนดขUอมVลเปyน double ไดUด)งน;Y s1.setGpa(3); เมธอดใดๆ อาจม; argument สZาหร)บร)บคLามากกวLาหนxงต)ว แตLการเร;ยกใชUเมธอดเหลLาน;จะตUองสLง argument ท; Y ม;ชนดขUอมVลท;สอดคลUองก)นและม;จZานวนเทLาก)น ยกเวUนกรณ;ท; argument ของเมธอดเปyนแบบ varagrs (Variable Arguments) โดยม;ส)ญล)กษณ#เปyน ... เชLนถUาม;การประกาศเมธอด calMax(int... x) จะทZาใหUสามารถเร;ยกใชU เมธอดน;YไดUโดยไมLตUองสLงหรอจะสLง argument ก;ต)วก5ไดU เชLน obj.calMax(); หรอ obj.calMax(1,2,3); จะ สามารถใชUไดUท)YงสYน โปรแกรมท; 6.7 แสดงต)วอยLางของคลาส NumericalSample ซxงม;เมธอด calMax() ท;ร)บ argument สอง ต)วท;ม;ชนดขUอมVลเปyน int และ double ตามลZาด)บ การเร;ยกใชUเมธอดน;YจะตUองสLงผLาน argument จZานวนสองต)วอาท เชLน คZาส)ง obj.calMax(3,4.0); ในเมธอด main() นอกจากน;เY ราย)งจะสามารถเร;ยกใชUเมธอด calMax() ในรVป แบบอนไดUโดยสLง argument ท;ม;ชนดขUอมVลท;สอดคลUองก)นอาทเชLน obj.calMax(3,4); obj.calMax(3,4L); แตLเราไมLสามารถท;จะเร;ยกใชUเมธอดโดยม;จZานวน argument ไมLเทLาก)บท;กZาหนด หรอม;ชนดขUอมVลท;ไมL สอดคลUองก)นอาทเชLน คZาส)ง obj.calMax(3); obj.calMax(4.0); obj.calMax(3L,4.0); obj.calMax(3.0,4); obj.calMax(3,4.0,5); จะเปyนคZาส)งในการเร;ยกใชUเมธอดท;ผด โปรแกรมท 6.7 ต)วอยLางการสLงผLาน argument จZานวนสองต)ว public class NumericalSample { public void calMax(int i, double d) { if (i > d) { System.out.println("Max = "+i); } else { System.out.println("Max = "+d); } } public static void main(String args[]) { NumericalSample obj = new NumericalSample(); obj.calMax(3,4.0); } } 170 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 182. ในกรณ;ท; argument ม;ชนดขUอมVลเปyนแบบพYนฐาน และม;การสLง argument โดยใชUต)วแปรใหUก)บเมธอดท;ถVก เร;ยกใชUงาน โปรแกรมภาษาจาวาจะถอวLาเปyนการสLงคLาไปใหUเทLาน)น หากม;การเปล;ยนแปลงคLาของ argument ภายใน Y เมธอดท;ถVกเร;ยกใชUงาน จะไมLมผลทZาใหUคาของ argument ท;สLงไปเปล;ยนคLาไปดUวย โปรแกรมท; 6.8 แสดงต)วอยLางการ ; L เร;ยกใชUเมธอด method1()ในคลาส ArgumentPassing ซxงร)บ argument ท;เปyนต)วแปร x เขUามา ซxงเมอ x ใน เมธอดเปล;ยนคLาเปyน 3 จะไมLม;ผลทZาใหUคาของ x ในเมธอด main() เปล;ยนไปดUวย จxงไดUผลล)พธ#ออกมาเปyน 4 เชLนเดม L อนxงต)วแปร x ท;อยVLในเมธอด main() และเมธอด method1()เปyนต)วแปรคนละต)วก)น และม;ตZาแหนLงอUางองสZาหร)บ เก5บขUอมVลในหนLวยความจZาท;ตางก)น เพ;ยงแตLม;ชอเด;ยวก)นเทLาน)น L Y สLวนกรณ;ท; argument ม;ชนดขUอมVลเปyนแบบอUางองจะเปyนการสLงตZาแหนLงอUางองของอ5อบเจกต#ไปใหUก)บเมธอด ท;ถVกเร;ยกใชUงาน ด)งน)นการเปล;ยนแปลงคLาของคJณล)กษณะของอ5อบเจกต#จะม;ผลทZาใหUคLาของคJณล)กษณะของอ5อบเจกต# Y ท;สLงไปเปล;ยนไปดUวย ต)วอยLางเชLนในโปรแกรมท; 6.8 การเร;ยกใชUเมธอด method2()โดยการสLงผLานต)วแปรท;เปyน อ5อบเจกต#ของคลาส Date ไป แลUวเปล;ยนคLาของคJณล)กษณะว)น เดอน และป}ของอ5อบเจกต#ในเมธอด method2()จะม; ผลทZาใหUคLาของคJณล)กษณะว)น เดอน และป}ของอ5อบเจกต# d1 ในเมธอด main()เปล;ยนไปดUวย โปรแกรมท( 6.8 ต)วอยางการเปล%ยนแปลงคาของ argument public class ArgumentPassing { public void method1(int x) { x = 3; } public void method2(MyDate d) { d.setDay(1); d.setMonth(1); d.setYear(2002); } public int method3() { return 0; } public static void main(String args[]) { int x = 4; ArgumentPassing obj = new ArgumentPassing(); MyDate d1 = new MyDate(16, 12, 1980); obj.method1(x); System.out.println("x = " + x); obj.method2(d1); d1.showDetails(); obj.method3(); } } ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 171
  • 183. 6.1.3 การรบค0าทส0งกลบมา เมธอดใดๆ ของคลาสสามารถท;จะม;คาท;สLงกล)บมาไดU ท)Yงน;YการประกาศเมธอดจะตUองระบJชนดขUอมVลของคLาท; L จะสLงกล)บใน return_type ซxงชนดขUอมVลของคLาท;จะสLงกล)บอาจเปyนชนดขUอมVลแบบพYนฐาน หรอเปyนชนดขUอมVลแบบ อUางอง ในกรณ;ท;เมธอดไมLม;ขUอมVลจะสLงกล)บมาจะตUองระบJใหU return_type เปyน void อาทเชLน เมธอด setGpa() ในคลาส student ของโปรแกรมท; 6.3 นอกจากน;เY มธอดท;มคLาท;จะสLงกล)บมาจะตUองม;คZาส)ง return ซxงจะระบJคาท; ; L สLงกล)บโดยม;รVปแบบด)งน;Y return value; โดยท; value ขxนอยVLก)บชนดขUอมVลท;จะสLงกล)บ ถUาเปyนชนดขUอมVลแบบพYนฐานอาจเปyนคLาคงท;ขUอมVล ต)วแปร Y หรอนพจน#ก5ไดU แตLถUาเปyนชนดขUอมVลแบบอUางองตUองเปyนอ5อบเจกต#เทLาน)น ยกเวUนชนดขUอมVล String ท;อาจเปyน Y ขUอมVลคLาคงท;ไดU คZาส)ง return จะม;ผลใหUโปรแกรมสYนสJดการทZางานในบล5อกของเมธอดน)นแลUวกล)บไปย)งคZาส)งเดม Y ท;เร;ยกใชUเมธอดน)นY โดยท)วไปการเร;ยกใชUเมธอดท;ม;การสLงคLากล)บมาน)น จะตUองเร;ยกใชUเมธอดน)Yนในนพจน#อาทเชLน การเร;ยกใชU Y เมธอด getGpa() ของคลาส Student ในโปรแกรมท; 6.3 อาจทZาไดUด)งน;Y double d = s1.getGpa(); หรอ System.out.println("GPA: "+ s1.getGpa()); ท)YงสองคZาส)งเปyนการเร;ยกใชUเมธอดในนพจน# แตLคZาส)งแรกจะเก5บคLาท;สLงกล)บในต)วแปรท; d สLวนคZาส)งท;สองจะ ไมLเก5บคLาท;สLงกล)บแตLจะพมพ#คLาออกมา นอกจากน;เY ราสามารถท;เร;ยกใชUเมธอดท;ม;การสLงคLากล)บมา โดยไมLอยVLในรVปของนพจน#ไดUอาทเชLน เมธอด method3() ในโปรแกรมท; 6.8 จะสLงคLาท;ม;ชนดขUอมVลเปyน int กล)บมา แตLเนองจากไมLตUองการใชUคLาด)งกลLาว จxง สามารถใชUคZาส)ง obj.method3(); ไดUโดยไมLตUองใชUคZาส)งกZาหนดคLา 6.1.4 modifier ของเมธอด เมธอดของคลาสจะม; modifier ท;ประกาศไวUหนUา return_type ของเมธอดด)งท;ระบJไวUในห)วขUอท; 4.2.3 ซxง modifier ของเมธอดแบLงออกเปyน 172 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 184. • access modifier เพอระบJถxงระด)บการเขUาถxง • static เพอระบJวาเปyนเมธอดแบบ static L • abstract เพอระบJวาเมธอดย)งไมLสมบVรณ# L • synchronized เพอระบJวาเมธอดจะม;การล5อกอ5อบเจกต# ซxงใชUในกรณ;ของโปรแกรมท;เปyนแบบเธรด L (thread) • final เพอระบJวาเมธอดน;YไมLสามารถ L override ไดU access modifier modifier ประเภทน;YใชUเพอระบJระด)บการเขUาถxง โดยม;คย#เวร#ดตLางๆ ด)งน;Y ; • public • protected • private • default (ไมLระบJค;ยเวร#ดใดๆ ) # เมธอดหรอคJณล)กษณะท;ม; modifier เปyนแบบ public จะทZาใหUเมธอดหรอคJณล)กษณะน)Yนสามารถท;จะถVก เร;ยกใชUจากเมธอดของคลาสอนไดU สLวนเมธอดหรอคJณล)กษณะท;ม; modifier เปyนแบบ private จะถVกป‚องก)นไมLใหU เมธอดจากคลาสอนเร;ยกใชUไดU โดยจะสามารถถVกเร;ยกใชUไดUจากเมธอดภายในคลาสเด;ยวก)นเทLาน)น โปรแกรมท; 6.9 Y แสดงต)วอยLางการประกาศเมธอดและคJณล)กษณะท;ม; modifier เปyนแบบ public และ private ต)วอยLางน;แสดงใหU Y เห5นวLาเมธอดและคJณล)กษณะท;ม; modifier เปyนแบบ private ไมLสามารถท;จะใหUคลาสอนเร;ยกใชUงานไดU กรณ;ท; เมธอดหรอคJณล)กษณะไมLระบJคย#เวร#ดใดๆ สZาหร)บ access modifier ภาษาจาวาจะถอวLาเปyน default ซxงจะทZาใหU ; เมธอดหรอคJณล)กษณะน)นสามารถท;จะถVกเร;ยกใชUจากเมธอดของคลาสอนท;อยVLในแพคเก5จเด;ยวก)นไดU สZาหร)บความ Y หมายของ modifier ท;เปyนแบบ protected จะกลLาวถxงตLอไป 6.2 การเขยนโปรแกรมโดยใชหลกการของการห0อห%ม ขUอด;ของการหLอหJUมประการหนxงคอการซLอนเรUนขUอมVลโปรแกรมเชงอ5อบเจกต#ท;ด;จะออกแบบใหUอ5อบเจกต#ม; เมธอดท;ประกาศใหUอ5อบเจกต#อนๆ เร;ยกใชUงานไดU แตLจะซLอนรายละเอ;ยดหรอวธ;การท;เมธอดน)นใชU และซLอน Y คJณล)กษณะตLางๆ ของอ5อบเจกต#ไวU หล)กการหLอหJUมของ อ5อบเจกต#ในภาษาจาวาทZาไดUโดยการระบJ modifier ของ เมธอดหรอคJณล)กษณะด)งน;Y • คJณล)กษณะของอ5อบเจกต#จะม; modifier เปyน private เพอซLอนไมLใหUอ5อบเจกต#อนๆ เร;ยกใชUไดU • เมธอดของอ5อบเจกต#ท;ตUองการใหUอ5อบเจกต#อนๆ เร;ยกใชUจะม; modifier เปyน public ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 173
  • 185. โปรแกรมท 6.9 ต)วอยLางการประกาศเมธอดและคJณล)กษณะ public class PrivateStudent { private String id; private String name; private double gpa; public void setDetails(String ID,String n,double GPA) { id = ID; name = n; gpa = GPA; } public void showDetails() { System.out.println("ID: "+id); System.out.println("Name: "+name); System.out.println("GPA: "+gpa); } } ------------------------------------------------------------------ public class TestPrivateStudent { public static void main(String args[]) { PrivateStudent ps = new PrivateStudent(); /* ps.id = "12345"; illegal ps.name = "Thana"; illegal ps.gpa = 3.25; illegal */ ps.setDetails("12345","Thana",3.25); ps.showDetails(); } } โปรแกรมท 6.10 ต)วอยLางคลาสท;ไมLไดUใชUหล)กการของการหLอหJUม public class Student { String ID; String name; public double gpa; } -------------------------------------------------------------------------------------------------------------------------------------------------------- public class NoEncapDemo { public static void main(String args[]) { Student s1 = new Student(); double temp = Double.parseDouble(args[0]); if ((temp<0) || (temp>4.00)) { System.out.println("Incorrect Format!"); } else { s1.gpa = temp; System.out.println("GPA: "+s1.gpa); } } } 174 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 186. รปท 6.1 ตวอย%างผลลพธทได*จากการรนโปรแกรมท 6.10 โปรแกรมท; 6.10 แสดงต)วอยLางคลาสท;ไมLไดUใชUหล)กการของการหLอหJUม โดยการกZาหนดใหUคJณล)กษณะ gpa ซxงม; modifier เปyน public ทZาใหUอ5อบเจกต#อนๆ สามารถเร;ยกใชU gpa ไดUโดยตรง คลาส NoEncapDemo ไดUสรUาง อ5อบเจกต#ของคลาส Student ท;ชอวLา s1 และไดUกZาหนดใหUผใชUสามารถป‚อนคLา gpa ผLานเขUามาทาง command line VU ซxงผVUใชUอาจป‚อนคLา gpa ท;ไมLถVกตUองเชLน เปyนคLาต)วเลขจZานวนลบ หรอม;คLามากกวLา 4.00 ด)งน)นจxงจะตUองม;การตรวจ Y สอบคLาท;ป‚อนเขUามากLอนท;จะม;การกZาหนดคLาใหUก)บคJณล)กษณะ gpa ทJกคร)YงโดยใชUคZาส)ง if..else การเข;ยน โปรแกรมแบบน;ทZาใหUโปรแกรมซ)บซUอนขxนและยากตLอการแกUไข ซxงต)วอยLางของผลล)พธ#ท;ไดUจากการร)นโปรแกรมท; Y Y 6.10 เปyนด)งรVปท;6.1 โปรแกรมท; 6.11 ไดUเปล;ยนคJณล)กษณะของ gpa ใหUม; modifier เปyน private และกZาหนดเมธอดใหมLท;ชอ setGpa() ท;ม; modifier เปyน public เพอใหUอ5อบเจกต#อนๆ ท;ตUองการกZาหนดคLา gpa เร;ยกใชUไดU ซxงการเข;ยน โปรแกรมแบบน;เY ปyนการใชUหล)กการของการหLอหJUม ด)งน)นการกZาหนดคLาใหUก)บคJณล)กษณะ gpa ของอ5อบเจกต# s1 ใน Y คลาส EncapDemo จะทZาไดUโดยการเร;ยกใชUเมธอด setGpa() เทLาน)น ซxงในเมธอดด)งกลLาวจะม;การตรวจสอบคLาของ Y gpa อยVLภายใน ทZาใหUการเข;ยนโปรแกรมทZาไดUงLายขxนเพราะไมLจZาเปyนตUองตรวจสอบคLาทJกคร)Yง และงLายตLอการแกUไข Y โปรแกรมในกรณ;ท;ขUอกZาหนดของคJณล)กษณะ gpa เปล;ยนแปลงไป เนองจากเปyนคZาส)งเฉพาะในเมธอดเทLาน)Yน 6.2.1 เมธอดแบบ Accessor การเขUาถxงคJณล)กษณะของอ5อบเจกต#ท;ม; modifier เปyน private น)นจะตUองใชUเมธอดแบบ accessor ในการ Y กZาหนดคLาของคJณล)กษณะ หรอดxงคLาของคJณล)กษณะออกมาใชUงาน เมธอดแบบ accessor แบLงออกไดUเปyนสองประเภทคอ • เมธอดแบบ setter จะใชUในการกZาหนดคLาของคJณล)กษณะ ซxงเมธอดแบบน;YจะไมLม;การสLงคLากล)บ ด)งน)Yน ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 175
  • 187. จxงระบJชนดขUอมVลของคLาท;ตUองการสLงกล)บเปyน void โดยท)วไปชอของเมธอดแบบน;จะขxYนตUนดUวยคZา Y วLา set แลUวตามดUวยชอของคJณล)กษณะ ซxงม;รVปแบบด)งน;Y public void setAttributeName(dataType arg) { attributeName = arg; } โดยท; • dataType คอชนดขUอมVลของคJณล)กษณะท;ตUองการกZาหนดคLา • arg คอต)วแปรท;จะร)บคLาของคJณล)กษณะท;ตUองการกZาหนด • attributeName คอชอของคJณล)กษณะ ต)วอยLางเชLนคลาส Student ม;เมธอด setGpa() เพอกZาหนดคLาของคJณล)กษณะ gpa ซxงม;คZาส)งด)งน;Y public void setGpa(double GPA) { gpa = GPA; } โปรแกรมท 6.11 ต)วอยLางคลาสท;ใชUหล)กการของการหLอหJUม (ต)วอยLางท; 1) public class Student { String ID; String name; private double gpa; public void setGpa(double GPA) { if ((GPA<0) || (GPA>4.00)) { System.out.println("Incorrect Format!"); } else { gpa = GPA; } } public double getGpa() { return gpa; } } -------------------------------------------------------------------------------------------------------------------------------------------------------- public class EncapDemo { public static void main(String args[]) { Student s1 = new Student(); double temp = Double.parseDouble(args[0]); s1.setGpa(temp); System.out.println("GPA: "+s1.getGpa()); } } 176 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 188. เมธอดแบบ getter จะใชUในการเร;ยกคLาของคJณล)กษณะ ซxงเมธอดแบบน;จะม;การสLงคLากล)บ ด)งน)นจxงตUอง Y Y ระบJชนดขUอมVลของคLาท;สLงกล)บมาดUวยเสมอ โดยท)วไปชอของเมธอดแบบน;จะขxนตUนดUวยคZาวLา get Y Y แลUวตามดUวยชอของคJณล)กษณะ ซxงม;รVปแบบด)งน;Y public dataType getAttributeName() { return attributeName; } ต)วอยLางเชLน คลาส Student ม;เมธอด getGpa() เพอเร;ยกคLา ของ gpa ท;ม;คZาส)งด)งน;Y public double getGpa() { return gpa; } ชอของเมธอดแบบ getter สZาหร)บคJณล)กษณะท;ม;ชนดขUอมVลเปyน boolean โดยท)วไปจะกZาหนดใหUขนตUนดUวย xY คZาวLา is แทนท;จะเปyนคZาวLา get อาทเชLน เมธอด isGraduate() เปyนเมธอดเพอเร;ยกคLาของคJณล)กษณะ graduate ของคลาส Student ท;ม;ชนดขUอมVลเปyน boolean โปรแกรมท 6.12 ต)วอยLางคลาสท;ใชUหล)กการของการหLอหJUม (ต)วอยLางท; 2) public class EncapStudent { private String id; private String name; private double gpa; public void setId(String ID) { id = ID; } public void setName(String n) { name = n; } public void setGpa(double GPA) { if ((GPA<0) || (GPA>4.00)) { System.out.println("Incorrect Format!"); } else { gpa = GPA; } } public String getId() { return id; } public String getName() { return name; } public double getGpa() { return gpa; } } ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 177
  • 189. โปรแกรมท; 6.12 แสดงต)วอยLางของโปรแกรมภาษาจาวาท;ใชUหล)กการของการหLอหJUมโดยกZาหนดใหU คJณล)กษณะตLางๆ ของอ5อบเจกต#ม; modifier เปyนแบบ private และกZาหนดใหUม;เมธอดแบบ accessor ท)Yงท;เปyนแบบ setter และ getter เพอทZาใหUสามารถเขUาถxงคJณล)กษณะแตLละต)วไดU คJณล)กษณะของอ5อบเจกต#บางกรณ;อาจไมLสามารถกZาหนดเมธอดแบบ setter ไดU ท)Yงน;เY นองจากอาจไมLตUองการ ใหUม;การกZาหนดคLาไดUโดยตรง โปรแกรมท; 6.13 แสดงต)วอยLางคลาส Account ซxงม;คณล)กษณะ balance เพอเก5บ J ยอดเงนคงเหลอในบ)ญช; โปรแกรมน;YไดUกZาหนดใหUม;เมธอดแบบ getter ท;ชอ getBalance() เพอเร;ยกดVยอดเงนใน บ)ญช; แตLไมLม;เมธอดแบบ setter เพอกZาหนดคLา balance ท)Yงน;YเนองจากคJณล)กษณะ balance จะเปล;ยนคLาไปเมอม; การเร;ยกใชUเมธอด deposit() และ withdraw() ท;ใชUในการฝากและถอนเงนตามลZาด)บ โปรแกรมท 6.13 ต)วอยLางคลาสท;ใชUหล)กการของการหLอหJUม (ต)วอยLางท; 3) public class Account { private double balance; public double getBalance() { return balance; } public void deposit(double amount) { balance += amount; } public void withdraw(double amount) { balance -= amount; } } 6.2.2 คย.เว,รด this . ค;ย#เวร#ด this หมายถxงอ5อบเจกต#ของต)วเอง เราสามารถท;จะเร;ยกใชUเมธอดหรอคJณล)กษณะภายในคลาสไดUโดย ใชUค;ย#เวร#ด this ซxงม;รVปแบบด)งน;Y this.methodName(); this.attirbuteName; โดยท)วไปเราจะไมLใชUค;ย#เวร#ด this ในคZาส)ง ยกเวUนในกรณ;ท;จZาเปyน โปรแกรมท; 6.14 เปyนต)วอยLางการเร;ยก ใชUคJณล)กษณะของออปเจ5ตโดยใชUค;ย#เวร#ด this กรณ;น;YถUาไมLระบJวา this.id, this.name และ this.gpa L คอมไพเลอร#จะเขUาใจวLาหมายถxงต)วแปรท;เปyน argument ของเมธอด ไมLใชLต)วแปรท;เปyนคJณล)กษณะของอ5อบเจกต# 178 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 190. โปรแกรมท 6.14 ต)วอยางแสดงการใชค%ยเวรด this public class ThisStudent { private String id; private String name; private double gpa; public void setDetails (String id, String name, double gpa) { this.id = id; this.name = name; this.gpa = gpa; } public void showDetails() { System.out.println("ID: "+id); System.out.println("Name: "+name); System.out.println("GPA: "+gpa); } } 6.3 การเขยนโปรแกรมโดยใชหลกการของการสบทอด ขUอด;ของการสบทอดคอ การนZาคลาสท;ม;อยVLแลUวมาใชUใหมLโดยการเพมเตมคJณล)กษณะหรอเมธอดในคลาสใหมL เพอใหUเขUาใจหล)กการของการสบทอดใหUพจารณาต)วอยLางของคลาส Student ท;กZาหนดไวUในโปรแกรมท; 6.15 ซxง ถUาหากจZาเปyนท;จะตUองพ)ฒนาคลาสขxนใหมLท;ชอ GradStudent เพอใชUในการสรUางอ5อบเจกต#ท;เปyนน)กศxกษาระด)บ Y บ)ณฑตศxกษาน)น เราสามารถท;จะเลอกวธ;การไดUสองแบบคอ Y 1.สรUางคลาสขxYนมาใหมLโดยไมLอUางองก)บคลาสเดมท;ชอ Student ด)งโปรแกรมท; 6.16 2.สรUางคลาสท;สบทอดมาจากคลาสเดมท;ชอ Student ด)งโปรแกรมท; 6.17 การสรUางคลาสขxYนใหมLตามโปรแกรมท; 6.16 น)นจะเห5นไดUวาม;ความซYZาซUอนในการกZาหนดคJณล)กษณะและ Y L เมธอดของคลาส นอกจากน;Yย)งจะทZาใหUเกดความยJLงยากในการแกUไขโปรแกรมอ;กดUวยอาทเชLน หากตUองม;การเพม คJณล)กษณะ address จะทZาใหUตUองแกUไขโปรแกรมของท)Yงสองคลาส ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 179
  • 191. โปรแกรมท 6.15 ต)วอยLางคลาสท;ชอ Student public class Student { private String id; private String name; private double gpa; public void setId(String id) { this.id = id; } public void setName(String name) { this.name = name; } public void setGpa(double gpa) { this.gpa = gpa; } public void showDetails() { System.out.println("ID: " + id); System.out.println("Name: " + name); System.out.println("GPA: " + gpa); } } ภาษาจาวาไดUกZาหนดค;ย#เวร#ดท;ชอ extends เพอระบJการสบทอดของคลาส โดยม;รVปแบบด)งน;Y public class SubClass extends SuperClass { ... } โดยท; SuperClass คอชอของคลาสท;ตUองการจะใหUม;การสบทอดคJณล)กษณะและเมธอดตLางๆ ไปย)ง SubClass โปรแกรมท; 6.16 สามารถท;จะเข;ยนไดUใหมLโดยใชUหล)กการของการสบทอดด)งแสดงในโปรแกรมท; 6.17 ซxงจะเห5นไดUวLากรณ;น;YจะลดความซYZาซUอนของคJณล)กษณะและเมธอด และจะทZาใหUการปร)บปรJงและแกUไขโปรแกรมเปyน ไปไดUงLายยงขxYน ไดอะแกรมคลาสของคลาสท)Yงสองสามารถแสดงด)งรVปท; 6.2 คลาส GradStudent จะสบทอด คJณล)กษณะและเมธอดของคลาส Student มา ด)งน)นอ5อบเจกต#ของคลาส GradStudent จะม;คJณล)กษณะท;เปyน id, Y name และ gpa เชLนเด;ยวก)บอ5อบเจกต#ของคลาส Student 180 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 192. โปรแกรมท 6.16 ต)วอยLางคลาสท;ชอ GradStudent ท;ไมLไดUใชUหล)กการของการสบทอด public class GradStudent { private String id; private String name; private double gpa; private String thesisTitle; private String supervisor; public void setId(String id) { this.id = id; } public void setName(String name) { this.name = name; } public void setGpa(double gpa) { this.gpa = gpa; } public void setThesisTitle(String thesisTitle) { this.thesisTitle = thesisTitle; } public void setSupervisor(String supervisor) { this.supervisor = supervisor; } public void showThesis() { System.out.println("ThesisTitle: " + thesisTitle); System.out.println("Supervisor: " + supervisor); } } โปรแกรมท 6.17 ต)วอยLางคลาสท;ชอ GradStudent ท;ใชUหล)กการของการสบทอด public class GradStudent extends Student { private String thesisTitle; private String supervisor; public void setThesisTitle(String t) { thesisTitle = t; } public void setSupervisor(String s) { supervisor = s; } public void showThesis() { System.out.println("ThesisTitle: "+thesisTitle); System.out.println("Supervisor: "+supervisor); } } ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 181
  • 193. รปท 6.2 การใช*หลกการของการส0บทอด 6.3.1 การสบทอดทถกตอง เราสามารถท;จะกZาหนดใหUคลาสใดๆ สบทอดคลาสอนไดU แตLการออกแบบโปรแกรมเชงอ5อบเจกต#ท;ด;นน ควร )Y จะใหUคลาสท;จะสบทอดก)นน)Yนม;ความส)มพ)นธ#ท;ถVกตUองก)นดUวยต)วอยLางเชLน หากกZาหนดใหUคลาส Shirt และ Skirt ม;คJณล)กษณะของคลาสด)งน;Y public class Shirt { char size; float price; } public class Skirt { char size; float price; boolean long; } น)กพ)ฒนาโปรแกรมอาจเห5นวLาคลาสท)Yงสองม;คJณล)กษณะท;ซYZาซUอนก)นหลายชอ จxงอาจต)ดสนใจกZาหนดใหU คลาส Skirt สบทอดมาจากคลาส Shirt โดยม;โปรแกรมด)งน;Y 182 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 194. public class Shirt { char size; float price; } public class Skirt extends Shirt { boolean long; } แตLในความเปyนจรงแลUว Shirt และ Skirt จะไมLม;ความส)มพ)นธ#ในล)กษณะการ สบทอดโดยตรง เราสามารถ ท;จะทดสอบความส)มพ)นธ#ของการสบทอด โดยใชUคZาวLา “เปyน” (is a) ไดU คลาสท;จะสบทอดก)นจะตUองสามารถบรรยาย ดUวยวล;ท;วา subclass เปyน superclass (A subclass is a superclass) แตLคZาวLากระโปรงเปyนเสYอ (A skirt is a L shirt) เปyนวล;ท;ไมLถVกตUองจxงทZาใหUคลาสท)YงสองไมLควรจะสบทอดก)นไดU อยLางไรก5ตามเราสามารถท;จะเข;ยนโปรแกรม ของคลาสท)YงสองไดUใหมLด)งน;Y public class Clothing { char size; float price; } public class Shirt extends Clothing { } public class Skirt extends Clothing { boolean long; } ท)Yงน;Yเนองจากท)YงเสYอ (shirt) และกระโปรง (skirt) ตLางก5เปyนเสYอผUา (clothing) 6.3.2 คย.เว,ร.ด protected ถxงแมUวาคลาสท;เปyน subclass จะสบทอดคJณล)กษณะและเมธอดของคลาสท;เปyน superclass มา แตLคลาสท; L เปyน subclass จะไมLสามารถท;จะเร;ยกใชUคJณล)กษณะหรอเมธอดของ superclass ท;ม; modifier เปyนแบบ private ไดU ภาษาจาวากZาหนดใหUม; access modifier ท;ชอ protected ซxงจะทZาใหUคลาสท;เปyน subclass สามารถท;จะเร;ยกใชU เมธอดหรอคJณล)กษณะของ superclass ไดU modifier แบบ protected จะแตกตLางจาก modifier แบบ default ใน กรณ;ท; superclass และ subclass อยVLตLางแพคเก5จก)น ท)Yงน;Yกรณ;ของ default จะไมLสามารถเร;ยกใชUคJณล)กษณะหรอ เมธอดของคลาสท;อยVLตLางแพคเก5จก)นไดU แตLถาม; modifier เปyนแบบ protected จะสามารถเร;ยกใชUไดUในกรณ;ท;คลาส U ท)Yงสองสบทอดก)น ตารางท; 6.1 แสดงการเปร;ยบเท;ยบการกZาหนด modifier แบบตLางๆ เพอเร;ยกใชUคJณล)กษณะหรอ เมธอด และ โปรแกรมท; 6.18 เปyนโปรแกรมท;แสดงต)วอยLางการใชUคย#เวร#ด protected ; ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 183
  • 195. ตารางท 6.1 ระด)บการเขUาถxงคJณล)กษณะหรอเมธอดของ modifier แบบตLางๆ คลาสท;อยVLใน Modifier คลาสเด;ยวก)น แพคเก5จเด;ยว คลาสท;เปyน คลาสใดๆ subclass ก)น public √ √ √ √ protected √ √ √ default √ √ Private √ โปรแกรมท 6.18 ต)วอยLางการใชUค;ย#เวร#ด protected public class Student { protected String id; protected String name; protected double gpa; public void setDetails (String ID,String n,double GPA) { id = ID; name = n; gpa = GPA; } public void showDetails() { System.out.println("ID: "+id); System.out.println("Name: "+name); System.out.println("GPA: "+gpa); } } 6.3.3 คลาสทชอ Object คลาสทJกคลาสในภาษาจาวาถUาไมLไดUสบทอดจากคลาสใดเลย จะถอวLาคลาสน)นสบทอดจากคลาสท;ชอ Object Y อาทเชLน คลาส Student จะสบทอดมาจากคลาสท;ชอ Object และคZาส)งประกาศคลาสจะถอเสมอนวLาม;รVปแบบด)งน;Y public class Student extends Object { ... } คลาสท;ชอ Object จะม;เมธอดท;สZาค)ญคอ 184 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 196. • public String toString() และ • public boolean equals(Object o) เพอใชUในการแปลงอ5อบเจกต#ของคลาสใหUเปyนอ5อบเจกต#ชนด String และใชUในการเปร;ยบเท;ยบอ5อบเจกต# ของคลาสน)นก)บอ5อบเจกต#อนๆ Y 6.3.4 คย.เว,ร.ด super เปyนค;ย#เวร#ดท;ใชUในการอUางองถxง superclass เพอท;จะเร;ยกใชUเมธอดหรอ constructor ของ super superclass โดยม;รVปแบบคZาส)งด)งน;Y super.methodName([arguments]) ต)วอยLางเชLน คลาส GradStudent อาจกZาหนดใหUม;เมธอดท;ชอ showDetails() โดยม;คZาส)งท;เร;ยกใชUเมธอด showDetails() ของคลาส Student ด)งแสดงในโปรแกรมท; 6.19 โปรแกรมท 6.19 ต)วอยLางการใชUค;ย#เวร#ด super public class Student { private String id; private String name; private double gpa; public void showDetails() { System.out.println("ID: "+id); System.out.println("Name: "+name); System.out.println("GPA: "+gpa); } } ------------------------------------------------------------------------------------------------------------------------------------------------------------------ public class GradStudent extends Student { private String thesisTitle; private String supervisor; public void showDetails() { super.showDetails(); System.out.println("Thesis Title: "+ thesisTitle); System.out.println("Supervisor: "+supervisor); } } ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 185
  • 197. 6.4 การมไดหลายรปแบบ การม;ไดUหลายรVปแบบหมายถxงคJณสมบ)ตของอ5อบเจกต#ของคลาสท;ตLางก)น ท;สามารถจะกZาหนดคLาไดUหลายรVป แบบ หรอการตอบสนองตLอเมธอดเด;ยวก)นดUวยวธ;การท;ตLางก)นไดU หล)กการของการม;ไดUหลายรVปแบบเปyนหล)กการท;สบ เนองมาจากหล)กการของการสบทอด 6.4.1 Dynamic Binding Dynamic Binding เปyนหล)กการของการกZาหนดอ5อบเจกต#ของคลาสท;ม;การสบทอดก)นไดUหลายรVปแบบ ภาษาจาวากZาหนดใหUอ5อบเจกต#ของคลาสใดๆ สามารถสรUางมาจากคลาสน)นหรอคลาสอนๆ ท;เปyน subclass ไดU กลLาว Y คอถUาประกาศคลาส SubClass ซxงสบทอดมาจากคลาส SuperClass แลUว และม;คZาส)งประกาศอ5อบเจกต# obj ใหU เปyนอ5อบเจกต#ของคลาส SuperClass โดยใชUคZาส)ง SuperClass obj; เราสามารถใชUหล)กการของการม;ไดUหลายรVปแบบในการสรUางอ5อบเจกต# obj ไดU หลายรVปแบบด)งน;Y obj = new SuperClass(); หรอ obj = new SubClass(); ในกรณ;ของต)วอยLางของคลาส Student ท;ม; subclass เปyนคลาส GradStudent โดยท;คลาส GradStudent ม; subclass อ;กคลาสหนxงท;ชอ PhDStudent น)น เราสามารถท;จะกZาหนดอ5อบเจกต#ของคลาสเหลLาน;Y Y ไดUหลายรVปแบบ ด)งแสดงความส)มพ)นธ#ในรVปท; 6.3 กลLาวคอ เราสามารถท;ประกาศอ5อบเจกต#ของคลาส Student แลUว สรUางอ5อบเจกต#ไดUหลายรVปแบบด)งน;Y Student s1 = new Student(); หรอ Student s1 = new GradStudent(); หรอ Student s1 = new PhDStudent(); เชLนเด;ยวก)บกรณ;ของอ5อบเจกต#ของคลาส GradStudent สามารถท;จะสรUางอ5อบเจกต#ไดUหลายรVปแบบด)งน;Y GradStudent s2 = new GradStudent(); GradStudent s2 = new PhDStudent(); แตLในทางกล)บก)นเราจะไมLสามารถกZาหนดอ5อบเจกต#ของ subclass แลUวสรUางอ5อบเจกต#ของ superclass ไดU 186 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 198. กลLาวคอ คZาส)ง GradStudent s3 = new Student(); จะเปyนคZาส)งท;ไมLถVกตUอง รปท 6.3 อ-อบเจกตของคลาสทมได*หลายรปแบบ 6.4.2 การกDาหนดเมธอดใหมว,ธการทต0างกน หล)กการของการม;ไดUหลายรVปแบบย)งรวมไปถxงการท;เมธอดชอเด;ยวก)นแตLม;วธ;การ (คZาส)ง) ท;ตLางก)น ซxง สามารถกZาหนดเมธอดไดUสองรVปแบบคอ 1. เมธอดแบบ overloaded 2. เมธอดแบบ overridden เมธอดแบบ Overloaded ภาษาจาวาอนJญาตใหUคลาสใดๆ ม;เมธอดท;ชอเด;ยวก)นมากกวLาหนxงเมธอดไดU แตLเมธอดเหลLาน)นจะตUองม; Y จZานวนหรอชนดขUอมVลของ argument ท;ตLางก)น โปรแกรมท; 6.20 เปyนต)วอยLางของการเข;ยนเมธอดแบบ overloaded โดยเมธอด setDetails() จะม;สองเมธอด เมธอดแรกจะร)บ argument ท;ม;สองต)ว และเมธอดท;สองจะร)บ argument ท;ม;สามต)ว ซxงคอมไพเลอร#จะพจารณาวLาโปรแกรมเร;ยกใชUเมธอดใดโดยดVจากจZานวนและชนดของ argument ท)Yงน;เมธอดแบบ overloaded อาจม;คาท;สLงกล)บมาเปyนชนดเด;ยวก)นหรอตLางก)นก5ไดU Y L ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 187
  • 199. โปรแกรมท% 6.20 ต)วอยางของเมธอดแบบ overloaded public class StudentV2 { private String id; private String name; private double gpa; public void setDetails(String ID,String n) { id = ID; name = n; } public void setDetails(String ID,String n,double GPA) { id = ID; name = n; gpa = GPA; } } ต)วอยLางตLอไปน;เY ปyนการเข;ยนเมธอดแบบ overloaded ท;ถVกตUอง public void setDetails(String ID,String n) { } public void setDetails(String ID,double GPA) { } public double setDetails(double GPA,String ID){ } ต)วอยLางตLอไปน;เY ปyนการเข;ยนเมธอดแบบ overloaded ท;ไมLถVกตUอง public void setDetails(String ID,double GPA) { } public void setDetails(String n,double GPA) { } กรณ;ต)วอยLางท;ไมLถVกตUองน;YถxงแมUวาจะม;ชอของ argument ท;ตLางก)นก5ตามแตLเนองจากเมธอดท)Yงสองม;จZานวน L และชนดขUอมVลของ argument ท;เหมอนก)น ด)งน)นเมอคอมไพเลอร#เจอคZาส)งเร;ยกใชUเมธอด setDetails() แลUวสLง Y argument ท;ม;ชนดขUอมVลเปyน String และ double มา คอมไพเลอร#จะไมLสามารถแยกไดUวLาจะเร;ยกใชUเมธอดใด ด)ง น)นถUาชJดคZาส)งในต)วอยLางน;YอยVLในโปรแกรมใดจะทZาใหUโปรแกรมน)นไมLสามารถคอมไพล#ผานไดU Y Y L เมธอดแบบ Overridden การกZาหนดเมธอดแบบ overridden เปyนหล)กการท;สบเนองมาจากหล)กการของการสบทอด โดยคลาสท;เปyน subclass สามารถท;จะเข;ยนเมธอดของ superclass ขxนใหมLไดU วธ;การน;Yเร;ยกวLา เมธอดใน subclass เปyนเมธอดแบบ Y 188 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 200. overridden การเข;ยนเมธอดแบบ overridden ม;ขUอกZาหนดด)งน;Y • จZานวนและชนดขUอมVลของ argument จะตUองเหมอนเดม • ชนดขUอมVลของคLาท;สLงกล)บจะตUองเหมอนเดม • access modifier จะตUองไมLม;ระด)บตZากวLาเดมอาทเชLน ถUาเมธอดเดมเปyน public จะไมLสามารถเปล;ยนเปyน private ไดU โปรแกรมท; 6.21 แสดงต)วอยLางการกZาหนดเมธอดแบบ overridden ท;ชอ showDetails() โดยการเข;ยน เมธอด showDetails() ของคลาส Student ขxนใหมL Y โปรแกรมท 6.21 เมธอดแบบ overridden ท;ชอ showDetails() public class Student { protected String id; protected String name; protected double gpa; public void showDetails() { System.out.println("ID: "+id); System.out.println("Name: "+name); System.out.println("GPA: "+gpa); } } --------------------------------------------------------- public class GradStudent extends Student { private String thesisTitle; private String supervisor; public void showDetails() { System.out.println("ID: "+id); System.out.println("Name: "+name); System.out.println("GPA: "+gpa); System.out.println("ThesisTitle: "+thesisTitle); System.out.println("Supervisor: "+supervisor); } } ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 189
  • 201. 6.4.3 Virtual Method Invocation การกZาหนดอ5อบเจกต#ตามหล)กการของ Dynamic Binding ทZาใหUโปรแกรมภาษาจาวาพจารณาเร;ยกใชUเมธอด จากชนดของอ5อบเจกต#ท;สรUางขxน ต)วอยLางเชLน คZาส)ง Y Student s1 = new GradStudent(); s1.showDetails(); เปyนคZาส)งท;เร;ยกใชUเมธอด showDetails() ของคลาส GradStudent ไมLใชLเมธอดของคลาส Student ท)Yงน;เY นองจากอ5อบเจกต# s1 เปyนอ5อบเจกต#ของคลาส GradStudent แตLคอมไพเลอร#ของภาษาจาวาจะไมLอนJญาตใหU เร;ยกใชUเมธอดใดๆ ก5ตามท;ไมLม;การประกาศอยVLในเมธอดของ superclass ท;กZาหนดไวU กลLาวคอคZาส)ง Student s1 = new GradStudent(); s1.getSupervisor(); เปyนคZาส)งท;ไมLถVกตUองและจะไมLสามารถคอมไพล#ผานไดU เนองจากคอมไพเลอร#จะไมLรVUจ)กเมธอด L getSupervisor() ท;อยVLในคลาส Student ถxงแมUวLาอ5อบเจกต# s1 จะเปyนอ5อบเจกต#ของคลาส GradStudent ท;ม; เมธอดด)งกลLาวอยVLก5ตาม 6.4.4 การส0งผ0าน argument ไดหลายรป ในกรณ;ท;เมธอดม; argument เปyนขUอมVลชนดคลาส เราสามารถท;จะใชUหล)กการของการม;ไดUหลายรVปแบบใน การสLง argument ท;เปyนอ5อบเจกต#ใหUก)บเมธอดด)งกลLาวไดU กลLาวคอเราสามารถท;จะสLงอ5อบเจกต#ของคลาสท;เปyน subclass ของคลาสน)นแทนไดU ต)วอยLางเชLน คZาส)ง Y Student s1 = new Student(); Student s2 = new GradStudent(); และเมธอด public void printInfo(Student s) { ... } เปyนเมธอดท;ม; argument เปyนขUอมVลชนดคลาส Student เราสามารถท;จะเร;ยกใชUเมธอดน;โดยการสLง Y อ5อบเจกต#ท;สบทอดมาจากคลาส Student ไดU อาทเชLน printInfo(s1) printInfo(s2) หรอ printInfo(new FullTimeStudent()) 190 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 202. 6.4.5 ตวดDาเน,นการ instanceof ค;ย#เวร#ด instanceof เปyนต)วดZาเนนการท;ใชUก)บอ5อบเจกต#และคลาส เพอตรวจสอบวLาอ5อบเจกต#ใดๆ เปyน อ5อบเจกต#ของคลาสท;ระบJหรอไมL ค;ยเ# วร#ด instanceof จะใหUผลล)พธ#เปyนชนดขUอมVลแบบ boolean ซxงถUาไดUผลล)พธ# เปyน true จะหมายถxงวLาอ5อบเจกต#ด)งกลLาวเปyนอ5อบเจกต#ของคลาสท;ระบJหรอเปyนอ5อบเจกต#ของคลาสท;เปyน superclass ของคลาสน)น Y ต)วอยLางเชLน GradStudent s1 = new GradStudent(); เปyนคZาส)งในการประกาศและสรUางอ5อบเจกต# s1 ของคลาส GradStudent ด)งน)นนพจน# Y (s1 instanceof GradStudent) จะใหUผลล)พธ#เปyน true เชLนเด;ยวก)บนพจน# (s1 instanceof Student) หรอ (s1 instanceof Object) ท;จะใหUผลล)พธ#เปyน true ท)Yงน;เY นองจากคลาส GradStudent สบทอดมาจากคลาส Student และคลาส Student ก5สบทอดมาจากคลาสท;ชอ Object อ;กตLอหนxง สLวนนพจน# (s1 instanceof String) จะไมLสามารถคอมไพล#ผานไดU ท)Yงน;เY นองจากอ5อบเจกต#ของคลาส GradStudent จะไมLใชLอ5อบเจกต#ของคลาส L ท;สบทอดมาจากคลาส String นอกจากน;Y ค;ย#เวร#ด instanceof จะใหUผลล)พธ#เปyน false ในกรณ;ท;จะตรวจสอบวLาอ5อบเจกต#ด)งกลLาวเปyน อ5อบเจกต#ของคลาสท;เปyน subclass หรอไมL ต)วอยLางเชLนคZาส)ง Student s1 = new Student(); จะไดUนพจน# (s1 instanceof GradStudent) ท;ใหUผลล)พธ#เปyน false ค;ย#เวร#ด instanceof สามารถใชUในการตรวจสอบวLา argument ท;ร)บขUอมVลมาในเมธอดเปyนอ5อบเจกต#ของ คลาสใด ต)วอยLางเชLน คZาส)งตLอไปน;เY ปyนการใชUค;ย#เวร#ด instanceof เพอตรวจสอบวLา argument ของอ5อบเจกต# s วLา เปyนอ5อบเจกต#ของคลาสใด ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 191
  • 203. public void printInfo(Student s) { if (s instanceof PhDStudent) { System.out.println("PhD Student"); } else if (s instanceof GradStudent) { System.out.println("Graduate Student"); } else if (s instanceof FullTimeStudent) { System.out.println("Full-Time Student"); } else if (s instanceof PartTimeStudent) { System.out.println("Part-Time Student"); } else if (s instanceof Student) { System.out.println("Student"); } } 6.4.6 การ Casting อ-อบเจกต. หล)กการของการม;ไดUหลายรVปแบบ ทZาใหUเราสามารถจะกZาหนดอ5อบเจกต#ของคลาสท;เปyน subclass ใหUก)บ ต)วแปรท;กZาหนดเปyนคลาสท;เปyน superclass ไดU ต)วอยLางเชLน GradStudent s1 = new GradStudent(); Student s2 = s1; แตLในทางกล)บก)นต)วแปรท;กZาหนดเปyนคลาสท;เปyน subclass จะไมLสามารถกZาหนดคLาใหUเปyนอ5อบเจกต#ของ คลาสท;เปyน superclass ไดU ต)วอยLางเชLน Student s1 = new GradStudent(); GradStudent s2 = s1; จะเปyนคZาส)งท;ไมLถVกตUอง และโปรแกรมน;จะไมLสามารถคอมไพล#ผานไดU การกZาหนดคLาในล)กษณะน;YจะตUอง Y L ทZาการ casting อ5อบเจกต#เพอระบJชนดของอ5อบเจกต# โดยม;รปแบบด)งน;Y V (ClassName) objectName โดยท; • ClassName คอชนดของคลาสท;ตUองการระบJ • objectName คอชอของต)วแปรของอ5อบเจกต# ต)วอยLางท;ผLานมาสามารถเข;ยนใหมLไดUเปyน Student s1 = new GradStudent(); GradStudent s2 = (GradStudent) s1; จxงจะทZาใหUโปรแกรมสามารถคอมไพล#ผLานไดU เชLนเด;ยวก)บคZาส)งในห)วขUอ 187 ท;เปyนต)วอยLางของการเร;ยกใชU 192 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 204. เมธอด ก5จะสามารถเข;ยนใหมLไดUเปyน Student s1 = new GradStudent(); ((GradStudent) s1).getSupervisor(); จxงจะทZาใหUโปรแกรมสามารถคอมไพล#ผLานไดU จากต)วอยLางขUางตUนอ5อบเจกต# s1 จะถVกกZาหนดใหUเปyนคลาส ชนด GradStudent ท;ม;เมธอด getSupervisor() ภาษาจาวาจะตรวจสอบชนดของอ5อบเจกต#ในชLวงของการร)นโปรแกรม ด)งน)นถxงแมUวาโปรแกรมจะคอมไพล# Y L ผLานไดU แตLถUาเกดตรวจสอบพบวLาอ5อบเจกต#ท;ทZาการ casting ไมLใชLอ5อบเจกต#ของคลาสน)นหรออ5อบเจกต#ของ subclass Y โปรแกรมจะไมLสามารถร)นผLานไดU ต)วอยLางเชLน Student s1 = new Student(); GradStudent s2 = (GradStudent) s1; จะเปyนคZาส)งท;ทZาใหUเกดขUอผดพลาดในชLวงของการร)นโปรแกรม เนองจากต)วแปร s1 ถVกกZาหนดคLาใหUเปyน อ5อบเจกต#ของ superclass ซxงไมLสามารถทZาไดU เชLนเด;ยวก)บการเร;ยกใชU เมธอดของอ5อบเจกต#ท;ทZาการ casting ภาษา จาวาจะตรวจสอบชนดของอ5อบเจกต#ในชLวงของการร)นโปรแกรม วLาอ5อบเจกต#ด)งกลLาวเปyนอ5อบเจกต#ของคลาสใด และ คลาสน)นม;เมธอดท;เร;ยกใชUหรอไมL หากไมLพบก5จะเกดขUอผดพลาดในชLวงของการร)นโปรแกรม ต)วอยLางเชLน Y Student s1 = new Student(); ((GradStudent) s1).getSupervisor(); จะเปyนคZาส)งท;สามารถคอมไพล#ผLานไดU แตLจะเกดขUอผดพลาดในชLวงของการร)นโปรแกรม เนองจากจาวา อนเตอร#พร;ตเตอร#จะพบวLา s1 เปyนอ5อบเจกต#ของคลาส Student ซxงไมLม;เมธอด getSupervisor() โปรแกรมท; 6.22 แสดงต)วอยLางการเร;ยกใชUอ5อบเจกต#ในรVปแบบตLางๆ ท;อาจเกดขUอผดพลาดในชLวงของการร)นโปรแกรมหรอใน ชLวงของการคอมไพล#โปรแกรม ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 193
  • 205. โปรแกรมท 6.22 ต)วอยLางการเร;ยกใชUอ5อบเจกต#ในรVปแบบตLางๆ ท;อาจเกดขUอผดพลาด public class Student { protected String id; protected String name; protected double gpa; public String getId() { return id; } public String getName() { return name; } public double getGpa() { return gpa; } } ------------------------------------------------------ public class GradStudent extends Student { private String thesisTitle; private String supervisor; public String getThesisTitle() { return thesisTitle; } public String getSupervisor() { return supervisor; } } public class TestCallingMethods { public static void main(String args[]) { Student s1 = new GradStudent(); s1.getSupervisor(); // compile error Student s2 = new Student(); ((GradStudent) s2).getSupervisor(); // runtime error } } 6.5 Constructor constructor เปyนเมธอดท;ม;ชอเด;ยวก)บชอคลาสซxงจะถVกเร;ยกใชUงานเมอม;การสรUางอ5อบเจกต#โดยใชUคZาส)ง new โดย constructor ม;รVปแบบด)งน;Y [modifier] ClassName([arguments]) { [statements] } 194 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 206. constructor เปyนเมธอดท;ไมLม;คLาท;จะสLงกล)บแตLไมLตUองระบJค;ย#เวร#ด void ซxงแตกตLางก)บเมธอดท)วๆ ไป modifier ของ constructor จะเปyน access modifier ซxงโดยท)วไปจะเปyน public กรณ;ท; constructor ม; access modifier เปyน private จะทZาใหUไมLสามารถสรUางอ5อบเจกต#ของคลาสน)นจากคลาสอนไดU โดยท)วไปคลาสทJกคลาสจะ Y ม; constructor แบบ default แมUจะไมLม;การเข;ยนคZาส)ง constructor ในโปรแกรม โดย constructor แบบ default จะม;รVปแบบด)งน;Y public ClassName() { } constructor แบบ default จะเปyน constructor ท;ไมLม;คZาส)งใดๆ อยVLภายใน คอมไพเลอร#ของภาษาจาวาจะใสL constructor แบบ default ใหUก)บโปรแกรมโดยอ)ตโนม)ต อาทเชLน คลาส Student ในโปรแกรมท; 6.15 จะม; constructor แบบ default ท;คอมไพเลอร#ใสLใหUก)บโปรแกรม ด)งน;Y public class Student { public Student() { } ... } 6.5.1 การเขยน Constructor เราสามารถท;จะเข;ยน constructor ในคลาสใดๆ ขxนมาก5ไดUอาทเชLน คลาส Student อาจกZาหนดใหUม; Y constructor เปyน public class Student { private String id; private String name; private double gpa; public Student(String ID,String n,double GPA) { id = ID; name = n; gpa = GPA; } ... } การกZาหนด constructor ขxYนมาใหมLนนจะทZาใหU constructor แบบ default หายไป ด)งน)YนการสรUางอ5อบเจกต# )Y ของคลาสท;ม; constructor ใหมLนจะตUองใชUคZาส)ง new ท;สLงผLานจZานวนและชนดขUอมVลของ argument ท;สอดคลUองก)บ ;Y ท;กZาหนดไวUใน constructor ต)วใหมL จากต)วอยLางขUางตUน การสรUางอ5อบเจกต#ของคลาส Student อาจจะใชUคZาส)ง Student s1 = new Student(“1122”,“Thana”,3.00); ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 195
  • 207. แตLจะไมLสามารถใชUคZาส)ง Student s1 = new Student(); ไดUอ;ก เนองจาก constructor แบบ default ของคลาส Student ไมLม;แลUว 6.5.2 ขนตอนการทDางานของคDาสง new คZาส)ง new ท;ใชUในการสรUางอ5อบเจกต#ของคลาสจะม;ลZาด)บข)นตอนการทZางานด)งน;Y Y 1. กZาหนดเนYอท;ในหนLวยความจZาใหUก)บอ5อบเจกต# 2. กZาหนดคLาเรมตUนใหUก)บคJณล)กษณะของอ5อบเจกต# 3. กZาหนดคLาของคJณล)กษณะของอ5อบเจกต#ตามคZาส)งกZาหนดคLาท;ประกาศไวU 4. เร;ยกใชU constructor ต)วอยLางเชLน ถUาคลาส MyDate ม;โปรแกรมด)งน;Y public class MyDate { private int day = 1; private int month = 1; private int year = 2000; public MyDate(int d,int m,int y) { day = d; month = m; year = y; } } คZาส)ง MyDate d1 = new MyDate(16,8,1972); จะม;ขนตอนในการทZางานด)งรVปท; 6.4 โดยข)นตอนท;หนxงจะเปyนการกZาหนดเนYอท;ในหนLวยความจZา (รVปท; )Y Y 6.4(ก)) ข)นตอนท;สองเปyนการกZาหนดคLาเรมตUนโดยคJณล)กษณะของ อ5อบเจกต#จะม;คา default เปyน 0 (รVปท; 6.4(ข)) Y L ข)Yนตอนท;สามเปyนการกZาหนดคLาของคJณล)กษณะตามคZาส)งท;กZาหนดคLาไวUเรมตUน โดยท;คJณล)กษณะ day จะม;คLาเปyน 1 คJณล)กษณะ month จะม;คาเปyน 1 และคJณล)กษณะ year จะม;คLาเปyน 2000 (รVปท; 6.4(ค)) และข)นตอนสJดทUายจะ L Y เปyนการเร;ยกใชU constructor ทZาใหUคาของคJณล)กษณะเปyนไปตามท;กZาหนดในคZาส)งของ constructor (รVปท; 6.4(ง)) L 196 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 208. (ก) ข)Yนตอนท;หนxง (ข) ข)Yนตอนท;สอง ค) ข)Yนตอนท;สาม (ง) ข)นตอนท;ส; Y รปท 6.4 ขนตอนการทางานของคาสง new 6.5.3 Constructor แบบ Overloaded ภาษาจาวาสามารถกZาหนด constructor แบบ overloaded เชLนเด;ยวก)บการกZาหนดเมธอดแบบ overloaded โดย constructor แบบ overloaded จะม;จZานวนหรอชนดขUอมVลของ argument ท;ตLางก)น ซxงคZาส)ง new ในการสรUาง อ5อบเจกต#ของคลาสจะเร;ยกใชU constructor โดยการพจารณาจาก argument ท;สLงผLานมาวLาสอดคลUองก)บ constructor ท;กZาหนดต)วใด ขUอด;ของการสรUาง constructor แบบ overloaded คอทZาใหUเราสามารถท;จะสรUางอ5อบเจกต#เรมตUนไดU หลายรVปแบบ โปรแกรมท; 6.23 แสดงต)วอยLางของคลาส Student ท;ม; constructor แบบ overloaded ซxงคZาส)งการสรUาง อ5อบเจกต# Student s1 = new Student (“1234”,“Somchai”,3.75); จะม;ผลทZาใหUคอมไพเลอร#เร;ยก constructor ของคลาส Student ชJดท;สองซxงม; argument สามต)ว ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 197
  • 209. โปรแกรมท 6.23 ต)วอยางการเข%ยน constructor แบบ overloaded public class Student { private String id; private String name; private double gpa; public Student(String ID,String n) { id = ID; name = n; } public Student(String ID,String n,double GPA) { id = ID; name = n; gpa = GPA; } } 6.5.4 เมธอด this() เมธอดท;ชอ this() เปyนการเร;ยกใชU constructor ของคลาสต)วเอง โดยจะตUองเปyนคZาส)งแรกสJดท;อยVLใน constructor แบบ overloaded ต)วอยLางเชLน โปรแกรมท; 6.23 สามารถเข;ยน constructor ของคลาส Student ชJดท; สองใหมLไดUโดยใชUเมธอดท;ชอ this() ด)งแสดงในโปรแกรมท; 6.24 โปรแกรมท 6.24 ต)วอยLางการใชUเมธอดท;ชอ this() public class Student { private String id; private String name; private double gpa; public Student(String ID,String n) { id = ID; name = n; } public Student(String ID,String n,double GPA) { this(ID,n); gpa = GPA; } } 198 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 210. 6.5.5 เมธอด super() โดยท)วไปเมธอดและคJณล)กษณะของ superclass จะสบทอดมาย)ง subclass แตLจะม;ขUอยกเวUนสZาหร)บ constructor ซxงจะไมLสบทอดมาย)ง subclass กลLาวคอ ถUา superclass ม; constructor รVปแบบใด จะไมLไดUทZาใหU subclass ม; constructor รVปแบบน)นดUวย ต)วอยLางเชLน Y public class Parent { ... } public class Child extends Parent { public Child (String s) { ... } } ในกรณ;นคลาส Parent ม; constructor แบบ default สLวนคลาส Child ท;สบทอดมาจากคลาส Parent ม; ;Y constructor ท;ม; argument เปyน String เพ;ยงรVปแบบเด;ยว เนองจาก constructor แบบ default จะไมLไดUสบทอด มาย)งคลาส Child ด)งน)นการสรUาง อ5อบเจกต#โดยใชU constructor แบบ default อาทเชLน Y Child c1 = new Child(); จxงเปyนคZาส)งท;ไมLถVกตUอง เนองจาก constructor แบบ default ของคลาส Child ไดUถVกแทนท;ดวย U constructor แบบใหมLไปแลUว เราสามารถท;จะเร;ยกใชU constructor ของ superclass ไดUโดยใชUเมธอดท;ชอ super() โดยสLงผLาน argument ท;สอดคลUองก)น ท)Yงน;เY มธอด super() จะตUองเปyนคZาส)งแรกของ constructor เชLนเด;ยวก)บเมธอดท;ชอ this() โดย ท)วไปการทZางานของ constructor ของคลาสใดๆ จะม;ผลทZาใหUม;การเร;ยกใชU constructor ของ superclass น)น ซxงถUา Y ไมLมคZาส)ง super() อยVLในคZาส)งแรกของ constructor ของคลาสน)น ภาษาจาวาจะเร;ยกใชU constructor แบบ default ; Y ของ superclass น)นโดยอ)ตโนม)ต Y ในกรณ;ท; superclass ไมLม; constructor แบบ default และไมLม;คZาส)ง super() อยVLใน constructor ของ subclass จะทZาใหUโปรแกรมไมLสามารถคอมไพล#ผานไดUด)งต)วอยLางในโปรแกรมท; 6.25 ซxงในกรณ;นจะตUองใชUคZาส)ง L ;Y super() ใน constructor ของคลาส GradStudentV1 เพอท;จะทZาใหUโปรแกรมสามารถคอมไพล#ผLานไดU โดยจะตUอง กZาหนด contructor ของคลาส GradStudentV1 ใหมLด)งน;Y public GradStudentV1(String n){ super(n); } } ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 199
  • 211. โปรแกรมท 6.25 ต)วอยางการเร%ยกใช constructor ของ superclass public class StudentV1 { protected String name; public StudentV1(String n) { name = n; } } ------------------------------------------------------ public class GradStudentV1 extends StudentV1 { public GradStudentV1(String n) { name = n; /* compile error should be super(n) */ } } 6.5.6 ขนตอนการทDางานของ Constructor อ5อบเจกต#ของคลาสใดๆ จะถVกสรUางขxYนเมอม;การเร;ยกใชUคZาส)ง new ตามข)นตอนการทZางานท;ไดUกลLาวผLานมา Y แลUว โดยข)YนตอนสJดทUายเปyนการเร;ยกใชU constructor ซxงจะม;ขนตอนการทZางานท;ตUองพจารณาเพมเตมด)งน;Y )Y 1. ถUาม;คZาส)ง this() ใน constructor ก5จะเร;ยกใชU constructor แบบ overloaded ท;สอดคลUองก)บคZาส)ง this() แลUวขUามไปข)Yนตอนท; 4 2. เร;ยกใชU constructor ของ superclass ถUาไมLม;คZาส)ง super() จะเร;ยกใชU constructor แบบ default ยกเวUนคลาสท;ชอ Object จะไมLม;การเร;ยกใชU constructor ของ superclass เนองจากคลาสท;ชอ Object จะไมLม; superclass 3. เร;ยกใชUคZาส)งกZาหนดคLาเรมตUนของคJณล)กษณะของอ5อบเจกต# 4. เร;ยกใชUคZาส)งภายใน constructor ของคลาสท;ใชUนน )Y โปรแกรมท; 6.26 แสดงต)วอยLางคลาสท;ม; constructor ในรVปแบบตLางๆ กรณ;ท;ม;การสรUางอ5อบเจกต#ของคลาส GradStudent โดยใชUคZาส)ง GradStudent s1 = new GradStudent(); จะม;ผลทZาใหU constructor ของคลาส GradStudent ทZางานด)งน;Y 1. เร;ยกใชU constructor ของคลาส GradStudent ท;ม;รVปแบบคZาส)งเปyน GradStudent() 2. เร;ยกใชUคZาส)ง this(“ ”) 200 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 212. 2.1 เร;ยกใชU constructor ของคลาส GradStudent ท;ม;รVปแบบเปyน GradStudent(String n) โดยท;จะสLงขUอความ “ ” ใหUก)บ argument ท;ชอ n 2.2 เนองจากไมLม;คZาส)ง this() จxงขUามข)Yนตอนน;ไปY 2.3 เร;ยกใชU constructor ของคลาส Student จากคZาส)ง super(n) 2.3.1 เร;ยกใชU constructor ของคลาส Student ท;ม;รVปแบบคZาส)งเปyน Student(String n) 2.3.2 เนองจากไมLมคZาส)ง this() จxงขUามข)นตอนน;Yไป ; Y 2.3.3 เร;ยกใชU constructor ของคลาสท;ชอ Object ท;เปyน constructor แบบ default 2.3.3.1 เร;ยกใชU constructor แบบ default ของคลาสท;ชอ Object 2.3.3.2 เนองจากไมLมคZาส)ง this() จxงขUามข)นตอนน;Yไป ; Y 2.3.3.3 เนองจากคลาสท;ชอ Object ไมLม; superclass จxงขUามข)Yนตอนของการเร;ยก constructor ของ superclass 2.3.3.4 ไมLม;คZาส)งกZาหนดคLาเรมตUนของคJณล)กษณะของคลาสท;ชอ Object 2.3.3.5 ไมLม;คZาส)งภายใน constructor ของคลาสท;ชอ Object 2.3.4 เร;ยกใชUคZาส)งกZาหนดคLาเรมตUนของคJณล)กษณะของอ5อบเจกต#ในคลาส Student 2.3.5 เร;ยกใชUคZาส)ง name ใน constructor ของคลาส Student = n 2.4 เร;ยกใชUคZาส)งกZาหนดคLาเรมตUนของคJณล)กษณะของอ5อบเจกต#ในคลาส GradStudent 2.5 ไมLมคZาส)งอนๆ ภายใน constructor ของคลาส GradStudent ; โปรแกรมท 6.26 ต)วอยLางคลาสท;ม; constructor ในรVปแบบตLางๆ public class Student { protected String name; public Student(String n) { name = n; } } ----------------------------------------------------------------------------------------------------------------------------------------------------- public class GradStudent extends Student { public GradStudent(String n) { super(n); } public GradStudent() { this(" "); } } ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 201
  • 213. 6.6 เมธอดของคลาสทชอ Object คลาสท;ชอ Object จะเปyนคลาสท;ทJกๆ คลาสจะสบทอดมา คลาสท;ชอ Object ม;เมธอดท;สZาค)ญหลายเมธอด อาทเชLน toString()และ equals() ในการท;จะสามารถใชUงานเมธอดเหลLาน;YไดUจะตUองม;การเข;ยนคZาส)งเพอกZาหนด ใหUเปyนเมธอดแบบ overridden ในคลาสท;ตUองการ 6.6.1 เมธอด toString() เมธอด toString() เปyนเมธอดท;ใชUในการแปลงคLาของอ5อบเจกต#ใหUเปyนขUอมVลชนด String คลาสท;อยVLใน Java API เชLนคลาส Date ไดUกZาหนดคZาส)งสZาหร)บเมธอด toString() ไวUแลUว ด)งน)นการเร;ยกใชUเมธอด Y System.out.println() โดยท; argument เปyนอ5อบเจกต#ของคลาส Date จะทZาใหUม;การเร;ยกใชUเมธอด toString() ของคลาส Date โดยอ)ตโนม)ต ต)วอยLางเชLนคZาส)ง Date d = new Date(); System.out.println(d); จะไดUผลล)พธ#เปyนขUอความท;ระบJวนเดอนป}ของอ5อบเจกต# d ) โปรแกรมท; 6.27 แสดงต)วอยLางของคลาส Student ท;ม;เมธอดแบบ overridden ท;ชอ toString() เพอ กZาหนดขUอความท;สLงกล)บมาเมอม;การเร;ยกใชUเมธอดด)งกลLาว คZาส)ง System.out.println(s1) จะเร;ยกใชUเมธอด toString() เพอสLงขUอความท;เปyนคJณล)กษณะ name กล)บมาแลUวแสดงผลล)พธ#ออกทางจอภาพด)งแสดงในรVปท; 6.5 โปรแกรมท 6.27 ต)วอยLางของคลาสท;ม;เมธอดแบบ overridden ท;ชอ toString() public class Student { private String name; public Student(String n) { name = n; } public String toString() { return name; } } ------------------------------------------------------ public class TestToString { public static void main(String args[]) { Student s1 = new Student("Thana"); System.out.println(s1); } } 202 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 214. รปท 6.5 ผลลพธทได*จากการรนโปรแกรมท6.27 6.6.2 เมธอด equals() เมธอด equals()เปyนเมธอดในคลาสท;ชอ Object เพอเปร;ยบเท;ยบวLาอ5อบเจกต#นม;คLาเทLาก)บอ5อบเจกต#ของท; ;Y สLงผLานมาทาง argument หรอไมL คลาสท;จะสามารถเร;ยกใชUเมธอดน;YไดUจะตUองกZาหนดเมธอดแบบ overridden สZาหร)บเมธอดน;อยVLในคลาสน)นดUวย โปรแกรมท; 6.28 แสดงต)วอยLางของคลาส Student ท;ม;เมธอดแบบ overridden Y Y ท;ชอ equals() เพอกZาหนดวธ;การเปร;ยบเท;ยบอ5อบเจกต# โดยเมธอดน;YจะใหUคLาเปyน true ถUาอ5อบเจกต#ท;สLงผLานมาทาง argument ม;คLาของคJณล)กษณะ name เทLาก)บคLาของคJณล)กษณะ name ของอ5อบเจกต#น;Y โปรแกรมน;จะใหUผลล)พธ#ด)ง Y แสดงในรVปท; 6.6 โปรแกรมท( 6.28 ต)วอยางของคลาสท%ม%เมธอดแบบ overridden ท%ชอ equals() public class Student { private String name; public Student(String n) { name = n; } public boolean equals(Object obj) { if (obj instanceof Student) { if (((Student)obj).name == name) { return true; } } return false; } } ------------------------------------------------------ public class TestEquals { public static void main(String args[]) { Student s1 = new Student("Thana"); Student s2 = new Student("Thana"); System.out.println(s1.equals(s2)); } } ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 203
  • 215. รปท 6.6 ผลลพธทได*จากการรนโปรแกรมท 6.28 6.7 คลาสประเภท Wrapper คลาสประเภท Wrapper เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;ม;คJณล)กษณะสอดคลUองก)บชนดขUอมVลแบบพYน ฐานท)Yงแปดชนด โดยภาษาจาวาไดUกZาหนดคลาสท;อยVLในแพคเก5จ java.lang ท;เปyนคลาสประเภท Wrapper ไวUแปด คลาส ด)งแสดงในตารางท; 6.2 คลาสประเภท Wrapper จะชLวยในการสรUางอ5อบเจกต#ท;เก5บชนดขUอมVลแบบพYนฐานไวU ในคอลเล5กช)นแบบ Heterogeneous ท;จะกลLาวถxงในบทท; 8 โปรแกรมท; 6.29 แสดงต)วอยLางการใชUคลาสประเภท Wrapper ซxงในต)วอยLางน;YไดUสรUางอ5อบเจกต#ของคลาส ประเภท Wrapper เพอเก5บชนดขUอมVลแบบพYนฐานสามคLา คอ true, ‘A’ และ 1.234 และไดUพมพ#คาของอ5อบเจกต# L ท)Yงสามออกมา โดยจะไดUผลล)พธ#ด)งแสดงในรVปท; 6.7 ตารางท 6.2 คลาสประเภท Wrapper ชนดขUอมVล ชอคลาส boolean Boolean byte Byte short Short int Integer long Long float Float double Double char Character 204 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 216. โปรแกรมท 6.29 ต)วอยLางการใชUคลาสประเภท Wrapper public class ShowWrapper { public static void main(String args[]) { Boolean b = new Boolean(true); Character c = new Character('A'); Double d = new Double(1.234); System.out.println(b); 1 System.out.println(c); System.out.println(d); } } รปท 6.7 ผลลพธทได*จากการรนโปรแกรมท 6.29 6.7.1 Autoboxing ภาษาจาวาต)YงแตLงเวอร#ช)น Java SE 5 ไดUเพมคZาส)ง Auto-boxing และ Auto-unboxing ซxงสามารถแปลงคLา ระหวLางชนดขUอมVลพYนฐานก)บ คลาสประเภท Wrapper ท;สอดคลUองก)นไดUโดยอ)ตโนม)ต คZาส)ง Autoboxing คอการ แปลงจากชนดขUอมVลพYนฐานเชLน int ไปเปyนคลาสประเภท Wrapper เชLน Integer สLวนคZาส)ง Auto-unboxing คอการ แปลงจากคลาสประเภท Wrapper เชLน Byte ไปเปyนชนดขUอมVลพYนฐานเชLน byte โปรแกรมท; แสดงต)วอยLางการใชUคZาส)ง Auto-boxing ในการแปลงคLา int ท;ม;คLาเปyน 1 ใหUก)บอ5อบเจกต#ของ คลาส Integer ท;ชอ myInt และใชUคZาส)ง Auto-unboxing เพอแปลงคLากล)บมาในต)วแปรชนดขUอมVลพYนฐานท;ชอ i โดยจะไดUผลล)พธ#ด)งรVปท; 6.8 ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 205
  • 217. โปรแกรมท 6.30 ต)วอยLางการใชUคZาส)ง Auto-boxing/Auto-unboxing public class ShowWrapper { public static void main(String []args) { Integer myInt = 1; // int into Integer System.out.println(myInt); int i = myInt + 3; // mix Integer and int System.out.println(i); } } รปท 6.8 ผลลพธทได*จากการรนโปรแกรมท 6.30 6.8 คย.เว,ร.ดอนๆ ทสDาคญ ภาษาจาวาไดUกZาหนดค;ย#เวร#ดท;เก;ยวขUองก)บคลาส เมธอด และคJณล)กษณะท;สZาค)ญไวUสองต)วคอ static และ final ค;ย#เวร#ด static เปyนค;ย#เวร#ดเพอระบJวLาต)วแปรหรอคLาคงท;ใดเปyนคJณล)กษณะของคลาสหรอเมธอดใดเปyน เมธอดของคลาส สLวนค;ย#เวร#ด final จะใชUในคลาส และเมธอดเพอกZาหนดไมLใหUม;การสบทอด หรอใชUในคJณล)กษณะ เพอกZาหนดใหUเปyนคLาคงท; 6.8.1 ค%ณลกษณะแบบ static คJณล)กษณะของคลาสจะเปyนคJณล)กษณะท;ใชUรวมก)นในทJกอ5อบเจกต# และสามารถเร;ยกใชUงานไดUโดยไมLจZาเปyน L ตUองสรUางอ5อบเจกต#ของคลาสขxYนมากLอน ต)วแปรหรอคLาคงท;ท;เปyนคJณล)กษณะของคลาสคอต)วแปรหรอคLาคงท;ซxงม; modifier เปyน static คJณล)กษณะของคลาสน;จะเปyนต)วแปรหรอคLาคงท;ซxงใชUรLวมก)นในทJกอ5อบเจกต# โดยจะแตก Y ตLางจากต)วแปรหรอคLาคงท;ท;เปyนคJณล)กษณะของอ5อบเจกต# ซxงอาจม;คาแตกตLางก)นไดUในแตLละอ5อบเจกต# โปรแกรมท; L 206 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 218. 6.31 แสดงต)วอยLางการใชUค;ย#เวร#ด static เพอประกาศต)วแปรท;เปyนคJณล)กษณะของคลาส ในกรณ;นต)วแปร ;Y counter จะม;อยVLเพ;ยงต)วเด;ยวและทJกอ5อบเจกต#ใชUตวแปรน;รLวมก)น ด)งน)Yนจxงสามารถท;จะเร;ยกใชUไดUโดยระบJชอคลาส ) Y (Student.counter) โปรแกรมน;YจะใหUผลล)พธ#ท;ม;คาเทLาก)นด)งแสดงในรVปท; 6.9 L โปรแกรมท 6.31 ต)วอยLางการใชUค;ย#เวร#ด static public class Student { static int counter; public Student() { counter++; } } ------------------------------------------------------------ public class TestStatic { public static void main(String args[]) { Student s1 = new Student(); Student s2 = new Student(); System.out.println(Student.counter); System.out.println(s1.counter); System.out.println(s2.counter); } } รปท 6.9 ผลลพธทได*จากการรนโปรแกรมท 6.31 6.8.2 เมธอดแบบ static เมธอดแบบ static คอเมธอดท;ม; modifier เปyน static โดยท)วไปเราจะประกาศเมธอดใดๆ ใหUเปyนเมธอด แบบ static ในกรณ;ท;เมธอดน)นเปyนเมธอดท;ใชUงานท)วไป (Utility Method) เราสามารถท;จะเร;ยกใชUเมธอดแบบ Y static ไดUโดยเร;ยกผLานชอคลาสเชLนเด;ยวก)บคJณล)กษณะของคลาส ซxงม;รVปแบบการใชUงานด)งน;Y ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 207
  • 219. ClassName.methodName() โดยท; • className คอชอของคลาส • methodName คอชอของเมธอดแบบ static ต)วอยLางของเมธอดแบบ static คอเมธอดทJกเมธอดในคลาส Math ท;อยVLใน Java API ท)Yงน;Yเนองจากเมธอด เหลLาน;จ)ดวLาเปyนเมธอดสZาหร)บใชUงานท)วไปจxงกZาหนดใหUเปyนเมธอดแบบ static ทZาใหUเราสามารถท;จะเร;ยกใชUเมธอด Y เหลLาน;ไดUโดยใชUชอคลาส เชLนคZาส)ง Y Math.sqrt(4); เปyนคZาส)งคZานวณหาคLารากท;สองของ 4 เปyนตUน เมธอดท;ชอ main()เปyนอ;กต)วอยLางหนxงของเมธอดแบบ static ท)Yงน;YเนองจากภาษาจาวาไมLตUองการใหU JVM ตUองสรUางอ5อบเจกต#ของคลาสท;ม;เมธอด main() ขxYนมากLอนเพอร)นเมธอด main() จxงไดUกZาหนดใหU main() เปyนเมธอดแบบ static ภาษาจาวาไดUกZาหนดเงอนไขของเมธอดแบบ static ท;สZาค)ญไวUด)งน;Y • เมธอดแบบ static จะไมLสามารถเร;ยกคJณล)กษณะหรอเมธอดท;ไมLไดUเปyนแบบ static (non-static) ไดU • เมธอดแบบ static จะไมLสามารถม;เมธอดแบบ overridden ไดU 6.8.3 Static Initializer คอบล5อกในคลาสใดๆ ท;อยVLนอกเมธอด และม;ค;ย#เวร#ด static เพอนยามใหUเปyนบล5อก Static Initializer แบบ static โดยม;รVปแบบด)งน;Y static { ... } โปรแกรมภาษาจาวาจะร)นคZาส)งท;อยVLในบล5อกแบบ static เพ;ยงคร)Yงเด;ยวเมอ JVM โหลดคลาสท;ม;บล5อกด)ง กลLาวขxนมา Static Initializer จะใชUในการด;บ)ก (debug) โปรแกรมหรอใชUในกรณ;ท;ตUองการสรUางอ5อบเจกต#ของคลาส Y ขxYนโดยอ)ตโนม)ต เราสามารถท;จะกZาหนดบล5อกแบบ static ไดUมากกวLาหนxงบล5อกในคลาสแตLละคลาส โดยการ ทZางานของโปรแกรมจะเร;ยกคZาส)งในบล5อกแบบ static จากบนลงลLาง โปรแกรมท; 6.32 แสดงต)วอยLางของคลาสท;ม; 208 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 220. Static Initializer ซxงโปรแกรมน;จะใหUผลล)พธ#ด)งแสดงในรVปท; 6.10 Y โปรแกรมท 6.32 ต)วอยLางของคลาสท;ม; Static Initializer public class TestStaticBlock { static int x=5; static { x += 1; } public static void main(String args[]) { System.out.println("x = "+x); } static { x /= 2; } } รปท 6.10 ผลลพธทได*จากการรนโปรแกรมท 6.32 6.8.4 คย.เว,ร.ด final ค;ย#เวร#ด final สามารถท;จะใชUเปyน modifier สZาหร)บคลาส ต)วแปร และเมธอด โดยท; • คลาสท;ม; modifier เปyน final จะเปyนคลาสท;ไมLสามารถใหUคลาสอนสบทอดไดUต)วอยLางเชLน คลาส String ท;กZาหนดใน Java API เปyนคลาสแบบ final ซxงม;รVปแบบคZาส)งประกาศคลาสด)งน;Y public final class String { ... } ด)งน)นเราจxงไมLสามารถท;จะกZาหนดใหUคลาสใดๆ สบทอดคลาส String ไดU Y • เมธอดท;ม; modifier เปyน final คอเมธอดท;จะไมLสามารถม;เมธอดแบบ overridden ไดU ต)วอยLางเชLนถUา คลาส Student กZาหนดใหUเมธอด showDetails() ม; modifier เปyน final ด)งน;Y ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 209
  • 221. public class Student{ ... public final void showDetails(){ ... } } ด)งน)นถUาคลาส GradStudent สบทอดมาจากคลาส Student จะไมLสามารถม;เมธอดแบบ overridden ท;ชอ Y showDetails() ไดU • ต)วแปรท;ม; modifier เปyน final คอคLาคงท; คLาคงท;จะสามารถกZาหนดคLาไดUเพ;ยงคร)Yงเด;ยว โดยจะตUองม; การกZาหนดคLากLอนท;จะม;การเร;ยกใชUงาน ซxงเมอกZาหนดคLาแลUวจะไมLสามารถเปล;ยนแปลงคLาไดU ถUาคLาคงท; น)นเปyนคJณล)กษณะของอ5อบเจกต# เราจะตUองกZาหนดคLาในคZาส)งประกาศต)วแปร หรอใชUคZาส)งกZาหนดคLา Y ภายใน constructor ของคลาส แตLถUาเปyนคLาคงท;ซxงอยVLภายในเมธอด เราจะตUองกZาหนดคLาในคZาส)งประกาศ ต)วแปร หรอใชUคZาส)งกZาหนดคLาภายในเมธอดกLอนท;จะม;การเร;ยกใชUงานคLาคงท;นน )Y 6.9 คลาสภายใน คลาสภายใน (Inner Class) คอคลาสท;ประกาศอยVLภายในคลาสอนๆ ซxงบางคร)Yงเร;ยกวLาคลาสแบบซUอน (Nested Class) คลาสภายในอนJญาตใหUประกาศคJณล)กษณะหรอเมธอดภายในคลาสอนไดU คลาสภายในม;ประโยชน# ในกรณ;ท;ตUองการจะจ)ดกลJLมของคลาสท;ตUองทZางานรLวมก)น โดยตUองการควบคJมไมLใหUม;การเขUาถxงโดยตรงจากคลา สอนๆ และตUองการเร;ยกใชUคJณล)กษณะหรอเมธอดของคลาสท;อยVLภายนอกไดUโดยตรง ภาษาจาวาแบLงคลาสภายในออกเปyนสองแบบคอ 1. คลาสภายในท;อยVLภายในคลาสโดยตรง 2. คลาสภายในท;อยVLภายในเมธอด 6.9.1 คลาสภายในทอย0ภายในคลาส กรณ;น;Yเปyนการประกาศคลาสภายในคลาสอนท;เร;ยกวLา คลาสภายนอก (Outer class) โปรแกรมท; 6.33 เปyน ต)วอยLางของการประกาศคลาสภายในท;ชอ Inner ซxงถVกประกาศอยVLภายในคลาสท;ชอ Outer คลาสภายในจะแตกตLาง ก)บคลาสท)วๆ ไปตรงท;เราสามารถท;จะประกาศใหUคลาสภายในม; access modifier เปyน public, private, default หรอ protected ก5ไดU ขณะท;คลาสท)วๆ ไปจะกZาหนดใหUเปyนไดUเฉพาะ public หรอ default เทLาน)น Y นอกจากน;YการสรUางอ5อบเจกต#ของคลาสภายในย)งม;ขUอแตกตLางด)งน;Y 210 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 222. 1. การสรUางอ5อบเจกต#ของคลาสภายในนอกคลาสภายนอก จะตUองทZาการสรUางอ5อบเจกต#ของคลาสภายนอก กLอน แลUวจxงสรUางอ5อบเจกต#ของคลาสภายในไดU ต)วอยLางเชLนคZาส)ง Outer.Inner in2 = new Outer().new Inner(); ในโปรแกรมท; เปyนต)วอยLางการสรUางอ5อบเจกต#ของคลาสภายในท;ชอ in2 (กรณ;นจะไมLสามารถสรUาง ;Y อ5อบเจกต#ของคลาสภายในไดU ถUาคลาสภายในม; modifier เปyน private) 2. การสรUางอ5อบเจกต#ภายในเมธอดท;อยVLในคลาสภายนอกสามารถทZาไดUโดยตรง เชLน เด;ยวก)บการสรUาง อ5อบเจกต#ท)วๆ ไป ต)วอยLางเชLนถUาเมธอด methodX() เปyนเมธอดในคลาสภายนอก และตUองการจะสรUาง อ5อบเจกต#ของคลาสภายใน เราสามารถทZาไดUด)งน;Y public void methodX() { ... Inner in1 = new Inner(); } คลาสท;อยVLภายในสามารถท;จะเร;ยกใชUคJณล)กษณะ และเมธอดของคลาสภายนอกไดU โปรแกรมท; 6.33 แสดง ต)วอยLางของการเร;ยกใชUและประกาศต)วแปรของคลาสภายในและภายนอก ต)วอยLางน;จะม;ต)วแปรชอเด;ยวก)นซxงม; Y ขอบเขตท;ตLางก)น โปรแกรมท 6.33 ต)วอยLางแสดงคลาสภายในท;อยVLภายในคลาส public class Outer { public void method1() { Inner in1 = new Inner(); in1.method2(); } public class Inner { public void method2() { System.out.println("Inner Demo"); } } } -------------------------------------------------------- public class InnerDemo { public static void main(String args[]) { Outer.Inner in2 = new Outer().new Inner(); in2.method2(); } } ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 211
  • 223. 6.9.2 คลาสภายในทอย0ภายในเมธอด กรณ;น;Yเปyนการประกาศคลาสภายในท;อยVLภายในเมธอดของคลาสภายนอกด)งต)วอยLางท;แสดงในโปรแกรมท; 6.34 คลาสภายในประเภทน;จะม; access modifier เปyน default เราจะไมLสามารถท;จะสรUางอ5อบเจกต#ของคลาส Y ภายในประเภทน;นอกเมธอดท;ประกาศคลาสไดU และจะสามารถเร;ยกใชUต)วแปรภายในของเมธอดไดUในกรณ;ท;ต)วแปร Y น)นประกาศเปyน final เทLาน)น สLวนต)วแปรท;เปyนคJณล)กษณะของคลาสหรอคJณล)กษณะของอ5อบเจกต# สามารถท;จะ Y Y เร;ยกใชUไดUเชLนเด;ยวก)บคลาสภายในท;อยVLภายในคลาส คลาสภายในท)Yงสองประเภทย)งม;คJณสมบ)ตอนๆ ท;สZาค)ญด)งน;Y • คลาสภายในอาจเปyนคลาสแบบ abstract หรออนเตอร#เฟสไดU • คลาสภายในท;อยVLภายในคลาสภายนอกโดยตรง ถUาม; modifier เปyน static จะกลายเปyนคลาสปกต และ สามารถสรUางอ5อบเจกต#โดยการเร;ยกชอของคลาสภายนอกไดUด)งน;Y Outer.Inner in3 = new Outer.Inner(); • คลาสภายในไมLสามารถท;ประกาศใหUม;คJณล)กษณะหรอเมธอดเปyนแบบ static ไดUเวUนแตLคลาสภายในจะ เปyนคลาสแบบ static • คลาสภายในสามารถท;จะใชUต)วแปรท;เปyนคJณล)กษณะของคลาสหรอคJณล)กษณะของอ5อบเจกต#ของคลาส ภายนอกไดU โปรแกรมท 6.34 คลาสภายในท;อยVLภายในเมธอด public class MOuter { private int a = 1; public void method(final int b) { final int c = 2; int d = 3; class Inner { private void iMethod() { System.out.println("a = "+a); System.out.println("b = "+b); System.out.println("c = "+c); System.out.println("d = "+d); //illegal } } } } 212 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 224. 6.10 Generic Types เราสามารถท;จะประกาศคลาสหรออนเตอร#เฟสใดๆใหUม;ชนดขUอมVลเปyนแบบท)วไป (Generic Type) แลUวคLอย ระบJชนดขUอมVลแบบเจาะจงตอนท;สรUางอ5อบเจกต#ไดU โดยการใชUต)วแปรชนดขUอมVล (type variable) ซxงม;รVปแบบการ ใชUงานด)งน;Y public class ClassName(TypeVariable) โดยท; • ClassName คอชอของคลาส • TypeVariable คอชอของต)วแปรชนดขUอมVล โปรแกรมท; 6.35 แสดงต)วอยLางคลาสท;ชอ Box ท;ม;คJณล)กษณะท;ใชU Generic Type โดยประกาศต)วแปรชนด ขUอมVลท;ชอ T ซxงจะเห5นไดUวาคJณล)กษณะท;ชอ t ม;ชนดขUอมVลแบบ T ท;ย)งไมLไดUระบJวาเปyนชนดใดท;ช)ดเจน เราสามารถ L L ท;จะระบJชนดขUอมVลไดUเมอม;การประกาศและสรUางอ5อบเจกต#ของคลาสน;Y อาทเชLนคZาส)ง Box<Integer> integerBox; เปyนการประกาศอ5อบเจกต#ท;ชอ integerBox ของคลาส Box ท;ม;ชนดขUอมVลเปyน Integer ซxงเราสามารถสรUาง อ5อบเจกต#ของคลาสน;โดยใชUคZาส)ง Y integerBox = new Box<Integer>(); หรอสามารถท;จะประกาศและสรUางอ5อบเจกต#ในคZาส)งเด;ยวก)นด)งน;Y Box<Integer> integerBox = new Box<Integer>(); หรอหากท;ตUองการจะใชUชนดขUอมVลอน เราก5สามารถท;จะประกาศและสรUางอ5อบเจกต#โดยระบJชนดขUอมVลท; ตUองการอาทเชLน Box<Byte> byteBox = new Box<Byte>(); เปyนการประกาศและสรUางอ5อบเจกต#ชอ byteBox ของคลาส Box ท;ม;ชนดขUอมVลเปyน Byte โปรแกรมท; 6.35 ไดUแสดงต)วอยLางของคลาส BoxDemo ท;แสดงการใชUงานคลาส Box ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 213
  • 225. โปรแกรมท 6.35 ต)วอยLางแสดงคลาสท;ใชU Generic Type public class Box<T> { private T t; public void add(T t) { this.t = t; } public T get() { return t; } } ----------------------------------------------------------- public class BoxDemo { public static void main(String[] args) { Box<Integer> integerBox = new Box<Integer>(); integerBox.add(new Integer(10)); Integer someInteger = integerBox.get(); // no cast! System.out.println(someInteger); } } 6.10.1 เมธอดแบบ Generic เราสามารถท;จะใชU Generic Type ก)บเมธอดหรอ constructor ใดๆก5ไดU ในกรณ;ท;เราตUองการท;จะใหUเมธอด หรอ constructor ม; argument ท;ร)บชนดขUอมVลใดๆก5ไดUโดยม;รVปแบบด)งน;Y [modifier] <TypeVariable> return_type methodName(TypeVaraible varName) { [method_body] } โดยท; • TypeVariable คอชอของต)วแปรชนดขUอมVล • varName คอชอ argument โปรแกรมท; 6.36 แสดงต)วอยLางของคลาส BoxMethod ท;ม;เมธอดท;ชอ inspect ทโดย argument ชอ u เปyน Generic Type แลUวคZาส)งของเมธอด main ในคลาส BoxMethodDemo มาเร;ยกใชUโดยการกZาหนดใหUเปyนชนด Double (คLาทศนยม 3.2 ถVกแปลงใหUเปyนคลาส Double โดยคZาส)ง auto-boxing) โดยจะไดUผลล)พธ#ของการร)น โปรแกรมด)งรVปท; 6.11 214 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 226. โปรแกรมท 6.36 ต)วอยLางแสดงคลาสท;ประกาศเมธอดแบบ Generic public class BoxMethod { public <U> void inspect(U u) { System.out.println("U: " + u.getClass().getName()); } } ------------------------------------------------------- public class BoxMethodDemo { public static void main(String[] args) { BoxMethod box = new BoxMethod(); box.inspect(3.2); } } รปท 6.11 ผลลพธทได*จากการรนโปรแกรมท 6.36 6.11 Annotation ภาษาจาวาม;คZาส)ง annotation (เครองหมาย @)) ซxงจะใหUขUอมVลเก;ยวก)บโปรแกรม โดยท;จะไมLม;ผลโดยตรง ตLอคZาส)งใดๆ ของ code ท;ทZาการบ)นทxก (annotate) อยVL เราสามารถท;จะกZาหนดคZาส)ง annotation ในการประกาศ คลาส คJณล)กษณะ เมธอด หรอสLวนอนๆ ของโปรแกรม โดยท)วไป annotation จะถVกใชUงานในกรณ;ตLางๆ ด)งน;Y • เปyนขUอมVลสZาหร)บคอมไพเลอร# เพอตรวจจ)บขUอผดพลาดหรอ warning ของโปรแกรม • ชLวยในกระบวนการข)นตอนการคอมไพล#และตดต)Yง (deployment) ท)Yงน;ซอฟต#แวร#ในการคอมไพล# Y Y สามารถท;จะประมวลผลขUอมVล annotation ในการสรUางโคUดท;เ ปyนไฟล# XML ไดU • ชLวยในกระบวนการข)นตอน runtime ท)Yงน;Yจาก annotation บางคZาส)งจะสามารถตวรสอบไดUในชLวง Y runtime คZาส)ง annotation @ ม)กจะถVกประกาศเปyนคZาส)งแรก ตามดUวยชอของ annotation ซxงอาจม; element ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 215
  • 227. ท;ม; named หรอ unnamed valued ต)วอยLางเชLน @Author( name = "Benjamin Franklin", date = "3/27/2003" ) class MyClass() { } คอ annotation ชอ author ท;ม; element สองต)วท;เปyน named valued คอ name และ date หรอคZาส)ง @SuppressWarnings(value = "unchecked") void myMethod() { } คอ annotation ท;ชอ SuppressWarnings ท;อยVLหนUาเมธอดท;ม; element เปyน named value ชอ values ซxง ในกรณ;น;Yเนองจากม; element เด;ยว ด)งน)นเราอาจไมLจZาเปyนตUองกZาหนดชอ (unnamed value) ด)งน;Y Y @SuppressWarnings("unchecked") void myMethod() { } ในกรณ;ท;ไมLม; element ใดเลย เราไมLจZาเปyนตUองใสLเครองหมายวงเล5บหล)ง annotation ด)งน;Y @Override void mySuperMethod() { } 6.11.1 Annotation Document เราสามารถท;จะนZาคZาส)ง annotation มาใชUในการท;จะเข;ยน document ของ source code อาทเชLน แทนท;จะ ตUองเข;ยน comment ของคลาสตLอไปน;Yในล)กษณะด)งน;Y public class Generation3List extends Generation2List { // Author: John Doe // Date: 3/17/2002 // Current revision: 6 // Last modified: 4/12/2004 // By: Jane Doe // Reviewers: Alice, Bill, Cindy 216 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 228. // class code goes here } เราสามารถท;จะกZาหนด annotation type ของอนเตอร#เฟสขxYนมาหนxงต)วด)งน;Y @interface ClassPreamble { String author(); String date(); int currentRevision() default 1; String lastModified() default "N/A"; String lastModifiedBy() default "N/A"; String[] reviewers(); // Note use of array } จากน)นสรUางคลาสโดยกZาหนดคLาของ annotation ด)งต)วอยLางน;Y Y @ClassPreamble ( author = "John Doe", date = "3/17/2002", currentRevision = 6, lastModified = "4/12/2004", lastModifiedBy = "Jane Doe", reviewers = {"Alice", "Bob", "Cindy"} // Note array notation ) public class Generation3List extends Generation2List { // class code goes here } 6.11.2 Annotation ทใชโดยคอมไพเลอร. ภาษาจาวาไดUกZาหนด annotation สZาหร)บคอมไพเลอร#ไวUสามคZาส)งคอ @Depreacted, @Override และ @Suppresswarnings โดยคZาส)ง annotation เหลLาน;Yม;การทZางานด)งน;Y • @Deprecated เราจะใชU annotation น;Y ในกรณ;ท;ตUองการระบJวLาคZาส)งเชLนคลาส เมธอด หรอคJณล)กษณะ ใด เปyนคZาส)งท;ไมLควรจะใชUแลUว เพอใหUคอมไพเลอร#สLงคZาส)ง warning ออกมาในชLวงการคอมไพล# โปรแกรม ต)วอยLางเชLน // Javadoc comment follows /** * @deprecated * explanation of why it was deprecated */ ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 217
  • 229. @Deprecated static void deprecatedMethod() { } • @Override เราจะใชU annotation น;Yเพอจะบอกคอมไพเลอร#วา element น;Y override คZาส)ง element ของ L superclass ต)วอยLางเชLน // mark method as a superclass method // that has been overridden @Override int overriddenMethod() { } • @SuppressWarnings เราจะใชU annotation น;Yเพอบอกคอมไพเลอร#ไมLตUองแสดงคZาส)ง warning ท;อาจ ปรากฎขxนจากการใชUคZาส)งท;ตามมาน;YในชLวงการคอมไพล#โปรแกรม ต)วอยLางเชLน Y // use a deprecated method and tell // compiler not to generate a warning @SuppressWarnings("deprecation") void useDeprecatedMethod() { objectOne.deprecatedMethod(); //deprecation warning-suppressed } สร%ปเนอหาของบท • เมธอดท;กZาหนดขxYนในคลาสใดๆ สามารถเร;ยกใชUงานไดUสองรVปแบบคอ การเร;ยก ใชUงานจากคลาสท;ตLางก)น และการเร;ยกใชUงานภายในคลาสเด;ยวก)น • เมธอดท;กZาหนดขxYนในคลาสอาจม; argument ท;ร)บคLาเพอนZาไปใชUในเมธอด • เมธอดใดๆ ของคลาสสามารถท;จะม;คLาท;สLงกล)บมาไดU ท)Yงน;การประกาศเมธอดจะตUองระบJชนดขUอมVลของ Y คLาท;จะสLงกล)บ • เมธอดสามารถแบLงเปyนเมธอดของอ5อบเจกต# (หรอเร;ยกวLาเมธอดแบบ non-static) และเมธอดของคลาส (หรอเร;ยกวLาเมธอดแบบ static) • เมธอดของคลาสใดท;ม; modifier เปyนแบบ static จะทZาใหUสามารถถVกเร;ยกใชUงาน โดยใชUชอของคลาส น)นไดUเลย Y • เมธอดแบบ overloaded คอ ม;เมธอดท;ม;ชอเด;ยวก)นแตLจะม;จZานวนหรอชนดขUอมVลของ argument ท;ตLาง ก)น • โดยท)วไป คJณล)กษณะของคลาสจะม; modifier เปyนแบบ private ท)Yงน;Yเพอป‚องก)นการเขUาถxงจากคลาส 218 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 230. อน • โดยท)วไป เมธอดของคลาสจะม; modifier เปyนแบบ public ท)Yงน;YเพอใหUเมธอดจากคลาสอนเร;ยกใชUไดU • ชอของเมธอดท;เก;ยวขUองก)บคJณล)กษณะของคลาส นยมใชU setXxx สZาหร)บ เมธอดท;ม;ไวUเพอกZาหนดคLาใหU ก)บคJณล)กษณะ xxx และใชU getXxx สZาหร)บ เมธอดท;จะสLงคLากล)บเปyนคJณล)กษณะ xxx • ค;ย#เวร#ด protected จะทZาใหUคลาสท;เปyน subclass สามารถท;จะอUางองถxงคJณล)กษณะหรอเมธอดของ superclass ไดU • คลาสทJกคลาสในภาษาจาวาถUาไมLไดUสบทอดจากคลาสใดเลย จะถอวLาคลาสน)นสบทอดจากคลาสท;ชอ Y Object • super เปyนค;ย#เวร#ดท;ใชUในการอUางองถxง superclass เพอท;จะเร;ยกใชUเมธอดหรอ constructor ของ superclass • การม;ไดUหลายรVปแบบหมายถxง − การท;เราสามารถท;จะสรUางหรออUางถxงอ5อบเจกต#ของคลาสท;สบทอดก)นไดUหลายรVปแบบ − การท;เราสามารถท;จะอUางถxงเมธอดชอเด;ยวก)นไดUหลายรVปแบบ • เมธอดแบบ overloaded หมายถxงเมธอดท;ม;ชอเด;ยวก)นมากกวLาหนxงเมธอด โดยม;จZานวนหรอชนดของ argument ท;แตกตLางก)น • เมธอดแบบ overridden หมายถxงการท; subclass สรUางเมธอดท;ม;อยVLแลUวใน superclass ขxYนใหมL โดยใชUชอ argument และชนดขUอมVลของคLาท;สLงกล)บของเมธอดเหมอนเดม • ค;ย#เวร#ด instanceof เปyนต)วดZาเนนการท;ใชUก)บอ5อบเจกต#และคลาส เพอตรวจสอบวLาอ5อบเจกต#ใดๆ เปyน อ5อบเจกต#ของคลาสท;ระบJหรอไมL • การ casting อ5อบเจกต# ทZาใหUเราสามารถจะกZาหนดอ5อบเจกต#ของคลาสท;เปyน superclass ใหUก)บต)วแปรท; กZาหนดเปyนคลาสท;เปyน subclass ไดU • Constructor หมายถxง เมธอดท;ม;ชอเด;ยวก)นก)บชอคลาส แตLจะไมLม;การสLงคLากล)บและจะไมLม;การใสL ค;ย#เวร#ด void โดยคลาสทJกคลาสจะม; constructor แบบ default มาใหUอยVLแลUว แตLเราสามารถท;จะกZาหนด constructor ขxนใหมLเองไดU Y • Constructor แบบ overloaded หมายถxง constructor ท;ม;จZานวนหรอชนดของ argument ท;แตกตLางก)น • เมธอดท;ชอ this() เปyนการเร;ยกใชU constructor ของคลาสต)วเอง โดยจะตUองเปyนคZาส)งแรกสJดท;อยVLใน constructor แบบ overloaded • Constructor แบบ default ของคลาสท;เปyน superclass จะถVกเร;ยกใชUโดยอ)ตโนม)ตทJกคร)Yงท;ม;การสรUาง อ5อบเจกต#ของคลาสท;เปyน subclass แตLเราสามารถเปล;ยนใหUไปเร;ยกใชU constructor ต)วอนของ superclass แทนไดUโดยใชUเมธอด super() ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 219
  • 231. • คลาสท;ชอ Object ม;เมธอดท;สZาค)ญอยVLสองเมธอดคอเมธอด toString() และเมธอด equals() • เมธอด toString() ใชUในการแปลงคLาของอ5อบเจกต#ใหUเปyนขUอมVลชนด String สLวนเมธอด equals() ใชUในการเปร;ยบเท;ยบคLาของอ5อบเจกต# • Auto-boxing / Auto-unboxing คอการแปลงคLาระหวLางชนกขUอมVลพYนฐานก)บคลาสประเภท Wrapper ท;สอดคลUองก)นโดยอ)ตโนม)ต • โดยปกตเราจะประกาศเมธอดใดๆ ใหUเปyนเมธอดแบบ static ในกรณ;ท;เมธอดน)นเปyนเมธอดท;ใชUงาน Y ท)วไป และเมธอดแบบ static สามารถถVกเร;ยกใชUจากชอของคลาสไดUโดยไมLจZาเปyนตUองสรUางอ5อบเจกต# • คลาสท;ม; modifier เปyน final จะทZาใหUคลาสอนไมLสามารถสบทอดคลาสน;YไดU และเมธอดท;ม; modifier เปyน final คอเมธอดท;จะไมLสามารถม;เมธอดแบบ overridden ไดU สLวนต)วแปรท;ม; modifier เปyน final คอคLาคงท; ซxงจะทZาใหUสามารถกZาหนดคLาไดUเพ;ยงคร)Yงเด;ยวเทLาน)น Y • คลาสภายในหมายถxงคลาสท;อยVLภายในคลาส หรอคลาสท;อยVLภายในเมธอด • Generic Type สามารถท;จะทZาใหUเราประกาศคลาสหรออนเตอร#เฟสใดๆใหUม;ชนดขUอมVลเปyนแบบท)วไป (Generic Type) แลUวคLอยระบJชนดขUอมVลแบบเจาะจงตอนท;สรUางอ5อบเจกต#ไดU • เมธอดแบบ Generic คดเมธอดท;ม; argument ท;เปyน Generic Type • Annotation จะใหUขUอมVลเก;ยวก)บโปรแกรม โดยท;จะไมLมผลโดยตรงตLอคZาส)งใดๆของ code ท;ทZาการ ; บ)นทxก 220 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
  • 232. บทท 7 การจดการกบเหต%การณ.กราฟ3ก เนYอหาในบทน;YเปyนการแนะนZาวธ;การเข;ยนโปรแกรม เพอจ)ดการก)บเหตJการณ#กราฟmกในโปรแกรม GUI โดย จะเรมตUนจากการแนะนZานยามความหมายของเหตJการณ# แนะนZาคลาสประเภท Event ท;เก;ยวขUองก)บเหตJการณ#กราฟmก ตLางๆ แนะนZาอนเตอร#เฟสประเภท Listener ท;ใชUในการร)บฟwงเหตJการณ# อธบายวธ;การจ)ดการก)บเหตJการณ#กราฟmก หลายๆ เหตJการณ# และตอนทUายของบทเปyนการแนะนZาคลาสประเภท Event Adapter 7.1 เหต%การณ. เหตJการณ# (Event) เปyนสถานการณ#ท;เกดขxนในขณะร)นโปรแกรม อาทเชLน การใชUอนพJต (เมาส#หรอค;ย#บอร#ด) Y ตดตLอก)บโปรแกรม GUI การเกดเหตJการณ#ในโปรแกรมภาษาจาวาจะเปyนการสรUางอ5อบเจกต#ของคลาสประเภท Event ชนดตLางๆ ขxYนมาตามประเภทของเหตJการณ# อาทเชLน - เมอเลอนเมาส#ในเฟรมจะเกดอ5อบเจกต#ของคลาส MouseEvent ขxนมา Y - เมอปmดเฟรมจะเกดอ5อบเจกต#ของคลาส WindowEvent ขxYนมา - เมอกดปJšมท;อยVLในเฟรมจะเกดอ5อบเจกต#ของคลาส ActionEvent ขxYนมา - เมอพมพ#ขUอความใน TextField จะเกดอ5อบเจกต#ของคลาส KeyEvent ขxนมาY คลาสประเภท Event จะสบทอดมาจากคลาส ObjectEvent สLวนคลาสประเภท Event สZาหร)บเหตJการณ# ทางกราฟmกจะม;อยVLสองกลJLมคอ คลาสในแพคเก5จ java.awt.event และ javax.swing.event โดยคลาสประเภท Event ท;ใชUโดยพYนฐานคอคลาสในแพคเก5จ java.awt.event ซxงสLวนประกอบทางกราฟmกท)งในแพคเก5จ AWT และ Swing ตLางก5สามารถท;จะใชUคลาสเหลLาน)นไดU รVปท; 7.1 แสดงคลาสประเภท Event และอนเตอร#เฟสตLางๆ ท;อยVL Y ในแพคเก5จ java.awt.event Java SE ในเวอร#ช)น 1.4 ไดUม;การเพมคลาสประเภท Event และอนเตอร#เฟสตLางๆ ท;เก;ยวขUองสZาหร)บใชUใน อ5อบเจกต#ของคลาสประเภท Swing มากขxYน โดยคลาสและอนเตอร#เฟสเหลLาน;จะอยVLในแพคเก5จ Y javax.swing.event รVปท; 7.3 แสดงต)วอยLางของคลาสประเภท Event ท;อยVLในแพคเก5จด)งกลLาว แตLเนYอหาในบทน;Y จะเนUนเฉพาะการใชUงานของคลาสในแพคเก5จ java.awt.event ท;ม;คZาส)งสLวนใหญLสZาหร)บใชUในอ5อบเจกต#ของคลาส ประเภท Swing ไดU ผศ. ธนศา เครอไวศยวรรณ การจ)ดการก)บเหตJการณ#กราฟmก 221
  • 233. รปท 7.1 คลาสและอนเตอรเฟสของแพคเก-จ java.awt.Event โดยท)วไปองค#ประกอบของเหตJการณ#จะม;สามสLวนด)งแสดงในรVปท; 7.2 คอ 1. Event คออ5อบเจกต#ประเภท Event ตามชนดของเหตJการณ#ท;เกดขxYนเชLน อ5อบเจกต#ของคลาส WindowEvent 2. Event Source คออ5อบเจกต#ท;ทZาใหUเกดเหตJการณ#เชLน อ5อบเจกต#ของคลาส JFrame ท;เปyนสLวนท;ทZาใหU เกดเหตJการณ#การปmดเฟรม 3. Event Handler คออ5อบเจกต#ท;จะทZาหนUาท;จดการก)บเหตJการณ#ท;เกดขxYน โดยม;เมธอดท;จะร)บอ5อบเจกต# ) ประเภท Event ท;เกดขxYนและม;คZาส)งในการจ)ดการก)บเหตJการณ#เพอโตUตอบก)บผVUใชU 222 การจ)ดการก)บเหตJการณ#กราฟmก ผศ. ธนศา เครอไวศยวรรณ
  • 234. รปท 7.2 องคประกอบของเหต(การณ รปท 7.3 คลาสประเภท Event ในแพคเก-จ javax.swing.event 7.2 AWTEvent คลาส AWTEvent เปyน superclass ของคลาสประเภท Event สZาหร)บเหตJการณ#ทางดUานกราฟmกซxงจะม;อยVL ท)Yงหมด 14 คลาสคอ ActionEvent, AdjustmentEvent, ComponentEvent, ItemEvent, InputMethodEvent, InvocationEvent, TextEvent, FocusEvent, WindowEvent, InputEvent, ContainerEvent, PaintEvent, KeyEvent และ MouseEvent ด)งแสดงในรVปท; เนYอหาในบทน;YจะกลLาวถxง เมธอดของคลาสประเภท AWTEvent ท;สZาค)ญเทLาน)Yน ซxงคลาส AWTEvent และคลาส ObjectEvent ม;เมธอดท;สZาค)ญ ด)งน;Y ผศ. ธนศา เครอไวศยวรรณ การจ)ดการก)บเหตJการณ#กราฟmก 223
  • 235. • Object getSource() เปyนเมธอดในคลาส ObjectEvent เพอเร;ยกดVอ5อบเจกต#ประเภท Event Source • int geID() เปyนเมธอดในคลาส AWTEvent ท;สLงคLาจZานวนเต5มเพอระบJชนดของเหตJการณ# เมธอดน;Yม; ประโยชน# สZาหร)บเหตJการณ#ของคลาส MouseEvent ซxงม;เหตJการณ#ไดUหลายชนด โดยม;คLา จZานวนเต5มระบJชนดของเหตJการณ# อาทเชLน MOUSE_CLICKED หรอ MOUSE_DRAGGED เปyนตUน 7.2.1 ActionEvent อ5อบเจกต#ของคลาส ActionEvent จะถVกสรUางขxนในกรณ;ท;ม;เหตJการณ#เกดขxYนในโปรแกรม GUI อาทเชLน Y • เมอม;การคลกเมาส#บนปJšม (อ5อบเจกต#ของคลาส Button) • เมอม;การป‚อนค;ย# Enter ใน TextField • เมอม;การเลอกรายการในเมนVของ MenuItem • เมอม;การกดด)บเบYลคลก (double click) ใน List คลาส ActionEvent ม;เมธอดท;เก;ยวขUองด)งน;Y • String getActionCommand() เปyนเมธอดท;จะสLงชอคZาส)งท;เกดขxนจาก ActionEvent ท)Yงน;คZาส)งของ ActionEvent จะ Y Y กZาหนดขxน โดยอ5อบเจกต#ของ Event Source ในกรณ;ท;เปyนอ5อบเจกต#ของคลาส Button หรอ Y MenuItem ก5จะคอ ขUอความ (label) ท;ปรากฏบนปJšมหรอเมนV นอกจากน;เราสามารถท;จะ Y กZาหนดชอคZาส)งของอ5อบเจกต#ของคลาส Button หรอ MenuItem ใหUแตกตLางจากขUอความท; ปรากฏไดUโดยใชUเมธอด setActionCommand() • int getModifiers() เปyนเมธอดท;จะสLงสถานะของค;ย# Modifier (ค;ย# Alt, Ctrl, Meta และ Shift) ท;เกดจาก อ5อบเจกต#ของคลาส ActionEvent เมธอดน;YจะสLงชนดขUอมVลแบบ int ท;ม;คาคงท;คนมาคอ L ALT_MASK, CTRL_MASK, META_MASK และ SHIFT_MASK 224 การจ)ดการก)บเหตJการณ#กราฟmก ผศ. ธนศา เครอไวศยวรรณ
  • 236. 7.2.2 WindowEvent อ5อบเจกต#ของคลาส WindowEvent จะถVกสรUางขxนในกรณ;ท;ม;เหตJการณ#เกดขxYนเปyนอ5อบเจกต#ของคลาส Y ประเภท Window โดยม;เหตJการณ#ท;เกดขxนไดUด)งน;Y Y • opened เปyนเหตJการณ#ท;เกดขxYนเมอม;การเปmด Window • closed เปyนเหตJการณ#ท;เกดขxYนเมอม;การปmด Window • closing เปyนเหตJการณ#ท;เกดขxYนขณะกZาล)งปmด Window • iconified เปyนเหตJการณ#เมออ5อบเจกต#ของคลาส Window อยVLในรVปของไอคอน • deiconified เปyนเหตJการณ#เมออ5อบเจกต#ของคลาส Window ไมLไดUอยVLในรVปของไอคอน • activated เปyนเหตJการณ#ท;เกดขxนเมอ Window กZาล)งทZางานอยVL Y • deactivated เปyนเหตJการณ#ท;เกดขxYนเมอ Window ไมLไดUทZางานอยVL คลาส WindowEvent ม;เมธอดท;สZาค)ญคอ • Object getWindow() เปyนเมธอดท;สLงอ5อบเจกต#ของคลาสประเภท Window ท;เปyน Event Source คนมา 7.2.3 MouseEvent อ5อบเจกต#ของคลาส MouseEvent จะถVกสรUางขxนในกรณ;ท;ม;การใชUงานเมาส#เพอตดตLอก)บผVUใชUโดยม;เหตJการณ# Y ท;เกดขxYนไดUด)งน;Y • dragged เปyนเหตJการณ#ท;เกดขxYนเมอม;การเลอนเมาส#แลUวกดปJšมของเมาส#พรUอมก)น • moved เปyนเหตJการณ#ท;เกดขxYนเมอม;การเลอนเมาส# • clicked เปyนเหตJการณ#ท;เกดขxYนเมอม;การคลกเมาส# • entered เปyนเหตJการณ#ท;เกดขxนเมอม;การเลอนเมาส#เขUาไปในขอบเขตของอ5อบเจกต#ของคลาสท;เปyน Y สLวนประกอบกราฟmกใดๆ • exited เปyนเหตJการณ#ท;เกดขxนเมอตZาแหนLงของเมาส#อยVLนอกขอบเขตของอ5อบเจกต#ของคลาสท;เปyน Y สLวนประกอบกราฟmกใดๆ • pressed เปyนเหตJการณ#ท;เกดขxนเมอม;การกดปJšมบนเมาส# Y • released เปyนเหตJการณ#ท;เกดขxนเมอม;การปลLอยปJšมท;กดบนเมาส# Y ผศ. ธนศา เครอไวศยวรรณ การจ)ดการก)บเหตJการณ#กราฟmก 225
  • 237. คลาส MouseEvent ม;เมธอดท;สZาค)ญคอ • int getX() เปyนเมธอดท;จะสLงตZาแหนLงพก)ดของเมาส#บนแกน x ท;ม;ชนดขUอมVลเปyน int คนมา • int getY() เปyนเมธอดท;จะสLงตZาแหนLงพก)ดของเมาส#บนแกน y ท;ม;ชนดขUอมVลเปyน int คนมา • Point getPoint() เปyนเมธอดท;จะสLงตZาแหนLงพก)ด (x,y) ของเมาส#คนมา โดยม;ชนดขUอมVลเปyนอ5อบเจกต#ของคลาส Point • int getClickCount() เปyนเมธอดท;จะสLงจZานวนคร)งของการคลกเมาส#คนมา Y 7.2.4 ItemEvent อ5อบเจกต#ของคลาส ItemEvent จะถVกสรUางขxนในกรณ;ท;ม;เหตJการณ#เกดขxYนในโปรแกรม GUI ด)งน;Y Y • เมอม;การเลอกหรอยกเลกรายการใน List หรอ Checkbox • เมอม;การคลกเมาส#ในรายการใน Choice คลาส ItemEvent ม;เมธอดท;สZาค)ญด)งน;Y • ItemSelectable getItemSelectable() เปyนเมธอดท;จะสLงอ5อบเจกต#ของคลาสประเภท ItemSelectable ท;เปyน Event Source คนมา • Object getItem() เปyนเมธอดท;จะสLงอ5อบเจกต#ของรายการท;ถVกเลอกคนมา • int getStateChange() เปyนเมธอดท;จะสLงคLาคงท;ชนด int ท;ม;คLาเปyน SELECTED หรอ DESELECTED เพอระบJ สถานการณ#เลอกของรายการคนมา 226 การจ)ดการก)บเหตJการณ#กราฟmก ผศ. ธนศา เครอไวศยวรรณ
  • 238. 7.2.5 Event อนๆ แพคเก5จ java.awt.event ย)งม;คลาสท;เปyนเหตJการณ#ทางดUานกราฟmกอนๆ ท;สZาค)ญอาทเชLน • KeyEvent เปyนคลาสท;ม;การสรUางอ5อบเจกต#เมอม;เหตJการณ#การกดค;ย#บอร#ด • FocusEvent เปyนคลาสท;ม;การสรUางอ5อบเจกต#เมอผVUใชUเลอนอJปกรณ#อนพJตมาช;Yยงอ5อบเจกต#ของ ) สLวนประกอบกราฟmกใดๆ • ComponentEvent เปyนคลาสท;ม;การสรUางอ5อบเจกต#เมอม;เหตJการณ#ซxงอ5อบเจกต#ของสLวนประกอบกราฟmก ม;การเปล;ยนแปลงเชLน เคลอนท;หรอปร)บขนาด • ContainerEvent เปyนคลาสท;ม;การสรUางอ5อบเจกต#เมอม;เหตJการณ#ในการใสLหรอยกเลกอ5อบเจกต#ของ สLวนประกอบกราฟmก ลงในอ5อบเจกต#ของคลาสประเภท Container • AdjustmentEvent เปyนคลาสท;ม;การสรUางอ5อบเจกต#เมอม;เหตJการณ#ในการปร)บตZาแหนLงช;Yของอ5อบเจกต# ของคลาส ScrollBar หรอ ScrollPane • TextEvent เปyนคลาสท;ม;การสรUางอ5อบเจกต#เมอม;เหตJการณ#ในการเปล;ยนแปลงขUอความในอ5อบเจกต#ของ คลาส TextArea 7.3 อ,นเตอร.เฟสประเภท Listener ภาษาจาวาจะจ)ดการก)บเหตJการณ# โดยการสรUางอ5อบเจกต#ท;สามารถร)บฟwงเหตJการณ#จากคลาสท; implements อนเตอร#เฟสประเภท Listener ท;สอดคลUองก)นซxงอ5อบเจกต#น;YจะทZาหนUาท;เปyน Event Handler อาทเชLน อ5อบเจกต#ท; จะจ)ดการก)บเหตJการณ#ประเภท ActionEvent จะตUอง implements อนเตอร#เฟส ActionListener โดยตUองเข;ยน บล5อกคZาส)งในเมธอด actionPerformed() อนเตอร#เฟสประเภท Listener ม;ท)Yงหมด 13 ชนด ซxงสอดคลUองก)บ คลาสประเภท Event ด)งน;Y • ActionListener เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส ActionEvent • AdjustmentListener เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส AdjustmentEvent • ComponentListener เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส ComponentEvent • ContainerListener เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส ContainerEvent • FocusListener เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส FocusEvent • InputMethodListener เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส InputMethodEvent ผศ. ธนศา เครอไวศยวรรณ การจ)ดการก)บเหตJการณ#กราฟmก 227
  • 239. • ItemListener เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส ItemEvent • KeyListener เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส KeyEvent • MouseListener เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส MouseEvent • MouseMotionListener เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส MouseEvent • TextListener เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส TextEvent • WindowListener เปyนอนเตอร#เฟสสZาหร)บอ5อบเจกต#ของคลาส WindowEvent • AWTEventListener เปyนอนเตอร#เฟสสZาหร)บใหUเราสามารถท;จะไปพ)ฒนาคลาสประเภท EventListener ไดU อ5อบเจกต#ใดๆ ท;ตUองการจ)ดการก)บเหตJการณ#จะตUองลงทะเบ;ยน (register) ร)บฟwงเหตJการณ#นนดUวยโดยตUองใชU )Y เมธอดท;สอดคลUองก)นด)งแสดงในตารางท; 7.1 สLวนอนเตอร#เฟสประเภท Listener แตLละชนดจะม;เมธอดท;ตUองเข;ยน บล5อกคZาส)งตLางๆ ด)งแสดงในตารางท; 7.2 ตารางท 7.1 เมธอดท;ใชUร)บฟwงเหตJการณ# อ,นเตอร.เฟส เมธอดทใชรบฟOงเหต%การณ. ActionListener addActionListener() ItemListener addItemListener() KeyListener addKeyListener() InputMethodListener addInputMethodListener() MouseListener addMouseListener() MouseMotionListener addMouseMotionListener() TextListener addTextListener() FocusListener addFocusListener() AdjustmentListener addAdjustmentListener() ComponentListener addComponentListener() ContainerListener addContainerListener() WindowListener addWindowListener() 228 การจ)ดการก)บเหตJการณ#กราฟmก ผศ. ธนศา เครอไวศยวรรณ
  • 240. ตารางท7.2 เมธอดท;ตUอง implements ส%าหร&บอ6นเตอร8เฟสประเภท Event อ,นเตอร.เฟส เมธอดทตอง implements ActionListener actionPerformed(ActionEvent) ItemListener itemStateChanged(ItemEvent) mouseDragged(MouseEvent) MouseMotionListener mouseMoved(MouseEvent) mouseClicked(MouseEvent) mouseEntered(MouseEvent) MouseListener mouseExited(MouseEvent) mousePressed(MouseEvent) mouseReleased(MouseEvent) keyPressed(KeyEvent) KeyListener keyReleased(KeyEvent) keyTyped(KeyEvent) caretPositionChanged(InputMethodEvent) InputMethodListener inputMethodTextChanged(InputMethodEvent) focusGained(FocusEvent) FocusListener focusLost(FocusEvent) AdjustmentListener adjustmentValueChanged(AdjustmentEvent) componentMoved(ComponentEvent) componentHidden(ComponentEvent) ComponentListener componentResized(ComponentEvent) componentShown(ComponentEvent) windowOpened(WindowEvent) windowClosed(WindowEvent) windowClosing(WindowEvent) WindowListener windowIconified(WindowEvent) windowDeiconified(WindowEvent) windowActivated(WindowEvent) windowDeactivated(WindowEvent) componentAdded(ContainerEvent) ContainerListener componentRemoved(ContainerEvent) TextListener textValueChanged(TextEvent) ผศ. ธนศา เครอไวศยวรรณ การจ)ดการก)บเหตJการณ#กราฟmก 229
  • 241. 7.4 การจดการกบเหต%การณ. ภาษาจาวาจะม;วธ;การจ)ดการก)บเหตJการณ#ท;เร;ยกวLา Delegation Model โดยจะม;หล)กการด)งน;Y • อ5อบเจกต#ของสLวนประกอบกราฟmกใดๆ สามารถเปyนอ5อบเจกต#ประเภท Event Source ไดU อาทเชLน อ5อบเจกต#ของคลาส Button สามารถเปyน Event Source ของ ActionEvent ไดU • คลาสใดๆ สามารถร)บฟwงเหตJการณ#ใดๆ ก5ไดU ถUาคลาสน)น implements อนเตอร#เฟสประเภท Listener ท; Y สอดคลUองก)นอาทเชLน คลาสท;ตUองการร)บฟwงเหตJการณ# ActionEvent จะตUอง implements อนเตอร#เฟส ท;ชอ ActionListener • อ5อบเจกต#ประเภท Event ท;เกดจาก Event Source จะถVกสLงไปย)งอ5อบเจกต#ของคลาสท;สามารถร)บฟwง เหตJการณ#ประเภทน)Yน จากหล)กการขUางตUน โปรแกรมภาษาจาวาจะม;วธ;การเข;ยนคZาส)งเพอจ)ดการก)บเหตJการณ#ตLางๆ ด)งน;Y Event Source ใดตUองการท;จะจ)ดการก)บเหตJการณ#ใดตUองลงทะเบ;ยนเพอร)บฟwงเหตJการณ#โดยม;รปแบบด)งน;Y V eventSource.addXxxListener(listener) โดยท; • eventSource เปyนชอของอ5อบเจกต#ท;เปyน Event Source • addXxxListener เปyนเมธอดท;ใชUในการลงทะเบ;ยนร)บฟwงเหตJการณ#โดยจะตUองเลอกใชUเมธอดท; สอดคลUองก)นในการร)บฟwงเหตJการณ#แตLละชนด ด)งแสดงในตารางท; 7.2 เชLน ใชUเมธอด addActionListener() เพอร)บฟwง ActionEvent • listener เปyนอ5อบเจกต#ของคลาส Xxxlistener ซxงสามารถร)บฟwงเหตJการณ#ท;ตUองการจ)ดการไดU และ ทZาหนUาท;เปyน Event Handler • XxxListener เปyนคลาสท; implements อนเตอร#เฟสประเภท Listener ท;สอดคลUองก)น การเข;ยนโปรแกรมเพอจ)ดการก)บเหตJการณ#สามารถท;เข;ยนคลาสท;เปyน Event Handler ไดUหลายรVปแบบด)งน;Y • กZาหนดคลาสภายนอกคลาสท;ใชUในการจ)ดการเหตJการณ# • กZาหนดคลาสท;เปyนคลาสภายในอยVLในคลาสท;ใชUในการจ)ดการเหตJการณ# • กZาหนดใหUคลาสท;ใชUในการจ)ดการเหตJการณ# implements อนเตอร#เฟสประเภท Listener ท;สอดคลUอง ก)น และสรUางอ5อบเจกต#ของคลาสด)งกลLาวภายในคลาสเอง • กZาหนดคลาสภายในเมธอด (คลาสประเภท anonymous) 230 การจ)ดการก)บเหตJการณ#กราฟmก ผศ. ธนศา เครอไวศยวรรณ
  • 242. 7.4.1 ก)รสร>)งอdอบเจกตeของคล)สภ)ยนอก โปรแกรมท; 7.1 แสดงต)วอยLางการจ)ดการก)บเหตJการณ#ท;เกดจากการกดปJšม โดยกZาหนดคลาส ActionHandler ใหUเปyนคลาสประเภท Event Handler ซxงคลาสน;จะอยVLภายนอกคลาส EventDemo1 ซxงเปyน Y คลาสท;ใชUในการจ)ดการก)บเหตJการณ#การกดปJšม คลาส EventDemo1 จะม;อ5อบเจกต#ของคลาส JButton ท;ชอ bn1 อ5อบเจกต# bn1 ไดUลงทะเบ;ยนร)บฟwงเหตJการณ# ActionEvent โดยใชUคZาส)ง bn1.addActionListener(new ActionHandler()) โดยท;คZาส)ง new ActionHandler() เปyนการสรUางอ5อบเจกต#ของคลาส ActionHandler ท;จะทZาหนUาท; เปyน Event Handler ด)งน)นคลาส ActionHandler จะตUอง implements อนเตอร#เฟส ActionListener โดย Y ม;เมธอดเด;ยวท;จะตUองเข;ยนบล5อกคZาส)งคอ public void actionPerformed(ActionEvent ev) ซxงผลล)พธ#ท;ไดUจากการร)นโปรแกรมท; 7.1 จะไดUด)งแสดงในรVปท; 7.4 โปรแกรมท 7.1 การจ)ดการก)บเหตJการณ#ท;เกดจากการกดปJšม import java.awt.FlowLayout; import javax.swing.*; public class EventDemo1 { public void init() { JFrame fr = new JFrame("Outer Class Event Demo"); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JButton bn1 = new JButton("Exit"); fr.setLayout(new FlowLayout()); bn1.addActionListener(new ActionHandler()); fr.add(bn1); fr.setSize(200, 200); fr.setVisible(true); } public static void main(String[] args) { EventDemo1 obj = new EventDemo1(); obj.init(); } } ------------------------------------------------------------ public class ActionHandler implements ActionListener { public void actionPerformed(ActionEvent ev) { System.exit(0); } } ผศ. ธนศา เครอไวศยวรรณ การจ)ดการก)บเหตJการณ#กราฟmก 231
  • 243. รปท 7.4 ผลลพธทได*จากการรนโปรแกรมท 7.1 7.5 ก)รสร>)งอdอบเจกตeของคล)สภ)ยใน โปรแกรมท; 7.2 แสดงต)วอยLางการจ)ดการก)บเหตJการณ#ท;เกดขxนจากการเลอนเมาส# โดยกZาหนดคลาสประเภท Y Event Handler ใหUอยVLภายในคลาสท;ตUองการจ)ดการก)บเหตJการณ# จากต)วอยLางน;คลาส MouseHandler ซxงเปyนคลาส Y ท;จะร)บฟwงเหตJการณ#ชนด MouseMotionListener โดยเปyนคลาสภายในท;อยVLในคลาส EventDemo2 ท;ม; อ5อบเจกต#ของคลาส JFrame ท;ชอ fr ซxงการลงทะเบ;ยนร)บฟwงเหตJการณ# MouseEvent โดยใชUคZาส)ง fr.addMouseMotionListener(new MouseHandler()) โดยท;คZาส)ง new MouseHandler() เปyนการสรUางอ5อบเจกต#ของคลาส MouseHandler ท;จะทZาหนUาท;เปyน Event Handler โปรแกรมน;จะไดUผลล)พธ#ด)งแสดงในรVปท; 7.5 Y 232 การจ)ดการก)บเหตJการณ#กราฟmก ผศ. ธนศา เครอไวศยวรรณ
  • 244. โปรแกรมท( 7.2 การจ)ดการก)บเหตการณท%เกดขนจากการเลอนเมาส import java.awt.*; import java.awt.event.*; import javax.swing.*; public class EventDemo2 { private JFrame fr; private JTextField tf; public void init() { fr = new JFrame("Same Class Event Demo"); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); tf = new JTextField(15); fr.setLayout(new FlowLayout()); fr.add(tf); tf.setFont(new Font("TimesRoman", Font.BOLD, 16)); fr.addMouseMotionListener(new MouseHandler()); fr.setSize(200, 200); fr.setVisible(true); } public class MouseHandler implements MouseMotionListener { public void mouseDragged(MouseEvent ev) { tf.setText("X=" + ev.getX() + " Y=" + ev.getY()); } public void mouseMoved(MouseEvent ev) { } } public static void main(String[] args) { EventDemo2 obj = new EventDemo2(); obj.init(); } } รปท 7.5 ผลลพธทได*จากการรนโปรแกรมท 7.2 ผศ. ธนศา เครอไวศยวรรณ การจ)ดการก)บเหตJการณ#กราฟmก 233
  • 245. 7.5.1 ก)รสร>)งอdอบเจกตeภ)ยในคล)สเด.ยวก+น เราสามารถท;จะกZาหนดใหUคลาสท;ตUองการจะจ)ดการก)บเหตJการณ# เปyนคลาสประเภท Event Handler ไดUเอง โดยการกZาหนดใหUคลาสน)Yน implements อนเตอร#เฟสประเภท Listener ท;สอดคลUองก)น โปรแกรมท; 7.3 แสดง ต)วอยLางของคลาส EventDemo3 ซxงจะม;อ5อบเจกต#ของคลาส JFrame ท;ชอ fr ซxงจะร)บฟwงเหตJการณ#ประเภท WindowEvent คลาสน;Yจะเปyนคลาสประเภท Event Handler ดUวย โดยการ implements อนเตอร#เฟส WindowListener โปรแกรมน;YไดUสรUางอ5อบเจกต#ของคลาส EventDemo ขxนมา และใชUคZาส)ง Y fr.addWindowListener(this) เพอลงทะเบ;ยนร)บฟwงเหตJการณ#และใหUอ5อบเจกต#ของคลาสน;Y (this) ซxงเปyนอ5อบเจกต#ประเภท Event Handler ในการจ)ดการก)บเหตJการณ# โปรแกรมน;จะทZาใหUสามารถปmดเฟรมไดUโดยการคลกเมาส#ท;เครองหมายกากบาท Y ตรง title bar ท)Yงน;เY นองจากคลาส EventDemo3 ม;คZาส)งในเมธอด windowClosing() เพอออกจากโปรแกรม (คZาส)ง System.exit(0)) โปรแกรมน;จะไดUผลล)พธ#ด)งแสดงในรVปท; 7.6 Y โปรแกรมท 7.3 คลาสท;ม;การร)บฟwงเหตJการณ#ประเภท WindowEvent import java.awt.event.*; import javax.swing.JFrame; public class EventDemo3 implements WindowListener{ public void init() { JFrame fr = new JFrame("Same Class Event Demo"); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); fr.addWindowListener(this); fr.setSize(200, 200); fr.setVisible(true); } public void windowClosing(WindowEvent ev) { System.exit(0); } public void windowOpened(WindowEvent ev) {} public void windowClosed(WindowEvent ev) {} public void windowIconified(WindowEvent ev) {} public void windowDeiconified(WindowEvent ev) {} public void windowActivated(WindowEvent ev) {} public void windowDeactivated(WindowEvent ev) {} public static void main(String[] args) { EventDemo3 obj = new EventDemo3(); obj.init(); } } 234 การจ)ดการก)บเหตJการณ#กราฟmก ผศ. ธนศา เครอไวศยวรรณ
  • 246. รปท 7.6 ผลลพธทได*จากการรนโปรแกรมท 7.3 7.5.2 ก)รร+บฟjงเหตlก)รณeหล)ยเหตlก)รณe ภาษาจาวาอนJญาตใหUอ5อบเจกต#ของคลาสท;เปyนสLวนกราฟmกแตLละอ5อบเจกต# สามารถท;จะร)บฟwงเหตJการณ#หลาย ประเภทไดUพรUอมก)นอาทเชLน ถUาอ5อบเจกต# fr เปyนอ5อบเจกต#ของ JFrame เราสามารถท;จะลงทะเบ;ยนร)บฟwงเหตJการณ# ไดUด)งน;Y fr.addMouseMotionListener(this); fr.addWindowListener(this); ซxงเปyนการกZาหนดใหUอ5อบเจกต# fr ร)บฟwงเหตJการณ#ท;เกดจากการเลอนเมาส#และเหตJการณ#ท;เก;ยวขUองก)บเฟรม พรUอมก)น คลาสใดๆ สามารถท;จะ implements อนเตอร#เฟสประเภท Listener ไดUหลายชนดเชLน public class EventDemo4 implements MouseMotionListener, WindowListener { ... } เปyนการกZาหนดคลาส EventDemo4 ใหUเปyนคลาสประเภท Event Handler ท; implement อนเตอร#เฟส MouseMotionListener และ WindowListener ภายในคลาสเด;ยวก)น นอกจากน;คลาสประเภท Event Handler ใดๆ สามารถท;ใชUในการสรUางอ5อบเจกต#แลUวจ)ดการก)บอ5อบเจกต#ท; Y เปyน Event Source ไดUหลายอ5อบเจกต# ท)Yงน;Y argument ท;เปyนอ5อบเจกต#ของคลาสประเภท Event จะม;เมธอดท;ใชUใน การระบJอ5อบเจกต#ของ Event Source ไดUอาทเชLน (เมธอด getSource()) โปรแกรมท; 7.4 แสดงต)วอยLางของคลาส EventDemo4 ซxงม;อ5อบเจกต# fr ท;ลงทะเบ;ยนร)บฟwงเหตJการณ#สอง ชนด และคลาสน;Y implements อนเตอร#เฟสท)Yงสองชนดท;สอดคลUองก)น โปรแกรมน;จะใหUผลล)พธ#ด)งรVปท; 7.7 Y ผศ. ธนศา เครอไวศยวรรณ การจ)ดการก)บเหตJการณ#กราฟmก 235
  • 247. โปรแกรมท( 7.4 คลาสท%ลงทะเบ%ยนร)บฟ>งเหตการณสองชนด import java.awt.*; import java.awt.event.*; import javax.swing.*; public class EventDemo4 implements MouseMotionListener, WindowListener { private JFrame fr; private JTextField tf; public void init() { fr = new JFrame("Multiple Event Demo"); tf = new JTextField(15); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); fr.setLayout(new FlowLayout()); fr.add(tf); tf.setFont(new Font("TimesRoman", Font.BOLD, 16)); fr.addMouseMotionListener(this); fr.addWindowListener(this); fr.setSize(200, 200); fr.setVisible(true); } public void mouseDragged(MouseEvent ev) { tf.setText("X=" + ev.getX() + " Y=" + ev.getY()); } public void mouseMoved(MouseEvent ev) { } public void windowClosing(WindowEvent ev) { System.exit(0); } public void windowOpened(WindowEvent ev) { } public void windowClosed(WindowEvent ev) { } public void windowIconified(WindowEvent ev) { } public void windowDeiconified(WindowEvent ev) { } public void windowActivated(WindowEvent ev) { } public void windowDeactivated(WindowEvent ev) { } public static void main(String[] args) { EventDemo4 obj = new EventDemo4(); obj.init(); } } 236 การจ)ดการก)บเหตJการณ#กราฟmก ผศ. ธนศา เครอไวศยวรรณ
  • 248. รปท 7.7 ผลลพธทได*จากการรนโปรแกรมท 7.4 7.5.3 คล)สประเภท Event Adapter คลาสประเภท Event Adapter คอคลาสท;ไดU implements อนเตอร#เฟสประเภท Listener ไวUแลUว โดยไดU กZาหนดเมธอดตLางๆ ของอนเตอร#เฟสท;ตUองเข;ยนบล5อกคZาส)งไวUแลUว แตLจะเปyนบล5อกคZาส)งท;ไมLม;คZาส)งใดๆ อยVLภายใน บล5อก คลาสประเภท Event Adapter จะชLวยทZาใหUเข;ยนโปรแกรมท;เปyนคลาสประเภท Event Handler ไดUงLายขxน Y โดยลดจZานวนเมธอดท;จะตUองเข;ยนบล5อกคZาส)ง การเข;ยนคลาสประเภท Event Handler น;จะตUองสบทอดมาจากคลาส Y ประเภท Event Adapter สZาหร)บการร)บฟwงเหตJการณ#ท;สอดคลUองก)นและจะกZาหนดเมธอดแบบ 0verridden เฉพาะเมธอดท;ตUองการจ)ดการก)บเหตJการณ# คลาสประเภท Event Adapter จะม;อยVL 7 คลาสด)งน;Y • MouseAdapter คอคลาสท; implements อนเตอร#เฟสท;ชอ MouseListener • MouseMotionAdapter คอคลาสท; implements อนเตอร#เฟสท;ชอ MouseMotionListener • ComponentAdapter คอคลาสท; implements อนเตอร#เฟสท;ชอ ComponentListener • ContainerAdapter คอคลาสท; implements อนเตอร#เฟสท;ชอ ContainerListener • KeyAdapter คอคลาสท; implements อนเตอร#เฟสท;ชอ KeyListener • WindowAdapter คอคลาสท; implements อนเตอร#เฟสท;ชอ WindowListener • FocusAdapter คอคลาสท; implements อนเตอร#เฟสท;ชอ FocusListener โปรแกรมท; 7.5 แสดงต)วอยLางของการกZาหนดคลาสประเภท Event Adapter ท;สบทอดมาจากคลาส WindowAdapter โปรแกรมน;YจะทZาใหUสามารถปmดเฟรม ซxงผลล)พธ#ท;ไดUจะเปyนเชLนเด;ยวก)บผลล)พธ#ท;ไดUจากการร)น โปรแกรมท; 7.1 ผศ. ธนศา เครอไวศยวรรณ การจ)ดการก)บเหตJการณ#กราฟmก 237
  • 249. โปรแกรมท( 7.5 คลาสประเภทท%สบทอดมาจากคลาส WindowAdapter import javax.swing.JFrame; public class EventDemo5 { public void init() { JFrame fr = new JFrame("Adapter Class Event Demo"); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); fr.addWindowListener(new WindowHandler()); fr.setSize(200, 200); fr.setVisible(true); } public static void main(String[] args) { EventDemo5 obj = new EventDemo5(); obj.init(); } } ---------------------------------------------------------------- import java.awt.event.*; public class WindowHandler extends WindowAdapter { public void windowClosing(WindowEvent ev) { System.exit(0); } } 7.5.4 ก)รสร>)งคล)สแบบ anonymous เราสามารถสรUางคลาสประเภท Event Handler ภายในเมธอดท;ใชUในการลงทะเบ;ยนร)บฟwงเหตJการณ# (เมธอด ประเภท addXXxListener()) คลาสประเภทน;เY ร;ยกวLาคลาสแบบ anonymous ซxงม)กจะใชUคVLก)บคลาสประเภท Event Adapter โดยนยมใชUก)บการปmดเฟรมอาทเชLน คZาส)ง fr.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent ev) { System.exit(0); } }); เปyนการสรUางคลาสแบบ anonymous ภายในเมธอด addWindowListener() เพอปmดเฟรมของอ5อบเจกต# fr โปรแกรมท; 7.6 แสดงต)วอยLางของคลาสในรVปแบบน;Y ซxงผลล)พธ#ท;ไดUจะเปyนเชLนเด;ยวก)บผลล)พธ#ท;ไดUจากการร)น โปรแกรมท; 7.1 238 การจ)ดการก)บเหตJการณ#กราฟmก ผศ. ธนศา เครอไวศยวรรณ
  • 250. โปรแกรมท( 7.6 คลาสแบบ anonymous import java.awt.event.*; import javax.swing.JFrame; public class EventDemo6 { public void init() { JFrame fr = new JFrame("Anonymous Class Event Demo"); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); fr.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent ev) { System.exit(0); } }); fr.setSize(200, 200); fr.setVisible(true); } public static void main(String[] args) { EventDemo6 obj = new EventDemo6(); obj.init(); } } สร"ปเน-อหาของบท • อ5อบเจกต#ของคลาสประเภท Event ในแพจเก5จ java.awt.event จะถVกสรUางขxน เมอม;เหตJการณ#เกดขxน Y Y ก)บอ5อบเจกต#ของสLวนประกอบกราฟmก เชLน ActionEvent เกดขxYนเมอม;การกด Button หรอ WindowEvent เกดขxนเมอม;การปmด Frame Y • การจะจ)ดการก)บ Event ประเภทใดน)น โดยท)วไปจะตUองสรUางอ5อบเจกต#ของคลาสท; implements Y อนเตอร#เฟสท;สอดคลUองก)นก)บ Event น)นดUวย เชLนถUาตUองการจ)ดการก)บ WindowEvent จะตUองสรUาง Y อ5อบเจกต#ของคลาสท; implements อนเตอร#เฟส WindowListener โดยการสรUางอ5อบเจกต#อาจสรUางจาก คลาสใหมL คลาสภายใน คลาสเด;ยวก)น หรอคลาสประเภท anonymous ซxงคลาสประเภทน;จะถVกเร;ยกวLา Y คลาสประเภท Event Handler • คลาสใดๆ สามารถ implements อนเตอร#เฟสไดUหลายต)ว ทZาใหUสามารถท;จะขxนทะเบ;ยนร)บฟwงเหตJการณ# Y ไดUหลายเหตJการณ# • คลาสประเภท Event Adapter คอคลาสท; implements อนเตอร#เฟสประเภท Listener ไวUแลUว โดยไดU กZาหนดเมธอดตLางๆ ของอนเตอร#เฟสท;ตUองเข;ยนบล5อกคZาส)งไวUแลUว แตLจะเปyนบล5อกคZาส)งท;ไมLมคZาส)งใดๆ ; อยVLภายในบล5อก ผศ. ธนศา เครอไวศยวรรณ การจ)ดการก)บเหตJการณ#กราฟmก 239
  • 251. 240 การจ)ดการก)บเหตJการณ#กราฟmก ผศ. ธนศา เครอไวศยวรรณ
  • 252. บทท 8 อะเรย.และคอลเล-กชน เนYอหาในบทน;YเปyนการแนะนZาการใชUอะเรย#ของขUอมVลชนดพYนฐาน และชนดคลาส อธบายการประกาศและ สรUางอะเรย#หลายมต แนะนZาเมธอดท;เก;ยวขUองก)บอะเรย# อธบายความหมายของคอลเล5กช)น แนะนZาอนเตอร#เฟสและ คลาสตLางๆ ท;อยVLใน Collection API และการนZาไปใชUงาน 8.1 อะเรย. อะเรย#ในภาษาจาวา คอต)วแปรท;เปyนชนดขUอมVลแบบอUางองท;สามารถใชUเก5บขUอมVลชนดเด;ยวก)นไดUหลายคLา ต)วแปรอะเรย#จะเปyนต)วแปรท;ม;ชอเด;ยวก)นแตLจะม;จZานวนสมาชกไดUหลายต)ว โดยตZาแหนLงในหนLวยความจZาท;เ ก5บขUอมVล เหลLาน;จะอยVLตดก)น ต)วอยLางเชLน หากตUองการกZาหนดต)วแปรใหUม;ชนดขUอมVลเปyน int เพอเก5บขUอมVลไดU 5 คLาโดยต)Yงชอ Y ต)วแปรเปyน x1, x2, x3, x4 และ x5 ด)งน;Y int x1, x2, x3, x4, x5; ต)วแปรด)งกลLาวจะถอวLาเปyนต)วแปรคนละต)วก)น โดยม;ชอตLางก)นและไมLมความส)มพ)นธ#ซxงก)นและก)น แตLหาก ; ประกาศใหUต)วแปร x เปyนต)วแปรอะเรย#ท;ม;จZานวนสมาชก 5 ต)ว โดยใชUคZาส)งด)งน;Y int []x = new int[5]; จะทZาใหUต)วแปรอะเรย# x เปyนต)วแปรท;ม;ชนดขUอมVลเปyน int ซxงม;สมาชก 5 ต)ว โดยม;หมายเลขสมาชกต)YงแตL 0 ถxง 4 และเปyนชนดขUอมVลแบบอUางอง กลLาวคอคLาของ x จะเก5บตZาแหนLงของหนLวยความจZาเพออUางองถxงตZาแหนLงท;เก5บ ขUอมVลสมาชกของอะเรย#แตLละต)ว ด)งแสดงในรVปท; 8.1 รปท 8.1 การเก-บตาแหน%งอ*างองของตวแปรอะเรย ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 241
  • 253. ภาษาจาวาแบLงต)วแปรอะเรย#เปyนสองประเภทคอ 1.อะเรย#ของขUอมVลชนดพYนฐาน 2.อะเรย#ของขUอมVลชนดคลาส อะเรย#ของขUอมVลชนดพYนฐาน คออะเรย#ท;สามารถใชUเก5บขUอมVลท;ม;ชนดขUอมVลแบบพYนฐานชนดใดชนดหนxงไดU หลายคLา เชLนอะเรย#ของขUอมVลชนด int หรออะเรย#ของขUอมVลชนด boolean เปyนตUน อะเรย#ของขUอมVลชนดคลาส คออะเรย#ท;สามารถใชUเก5บขUอมVลท;เปyนอ5อบเจกต#ของคลาสใดๆ ไดUหลายอ5อบเจกต# เชLนอะเรย#ของขUอมVลชนด String เปyนตUน 8.2 อะเรย.ของขอมลชน,ดพนฐาน ภาษาจาวาสามารถท;จะสรUางอะเรย# เพอใชUเก5บขUอมVลท;ม;ชนดขUอมVลแบบพYนฐานไดU การสรUางต)วแปรอะเรย# จะม; ข)YนตอนเชLนเด;ยวก)บการสรUางต)วแปรท;เปyนชนดขUอมVลแบบอUางองท)วไปสองข)Yนตอนคอ 1. ข)Yนตอนแรกเปyนการประกาศชอต)วแปร ข)นตอนน;จะเปyนการจองเนYอท;ในหนLวย ความจZาเพอเก5บคLาของ Y Y ตZาแหนLงอUางองท;เก5บขUอมVลสมาชกในหนLวยความจZา แตLขนตอนน;Yจะย)งไมLม;การจองเนYอท;ในหนLวยความจZา เพอ )Y ใชUเก5บคLาขUอมVลสมาชกของอะเรย#แตLละต)ว ด)งน)นคLาของต)วแปรในข)นตอนน;จะเปyน null Y Y Y 2. ข)Yนตอนท;สองเปyนการสรUางต)วแปร เพอบอกจZานวนสมาชกของอะเรย# และจองเนYอท;ในหนLวยความจZาสZาหร)บ เก5บคLาขUอมVลสมาชกของอะเรย#แตLละต)ว โดยใชUคZาส)ง new เชLนเด;ยวก)บการสรUางอ5อบเจกต#ของคลาส ข)นตอนน;Y Y จะทZาใหUคLาของต)วแปรเปล;ยนไปเปyนคLาของตZาแหนLงอUางองท;เก5บขUอมVลสมาชกของอะเรย# 8.2.1 การประกาศชอตวแปรอะเรย.ของขอมลชน,ดพนฐาน การประกาศชอของต)วแปรอะเรย#จะม;รVปแบบคลUายก)บการประกาศชอต)วแปรของชนดขUอมVลแบบพYนฐาน แตL การประกาศต)วแปรอะเรย#จะตUองม;เครองหมาย [] อยVLดานหนUาหรอดUานหล)งชอต)วแปรด)งน;Y U [modifier] dataType []variableName; หรอ [modifier] dataType variableName[]; ต)วอยLางเชLน คZาส)ง int x[]; private char []ch; public double y[]; 242 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
  • 254. ตLางก5เปyนการประกาศใหUต)วแปร x, ch และ y เปyนต)วแปรอะเรย# โดยม;ชนดขUอมVลเปyน int,char และ double ตามลZาด)บ การประกาศชอต)วแปรย)งเปyนการจองเนYอท;ในหนLวยความจZา เพอเก5บคLาของตZาแหนLงอUางองท;เก5บขUอมVลสมาชก ในหนLวยความจZา ซxงในข)นตอนน;จะเก5บคLาเปyน null ไวUกLอน เนองจากย)งไมLม;การจองเนYอท;ในหนLวยความจZาเพอเก5บ Y Y ขUอมVลสมาชกของอะเรย# ภาษาจาวาแตกตLางจากภาษาซ;ตรงท;อนJญาตใหUใชUเครองหมาย [] อยVLดานหนUาชอต)วแปรอะเรย#ท;ตUองการ U ประกาศไดU สLวนขUอแตกตLางของการใชUเครองหมาย [] ดUานหนUาและดUานหล)งจะเกดขxYน ในกรณ;ท;ตUองการประกาศต)ว แปรหลายๆ ต)ว ต)วอยLางเชLน คZาส)ง int []x,y; จะเปyนการประกาศใหUต)วแปร x และ y เปyนต)วแปรอะเรย#ชนดขUอมVล int ท)YงคVLแตLคZาส)ง int x[],y; จะเปyนการประกาศใหUต)วแปร x เปyนต)วแปรอะเรย#ท;ม;ชนดขUอมVลเปyน int สLวนต)วแปร y เปyนต)วแปรปกตท; ไมLใชLต)วแปรอะเรย#โดยม;ชนดขUอมVลเปyน int 8.2.2 การสรางตวแปรอะเรย.ของขอมลชน,ดพนฐาน การประกาศชอต)วแปรอะเรย#จะไมLม;การจองเนYอท;ในหนLวยความจZา เพอเก5บขUอมVลสมาชกของอะเรย# เนYอท;ใน หนLวยความจZาด)งกลLาวจะถVกจองขxYนเมอม;การใชUคZาส)ง new ซxงม;รVปแบบคZาส)งด)งน;Y variableName = new dataType[size]; โดยท; size คอจZานวนสมาชกของอะเรย#ท;ตUองการ คZาส)งน;เY ปyนการระบJจZานวนสมาชกของต)วแปรอะเรย#และเปyนการจองเนYอท;ในหนLวย ความจZาสZาหร)บสมาชก ของอะเรย#แตLละต)ว นอกจากน;Yย)งจะทZาใหUคLาในหนLวยความจZาท;เก5บตZาแหนLงอUางองของต)วแปรน)Yนเปล;ยนคLาจาก null ไปเปyนตZาแหนLงท;เก5บขUอมVลด)งแสดงในรVปท; 8.2 ต)วอยLางเชLน คZาส)ง x = new int[5]; ch = new char[4]; y = new double[6]; ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 243
  • 255. เปyนคZาส)งสรUางต)วแปรอะเรย# x, ch และ y ใหUมชนดขUอมVลเปyน int, ; char และ double และม;จZานวน สมาชกของอะเรย#เทLาก)บ 5, 4 และ 6 ตามลZาด)บ รปท 8.2 การเก-บตาแหน%งอ*างองของตวแปรอะเรย ในการสรUางต)วแปรอะเรย# dataType ท;อยVLในคZาส)ง new จะตUองเปyนชนดขUอมVลชนดเด;ยวก)นก)บชนดขUอมVลของ ต)วแปรอะเรย# ด)งน)นคZาส)ง Y int []x; x = new double[4]; จxงเปyนคZาส)งในการสรUางต)วแปรอะเรย#ท;ไมLถVกตUอง เนองจากต)วแปรอะเรย# x ถVกประกาศใหUม;ชนดขUอมVลเปyน int แตLคZาส)ง new เปyนการมาสรUางอะเรย#ของขUอมVลชนด double เราสามารถท;จะรวมคZาส)งประกาศชอต)วแปรและคZาส)งการสรUางต)วแปรอะเรย# ไวUในคZาส)งเด;ยวก)นไดU โดยม; รVปแบบคZาส)งด)งน;Y dataType []variableName = new dataType[size]; หรอ dataType variableName[] = new dataType[size]; ต)วอยLางเชLน int []x = new int[5]; 244 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
  • 256. 8.2.3 การเรยกใชสมาช,กของอะเรย. ต)วแปรอะเรย#ท;สรUางขxYนจะม;สมาชกท;ม;หมายเลขต)YงแตL 0 จนถxง size-1 การอUางองถxงสมาชกของอะเรย#แตLละต)ว จะม;รVปแบบด)งน;Y variableName[index] โดยท; index คอต)วเลขระบJหมายเลขท;ของสมาชกของอะเรย# ซxงจะม;คLาไดUต)YงแตLคLา 0 จนถxง size-1 ต)วอยLางเชLน x[3] หมายถxงขUอมVลของสมาชกหมายเลขท; 3 ของต)วแปรอะเรย# x ต)วแปรอะเรย#ท;เปyนชนดขUอมVลแบบพYนฐาน จะแตกตLางจากต)วแปรปกตท;เปyนชนดขUอมVลแบบพYนฐาน โดย ต)วแปรอะเรย#จะกZาหนดคLาเรมตUนใหUก)บสมาชกทJกต)วเสมอ ซxงม;คาเรมตUนเชLนเด;ยวก)บต)วแปรท;เปyนคJณล)กษณะของ L อ5อบเจกต# (ตารางท; 2.5) ขณะท;ต)วแปรปกตจะถVกกZาหนดคLาเรมตUนเฉพาะต)วแปรท;เปyนคJณล)กษณะของอ5อบเจกต# หรอ คJณล)กษณะของคลาสเทLาน)น Y เราสามารถท;จะเปล;ยนแปลงคLาของสมาชกของอะเรย#ไดU โดยการใชUคZาส)งกZาหนดคLา โดยตUองอUางองถxง หมายเลขสมาชกของอะเรย# ต)วอยLางเชLน x[0] = 4; x[2] = 5; เปyนการกZาหนดคLาใหUก)บสมาชกหมายเลขท; 0 และ 2 ของต)วแปรอะเรย# x ใหUมคLาเปyน 4 และ 5 ตามลZาด)บ ; การอUางองถxงชอต)วแปร x โดยไมLระบJหมายเลขสมาชกจะเปyนการเร;ยกดVคLาตZาแหนLงอUางองของต)วแปรอะเรย# โปรแกรมท; 8.1 แสดงต)วอยLางการประกาศและสรUางต)วแปรอะเรย# พรUอมท)YงกZาหนดคLาตLางๆ โดยผลล)พธ#ท;ไดUเปyนด)ง แสดงในรVปท; 8.3 ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 245
  • 257. โปรแกรมท( 8.1 ต)วอยางการใชอะเรย public class SimpleArrays { public static void main(String args[]) { int []x; x = new int[4]; x[0] = 0; x[1] = 2; x[2] = 4; x[3] = 6; System.out.println("x = "+x); System.out.println("x[0] = "+x[0]); System.out.println("x[1] = "+x[1]); System.out.println("x[2] = "+x[2]); System.out.println("x[3] = "+x[3]); } } รปท 8.3 ผลลพธทได*จากการรนโปรแกรมท 8.1 8.2.4 การกDาหนดค0าเร,มตนใหกบสมาช,กของอะเรย. เราสามารถท;จะประกาศต)วแปรอะเรย# สรUางต)วแปรอะเรย# และกZาหนดคLาใหUก)บสมาชกของอะเรย#ภายในคZาส)ง เด;ยวก)น โดยม;รVปแบบของคZาส)งด)งน;Y dataType []variableName = {value1,value2,..,valueN}; โดยท; value1,value2,..,valueN เปyนคLาท;ตUองการกZาหนดใหUก)บสมาชกของอะเรย#แตLละต)ว ซxงจะตUอง เปyนขUอมVลคLาคงท;ท;ม;ชนดขUอมVลท;สอดคลUองก)บชนดขUอมVลของต)วแปรอะเรย# ต)วอยLางเชLน int []x = {4,3,5,1,8}; 246 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
  • 258. เปyนคZาส)งสรUางต)วแปรอะเรย# x ซxงม;จZานวนสมาชก 5 ต)ว โดยท; x[0],x[1], x[2],x[3] และ x[4] ม;คา L เรมตUนเปyน 4, 3, 5, 1 และ 8 ตามลZาด)บ การกZาหนดคLาเรมตUนของต)วแปรอะเรย# ทZาไดUเฉพาะในคZาส)งประกาศต)วแปรเทLาน)Yน ท)Yงน;YเราไมLสามารถท;จะ กZาหนดคLาเรมตUนภายหล)งจากคZาส)งประกาศต)วแปรอะเรย#ไดU กลLาวคอคZาส)ง int []x; x[] = {4, 3, 5, 1, 8}; // illegal เปyนคZาส)งท;ไมLถVกตUอง 8.2.5 การใชคDาสง for เพออางอ,งสมาช,กของอะเรย. โดยท)วไปเราจะใชUคZาส)ง for ในการอUางองถxงสมาชกของอะเรย#ท;ตUองเร;ยกใชUในคZาส)งท;ซYZาก)นอาทเชLน คZาส)ง int x[] = {4,3,5,1,8}; จะเปyนการประกาศและสรUางต)วแปรอะเรย#ท;ม;สมาชกหUาต)ว หากตUองการพมพ#คLาขUอมVลสมาชกของอะเรย#แตLละ ต)วโดยใชUคZาส)งด)งน;Y System.out.println(x[0]); System.out.println(x[1]); System.out.println(x[2]); System.out.println(x[3]); System.out.println(x[4]); จะเห5นไดUวาเปyนการเร;ยกใชUคZาส)งท;ซYZาก)น ซxงเราสามารถจะแทนท;ดUวยคZาส)ง for เพอใหUโปรแกรมกระช)บขxน L Y ด)งน;Y for(int i = 0; i < 5; i++) { System.out.println(x[i]); } ท)Yงน;YภาษาจาวากZาหนดใหUต)วแปรอะเรย#ทJกต)วม;คJณล)กษณะ length เพอระบJจZานวนสมาชกของอะเรย#แตLละ ต)ว ซxงต)วอยLางขUางตUนจะทZาใหU x.length ม;คLาเปyน 5 ด)งน)นสLวนของโปรแกรมขUางตUนสามารถเข;ยนใหมLไดUเปyน Y for(int i = 0; i < x.length; i++) { System.out.println(x[i]); } นอกจากน;เY ราย)งสามารถท;จะเข;ยนคZาส)ง for ในรVปแบบท;เร;ยกวLา enhanced for เพอแจกแจงคLาของต)วแปร ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 247
  • 259. อะเรย#โดยอ)ตโนม)ต ต)วอยLางเชLนคZาส)งขUางตUนสามารถเข;ยนใหมLอ;กคร)YงใหUกระช)บยงขxYนไดUเปyน for(int i : x) { System.out.println(x[i]); } โปรแกรมท; 8.2 แสดงต)วอยLางการใชUคZาส)ง for ก)บต)วแปรอะเรย#เพอกZาหนดคLาและพมพ#คาของสมาชกของ L อะเรย#แตLละต)ว ซxงผลล)พธ#ท;ไดUจะเปyนเชLนเด;ยวก)นก)บผลล)พธ#ท;ไดUจากโปรแกรมท; 8.1 โปรแกรมท( 8.2 ต)วอยางการใชค(าส)ง for public class ForWithArrays { public static void main(String args[]) { int []x; x = new int[4]; for (int i=0; i<x.length; i++) { x[i] = i*2; } System.out.println("x = "+x); for (int i=0; i<x.length; i++) { System.out.println("x["+i+"] = "+x[i]); } } } 8.2.6 ขอผ,ดพลาดประเภท ArrayIndexOutOfBoundsException การอUางองถxงหมายเลขสมาชกของอะเรย#ท;ไมLถVกตUอง จะทZาใหUเกดขUอผดพลาดในตอนร)นโปรแกรมโดย โปรแกรมจะสLงขUอผดพลาด ArrayIndexOutOfBoundsException ออกมาในขณะร)นโปรแกรม ต)วอยLางเชLน คZาส)ง int []x = {4,3,5,1,8}; เปyนคZาส)งประกาศและสรUางต)วแปรอะเรย#ท;ม;จZานวนสมาชกต)YงแตLหมายเลข 0 ถxง 4 การอUางองถxงสมาชกต)วอน เชLน x[5]จะทZาใหUเกดขUอผดพลาดในตอนร)นโปรแกรม โปรแกรมท; 8.3 แสดงต)วอยLางโปรแกรมท;ม;การอUางองสมาชกของต)วแปรอะเรย#ท;ไมLถVกตUอง ซxงผลล)พธ#ท;ไดU เปyนด)งแสดงในรVปท; 8.4 248 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
  • 260. โปรแกรมท( 8.3 ต)วอยางโปรแกรมท%จะสงขอผดพลาดออกมา public class IncorrectArrays { public static void main(String args[]) { int []x = {4,3,5,1,8}; System.out.println(x[5]); } } รปท 8.4 ผลลพธทได*จากการรนโปรแกรมท 8.3 8.3 อะเรย.ของขอมลชน,ดคลาส ต)วแปรอะเรย#ของขUอมVลชนดคลาสคอ ต)วแปรท;ใชUเก5บกลJLมของขUอมVลสมาชกท;เปyน อ5อบเจกต#ของคลาสใด คลาสหนxง ข)YนตอนการสรUางต)วแปรอะเรย#ของขUอมVลชนดคลาสจะม;ขนตอนคลUายก)บข)YนตอนการสรUางต)วแปรอะเรย#ของ )Y ขUอมVลชนดพYนฐาน โดยม;ข)YนตอนตLางๆ ด)งน;Y 1. ข)Yนตอนแรกเปyนการประกาศต)วแปรอะเรย#ซxงจะจองเนYอท;ในหนLวยความจZา เพอเก5บคLาของตZาแหนLงอUางองของ ตZาแหนLงในหนLวยความจZาของสมาชกของอะเรย#แตLละต)ว 2. ข)Yนตอนท;สองเปyนการใชUคZาส)ง new เพอสรUางและจองเนYอท;ในหนLวยความจZาเพอเก5บคLาของตZาแหนLงอUางองของ สมาชกของอะเรย#ซxงจะช;ไปย)งตZาแหนLงท;เก5บขUอมVลจรงๆ Y 3. ข)YนตอนสJดทUายเปyนการสรUางอ5อบเจกต#ของคลาสใหUก)บสมาชกแตLละต)วของอะเรย#โดยใชUคZาส)ง new ซxงจะ เปyนการจองเนYอท;ในหนLวยความจZาเพอเก5บขUอมVลจรงๆ ของอ5อบเจกต# ต)วอยLางเชLน ถUาคลาส Student ม;นยามด)งน;Y ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 249
  • 261. public class Student { private String name; public Student() { name = “NoName”; } public Student(String n) { name = n; } public String getName() { return name; } } เราสามารถท;จะประกาศต)วแปรอะเรย# s ใหUม;ชนดขUอมVลเปyนคลาส Student ตามข)นตอนแรก โดยใชUคZาส)ง Y ด)งน;Y Student []s; ข)นตอนท;สองเปyนการกZาหนดขนาดและสรUางต)วแปรอะเรย# ซxงหากตUองการใหUม;จZานวนสมาชก 3 ต)ว จะทZาไดU Y โดยใชUคZาส)งด)งน;Y s = new Student[3]; ข)นตอนท;สามจะเปyนการอUางองสมาชกของอะเรย#แตLละต)ว หรอสรUางอ5อบเจกต#ของคลาส Student โดยใชUคZา Y ส)ง new เพอเปyนการเร;ยกใชU constructor เหมอนก)บการสรUางอ5อบเจกต#ท)วไปด)งน;Y s[0] = new Student(“Thana”); s[1] = new Student(“Somchai”); s[2] = new Student(“Somsak”); อนxงเราสามารถท;จะใชUคZาส)ง for ในกรณ;ท;ตUองการจะสรUางอ5อบเจกต#ของสมาชกแตLละต)ว โดยเร;ยกใชU constructor แบบ default ไดUด)งน;Y for(int i=0, i<s.length; i++) { s[i] = new Student(); } นอกจากน;เY ราย)งสามารถท;จะรวมคZาส)งท;ใชUในการประกาศ และสรUางต)วแปรอะเรย#ของขUอมVลชนดคลาส และคZา ส)งท;ใชUในการสรUางอ5อบเจกต#ใหUก)บสมาชกของอะเรย#แตLละต)ว ด)งต)วอยLางตLอไปน;Y Student []s = {new Student(“Thana”); new Student(“Somchai”); new Student(“Somsak”)}; 250 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
  • 262. 8.3.1 การเก-บค0าของตวแปรอะเรย.ของขอมลชน,ดคลาส ต)วแปรของขUอมVลชนดคลาสโดยท)วไปจะเปyนต)วแปรแบบอUางอง อาทเชLน คZาส)ง Student s1 = new Student(“Somsri”); จะเปyนการสรUางต)วแปรแบบอUางอง s1 ซxงคLาท; s1 เก5บในหนLวยความจZาจะเปyนตZาแหนLงท;อUางองไปย)งเนYอท;ใน หนLวยความจZาท;เก5บขUอมVลของอ5อบเจกต#ของคลาส Student กรณ;ของต)วแปรอะเรย#ของขUอมVลชนดคลาส ขUอมVลสมาชกของอะเรย#แตLละต)วก5จะเก5บตZาแหนLงอUางองไปย)ง เนYอท;ในหนLวยความจZาท;เก5บขUอมVลของอ5อบเจกต#ของคลาส Student แตLละอ5อบเจกต# รVปท; 8.5 แสดงต)วอยLางการเก5บคLาในหนLวยความจZาของต)วแปร s1 และต)วแปรอะเรย# s ท;สรUางขxYนจากคZาส)ง ขUางตUน รปท 8.5 ตวอย%างการเก-บค%าของตวแปรในหน%วยความจา โปรแกรมท; 8.4 แสดงต)วอยLางโปรแกรมท;ม;การสรUางต)วแปรอะเรย#ชนดขUอมVลคลาส Student และม;การเร;ยก ใชUเมธอด getName() ของอ5อบเจกต#แตLละต)ว ซxงผลล)พธ#ท;ไดUเปyนด)งแสดงในรVปท; 8.6 ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 251
  • 263. โปรแกรมท( 8.4 ต)วอยางอะเรยของขอม1ลชนดคลาส public class Student { private String name; public Student(String n) { name = n; } public String getName() { return name; } } ----------------------------------------------------------- public class TestClassArrays { public static void main(String args[]) { Student []s = {new Student(“Thana”), new Student(“Somchai”), new Student(“Somsak”)}; for(int i=0; i<s.length; i++) { System.out.print(s[i].getName()+" "); } } } รปท 8.6 ผลลพธทได*จากการรนโปรแกรมท8.4 8.4 อะเรย.หลายม,ต, ภาษาจาวากZาหนดใหUม;ต)วแปรอะเรย#ท;เปyนหลายมตอาทเชLน การกZาหนดต)วแปรท;ม;ล)กษณะเปyนเมตรกซ# (matrix) หรอตารางจะตUองใชUต)วแปรอะเรย#ท;เปyนสองมต การประกาศ ต)วแปรอะเรย#ท;ม;ขนาดมากกวLาหนxงมตทZาไดU โดยการเพมเครองหมาย [ ] ในแตLละมต ด)งน)YนรVปแบบการประกาศต)วแปรอะเรย#สองมตม;ด)งน;Y [modifier] dataType [][]variableName; 252 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
  • 264. หรอ [modifier] dataType variableName[][]; ต)วอยLางเชLน int [][]x; เปyนการประกาศต)วแปรอะเรย#สองมต x ซxงม;ชนดขUอมVลเปyน int การสรUางต)วแปรอะเรย#หลายมตจะตUองระบJจZานวนสมาชกของอะเรย#ในแตLละมตโดยใชUคZาส)ง new ด)งน)นรVป Y แบบการสรUางต)วแปรอะเรย#สองมตเปyนด)งน;Y variableName = new dataType[row][col]; โดยท; • row คอจZานวนสมาชกในแตLละแถว • col คอจZานวนสมาชกในแตLละคอล)มน# ต)วอยLางเชLน x = new int[3][4]; เปyนการสรUางต)วแปรอะเรย#สองมต x ซxงม;ขนาด 3 แถว 4 คอล)มน# การเร;ยกใชUสมาชกของอะเรย#สองมตจะตUองระบJตZาแหนLงของแถวและคอล)มน# โดยม;รVปแบบด)งน;Y variableName[row_number][col_number] โดยท; • row_number คอหมายเลขแถวของสมาชกของอะเรย#สองมต • col_number คอหมายเลขคอล)มน#ของสมาชกของอะเรย#สองมต ต)วอยLางเชLน x[2][3] หมายถxงสมาชกของอะเรย# x ตZาแหนLงแถวท; 2 คอล)มน#ท; 3 เปyนตUน ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 253
  • 265. 8.4.1 การเขยนโปรแกรมเพอจดการกบเมตร,กซ. โปรแกรมทางดUานคณตศาสตร#ท;เก;ยวขUองก)บการจ)ดการเมตรกซ# จะตUองใชUต)วแปร อะเรย#ขนาดสองมต โปรแกรมท; 8.5 เปyนต)วอยLางแสดงการบวกและคVณเมตรกซ#สองเมตรกซ#โดยการบวกเมตรกซ#สองเมตรกซ#น)Yนเมตรกซ# ท)YงสองจะตUองม;ขนาดเทLาก)น ผลล)พธ#ท;ไดUจะเปyนการรวมสมาชกแตLละต)วของเมตรกซ#เขUาดUวยก)น อาทเชLน  a 11 a 12 a 13 a 14 a 15   b 11 b 12 b 13 b 14 b 15  a  b  21 a 22 a 23 a 24 a 25   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   สLวนการคVณเมตรกซ# A ก)บเมตรกซ# B น)นจZานวนคอล)มน#ของเมตรกซ# A จะตUองม;ขนาดเทLาก)บจZานวนแถวของ Y เมตรกซ# B โดยถUาเมตรกซ# C เปyนผลล)พธ#ท;ไดUจากการคVณ เมตรกซ#ด)งน;Y  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  b  21 a 22 a 23 a 24 a 25   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   จะไดUสมาชกของเมตรกซ# C แตLละต)วม;คาด)งน;Y L 254 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
  • 266. cij = ai1x b1j + ai2x b2j + ai3x b3j + ai4x b4j + ai5x b5j โปรแกรมท; 8.5 จะม;คZาส)ง int[][]a = new int[5][5]; ท;ใชUในการสรUางต)วแปรอะเรย#สองมต โดยม; คLาของสมาชกของอะเรย#จากการสJLมต)วเลขจZานวนระหวLาง 0 ถxง 9 จากคZาส)ง a[i][j] = (int)(Math.random()*10); โปรแกรมน;จะใชUคZาส)ง for ท;ม;โครงสรUางแบบซUอนอยVLหลายท; ท)Yงน;YเพอชLวยในการจ)ดการประมวลผลขUอมVล Y ของสมาชกต)วแปรอะเรย#คลาส Matrices ม;เมธอดด)งน;Y • addMatrices(int[][] m1, int[][] m2) ใชUเพอคZานวณหาผลล)พธ#ท;ไดUจากการบวกเมตรกซ# โดย ร)บ argument เขUามาเปyนต)วแปรอะเรย#สองมต 2 ต)ว • mulMatrices(int[][] m1, int[][] m2) ใชUเพอคZานวณหาผลล)พธ#ท;ไดUจากการคVณเมตรกซ# โดย ร)บ argument เขUามาเปyนต)วแปรอะเรย#สองมต 2 ต)ว • printMatrix(int[][] m) ใชUเพอแสดงคLาสมาชกแตLละต)วของเมตรกซ#ท;ร)บเขUามาเปyน argument ต)วอยLางผลล)พธ#ท;ไดUจากโปรแกรมน;Yเปyนด)งแสดงในรVปท; 8.7 โปรแกรมท( 8.5 ต)วอยางการค(านวณเมตรกซ public class CalMatrices { public static void main(String args[]) { int[][] a = new int[5][5]; int[][] b = new int[5][5]; int[][] c = new int[5][5]; for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[i].length; j++) { a[i][j] = (int) (Math.random() * 10); b[i][j] = (int) (Math.random() * 10); } } Matrices mt = new Matrices(); System.out.println("Matrix A:"); mt.printMatrix(a); System.out.println("Matrix B:"); mt.printMatrix(b); c = mt.addMatrices(a, b); System.out.println("Matrix A+B:"); mt.printMatrix(c); c = mt.mulMatrices(a, b); System.out.println("Matrix A*B:"); mt.printMatrix(c); } } ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 255
  • 267. public class Matrices { int [][]m = new int[5][5]; public int[][] addMatrices(int[][] m1, int[][] m2) { for (int i=0; i<m1.length; i++) { for (int j=0; j<m1[i].length; j++) { m[i][j] = m1[i][j] + m2[i][j]; } } return m; } public int[][] mulMatrices(int[][] m1, int[][] m2) { int sum; for (int i=0; i<m1.length; i++) { for (int j=0; j<m1[i].length; j++) { sum = 0; for (int k = 0;k < m1[i].length; k++) { sum += m1[i][k] * m2[k][j]; } m[i][j] = sum; } } return m; } public void printMatrix(int[][] m) { for (int i=0; i<m.length; i++) { for (int j=0; j<m[i].length; j++) { System.out.print(m[i][j]+"t"); } System.out.println(); } } } อนxงคJณล)กษณะ length เมอนZามาใชUก)บต)วแปรอะเรย#สองมตจะใหUคLาด)งน;Y x.length จะไดUคาเทLาก)บจZานวน L แถวของต)วแปรอะเรย# สLวน x[i].length จะไดUคาเทLาก)บจZานวนคอล)มน#ในแถวท; i ของต)วแปรอะเรย# L 256 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
  • 268. รปท 8.7 ตวอย%างผลลพธทได*จากการรนโปรแกรมท 8.5 8.4.2 อะเรย.สองม,ต,ทมจDานวนคอลมน.ต0างกน ภาษาจาวาอนJญาตใหUม;การสรUางอะเรย#สองมตท;ม;ขนาดของคอล)มน#ในแตLละแถวไมLเทLาก)นไดU โดยจะตUองระบJ จZานวนแถวโดยใชUคZาส)ง new กLอน แลUวระบJจZานวนคอล)มน#ในแตLละแถว ต)วอยLางเชLนคZาส)ง int [][]x; x = new int[3][]; x[0] = new int[4] x[1] = new int[2]; x[2] = new int[3] เปyนการสรUางต)วแปรอะเรย# x ซxงม;สมาชกจZานวน 3 แถว โดยท;แถวท;หนxงม; 4 คอล)มน# แถวท;สองม; 2 คอล)มน# และแถวท;สามม; 3 คอล)มน# ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 257
  • 269. โปรแกรมท; 8.6 แสดงการสรUางต)วแปรอะเรย#สองมตท;แตLละแถวม;จZานวนคอล)มน#ตLางก)น โปรแกรมน;จะไดU Y ผลล)พธ#ด)งแสดงในรVปท; 8.8 และรVปท; 8.9 แสดงขUอมVลท;อยVLในสมาชกแตLละต)วของอะเรย# โปรแกรมท( 8.6 ต)วอยางการสรางอะเรยสองมตท%แตละแถวม%จ(านวนคอล)มนตางก)น public class TwoDimensionArrays { public static void main(String args[]) { int x[][] = new int[3][]; x[0] = new int[4]; x[1] = new int[2]; x[2] = new int[3]; for(int i=0; i<x.length; i++) { for(int j=0; j<x[i].length; j++) { x[i][j] = (i+j)*2; } } for(int i=0; i<x.length; i++) { for(int j=0; j<x[i].length; j++) { System.out.print(x[i][j]+" "); } System.out.println(); } } } รปท 8.8 ผลลพธทได*จากการรนโปรแกรมท 8.6 รปท 8.9 แสดงตวอย%างข*อมลทอย%ในอะเรย ซ4งเป5นผลลพธทได*จากการรนโปรแกรมท 8.6 258 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
  • 270. 8.4.3 เมธอดทเกยวของกบอะเรย. ภาษาจาวาม;เมธอดหลายเมธอดท;ร)บ argument เปyนอะเรย#ของขUอมVลชนดตLางๆ ต)วอยLางเชLนแพคเก5จ java.lang ม;คลาสท;ชอ Arrays ซxงม;เมธอดท;เก;ยวขUองก)บอะเรย#ท;สZาค)ญด)งน;Y • sort() เปyนเมธอดท;ใชUในการเร;ยงคLาขUอมVลสมาชกของอะเรย#จากนUอยไปมาก • binarySearch() เปyนเมธอดท;ใชUในการคUนหาคLาขUอมVลท;ตUองการจากชJดขUอมVลท)Yงหมดของสมาชกของ อะเรย# ซxงถVกเร;ยงจากนUอยไปมากหรอมากไปนUอยไวUแลUว • fill() เปyนเมธอดท;ใชUในการกZาหนดคLาขUอมVลเด;ยวก)นใหUก)บสมาชกท)Yงหมดของอะเรย# เนองจากเมธอดท)Yงสามเมธอดท;กลLาวมาขUางตUนเปyนเมธอดแบบ static ด)งน)นการเร;ยกใชUงานเมธอดเหลLาน;Yจxง Y สามารถเร;ยกโดยใชUชอคลาส Arrays ไดUเลย ไมLจZาเปyนตUองสรUางอ5อบเจกต#ของคลาส Arrays ขxYนมากLอนการเร;ยกใชU งาน โปรแกรมท; 8.7 แสดงต)วอยLางการเร;ยกใชUเมธอดของคลาส Arrays ท;กลLาวไวUขางตUน โปรแกรมน;เY ร;ยกใชU U เมธอด sort() โดยสLง argument ท;เปyนต)วแปรอะเรย# d ไปเพอเร;ยงคLาขUอมVลของสมาชกของต)วแปรอะเรย# d จากนUอยไปมาก เมธอด binarySearch() จะใชUในการคUนหาสมาชกของต)วแปรอะเรย# d ท;ม;คLาเทLาก)บ 1.65 สLวน เมธอด fill() ใชUในการกZาหนดคLาของสมาชกของต)วแปรอะเรย# d ทJกต)วใหUม;คาเปyน 1.0 โปรแกรมน;จะใหU L Y ผลล)พธ#ด)งแสดงในรVปท; 8.10 ภาษาจาวาไมLยอมใหUม;การเปล;ยนแปลงขนาดของอะเรย# ด)งน)นการใชUคZาส)ง new เพอประกาศขนาดของต)วแปร Y อะเรย#ใหมL จะทZาใหUคาของขUอมVลเดมหายไป ต)วอยLางเชLนคZาส)ง L int []x = {4,7,9}; x = new int[4]; จะเปyนคZาส)งในการประกาศต)วแปรอะเรย# x และสรUางอะเรย#พรUอมก)บกZาหนดคLาเรมตUนใหUก)บสมาชกท)Yง 3 ต)ว ของอะเรย# โดยม;คLาขUอมVลเปyน 4, 7 และ 9 ตามลZาด)บ แตLคZาส)งถ)ดมาจะเปyนการสรUางอะเรย# x ขxนมาใหมLโดยไมLสามารถ Y นZาคLาของขUอมVลเดมกล)บมาไดU จxงทZาใหUคาขUอมVลสมาชกของอะเรย#ท)Yง 4 ต)วม;คLาเทLาก)บ 0 ท&(งหมด L ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 259
  • 271. โปรแกรมท( 8.7 ต)วอยางการเร%ยกใชเมธอดของคลาส Arrays import java.util.Arrays; public class MethodsArrays { public static void main(String args[]) { double d[] = {5.3, 3.56, 0.5, 1.65, 7.8}; Arrays.sort(d); for(int i=0; i<d.length; i++) { System.out.print(d[i]+" "); } System.out.println(); int pos = Arrays.binarySearch(d,1.65); System.out.println("arrays["+pos+"] = 1.65"); Arrays.fill(d,1.0); for(int i=0; i<d.length; i++) { System.out.print(d[i]+" "); } System.out.println(); } } รปท 8.10 ผลลพธธทได*จากการรนโปรแกรมท 8.7 ภาษาจาวาม;คZาส)ง System.arraycopy() ใชUสZาหร)บค)ดลอกคLาขUอมVลของสมาชกของอะเรย#โดยม;โครงสรUาง รVปแบบคZาส)งด)งน;Y System.arraycopy(Object src,int src_pos,Object dst,int dst_pos,int length); โปรแกรมท; 8.8 แสดงต)วอยLางการใชUคZาส)ง System.arrayCopy() โดยสLง argument ซxงเปyนต)วแปรอะเรย# scr ซxงเปyนอะเรย#ตนแบบ เรมจากคLาขUอมVลของสมาชกลZาด)บท; 3 ของอะเรย# src ไปย)งสมาชกลZาด)บท; 0 ของอะเรย# U dst โดยใหUทZาการค)ดลอกขUอมVลท)YงสYน 4 คLาขUอมVล โดยโปรแกรมน;YจะไดUผลล)พธ#ด)งแสดงในรVปท; 8.11 260 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
  • 272. โปรแกรมท( 8.8 ต)วอยางการใชค(าส)ง System.arraycopy(); public class CopyArrays { public static void main(String args[]) { String []scr = {"Copy","an","array","from", " source"," to"," destination."}; String []dst = new String[4]; System.arraycopy(scr,3,dst,0,4); for(int i=0; i<dst.length; i++) { System.out.print(dst[i]); } System.out.println(); } } รปท 8.11 ผลลพธทได*จากการรนโปรแกรมท 8.8 8.5 คอลเล-กชน ต)วแปรอะเรย#เปyนชนดขUอมVลแบบอUางอง ซxงเมอม;การสรUางอะเรย#โดยใชUคZาส)ง new แลUวจะไมLสามารถ เปล;ยนแปลงขนาดของจZานวนสมาชกท;เก5บในอะเรย#ไดU ในกรณ;ท;ตUองการจะเก5บกลJLมของขUอมVลท;สามารถเปล;ยนแปลง ขนาดของจZานวนสมาชกไดU ภาษาจาวาจะใชUคลาสประเภทคอลเล5กช)น (Collection) ซxงเปyนคลาสท;ใชUในการเก5บกลJLม ของขUอมVลชนดคลาสท;ชอ Object ซxงคลาสทJกๆ คลาสในภาษาจาวาจะสบทอดมาจากคลาสท;ชอ Object น;Y ด)งน)น Y คลาสประเภทคอลเล5กช)นสามารถเก5บอ5อบเจกต#ของคลาสใดๆ ในภาษาจาวาไดUตามหล)กการ Dynamic Binding ของ การม;ไดUหลายรVปแบบ ท;ไดUกลLาวถxงไปในบทท; 4 คลาสประเภทคอลเล5กช)นถVกกZาหนดไวUใน Java API ท;ชอ Collection API โดยจะประกอบไปดUวย อนเตอร#เฟสและคลาสตLางๆ ด)งแสดงในรVปท; 8.12 Collection API ไดUกZาหนดอนเตอร#เฟสตLางๆ ท;ม;เงอนไขในการ ใสLขUอมVลของสมาชกของคอลเล5กช)นท;แตกตLางก)นด)งน;Y ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 261
  • 273. • Collection เปyนอนเตอร#เฟสท;กZาหนดเมธอดในการจ)ดการขUอมVลของสมาชก สZาหร)บคลาสประเภท คอลเล5กช)นท;จะตUอง implements อนเตอร#เฟสน;Y • Set เปyนอนเตอร#เฟสท;ใชU implements คลาสประเภทคอลเล5กช)นท;ม;สมาชกท;ม;ขอมVลไมLซYZาก)น และไมLม; U ลZาด)บการใสLขUอมVล • List เปyนอนเตอร#เฟสท;ใชU implements คลาสประเภทคอลเล5กช)นท;ม;สมาชกซxงอาจม;ขUอมVลซYZาก)นไดU แตLจะม;ลZาด)บของสมาชกของการใสLขUอมVล • Map เปyนอนเตอร#เฟสท;ใชU implements คลาสประเภทคอลเล5กช)นซxงสมาชกจะม;องค#ประกอบสองสLวน คอ ขUอมVลและค;ย# (key) ขUอมVลของสมาชกประเภทน;YอาจซYZาก)นไดU แตLค;ยของสมาชกแตLละต)วจะตUองไมLซYZา # ก)น คลาสใน Collection API ท; implements อนเตอร#เฟสเหลLาน;คอ Y HashSet, ArrayList, LinkedList, Vector และ HashMap รปท 8.12 อนเตอรเฟสและคลาสต%างๆ ใน Collection API 8.5.1 อ,นเตอร.เฟส Collection Collection เปyนชออนเตอร#เฟสท;กZาหนดไวUใน Collection API โดยม;เมธอดท;สZาค)ญด)งน;Y • boolean add (Object element) เปyนเมธอดท;ใชUในการใสLสมาชกลงในคอลเล5กช)น โดยสมาชกท;จะใสLตUองเปyนอ5อบเจกต#ของคลาส 262 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
  • 274. ใดคลาสหนxง เมธอดน;จะสLงคLากล)บมาเปyนชนดขUอมVลแบบ boolean โดยจะใหUคาเปyน true ถUา Y L สามารถใสLขUอมVลไดU • boolean remove (Object element) เปyนเมธอดท;ใชUในการลบสมาชกออกจากคอลเล5กช)น โดยตUองสLงผLาน argument ท;เปyนอ5อบเจกต# ท;ตUองการลบออก เมธอดน;จะสLงคLากล)บมาเปyนชนดขUอมVลแบบ boolean โดยจะใหUคาเปyน Y L true ในกรณ;ท;ลบขUอมVลไดU • int size() เปyนเมธอดท;ใชUในการหาจZานวนสมาชกท;ม;อยVLในคอลเล5กช)น • boolean isEmpty() เปyนเมธอดท;ใชUในการตรวจวLาคอลเล5กช)นม;สมาชกอยVLหรอไมL โดยจะสLงคLากล)บมาเปyน true ถUา ไมLม;สมาชกอยVLในคอลเล5กช)น • boolean contains(Object element) เปyนเมธอดท;ใชUในการตรวจสอบวLา คอลเล5กช)นม;สมาชกท;ม;คาเปyนอ5อบเจกต#ของ argument ท;สLง L ผLานมาหรอไมL • Iterator iterator() เปyนเมธอดท;ใชUในการแจกแจงขUอมVลของสมาชกในคอลเล5กช)น 8.5.2 อ,นเตอร.เฟส Set Set เปyนอนเตอร#เฟสท;สบทอดมาจากอนเตอร#เฟส Collection โดยม;คลาสท;สZาค)ญท; implements อนเตอร#เฟสน;Yคอคลาส HashSet คลาส HashSet ใชUในการสรUางอ5อบเจกต#ประเภทคอลเล5กช)นซxงจะม;สมาชกของ ขUอมVลซYZาก)นไมLไดU โปรแกรมท; 8.9 แสดงต)วอยLางการใชUคลาส HashSet โปรแกรมน;YจะตUองม;คZาส)ง import java.util.*; เพอท;จะเร;ยกใชUคลาสตLางๆ ท;กZาหนดใน Collection API โปรแกรมน;YไดUสรUางอ5อบเจกต# s ซxงเปyน อ5อบเจกต#ของคลาส HashSet และเร;ยกใชUเมธอด add() ในการใสLขUอมVลลงในอ5อบเจกต# s โดยปกตแลUว argument ของเมธอด add() จะตUองเปyน อ5อบเจกต#ของคลาสท;ชอ Object แตLโปรแกรมน;YจะสLง argument ท;เปyนอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 263
  • 275. ของคลาส String ซxงสามารถทZาไดUเนองจากคลาส String เปyนคลาสท;สบทอดมาจากคลาสท;ชอ Object โปรแกรมน;YตUองการจะแสดงใหUเห5นวLาเราไมLสามารถท;จะใสLขUอมVลท;ซYZาก)น (ขUอความ “Java”) ลงในอ5อบเจกต#ชนด HashSet ไดU ซxงโปรแกรมน;จะไดUผลล)พธ#ด)งแสดงในรVปท; 8.13 Y โปรแกรมท( 8.9 ต)วอยางการใชคลาส HashSet import java.util.*; public class SampleSet { public static void main(String args[]) { Set s = new HashSet(); s.add("C#"); s.add("Java"); s.add("Pascal"); System.out.println("The size of this set is " + s.size()); System.out.println("The contents are " + s); System.out.println("Removing C#"); s.remove("C#"); System.out.println("Now this set contains C#: " + s.contains("C#")); s.add("Java"); System.out.println("Now the size is " + s.size()); System.out.println("The contents are " + s); } } รปท 8.13 ผลลพธทได*จากการรนโปรแกรมท 8.9 8.5.3 อ,นเตอร.เฟส List List เปyนอนเตอร#เฟสท;สบทอดมาจากอนเตอร#เฟส Collection แตLจะแตกตLางจากอนเตอร#เฟส Set ตรง ท;จะม;ลZาด)บของสมาชกอยVL (index) และสามารถท;ม;สมาชกซxงม;ขอมVลซxงซYZาก)น ซxงอนเตอร#เฟส List จะเพมเมธอดท; U 264 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
  • 276. เก;ยวขUองก)บขUอมVลลZาด)บของสมาชก ด)งน;Y • void add(int index,Object element) เปyนเมธอดในการใสLสมาชกลงในคอลเล5กช)นท;เปyนอ5อบเจกต#ท;ม;คาเปyน argument ท;สLงผLาน โดยม; L ลZาด)บท;เ ปyนเลขจZานวนเต5มใน argument ท;ชอ index • Object remove(int index) เปyนเมธอดในการลบสมาชกลZาด)บท;ซxงม;เลขจZานวนเต5มใน argument ท;ชอ index ออกจาก คอลเล5กช)น • Object get(int index) เปyนเมธอดน;YใชUในการเร;ยกขUอมVลของสมาชกลZาด)บท;ม;เลขจZานวนเต5มใน argument ท;ชอ index • int indexOf(Object element) เปyนเมธอดน;YใชUในการตรวจสอบวLาอ5อบเจกต#ท;ม;คLาใน argument ท;สLงผLานมาเปyนสมาชกลZาด)บท; เทLาไรของคอลเล5กช)น • ListIterator listIterator() เปyนเมธอดน;YใชUในการแจกแจงขUอมVลของสมาชกในคอลเล5กช)นแบบ List คลาสสZาค)ญท; implements อนเตอร#เฟส List ซxงระบJไวUใน Collection API คอคลาส LinkedList และ ArrayList โปรแกรมท; 8.10 แสดงต)วอยLางการใชUคลาส LinkedList โปรแกรมน;Yจะม;คZาส)ง l.get(0) เปyนการเร;ยกขUอมVลของสมาชกลZาด)บท; 0 ในอ5อบเจกต# l ท;เปyนอ5อบเจกต#ของคลาส LinkedList สLวนคZาส)ง l.indexOf(“Java”) เปyนคZาส)งเร;ยกดVลZาด)บท;ของสมาชกในอ5อบเจกต# l ซxงม;ขUอมVลเปyนอ5อบเจกต# String ท;ม; ขUอความใน “Java” โปรแกรมน;แสดงต)วอยLางของขUอแตกตLางระหวLางคลาสประเภท Set และ List ท)Yงน;จะเห5นไดU Y Y จากคZาส)ง l.add(“Java”) สามารถท;จะใสLขUอมVลท;ซYZาก)นไดUโดยโปรแกรมจะไดUผลล)พธ#ด)งแสดงในรVปท; 8.14 ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 265
  • 277. โปรแกรมท( 8.10 ต)วอยางการใชคลาส LinkedList import java.util.*; public class SampleList { public static void main(String args[]) { List l = new LinkedList(); l.add("C#"); l.add("Java"); l.add("Pascal"); System.out.println("The size is "+l.size()); System.out.println("The contents are "+l); System.out.println("The first one is "+l.get(0)); l.add("Java"); System.out.println("The contents are "+l); System.out.println("The index of Java is "+ l.indexOf("Java")); } } รปท 8.14 ผลลพธทได*จากการรนโปรแกรมท 8.10 8.5.4 อ,นเตอร.เฟส Map Map เปyนอนเตอร#เฟสท;สบทอดมาจากอนเตอร#เฟส Collection ซxงสมาชกแตLละต)วของคอลเล5กช)นท;เปyน Map จะม;ขUอมVลอยVLสองสLวนคอ สLวนท;เปyนค;ย#และสLวนท;เปyนขUอมVลซxงเปyนอ5อบเจกต#ของคลาสใดๆ ค;ย#จะทZาหนUาท;ชวย L ในการสบคUนสLวนท;เปyนขUอมVลสมาชกของ Map โดยจะตUองม;คย#ท;ไมLซYZาก)นแตLอาจม;สLวนท;เปyนขUอมVลซYZาก)นไดU ; อนเตอร#เฟส Map จะม;เมธอดตLางๆ ท;เพมขxYนมาเพอชLวยสน)บสนJนการทZางานของค;ย#ด)งน;Y 266 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
  • 278. • Object put(Object key, Object value) เปyนเมธอดท;ใชUในการใสLสมาชกลงในคอลเล5กช)น โดยตUองใสLอ5อบเจกต#ท)YงสLวนท;เปyนค;ย#และสLวนท; เปyนขUอมVลตาม argument ท;ชอ key และ value ตามลZาด)บ • Object remove(Object key) เปyนเมธอดท;ใชUในการลบสมาชกออกจากคอลเล5กช)น โดยสมาชกท;ถVกลบจะม;คาของค;ย#เปyน L อ5อบเจกต#ท;ม;คLาตาม argument ท;ชอ key • Object get(Object key) เปyนเมธอดท;ใชUในการเร;ยกดVขUอมVลของสมาชกในคอลเล5กช)นท;ม;คาของค;ย#เปyนคLาของอ5อบเจกต#ท; L ชอ key ท;ผานมาย)ง argument L • Set entrySet() เปyนเมธอดท;ใชUเร;ยกดVขUอมVลของสมาชกท)Yงหมดในคอลเล5กช)น • Set keySet() เปyนเมธอดท;ใชUเร;ยกดVค;ยของสมาชกท)Yงหมดในคอลเล5กช)น # • int size() เปyนเมธอดท;ใชUในการหาจZานวนสมาชกของคอลเล5กช)น คลาสท;สZาค)ญท; implements อนเตอร#เฟส Map คอคลาส HashMap โปรแกรมท; 8.11 แสดงต)วอยLางการ สรUางอ5อบเจกต#ของคลาสน;แลUวเร;ยกใชUเมธอด put() ในการใสLสมาชกลงในคอลเล5กช)น ท)Yงน;Yเมธอดน;จะตUองสLงผLาน Y Y argument สองต)ว ในท;น;Yท)Yงสองต)วจะสLงผLานอ5อบเจกต#ชนด String เมธอด remove() ในท;นจะใชUในการลบ ;Y สมาชกท;ม;คาของค;ย#เปyน String ท;ม;คLาเปyน “3” โปรแกรมน;YจะใหUผลล)พธ#ด)งแสดงในรVปท; 8.15 L ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 267
  • 279. โปรแกรมท( 8.11 ต)วอยางการใชคลาส HashMap import java.util.*; public class SampleMap { public static void main(String args[]) { Map m = new HashMap(); m.put("1","C#"); m.put("2","Java"); m.put("3","Pascal"); System.out.println("Removing Pascal"); m.remove("3"); System.out.println("The size is "+m.size()); System.out.println("The first one is "+ m.get("1")); m.put("3","Java"); System.out.println("The key of this map are "+ m.keySet()); System.out.println("The contents are "+ m.entrySet()); } } รปท 8.15 ผลลพธทได*จากการรนโปรแกรมท 8.11 8.5.5 อ,นเตอร.เฟส Iterator Iterator เปyนอนเตอร#เฟสท;ใชUในการเร;ยกดVสมาชกของคอลเล5กช)น ท)Yงน;อนเตอร#เฟส Collection จะม; Y เมธอด iterator() ซxงจะสLงอ5อบเจกต#ของคลาสประเภท Iterator กล)บคนมา อนเตอร#เฟส Iterator จะม; เมธอดตLางๆ ท;ใชUในการเร;ยกดVขUอมVลด)งน;Y • boolean hasNext() เปyนเมธอดท;จะตรวจสอบวLาย)งม;ขUอมVลอยVLใน Iterator อ;กหรอไมL 268 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
  • 280. • Object next() เปyนเมธอดท;จะเร;ยกดVคาของอ5อบเจกต#ของสมาชกต)วถ)ดไปของ Iterator โดยจะสLงคLากล)บมา L เปyนอ5อบเจกต#ของคลาสท;ชอ Object • void remove() เปyนเมธอดท;ใชUในการลบสมาชกตZาแหนLงปwจจJบ)นออกจาก Iterator โดยท)วไปตZาแหนLงเรมตUนของ Iterator จะช;Yไปท;ตZาแหนLงกLอนสมาชกของ Iterator ต)วแรกและจะใชU เมธอด next() ในการเร;ยกดVสมาชกต)วตLอๆ ไป โปรแกรมท; 8.12 แสดงต)วอยLางการใชUอนเตอร#เฟส Iterator ใน การเร;ยกดVขUอมVลของสมาชกของอ5อบเจกต#ชนด ArrayList โปรแกรมน;จะใหUผลล)พธ#ด)งแสดงในรVปท; 8.16 Y โปรแกรมท( 8.12 ต)วอยางการใชอนเตอรเฟส Iterator import java.util.*; public class SampleIterator { public static void main(String args[]) { Set scrSet = new HashSet(); scrSet.add("C#"); scrSet.add("Java"); scrSet.add("Pascal"); Iterator it = scrSet.iterator(); Set dstSet = new HashSet(); for(int i=0; i<scrSet.size(); i++) { if(it.hasNext()) { dstSet.add(it.next()); } } System.out.println(dstSet); } } รปท 8.16 ผลลพธทได*จากการรนโปรแกรมท 8.12 ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 269
  • 281. Collection API ย)งม;อนเตอร#เฟสประเภท Iterator ท;สZาค)ญอ;กสองต)วคอ ListIterator และ Enumeration อนเตอร#เฟส ListIterator จะใชUในการเร;ยกดVขUอมVลของคอลเล5กช)นประเภท List โดยม;เมธอดท; สZาค)ญท;เพมมาจากเมธอดของอนเตอร#เฟส Iterator ด)งน;Y • boolean hasPrevious() เปyนเมธอดท;จะตรวจสอบวLาม;ขUอมVลในตZาแหนLงกLอนหนUาน;ใน ListIterator หรอไมL Y • Object previous() เปyนเมธอดท;จะเร;ยกดVคาของอ5อบเจกต#ของสมาชก ในตZาแหนLงกLอนหนUาน;ของ ListIterator L Y โดยจะสLงคLากล)บมาเปyนอ5อบเจกต#ของคลาสท;ชอ Object • void add(Object element) เปyนเมธอดในการใสLสมาชกต)วใหมLลงใน ListIterator • void set(Object element) เปyนเมธอดท;ใชUในการแทนคLาสมาชกของ ListIterator ในตZาแหนLงปwจจJบ)นดUวยคLาท;สLงผLานมา ทาง argument อนเตอร#เฟส List จะม;เมธอด listIterator() ซxงเปyนเมธอดท;สLงคLากล)บเปyนอ5อบเจกต#ประเภท ListIterator() เพอใชUในการแจกแจงขUอมVลของสมาชกของ คอลเล5กช)นประเภท List อนเตอร#เฟส Enumeration จะม;ล)กษณะคลUายก)บอนเตอร#เฟส Iterator โดยจะใชUในการแจกแจงของ ขUอมVลของคอลเล5กช)นตLางๆ อนเตอร#เฟสน;Yจะม;เมธอดท;สZาค)ญสองเมธอดคอ • boolean hasMoreElement() เปyนเมธอดท;ใชUในการตรวจสอบวLาย)งม;สมาชกใน Enumeration อ;กหรอไมL • Object nextElement() เปyนเมธอดท;ใชUในการเร;ยกดVคาของสมาชกใน Enumeration ท;อยVLในตZาแหนLงถ)ดไป L 270 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
  • 282. โดยท)วไปการเร;ยกดVคาของสมาชกของอ5อบเจกต#ประเภท Enumeration จะม;รVปแบบของคZาส)งด)งน;Y L while(e.hasMoreElements()){ System.out.print(e.nextElement() + “ ”); } 8.5.6 คลาส Vector เปyนคลาสประเภทคอลเล5กช)นท;กZาหนดไวUใน Collection API คลาส Vector ใชUเก5บกลJLมของ Vector อ5อบเจกต#ของคลาสใดๆ โดยไมLจZาก)ดจZานวน คลาส Vector เปyนคลาสท; implements อนเตอร#เฟส List เรา สามารถสรUางอ5อบเจกต#ของคลาส Vector โดยเร;ยกใชU constructor ในรVปแบบตLางๆ ด)งน;Y • Vector() • Vector(int initialCapacity) • Vector(int initialCapacity, int capacityIncrement) โดยท; • initialCapacity คอขนาดเรมตUนของ Vector • capacityIncrement คอขนาดท;จะเพมขxYนเมอ Vector ม;ขนาดเต5มแลUว โปรแกรมท; 8.13 เปyนต)วอยLางการใชUอ5อบเจกต#ของคลาส Vector และใชUอนเตอร#เฟส Enumeration ใน การเร;ยกดVขUอมVล โปรแกรมน;YจะใหUผลล)พธ#ด)งแสดงในรVปท; 8.17 โปรแกรมท( 8.13 ต)วอยางการใชอ9อบเจกตของคลาส Vector import java.util.*; public class SampleEnumeration { public static void main(String args[]) { Vector v = new Vector(); v.add("C#"); v.add("Java"); v.add("Pascal"); Enumeration e = v.elements(); while (e.hasMoreElements()) { System.out.print(e.nextElement()+" "); } } } ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 271
  • 283. รปท 8.17 ผลลพธทได*จากการรนโปรแกรมท 8.13 8.5.7 การใชคDาสง for และ Generic เราสามารถท;จะใชUคZาส)ง Generic ในการกZาหนดชนดขUอมVลของอ5อบเจกต#ท;อยVLในคอลเล5กช)น อาทเชLนถUา ตUองการกZาหนดใหUอ5อบเจกต# myList ชนด LinkedList เปyนอ5อบเจกต#ท;เก5บขUอมVลชนด String เราสามารถท; จะประกาศอ5อบเจกต#นโดยใชUคZาส)ง ;Y List<String> myList = new LinkedList<String>(); และเราสามารถท;จะใชUคZาส)ง for ในการท;จะแจกแจงคLาของอ5อบเจกต#ประเภทคอลเล5กช)นแทนท;จะใชU อนเตอร#เฟส Iterator อาทเชLนอ5อบเจกต# myList ท;เปyนม;คาของขUอมVลภายในคอลเล5กช)นเปyน String สามารถ L ท;จะแจงขUอมVลโดยใชUคZาส)ง for ด)งน;Y for (String stringList : myList) { System.out.println(stringList); } โปรแกรมท; 8.14 เปyนต)วอยLางการใชU Generic ในการสรUางอ5อบเจกต#ของคลาส HashSet ท;จะใสLอ5อบเจกต# ชนด Integer และใชUคZาส)ง for ในการแจกแจงขUอมVล โปรแกรมน;จะใหUผลล)พธ#ด)งแสดงในรVปท; 8.18 Y 272 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
  • 284. โปรแกรมท( 8.14 ต)วอยางการใช Generic public class SampleGeneric { public static void main(String args[]) { Set<Integer> scrSet = new HashSet<Integer>(); int[] myInt = {1, 3, 5, 7, 11}; for (int i : myInt) { scrSet.add(i); } for (Integer num : scrSet) { System.out.print(num + " "); } System.out.println(); } } รปท 8.18 ผลลพธทได*จากการรนโปรแกรมท 8.14 สร%ปเนอหาของบท • โดยท)วไปโครงสรUางขUอมVลแบบอะเรย#จะถVกนZามาใชU เมอตUองการเก5บขUอมVลชนดเด;ยวก)นหลายคLา แตLใชU ต)วแปรอะเรย#ตวเด;ยวก)น ) • อะเรย#แบLงออกไดUเปyน 2 ประเภท คออะเรย#ของขUอมVลชนดพYนฐาน และอะเรย#ของขUอมVลชนดคลาสข)Yนตอน ในการสรUางอะเรย#ของขUอมVลชนดพYนฐานคอ การประกาศต)วแปรอะเรย# และการสรUางอะเรย# • ข)YนตอนในการสรUางอะเรย#ของขUอมVลชนดคลาสคอ การประกาศต)วแปรอะเรย# การสรUางอะเรย# และการ สรUางอ5อบเจกต#ใหUก)บสมาชกของอะเรย#แตLละต)ว • ขนาดของอะเรย#สามารถหาไดUจากคJณล)กษณะ length • คZาส)ง for นยมนZามาใชUในการอUางถxงสมาชกของอะเรย# ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 273
  • 285. • เราสามารถสรUางอะเรย#หลายมตไดU โดยจZานวนเครองหมาย [ ] บLงบอกถxงจZานวนมตของอะเรย# • สZาหร)บอะเรย#สองมต จZานวนคอล)มน#ในแตLละแถวไมLจZาเปyนตUองเทLาก)น • ในคลาสท;ชอ Arrays ม;เมธอดสZาค)ญท;เ ก;ยวขUองก)บอะเรย#คอ sort(), binarySearch() และ fill() • เมธอด arraycopy() จากคลาส System ใชUในการค)ดลอกคLาของสมาชกของอะเรย# • Collection, Set, List และ Map เปyนอนเตอร#เฟสสZาค)ญท;อยVLใน Collection API โดยท; อนเตอร#เฟส Set และ List สบทอดมาจากอนเตอร#เฟส Collection • อนเตอร#เฟส Set จะไมLสามารถม;คาขUอมVลของสมาชกท;ซYZาก)นไดU และไมLม;ลZาด)บของสมาชก L • สLวนอนเตอร#เฟส List จะสามารถม;คาขUอมVลของสมาชกท;ซYZาก)นไดU และม;ลZาด)บของสมาชก L • สZาหร)บอนเตอร#เฟส Map จะม;การเก5บคLาค;ย#คVLก)บคLาขUอมVลของสมาชก โดยท;คาค;ย#ของสมาชกจะตUองไมLซYZา L ก)น แตLคLาขUอมVลของสมาชกสามารถซYZาก)นไดU • เราสามารถนZาคลาสท; implements อนเตอร#เฟสเหลLาน;YไปใชUในการเก5บขUอมVลท;เปyนอ5อบเจกต#ไดUหลายต)ว คลUายก)บอะเรย# แตLสามารถเปล;ยนแปลงขนาดไดU • อนเตอร#เฟส Iterator,ListIterator และ Enumeration ใชUในการอUางถxงขUอมVลสมาชกของคลาสท; อยVLใน Collection API • คลาส Vector เปyนคลาสท;ใชUในการเก5บกลJLมของอ5อบเจกต#ของคลาสใดๆ โดยไมLจZาก)ดจZานวน • เราสามารถท;ใชU Generic ในการกZาหนดชนดของอ5อบเจกต#ท;จะใสLขUอมVลลงอ5อบเจกต#คลาสประเภท คอลเล5กช)น • คZาส)ง for สามารถท;จะใชUในการแจกแจงขUอมVลแทนการใชU Iterator หรอ Enumeration ไดU • เราสามารถใชUคZาส)ง Generic ในการกZาหนดชนดขUอมVลของอ5อบเจกต#ท;อยVLในคอลเล5กช)นไดU 274 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
  • 286. บทท 9 การจดการกบขอผ,ดพลาด เนYอหาในบทน;Y เปyนการแนะนZาหล)กการของการจ)ดการก)บขUอผดพลาดในภาษาจาวา แนะนZาคลาสท;เก;ยวขUอง ก)บการจ)ดการก)บขUอผดพลาดท;กZาหนดไวUใน Java API อธบายคZาส)งท;ใชUในการจ)ดการก)บขUอผดพลาดคอคZาส)ง try, catch และ finally อธบายกฎการจ)ดการก)บขUอผดพลาด และตอนทUายของบทจะเปyนการแนะนZาการสรUางคลาส ประเภทขUอผดพลาดขxนมาใหมL Y 9.1 ขอผ,ดพลาด โปรแกรมภาษาจาวาอาจเกดขUอผดพลาด (Exception) ขxนในข)นตอนการร)นโปรแกรม โดยท;ขอผดพลาดเหลLา Y Y U น;YจะไมLสามารถตรวจสอบไดUในข)นตอนการคอมไพล#โปรแกรม ต)วอยLาง เชLน คZาส)ง Y offset = x/n; สZาหร)บต)วแปรท;ม;ชนดขUอมVลเปyน int ท;ชอ offset, x และ n จะเปyนคZาส)งท;สามารถคอมไพล#ผLานไดU แตLถUา คLาของ n เปyนศVนย# โปรแกรมน;YจะเกดขUอผดพลาดขxYนในข)นตอนการร)นโปรแกรม ซxงโปรแกรมภาษาจาวาจะตรวจสอบ Y พบขUอผดพลาดในการหารดUวยจZานวนเต5มศVนย# และจะสLงขUอผดพลาด (throwing an exception) ท;เกดขxนกล)บมา Y โปรแกรมภาษาจาวาแบLงขUอผดพลาดท;อาจเกดขxYนขณะร)นโปรแกรมเปyนสองประเภทคอ 1. Error เปyนขUอผดพลาดท;ไมLสามารถแกUไขและจ)ดการไดU เชLน Virtual MemoryError และ OutOfMemoryError เปyนตUน เราจะไมLกลLาวถxง Error เนองจาก Error เปyนขUอผดพลาดท;เราไมLสามารถเข;ยน โปรแกรมเพอแกUไขและจ)ดการไดU 2. Exception เปyนขUอผดพลาดท;สามารถแกUไขและจ)ดการไดU เชLน ขUอผดพลาดจากการเปmดไฟล#ท;ไมLม;อยVLใน ไดเร5กทอร; (FileNotFoundException) หรอขUอผดพลาดจากการอUางองหมายเลขของสมาชกของอะเรย#ท; ไมLถVกตUอง คอไมLไดUม;อยVLจรง (ArrayIndexOutOfBoundsException) ขUอผดพลาดในภาษาจาวาจะกZาหนดเปyนอ5อบเจกต#ของคลาสตLางๆ มากกวLาหกสบคลาส โดยม;ลZาด)บการสบทอด ด)งแสดงในรVปท; 9.1 ซxงคลาสของขUอผดพลาดเหลLาน;จะสบทอดมาจากคลาส Throwable ซxงเปyนคลาสราก Y ผศ. ธนศา เครอไวศยวรรณ การจ)ดการก)บขUอผดพลาด 275
  • 287. รปท 9.1 คลาสของข*อผดพลาดต%างๆทส0บทอดมาจากคลาสทช0อ Throwable 9.2 Exception คลาสท;ชอ Exception เปyนคลาสท;กZาหนดใน Java API เพอระบJขUอผดพลาดท;เกดขxYนในขณะร)นโปรแกรม ภาษาจาวา Exception แบLงออกเปyนสองประเภทคอ 1. RuntimeException เปyนขUอผดพลาดท;อาจหล;กเล;ยงไดUหากม;การเข;ยนโปรแกรมท;ถVกตUอง ต)วอยLางเชLน ArrayIndexOutOfBoundsException ซxงเปyนขUอผดพลาดเพราะม;การอUางองสมาชกของอะเรย#ท;ไมL ถVกตUอง สามารถแกUไขโปรแกรมใหUด;ขนไดUถUาม;การตรวจสอบหมายเลขสมาชกของอะเรย#กLอนท;จะอUางอง xY โดยใชUคZาส)ง if 2. IOException เปyนขUอผดพลาดท;อาจจะไมLสามารถแกUไขโดยการปร)บปรJงโปรแกรมใหUสมบVรณ#ขนไดU xY เชLน UnknownHostException ท;อาจเกดขxYนในขณะท;โปรแกรมกZาล)งพยายามตดตLอก)บระบบ อนเทอร#เน5ต แตLเครองคอมพวเตอร#ไมLสามารถตดตLอก)บระบบเครอขLายไดU ซxงขUอผดพลาดประเภทน;YไมL สามารถตรวจสอบไดUโดยใชUคZาส)ง if แตLการเร;ยกใชUเมธอดท;อาจเกดขUอผดพลาดประเภท IOException จะตUองม;การเข;ยนคZาส)ง try/catch ในการจ)ดการก)บขUอผดพลาดท;เกดขxYน 276 การจ)ดการก)บขUอผดพลาด ผศ. ธนศา เครอไวศยวรรณ
  • 288. คลาสประเภท Exception ท;สZาค)ญและพบบLอยในโปรแกรมภาษาจาวาม;ด)งน;Y • ArithmeticException เปyนการระบJวLาม;ขUอผดพลาดในนพจน#คณตศาสตร#เชLน การหารดUวยเลขจZานวน เต5มศVนย# • ArrayIndexOutOfBoundsException เปyนการระบJวLาม;การอUางองสมาชกของอะเรย#ไมLถVกตUอง (เปyน เลขจZานวนเต5มลบหรอม;คLามากกวLาหมายเลขสมาชกของอะเรย#ท;ม;อยVL) • EOFException เปyนการระบJวLาตZาแหนLงสYนสJดของไฟล#ไดUผLานมาแลUว • FileNotFoundException เปyนการระบJวLาไมLพบไฟล#ท;ตUองการอUางอง • InterruptedException เปyนการระบJวLา process บาง process ถVกระง)บ (interrupt) • IOException เปyนการระบJขUอผดพลาดท;เกดขxนจากขบวนการอนพJตหรอเอาท#พJตใดๆ Y • NullPointerException เปyนการระบJวLาม;การเร;ยกใชUเมธอดของคลาสจากอ5อบเจกต#ท;ย)งม;ตZาแหนLง อUางองเปyน null อยVL (อ5อบเจกต#ย)งไมLไดUถVกสรUาง) • NumberFormatException เปyนการระบJวLารVปแบบของต)วเลขท;ใชUอยVLไมLถVกตUอง โปรแกรมท; 9.1 แสดงต)วอยLางโปรแกรมท;เกดขUอผดพลาดท;ชอ ArrayIndexOutOfBoundsException แตL เนองจากโปรแกรมน;YไมLม;การจ)ดการก)บขUอผดพลาดด)งกลLาว จxงหยJดทZางานเมอพบขUอผดพลาดขณะร)นโปรแกรม โดย จะใหUผลล)พธ#ด)งแสดงในรVปท; 9.2 โปรแกรมท( 9.1 ต)วอยางแสดงขอผดพลาดท%ชอ ArrayIndexOutOfBoundsException public class ExceptionDemo { public static void main(String args[]) { System.out.println(args[2]); System.out.println("Hello"); } } รปท 9.2 ผลลพธทได*จากการรนโปรแกรมท 9.1 ผศ. ธนศา เครอไวศยวรรณ การจ)ดการก)บขUอผดพลาด 277
  • 289. 9.3 คDาสง try..catch ภาษาจาวาม;ค;ย#เวร#ด try ท;เปyนคZาส)งท;ใชUในการจ)ดการก)บเมธอดหรอคZาส)งท;อาจเกดขUอผดพลาดซxงจะสLง อ5อบเจกต#ประเภท Exception ในขณะร)นโปรแกรม ค;ย#เวร#ด try จะม;ชJดคZาส)งอยVLภายในบล5อกโดยม;รปแบบด)งน;Y V try { [statements] } โปรแกรมภาษาจาวาจะส)งงานชJดคZาส)งท;อยVLในบล5อกท;ละคZาส)ง และหากเกดขUอผดพลาดขxนในคZาส)งใด ก5จะม; Y การสLงอ5อบเจกต#ของขUอผดพลาดประเภท Exception น)นขxนมา ซxงโปรแกรมจะยกเลกการทZางานคZาส)งท;อยVLในบล5อกท; Y Y เหลอท)Yงหมด แตLหากทJกคZาส)งท;อยVLในบล5อกไมLม;ขUอผดพลาดใดเกดขxYน โปรแกรมจาวาก5จะทZางานตLอไปตามปกตเสมอน วLาไมLม;ค;ยเ# วร#ด try อยVL ในกรณ;ท;ตUองการจ)ดการก)บขUอผดพลาดท;เกดขxYน โปรแกรมจะตUองม;ชJดคZาส)งอยVLในบล5อกของ ค;ย#เวร#ด catch ท;จะระบJชนดของอ5อบเจกต#ในคลาสประเภท Exception ท;ตUองการจ)ดการโดยม;รVปแบบคZาส)งด)งน;Y catch(ExceptionType argumentName){ [statements] } โดยท; • ExceptionType คอชอคลาสประเภท Exception ท;ตUองการจะจ)ดการเมอม;ขUอผดพลาดเกดขxYน • argumentName คอชอของอ5อบเจกต#ท;จะเปyน argument ท;ใชUในบล5อกคZาส)งของ catch โปรแกรมภาษาจาวาจะทZาชJดคZาส)งในบล5อก catch ถUาม;คZาส)งในบล5อก try คZาส)งใดคZาส)งหนxงเกดขUอผด พลาดโดยสLงอ5อบเจกต#ประเภท Exception ตามชนดท;สอดคลUองก)บคลาสท;ระบJใน ExceptionType และโปรแกรม จะขUามคZาส)งท;เหลออยVLในบล5อก try ท)Yงหมด สLวนในกรณ;ท;ไมLม;คZาส)งใดในบล5อก try เกดขUอผดพลาดขxYน โปรแกรม ภาษาจาวาจะไมLม;การทZาชJดคZาส)งในบล5อก catch โปรแกรมท; 9.2 แสดงต)วอยLางการจ)ดการก)บขUอผดพลาดท;อาจเกด ขxYนในโปรแกรมท; 9.1 โปรแกรมน;ไดUเพมชJดคZาส)ง try และ catch ขxYนมา ซxงโปรแกรมน;จะใหUผลล)พธ#ด)งแสดงในรVป Y Y ท; 9.3 278 การจ)ดการก)บขUอผดพลาด ผศ. ธนศา เครอไวศยวรรณ
  • 290. โปรแกรมท( 9.2 ต)วอยางการจ)ดการก)บขอผดพลาดท%อาจเกดขน public class ExceptionHandlingDemo { public static void main(String args[]) { try { System.out.println(args[2]); } catch(ArrayIndexOutOfBoundsException ex) { System.out.println("There is no third command line argument"); } } } รปท 9.3 ผลลพธทได*จากการรนโปรแกรมท 9.2 9.4 การจดการกบขอผ,ดพลาดหลายๆ ประเภท โปรแกรมภาษาจาวาสามารถจะม;ชJดคZาส)งของบล5อก catch ไดUมากกวLาหนxงชJดสZาหร)บในแตLละบล5อกคZาส)ง try โดยท;ชนดของอ5อบเจกต#ประเภท Exception ท;อยVLในชJดคZาส)งของบล5อก catch จะตUองเร;ยงตามลZาด)บการ สบทอด โปรแกรมท; 9.3 แสดงต)วอยLางการจ)ดการก)บขUอผดพลาดมากกวLาหนxงประเภท โดยม;ชJดคZาส)งในบล5อก catch สองชJดเพอจ)ดการก)บขUอผดพลาดสองชนดคอ ArithmeticException และ ArrayIndexOutOfBoundsException โปรแกรมน;Yจะร)บ argument ผLานทาง command line ซxงจะเปyนต)วเลข ท;ม;ชนดขUอมVลเปyน String แลUวจxงจะถVกแปลงใหUม;ชนดขUอมVลเปyน int ซxงหากขUอมVลเปyนจZานวนเต5มศVนย#ก5จะทZาใหUเกด ขUอผดพลาดชนด ArithmeticException ขxYนไดU โดยโปรแกรมจะขUามมาทZาชJดคZาส)งในบล5อก catch ท;ตรวจจ)บอ5 อบเจกต#ชนดด)งกลLาว และโปรแกรมจะจ)ดการก)บขUอผดพลาดชนด NumberFormatException ถUา argument ท;ร)บ ผLานทาง command line ไมLใชLขUอความท;แปลงเปyนต)วเลขจZานวนเต5มไดU โดยโปรแกรมจะขUามมาทZาชJดคZาส)งในบล5อก catch ท;ตรวจจ)บอ5อบเจกต#ชนด NumberFormatException โดยม;ผลล)พธ#ของโปรแกรมด)งต)วอยLางท;แสดงในรVปท; 9.4 ผศ. ธนศา เครอไวศยวรรณ การจ)ดการก)บขUอผดพลาด 279
  • 291. ในกรณ;ท;ม;ขUอผดพลาดเกดขxYน ภาษาจาวาจะพจารณาวLาเปyนขUอผดพลาดชนดใด ซxงการท;จะจ)ดการก)บอ5อบเจกต# ประเภท Exception น)นจะพจารณาจากคลาสท;ม;การสบทอดตาม ลZาด)บช)Yน ท)Yงน;Yเราสามารถจะจ)ดการก)บอ5อบเจกต# Y ประเภท Exception โดยใชUคลาสท;เปyน superclass ของอ5อบเจกต#นนไดU อาทเชLนอ5อบเจกต#ชนด )Y FileNotFoundException สามารถจ)ดการไดUโดยใชUคลาส IOException หรอ Exception แทนไดUเนองจาก คลาส FileNotFoundException สบทอดมาจากคลาส IOException ซxงสบทอดมาจากคลาส Exception อ;ก ช)Yนหนxง โปรแกรมท( 9.3 ต)วอยางการจ)ดการก)บขอผดพลาดมากกวาหนงประเภท public class ExceptionHandlingDemoV2 { public static void main(String args[]) { try { int i = Integer.parseInt(args[0]); System.out.println(4 / i); } catch(ArithmeticException ex) { System.out.println(ex.toString()); } catch(NumberFormatException ex) { System.out.println("Invalid numeric format"); } } } รปท 9.4 ผลลพธทได*จากการรนโปรแกรมท 9.3 ภาษาจาวากZาหนดใหUชJดคZาส)งในบล5อก catch จะตUองเร;ยงอ5อบเจกต#ของคลาสประเภท Exception ตาม ลZาด)บการสบทอด ต)วอยLางเชLน โปรแกรมท; 9.3 ถxงแมUวLาจะม;คลาสประเภท Exception ท;จะตรวจจ)บสองชนด แตL เนองจากคลาสท)YงสองตLางก5สบทอดมาจาก RunTimeException และอยVLในลZาด)บช)Yนเด;ยวก)นจxงสามารถท;จะสล)บชJด คZาส)งในบล5อก catch ท)YงสองไดU แตLในกรณ;ของโปรแกรมท; 9.4 ชJดคZาส)งในบล5อก catch ท;จะจ)ดการก)บคลาส RunTimeException อยVLลZาด)บกLอนหนUาชJดคZาส)งในบล5อก catch ท;จะจ)ดการก)บคลาส 280 การจ)ดการก)บขUอผดพลาด ผศ. ธนศา เครอไวศยวรรณ
  • 292. ArrayIndexOutOfBoundsException ด)งน)นโปรแกรมน;YจงไมLม;โอกาสท;จะทZาชJดคZาส)งท;สองไดUเนองจากคลาส Y x ArrayIndexOutOfBoundsException สบทอดมาจากคลาส RunTimeException จxงทZาใหUโปรแกรมน;YไมL สามารถคอมไพล#ผานไดU L โปรแกรมท( 9.4 ต)วอยางการจ)ดวางล(าด)บคลาสท%จะมาจ)ดการก)บขอผดพลาดท%ไมถ1กตอง public class ExceptionHandlingDemoV3 { public static void main(String args[]) { try { int i = Integer.parseInt(args[0]); System.out.println(4 / i); System.out.println(args[2]); } catch(RuntimeException ex) { System.out.println(ex.toString()); } catch(ArrayIndexOutOfBoundsException ex) { System.out.println("There is no third command line argument"); } } } 9.5 บล-อก finally ภาษาจาวาม;ค;ย#เวร#ด finally ท;จะม;ชJดคZาส)งอยVLในบล5อก เพอระบJใหUโปรแกรมทZาชJดคZาส)งด)งกลLาวหล)งจาก สYนสJดการทZางานของชJดคZาส)งในบล5อก try หรอ catch โปรแกรมท; 9.5 แสดงต)วอยLางการกZาหนดชJดคZาส)งในบล5อก finally ซxงโปรแกรมน;YจะใหUผลล)พธ#ด)งแสดงในรVปท; 9.5 ภาษาจาวาจะทZาชJดคZาส)งในบล5อก finally เสมอ แมUวLาจะม;คZาส)ง return ในบล5อก try หรอ catch กLอน ก5ตาม กรณ;เด;ยวท;จะไมLทZาชJดคZาส)งในบล5อก finally คอม;คZาส)ง System.exit(); เพอท;จะออกจากโปรแกรม โปรแกรมท; 9.6 แสดงต)วอยLางท;ม;คZาส)ง return อยVLกLอนชJดคZาส)งในบล5อก finally โดยโปรแกรมน;จะไดUผลล)พธ#ด)ง Y รVปท; 9.6 ผศ. ธนศา เครอไวศยวรรณ การจ)ดการก)บขUอผดพลาด 281
  • 293. โปรแกรมท( 9.5 ต)วอยางการก(าหนดชดค(าส)งในบล9อก finally public class FinallyDemo { public static void main(String args[]) { try { System.out.println(args[2]); System.out.println("Hello"); } catch(ArrayIndexOutOfBoundsException ex) { System.out.println("There is no third argument"); } finally { System.out.println("Finish running the program"); } } } รปท 9.5 ผลลพธทได*จากการรนโปรแกรมท 9.5 โปรแกรมท( 9.6 ต)วอยางท%ม%ค(าส)ง return อย1กอนชดค(าส)งในบล9อก finally public class FinallyDemoV2 { public static void main(String args[]) { FinallyDemoV2 obj = new FinallyDemoV2(); obj.myMethod(args); } public int myMethod(String args[]) { try { System.out.println(args[2]); return 0; } catch(ArrayIndexOutOfBoundsException ex) { System.out.println("There is no third argument"); } finally { System.out.println("Finish running the program"); return 1; } } } 282 การจ)ดการก)บขUอผดพลาด ผศ. ธนศา เครอไวศยวรรณ
  • 294. รปท 9.6 ผลลพธทได*จากการรนโปรแกรมท 9.6 9.6 การจดการกบเมธอดทส0งอ-อบเจกต.ประเภท Exception เมธอดบางเมธอดท;กZาหนดใน Java API อาจสLงอ5อบเจกต#ประเภท Exception เมอเกดขUอผดพลาดขxนในการ Y เร;ยกใชUคZาส)ง อาทเชLน constructor ของคลาส FileInputStream อาจสLงอ5อบเจกต#ของคลาส FileNotFoundException ถUาไมLพบไฟล#ด)งกลLาว หรอเมธอด getLocalHost() ของคลาส InetAddress อาจ สLงอ5อบเจกต#ของคลาส UnknownHostException ถUาไมLทราบ IP address ของเครอง ภาษาจาวากZาหนดใหUเราตUองเข;ยน โปรแกรมจ)ดการก)บขUอผดพลาด เมอม;การเร;ยกใชUเมธอดท;อาจสLงอ5อบเจกต#ประเภท IOException สZาหร)บเมธอด ซxงการจ)ดการก)บขUอผดพลาดแบLงออกเปyน 1. ใชUคZาส)ง try/catch ด)งท;กลLาวไวUในห)วขUอท;ผานมา L 2. ใชUคZาส)ง throws ในการประกาศเมธอดท;จะม;การเร;ยกใชUเมธอดใดๆท;อาจสLง อ5อบเจกต#ประเภท Exception ในกรณ;นหมายความวLาเมธอดท;ประกาศไมLตUองการจ)ดการก)บอ5อบเจกต# ;Y ประเภท Exception ด)งกลLาวเอง แตLตUองการจะใหUเมธอดอนๆท;เร;ยกใชUเมธอดน;Yเปyนต)วจ)ดการแทน รVปแบบการใชUคZาส)ง throws ม;ด)งน;Y [modifier] return_type methodName([arguments]) throws ExceptionType [,ExceptionType2]{ ... } ต)วอยLางเชLน public void openFile(String s)throws FileNotFoundException { } เมธอดใดๆ สามารถท;จะจ)ดการก)บอ5อบเจกต#ประเภท Exception โดยใชUคZาส)ง throws ไดUมากกวLาหนxงชนด ต)วอยLางเชLน ผศ. ธนศา เครอไวศยวรรณ การจ)ดการก)บขUอผดพลาด 283
  • 295. public void openFile(String s)throws FileNotFoundException, UnknownHostException { } กรณ;ท;ม;การใชUคZาส)ง throws แลUวสLงตLอใหUเมธอดอนๆท;เร;ยกใชUเปyนต)วจ)ดการก)บอ5อบเจกต#ประเภท Exception ด)งกลLาวไปเรอยๆ แตLถาเมธอดท;ชอ main() ซxงเร;ยกใชUเมธอดสJดทUายท;ใชUคZาส)ง throws ไมLม;การจ)ดการ U ก)บอ5อบเจกต#ประเภท Exception ด)งกลLาว โปรแกรมจะเกดขUอผดพลาดในข)นตอนการร)นโปรแกรม เมอม;ขUอผดพลาด Y ของอ5อบเจกต#ประเภท Exception ด)งกลLาวเกดขxน ต)วอยLางเชLนโปรแกรมท; 9.7 ซxงผลล)พธ#ท;ไดUจากการร)นเปyนด)งแสดง Y ในรVปท; 9.7 โปรแกรมท( 9.7 ต)วอยางท%ไมม%การจ)ดการก)บอ9อบเจกตประเภท Exception public class ExceptionDemo1 { public static void main(String args[]) { ExceptionDemo1 ex1 = new ExceptionDemo1(); ex1.method1(); } public void method1() throws ArithmeticException { method2(); } public void method2() throws ArithmeticException { System.out.println(2/0); } } รปท 9.7 ผลลพธทได*จากการรนโปรแกรมท 9.7 เราสามารถท;จะใชUคZาส)ง throws ในเมธอดท;ชอ main() ไดU แตLจะเปyนการยกเลกการจ)ดการใดๆก)บขUอผด พลาดท)Yงหมดท;อาจเกดขxYน นอกจากน;ภาษาจาวาไมLไดUกZาหนดใหUเราจะตUองเข;ยนคZาส)งในการจ)ดการก)บเมธอด ท;อาจสLง Y ขUอผดพลาดของอ5อบเจกต#ประเภท RuntimeException แตLจะกZาหนดไวUเฉพาะเมธอดท;อาจสLงขUอผดพลาดของ อ5อบเจกต#ประเภท IOException 284 การจ)ดการก)บขUอผดพลาด ผศ. ธนศา เครอไวศยวรรณ
  • 296. เมธอดท;มคZาส)ง throws จะม;ผลตLอการสบทอด ท)Yงน;เY นองจากกฎของการกZาหนดเมธอดแบบ overridden จะ ; ไมLอนJญาตใหUม;การจ)ดการอ5อบเจกต#ประเภท Exception โดยใชUคZาส)ง throws มากชนดกวLาท;เมธอดเดมจ)ดการอยVL โปรแกรมท; 9.8 และโปรแกรมท; 9.9 แสดงต)วอยLางโปรแกรมท;ม;เมธอดแบบ overridden ท;ถVกตUองและไมLถVกตUองตาม ลZาด)บ โปรแกรมท( 9.8 ต)วอยางท%ม%เมธอดแบบ overridden ท%ถ1กตอง import java.io.*; public class Parent { public void myMethods() throws IOException { } } public class OverrideException extends Parent{ public void myMethods() throws IOException { new FileInputStream("temp.txt"); } } โปรแกรมท( 9.9 ต)วอยางท%ม%เมธอดแบบ overridden ท%ไมถ1กตอง import java.io.*; public class Parent { public void myMethods() throws FileNotFoundException { } } public class OverrideExceptionV2 extends Parent{ public void myMethods() throws FileNotFoundException,IOException { new FileInputStream("temp.txt"); } } 9.7 การสรางคลาสประเภท Exception ขKนใหม0 Java API ม;คลาสประเภท Exception อยVLหลายชนดแตLในบางคร)YงเราอาจตUองการท;จะกZาหนดคลาสประเภท Exception ขxนมาใหมL Y เพอใชUในการระบJขUอผดพลาดเฉพาะเจาะจงเชLน โปรแกรมระบบทะเบ;ยนน)กศxกษาอาจม;คลาสท; ชอ StudentIDNotFoundException เพอใชUในการสรUางอ5อบเจกต#ท;จะสLงขUอผดพลาด เมอไมLสามารถตรวจพบรห)ส น)กศxกษาท;ตUองการ การสรUางคลาสประเภท Exception ขxนมาใหมL สามารถทZาไดUโดยนยามคลาสใดๆใหUสบทอดมาจาก Y ผศ. ธนศา เครอไวศยวรรณ การจ)ดการก)บขUอผดพลาด 285
  • 297. คลาสท;ชอ Exception ในกรณ;ท;ตUองการบ)งค)บใหUเมธอดใดๆ จ)ดการก)บอ5อบเจกต#ของคลาสน)นในกรณ;ท;เกดขUอผด Y พลาดขxYน หรอนยามคลาสใดๆใหUสบทอดมาจากคลาส Runtime Exception ในกรณ;ท;ไมLตUองการใหUเมธอดใดๆ จZาเปyนตUองจ)ดการก)บขUอผดพลาดด)งกลLาว โดยท)วไปคลาสท;ชอ Exception จะม; constructor สองรVปแบบคอ • public Exception() • public Exception(String s) ด)งน)นคลาสท;สบทอดมาจากคลาสท;ชอ Exception ควรจะม; constructor ท)Yงสอง โดยรVปแบบหนxงจะม; Y argument ท;ม;ชนดขUอมVลเปyน String เพอร)บขUอความท;จะอธบายขUอผดพลาดและคZาส)งแรกใน constructor ด)งกลLาว ควรเปyนคZาส)ง super(s); เพอสLงขUอความด)งกลLาวใหUก)บ constructor ของ superclass (คลาสท;ชอ Exception) โปรแกรมท; 9.10 แสดงต)วอยLางของคลาส MyOwnException ซxงเปyนคลาสประเภท Exception ท;กZาหนดขxนใหมL Y โปรแกรมท( 9.10 ต)วอยางคลาสประเภท Exception ท%ก(าหนดขนใหม public class MyOwnException extends Exception { public MyOwnException (String s) { super(s); } } 9.7.1 การเขยนเมธอดเพอส0งอ-อบเจกต.ประเภท Exception เมธอดท;ตUองการสLงอ5อบเจกต#ประเภท Exception เมอเกดขUอผดพลาดขxนในคZาส)งใด จะตUองเร;ยกใชUคZาส)งท;ชอ Y throw เพอจะสรUางอ5อบเจกต#ของคลาสประเภท Exception ขxYนมา โดยม;รVปแบบคZาส)งด)งน;Y throw new ExceptionType([arguments]) โดยท; • ExceptionType คอชอของคลาสประเภท Exception ท;ตUองการจะสรUาง อ5อบเจกต#โดยม; argument สอดคลUองก)บท;ระบJใน constructor ของคลาสด)งกลLาว นอกจากน;คZาส)งประกาศเมธอดน)YนจะตUองม;คZาส)ง throws เพอกZาหนดใหUคZาส)งในเมธอดอนๆท;เร;ยกใชUเมธอด Y น;YตUองเข;ยนคZาส)งในการจ)ดการก)บขUอผดพลาดน;Y โปรแกรมท; 9.11 แสดงต)วอยLางการเข;ยนคลาส FileHandler โดยม; เมธอด openFile() ซxงจะสLงอ5อบเจกต#ของคลาส MyOwnException ขxYนมาเมอไมLพบไฟล#ท;ระบJ สLวนโปรแกรมท; 286 การจ)ดการก)บขUอผดพลาด ผศ. ธนศา เครอไวศยวรรณ
  • 298. 9.12 แสดงต)วอยLางโปรแกรมท;ม;การจ)ดการก)บขUอผดพลาดด)งกลLาว โปรแกรมท( 9.11 ต)วอยางคลาส FileHandler import java.io.*; public class FileHandler { public static void openFile(String filename) throws MyOwnException { File f = new File(filename); if (!f.exists()) { throw new MyOwnException("File Not Found"); } } } โปรแกรมท( 9.12 ต)วอยางท%ม%การจ)ดการก)บขอผดพลาด public class FileOpener { public static void main(String args[]) { try { FileHandler.openFile(args[0]); System.out.println("Open successful"); } catch (MyOwnException ex) { System.out.println(ex); } } } สร"ปเน-อหาของบท • ขUอด;ประการหนxงของภาษาจาวาคอ เราสามารถเข;ยนโปรแกรมใหUม;การตรวจจ)บและจ)ดการก)บขUอผดพลาด ท;อาจเกดขxYนไดU โดยท;การทZางานไมLตUองหยJดลง • Error เปyนขUอผดพลาดท;ไมLสามารถแกUไขและจ)ดการไดU สLวน Exception เปyนขUอผดพลาดท;สามารถแกUไข หรอจ)ดการไดU • คZาส)ง try และ catch เปyนคZาส)งท;ใชUในการตรวจจ)บและจ)ดการก)บขUอผดพลาดท;อาจเกดขxนไดU โดยบล5อก Y คZาส)ง catch สามารถม;ไดUมากกวLาหนxงบล5อกสZาหร)บในแตLละบล5อกคZาส)ง try • คZาส)ง finally เปyนคZาส)งท;อยVLตLอจากคZาส)ง try/catch ถVกใชUเมอม;บางคZาส)งท;ตUองการใหUม;การทZาเสมอ ผศ. ธนศา เครอไวศยวรรณ การจ)ดการก)บขUอผดพลาด 287
  • 299. ยกเวUนเจอคZาส)ง System.exit(0); กLอนเทLาน)น Y • คZาส)ง throws จะใสLไวUตรงคZาส)งประกาศเมธอด สZาหร)บเมธอดท;ย)งไมLตUองการจ)ดการก)บขUอผดพลาดแตLจะ ใหUเมธอดท;เร;ยกใชUเมธอดน;เY ปyนต)วจ)ดการแทน • เราสามารถสรUางคลาสประเภท Exception ชนดใหมLขนไดU โดยจะตUองสบทอดมาจากคลาส xY Exception และตUองม;การเร;ยกใชU constructor ของคลาส Exception ดUวย 288 การจ)ดการก)บขUอผดพลาด ผศ. ธนศา เครอไวศยวรรณ
  • 300. บทท 10 คลาสอ,นพ%ตและเอาต.พ%ต เนYอหาในบทน;YเปyนการแนะนZาคลาสและเมธอดตLางๆ ท;เก;ยวก)บอนพJตและเอาต#พJต และอธบายความหมายของ stream โดยอธบายคลาสท;เก;ยวขUองก)บอนพJตและเอาต#พJตท;อยVLในแพคเก5จ java.io แนะนZาคลาส InputStream, OutputStream, Reader และ Writer อธบายการสรUางและใชU stream แบบตLางๆ แนะนZาคลาสและเมธอดของ คลาส File และ RandomAccessFile อธบายการใชUอนเตอร#เฟสท;ชอ Serializable และอธบายวธ;การเข;ยนและ อLานขUอมVลของอ5อบเจกต#ผาน stream L 10.1 Stream ภาษาจาวาจ)ดการก)บขบวนการอนพJตและเอาต#พJตโดยใชUหล)กการของ stream ซxงเปร;ยบเสมอนทLอสLงขUอมVล จากตUนทาง (source) ไปย)งปลายทาง (sink) โดยท;ตUนทางเปyนตZาแหนLงเรมตUนของ stream ท;เร;ยกวLา input stream และปลายทางเปyนตZาแหนLงสYนสJดของ stream ท;เร;ยกวLา output stream ด)งแสดงในรVปท; 10.1 stream จะชLวยใหU น)กพ)ฒนาโปรแกรมสามารถท;เข;ยนโปรแกรมเพอสLงขUอมVลจากตUนทางไปย)งปลายทางไดU โดยไมLจZาเปyนตUองทราบ รายละเอ;ยดภายในของการตดตLอก)บฮาร#ดแวร#หรอซอฟต#แวร#ท;ในการสLงขUอมVล ซxงสามารถเข;ยนโปรแกรมไดUโดยเพ;ยง แตLรเVU มธอดท;ใชUในการร)บหรอสLงขUอมVลเทLาน)น Y รปท 10.1 หลกการของ stream ตUนทางและปลายทางของ stream อาจเปyนฮาร#ดแวร#หรอซอฟต#แวร# โดยจะเร;ยกวLา โหนด(node) เชLน ไฟล# หนLวยความจZา หรอ socket เปyนตUน ซxงตUนทางและปลายทางอาจม;ชนดของโหนดท;ตLางก)น อาทเชLน การอLานขUอมVลจาก ต)วแปรท;เก5บในหนLวยความจZาท;เปyนตUนทางผLาน stream ลงไปเก5บไวUในไฟล#ท;เปyนปลายทาง ผศ. ธนศา เครอไวศยวรรณ คลาสอนพJตและเอาต#พJต 289
  • 301. stream ท;ใชUในการสLงขUอมVลของภาษาจาวาจะแบLงออกเปyนสองประเภทคอ – byte stream เปyน stream ท;ใชUในการร)บหรอสLงขUอมVลชนด byte – character stream เปyน stream ท;ใชUในการร)บหรอสLงขUอมVลชนด char โดยท)วไปคZาวLา stream จะหมายถxง byte stream สLวน character stream ภาษาจาวาจะใชUคZาวLา reader และ write สZาหร)บ stream ในการร)บและสLงชนดขUอมVล char ตามลZาด)บ 10.1.1 แพคเก%จ java.io คลาสท;เก;ยวก)บอนพJตและเอาต#พJตจะถVกกZาหนดโดย Java API ในแพคเก5จ java.io ซxงจะม;คลาสพYนฐานอยVL 4 คลาสคอ • InputStream เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เปyน stream ในการร)บชนดขUอมVลแบบ byte • OutputStream เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เปyน stream ในการสLงชนดขUอมVลแบบ byte • Reader เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เปyน stream ในการร)บชนดขUอมVลแบบ char • Writer เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เปyน stream ในการสLงชนดขUอมVลแบบ char ซxงคลาสท)Yงส;น;Yจะเปyนคลาสท;เปyนคลาสรากของคลาสอนๆท;จะสบทอดมา ด)งแสดงในร1ปท% 10.2 ถxงรVปท; 10.5 รปท 10.2 คลาสประเภท InputStream 290 คลาสอนพJตและเอาต#พJต ผศ. ธนศา เครอไวศยวรรณ
  • 302. รปท 10.3 คลาสประเภท OutputStream รปท 10.4 คลาสประเภท Reader รปท 10.5 คลาสประเภท Writer ผศ. ธนศา เครอไวศยวรรณ คลาสอนพJตและเอาต#พJต 291
  • 303. 10.1.2 คลาสประเภท Byte Stream ภาษาจาวาจะม;คลาสพYนฐานในการจ)ดการก)บอนพJตและเอาต#พJต ท;เปyนชนดขUอมVลแบบ byte อยVLสองคลาสท; คVLก)นคอ InputStream และ OutputStream คลาสท)Yงสองเปyนคลาสแบบ abstract ซxงเราไมLสามารถท;จะสรUาง อ5อบเจกต#ของคลาสท)YงสองไดU แตLคลาสท)Yงสองจะม;คลาสท;เปyน subclass ซxงจะใชUในการสรUางอ5อบเจกต#สZาหร)บการร)บ และสLงขUอมVลแบบ byte ของโหนดท;ม;ตUนทางและปลายทางแบบตLางๆอาทเชLน • FileInputStream และ FileOutputStream เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#สZาหร)บตUนทาง และปลายทางท;เปyนไฟล# • ByteArrayInputStream และ ByteArrayOutputStream เปyนคลาสท;ใชUในการสรUางอ5อบเจกต# สZาหร)บตUนทางและปลายทาง ท;เปyนอะเรย#ของชนดขUอมVลแบบ byte 10.1.3 คลาส InputStream คลาส InputStream จะใชUในการอLานขUอมVลของ stream ท;เปyนชนดขUอมVลแบบ byte คลาส InputStream จะนZาขUอมVลจากโหนดตUนทางเขUามาใน stream และการอLานขUอมVลจาก stream จะเปyนการลบขUอมVลท;อานออกจาก L stream ด)งแสดงในรVปท; 10.6 โดยม;เมธอดท;ใชUสZาหร)บการอLานขUอมVลท;เปyน byte หรออะเรย#ของ byte เทLาน)นด)งน;Y Y • int read() เปyนเมธอดท;ใชUในการอLานขUอมVลจาก stream มาหนxงไบท#โดยจะสLงคLากล)บมาเปyนคLาท;อานไดUระหวLาง 0 L ถxง 255 และจะสLงคLากล)บเปyน –1 ถUาไมLม;ขUอมVลจากโหนดตUนทาง เมธอดน;YจะสLงอ5อบเจกต#ชนด IOException ในกรณ;ท;ม;ขUอผดพลาดเกดขxนจากการอLานขUอมVล ต)วอยLางเชLนไฟล#ท;อLานขUอมVลเส;ย เมธอด Y น;Yเปyนเมธอดแบบ abstract ซxงคลาสท;เปyน subclass จะตUองกZาหนดบล5อกคZาส)งสZาหร)บเมธอดน;Y • int read(byte []b) เปyนเมธอดท;ใชUในการอLานขUอมVลจากโหนดตUนทางท;ละหลายไบท# โดยจะอLานขUอมVลคร)YงละไมLเกนจZานวน สมาชกของอะเรย#ของ argument ท;ชอ b โดยจะเก5บขUอมVลท;อLานเขUาไวUในอะเรย#ของ byte เมธอดน;จะสLง Y จZานวนไบท#ท;อLานไดUคนมาและจะม;คLาเปyน –1 ถUาไมLสามารถอLานขUอมVลไดU • int read (byte []b, int offset, int length) เปyนเมธอดท;ใชUในการอLานขUอมVลจากโหนดตUนทางท;ละหลายไบท#เชLนก)น แตLจะสามารถกZาหนดตZาแหนLง ในการเก5บขUอมVลท;อานลงในอะเรย#ของ argument ท;ชอ b ไดU โดยเรมท;ตZาแหนLง offset และอLานคร)Yง L 292 คลาสอนพJตและเอาต#พJต ผศ. ธนศา เครอไวศยวรรณ
  • 304. ละ length ไบท# ซxงเมธอดจะสLงจZานวนขUอมVลท;อานไดUจรงคนมา การอLานขUอมVลเปyนอะเรย#ของชนด L ขUอมVล byte จะชLวยเพมประสทธภาพ ท)Yงน;จะอLานขUอมVลไดUเร5วกวLา Y รปท 10.6 การอ%านข*อมลจาก stream คลาส InputStream ย)งม;เมธอดอนๆ ท;สZาค)ญอ;กด)งน;Y • int available() เมธอดน;YจะสLงจZานวนไบท#ท;ย)งสามารถอLานไดUจาก stream คนมา • void close() เมธอดน;YใชUในการปmด stream การเร;ยกใชUเมธอดจะชLวยทZาใหUลดการใชUทร)พยากรในระบบ (หนLวย ความจZาหรอจZานวนไฟล#ท;เปmด) • int skip(long n) เมธอดน;YจะเปyนการลบขUอมVลจZานวน n ไบท#ออกจาก stream และขUามไปขUอมVลตZาแหนLงถ)ดไป • void mark(int readlimit) เมธอดน;YใชUระบJตZาแหนLงของขUอมVลใน stream ท;ตUองการจะระบJไวUเพอท;จะตUองการใหU stream กล)บ มาท;ตZาแหนLงน;หล)งจากเร;ยกใชUเมธอด reset() Y • void reset() เมธอดน;YใชUเพอใหU stream กล)บมาช;YในตZาแหนLงท;ระบJไวUในเมธอด mark() • boolean markSupported() เมธอดน;YใชUตรวจสอบวLา stream ท;ใชUอยVLสน)บสนJนการใชUเมธอด mark() และ reset() หรอไมL ผศ. ธนศา เครอไวศยวรรณ คลาสอนพJตและเอาต#พJต 293
  • 305. 10.1.4 คลาส OutputStream คลาส OutputStream จะใชUการสLงขUอมVลของ stream ท;เปyนชนดขUอมVลแบบ byte การสLงขUอมVลของ อ5อบเจกต#ชนด Outputstream จะเปyนการเพมขUอมVลลงใน stream ด)งแสดงในรVปท; 10.7 คลาส OutputStream จะ ม;เมธอดในการสLงขUอมVลชนด byte ท;สอดคลUองก)บเมธอด read() ในคลาส InputStream โดยคลาสน;Yจะม;เมธอด write() ท;เปyนเมธอดแบบ abstract ในรVปแบบตLางๆ ด)งน;Y • void write(int i) เมธอดน;YใชUการเข;ยน (สLง) ขUอมVลลงใน stream โดยจะสLงขUอมVลเพ;ยงแปดบตทUายของ argument ท;ชอ i อาทเชLน ถUา i ม;คาเปyน 781 ก5จะเข;ยนขUอมVล 00001101 ลงใน stream ท)Yงน;เพราะ 781 ม;คLาเปyน L Y 00000000 00000000 00000011 00001101 ในเลขฐานสอง เมธอดน;YจะสLงอ5อบเจกต#ประเภท IOException คนมากรณ;ท;เกดขUอผดพลาดในการเข;ยนขUอมVล • void write(byte [] b) เมธอดน;YใชUในการเข;ยนอะเรย#ของชนดขUอมVล byte ลงใน stream ซxงเมธอดน;YอาจสLงอ5อบเจกต#ชนด NullPointerException ในกรณ;ท;ต)วแปรอะเรย# b ย)งไมLม;การสรUางขxYนมาโดยใชUคZาส)ง new • int write (byte []b, int offset, int length) เมธอดน;YใชUในการเข;ยนอะเรย#ของชนดขUอมVล byte ลงใน stream โดยจะเข;ยน ขUอมVลของอะเรย#ของ argument ท;ชอ b ต)YงแตLตZาแหนLงท; offset ไปจZานวน length ไบท# เมธอดจะสLงจZานวนไบท#ท; สามารถเข;ยนลงใน stream ไดUจรงกล)บคนมา และอาจสLงอ5อบเจกต#ชนด IndexOutOfBoundsException เพมขxYนมาในกรณ;ท;หมายเลขของสมาชกของอะเรย#ใน argument ท;ชอ b ไมLอยVLในชLวงท;ถVกตUอง รปท 10.7 การเพมข*อมลลงใน stream 294 คลาสอนพJตและเอาต#พJต ผศ. ธนศา เครอไวศยวรรณ
  • 306. นอกจากน;คลาส OutputStream ย)งม;เมธอดอนๆท;สZาค)ญอาทเชLน Y • void close() เปyนเมธอดท;ใชUในการปmด stream • void flush() เปyนเมธอดท;ใชUในกรณ;ท; stream ม;บ)ฟเฟอร# (buffer) ในการเก5บขUอมVลท;เข;ยนไวUช)วคราว ซxงการเร;ยก ใชUเมธอดน;จะเปyนการเข;ยนขUอมVลท;อยVLในบ)ฟเฟอร#ลง stream Y 10.1.5 คลาสประเภท Character Stream ภาษาจาวากZาหนดคลาสพYนฐานในการจ)ดการก)บอนพJตและเอาต#พJตท;เปyนชนดขUอมVลแบบ char อยVLสองคลาส คอ Reader และ Writer คลาสท)Yงสองเปyนคลาสแบบ abstract โดยม; subclass ท;สบทอดมาเพอใชUในการสรUาง อ5อบเจกต#สZาหร)บจ)ดการก)บโหนดตUนทางและปลายทางในรVปแบบตLางๆเชLน ไฟล# หนLวยความจZา และไบท# เปyนตUน Reader เปyนคลาสท;ใชUในการอLานขUอมVลของ stream ท;เปyนชนดขUอมVลแบบ char Reader จะม;เมธอดท; เหมอนก)บคลาส InputStream และม;หล)กการทZางานท;สอดคลUองก)นแตLจะร)บขUอมVลหรอ argument ท;เปyนชนดขUอมVล char โดยม;เมธอดตLางๆ ด)งน;Y • int read() • int read(char []c) • int read(char []c, int offset, int length) • void close() • void skip(long n) • boolean markSupported() • void mark(int readAheadlimit) • void reset() • boolean ready() Writerเปyนคลาสท;ใชUในการเข;ยนขUอมVลของ stream ท;เปyนชนดขUอมVลแบบ char Writer จะม;เมธอดท; เหมอนก)บคลาส OutputStream และม;หล)กการท;สอดคลUองก)นแตLจะร)บขUอมVลหรอ argument ท;เปyนชนดขUอมVล char โดยม;เมธอดตLางๆ ด)งน;Y • void write(int c) ผศ. ธนศา เครอไวศยวรรณ คลาสอนพJตและเอาต#พJต 295
  • 307. void write(char []c) • void write(char []c, int offset, int length) • void close() • void flush() นอกจากน;คลาส Writer จะม;เมธอดเพมเตมขxนมาเพอเข;ยนชนดขUอมVลท;เปyน String ด)งน;Y Y Y • void write(String s) • void write(String s, int offset, int length) 10.2 โหนดสDาหรบ Stream ภาษาจาวากZาหนดโหนดท;เปyนตUนทางและปลายทางของ stream ไวUสามแบบคอ ไฟล# หนLวยความจZา และไปปœ (pipe) • ไฟล#คอโหนดสZาหร)บ stream ท;เปyนไฟล#สZาหร)บอLานหรอเข;ยนขUอมVลชนด byte คลาสท;เปyนโหนดแบบ ไฟล#สZาหร)บ byte stream คอ FileInputStream และ FileOutputStream สLวนคลาสท;เปyนโหนด แบบไฟล#สZาหร)บ character stream คอ FileReader และ FileWriter • หนLวยความจZาคอโหนดสZาหร)บ stream ท;ใชUสZาหร)บอLานหรอเข;ยนขUอมVลท;เปyน อะเรย#หรอ String คลาส ท;เปyนโหนดแบบหนLวยความจZา สZาหร)บ byte stream คอ ByteArrayInputStream และ ByteArrayOutputStream สLวนคลาสท;เปyนโหนดแบบหนLวยความจZาสZาหร)บ character stream ใน ภาษาจาวาจะม;สองแบบคอ อะเรย#ของชนดขUอมVลแบบ char และ string โดยม;คลาสท;ชอ CharArrayReader, CharArrayWriter, StringReader และ StringWriter ตามลZาด)บ • ไปปœคอโหนดสZาหร)บ stream ท;จะสLงหรอร)บขUอมVลระหวLาง process หรอโปรแกรมเธรด อาทเชLน stream แบบไปปœท;เปyนเอาต#พJต (output pipe stream) ของ process หนxงอาจเชอมตLอก)บ stream แบบไปปœท;เปyนอนพJต (input pipe stream) ของอ;ก process หนxง คลาสท;เปyนโหนดแบบไปปœสZาหร)บ byte stream คอ PipedInputStream และ PipedOutputStream สLวนคลาสท;เปyนโหนดแบบไปปœสZาหร)บ character stream คอ PipedReader และ PipedWriter ตารางท; 10.1 สรJปชอคลาสท;เปyนโหนดสZาหร)บ stream ตLางๆ ของโหนดท)Yงสามแบบ และโปรแกรมท; 10.1 แสดงต)วอยLางของการก5อบป}•ขUอมVลของไฟล#หนxงไฟล#ไปย)งไฟล#อน โดยใชU byte stream โปรแกรมน;จะเปmดไฟล#ท;ม;ชอ Y ตาม argument ท;ชอ args[0] สZาหร)บอLานขUอมVลชนด byte โดยสรUางอ5อบเจกต#ของคลาส FileInputStream ท; 296 คลาสอนพJตและเอาต#พJต ผศ. ธนศา เครอไวศยวรรณ
  • 308. ชอ fin และโปรแกรมน;จะเปmดไฟล#ท;ม;ชอตาม argument ท;ชอ args[1] สZาหร)บเข;ยนขUอมVลชนด byte โดยสรUาง Y อ5อบเจกต#ของคลาส FileOutputStream ท;ชอ fout จากน)นโปรแกรมจะอLานขUอมVลจากอ5อบเจกต# fin ท;ละ 100 Y ไบท# แลUวนZาไปเข;ยนลงในอ5อบเจกต# fout จนกระท)งไมLม;ขอมVลท;จะอLานตLอไปจxงทZาการปmดไฟล#ท)Yงสอง U โปรแกรมท; 10.2 แสดงต)วอยLางของก5อปป}•ขUอมVลของไฟล#เชLนเด;ยวก)บโปรแกรมท; 10.1 แตLจะใชU character stream โดยสรUางอ5อบเจกต#ของคลาส FileReader และ FileWriter แทน ตารางท( 10.1 คลาสท%เปนโหนดส(าหร)บ stream ตางๆ โปรแกรมท 10.1 การก5อบป}•ขUอมVลของไฟล#หนxงไฟล#ไปย)งไฟล#อนโดยใชU byte stream import java.io.*; public class FileCopy { public static void main(String args[]) { try { FileInputStream fin = new FileInputStream(args[0]); FileOutputStream fout = new FileOutputStream(args[1]); byte b[] = new byte[100]; int i = fin.read(b); while (i != -1) { fout.write(b, 0, i); i = fin.read(b); } fin.close(); fout.close(); } catch (IOException ex) { ex.printStackTrace(); } } } ผศ. ธนศา เครอไวศยวรรณ คลาสอนพJตและเอาต#พJต 297
  • 309. โปรแกรมท 10.2 การก5อบป}•ขUอมVลของไฟล#หนxงไฟล#ไปย)งไฟล#อนโดยใชU character stream import java.io.*; public class FileCopyReader { public static void main(String args[]) { try { FileReader fr = new FileReader(args[0]); BufferedReader br = new BufferedReader(fr); FileWriter fw = new FileWriter(args[1]); BufferedWriter bw = new BufferedWriter(fw); String line = br.readLine(); while (line != null) { bw.write(line, 0, line.length()); bw.newLine(); line = br.readLine(); } br.close(); bw.close(); } catch (IOException ex) { ex.printStackTrace(); } } } 10.3 คลาสประเภท Stream ระดบสง โดยท)วไปโปรแกรมภาษาจาวาจะใชUอ5อบเจกต#ประเภท stream มากกวLาหนxงอ5อบเจกต#โดยจะเชอมอ5อบเจกต# ของ stream ตLางๆ เขUาดUวยก)นเพอใชUในการแปลงชนดขUอมVลประเภทตLางๆ ต)วอยLางเชLนรVปท; 10.8 เปyนการเชอมตLอ อ5อบเจกต#ของคลาส FileInputStream เขUาก)บอ5อบเจกต#ของคลาส DataInputStream โดยอ5อบเจกต#ของคลาส FileInputStream จะอLานขUอมVลของไฟล#เขUามาโดยม;ชนดขUอมVลแบบ byte สLวนอ5อบเจกต#ของคลาส DataInputStream จะทZาการแปลงชนดขUอมVลแบบ byte ใหUเปyนชนดขUอมVลอนๆทZาใหUม;เมธอดในการอLานขUอมVล มากขxYน การเชอมตLออ5อบเจกต#ประเภท stream สามารถทZาไดUโดยการเข;ยนคZาส)งในโปรแกรม เพอนZาอ5อบเจกต#ของ คลาสประเภท stream ชนดหนxงไปเปyน argument ใน constructor ของคลาสประเภท stream ท;ตUองการเชอมตLอ อาทเชLน ต)วอยLางในรVปท; 10.8 สามารถเข;ยนเปyนคZาส)งไดUด)งน;Y FileInputStream fin = new FileInputStream(“test.dat”); DataInputStream din = new DataInputStream(fin); 298 คลาสอนพJตและเอาต#พJต ผศ. ธนศา เครอไวศยวรรณ
  • 310. รปท 10.8 การเช0อมต%ออ-อบเจกตของคลาส อ5อบเจกต#ท;ใชUในการเชอมตLอ stream จะเปyนอ5อบเจกต#ของคลาสประเภท steam ระด)บสVง (high-level stream) ซxงสามารถท;จะอLานหรอเข;ยนขUอมVลท;เปyนชนดขUอมVลอนๆแลUวแปลงขUอมVลใหUเปyนชนดขUอมVลแบบ byte หรอม;บ)ฟเฟอร# ในการเพมประสทธภาพในการอLานหรอเข;ยนขUอมVล คลาสเหลLาน;จะไมLสามารถอLานหรอเข;ยนขUอมVลไปย)งโหนดตUนทาง Y หรอปลายทางท;เปyนไฟล# หนLวยความจZา หรอ Pipe ไดUโดยตรง แตLจะร)บขUอมVลมาจาก stream อนๆ ท;เปyนคลาสพYนฐาน ในการอLานหรอเข;ยนขUอมVลตามตารางท; 10.1 แทน ตารางท; 10.2 แสดงคลาสประเภท steam ระด)บสVงท;กZาหนดไวUใน Java API ซxงม;คลาสท;สZาค)ญด)งน;Y • DataInputStream และ DataOutputStream เปyนคลาสท;ใชUในการแปลงชนดขUอมVลระหวLางชนดขUอมVลแบบ byte ก)บชนดขUอมVลแบบอนๆ • BufferedInputStream และ BufferedOutputStream เปyนคลาสท;ม;บ)ฟเฟอร#สZาหร)บชนดขUอมVล byte อยVLภายในเพอใหUสามารถอLานหรอเข;ยนขUอมVลขนาดใหญLไดU ซxง จะชLวยเพมประสทธภาพในการอLานหรอเข;ยนขUอมVล • PrintStream เปyนคลาสท;ใชUในการเข;ยนขUอความท;เปyน String ท;แปลงมาจากชนดขUอมVลแบบ byte อ5อบเจกต# out และ err ท;อยVLในคลาส System เปyนต)วอยLางของอ5อบเจกต#ท;ใชUคลาสน;Y • PushbackInputStream เปyนคลาสท;อนJญาตใหUสLงขUอมVลชนด byte ท;เพงอLานมากล)บไปย)ง stream ไดU • BufferedReader และ BufferedWriter เปyนคลาสท;ม;บ)ฟเฟอร#สZาหร)บชนดขUอมVลแบบ char เพอใหUสามารถอLานหรอเข;ยนขUอมVลขUอใหญLไดU • InputStreamReader และ OutputStreamWriter เปyนคลาสท;ใชUในการแปลงชนดขUอมVลระหวLางชนดขUอมVลแบบ char ก)บชนดขUอมVลแบบอนๆ ผศ. ธนศา เครอไวศยวรรณ คลาสอนพJตและเอาต#พJต 299
  • 311. PrintWriter เปyนคลาสท;ใชUในการเข;ยนขUอความท;เปyน String ท;แปลงมาจากชนดขUอมVลแบบ char • PushbackReader เปyนคลาสท;อนJญาตใหUสLงขUอมVลชนด char ท;เพงอLานมากล)บไปย)ง stream ไดU ตารางท( 10.2 คลาสประเภท stream ระด)บส1ง การเชอมตLออ5อบเจกต#ของคลาสประเภท stream ระด)บสVงเหลLาน;สามารถท;จะเชอมตLอก)นไดUหลายๆ ช)น อาทเชLน Y Y รVปท; 10.9 แสดงต)วอยLางของการเชอมอ5อบเจกต#ของคลาส FileInputStream เขUาก)บอ5อบเจกต#ของคลาส BufferedInputStream เพอเพมประสทธภาพในการอLานขUอมVลแลUวจxงไปเชอมตLอก)บอ5อบเจกต#ของคลาส DataInputStream เพอใชUในการแปลงชนดขUอมVลแบบ byte ใหUเปyนชนดขUอมVลแบบอนๆโดยจะม;รVปแบบคZาส)ง ด)งน;Y FileInputStream f = new FileInputStream(“test.dat”); BufferedInputStream b = new BufferedInputStream(f); DataInputStream d = new DataInputStream(b); 300 คลาสอนพJตและเอาต#พJต ผศ. ธนศา เครอไวศยวรรณ
  • 312. รปท 10.9 การเช0อมอ-อบเจกตของคลาสหลายๆ ชน 10.3.1 DataInputStream และ DataOutputStream คลาส DataInputStream เปyนคลาสท;ใชUในการแปลงชนดขUอมVลแบบ byte ใหUเปyนชนดขUอมVลแบบอนๆ คลาส DataInputStream เปyนคลาสท;สบทอดมาจากคลาส FilterInputStream และ implements อนเตอร#เฟส DataInput โดยจะม;เมธอดในการอLานชนดขUอมVลแบบตLางๆเพมขxนมาด)งน;Y Y • boolean readBoolean() throws IOException เปyนเมธอดท;ใชUในการอLานชนดขUอมVลแบบ boolean มาหนxงคLา • byte readByte() throws IOException เปyนเมธอดท;ใชUในการอLานชนดขUอมVลแบบ byte มาหนxงไบท# • char readChar() throws IOException เปyนเมธอดท;ใชUในการอLานชนดขUอมVลแบบ char มาหนxงต)วอ)กษร • double readDouble() throws IOException เปyนเมธอดท;ใชUในการอLานชนดขUอมVลแบบ double มาหนxงคLา • float readFloat() throws IOException เปyนเมธอดท;ใชUในการอLานชนดขUอมVลแบบ float มาหนxงคLา • int readInt() throws IOException เปyนเมธอดท;ใชUในการอLานชนดขUอมVลแบบ int มาหนxงคLา • long readLong() throws IOException เปyนเมธอดท;ใชUในการอLานชนดขUอมVลแบบ long มาหนxงคLา • short readShort() throws IOException เปyนเมธอดท;ใชUในการอLานชนดขUอมVลแบบ short มาหนxงคLา • String readUTF() throws IOException เปyนเมธอดท;ใชUในการอLานชนดขUอมVลแบบ String มาหนxงคLาโดยใชUรVปแบบการเขUารหUสขUอมVลเปyน ผศ. ธนศา เครอไวศยวรรณ คลาสอนพJตและเอาต#พJต 301
  • 313. UTF-8 คลาส DataOutputStream เปyนคลาสท;ใชUในการแปลงชนดขUอมVลใดๆมาเปyนชนดขUอมVลแบบ byte DataOutputStream เปyนคลาสท;สบทอดมาจากคลาส FilterOutputStream และ implements อนเตอร#เฟส DataOutput โดยจะม;เมธอดในการอLานชนดขUอมVลแบบตLางๆ เพมขxYนมาด)งน;Y • void writeBoolean(boolean b) throws IOException เปyนเมธอดท;ใชUในการเข;ยนชนดขUอมVลแบบ boolean หนxงคLา • void writeByte(int b) throws IOException เปyนเมธอดท;ใชUในการเข;ยนชนดขUอมVลแบบ byte หนxงไบท# • void writeBytes(String s) throws IOException เปyนเมธอดท;ใชUในการเข;ยนชนดขUอมVลแบบ String หนxงคLา • void writeChar(int c) throws IOException เปyนเมธอดท;ใชUในการเข;ยนชนดขUอมVลแบบ char หนxงต)วอ)กขระ • void writeDouble(double b) throws IOException เปyนเมธอดท;ใชUในการเข;ยนชนดขUอมVลแบบ double หนxงคLา • void writeFloat(float f) throws IOException เปyนเมธอดท;ใชUในการเข;ยนชนดขUอมVลแบบ float หนxงคLา • void writeInt(int i) throws IOException เปyนเมธอดท;ใชUในการเข;ยนชนดขUอมVลแบบ int หนxงคLา • void writeLong(long l) throws IOException เปyนเมธอดท;ใชUในการเข;ยนชนดขUอมVลแบบ long หนxงคLา • void writeShort(int s) throws IOException เปyนเมธอดท;ใชUในการเข;ยนชนดขUอมVลแบบ short หนxงคLา • void writeUTF(String s) throws IOException เปyนเมธอดท;ใชUในการเข;ยนชนดขUอมVลแบบ String หนxงคLาโดยใชUรVปแบบการเขUารห)สแบบ UTF-8 โปรแกรมท; 10.3 แสดงต)วอยLางของการใชUคลาส DataOutputStream เพอเก5บชนดขUอมVลแบบตLางๆ ลงใน ไฟล# สLวนโปรแกรมท; 10.4 แสดงต)วอยLางของการใชUคลาส DataInputStream เพอนZาขUอมVลท;เก5บไวUในไฟล#ด)งกลLาว 302 คลาสอนพJตและเอาต#พJต ผศ. ธนศา เครอไวศยวรรณ
  • 314. มาแสดงผล โดยจะไดUผลล)พธ#ด)งแสดงในรVปท; 10.4 โปรแกรมท 10.3 ต)วอยางของการใชคลาส DataOutputStream import java.io.*; public class DataWriterDemo { public static void main(String args[]) { try { FileOutputStream fout = new FileOutputStream("c:/data.dat"); DataOutputStream dout = new DataOutputStream(fout); dout.writeInt(124); dout.writeDouble(2.45); dout.writeChar('a'); dout.writeUTF("test"); dout.close(); } catch (IOException ex) { ex.printStackTrace(); } } } โปรแกรมท 10.4 ต)วอยางของการใชคลาส DataInputStream import java.io.*; public class DataReaderDemo { public static void main(String args[]) { try { FileInputStream fin = new FileInputStream("c:/data.dat"); DataInputStream 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(); } catch (IOException ex) { System.out.println(ex.toString()); } } } ผศ. ธนศา เครอไวศยวรรณ คลาสอนพJตและเอาต#พJต 303
  • 315. รปท 10.10 ผลลพธทได*จากการรนโปรแกรมท 10.3 และโปรแกรมท 10.4 10.3.2 InputStreamReader และ OutputStreamWriter เราสามารถท;จะแปลง stream ระหวLางชนดขUอมVลแบบ byte และชนดขUอมVลแบบ char ไดUโดยใชUคลาส InputStreamReader ซxงจะอLานชนดขUอมVลแบบ byte แลUวแปลงเปyนชนดขUอมVลแบบ char และคลาส OutputStreamWriter ซxงจะอLานชนดขUอมVลแบบ char แลUวแปลงเปyนชนดขUอมVลแบบ byte โปรแกรมท; 10.5 แสดงต)วอยLางของการใชUคลาสด)งกลLาว เพอเก5บขUอความลงในไฟล#ท;เปyนชนดขUอมVลแบบ byte โปรแกรมน;YจะสรUางอ5อบเจกต#ของคลาส FileOutputStream แลUวนZาไปเชอมตLอก)บอ5อบเจกต#ของคลาส OutputStreamWriter เพอจะแปลงชนดขUอมVลแบบ char ใหUมาเปyนชนดขUอมVลแบบ byte สLวนอ5อบเจกต#ของ คลาส PrintWriter ท;เชอมตLอก)บอ5อบเจกต#ของคลาส OutputStreamWriter จะทZาหนUาท;แปลงชนดขUอมVลแบบ String ใหUเปyนชนดขUอมVลแบบ char สLวนโปรแกรมท% 11.6 จะเปyนต)วอยLางในการอLานขUอมVลจากไฟล#แลUวมาแสดง ผลโดยใชUอ5อบเจกต#ของคลาส BufferedReader 304 คลาสอนพJตและเอาต#พJต ผศ. ธนศา เครอไวศยวรรณ
  • 316. โปรแกรมท 10.5 ต)วอยางของการใชคลาสเพอเก9บขอความลงในไฟล import java.io.*; public class FileWriter { public static void main(String args[]) { String line1 = "This is a test message"; String line2 = "This is another line"; try { FileOutputStream fout = new FileOutputStream("c:data.dat"); OutputStreamWriter oout = new OutputStreamWriter(fout); PrintWriter p = new PrintWriter(oout); p.println(line1); p.println(line2); p.close(); } catch (IOException ex) { ex.printStackTrace(); } } } 10.4 คลาส File คลาสท;ชอ File เปyนคลาสท;อยVLในแพคเก5จ java.io เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เปyนไฟล#หรอ ไดเร5กทอร; คลาส File จะม;เมธอดในการจ)ดการก)บไฟล#หรอไดเร5กทอร; และเมธอดในการสบคUนขUอมVลตLางๆ อยVLหลาย เมธอด อ5อบเจกต#ของคลาส File จะสรUางมาจาก constructor ท;ม;รVปแบบด)งน;Y • public File(String name) • public File(String dir, String name) • public File(File dir, String name) โดยท; • name คอชอของไฟล#หรอไดเร5กทอร;ท;ตUองการเปmดขxนมา Y • dir คอชอของไดเร5กทอร;ในกรณ;ท;ไฟล#หรอไดเร5กทอร;นนอยVLภายในไดเร5กทอร;อน )Y ในกรณ;ท;ไมLพบไฟล#หรอไดเร5กทอร;ตามชอท;ระบJ constructor จะสLงอ5อบเจกต#ของคลาส FileNotFoundException เพอระบJวLาม;ขUอผดพลาดจากการเปmดไฟล#หรอไดเร5กทอร; ผศ. ธนศา เครอไวศยวรรณ คลาสอนพJตและเอาต#พJต 305
  • 317. โปรแกรมท 10.6 ต)วอยางของการใชคลาสเพออานขอม1ลจากไฟล import java.io.*; public class FileReader { public static void main(String args[]) { try { FileInputStream fin = new FileInputStream("c:data.dat"); InputStreamReader in = new InputStreamReader(fin); BufferedReader bin = new BufferedReader(in); System.out.println(bin.readLine()); System.out.println(bin.readLine()); bin.close(); } catch (IOException ex) { ex.printStackTrace(); } } } เมธอดของคลาส File ท;ใชUในการสบคUนขUอมVลหรอจ)ดการก)บไฟล#ท;สZาค)ญม;ด)งน;Y • boolean exists() เปyนเมธอดท;ใชUในการตรวจสอบวLาไฟล#หรอไดเร5กทอร;วาม;ปรากฏอยVLจรงหรอไมL L • boolean isDirectory() เปyนเมธอดท;ใชUในการตรวจสอบวLาอ5อบเจกต#ของคลาส File น;Yเปyนไดเร5กทอร;หรอไมL • boolean isFile() เปyนเมธอดท;ใชUในการตรวจสอบวLาอ5อบเจกต#ของคลาส File น;Yเปyนไฟล#หรอไมL • boolean canRead() เปyนเมธอดท;ใชUในการตรวจสอบวLาไฟล#น;YสามารถใชUในการอLานขUอมVลไดUหรอไมL • boolean canWrite() เปyนเมธอดท;ใชUในการตรวจสอบวLาไฟล#น;YสามารถใชUในการเข;ยนขUอมVลไดUหรอไมL • String getName() เปyนเมธอดท;ใชUในการเร;ยกดVชอไฟล#หรอไดเร5กทอร;ของอ5อบเจกต#ของคลาส File น;Y • String getParent() 306 คลาสอนพJตและเอาต#พJต ผศ. ธนศา เครอไวศยวรรณ
  • 318. เปyนเมธอดท;ใชUในการเร;ยกดVชอไดเร5กทอร;รากของอ5อบเจกต#ของคลาส File น;Y • String []list() เปyนเมธอดท;ใชUในการเร;ยกดVชอไฟล#หรอไดเร5กทอร;ยLอยท)Yงหมด ท;อยVLในอ5อบเจกต#ของคลาส File น;ใน Y กรณ;ท;เปyนไดเร5กทอร; • boolean mkdir() เปyนเมธอดท;ใชUในการสรUางไดเร5กทอร;ยLอย • boolean renameTo(File newName) เปyนเมธอดท;ใชUในการเปล;ยนชออ5อบเจกต#ของคลาส File น;YใหUเปyนชอใหมLตามท;ระบJไวUในอ5อบเจกต#ของ argument ท;ชอ newName คลาส File สามารถใชUในการจ)ดการก)บการเปmดไฟล#เพอตรวจสอบวLาม;ไฟล#ด)งกลLาวหรอไมL ซxง constructor ของคลาส FileInputStream และ FileOutputStream หรอ FileReader และ FileWriter จะม;รVปแบบท; ม; argument เปyนอ5อบเจกต#ของคลาส File เพอชLวยในการตรวจสอบไฟล#กLอนท;จะใชUในการอLานหรอเข;ยนขUอมVลด)ง ต)วอยLางตLอไปน;Y File f = new File(“Test.dat”); if (f.exists()) { FileInputStream fir = new FileInputStream(f); } 10.4.1 คลาส RandomAccessFile ภาษาจาวาม;คลาสท;สน)บสนJนการอLานหรอเข;ยนไฟล#เปyนแบบ random access กลLาวคอไมLจZาเปyนจะตUอง อLานหรอเข;ยนขUอมVลของไฟล#เร;ยงตามลZาด)บจากตZาแหนLงแรกสJดไปย)งตZาแหนLงสJดทUายของไฟล# คลาสประเภทน;คอ Y คลาส RandomAccessFile ซxงจะใชUเวลาในการอLานหรอเข;ยนขUอมVลในตZาแหนLงตLางๆเทLาก)น คลาส RandomAccessFile จะม; constructor อยVLสองรVปแบบด)งน;Y • public RandomAccessFile(String name, String mode) • public RandomAccessFile(File file, String mode) โดยท; ผศ. ธนศา เครอไวศยวรรณ คลาสอนพJตและเอาต#พJต 307
  • 319. name คอชอของไฟล# • file คออ5อบเจกต#ของคลาสไฟล# • mode คอรVปแบบในการเปmดไฟล#ท;ม;ด)งน;Y “r” เปyนการเปmดไฟล#หรออLานขUอมVลหรอ “rw” เปyนการเปmด ไฟล#เพออLานและเข;ยนขUอมVล ต)วอยLางเชLนคZาส)ง RandomAccessFile myFile = new RandomAccessFile(“test.dbf”,”rw”); เปyนการเปmดไฟล#ท;ชอ test.dbf สZาหร)บการอLานและเข;ยนขUอมVล คลาส RandomAccessFile จะม;เมธอดสZาหร)บการอLานและเข;ยนขUอมVลท;เปyนชนดขUอมVลแบบพYนฐานชนด ตLางๆ คลUายก)บคลาส DataInputStream และ DataOutputStream และม;เมธอดอนๆท;สZาค)ญเพมเตมมาด)งน;Y • long getFilePointer() เปyนเมธอดท;ใชUในการเร;ยกดVตZาแหนLงช;Yของไฟล# • void seek(long pos) เปyนเมธอดท;ใชUในการเลอนตZาแหนLงช;Yของไฟล#ไปท;ตZาแหนLง pos • long length() เปyนเมธอดท;ใชUในการเร;ยกดVความยาวของไฟล# 10.4.2 ObjectInputStream และ ObjectOutputStream ภาษาจาวาม;คลาสท;ใชUในการร)บและสLงขUอมVลของอ5อบเจกต# ObjectInputStream และ ObjectOutputStream ท)Yงน;อ5อบเจกต#ท;จะสามารถสLงผLาน stream เหลLาน;ไดUจะตUองเปyนอ5อบเจกต#ของคลาสท; Y Y implements อนเตอร#เฟส Serializable ซxงเปyนอนเตอร#เฟสในแพคเก5จ java.io ซxงไมLม;เมธอดใดๆ อยVL แตLจะ เปyนอนเตอร#เฟสท;ใชUระบJวา อ5อบเจกต#ด)งกลLาวสามารถเก5บขUอมVลหรอดxงขUอมVลของอ5อบเจกต#กล)บคนมาไดU อ5อบเจกต#ท; L สามารถเก5บหรอดxงขUอมVลไดUเปyนอ5อบเจกต#ประเภทท;เร;ยกวLา persistence ซxงขUอมVลท;จะเก5บหรอเร;ยกดVไดUจะม;เฉพาะ คJณล)กษณะของอ5อบเจกต#หรอคJณล)กษณะของคลาสเทLาน)น สLวนเมธอดจะไมLสามารถเก5บไดU Y 308 คลาสอนพJตและเอาต#พJต ผศ. ธนศา เครอไวศยวรรณ
  • 320. อ5อบเจกต#บางประเภทจะไมLสามารถท;จะ implements อนเตอร#เฟส Serializable ไดU เนองจากขUอมVลของ อ5อบเจกต#อาจเปล;ยนแปลงไดUตลอดเวลา อาทเชLน อ5อบเจกต#ของคลาส Thread หรอ FileInputStream ในกรณ;ท; อ5อบเจกต#ใดเปyนอ5อบเจกต#ประเภท Serializable แลUวม;สมาชกท;เปyนอ5อบเจกต#ประเภท non-serializable อยVL การ เก5บหรอเร;ยกดVขUอมVลของอ5อบเจกต#จะไมLสามารถทZาไดUและจะเกดขUอผดพลาดประเภท NotSerializableException ขxYนมา เราสามารถจะระบJคณล)กษณะของอ5อบเจกต#หรอคJณล)กษณะของคลาสท;ไมLตUองการจะเก5บหรอเร;ยกดVขUอมVล J ผLาน stream ไดUโดยการระบJใหUคJณล)กษณะด)งกลLาวม; modifier เปyนค;ย#เวร#ด transient ต)วอยLางเชLน public class Student implements Serializable { private String id,name; private double gpa; private transient String parent; } เปyนคลาสท;ม;ค;ย#เวร#ด transient ในคJณล)กษณะชอ parent ซxงจะม;ผลทZาใหUคJณล)กษณะน;YไมLสามารถเก5บ หรอเร;ยกดVขUอมVลผLาน stream ค;ย#เวร#ด transient สามารถใชUก)บคJณล)กษณะท;เปyนอ5อบเจกต#ประเภท non- serializable เพอป‚องก)นไมLใหUเกดขUอผดพลาดในการเก5บหรอเร;ยกดVขUอมVลเชLน public class Student implements Serializable { public transient Thread myThread; private String id,name; private double gpa; } คลาส ObjectOutputStream เปyนคลาสท;ใชUในการเข;ยนอ5อบเจกต#ใดๆลงใน stream โดยม;เมธอด writeObject() ท;ใชUในการเข;ยนขUอมVล สLวนคลาส ObjectInputStream เปyนคลาสท;ใชUในการร)บอ5อบเจกต#ใดๆ มาจาก stream โดยม;เมธอด readObject() ท;ใชUในการอLานขUอมVลซxงจะไดUอ5อบเจกต#ของคลาสท;ชอ Object คนมา ด)งน)นจxงจZาเปyนท;จะตUองทZาการ casting อ5อบเจกต#ใหUสอดคลUองก)บชนดขUอมVลของคลาสท;ตUองการ โปรแกรมท; 10.6 Y แสดงต)วอยLางของการเข;ยนและอLานขUอมVลของอ5อบเจกต#ลงในไฟล# data.dat โดยจะใหUผลล)พธ#ด)งแสดงในร1ปท% 10.3 ผศ. ธนศา เครอไวศยวรรณ คลาสอนพJตและเอาต#พJต 309
  • 321. โปรแกรมท 10.7 การเข%ยนและอานขอม1ลของอ9อบเจกตลงในไฟล import java.io.*; public class ObjectPersistenceDemo { public static void main(String args[]) { Student s = new Student("451442-1", "Somchai", 3.21); try { FileOutputStream fout = new FileOutputStream("c:/data.dat"); ObjectOutputStream oout = new ObjectOutputStream(fout); oout.writeObject(s); System.out.println("Write to file successfully"); oout.close(); FileInputStream fin = new FileInputStream("c:/data.dat"); ObjectInputStream oin = new ObjectInputStream(fin); Student s2 = (Student) oin.readObject(); oin.close(); s2.showAllDetails(); } catch (Exception ex) { ex.printStackTrace(); } } } รปท 10.11 ผลลพธทได*จากการรนโปรแกรมท 10.6 สร"ปเน-อหาของบท • stream เปร(ยบเสมอนทอสงขอม)ล สามารถแบงออกไดเป$น 2 ประเภทคอ byte stream และ character stream • byte stream ม%คลาสพนฐานคอ คลาส InputStream และ OutputStream 310 คลาสอนพJตและเอาต#พJต ผศ. ธนศา เครอไวศยวรรณ
  • 322. • character stream ม%คลาสพนฐานคอ คลาส Reader และ Writer • คลาส InputStream และ OutputStream เปน low-level stream ท%สามารถอานหรอเข%ยนขอม1ล ชนด byte ไดเทาน)น • คลาส Reader และ Writer เปน low-level stream ท%สามารถอานหรอเข%ยนขอม1ลชนด char ได เทาน)น • คลาสท%เปน high-level stream ส(าหร)บ byte stream จะสบทอดมาจากคลาส FilterInputStream หรอ FilterOutputStream • คลาสท%เปน high-level stream ส(าหร)บ character stream คอคลาส BufferedReader, BufferedWriter, InputStreamReader, OutputStreamReader, LineNumberReader, PrintWriter และ PushbackReader • การเชอมตอ stream หลายช)น จะท(าใหสามารถเร%ยกใชเมธอดไดหลายร1ปแบบตามความตองการในการ ใชงาน • คลาส File ใชในการสรางอ9อบเจกตของไฟลหรอไดเร9กทอร% โดยจะม%เมธอดท%ใชในการจ)ดการก)บไฟล • คลาส RandomAccessFile จะม%ร1ปแบบในการอานและเข%ยนขอม1ลเปนแบบ random access • อ5อบเจกต#ท;จะสามารถร)บหรอสLงผLาน stream ไดUจะตUองเปyนอ5อบเจกต#ของคลาสท; implements อนเตอร#เฟส Serializable ผศ. ธนศา เครอไวศยวรรณ คลาสอนพJตและเอาต#พJต 311