132
I สารบัญ บทที1 แนะนําภาษาจาวา ........................................................................................................ 1 1.1 จาวาแพลตฟอรม......................................................................................................... 1 1.2 เครื่องมือในการพัฒนาโปรแกรมจาวา.......................................................................... 2 1.3 ภาษาการโปรแกรม ..................................................................................................... 2 1.4 การใชงานโปรแกรม ................................................................................................... 3 1.4.1 การคอมไพล ........................................................................................................ 3 1.4.2 การรันโปรแกรม .................................................................................................. 4 1.4.3 Java Archive ( JAR ) ......................................................................................... 4 1.5 แนวทางในการเขียนโปรแกรม .................................................................................... 5 1.6 ภาษาการโปรแกรมจาวา .............................................................................................. 5 1.6.1 โครงสรางของโปรแกรมภาษาจาวา ........................................................................ 6 1.6.2 คําอธิบายโปรแกรม (Comment) ........................................................................... 6 1.6.3 คําระบุชื่อ(Identifier) ........................................................................................... 6 1.6.4 ที่วางสีขาว (White Space) ................................................................................... 7 1.7 ขอผิดพลาด (Error) ..................................................................................................... 8 สรุปทายบทที1.................................................................................................................... 8 คําถามทายบทบทที1 ........................................................................................................... 9 บทที2 ออบเจ็คและขอมูลชนิดพื้นฐาน ................................................................................. 11 2.1 แนะนําออบเจ็ค (Object) ........................................................................................... 11 2.1.1 ความสัมพันธระหวางออบเจ็คกับคลาส ................................................................ 11 2.1.2 System.out ....................................................................................................... 12 2.1.3 การซอนรายละเอียด ........................................................................................... 13 2.2 ตัวแปร (Variable) .................................................................................................... 14 2.2.1 การประกาศตัวแปร ............................................................................................ 14 2.2.2 การกําหนดคา .................................................................................................... 15 2.2.3 คลาสสตริง (String)........................................................................................... 15 2.2.4 เครื่องหมายพิเศษของขอความ ............................................................................. 16 2.2.5 คาคงที.............................................................................................................. 16 2.3 ชนิดขอมูลพื้นฐาน .................................................................................................... 16 2.3.1 ชนิดขอมูลพื้นฐานของตัวเลข .............................................................................. 17

สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

I

สารบัญ

บทท่ี 1 แนะนําภาษาจาวา ........................................................................................................1

1.1 จาวาแพลตฟอรม.........................................................................................................1

1.2 เครื่องมือในการพัฒนาโปรแกรมจาวา..........................................................................2

1.3 ภาษาการโปรแกรม .....................................................................................................2

1.4 การใชงานโปรแกรม ...................................................................................................3

1.4.1 การคอมไพล........................................................................................................3

1.4.2 การรันโปรแกรม ..................................................................................................4 1.4.3 Java Archive ( JAR ) .........................................................................................4

1.5 แนวทางในการเขียนโปรแกรม ....................................................................................5

1.6 ภาษาการโปรแกรมจาวา ..............................................................................................5

1.6.1 โครงสรางของโปรแกรมภาษาจาวา ........................................................................6

1.6.2 คําอธิบายโปรแกรม (Comment) ...........................................................................6

1.6.3 คําระบุช่ือ(Identifier)...........................................................................................6

1.6.4 ท่ีวางสีขาว (White Space) ...................................................................................7

1.7 ขอผิดพลาด (Error).....................................................................................................8

สรุปทายบทที่ 1....................................................................................................................8

คําถามทายบทบทที่ 1 ...........................................................................................................9

บทท่ี 2 ออบเจ็คและขอมูลชนิดพืน้ฐาน .................................................................................11

2.1 แนะนําออบเจค็ (Object) ...........................................................................................11

2.1.1 ความสัมพันธระหวางออบเจ็คกับคลาส ................................................................11 2.1.2 System.out .......................................................................................................12 2.1.3 การซอนรายละเอียด ...........................................................................................13

2.2 ตัวแปร (Variable) ....................................................................................................14

2.2.1 การประกาศตัวแปร ............................................................................................14

2.2.2 การกําหนดคา ....................................................................................................15

2.2.3 คลาสสตริง (String)...........................................................................................15

2.2.4 เครื่องหมายพิเศษของขอความ .............................................................................16

2.2.5 คาคงที่ ..............................................................................................................16

2.3 ชนิดขอมูลพื้นฐาน ....................................................................................................16

2.3.1 ชนิดขอมูลพ้ืนฐานของตัวเลข ..............................................................................17

Page 2: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

II

2.3.2 ชนิดขอมูลพ้ืนฐานของตัวอักษร ...........................................................................18

2.3.3 ชนิดขอมูลพ้ืนฐานคาทางตรรกะ ..........................................................................19

2.4 นิพจนของตวัเลข ......................................................................................................19

2.4.1 ลําดับของตัวดําเนินการ.......................................................................................20

2.4.2 การแปลงชนิดของขอมูล.....................................................................................22

2.5 การสรางออบเจ็ค ......................................................................................................23

2.6 แพกเกจ(Package) ....................................................................................................24

2.6.1 การประกาศการนําเขา (import) ..........................................................................25

2.7 เมธอดของคลาส .......................................................................................................25

2.7.1 การจัดรูปแบบการแสดงผล .................................................................................26

2.8 การวาดรูป ................................................................................................................27

2.8.1 การสรางภาพ.....................................................................................................27

2.8.2 การวาดเสน .......................................................................................................28

2.8.3 การวาดรูปสี่เหลี่ยม.............................................................................................28

2.8.4 การวาดรูปวงรี ...................................................................................................29

2.8.5 การระบุสี ..........................................................................................................30

สรุปทายบทที่ 2..................................................................................................................32

คําถามทายบทที่ 2 ..............................................................................................................33

บทท่ี 3 โครงสรางควบคุม .....................................................................................................36

3.1 โครงสรางแบบทางเลือก ...........................................................................................36

3.1.1 คําสั่งเงื่อนไข if ..................................................................................................36

3.1.2 คําสั่งเงื่อนไข if - else ........................................................................................38

3.1.3 กลุมคําสั่ง(Block Statements)............................................................................40

3.1.4 รูปแบบของโครงสราง if – else if – else (Nested if).............................................41

3.1.5 คําสั่งเงื่อนไข switch-case..................................................................................44

3.1.6 ความรูเพิ่มเติมเกี่ยวกับตัวดําเนินการทางตรรกะ(Logical Operators).....................50

3.2 โครงสรางแบบทําซ้ํา .................................................................................................51

3.2.1 คําสั่งการทําซ้ํา while .........................................................................................51

3.2.2 การซอนกันของการวนรอบ (nested loops) .........................................................54

3.2.3 คําสั่งการทําซ้ํา for .............................................................................................56

สรุปทายบทที่ 3..................................................................................................................58

คําถามทายบทที่ 3 ..............................................................................................................59

Page 3: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

III

บทท่ี 4 การเขียนคลาส ..........................................................................................................62

4.1 ออบเจ็ค(Object) .......................................................................................................62

4.2 คลาส(Class).............................................................................................................63

4.2.1 ขอบเขตของตัวแปร............................................................................................63

4.2.2 การเขียนเมธอด..................................................................................................64

4.2.3 การไหลของเมธอด.............................................................................................64

4.2.4 ตัวอยางของการสรางคลาส..................................................................................65

4.2.5 ตัวแปรของออบเจ็ค ............................................................................................69

4.3 การหอหุม(Encapsulation)........................................................................................71

4.4 ตัวปรับปรุงการมองเห็น ............................................................................................72

4.4.1 หลักการเลอืกตัวปรับปรุงการมองเห็น ..................................................................72

4.5 การประกาศเมธอด ....................................................................................................73

4.5.1 คําสั่ง return......................................................................................................74

4.5.2 พารามิเตอร .......................................................................................................74

4.5.3 คอนสตรัคเตอร..................................................................................................75

4.6 การเขียนคลาส ..........................................................................................................75

4.6.1 การโอเวอรโหลดเมธอด......................................................................................81

4.6.2 ออบเจ็คกราฟฟก................................................................................................82

สรุปทายบทที่ 4..................................................................................................................85

คําถามทายบทที่ 4 ..............................................................................................................85

บทท่ี 5 คลาสขั้นสงู ...............................................................................................................88

5.1 ตัวแปรอางอิง ............................................................................................................88

5.1.1 การกําหนดคาใหตัวแปรอางองิ ............................................................................89

5.1.2 การสงผานออบเจ็คไปยังเมธอด ...........................................................................90

5.2 ตัวปรับปรุง static......................................................................................................92

5.2.1 เมธอดของคลาส ................................................................................................93

5.2.2 ตัวแปรของคลาส ...............................................................................................93

5.3 อินเทอรเฟซ (Interface) ............................................................................................95

5.3.1 การมีหลายรูปดวยอินเตอรเฟซ ............................................................................97

5.4 เหตุการณและผูรับฟง ................................................................................................99

5.4.1 ผูรับฟงกับอินเทอรเฟซ .......................................................................................99

5.4.2 ภาพเคลื่อนไหว................................................................................................100

Page 4: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

IV

สรุปบทที่ 5......................................................................................................................102

คําถามทายบทที่ 5 ............................................................................................................103

บทท่ี 6 อารเรยและเว็คเตอร ................................................................................................107

6.1 อารเรย(Array) ........................................................................................................107

6.1.1 การประกาศอารเรย ..........................................................................................108

6.1.2 การตรวจสอบของเขต.......................................................................................110

6.1.3 รายการคาเริ่มตน ..............................................................................................113

6.1.4 การสงผานอารเรยเปนพารามิเตอร .....................................................................114

6.1.5 อารเรยของออบเจ็ค ..........................................................................................114

6.1.6 การแบงขอความ ..............................................................................................115

6.1.7 การเรียงลําดับขอมูลอยางงาย .............................................................................115

6.1.8 การเรียงลําดับออบเจ็ค ......................................................................................117

6.1.9 อารเรยหลายมติิ ...............................................................................................120

6.2 คลาสเว็คเตอร(Vector)............................................................................................121

6.3 อารเรยกับกราฟฟก..................................................................................................124

สรุปทายบท .....................................................................................................................126

คําถามทายบทที ่6 ............................................................................................................126

Page 5: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

1

บทที่ 1 แนะนําภาษาจาวา

บทที่ แนะนําภาษาจาวาแนะนําภาษาจาวา 11

หัวขอการเรียนรู จาวาแพลตฟอรม

การติดตั้งสวนที่ชวยในการพัฒนาการเขียนโปรแกรม

การคอมไพลและการรัน

โครงสรางของโปรแกรมจาวา ขอผิดพลาดที่เกิดข้ึน

1.1 จาวาแพลตฟอรม

ภาษาจาวาเปนภาษาที่ไดรับความนิยมเปนอยางมากในการเขียนโปรแกรม เพราะเปนภาษาที่สามารถทํางานบนระบบปฏิบัติการใดก็ได ซึ่งขอดีนี้ทําใหเกิดความสะดวกแกการนําโปรแกรมภาษาจาวาไปใช และโดยเฉพาะอยางยิ่งผูท่ีเริ่มตนศึกษาการเขียนโปรแกรมนั้น ภาษาจาวานับวาเปนภาษาที่นาสนใจ เพราะเปนภาษาที่สามารถเขาใจไดงาย ในการเขียนโปรแกรมจาวาจะตองทําการติดตั้งจาวาแพลตฟอรม (Java platform) เพื่อใชในการแปลโปรแกรม (complier) และการรันโปรแกรม (run) ซึ่งจาวาแพลตฟอรมมี 3 แพลตฟอรม และแตละแพลตฟอรมก็มีจุดประสงคในการใชงานที่แตกตางกัน คือ

• J2SE • J2EE • J2ME

J2SE ยอมาจาก Java2, Standard Edition ตัวเลข 2 หมายถึง version 2 ซึ่งเปน version ท่ีใชอยูในปจจุบัน สําหรับ J2SE นี้จะใชอยางแพรหลายในการพัฒนาโปรแกรมภาษาจาวาในเครื่องพีซีท่ัวไป J2EE ยอมาจาก Java2, Enterprise Edition จะเปนสวนที่ขยายมาจาก J2SE ใชสําหรับพัฒนาโปรแกรมขององคกรขนาดใหญหรือใชในการพัฒนาแอพพลิเคชั่นในฝงของserver ทําใหตองมีฟงกชันการทํางานหรือมีไลบรารีเพิ่มข้ึนและมีการใชหนวยความจํา (memory) ท่ีสูงข้ึนดวย

Page 6: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

2

J2ME ยอมาจาก Java2, Micro Edition ใชสําหรับการพัฒนาโปรแกรมหรอืซอฟแวรท่ีทํางานบนอุปกรณขนาดเล็ก ซึ่งมีทรัพยากรใหใชอยางจาํกัด เชน อุปกรณมือถือ, PDA เปนตน ขอควรทราบเพิ่มเติม

• ฟงกชัน (function) คือ ความสามารถในการทํางานตามคําสั่งท่ีผูพัฒนาโปรแกรมสรางขึ้น

• ไลบรารี (library) คือ ฟงกชันหลายๆฟงกชันรวมกันเพือ่ทํางานในวัตถุประสงคเดียวกัน

• สําหรับในการเรียนการสอนนี้ จะใชจาวาแพลตฟอรม คือ J2SE

1.2 เครื่องมือในการพัฒนาโปรแกรมจาวา

เมื่อทราบคุณสมบัติเบื้องตนของจาวาแพลตฟอรมในแตละประเภทแลว ตอมาจะเปนขั้นตอนของการติดตั้งเครื่องมือพัฒนาโปรแกรมจาวาซึ่งไดแก JDK และ JRE สิ่งท่ีสําคัญที่ควรจําคือ ไมควรติดตั้งเครื่องมือพัฒนาโปรแกรมหลายๆเวอรชันในเครื่องเดียวกัน เนื่องจากจาวาเวอรชันตางๆมีโครงสรางตางกันเล็กนอย จึงอาจเกิดความสับสนในการใชงานจาวา

JDK ยอมาจาก Java Development toolkits เปนสวนประกอบหนึ่งของ J2SE ซึ่งจะมีเครื่องมือท่ีใชในการพัฒนาคือ ตัวแปลภาษา (complier) และ ดีบักเกอร(debugger) จึงเหมาะสําหรับผูพัฒนาหรือผูเขียนโปรแกรม

JRE ยอมาจาก Java Runtime Environments จะประกอบไปดวยไลบรารตีางๆและสวนประกอบอื่นๆ ท่ีจําเปนตองใชในการรันโปรแกรมที่เขียนดวยภาษาจาวา

ในการเลือกติดตั้งเครื่องมือชวยพัฒนาเหลานี้ หากเปนผูท่ีเขียนโปรแกรมสามารถลงไดท้ัง JDK

และ JRE (JRE ไมจําเปนตองลงก็ได) แตหากเปนผูท่ีนําโปรแกรมไปใชหรือคนทั่วไปควรลง JRE

อยางเดียวก็เพียงพอ เพราะการลง JDK อาจทําใหสิ้นเปลืองหนวยความจํา

1.3 ภาษาการโปรแกรม

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

Page 7: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

3

1.4 การใชงานโปรแกรม

คอมพิวเตอรจะสามารถทํางานตามที่ผูพัฒนาตองการได ก็ตอเมื่อโปรแกรมทีเ่ขียนขึ้นหรือโปรแกรมตนฉบับที่เรียกวา ซอรสโคด(source code) หรือไฟลท่ีมีนามสกุลเปน .java นั้นถูกแปลงเปนภาษาเครื่อง (machine languge) เสียกอน และเนื่องจากโปรแกรมที่นักพัฒนาเขียนข้ึนมานั้น จะมีลักษณะเหมือนกับภาษาที่เราพูดกันคือ ภาษาอังกฤษ ซึ่งคอมพิวเตอรจะไมเขาใจในตัวโปรแกรมดงักลาว จึงทําใหตองมีกระบวนในการแปลงภาษานี้ใหเปนภาษาเครื่องเสียกอน โดยการกระบวนการดังกลาวจะเรียกวา การแปลภาษา (compile) ซึ่งจะมีตัวแปลภาษานี้จะทําการแปลจาวาซอรสโคด ซึ่งจะไดออกมาเปนสิ่งท่ีเรียกวา ไบตโคด (byte code) และจะเก็บอยูในไฟลท่ีมีนามสกุล .class ตอมาตองนํา byte code ท่ีไดจากการแปลนี้มาแปลเปนภาษาเครื่อง โดยตัวแปลภาษานี้เรียกวา interpreter ดังแสดงในรูปที่ 1-1 หลังจากทําการแปลซอรสโคดเรียบรอยแลว จะสามารถนําโปรแกรมไปรันบนเครื่องหรือระบบปฏิบัติการใดก็ได ทําใหสะดวกกวาภาษาอื่นๆ

รูปที่ 1-1 การแปลและการรนัโปรแกรมจาวา

1.4.1 การคอมไพล • การคอมไพลโปรแกรม คําสั่งท่ีใชคือ javac ซึ่งจะมีอยูใน JDK เทานั้น

รูปแบบการใชงาน javac <option> <ช่ือไฟล.java> ตัวอยาง javac HelloWorld.java

ผลการรันที่ไดจากการคอมไพลคือ byte code ซึ่งจะถูกเก็บอยูในไฟลนามสกุล “.class” ซึ่งไฟลนี้จะอยูท่ีเดียวกับไฟลท่ีมีนามสกุล “.java” แตหลักการเขียนโปรแกรมที่ดีนั้นควรเก็บไฟล “.java” และไฟล “.class” แยกจากกัน เพื่อใหงายในการไฟล “.class” ไปรันบนเครื่องอื่นมากยิง่ข้ึน คําสั่งท่ีใชในการเปลี่ยนใหไฟล “.class” ไปอยูท่ีอื่น สามารถทําไดดังนี ้

รูปแบบ javac -d <directory>

จาวาซอรสโคด

ภาษาเครื่อง

จาวาไบตโคด

จาวาอินเตอรพริตเตอร จาวาคอมไพเลอร

Page 8: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

4

ตัวอยาง javac –d C:\ HelloWorld.java

ผลลัพธท่ีไดคือ จะไดไฟล .class ในไดเรคทอรี C: -d เปนออปชั่นท่ีใชระบุเพื่อบอกตัวแปลภาษาวาเมื่อทําการแปลไดไฟล .class ออกมาแลวใหนําไฟลดังกลาวไปเก็บที่ไดเร็คทอรีใด ซึ่งในที่นี้คือ C:

ขอควรระวัง : ไฟลท่ีใชในการคอมไพลโปรแกรมภาษาจาวา ช่ือไฟลจะตองมีนามสกุลเปน “.java” เทานั้น

1.4.2 การรันโปรแกรม

ในการรันโปรแกรมจะมี interpreter คือ java ซึ่งมีอยูท้ัง JDK และ JSE

รูปแบบการใชงาน java <option> <ช่ือคลาส> <อารกวิเมนต>

ตัวอยาง java HelloWord

การรันโปรแกรมไมตองระบุไฟลเปน .class ซึ่งคลาสที่จะรันจะตองมีเมธอด (method) main

อยูในไฟลดังกลาว คือ

public static void main(String[] args) หมายเหตุ : หากตองการใหโปรแกรมรันไดหลายครั้งใหใสอารกิวเมนตดังนี ้ Java HelloWorld 5

ผลคือ จะแสดงคําวา HelloWorld ท้ังหมด 5 คํา แตจะตองมีการเขียนโปรแกรมเพื่อทําการวน loop เพื่อแสดงคําวา HelloWorld ดวย

1.4.3 Java Archive ( JAR )

ไฟลสกุล .jar ไดจากการนําไฟลสกุล .class ของโปรแกรมหลายๆไฟลมารวมกัน ซึ่งในการสราง jar file นั้นเหมือนกับการ zip file ท่ัวไป

การรันไฟล .jar java –jar <jar file>

การรวมคลาสไฟลหลายๆไฟลไวภายใตจารไฟล เรียกวา จาวาไลบรารี (java library) ซึ่งจะสามารถเรียกใชงานไดก็ตอเมื่อมีการระบุ class path หรอืเสนทางเดินของคลาส ท้ังนี้เพื่อความปลอดภัยในการใชงาน นอกจากนี้การระบุ classpath สามารถใชรวมกับคําสั่งท่ีใชในการแปล(javac) และการรัน (java) ไดดังนี ้

รูปแบบ Option –cp <classpath>

ตัวอยาง java –cp .;C:\lib\extra_lip.jar HelloWorld

Page 9: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

5

เพิ่มเติม

1. . หมายถึง ไดเรกทอรีปจจุบันที่โปรแกรมทํางานอยู 2. classpath แตละอันจะถูกแบงดวย ; (semi-colon) สําหรับ Window และ :

(colon) สําหรับ Linux

1.5 แนวทางในการเขียนโปรแกรม

วัตถุประสงคหลักของการเขียนโปรแกรม คือ เพื่อการแกไขปญหา ซึ่งสามารถสรุปเปนขั้นตอนในการแกปญหาไดดังนี้

ข้ันที่ 1 เขาใจปญหาที่เกิดข้ึน

ข้ันที่ 2 แบงปญหาออกเปนสวนๆเพื่อใหงายแกการหาทางแกไข

ข้ันที่ 3 ออกแบบลําดับและแนวทางในการแกปญหา ข้ันที่ 4 มองหาแนวทางการแกปญหาแบบอื่นๆที่ดีกวาหรือท่ีสามารถ

แกไขปญหาไดดีกวา เพื่อสํารองหากแนวทางเดิมมีขอผิดพลาดหรือแกไขปญหาไมสําเร็จ

ข้ันที่ 5 ทําการสรางโปรแกรม หรือการลงมือเขียนโคดท่ีใชในโปรแกรม

ข้ันที่ 6 ทดสอบและแกไขปญหาที่ตรวจพบ

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

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

ภาษาจาวาถูกสรางขึ้นโดยบรษิัท Sun Microsystems และไดรับการพัฒนาจนเปนที่รูจักตั้งแตป 1995 ภาษาจาวาเปนภาษาที่ไดรับความนิยมอยางตอเนือ่ง เนื่องจากมีการนําหลักการโปรแกรมในแนวคิดใหมท่ีเรียกวา ภาษาการโปรแกรมเชิงวัตถุ (Object Oriented Programming: OOP) มาใช นอกจากนี้ภาษาจาวายังมีคํา และสัญลักษณตางๆใหใชมากมายในการเขียนโปรแกรมซึ่งเมื่อทําการผสมคําและสัญลักษณเหลานี้เขาดวยกัน จะไดเปนชุดคําสั่งหรือเรียกวา program statements ท่ีถูกตอง

Page 10: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

6

1.6.1 โครงสรางของโปรแกรมภาษาจาวา โปรแกรมคอมพิวเตอรแตละโปรแกรมเกิดจากการนําคลาสจํานวนหนึ่งคลาสหรือมากกวานั้นนํามารวมกัน ซึ่งแตละคลาสจะประกอบดวยเมธอด(method) ตางๆ และในแตละเมธอด จะประกอบดวยคําสั่ง (statements) ตางๆ โดยสิ่งท่ีสําคัญของโปรแกรมหนึ่งๆ คือ จะตองมีเมธอดที่ช่ือ main

เสมอ โครงสรางของเมธอด main ดังแสดงในรูปที่ 1-2

รูปที่ 1-2 โครงสรางโปรแกรมจาวา

1.6.2 คําอธิบายโปรแกรม (Comment) ในการเขียนโปรแกรมผูพัฒนาควรมีการใสคําอธิบายโปรแกรม อยางเชนวา ฟงกชันนี้ใชทําอะไร ตั้งตัวแปรนี้เพื่อทําอะไร เปนตน ท้ังนี้เพื่อใหสามารถเขาใจโปรแกรมไดงายยิ่งข้ึน รูปแบบของการใสคําอธิบาย มีดังนี ้//………… : จะเริ่มตนจากจุดนี้ไปจนจบบรรทัด

/*…………*/ : จะเริ่มตนจาก /* ไปจนกวาจะเจอเครื่องหมาย */ ท้ังนี้ภายในเครื่องหมายดังกลาวเราสามารถเวนวรรค ข้ึนบรรทัดใหม หรือเวนบรรทัดก็ได เพราะจะสิ้นสุด comment เมื่อเจอเครื่องหมายจบเทานั้น

1.6.3 คําระบุชื่อ(Identifier) เนื่องจากในการพัฒนาโปรแกรมนั้นมีคลาสหลายๆคลาสที่ถูกสรางขึ้น ดังนั้นในการตั้งช่ือท่ีใชในการโปรแกรมอาจมีการซ้ํากันเกิดข้ึน เพื่อแกปญหาจึงควรทราบเกี่ยวกบักฎในการตั้งช่ือและคําสงวนตางๆของภาษาจาวา ซึ่งหลักในการตั้งช่ือมีหลักการดงันี้ 1. จะตองเกิดจากการนําตัวอักษรภาษาอังกฤษ ตัวเลขหรืออักษรพิเศษมาผสมกัน

2. อักขระพิเศษที่สามารถใชไดมี 2 ตัวคือ _ (underscore) และ $

Page 11: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

7

3. หามใชตัวเลขนําหนาช่ือเชน 9num, 23score เปนตน

4. ภาษาจาวาถือวาอักษรพิมพใหญ พิมพเล็ก เปนคนละตัวกันเชนคําวา name, Name และ NaMe

ถือวาเปนคนละชื่อกัน

5. คําบางคําเปนคําสงวน หามนํามาใชในการตั้งช่ือ ซึ่งแสดงในรูปที่ 1-3

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

รูปที่ 1-3คําสงวนในภาษาจาวา

1.6.4 ท่ีวางสีขาว (White Space) ท่ีวางสีขาวในที่นี้ คือ ชองวางบรรทัดวางๆ แท็บและการขึ้นบรรทัดใหม สิ่งเหลานี้จะไมมีผลตอการโปรแกรมแตจะใชสําหรับการแยกคําหรือสัญลักษณตางๆในโปรแกรม ถงึแมวาท่ีวางสีขาวจะไมมีผลตอโปรแกรม แตการเขียนโปรแกรมก็ควรจะจัดใหมีระเบียบ เพื่อใหโปรแกรมมีความสวยงามและงายในการอาน

Page 12: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

8

1.7 ขอผิดพลาด (Error)

ในการพัฒนาโปรแกรมมักเกิดขอผิดพลาดหรือท่ีเรียกวา error เกิดข้ึน ซึ่งขอผิดพลาดในโปรแกรมภาษาจาวาสามารถแบงโดยใชชวงเวลาในการเกิดขอผิดพลาดได 3 รูปแบบดังนี้

1. ความผิดพลาดขณะคอมไพลหรือแปลโปรแกรม (Compile – time errors)

มักเปนความผิดพลาดซึ่งเกี่ยวกับโครงสรางของภาษาจาวา เชน การตั้งช่ือตัวแปรผิด การลืมเครื่องหมายเซมิโคลอน (;) เปนตน หากความผิดพลาดนี้ยังอยู คลาสไฟลจะไมถูกสรางข้ึน

2. ขอผิดพลาดขณะทํางาน (Run – time errors)

เชน ความพยายามที่จะหารตัวเลขดวยศูนย ความผิดพลาดนีอ้าจทําใหโปรแกรมหยุดหรือจบการทํางานในทันที

3. ขอผิดพลาดทางตรรกะ (Logical errors)

ความผิดพลาดนี้คือ การท่ีโปรแกรมสามารถคอมไพลได รันได แตผลลัพธท่ีตองการไมถูกตองตามที่ผูพัฒนาตองการ ท้ังนี้อาจเนื่องมาจากความผิดพลาดของซอรสโคดเองหรอืการออกแบบโปรแกรม

สรุปทายบทที่ 1

สําหรับในบทนี้จะไดเรียนรูเกี่ยวกับความรูพื้นฐานของการใชงานโปรแกรมภาษาจาวา ไดรูจักกับการเลือกใชงานจาวาแพลตฟอรมท้ัง 3 แบบ คือ J2SE, J2EE และ J2ME การติดตั้งโปรแกรมซึ่งมีตัวชวยในการพัฒนา 2 ตัว คือ JDK และ JRE ซึ่งผูท่ีจะพัฒนาโปรแกรมภาษาจาวาจะตองมีตัวแปลภาษาและตัวอินเตอรพริตเตอร เพื่อทําหนาท่ีในการะบวนการแปลงซอรสโคดเปนภาษาเครื่องใหคอมพิวเตอรสามารถทํางานไดตามโปรแกรมที่เขียนไว นอกจากนี้ยังกลาวถึงข้ันตอนและแนวทางในการเขียนโปรแกรมเพื่อแกปญหา นอกจากนี้ยังกลาวถึงโครงสรางของภาษาจาวาและขอผิดพลาดตางๆที่มักเกิดข้ึนในการพัฒนาโปรแกรม

ความรูท้ังหมดในบทนี้จะเปนพื้นฐานในการศึกษาการใชงานโปรแกรมจาวาในบทตอไป จึงมีความสําคัญอยางยิ่งท่ีจะตองทําความเขาใจสิ่งตางๆเหลานี้ใหชัดเจน

Page 13: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

9

คําถามทายบทบทที่ 1

1 จงอธิบายคุณสมบัติของจาวาแพล็ตฟอรมแตละแพล็ตฟอรม 2 จงอธิบายข้ันตอนการทํางานของตัวแปลภาษาจาวา พรอมท้ังวาดรูปประกอบ 3 เมื่อเราคอมไพลโปรแกรมที่มนีามสกุลเปน .java ผลลัพธท่ีไดคืออะไร และจะถูกบรรจุอยูในไฟลท่ีมี

นามสกุลช่ือวาอะไร 4 ขอผิดพลาด (Error) ท่ีเกิดข้ึนในการพัฒนาโปรแกรมมีกี่แบบไดแกอะไรบาง จงอธิบาย จงทําเครื่องหมายถูก (√) หนาขอประโยคที่ถูกตอง และทําเครื่องหมายผิด (X) หนาขอประโยคที่ไมถูกตอง พรอมท้ังใหเหตุผลประกอบ 5. ______ สําหรบัผูท่ีตองการพัฒนาโปรแกรมเอง การติดตั้ง JRE ( Java Runtime Environments) เพียงอยาง

เดียวก็เพียงพอตอการพัฒนาโปรแกรม เหตุผล……………………………………………………………… ………………………………………… 6. ______ หากผูพัฒนามีการเขียนโปรแกรมโดยตั้งช่ือไฟลวา Number.java ผูพัฒนาจะใชคําสั่ง java

Number.java ในการแปลโปรแกรม เหตุผล……………………………………………………………… ………………………………………… 7. ______ สามารถใชคําวา 6count ในการตั้งช่ือได เหตุผล……………………………………………………………… ………………………………………… 8. ______ ไมสามารถใชคําวา default ในการตั้งช่ือได เหตุผล……………………………………………………………… ………………………………………… 9. ______ การผิดพลาดเนื่องจากผูพัฒนาเขียนโปรแกรมไมถกูตองตามโครงสราง(syntax) ของภาษาจาวา

เชน ไมไดไสเครื่องหมาย ; ไวสุดทาย หรือใสเครื่องหมาย { }ไมครบ เปนตน การผิดพลาดลักษณะนี้เปนการผิดพลาดที่เรียกวา ขอผิดพลาดทางตรรกะ (Logical errors)

เหตุผล……………………………………………………………… ………………………………………… 10. ______ ตัวแปร Count และ count ถือวาเปนช่ือเดียวกัน เหตุผล……………………………………………………………… …………………………………………

Page 14: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

10

11. ______ อินเตอรพริตเตอร (Interpreter) เปนเครื่องมือท่ีจะแปลง ซอรสโคด เปน ไบตโคด เหตุผล……………………………………………………………… ………………………………………… 12. ______ จากตัวอยางซอรสโคดScore.java โปรแกรมจะถูกเริ่มทํางานที่ในบรรทัดท่ี 3

01 public class Score 02 { 03 System.out.println("Hello!!!"); 04 }

เหตุผล……………………………………………………………… ………………………………………… 13. ______ จากตัวอยางซอรสโคดTest.java คําอธิบายโปรแกรมจะเริ่มครอบคลุมตั้งแตในบรรทัดท่ี 3 จนถึง

บรรทัดท่ี7 01 public class Test 02 { 03 //public static void main (String[]args) 04 { 05 System.out.println("Welcome to Java programming"); 06 System.out.println("Good bye"); 07 }// 08 }

เหตุผล……………………………………………………………………………………………………. 14. ______ จากตัวอยางซอรสโคดTest1.java โปรแกรมไมสามารถทํางานได เนือ่งจากมีการเวน

ชองวางและขึน้บรรทัดใหมที่มากเกินไป ทําใหตวัแปลภาษาไมสามารถแปลได 01 public class Test1 02 { public 03 static void 04 main 05 (String[]args) 06 { 07 System.out.println("Welcome to Java programming"); 08 System.out.println("Good bye"); 09 } 10 }

เหตุผล……………………………………………………………………………………………………..

Page 15: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

11

บทที่ 2 ออบเจ็คและขอมูลชนิดพื้นฐาน

บทที่ ออบเจ็คและขอมูลชนิดพื้นฐานออบเจ็คและขอมูลชนิดพื้นฐาน 22

หัวขอการเรียนรู ออบเจ็ค

ขอมูลชนิดพื้นฐาน

การประกาศและใชงานตัวแปร

นิพจน คลาสไลบรารี การวาดรูป

สําหรับเนื้อหาของบทนี้ จะเปนเนื้อหาพื้นฐานของภาษาจาวา เพื่อเตรียมความพรอมกอนที่จะมีการพัฒนาโปรแกรมภาษาจาวา ดังนั้นเนื้อหาของบทเรียนนี้จะกลาวถึงเรื่องของออบเจ็ค (object ) ,

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

2.1 แนะนําออบเจ็ค (Object)

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

2.1.1 ความสัมพันธระหวางออบเจ็คกับคลาส

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

Page 16: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

12

นําไปใชงานไดจริง แตจะตองมีการสรางออบเจ็คข้ึนมาจากคลาสดังกลาว แลวทําการเรียกใชงานบริการหรือเมธอดของคลาสนั้นๆ

2.1.2 System.out

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

• print จะทําการพิมพขอความที่กําหนด โดยไมมีการข้ึนบรรทัดใหม • println จะทําการพิมพขอความที่กําหนดพรอมกับข้ึนบรรทัดใหมเอาไว ตัวอยางการใชงาน :

รูปที่ 2-1 ตัวอยางการใชงานเมธอด System.out.println

จากรูปที่ 2-1 จะเปนการใชเมธอด println เพื่อนําประโยค Whatever you are, be a good one. แสดงออกทางหนาจอ และประโยคดังกลาวจะอยูภายในเครือ่งหมายวงเล็บและ เครื่องหมาย “ ”

ตัวอยางโคดการใชงาน System.out.println()

1) class TextPrinter 2) { 3) public static void main(String[] args) 4) { 5) System.out.println("Hello"); 6) System.out.println("World!"); 7) System.out.print("Hello "); 8) System.out.print("World "); 9) System.out.println("Yeah");

10) System.out.println("ครับ"); 11) //System.out.println("I said \"Hello world\" to you"); 12) } 13) }

รูปที่ 2-2ตวัอยางโคดการใชงานเมธอด System.out.println

ผลลัพธของโปรแกรม

Hello

World!

Hello World Yeah

ครับ

Page 17: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

13

อธิบาย : คลาส TextPrinter เปนการจําลองความสามารถของเมธอดที่ช่ือวา print และ println โดยมีออบเจ็ค System.out เปนตัวเรียกใชงาน

บรรทัดท่ี 1 ช่ือคลาส TextPrinter

3 เมธอด main ของ class

5 ออปเจ็ค System.out เรียกใชงานเมธอด println เพื่อแสดงขอความ Hello และข้ึนบรรทัดใหม

6 เมธอด println ถูกเรยีกใชงาน และแสดงคําวา World! และขึ้นบรรทัดใหม จากตรงนี้แสดงใหเห็นวาคําวา Hello และคําวา World! จะอยูกันคนละบรรทัด

7-8 เมธอด print จะทํางาน คําวา Hello และคําวา World! ตอดวยคําวา Yeah

9-10 จะมีลักษณะการทํางานเหมอืนกับคําสั่งในบรรทัดท่ี 7-8 ดังนั้นคําวา ครับ จะอยูในบรรทัดตอมา

11 เปนการใสคําอธิบาย (comment) ดังนั้นประโยค I said "Hello world" to

you จึงไมแสดงออกมาทางหนาจอ

2.1.3 การซอนรายละเอียด

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

println จากเหตุผลนี้เอง เราจึงไดนําหลักการดังกลาวมาประยุกตใช เมื่อเราตองสรางซอฟแวรหรือโปรแกรมที่มีขนาดใหญ ซึ่งจะไมสามารถทําคนเดียวไดตามเวลาที่กําหนด ดังนั้นเราก็จะมีการแบงงานออกเปนหลายๆสวน โดยใหแตละกลุมยอยนัน้จะรับผิดชอบงานที่แตกตางกัน ดังแสดงในรูปที่ 2-3 การแบงงานออกเปนกลุมๆนั้น ก็เปรียบเหมือนกับการเขียนโปรแกรมเปนคลาสๆ และแตละคลาสก็จะมีคลาสหรือบริการตางๆในสวนของตนเอง แลวเราก็นําคลาสตางๆมารวมกนั เราก็จะไดงานชิ้นใหญตามที่เราตองการ และในการใชเรียกใชงานเมธอดตางๆนั้น เราก็อาจจะไมจําเปนที่จะตองทราบวา ในแตละเมธอดนั้นภายในทํางานกันอยางไร แตเราเพียงแคเรียกใชงานหรอืใชบริการของเมธอดใหเหมาะสมและถูกตองก็เพียงพอแลว ก็เปรียบเหมือนกับการซอนรายละเอียดนั่นเอง

Page 18: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

14

รูปที่ 2-3 การซอนรายละเอียด

2.2 ตัวแปร (Variable)

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

2.2.1 การประกาศตัวแปร

• ตองมีการระบุช่ือและชนิดขอมูล < ชนิดขอมูล > < ช่ือตัวแปร >

ตัวอยางเชน int total;

จากคําสั่งดังกลาวจะสังเกตวา int จะเปนชนิดของขอมูลซึ่งในที่นี้คือ integer หรือจํานวนเต็ม และมีคําวา total เปนชื่อของตัวแปร แสดงวาตอจากนี้ไป จะมีตัวแปรที่ช่ือ total ไวคอยเก็บตัวเลขจํานวนเต็ม

• ในการประกาศตัวแปร หากเปนตัวแปรที่เก็บขอมูลชนิดเดียวกัน สามารถประกาศไดพรอมๆกัน

ตัวอยางเชน int count , temp , result;

นั่นคือ ตัวแปร count , temp และ result จะถูกประกาศขึ้นเพื่อใชเก็บขอมูลชนิดจํานวนต็ม

• ตัวแปรถูกกําหนดคาเริ่มตนได ณ ตอนประกาศตัวแปร

ตัวอยางเชน int sum = 0; int base = 0 , max = 100; จากคําสั่งขางตนเปนการแจงใหโปรแกรมทราบวา เริ่มตนของตัวแปร sum และ base จะมี

คาเปนศูนย และ max จะมีคาเปน 100

• เมื่อตัวแปรถูกอางถึงในโปรแกรม คาปจจุบันของตัวแปรจะถกูนําไปใช ตัวอยางเชน int max = 100;

Page 19: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

15

System.out.println( max ); นั่นคือ โปรแกรมจะแสดงใหเห็นเปน 100

2.2.2 การกําหนดคา ในการกําหนดคาใหกับตัวแปรนั้น จะใชเครื่องหมายเทากับ ( = ) เครื่องหมายเทากับนี้ จะเปนตัวดําเนินการชนิดหนึ่ง ซึ่งในการทํางานนั้นคาทางขวาของเครื่องหมายเทากับ จะถูกประเมินผลลัพธกอน แลวนําไปบันทึกไวในตัวแปรทางซาย

ตัวอยางเชน total = 50; นั่นคือ total จะเทากับ 50

total = 50 + 30; นั่นคือ total จะเทากับ 80

ขอพึงระวัง คือ ในการกําหนดคาใหกับตัวแปรนั้นจะสามารถกําหนดคาไดตามชนิดของตัวแปรเทานั้น

ตัวอยางเชน int total; total = 50.5; เราจะไมสามารถทําไดเพราะ total จะเก็บขอมูลท่ีเปน integer หรือจํานวนเต็มเทานั้น แต 50.5 เปนขอมูลท่ีเปนทศนิยม จะไมสามารถกําหนดคาได

2.2.3 คลาสสตริง (String)

จากที่กลาวในขางตนแลววา การสรางออบเจ็คข้ึนมาสําหรับใชงานนั้นจะสรางขึ้นมาจากคลาส ซึ่งคลาสในจาวาที่ควรทําความรูจักนั้นมีมากมาย และคลาสที่จะแนะนําใหรูจักในเบื้องตนนี้คือ คลาสสตริง (String)

String คือ ขอความซึ่งเกิดจากการนําตัวอักษรมาเรียงกัน โดยขอความจะตองอยูภายในเครื่องหมาย “…” เทานั้น เชน “Hello World” หากตองการนําขอความมาเชื่อมตอกันสามารถใชเครื่องหมาย + มาคั่นระหวางขอความที่ตองการเขื่อม เชน “Hello” + “World” และยังสามารถนําตัวเลขมาเชื่อมตอกับขอความไดเชนกัน เชน “Hello” + 2 จาวาจะทําการแปลง 2 ใหเปนสตริงกอน แลวจึงนํามาตอทายคําวา Hello ตัวอยางในการใชคลาส String ดังโคดตัวอยางในรูปที่ 2-4

01 class Addition 02 { 03 public static void main(String[] args) 04 { 05 System.out.println("Hello " + "World!"); 06 System.out.println("Hello " + 2 + "World!"); 07 System.out.println("Hello " + 2 + 5 + "World!"); 08 System.out.println(2 + 5 + "Hello " + "World!"); 09 } 10 }

รูปที่ 2-4 ตัวอยางโคดการใชงานตัวแปรสตริง

บรรทัดท่ี 5 ผลลัพธท่ีไดคือ Hello World!

6 ผลลัพธท่ีไดคือ Hello 2World!

Page 20: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

16

7 ผลลัพธท่ีไดคือ Hello 25World! ซึ่ง 2 และ 5 จะถูกนํามาเชื่อมตอกันเปน 25 และถือวา 25 นี้เปนสตริง

8 ผลลัพธท่ีไดคือ 7Hello World! ซึ่ง 2 และ 5 จะถกูนํามาบวกกันกอนที่จะนําไปบวกกับตัวแปรสตริง

2.2.4 เคร่ืองหมายพิเศษของขอความ • \ คือ เครื่องหมายพิเศษที่จะตามดวยอักขระ 1 ตัว แลวใหความหมายเปลี่ยนไป ดังนี ้

- \n คือ การข้ึนบรรทัดใหม - \b คือ การลบอักษร 1 ตัวออกไป

- \t คือ แท็บ • \ ใชสําหรับยกเลิกความเปนเครื่องหมายพิเศษอื่นๆ เชน

- System.out.println(“I said \“ Hello World \” to you”); ผลลัพธท่ีไดคือ I said “ Hello World ” to you

- System.out.println(“Pe\\n”); ผลลัพธท่ีไดคือ Pe\n แตหากเปน “Pe\n” จะเปน Pe แลวข้ึนบรรทัดใหม

2.2.5 คาคงที ่ในภาษาจาวาคาคงที่จะมีลักษณะเหมือนตัวแปรทั่วๆไป เพียงแตเมื่อทําการกําหนดคาแลวจะไมสามารถทําการเปลี่ยนแปลงคานั้นไดอีก หากมีการพยายามในการจะเปลี่ยนคาตัวแปรที่เปนคาคงที่ เมื่อทําการแปลโปรแกรมตัวคอมไพเลอรจะแจงความผิดพลาดข้ึน ซึ่งจะเปนความผิดพลาดในขณะแปลโปรแกรม หรือท่ีเรียกวา compile-time error

การประการตัวแปรเพื่อสรางคาคงที่นั้นสามารถทําไดโดยการเพิ่มตัวปรับปรุง final เขาไปขางหนาการประกาศตัวแปร และชื่อของตัวแปรมักเปนตัวอักษรพิมพใหญท้ังหมด

ตัวอยางเชน final int MIN_HEIGHT = 70;

2.3 ชนิดขอมูลพื้นฐาน

จาวามีชนิดขอมูลพ้ืนฐานทั้งหมด 8 ชนิด โดยสามารถแบงเปนกลุมยอยๆไดดังนี้ กลุมตัวเลขจํานวนเต็ม ไดแก byte, short, int, long

กลุมตัวเลขทศนิยม ไดแก float, double

กลุมตัวอักษร ไดแก char

กลุมคาทางตรรกะ(จริงหรือเท็จ) ไดแก boolean

Page 21: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

17

2.3.1 ชนิดขอมูลพื้นฐานของตัวเลข

ขอมูลชนิดพื้นฐานของตัวเลขจะแบงเปนตัวเลขจํานวนเต็มและจํานวนทศนิยม สําหรับตัวเลขจํานวนเต็มนั้นจะมีอยูดวยกันทั้งหมด 4 แบบคือ byte, short, int และ long ซึ่งแตละชนิดก็จะสามารถเก็บคาของตัวเลขไดไมเทากันเชน หากมีการประกาศใหตัวแปรใหมีชนิดเปน byte แลว ตัวแปรดังกลาว ก็จะสามารถเก็บคาของตัวเลขไดตั้งแต -128 ถึง 127 แตถามีการประกาศใหตัวแปรมีคาเกินกวาท่ีกําหนดเชน byte x = 200; เมื่อทําการแปลภาษาแลว จะพบวามีขอผิดพลาดขณะแปลท้ังนี้เพราะ คาของตัวแปร x ท่ีกําหนดใหนั้นเกินคาท่ีขนาดของ byte จะรับไดนั่นคือ 127 สําหรับขนาดความจุของแตละชนิดนั้น แสดงดังรูปที่ 2-5 สําหรับตัวเลขทศนิยมนั้น จะสามารถแบงไดเปนแบบ float และ double และขนาดของ double ก็จะมีความจุเปน 2 เทาของfloat แสดงดังรูปที่ 2-5

รูปที่ 2-5ตารางแสดงชนิดขอมลูพื้นฐานของตวัเลข

ความรูเพิ่มเติม

• ตัวเลขที่ลงทายดวย f หรือF คือ float และ d หรือD คือ double ตามลําดับ เชน float x = 1.5f; double y = 1.47d;

• ในการกําหนดคากับตัวแปรประเภท float นั้น ผูพัฒนาจะตองมีขอระวังคือ ในการกําหนดคาใหกับตัวแปรประเภท float ผูพัฒนาจะตองทําการใสตัวอักษรf หลัง ตัวเลขทศนิยม หากไมใส เชน float x = 1.5; เมื่อทําการแปลภาษาแลว จะพบวามีขอผิดพลาดขณะแปลภาษา ท้ังนี้เพราะโดยปกติจํานวนทศนิยมท่ัวไป ในโปรแกรมจาวานั้นจะถือวาจํานวนทศนิยมดังกลาว เปนแบบ double โดยปรยิาย ดังนั้นหากตองการใหจํานวนทศนิยมของเราเปนแบบ float ผูพัฒนาก็จะตองทําการใสตัวอักษรf กํากับเสมอ

Page 22: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

18

2.3.2 ชนิดขอมูลพื้นฐานของตัวอักษร

สําหรับชนิดขอมูลตัวอักษรนี้มเีพียง 1 ชนิด คือ char ซึ่ง char จะสามารถเก็บตัวอักษรไดเพียง 1 ตัว จะเปนภาษาใดก็ได(unicode character set) ซึ่งตัวอักษรจะถูกครอบคลุมดวยเครื่องหมายหยดน้ําคาง(‘…’) โดยภายในเครือ่งหมายจะเปนตัวอักษร 1 ตัว เชน ‘A’ , ‘x’ , ‘7’ , ‘S’ , ‘,’ , ‘\n’

ซึ่งจะพบวาตัวอักษรแตละตัวสามารถแทนไดดวยตัวเลขที่ไมซ้ํากัน โดยตัวอักษรท่ีอยูติดกันจะมีตัวเลขติดกัน ซึ่งการเรียงคาจะเปนการเรียงตามพจนานุกรมและตัวอกัษรภาษาอังกฤษจะมากอนภาษาไทย ดังแสดงในรูปที่ 2-6

01 class NumericChar 02 { 03 public static void main(String[] args) 04 { 05 char c1 = 'a'; 06 char c2 = 'A'; 07 char c3 = 'B'; 08 char c4 = 'ก'; 09 System.out.println(c1); 10 System.out.println(c2); 11 System.out.println(c3); 12 System.out.println(c4); 13 14 int i1 = c1; 15 int i2 = c2; 16 int i3 = c3; 17 int i4 = c4; 18 System.out.println(i1); 19 System.out.println(i2); 20 System.out.println(i3); 21 System.out.println(i4); 22 } 23 }

รูปที่ 2-6 ตวัอยางโคดแสดงการใชงาน char

ผลลัพธของโปรแกรม

a

A

B

97

65

66

3585

Page 23: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

19

บรรทัดท่ี 5-8 เปนประกาศตัวแปร c1-c4 ใหเปนตัวแปรประเภท char และมีกําหนดคา

ใหกับตัวแปรแตละตัวคือ a, A, B และ ก ตามลําดับ

9-12 เปนการเรยีกใชเมธอด println เพื่อแสดงคาท่ีเกบ็ไวในตัวแปร char แตละตัว

14-17 เปนการนําคาตัวอักษรดังกลาวมาเก็บไวในตัวแปรแบบจํานวนต็มช่ือ i1-i4

การทําเชนนี้ก็เพื่อจะแสดงใหเห็นวาตัวอักษรทุกตัวจะแทนดวยตวัเลข

18-21 ผลลัพธท่ีไดจะเปนตัวเลขซึ่งแทนรหัส ASCII ของชนิดขอมลู char นั้นๆ จะสังเกตเห็นวาตัวอักษร A จะแทนคาดวย 65 และตัวอักษร B จะแทนคาดวย 66 ซึ่งจะเปนเรยีงตามพจนานุกรมและคาของตวัอักษร a ก็จะแสดงใหเห็นวาตัวอักษรพิมพใหญจะมากอนตวัอักษรพิมพเลก็เพราะมีคาท่ีนอยกวา และสําหรับตัวอกัษร ก นัน้จะมีคามากที่สุด กลาวคือตัวอักษรภาษาอังกฤษจะมากอนตัวอักษรภาษาไทย

2.3.3 ชนิดขอมูลพื้นฐานคาทางตรรกะ

ชนิดขอมูลท่ีเก็บคาทางตรรกะเหลานี้คือ boolean ซึ่งจาวาจะใช true แทน คาจริง และ false แทนคาเท็จ ในการกําหนดคาใหกับ boolean นั้น จะสามารถกําหนดไดเปน true และ false หรืออาจกําหนดเปนนิพจนท่ีเทียบเทากันไดเทานั้น

ตัวอยางเชน boolean done = false;

2.4 นิพจนของตัวเลข

นิพจน คือ การรวมกันของตัวดําเนินการ(operator)และตัวถูกดําเนินการ(operand) ซึ่งนิพจนของตัวเลขจะเปนการคํานวณที่ใหผลลัพธเปนตัวเลข ซึ่งสามารถใชตัวดําเนินการทางคณิตศาสตร +, -, *, /, % สําหรับตัวดําเนินการ % นั้นเปนการหารเชนเดียวกนัแตเปนการหารที่ตองการแต เศษ เชน 15%4 ผลลัพธท่ีไดจะมีคาเปน 3 15%5 ผลลัพธท่ีไดจะมีคาเปน 0 เมื่อมีการดําเนนิการเกิดข้ึน ผลลัพธของนิพจนจะมีชนิดขอมูลตามชนิดขอมูลท่ีใหญท่ีสุดของตัวถูกดําเนินการ ตัวอยางเชน กําหนดให int x = 6; float y = 20f; x * 5; ผลลัพธท่ีไดคือ 30 ชนิดผลลัพธคือ int x / 5; ผลลัพธท่ีไดคือ 1 ชนิดผลลัพธคือ int x * y; ผลลัพธท่ีไดคือ120.0 ชนิดผลลัพธคือ float (ตามชนิดของตัวแปร y)

Page 24: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

20

2.4.1 ลําดับของตัวดําเนินการ

ในนิพจนหนึ่งๆนั้นอาจจะมีตัวดําเนินการหลายชนิดอยูในนิพจนเดียวกัน ดังนั้นการทํางานของตัวดําเนินการจะเกิดข้ึนเปนลําดับตามระดับความสําคัญของตัวดําเนินการ ซึ่งหากมีระดับเดียวกันจะทําการคํานวณจากซายไปขวา รูปท่ี 2-7 จะเปนตารางแสดงลําดับความสําคัญของตัวดําเนินการ โดยความสําคัญจะเรียงจากลางขึ้นบน กลาวคือ การใสเครื่องหมาย () จะมีความสําคัญมากที่สุด

Operator Precedence

Operators Precedence

Postfix [], (), expr++ expr--

Unary ++expr --expr +expr -expr ~ !

Multiplicative * / %

Additive + -

Shift << >> >>>

Relational < > <= >= instanceof

Equality == !=

bitwise AND &

bitwise exclusive OR ^

bitwise inclusive OR |

logical AND &&

logical OR ||

Conditional ? :

Assignment = += -= *= /= %= &= ^= |= <<= >>= >>>=

รูปที่ 2-7 ตารางแสดงลําดับการประมวลผลของเครื่องหมาย

ตัวอยางเชน answer = sum / 4 + MAX * lowest;

จากตัวอยางขางตนจะมีตัวดําเนินการอยู 3 ชนิด คือ / , + และ * จากตารางในรูปที่ 2-7 จะเห็นวาเครื่องหมาย * , / จะมีความสําคัญมากกวาเครื่องหมาย + ดังนั้นโปรแกรมจะเลือกดําเนินการกับ / และ *

กอน แตโปรแกรมจะเลือกเครื่องหมาย / กอนเพราะหากมีความสําคัญเทากัน โปรแกรมจะดําเนินการจากซายไปขวา

Page 25: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

21

ลําดับการประมวลผล

ข้ันที่ 1 sum / 4

ข้ันที่ 2 MAX * lowest

ข้ันที่ 3 นําผลลัพธจากขั้นที่ 1 และ 2 มาบวกกัน

ข้ันที่ 4 นําผลลัพธจากขั้นที่ 3 มาเก็บไวในตัวแปรทางซายมือ

ดังนั้นเพื่อปองกันความสับสน ควรใชเครื่องหมาย ( ) เพื่อระบุวาตัวดําเนินการใดตองทํากอนหลัง ตัวอยางเชน

01 class ArithmaticExpression 02 { 03 public static void main(String[] args) 04 { 05 int a = 8, b = 5; 06 float c = 2.0f; 07 System.out.println(a + b); //13 08 System.out.println(a - b); //3 09 System.out.println(a * b); //40 10 System.out.println(a % b); //3 11 12 System.out.println(a / b); //1 13 System.out.println(b / c); //2.5 14 15 16 float d = a + b * c; 17 System.out.println(d); //18.0 18 19 d = (a + b) * c; 20 System.out.println(d); //26.0 21 } 22 }

รูปที่ 2-8 ตัวอยางโคดการใชงานตัวดําเนินการ

บรรทัดท่ี 5-6 เปนการกําหนดคาใหแตตัวแปร a,b,c

7-13 เปนการใชงานตัวดําเนินการอยางงายๆ

16 เปนการใชงานตัวดําเนินการ โดยจาวาจะคูณ b และ c กอน แลวจึงนํามาบวกกับ a ซึ่งจะใหผลลัพธเสมอืนกบั d = a + (b * c);

19 เปนการใชงานตัวดําเนินการโดยใชงานรวมกนัเครื่องหมาย ( ) ซึ่งจาวาจะดําเนินการบวก a และ b กอนจงึนําไปคูณกับ c

answer = sum / 4 + MAX * lowest;

1 2 3 4

Page 26: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

22

2.4.2 การแปลงชนิดของขอมูล ในการดําเนินการตางๆกับขอมูล อาจทําใหขอมูลมีการเปลี่ยนแปลงชนิดของขอมูล ซึ่งการแปลงชนิดของขอมูลเกิดข้ึนได 3 ทาง ดังนี้ วิธีท่ี 1 ขอมูลถูกแปลงโดยผานทางเครื่องหมายเทากับ(=)

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

int x =5; byte y = 4; y=x;

จากตัวอยางขางตน จะเห็นวาตัวแปร y เปนชนิด byte ซึ่งจะมีขนาดเล็กกวาชนิดจํานวนเต็มหรือ integer ดังนั้นเมื่อกําหนดใหนําคา x ไปให y จึงเกิดการผิดพลาดขณะแปลภาษาขึ้น แตในทางกลับกัน หากเปลี่ยนคําสั่งดังกลาวเปน x=y; ก็จะไมมีขอผิดพลาดเกิดข้ึน

วิธีท่ี 2 ชนิดของขอมูลถูกแปลงเมื่อเกดิการดําเนินการ กรณีนี้จะเกิดข้ึนเมื่อตัวถูกกระทํามีชนิดของขอมูลท่ีแตกตางกัน ตัวอยางเชน int a=5; float b = 6.0f; System.out.println(a*b);

เมื่อกําหนดให a เปนตัวแปรชนิด int และ b เปนตัวแปรชนิด float เมื่อนํา a*b จะทําให b ถูกเปลี่ยนเปน float(ซึ่งมีนัยสําคัญกวา int) กอน แลวจงึทําการดําเนินการคูณ เพราะฉะนั้นผลลัพธในตัวอยางนี้จะมีคาเปน 30.0

วิธีท่ี 3 การแปลงชนิดของขอมูลโดยผานการทําคาสติ้ง(casting)

วิธีนี้เปนวิธีท่ีทรงพลังท่ีสุดและมีอันตรายมากที่สุด กลาวคือ ผูพัฒนาสามารถที่จะเปลี่ยนชนิดของขอมูลใหเปนชนิดใดก็ไดตามความตองการของผูพัฒนาโดยมีลักษณะการใชงานดังนี้ byte b=4; int i=129; b = i;

เมื่อ b เปนตัวแปรชนิด byte และ i เปน int เมื่อทําการใหคาของตัวแปร I ไปยังตัวแปร b ซึ่งหากเขียนโปรแกรมในลักษณะนี้ เมื่อทําการแปลภาษาจะการผิดพลาดได ดังนั้นหากผูพัฒนาตองการจะแปลงตัวแปร i ใหเปนแบบชนิด byte ก็จะสามารถทําการคาสติ้งโดยใชคําสั่ง

b = (byte) i;

หมายเหตุ • สําหรับการแปลงในวิธีท่ี3นี้ เปนการบังคับใหตัวแปรเปลี่ยนไปเปนชนิดใดก็ไดตามความ

ตองการ ดังนัน้ผูพัฒนาตองมีความระมัดระวังเกี่ยวกับคาของตัวแปรกลาวคือ จากตัวอยางขางตน หากนํา b ไปแสดงออกทางหนาจอโดยผานคําสั่ง System.out.print

Page 27: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

23

(b); คาท่ีไดจะเปน -127 ซึ่งในความเปนจริง คาของ i เปน 129 นั่นหมายความวาจะมีการยอนกลบัไปทางคาดานลบของตัวแปร

2.5 การสรางออบเจ็ค

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

2.4) • ตัวแปรอางอิง ตัวแปรเหลานี้ถูกสรางขึ้นเพื่อเปนตัวอางองิ(reference)ไปยังออบเจ็ค จะ

สามารถกลาวไดวา เปนนตัวแปรที่เก็บตําแหนงของออบเจ็ค โดยตัวแปรอางอิงจะตองถูกประกาศเชนเดียวกันกับตัวแปรขอมูลชนิดพืน้ฐาน

ในการประกาศตัวแปรขอมลูชนิดพื้นฐานนั้น จะใชชนิดของขอมูลท่ีจะถูกเก็บไวในตัวแปรนี้อยูดานหนา แตสําหรับตัวแปรอางอิงจะใชช่ือคลาสนําหนาช่ือตัวแปร

ตัวอยางเชน การประกาศตัวแปรขอมูลชนิดพื้นฐาน : int total; การประการตัวแปรอางอิง : String title;

• เมื่อทําการประกาศหรือสรางตวัแปรอางองิแลว จากตัวอยางการประกาศตัวแปรอางองิขางตน จะพบวา ตัวแปรอางอิงมีช่ือวา title เปนตัวแปรอางอิงชนิดสตริงและจะสามารถอางอิงไปยังออบเจ็คท่ีเปนสตริงได ซึ่งตอไปจะกลาวถึงการสรางออบเจ็คใหกับตัวแปรอางอิง โดยขอควรระวังตรงจดุนี้คือ หากประกาศตัวแปรอางอิงเปนตัวแปรชนิดใด (จากคลาสใด) ก็จะสามารถอางองิไปยังออบเจ็คชนิดนั้นไดเทานั้น สําหรับคลาส String นี้จะเปนคลาสที่มีอยูแลวในภาษาจาวา

• ในการสรางออบเจ็คข้ึนมา จะใชตัวดําเนินการ new ในการสราง โดยตัวท่ีจะตามหลังตัวดําเนินการ new นั้นจะตองเปนเมธอดพิเศษหรือเรียกวาคอนสตรัคเตอร(constructor) ซึ่งเมธอดนี้จะมีช่ือเดียวกับคลาสที่เราใชในการประกาศตัวแปรอางอิง

ตัวอยางเชน String title = new String (“Hello World”);

Page 28: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

24

จะเห็นวา title เปนตัวแปรอางอิงชนิดสตริงดงันั้นจะมีการอางอิงไปยังออบเจ็ค String ซึ่งเก็บคําวา “Hello World” โดยผานตัวดําเนินการ new สําหรับตัวแปรอางองิของคลาสสตริงนี้ จะมีขอยกเวนพิเศษสําหรับคลาสนี้คือ ใหยกเวนการใช new ได โดยจะใชเปน

String title = “Hello World”; การเขียนโปรแกรมในลักษณะดังกลาวก็จะเหมือนกับการสรางออบเจ็คแบบขางตน แตสําหรับคลาสอื่นๆจะตองทําการ new ทุกครั้ง เมื่อออบเจ็คถูกสรางขึ้นแลว เราสามารถใชตัวแปรอางอิงในการเรียกใชงานเมธอดได

ตัวอยางเชน title.length()

ซึ่ง length() จะเปนเมธอดที่มีอยูแลวในคลาสสตริง ซึ่งเมธอดนี้เปนเมธอดที่ใชสําหรับหาความยาวของสตริง

ตัวอยางเชน 01 String title; 02 title = new String("Hello World"); 03 System.out.println(title.length());

รูปที่ 2-9ตวัอยางโคดการใชงานเมธอดของออบเจ็ค

บรรทัดท่ี 1 เปนการสรางตัวแปรอางอิงชนิด String ท่ีช่ือวา title

2 เปนการสรางออบเจ็ค String โดยเก็บคา Hello World เอาไว และมี title เปนตัวแปรในการอางอิง

3 เปนการใชเรียกใชงานเมธอด length() ผานทางตัวแปรอางองิ title และจะไดผลลัพธออกมามีคาเปน 11

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

2.6 แพกเกจ(Package)

เนื่องจากในการโปรแกรมจะมีคลาสตางๆเกิดข้ึนมากมายซึ่งคลาสเหลานี้อาจจะเปนคลาสมาตรฐานของภาษาจาวาหรือเปนคลาสที่ผูพัฒนาทําการเขียนขึ้นมาเองก็ได ดังนั้นจึงมีการจัดหมวดหมูของคลาสขึ้น เรียกวา แพกเกจ(package) ซึ่งจะมีลักษณะคลายกับไดเรกทอรี ตัวอยางของแพกเกจที่มีอยู แลวในจาวา เชน

Page 29: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

25

• java.lang ใชประกอบไปดวยคลาสตางๆที่สําหรับงานทั่วไป ท่ีรูจักคือ System, Math, Integer และ String เปนตน

• java.Applet ใชสําหรับการสรางแอพแพลต • java.awt ใชสําหรับการสรางสวนติดตอกับผูใชแบบกราฟฟก • java.util รวบรวมเครื่องมือชวยเหลือตางๆ คลาสทั้งหมดที่อยูในแพคแกจนี้จะใช

เก็บออบเจ็คในการสุมขอมูล , เวลา ,วันที่ เปนตน

2.6.1 การประกาศการนําเขา (import)

ในการเรียกใชงานคลาส String หรือ System ซึ่งเปนคลาสที่อยูใน java.lang นั้นสามารถใชงานไดเลย เนื่องจากโปรแกรมจาวาทุกโปรแกรมจะรูจักคลาสทุกคลาสที่อยูใน java.lang โดยอัตโนมัต ิดังนั้นหากตองการเรียกใชงานคลาสอื่นๆที่อยูนอกเหนือจากแพกเกจ java.lang นั้น จะตองทําการประกาศการนําเขาแพกเกจเพื่อใหโปรแกรมจาวารูจัก การแนะนําใหโปรแกรมจาวารูจักคลาสเพิ่มเติมนั้นเรียกวาการนําเขา(import) ตัวอยางเชน

• import java.util.Random; จะเปนการนําเขาคลาส Random จากแพกเกจ java.util • import java.util.*; จะเปนการนําเขาคลาสทุกคลาสในแพกเกจ java.util

สาํหรับการประกาศการนําเขานั้น จะประกาศไวดานบนสุดของโปรแกรม โดยมีโครงสรางคือ import ช่ือแพกเกจหลัก.ช่ือแพกเกจยอย.ช่ือของคลาส.

2.7 เมธอดของคลาส

การเรียกใชงานเมธอดสามารถทําได 2 ลักษณะ คือ

ลักษณะที่ 1 การเรียกใชผานตัวแปรอางอิง ตัวอยางเชน String s = “Hello”; int len = s.length();

นั่นคือเปนการกําหนดให s เปนตัวแปรอางอิง มีชนิดขอมูลเปนสตริง และเก็บขอความ Hello ไว ดังนั้นเมื่อมีความตองการเรยีกใชเมธอด length() เพื่อหาความยาวของ Hello เราก็จะเรียกเมธอด length() ไดโดย s.length()ซึ่งจะไดผลลัพธเทากับ 5 แลวนําไปเก็บไวในตัวแปร len ซึ่งเก็บขอมูลชนิดพื้นฐานชนิดจํานวนเต็ม การท่ีเราจะเรียกการใชงานเมธอดผานตัวแปรอางองิในลักษณะแบบ เรานี้วา เมธอดของออบเจค็(instance method)

Page 30: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

26

ลักษณะที่ 2 การเรียกใชงานผานชื่อคลาส การเรียกใชเมธอดในลักษณะนี้ จะเปนเมธอดที่มีอยูแลวในคลาสที่อยูในจาวา โดยทั่วไปมักใชเกี่ยวกับการคํานวณหรือการจดัการบางอยาง โดยในการเรียกใชงานไมจําเปนตองสรางออบเจ็คก็สามารถเรียกใชงานผานชื่อคลาสไดเลย ตัวอยางเชน

Math.cos(90); นั่นคือ เมธอด cos จะถูกเรียกใชงานผานคลาสที่ช่ือ Math ซึ่งจะทําการหาคา cosine 90 องศาออกมา เราเรียกการใชงานเมธอดผานชื่อคลาสนี้วา เมธอดของคลาส(static method)

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

2.7.1 การจัดรูปแบบการแสดงผล

ในบางครั้งของการเขียนโปรแกรมที่มีการคํานวณ ผลลัพธท่ีไดจากการดําเนินการอาจจะมีตัวเลขที่มากเกินไป ดังนั้นเมื่อตองการที่จะมีการจัดรูปแบบของตัวเลข ภาษาจาวาก็จะมีคลาสที่จะใชในการจัดรูปแบบการแสดงผลคือ คลาส DecimalFormat ซึ่งอยูในแพกเกจ java.text ดังนั้นในการเขียนโปรแกรมก็จะตองมีการนําเขา (import) แพกเกจ java.text เขามากอน ดังแสดงในรูปท่ี 2-10ตัวอยางเชน การบังคับใหแสดงผลเปนตัวเลขทศนิยม 2 ตําแหนง ท้ังนี้คอนสตรัคเตอรของคลาส DecimalFormat จะรับพารามิเตอรเปนรูปแบบของตัวเลข เชน ระบุพารามิเตอรเปน 0.00 จะเปนรูปแบบของตัวเลขที่บังคับทศนิยม 2 ตําแหนง ตัวอยางเชน

01 import java.text.DecimalFormat; 02 03 class PiFormatter 04 { 05 public static void main(String[] args) 06 { 07 float pi = 22/7.0f; 08 DecimalFormat df = new DecimalFormat("0.00"); 09 String result = df.format(pi); 10 System.out.println(result); 11 } 12 }

รูปที่ 2-10ตัวอยางโคดการใชงานเมธอดของคลาส

Page 31: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

27

ผลลัพธของโปรแกรม

3.14

เนื่องจากคาของ pi นั้นเปนที่ทราบวามีคาของตัวเลขทศนิยมที่ไมรูจบ เมือ่เราตองการที่จะทศนิยมออกมาเพียง 2 ตําแหนง เราสามารถที่จะใชคลาสของ DecimalFormat ได

บรรทัดท่ี 7 เปนการสรางตัวแปรชนิดfloat โดยใหช่ือวา pi

8 มีการประกาศให df เปนตัวแปรอางอิงและสรางออบเจ็คของคลาส

DecimalFormat ในบรรทัดนีม้ีการเรยีกใชเมธอดพิเศษหรือคอนสตรัคเตอรดวย โดยทําการกําหนดพารามิเตอรใหเปนทศนิยมสองตําแหนงไปพรอมๆกัน ในที่นี้ หากเราตองการที่จะใหแสดงผลออกมาเปนตัวเลขทศนิยม 3

ตําแหนง สามารถที่จะสง “0.000” แทน “0.00”

9 มีการเรยีกใชเมธอด format ผานตัวแปรอางอิง df พรอมกับสงคาท่ีเราตองการจะจัดรปูแบบซึ่งในที่นี้คือ คา pi ซึ่งผลลัพธท่ีไดจากการเรยีกใชเมธอด format นี้จะใหผลลัพธเปนสตริง ดังนัน้จึงมีการประกาศตัวแปร result

มารับสตริงท่ีเกดิข้ึนจากเมธอทดังกลาว แลวทําการแสดงผลในบรรทัดท่ี 10

2.8 การวาดรูป

2.8.1 การสรางภาพ การสรางภาพบนโปรแกรมก็เหมือนกับการวาดภาพทั่วๆไปนั่นคือ จะตองมีเฟรมสําหรับวาดรูปซึ่งในโปรแกรมจะใชคลาสชื่อ JFrame จากแพกเกจ javax.swing ซึ่งสิ่งท่ีสนใจคือคลาส JFrame จะมีเมธอดชื่อวา paint จะถูกเรียกใชงานอัตโนมัติเมื่อมีการวาดรูป ซึ่งเมธอด paint จะรับพารามิเตอรเปนตัวแปรออบเจ็คซึ่งสรางจากคลาส Graphics ซึ่งบรรจุในแพกเกจ java.awt ในการวาดรูปเราสามารถเรียกใชงานเมธอดตางๆของคลาส Graphics โดยจะเรียกใชงานผานตัวแปรอางอิง โดยในที่นี้จะใช page เปนตัวแปรอางอิงไปยังออบเจ็คของคลาส Graphics

ตัวอยางการใชงานเมธอด paint เชน public void paint(Graphics page){ /*

your code */

} จากตัวอยาง page จะอางอิงไปยังออบเจ็คของคลาส Graphic โดยอัตโนมัต ิซึ่งไมจําเปนตองมีการ new เพื่อสรางออบเจ็ค ดังนั้นการเรียกใชงานเมธอดตางๆจึงใช page.เมธอด();

Page 32: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

28

2.8.2 การวาดเสน

เสนตรงเกิดจากการลากเสนเชื่อมระหวางจดุสองจุด ดงันั้นในการวาดเสนตรงจึงตองมีจุดสองจุดกอนแลวจงึทําการลากเสน โดยเมธอดที่จะใชคือ เมธอด drawLine ซึ่งจะรับพารามิเตอรเปนตัวเลขนั่นคือ จุดท้ังสองจุดนั่นเอง (ใหจุดท่ี 1 คือ(x1,y1) จุดท่ี 2 คือ(x2,y2))

ตัวอยางการใชงาน page.drawLine(x1,y1,x2,y2); ในรูปที่ 2-11

รูปที่ 2-11 ตัวอยางโคดการใชงานเมธอด drawLine()

ขอควรระวัง คาของ(x1,y1) และ (x2,y2) จะมีหนวยเปนพิกเซล(pixel) โดยจุด(0,0) จะอยูท่ีมุมบนซาย โดยหากลากจากจุดนี้ไปทางขวา จะเปนคาบวกทางแกน x และหากลากจากจุด(0,0) ลงมาดานลางจะเปนคาบวกทางแกน y

2.8.3 การวาดรูปสี่เหลี่ยม ในการวาดรูปสี่เหลี่ยมนั้นจะใชเมธอดชื่อ drawRect ซึ่งเมธอดนี้จะรับพารามิเตอรจํานวน 4 ตัว คือ สองตัวแรกจะเปนจุดเริ่มตนของการสรางสี่เหลี่ยม ในที่นี้ใหเปนจุด(x,y) พารามิเตอรตวัท่ีสามคือความยาวในแนวนอนหรือแกน x ของรูปสี่เหลี่ยมใหเปน l และพารามิเตอรตัวท่ีสี่คือ ความยาวของสี่เหลี่ยมในแนวตั้งหรอืแกน y ใหเปน w

ตัวอยางการใชงาน page.drawRect(x,y,l,w);

Page 33: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

29

รูปที่ 2-12 ตัวอยางโคดการใชงานเมธอด drawRect()

2.8.4 การวาดรูปวงรี

ในการวาดรูปวงรีจะใชเมธอดชื่อ drawOval ซึ่งจะรับพารามิเตอร 4 ตวั คือ จุดเริ่มตน(x,y) ความยาวในแนวแกน x และความยาวในแนวแกน y ซึ่งจากพารามิเตอรท้ัง 4 ตัว จะทําใหไดกรอบรูปสี่เหลี่ยมซึ่งจะลอมรอบวงรีท่ีจะทําการสราง ตอมาโปรแกรมจะทําการวาดรูปของวงรีภายในกรอบของสี่เหลี่ยม และรูปของกํจะถูกสรางขึ้น

ตัวอยางการใชงาน page.drawOval(x,y,l,w);

รูปที่ 2-13 ตัวอยางโคดการใชงานเมธอด drawOval()

สําหรับการวาดวงกลมนั้นจะสมัพันธกับการวาดวงรี โดยจะใชเมธอด drawOval ในการสรางเหมือนกัน แตจะตองกําหนดคาความยาวของกรอบสี่เหลี่ยมในแนวแกน x และ y ใหเทากัน

Page 34: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

30

2.8.5 การระบุส ี

ในการสรางภาพใหมีสีสันสวยงามนั้น โปรแกรมจาวาจะมีคลาสชื่อ Color ซึ่งเปนคลาสที่ใชในการระบุส ีดังแสดงในรูปที่ 2-14 ตัวอยางการใชงานคลาส Color

01 //************************************************************ 02 // Snowman.java Author: Lewis/Loftus 03 // Demonstrates basic drawing methods and the use of color. 04 //************************************************************ 05 06 import javax.swing.JFrame; 07 import java.awt.*; 08 09 public class Snowman extends JFrame 10 { 11 public void paint (Graphics page) 12 { 13 final int MID = 150; 14 final int TOP = 50; 15 16 setBackground (Color.cyan); 17 18 page.setColor (Color.blue); 19 page.fillRect (0, 175, 300, 50); // ground 20 21 page.setColor (Color.yellow); 22 page.fillOval (-40, -40, 80, 80); // sun 23 24 page.setColor (Color.white); 25 page.fillOval (MID-20, TOP, 40, 40); // head 26 page.fillOval (MID-35, TOP+35, 70, 50); // upper torso 27 page.fillOval (MID-50, TOP+80, 100, 60); // lower torso 28 29 page.setColor (Color.black); 30 page.fillOval (MID-10, TOP+10, 5, 5); // left eye 31 page.fillOval (MID+5, TOP+10, 5, 5); // right eye 32 33 page.drawArc (MID-10, TOP+20, 20, 10, 190, 160);// smile 34 35 page.drawLine (MID-25,TOP+60,MID-50, TOP+40);// left arm 36 page.drawLine (MID+25,TOP+60,MID+55, TOP+60);//right arm 37 38 page.drawLine (MID-20,TOP+5,MID+20, TOP+5);//brim of hat 39 page.fillRect (MID-15, TOP-20, 30, 25); // top of hat 40 41 } 42 }

รูปที่ 2-14 ตัวอยางโคดการวาดรูป

Page 35: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

31

ผลลัพธของโปรแกรม

สําหรับการออกแบบโปรแกรมนี้เราจะทําการsetbackground ท้ังหมดใหเปนสีทองฟาน้ําทะเลกอน จากนั้นก็จะระบายสีน้ําเงินดานลาง ตอมาสรางพระอาทิตย แลวคอยสรางตุกตาหิมะเปนลําดับสุดทาย

บรรทัดท่ี 6 เปนการนําเขาคลาส JFrame ในแพกเก็จ javax.swing เพื่อเปนเฟรมสําหรับการวาดภาพ

7 เปนการนําเขาคลาสทุกคลาสในแพกเก็จ java.awt เพื่อใชในการวาดรูป

9 สรางคลาส Snowman เปน public class ซึ่งจะมีการสืบทอดคุณสมบัติมาจากคลาส JFrame

11 เปนการสรางเมธอด paint ใหเปน public method โดยรับพารามิเตอรเปนโดยใช page เปนตัวแปรอางองิ ซึ่งเปนตัวแปรชนิดของคลาส Graphics

16 เมธอด setBackground สามารถเรียกใชงานไดเลยเนือ่งจากเปนเมธอดของคลาส ในที่นี้กําหนดให background มีสีฟาน้ําทะเล

18 เปนการเรยีกใชเมธอด setColor ในที่นี้จะเปนการเตรยีมสีน้ําเงนิ

19 เมธอด fillRect ใหระบายสีน้ําเงิน (ตามที่ไดเตรียมไวในบรรทัดท่ี 18) จากนั้นเปนการกําหนดใหเริม่ระบายสี ณ ตําแหนงท่ี x เปน 0 และ ในแกน y ท่ีตําแหนง 175 และใหระบายยาวไปในทางแกน x จํานวน 300 พิกเซล และลงมาทางแกน y จํานวน 50 พิกเซล

21 ตอมาเราจะทําการวาดรูปพระอาทิตยท่ีมีเพียงเสี้ยวเดยีวอยูมมุบนซาย เปนการเรยีกใชเมธอท setColor ในที่นี้จะเปนการเตรียมสีเหลอืง

Page 36: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

32

22 เราจะเรียกใชเมธอดfillOval ในการวาดรูปวงกลม จะเปนวาพารามิเตอรของเราจะมีคาติดลบ (-40, -40, 80, 80) ท้ังนี้เราตองการใหรูปที่เกิดข้ึนเปนเพียงเสีย้วหนึ่งของวงกลม ดังนัน้เราจงึไปกําหนดจุดศูนยกลางของวงกลมใหอยูนอกกรอบที่เฟรมจะรับได ซึ่งท่ีนี้จุดศูนยกลางจะเริ่มตนอยูท่ีมุมบนซายทําใหสิ่งท่ีปรากฎบนเฟรมของเรานั้นมีเพียงสวนหนึ่งของวงกลม และในลักษณะเดียวกนั การสรางตุกตาหิมะ มีการกาํหนดคาท่ีคลายคลึงกับตัวอยางขางตน คือ

บรรทัดท่ี 24-27 เปนสวนหวัของตุกตา

บรรทัดท่ี 29-31 เปนสวนตาของตุกตา

บรรทัดท่ี 33 เปนสวนปากของตุกตา

บรรทัดท่ี 35-36 เปนสวนแขนของตุกตา

บรรทัดท่ี 38-39 เปนสวนหมวกของตุกตา

สรุปทายบทที่ 2

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

Page 37: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

33

คําถามทายบทที่ 2

1. จากตัวอยางโคดท่ีกําหนดให จงหาผลลัพธของโปรแกรม 01 class TestText 02 { 03 public static void main(String [] args) 04 { 05 System.out.println("Young"); 06 System.out.print("Java"); 07 System.out.println("Young Java") 08 } 09 }

2. จงเติมโคดลงในโปรแกรม เมือ่ตองการใหแสดงขอความดังนี้ ผลลัพธของโปรแกรม

01 Welcome to 02 "Java Programming" 03 Krab

โคดท่ีกําหนดให 01 class TestText1 02 { 03 public static void main(String [] args) 04 { 05 //Add your code here 06 } 07 }

3. จากตัวอยางโคดท่ีกําหนดให จงหาผลลัพธของโปรแกรม

01 class TestString { 02 public static void main(String [] args) 03 { 04 System.out.println(“Hello Young Java”); 05 System.out.println(“Hello”+5+ “Young Java Hello”+5+3); 06 System.out.println(5+3 +“ Hello Young Java”); 07 } 08 }

4. จากผลลัพธท่ีกําหนดให จงเติมโคดใหสมบูรณ

Page 38: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

34

04 public class RefUsage { 05 public static void main(String []args) { 06 07 String firstName = new _________________ 08 String lastName = new _________________ 09 System.out.println("Name: " + firstName + " " +

lastName); 10 }

ผลลัพธของโปรแกรม

11 Name: Somchai Jaidee

5. เพราะเหตุใดเราจึงตองทําการแพกเกจ (package) และ นําเขา (import) คลาส 6. จงเขียนโคด เพื่อประกาศตวัแปรตอไปนี ้

a. ตัวแปรชื่อ total ชนิดจํานวนเต็ม b. ตัวแปรชื่อ text ชนิดตัวอักษร c. ตัวแปรชื่อ num ชนิดทศนยิม มีคาเทากับ 20.0 d. ตัวแปรชื่อ PI ชนิดทศนยิม มีคาคงที่เทากบั 3.14

7. จงหาวาวิธีการใหคาของโปรแกรมดานลางที่กําหนดให ถูกตองหรอืไม หากไมจงแกไขใหถูกตอง a. int x =(int) 10; b. float y = 0.33; c. float z = 33; d. double double = 3.1416d; e. char ch= “a”; f. int x,u = 10; g. long v = 1000; x = 12; h. byte num = 16; i. short a = 1;

short num2 = a+5; j. int b = 3;

int num3 = (float) b/3; k. byte c = 34;

byte d = (byte) (c+45); 8. จงหาผลลัพธของโปรแกรมและบอกดวยวาผลลัพธท่ีไดเปนชนิดใด

a. 1+5 b. 10.0-6 c. 23%8 d. 12.0/2*3 e. 155/1.5

9. จงหาผลลัพธเมือ่กําหนดให x = 4 และ y=5 a. boolean b = x==y;

Page 39: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

35

b. boolean b = x!=y; c. boolean result = x<y; d. boolean result = y<x || 10<y; e. x=y; boolean result = x==4; boolean result = y!=5;

10. จงเติมโคดใหสมบูรณและหาผลลัพธของโปรแกรม

01 public class TestLength { 02 public static void main(String []args) { 03 String fname= "Young Java"; 04 String lname = "Developer"; 05 06 //Get length of strings 07 int fLen = (); 08 int lLen = (); 09 int totalLen = ; 10 11 ___________ = Math.sqrt(64); 12 System.out.println("Square root of 64 is "+ value); 13 14 System.out.println("Length of first name: " + fLen); 15 System.out.println("Length of last name: " + lLen); 16 System.out.println("Length of full name: " + totalLen); 17 } 18 }

a. yxyx

−+2

b. yzx

x 32 −+

c.

xyx

zy

−10

11. จงเขียนโปรแกรมสําหรับคํานวณคาของนิพจนทางคณิตศาสตรตอไปนี้ เมื่อกําหนดใหคา x = 5.5, y = 15.0, z = 4.0;

12. จงเขียนโปรแกรมเพื่อทําการคํานวณคา 87/9 โดยมีกําหนดใหผลลัพธท่ีแสดงเปนเลขทศนิยม 3 ตําแหนง

Page 40: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

36

บทที่ 3 โครงสรางควบคุม

บทที่ โครงสรางควบคุมโครงสรางควบคุม 33

หัวขอศึกษา โครงสรางแบบทางเลือก if – else , switch – case

โครงสรางแบบทําซ้ํา for , while

โครงสรางควบคุมเปนการกําหนดการทํางานของโปรแกรมใหเปนไปในทิศทางที่ผูพัฒนาตองการ ซึ่งการควบคุมการทํางานดังกลาวจะถูกเรียกวา flow control คําสั่งท่ีใชในการควบคุมการทํางานของโปรแกรมแบงไดเปน 2 ประเภท คือ

โครงสรางแบบทางเลือก

โครงสรางแบบทําซ้ํา

3.1 โครงสรางแบบทางเลือก

ทิศทางการทํางานของโปรแกรมจะพิจารณาจากเงื่อนไขที่กําหนด(condition statement) โดยคําสั่งของเงื่อนไขที่ใชในการควบคุมการเลือกไดแก if, if – else, switch – case

3.1.1 คําสั่งเงื่อนไข if คําสั่งนี้จะเลือกทําคําสั่งหรือกลุมคําสั่ง ก็ตอเมื่อ ทําการตรวจสอบเงื่อนไขแลวเปน “จริง”

รูปที่ 3-1 Flowchart ของโครงสรางทางเลือกแบบ if

Page 41: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

37

รูปแบบโครงสรางทางเลือกแบบ if if(เงื่อนไขที่ตองการตรวจสอบ){

คําสั่ง; }

จากflowchart จะพบวา หากเงื่อนไขของคําสั่ง if เปน จริง โปรแกรมจะทํางานตามคําสั่งหรือกลุมคําสั่งท่ีอยูถัดจากเงื่อนไข แตถาหากภายใตเงื่อนไขเปน เท็จ คําสั่งดังกลาวก็จะถูกขามไป

ตัวอยาง การใชคําสั่ง if

if(x > 0) total = total * x; System.out.println(“Thetotalis”+ total);

นั่นคือโปรแกรมจะทําการตรวจสอบเงื่อนไขหลัง if ซึ่งจากโคดตัวอยาง โปรแกรมจะทําการตรวจสอบ คาของตัวแปร x วามากกวา 0 หรือไม ซึ่งหากคา x > 0 จริง เชนอาจจะเปน 1,2,3,… ตัวแปร total จะคูณกับ x แตหากคา x < 0 ซึ่งเปนเท็จ คําสั่งในการคํานวณคาของตัวแปร total จะถูกขามไป หลังจากจบการทํางานของคําสั่ง if ไมวาเงื่อนไขจะเปนจริงหรอืเท็จ คําสั่งในสวนของ System.out.println ก็จะถูกเรียกใชงานทุกครั้ง ท้ังนี้เพราะในสวนของคําสั่งSystem.out.println นั้น จะเปนสวนที่อยูนอกเหนือการควบคุมจากคําสั่ง if (จากตัวอยางขางตน คําสั่ง if จะสามารถควบคุมไดเพียง total = total * x; คําสั่งเดียว หากตองการใหควบคุมไดมากกวา 1 คําสั่ง ตองใชเครื่องหมาย {…}ชวย )

ตัวอยางโคดการใชงาน if

12 class Score 13 { 14 public static void main(String[] args) 15 { 16 int points= 64; 17 18 if (points>=50) 19 System.out.println("Pass

exam......"); 20 21 System.out.println("Good Bye"); 22 } 23 }

รูปที่ 3-2 ตัวอยางโคดการใชงาน if

ผลลัพธของโปรแกรม Pass exam...... Good Bye

Page 42: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

38

อธิบายโปรแกรม บรรทัดท่ี 5 เปนการกําหนดคาของตัวแปร points ใหมีคาเปน 64 บรรทัดท่ี 7 เปนการตรวจสอบคาของ points วามีคามากกวาหรือเทากับ 50 หรือไม หากเปน

จริงก็จะทําคําสั่งในบรรทัดท่ี 8 แตหากเปนเท็จก็จะขามมาทํางานบรรทัดท่ี 10 ในท่ีนี้ เงื่อนไขเปน จริง เพราะ points มีคาเปน 64 ซึ่งมากกวา 50

8 เปนการพิมพประโยควา Pass exam หากคําสั่ง if เปนจริง จากนั้นทํางานบรรทัดท่ี 10 ตอไป

10 เปนการพิมพประโยควา Good Bye ความรูเพื่มเติมเกี่ยวกับเครื่องหมายเปรียบเทียบ

เครื่องหมายที่ใชในการปรียบเทียบ(relational operators) นั้นจะใหผลลัพธเปน boolean เสมอ นั่นคือ จะใหผลลัพธเปนคา “จริงหรือเท็จ” เทานั้น ซึ่งเครื่องหมายเปรียบเทียบเหลานี้ไดแก

> มากกวาหรือไม < นอยกวาหรือไม >= มากกวาหรือเทากันหรือไม <= นอยกวาหรือเทากันหรือไม != ไมเทากันหรือไม == เทากันหรือไม

หมายเหตุ เครื่องหมาย = จะใชในการกําหนดคา แต == นัน้จะใชในการเปรียบเทียบคา เชน เมื่อกําหนดให x = 3; เปนการกํานดใหตัวแปร x มีคาเทากับ 3 แตถาเปน x==3; จะเปนการเปรียบเทียบวา x คาเทากับ 3 หรือไม เพราะฉะนั้นสิ่งท่ีไดจาก คําสั่งดังกลาว จะเปน จริง หรือ เท็จ เทานั้น

3.1.2 คําสั่งเงื่อนไข if - else

คําสั่ง if-else จะเปนคําสั่งท่ีชวยในการจัดการเกี่ยวกับการเลือกมากขึ้น กลาวคือ เมื่อโปรแกรมตรวจสอบเงื่อนไขแลวพบวาเปนจริง คําสั่งท่ีอยูภายใน if จะถูกเรียกใหทํางาน แตหากเปนเท็จ คําสั่งท่ีอยูภายใน else จะถูกเรียกใหทํางาน ดังรูปที่ 3 เปน flowchart ของโครงสรางทางเลอืกแบบ if-else

Page 43: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

39

รูปที่ 3-3 Flowchart ของโครงสรางทางเลือกแบบ if-else

รูปแบบของโครงสรางทางเลอืกแบบ if-else

if(เงื่อนไขที่ตองการตรวจสอบ)

คําสั่งท่ี 1; else คําสั่งท่ี 2; ตัวอยางโคดการใชงาน if-else

01 class Score1 02 { 03 public static void main(String[] args) 04 { 05 int points= 44; 06 07 if (points>=50) 08 System.out.println("Pass exam......"); 09 10 else 11 System.out.println("Fail......"); 12 13 } 14 15 System.out.println("Bye bye....See you again next

semester"); 16 } 17 }

รูปที่ 3-4 ตัวอยางโคดการใชงาน else- if

ผลลัพธของโปรแกรม Fail...... Bye bye....See you again next semester

Page 44: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

40

บรรทัดท่ี 5 เปนการกําหนดคาของตัวแปร points ใหมีคาเปน 44 7 เปนการตรวจสอบคาของ points วามีคามากกวาหรอืเทากับ 50 หรอืไม

หากเปนจริงก็จะทําคําสั่งในบรรทัดท่ี 8 แตหากเปนเท็จก็จะเขามาทํางานในบรรทัดท่ี 11 ในที่นี้จะมีคาเปนเท็จ เพราะเนื่องจาก ตัวแปร points ใหมีคาเทากับ 44 ซึ่งนอยกวา 50 ดังนั้นโปรแกรมจะขามไปการทํางาน ไปยังคําสั่งท่ี 10 และ 11

8 พมิพขอความวา Pass exam…... ในกรณีท่ีเงื่อนไขของ if เปนจริง จากนั้นจึงขามมาทํางานที่บรรทัดท่ี 15

11 พิมพขอความวา Fail…... จากนั้นจึงขามมาทํางานที่บรรทัดท่ี 15 15 พิมพขอความวา Bye bye….See you again next semester

3.1.3 กลุมคําสั่ง(Block Statements)

เปนกลุมคําสั่งท่ีอยูภายใตคําสั่ง if-else สามารถมีไดมากกวา 1 คําสั่ง ซึ่งจะเรียกวา กลุมคําสั่งหรือ block statements ซึ่งกลุมคําสั่งเหลานี้จะตองอยูภายในเครื่องหมาย {….}

ตัวอยางโคดการใชงาน Block Statement

01 class TestBlock 02 { 03 public static void main(String[] args) 04 { 05 int points= 44; 06 07 if (points>=50){ 08 System.out.println("Pass exam......"); 09 System.out.println("Congratulations!"); 10 } 11 else{ 12 System.out.println("Fail......"); 13 System.out.println("Attempt again"); 14 15 } 16 17 System.out.println("Bye bye....See you again next

semester"); 18 } 19 }

รูปที่ 3-5 ตัวอยางโคดการใชงาน Block Statement

ผลลัพธของโปรแกรม Fail...... Attempt again Bye bye....See you again next semester

Page 45: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

41

จากโปรแกรมตัวอยางขางตนจะสังเกตวา คําสั่งท่ีอยูภายใตการทํางานของ if-else นั้นจะมีมากกวา 1 คําสั่งคือ ในบรรทัดท่ี 8-9 และ 12-13 ซึ่งอยูภายใตเครื่องหมาย { } หากไมทําการใสเครื่องหมาย { } ลงไปในบรรทัดท่ี 7 และ 10 เมื่อทําการคอมไพลโปรแกรมก็จะพบขอผิดพลาด เพราะคําสั่ง else จะ ตองอยูตอจากคําสั่ง if และถาหากไมใสเครื่องหมาย { } ในบรรทัดท่ี 11และ 15 โปรแกรมจะรับทราบวาภายใตคําสั่งของ else จะมีเพียง System.out.println("Fail......"); เพียงคําสั่งเดียว บรรทัดท่ี 7 เปนการตรวจสอบคาของ points วามีคามากกวาหรอืเทากับ 50 หรือไม

หากเปนจริงก็จะทําบล็อกคําสั่งในบรรทัดท่ี 8-9 แตหากเปนเท็จก็จะเขามาทํางานในบล็อกคําสั่งบรรทัดท่ี 12-13 จากตัวอยางขางตนตรวจสอบแลวพบวาเงื่อนไขเปนเท็จ ดังนั้นโปรแกรมจะขามไปทํางานที่ บรรทัดท่ี 12-13

8-9 พิมพขอความวา Pass exam…... เวนบรรทัด Congratulations! จากนั้นจึงขามมาทํางานที่บรรทัดท่ี 17

12-13 พิมพขอความวา Fail…... เวนบรรทัดแลวตามดวย Attempt again

จากนั้นจึงขามมาทํางานที่บรรทัดท่ี 17

17 พิมพขอความวา Bye bye….See you again next semester และขอความนี้ปรากฎทุกครั้งเมื่อโปรแกรมทํางาน เนื่องจาก คําสั่งนี้ไมอยูภายใตการทํางานของคําสั่งใด

3.1.4 รูปแบบของโครงสราง if – else if – else (Nested if)

รูปแบบคําสั่งดังกลาว จะเปนการซอนคําสั่ง if-else ไปเรื่อยๆ จะใชเมื่อตองการแกไขปญหาเมือ่เกิดเงื่อนไขหลายๆเงื่อนไข ข้ันตอนการทํางานคือ เมื่อโปรแกรมทําการตรวจสอบเงื่อนไขที่1 หากเงื่อนไขที่ 1 เปนจริง ก็จะทําคําสั่งของเงื่อนไขที่ 1 แตหากเงื่อนไขที่ 1 เปนเท็จ ก็จะไปตรวจสอบในเงื่อนไขที่ 2 หากเงื่อนไขที่ 2 เปนจริงก็จะทํางานในคําสั่งท่ี 2 แตถาหากเงื่อนไขที่ 2 เปนเท็จ โปรแกรมก็จะไปตรวจสอบเงือ่นไขที่ 3 ตอ และถัดไปเรื่อยๆ จนกระทั่งโปรแกรมไปพบ คําสั่งเปน else ไมมีif อีกแลว รูปที ่6 flowchart แสดงโครงสรางแบบทางเลือก nested if

Page 46: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

42

รูปที่ 3-6 Flowchart ของโครงสรางทางเลือกแบบ Nested- if

ตัวอยางโคดการใชงาน Nested if

01 import cs1.Keyboard; 02 class TestGrade 03 { 04 public static void main(String[] args) 05 { 06 System.out.print("Please Enter Your Score "); 07 int points = Keyboard.readInt(); 08 09 if (points>=80){ 10 System.out.println("Congratulations!"); 11 System.out.println("You get grade A"); 12 } 13 else if (points>=70) 14 System.out.println("You get grade B"); 15 else if (points>=60) 16 System.out.println("You get grade C"); 17 else if (points>=50) 18 System.out.println("You get grade D"); 19 else 20 System.out.println("Fail......"); 21 22 System.out.println("Bye bye....See you again next semester"); 23 } 24 }

รูปที่ 3-7 ตัวอยางโคดการใชงาน Nested- if

โปรแกรมดังกลาวจะตรวจสอบคาของคะแนนที่รับเขามาจากผูใช แลวมาตรวจสอบวา คะแนนดังกลาวอยูในระดับขั้นใด เชน หากผูใชปอนคะแนน 75 ก็จะตรวจสอบเงื่อนไขในบรรทัดท่ี 9

กอน ซึ่งในที่นี้จะเปนเท็จ ตอมาโปรแกรมกจ็ะขามไปทํางานในบรรทัดท่ี 13 ปรากฎวาเงือ่นไขเปน จริง ดังนั้นคําสั่งท่ี 14 System.out.println("You get grade B"); ก็จะถูกทํางาน และโปรแกรมก็จะขามมาทํางานที่คําสั่งบรรทัดท่ี 22

บรรทัดท่ี 7 เปนการรับคาเปน int จาก keyboard และทําการเก็บคาดังกลาวไวในตัวแปร int ท่ีช่ือ points

Page 47: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

43

9 เปนการตรวจสอบคาของ points วามีคามากกวาหรอืเทากับ 80 หรือไม หากเปนจริงก็จะทําบล็อกคําสั่งในบรรทัดท่ี 10-11 แตหากเปนเท็จก็ขามมาตรวจสอบคา points ตอในบรรทัดท่ี 13

10-11 เปนการพิมพขอความ Congratulation เวนบรรทัดแลวตามดวย You get grade A จากนั้นจึงขามมาทํางานในบรรทัดท่ี 22

13-14 เปนการตรวจสอบคาของ points วามีคามากกวาหรอืเทากับ 70 หรือไม หากเปนจริงก็จะทําคําสั่งในบรรทัดท่ี 14 ซึ่งจะพิมพขอความวา You get grade B จากนั้นจึงขามมาทํางานในบรรทัดท่ี 22 แตหากเปนเท็จก็ขามมาตรวจสอบคา points ตอในบรรทัดท่ี 15

15 เปนการตรวจสอบคาของ points วามีคามากกวาหรอืเทากับ 60 หรอืไม หากเปนจริงก็จะทําคําสั่งในบรรทัดท่ี 16 ซึ่งจะพิมพขอความวา You get

grade C จากนั้นจึงขามมาทํางานในบรรทัดท่ี 22 แตหากเปนเท็จก็ขามมาตรวจสอบคา points ตอในบรรทัดท่ี 17

17 เปนการตรวจสอบคาของ points วามีคามากกวาหรอืเทากับ 50 หรอืไม หากเปนจริงก็จะทําคําสั่งในบรรทัดท่ี 16 ซึ่งจะพิมพขอความวา You get

grade D จากนั้นจึงขามมาทํางานในบรรทัดท่ี 22 แตหากเปนเท็จก็เขามาทํางานในบรรทัดท่ี 19-20

19-20 เปนคําสั่ง else โดยหากคา points ไมตรงกับเงื่อนไขใดๆกอนหนาโปรแกรมก็จะทําการพิมพขอความในบรรทัดท่ี 20 วา Fail…..จากนั้นจึงขามมาทํางานในบรรทัดท่ี 22

22 พิมพขอความวา Bye bye....See you again next semester

ความรูเพ่ิมเติม

• การเปรียบเทียบ String

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

ตัวอยางการใชงานเมธอด compareTo และ equals

Page 48: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

44

01 String s1 = "abc" , s2 = "xyz" , s3 = "abc"; 02 if(s1.compareTo(s2) < 0) 03 System.out.println("s1 < s2"); 04 if(s1.compareTo(s3) == 0) 05 System.out.println("s1 == s3"); 06 if(s1.equals(s3)) 07 System.out.println("s1 equals s3");

รูปที่ 3-8 ตวัอยางโคดการใชเมธอด compareTo และ equals

เมธอด compareTo จะนําคา unicode ของสตรงิมาเปรียบเทียบ ซึ่งผลลัพธท่ีไดจะเปนจํานวนเต็ม นั่นคือจะดูระยะหางระหวางสตริงตามที่จัดเรียงตามพจนานุกรมวาตวัใดมากอนกัน โดยจะพิจารณาอักษรตัวแรกกอน หากตัวแรกเหมอืนกันก็จะดูตัวถัดไป แตหากทุกตัวเหมอืนกันผลลัพธก็จะเปน 0 ซึ่งจากตัวอยางขางตน เมื่อนํา s1 มาเปรียบเทียบกับ s2 จะพบวาใหคาออกมาเปนจาํนวนเต็มลบ เนื่องจากตัวอักษรใน s1 (a) มากอนใน s2 (x) จึงมีคานอยกวา s2 แตเมื่อนํา s1 มาเปรียบเทียบกับ s3 ปรากฎวาตวัอักษรทุกตัวเหมือนกันทุกตัวจงึมีคาเปน 0 เมธอด equals เปนเมธอดที่จะทําการเปรียบเทียบวาสตริงท้ังสองเทากันหรอืไม ซึ่งผลลัพธจะเปน true หรือ false โดย equals จะใหคาเปนจริงหรือเท็จ ก็ตอเมื่อสตริงท้ังสองเหมือนกัน

• การเปรียบเทียบจํานวนทศนิยม

การเปรียบเทียบจํานวนทศนิยมพวก float หรือ double นั้นสามารถเปรียบเทียบไดตามปกติเหมือนจํานวนเต็ม แตจะตองระมัดระวังในการเปรียบเทียบความเทากัน เชน 1.51 จะไมเทากับ 1.510000001 แตบางครั้งหากมีการคํานวณแลวไดคาท่ีแตกตางกันในชวงท่ียอมรับได เราอาจบอกวา 1.50 เทากับ 1.510000001 ดังนัน้จึงควรหลีกเลีย่งการใชเครื่องหมาย ==

3.1.5 คําสั่งเงื่อนไข switch-case เปนคําสั่งท่ีใชควบคุมใหโปรแกรมเลือกดําเนนิการไปในเสนทางใดเสนทางหนึ่ง(case) จากทางเลือกหลายๆทาง ซึ่งนิพจนท่ีอยูในคําสั่ง switch นั้นจะถูกทําการประมวลผลหรือถูกตรวจสอบวาตรงกับ case ใด โปรแกรมก็จะทํางานตามคําสั่งท่ีอยูใน case นั้นๆ

ขอควรระวัง คาท่ีใชในการตรวจสอบจะตองเปนจํานวนเต็มท่ีมีความสําคัญนอยกวา int ไดแก byte, short, int หรือตวัอักษร(char)

โครงสรางของทางเลือก switch-case

switch(นิพจนท่ีตองการตรวจสอบ){

case คาท่ี 1: คําสั่งท่ี 1;

case คาท่ี 2: คําสั่งท่ี 2;

case คาท่ี 3: คําสั่งท่ี 3; case }

Page 49: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

45

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

หากใชคําสั่งเงื่อนไข switch-case แลวตองการใหทํางานเฉพาะคําสั่งภายใน case นั้นๆเทานั้น จะสามารถทําไดโดยใชคําสั่ง break ซึ่งเปนคําสั่งสุดทายในแตละ case โดยเมื่อโปรแกรมทํางานถึงคําสั่ง break โปรแกรมจะออกจากคําสั่ง switch-case ทันที

switch(นิพจนท่ีตองการตรวจสอบ){

case คาท่ี 1: คําสั่งท่ี 1; break;

case คาท่ี 2: คําสั่งท่ี 2; break;

case คาท่ี 3: คําสั่งท่ี 3; break; case………………….break; } ตัวอยางการใชงานคําสั่ง switch-case โดยไมใชคําสั่ง break

Page 50: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

46

01 import cs1.Keyboard; 02 03 public class TestSwitch 04 { 05 public static void main (String[] args) 06 { 07 int grade; 08 09 System.out.print ("Enter a numeric grade (0 to 4): "); 10 grade = Keyboard.readInt(); 11 12 System.out.print ("That grade is "); 13 14 switch (grade) 15 { 16 case 4: 17 System.out.println ("A"); 18 System.out.println ("A perfect score.Well done."); 19 20 case 3: 21 System.out.println ("B"); 22 System.out.println ("Good."); 23 24 case 2: 25 System.out.println ("C"); 26 System.out.println ("Fair"); 27 28 case 1: 29 case 0: 30 System.out.println (grade +"......Fail"); 31 32 33 //default: 34 // System.out.println (grade +"..... Invalid"); 35 } 36 } 37 }

รูปที่ 3-9 ตวัอยางโคดการใชเมธอด switch-caseโดยไมใชคําสั่ง break

โปรแกรมดังกลาวจะใหผูใชทําการปอนคะแนนเขามา (เกรด 0-4) หากผูใชทําการปอน เลข 4 จะไดผลลัพธของโปรแกรมดังนี ้That grade is A A perfect score.Well done. B Good. C Fair 4 +"......Fail

จะเห็นวาทุกคําสั่งจะถูกพิมพออกมา และในทํานองเดียวกัน หากผูใชปอนเกรด 3 เขามา ผลลัพธของโปรแกรมจะเปนดังนี้ That grade is B Good. C

Page 51: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

47

Fair 4 +"......Fail

จะสังเกต เห็นวาคําสั่ง switch นั้นจะทําการตรวจสอบเงื่อนไขวา นิพจนท่ีรับเขามานั้น ตรงกับกรณีใด (case) ก็จะเขาไปทําคําสั่งนั้น และคําสั่งท่ีเหลือจากกรณีอื่นๆดวย

บรรทัดท่ี 14 เปนการกําหนดนิพจนท่ีจะใชในการตรวจสอบซึ่งก็คือคาของ grade

16 เปนกรณีท่ีคาของ grade เทากับ 4 ก็จะมีการพิมพขอความในบรรทัดท่ี 17,18,21,22,25,26 และ 30

20 เปนกรณีท่ีคาของ grade เทากับ 3 ก็จะมีการพิมพขอความในบรรทัดท่ี 21,22,25,26 และ 30

24 เปนกรณีท่ีคาของ grade เทากับ 2 ก็จะมีการพิมพขอความในบรรทัดท่ี 25,26 และ 30

28 เปนกรณีท่ีคาของ grade เทากัน 1 จะไมมีการเรียกคําสั่งใดๆ จากนั้นจึงเรียกคําสั่งพิมพบรรทัดท่ี30

29 เปนกรณีท่ีคาของ grade เทากัน 0 จะมีการเรยีกคําสั่งพิมพบรรทัดท่ี30 ดังนั้นหากตองการใหคําสั่ง switch ทํางานในกรณีใดแลว ออกจากกรณีนั้นทันที จะใชคําสั่ง break; เขามาชวย ตัวอยางการใชงานคําสั่ง switch-case โดยใชคําสั่ง break รวมดวย

Page 52: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

48

01 import cs1.Keyboard; 02 03 public class TestSwitch 04 { 05 public static void main (String[] args) 06 { 07 int grade; 08 09 System.out.print ("Enter a numeric grade (0 to 4): "); 10 grade = Keyboard.readInt(); 11 12 System.out.print ("That grade is "); 13 14 switch (grade) 15 { 16 case 4: 17 System.out.println ("A"); 18 System.out.println ("A perfect score. Well

done.");break; 19 20 case 3: 21 System.out.println ("B"); 22 System.out.println ("Good."); break; 23 24 case 2: 25 System.out.println ("C"); 26 System.out.println ("Fair"); break; 27 28 case 1: break; 29 case 0: 30 System.out.println (grade +"......Fail"); break; 31 32 33 //default: 34 // System.out.println (grade +"..... Invalid"); 35 } 36 } 37 }

รูปที่ 3-10 ตัวอยางโคดการใชเมธอด switch-caseโดยใชคําสั่ง break รวมดวย

จากโปรแกรมขางตน หากผูใชทําการปอนเกรด 4 จะไดผลลัพธ ดังนี้ That grade is A A perfect score.Well done.

หากผูใชทําการปอนเกรด 3 จะไดผลลัพธ ดังนี้ That grade is B Good

ผลลัพธท่ีไดจะไดตรงตามกรณีท่ีผูใชปอนเขาไปเทานั้น ท้ังนี้เปนเพราะการทํางานของคําสั่ง break;

บรรทัดท่ี 14 เปนการกําหนดนิพจนท่ีจะใชในการตรวจสอบกับคําสั่ง switch ซึ่งก็คือคาของ grade

Page 53: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

49

16 เปนกรณีท่ีคาของ grade เทากับ 4 ก็จะมีการพิมพขอความในบรรทัดท่ี 17,18

20 เปนกรณีท่ีคาของ grade เทากับ 3 ก็จะมีการพิมพขอความในบรรทัดท่ี 21,22

24 เปนกรณีท่ีคาของ grade เทากับ 2 ก็จะมีการพิมพขอความในบรรทัดท่ี 25,26

28 เปนกรณีท่ีคาของ grade เทากับ 1 จะมีการเรียกคําสั่งพิมพบรรทัดท่ี30

29 เปนกรณีท่ีคาของ grade เทากับ 0 จะมีการเรียกคําสั่งพิมพบรรทัดท่ี30 จากโปรแกรมในปรรทัดท่ี 28-30 นั้น เปนเทคนิคในการเขียนโปรแกรม เมื่อตองการใหผลลพัธท่ีเหมือนกัน ผูพฒันาไมจําเปนตองพิมพซ้ําซอน สามารถเขียนคําสั่งไดในลักษณะดังกลาว

การใชงานคําสั่ง switch-case นั้นหากโปรแกรมทําการตรวจสอบแลวพบวา นิพจนนั้นๆมีคาไมตรงกับ case ใดๆเลย โปรแกรมจะไมทํางานเลย หรือเราใหโปรแกรมเขาไปทํางานในคําสั่งหนึ่งๆ เมื่อผูใชปอนคาไมตรงกับกรณีใดเลย การท่ีจะใหโปรแกรมเขาไปทํางานในสวนนั้นได จะใชคําสั่ง default ซึ่งสามารถใสคําสั่งลงในกรณีนี้ได ดังนั้นจากโคดตัวอยางที่ 9 เราจะทําการลบ comment // ในบรรทัดท่ี 33 และ 34 ออก จากนั้นทําการคอมไพลและรันโปรแกรม หากผูใชปอนตัวเลข 5 ลงไป จะไดผลลัพธของโปรแกรมดังนี ้5 ..... Invalid

ซึ่งจะเห็นวา ตัวเลข 5 นั้น ไมตรงกับกรณีใดเลย ดังนั้นโปรแกรมจะเขาไปทํางานในบรรทัดท่ี 34

Page 54: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

50

ตัวอยางการใชงานคําสั่ง switch-case โดยเพิ่มกรณีท่ีเปน default

01 import cs1.Keyboard; 02 03 public class TestSwitch 04 { 05 public static void main (String[] args) 06 { 07 int grade; 08 09 System.out.print ("Enter a numeric grade (0 to 4): "); 10 grade = Keyboard.readInt(); 11 12 System.out.print ("That grade is "); 13 14 switch (grade) 15 { 16 case 4: 17 System.out.println ("A"); 18 System.out.println ("A perfect score. Well

done.");break; 19 20 case 3: 21 System.out.println ("B"); 22 System.out.println ("Good."); break; 23 24 case 2: 25 System.out.println ("C"); 26 System.out.println ("Fair"); break; 27 28 case 1: break; 29 case 0: 30 System.out.println (grade +"......Fail"); break; 31 32 33 default: 34 System.out.println (grade +"..... Invalid"); 35 } 36 } 37 }

รูปที่ 3-11 ตัวอยางโคดการใชเมธอด switch-caseโดยเพิ่มกรณีท่ีเปน default

บรรทัดท่ี 33-34 เปนกรณีท่ีหากคาของ grade ไมตรงกับ case ใดเลยโปรแกรมก็จะเลือก case ดังกลาว ซึ่งจะสั่งพิมพขอความในบรรทัดท่ี 34

3.1.6 ความรูเพิ่มเติมเก่ียวกับตัวดําเนินการทางตรรกะ(Logical Operators)

หากในการใชคําสั่งเงื่อนไขนั้นในแตละกรณีอาจมีเงื่อนไขมากกวา 1 อยางเกิดพรอมกัน ในนี้สามารถในตัวดําเนินการทางตรรกะมาใชงาน ซึ่งตัวดําเนินการนี้จะเปนการนินการเชิงเหตุและผล โดยจะใหผลลพัธเปนชนิด boolean นั่นคือ เปนคาจริง (true) หรือ คาเท็จ (false) เทานั้น โดยตัวดําเนินการพวกนี้ไดแก

Page 55: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

51

! นิเสธ (NOT) ตัวดําเนินการนี้จะตองการตัวถกูดําเนินการเพียงตัวเดียว ซึ่งผลลัพธท่ีไดจะเปนคาตรงขามกับคาทางตรรกะเดิม ดังตาราง

นิพจน a !a

true false false true

รูปที่ 3-12 ตารางการใชงานตวัดําเนินการนิเสธ

&& และ (AND) ตัวดําเนินการนี้จะมีคาเปนจริงเพียงกรณีเดียวคือ คาท้ังสองของนิพจนเปนจริง

|| หรือ (OR) ตัวดําเนินการนี้จะมีคาเปนเท็จเพียงกรณีเดียวคือ คาท้ังสองของนิพจนเปน

เท็จ ดังตาราง

a b a&&b a||b true true true true true false false true false true false true false false false false

รูปที่ 3-13 ตารางการใชตัวดําเนนิการ และ-หรอื

3.2 โครงสรางแบบทําซ้ํา

โครงสรางแบบทําซ้ําจะเปนการสั่งใหโปรแกรมทํางานอยางใดอยางหนึ่งซ้ําๆกันตามจํานวนรอบที่เราตองการหรอืตามเงื่อนไขที่กําหนด การวนรอบนี้บางครั้งกรียกวา การวน loop ซึ่งกลุมคําสั่งในการทําซ้ํานี้ไดแก while loop และ for loop

3.2.1 คําสั่งการทําซ้ํา while

รูปแบบของ while คือ

while (เงื่อนไข)

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

Page 56: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

52

รูปที่ 3-14 Flowchart ของโครงสรางทําซ้ําแบบ while

ตัวอยางโคดการใชงานคําสั่งทําซ้ํา while(1)

01 public class Star 02 { 03 04 public static void main (String[] args) 05 { 06 final int LIMIT = 5; 07 int count = 1; 08 09 while (count <= LIMIT) 10 { 11 System.out.println ("* "+count); 12 count = count + 1; 13 } 14 } 15 }

รูปที่ 3-15 ตัวอยางโคดการใชงานคําสั่งทําซ้ํา while

ผลลัพธของโปรแกรม * 1 * 2 * 3 * 4 * 5 บรรทัดท่ี 6 เปนการกําหนดใหตัวแปร LIMIT มีคาเทากับ 6 และเปนตัวแปรแบบคาคงที่ไม

สามารถเปลี่ยนแปลงคาได 7 เปนการกําหนดใหตัวแปร count มีคาเทากับ 1 เปนการกําหนดคาเริ่มตนใหกับการ

วน loop

9 เปนการตรวจสอบคาวา count <= LIMIT หรือไมโดยหากเงื่อนไขเปนจริง โปรแกรมก็จะทํางานตอใน block ท่ีบรรทัด 11-12 แตหากเงื่อนไขเปนเท็จ

Page 57: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

53

โปรแกรมก็จะหยุดการทํางาน ซึ่งจากตัวอยางขั้นตน เริ่มแรก count จะมีคาเปน 1

ซึ่งเปนจริง ดังนั้นโปรแกรมจะทํางานในบรรทัดท่ี 11-12

11-12 เปนการพิมพขอความในบรรทัดท่ี 11 จากนั้นแกไขคาของ count ใหมีคาเพิ่มข้ึน โดยหากไมมีการอัพเดทคา count การวนซ้ําก็จะไมมีท่ีสิ้นสุด

ตัวอยางโคดการใชงานคําสั่งทําซ้ํา while(2)

01 import cs1.Keyboard; 02 03 public class Average 04 { 05 public static void main (String[] args) 06 { 07 int sum = 0, value, count = 0; 08 double average; 09 10 System.out.print ("Enter an integer (0 to quit): "); 11 value = Keyboard.readInt(); 12 13 while (value != 0) 14 { 15 count++; 16 17 sum += value; 18 System.out.println ("The sum is " + sum); 19 20 System.out.print ("Enter an integer (0 to quit): "); 21 value = Keyboard.readInt(); 22 } 23 24 System.out.println (); 25 System.out.println ("Number of values entered: " +

count); 26 27 average = (double)sum / count; 28 29 System.out.println ("The average is " + average); 30 } 31 }

รูปที่ 3-16 ตัวอยางโคดการใชงานคําสั่งทําซ้ํา while(2)

บรรทัดท่ี 11 เปนการรับคาจาก keyboard เปนคาชนิด int แลวเก็บคานั้นไวในตัวแปร value 13 เปนการตรวจสอบคาวา value ไมเทากับ 0 จริงหรือไม หากเปนจริงจะมีการทํางาน

คําสั่งบล็อกในบรรทัดท่ี 15-21 แตหากเปนเท็จโปรแกรมจะขามมาทํางานที่บรรทัด 24-29

15-21 บรรทัดท่ี 15 เปนการนับจํานวนครั้งของการวนซ้ําโดยเก็บคาไวในตัวแปร count บรรทัดท่ี 21เปนการรับคาใหมจาก keyboard มาเก็บไวในตัวแปร value 27 เปนการหาคาเฉลี่ยของคาท้ังหมด โดยคํานวณจากการนําผลรวมของคาท้ังหมดซึ่ง

เก็บเอาไวในตัวแปร sum หารดวย จํานวนครั้งในการวนซ้ํา จากนั้นนําผลลัพธมา

Page 58: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

54

ทําการคาสติ้งเพื่อทําใหเปนขอมูลชนิด double แลวจงึนําไปเก็บไวในตัวแปร average

ในการเขียนโปรแกรมนั้น จะตองทําการตรวจสอบเงือ่นไขของการทําซ้ําในดี เพราะหากเงื่อนไขเปนจริงตลอด ไมเปนเท็จเลย จะสงผลใหโปรแกรมทํางานไมหยุด ดังตัวอยางดานลาง จะสังเกตุเห็นวา ตัวแปร count นั้นจะไมมีโอกาสที่จะมีคามากกวา 25 เลย จึงทําใหโปรแกรมถูกทํางานตลอด

ตัวอยางโคดการใชงานคําสั่งทําซ้ํา while(3)

01 public class Forever 02 { 03 public static void main (String[] args) 04 { 05 int count = 1; 06 07 while (count <= 25) 08 { 09 System.out.println (count); 10 count = count - 1; 11 } 12 13 System.out.println ("Done"); 14 } 15 }

รูปที่ 3-17 ตัวอยางโคดการใชงานคําสั่งทําซ้ํา while(3)

บรรทัดท่ี 7 เปนการตรวจสอบคาของ count วามีคานอยกวาหรอืเทากับ 25 หรอืไม หากเปนจริงก็จะทํางานคําสั่งภายในบล็อกบรรทัดท่ี 9-10 หากเปนเท็จโปรแกรมก็จะขามไปทํางานบรรทัดท่ี 13

9-10 เปนการแสดงคา count และบรรทัดท่ี 10 จะเปนการอัพเดทคา count ขอสังเกต คาเริ่มตนของ count มีคาเทากับ 1 เงื่อนไขการตรวจสอบคือ count นอยกวาหรอื

เทากับ 25 หรอืไม แตการอัพเดทคา count เปนการลดคาของ count ทําใหการทําซ้ําจะไมมีท่ีสิ้นสุด

3.2.2 การซอนกันของการวนรอบ (nested loops)

ในการทํางานของการซอน loop นั้น โปรแกรมจะทํางานใน loop ภายในสุดกอน โดยจะทําการตรวจสอบเงื่อนไขและทําตามคําสั่งท่ีกําหนดจนกวาเงื่อนไขจะเปนเท็จจึงจะทํางานที่ loop ภายนอก

Page 59: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

55

ตัวอยางโคด nested loops

01 class TestLoop 02 { 03 public static void main(String[] args) 04 { 05 int i=1; 06 while (i<=3) 07 { 08 System.out.println("Outer Loop "+i); 09 int j=1; 10 while (j<=i) 11 { 12 System.out.println("Inner Loop "+j); 13 j++; 14 } 15 System.out.println(); 16 i++; 17 } 18 19 } 20 }

รูปที่ 3-18 ตัวอยางโคดการใชงาน nested loops

ผลลัพธของโปรแกรม

Outer Loop 1 Inner Loop 1

Outer Loop 2 Inner Loop 1 Inner Loop 2

Outer Loop 3 Inner Loop 1 Inner Loop 2 Inner Loop 3

บรรทัดท่ี 6 เปนการตรวจสอบคาของ i วามีคานอยกวาหรือเทากับ 3 หรือไม หากเปนจริงก็จะ

ทํางานในบล็อกคําสั่งบรรทัดท่ี 8-16

10-16 เปนการใชงาน nested loop ซึ่งจะเปนการตรวจสอบคาของ j วามีคานอยกวาหรือเทากับ i หรือไม หากเปนจริงก็จะทําการพิมพคําสั่งบรรทัดท่ี 12 กอนจะอพัเดทคา j ในบรรทัดท่ี 13 แลวจึงวนขึ้นไปตรวจสอบคา j อีกครั้งในบรรทัดท่ี 10

Page 60: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

56

แตหากการตรวจสอบคาของ j ใหผลเปนเท็จโปรแกรมจะขามมาพิมพคําสั่งบรรทัดท่ี 15 กอนจะอัพเดทคา i ในบรรทัดท่ี 16 กอนวนขึ้นไปตรวจสอบคา i ใหมในบรรทัดท่ี 6

สรุปการใชงาน while loop จะมี 2 แบบคือ

แบบที่ 1 : loop ท่ีมีตัวนับมาควบคุมการวน loop

แบบที่ 2 : loop ท่ีมีการใชคาอื่นมาเปนตัวกําหนดการหยดุ

3.2.3 คําสั่งการทําซ้ํา for

รูปแบบของ for loop คือ

for(การกําหนดคาเริ่มตนตัวแปร ; เงื่อนไข ; ปรับคาตัวแปร)

คําสั่ง;

การทํางานของ for จะคลายกับการทํางานของ loop while คือ มีการกําหนดคาเริ่มตน มีการตรวจสอบเงื่อนไขและการปรับคาตัวแปร แตในขั้นตอนการกําหนดคาเริ่มตนตัวแปรนั้นจะทําเพียงครั้งเดียวเทานั้น คือ ตอนเริ่มตนประกาศตัวแปร สวนการตรวจสอบเงื่อนไข การปรับคาตัวแปรและการทําคําสั่งใน loop for นั้นจะทําไปเรื่อยๆ หากเงื่อนไขยังคงเปนจริงอยู แตถาเงื่อนไขนั้นเปนเท็จก็จะไมมีการปรับคาตัวแปร และจะหยุดการทํางานคําสั่งภายใน loop for ซึ่งสามารถเขียน Flow chart แสดงการทํางานไดดังนี้

รูปที่ 3-19 Flowchar tแสดงการทํางานของคําสั่งการวนซ้ํา for

Page 61: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

57

ตัวอยางโคดการใชงานคําสั่งการวนซ้ํา for

01 public class Star1 02 { 03 04 public static void main (String[] args) 05 { 06 final int LIMIT = 5; 07 for (int count = 1;count <= LIMIT;count = count + 1) 08 System.out.println ("* "+count); 09 } 10 }

รูปที่ 20 โคดแสดงการใชงานคําสั่งวนซ้ํา for

ผลลัพธของโปรแกรม * 1 * 2 * 3 * 4 * 5 ลําดับการทํางาน

ข้ันที่ 1 กําหนดคาเริ่มตนใหแกตัวแปร count (คําสั่งแรกในบรรทัดท่ี 7) ข้ันที่ 2 ทําการตรวจสอบคาตัวแปร count (คําสั่งท่ีสองในบรรทัดท่ี 7) หากเปนจริงจะ

คําสั่งในขั้นท่ี 3 หากเปนเท็จก็จบโปรแกรม ข้ันที่ 3 ทําการพิมพคําสั่งในบรรทัดท่ี 8

ข้ันที่ 4 ทําการอัพเดทคาของตัวแปร count (คําสั่งท่ีสองในบรรทัดท่ี 7) กอนจะยอนกลับไปทํางานในขั้นตอนที่ 2 อีกครั้ง

การเปรียบเทียบโครงสรางของ for loop กับ while loop

for loop for(การกําหนดคาเริ่มตนตัวแปร ; เงื่อนไข ; ปรับคาตัวแปร)

คําสั่ง; while loop กําหนดคาเริ่มตนใหตัวแปร;

while(เงื่อนไข) { คําสั่ง; ปรับคาตัวแปร; }

จะเห็นวา for loop จะมีความเปนระเบียบ ดูงายและเปนโคดท่ีเขียนขึ้นสั้นๆ สวน while loop นั้นโคดท่ีเขียนจะยาวมากกวา แตท้ัง for loop และ while loop ตางก็มีหลักการทํางานที่เทียบเทากัน

Page 62: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

58

ดังนั้น หากตองการเขียนโคดท่ีมีตัวนับการทําซ้ําและรูจํานวนรอบที่ชัดเจนควรใช for loop จะดีกวา แตหากไมใชตัวนับ ก็ควรใช while loop จะดูเหมาะสมกวาการใช for loop

สรุปทายบทที่ 3

ในบทที่ 3 นี้เปนการเรียนรูเกี่ยวกับโครงสรางควบคุม ซึ่งจะเปนการกําหนดเสนทางการทํางานของโปรแกรมใหเปนไปตามทิศทางที่ตองการ โดยมีคําสั่งท่ีใชในการควบคุม 2 ประเภท คือ โครงสรางแบบทางเลือก ซึ่งมีคําสั่งใหใชคือ if, if-else และ switch case สวนโครงสรางแบบที่สอง คือ โครงสรางแบบทําซ้ํา for และ while ซึ่งจากโครงสรางการทํางานที่ไดศึกษาของแตละคําสั่งนั้นจะทําใหเราสามารถสรางโปรแกรมและสั่งใหโปรแกรมทํางานไปในทางที่เราตองการได แตเราตองรูจักเลอืกใชคําสั่งเหลานี้ จึงจะทําใหเราควบคุมการทํางานของโปรแกรมไดเปนอยางด ี

Page 63: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

59

คําถามทายบทที่ 3

1. จงเขียนโปรแกรมรับตัวเลข 2 จํานวน จากนั้นมาทําการเปรียบวาคาใดมีคามากกวากัน พรอมแสดงผลลัพธออกทางหนาจอ ดังตัวอยาง

Enter number 1 : 30 Enter number 2 : 50 50 is greater than 30

หมายเหตุ ตัวเลขหนา เปนคาท่ีผูใชทําการปอนเขามา

2. จงเติมโคดดานลางใหสมบูรณ เมื่อตองการเขยีนโปรแกรมคาํนวณหาพื้นที่ของสามเหลี่ยม โดยทําการรับคาความยาวฐาน และ สวนสูงจากผูใช ซึ่งเปนเลขทศนิยม ท้ังนี้ใหทําการตรวจสอบดวยวาหากคาความยาวฐาน และ สวนสูงท่ีผูใชปอนเขามามีคานอยกวา 1 ใหแสดงขอความวาไมสามารถคํานวณได

01 import cs1.Keyboard; 02 public class DivideNumber { 03 public static void main(String []args) { 04 double base,height; 05 System.out.print("Enter base: "); 06 base = Keyboard.readDouble(); 07 System.out.print("Enter height: "); 08 height = Keyboard.readDouble(); 09 10 if (________________) 11 //Add your code here 12 //... 13 } 14 }

3. จงเขียนโปรแกรมโดยใชคําสั่ง switch case และ break รับคาจากผูใชระหวาง 1 ระหวาง 7 เขามา

จากนั้นใหแสดงชื่อวันวาเปนวันอะไร ตัวอยางเชน Date = ? 1 1 : Sunday

หากผูใชทําการปอนคาท่ีนอกเหนือจากเลข 1 -7 แลวใหทําการแสดงขอความวาไดทําการปอนตัวเลขผิด โดยกําหนดให 1 เปนวันอาทิตย, 2 เปนวันจันทร,...,7 เปนวันเสาร

4. จากโปรแกรมที่กําหนดให เมื่อทําการรันแลวจะพบวาloop จะมีการวนไมรูจบ จงแกโปรแกรมและหา

ผลลัพธของโปรแกรม

Page 64: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

60

01 public class TestWhile { 02 public static void main(String []args) { 03 int i= 20; 04 while (i>=0) 05 System.out.print(" " + i); 06 i = i-5; 07 } 08 }

5. จงเขียนโปรแกรมรับคามาจากผูใช 1 จํานวน จากนั้นใหแสดงขอความ Java ใหเทากับจํานวนครั้งท่ี

ผูใชปอนเขามา พรอมกับมีการเวนวรรค ดังตัวอยาง Enter number: 4 Java Java Java Java

6. จากคําถามขอ 4 จงแปลงคําสั่ง while loop ใหเปนคําสั่ง for loop โดยทีผ่ลลัพธของโปรแกรมยังคง

เหมือนเดิม 7. จงเขียนโปรแกรมแสดงตัวอักษร A-Z 8. จากขอ 7 ใหแสดงผลบรรทัดละ 7 ตัวอักษร 9. จงเขียนโปรแกรมแสดงสูตรคูณแม 6 โดยใหผลลัพธดังนี ้

6*1 = 6 6*2 = 12 6*3 = 18 6*4 = 24 6*5 = 30 6*6 = 36 6*7 = 42 6*8 = 48 6*9 = 54 6*10 = 60 6*11 = 66 6*12 = 72

10. จงเขียนโปรแกรมใหวนรอบทั้งหมด 10 รอบ โดยแตละครั้งใหแสดงคาตัวเลขออกมา 1-10 แตเมื่อนับจนถึง 5 ใหแสดงผลลัพธเปน Five แทนที่จะเปนเลข 5 1 2 3 4 Five 6 7 8 9 10

11. เขียนโปรแกรมนับเลขที่ตั้งแต 1- 100 โดยที่เมื่อตัวเลขใดหารดวย 5 ลงตัว ก็ใหแสดงตัวเลขดังกลาวออกมา

Page 65: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

61

12. จงเขียนโปรแกรมใหแสดงรูปดังตอไปนี้ * ** *** **** *****

Page 66: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

62

บทที่ 4 การเขียนคลาส

บทที่ การเขียนคลาสการเขียนคลาส 44

หัวขอศึกษา การประกาศคลาส การประกาศเมธอด

ตัวแปรอางอิง การหอหุม

การโอเวอรโหลดเมธอด

ออบเจ็คทางดานกราฟฟก

จากความรูท่ีไดศึกษาเกี่ยวกับการเขียนและการควบคุมทิศทางของโปรแกรม, การประกาศและการใชตัวแปร รวมไปถึงการเรียกใชงานเมธอดของคลาสในบทที่ 1 ถึง 3 แลว ในบทนี้จะเปนการกลาวถึงการสรางคลาสขึ้นมาใชงานตามความตองการของผูพัฒนาซึ่งจะไมมีในไลบรารี่ของจาวา นอกจากนี้ยังไดเรียนรูเกี่ยวกับออบเจ็คและตัวแปรอางอิงอยางละเอียดมากขึ้น อีกทั้งยังกลาวถึงแนวความคิดท่ีเกี่ยวกับการหอหุม(encapsulation) เรื่องของการโอเวอรโหลดเมธอดและการใชออบเจ็คเกี่ยวกับทางดานกราฟฟก

4.1 ออบเจ็ค(Object)

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

• สถานะ จะใชอธิบายคุณสมบัติของออบเจ็ค

• พฤติกรรม จะแสดงถึงสิ่งท่ีออบเจ็คสามารถทําได ตัวอยางเชน เหรียญบาทจะมี 2 หนาคือ หนาหัวและหนากอย โดยเหรียญบาทจะสามารถพลิกกลับไปกลับมาได จะเห็นวาเหรียญบาทมีสถานะคือ หนาท่ีออก โดยมีพฤตกิรรมคือ การพลิกกลับไปกลับมา ดังนั้นพฤติกรรมของเหรียญอาจมีผลตอสถานะของมันเอง ดังแสดงในรูปท่ี 4-1

ออบเจ็ค “เหรียญบาท”

สถานะ หัว , กอย พฤติกรรม (method) การพลิกกลับไปกลับมา

รูปที่ 4-1 ตวัอยางองคประกอบของออบเจ็ค

Page 67: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

63

4.2 คลาส(Class)

เนื่องจากคลาสคือ ตนแบบหรือเปรียบเสมือนแผนพิมพเขียวของออบเจ็ค ดังนั้นกอนที่จะทําการสรางออบเจ็ค เราจะตองทําการสรางคลาสเสียกอน ตัวอยางเชน หากเราจะทําการสรางออบเจ็คของสตริงหรือขอความ เราก็จะตองมีคลาสสตริง(String) เสียกอน แตเนื่องจากคลาสสตริงจะเปนคลาสท่ีมีใหแลวจากไลบรารีมาตรฐานของจาวา ดังนั้นเราก็ไมตองสรางคลาสเอง และเราก็สามารถสรางออบเจ็คไดเลยจากคําสั่ง new โดยแตละสตริงสามารถบรรจุตัวอักษรไดจํานวนหนึ่ง ซึ่งคุณสมบัติดังกลาวก็เปรียบเสมือน สถานะของสตริง และคลาสสตริงยังมีเมธอด length() ซึ่งเปนเมธอดที่ใชสําหรับหาความยาวของขอความ สิ่งดังกลาวก็คือบริการหรือพฤติกรรมของออบเจ็คนั่นเอง นอกจากคลาสในไลบรารีมาตรฐานแลวผูพัฒนายังสามารถสรางคลาสสําหรับใชงานเองได โดยคลาสจะประกอบดวย สวนของการประกาศตัวแปรเก็บขอมูลและการประกาศเมธอดดังแสดงในรูปท่ี 4-2 ซึ่งแตละออบเจ็คจะมีสถานะซึ่งเปนตัวแปรเปนองคประกอบของแตละออบเจ็คเลย และเมธอดของคลาสก็คือพฤติกรรมของออบเจ็คนั่นเอง

รูปที่ 4-2 สวนประกอบของคลาส

4.2.1 ขอบเขตของตัวแปร

จากที่ทราบในเบื้องตนแลววา คลาสจะมีสวนประกอบอยูดวยกัน 2 สวนคือ สถานะหรือตัวแปรและพฤติกรรมหรือเมธอด ดังนั้นกอนที่เราจะทําการสรางคลาสดวยตนเอง เราจึงศึกษารายละเอียดของแตละสวนประกอบกันกอน ซึ่งในสวนประกอบแรกคือ ขอบเขตของตัวแปร หมายถึง พื้นที่ภายในโปรแกรมหนึ่งท่ีสามารถใชงานหรืออางองิถึงตวัแปรได โดยขอบเขตของตัวแปรมีหลักเกณฑ ดังนี้

• หากตัวแปรถูกประกาศขึ้นภายในคลาส จะสามารถถูกใชงานได จากทุกๆเมธอดของคลาสนั้น

Page 68: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

64

• หากตัวแปรถูกประกาศขึ้นเฉพาะภายในเมธอดใดเมธอดหนึ่ง ตัวแปรดังกลาวก็จะถูกใชงานไดเพียงภายในเมธอดนั้นเทานั้น เมธอดอื่นๆจะไมสามารถเรียกใชงานได ซึ่งจะเรียกตัวแปรประเภทนี้วา ตัวแปรทองถิ่น(local variable)

4.2.2 การเขียนเมธอด สวนประกอบสวนที่สองของคลาสก็คือเมธอด การท่ีเราจะสามารถเรียกใชงานเมธอดไดนั้น เราก็จะตองทําการสรางเมธอดขึ้นมาเสียกอ โดยเมธอดหนึ่งๆนั้นจะประกอบดวย 2 สวนคือ สวนหัวและสวนตัว ซึ่งสวนหัวจะเปนรายละเอียดเบื้องตนของเมธอดซึ่งจะประกอบดวยหลายสวนเชนช่ือของเมธอด, พารามิเตอร เปนตน สวนตัวนั้นจะประกอบดวยคําสั่ง(statement)หรือชุดคําสั่ง ซึ่งแสดงใหเห็นวาเมธอดสามารถทําอะไรไดบาง ชุดคําสั่งเหลานี้จะยังไมทํางานไดจนกวาเมธอดถูกเรียกใช ในการเขียนโปรแกรมบางครั้งผูพัฒนาจะตองทําการเรียกใชเมธอดหลายๆครั้ง ดังนั้นเราจึงควรศึกษาหลักการไหลของโปรแกรมเมื่อมีการเรยีกใชงานเมธอด นั่นคือเมื่อโปรแกรมเริ่มทํางานเมธอดท่ีถูกเรียกใชก็จะทํางาน โดยจะทําตามคําสั่งท่ีระบุไวภายในเมธอดนั้น เชนหากมีการเริม่ทํางานที่เมธอด main แลวมีการเรยีกใชงานเมธอดอื่น โปรแกรมก็จะกระโดดไปทํางานตามคําสั่งท่ีอยูภายในเมธอดนัน้จนเสร็จสิ้นแลวจึงกระโดดกลับมายังจุดเดิมและทําตามคําสั่งท่ีอยูในเมธอด main

ตอไป ซึ่งการเรียกใชเมธอดตางๆนั้นในการทํางานอาจมีผลลัพธเกิดข้ึนหรอืไมมีก็ได ข้ึนอยูกับการนิยามเมธอดนัน้ๆ

4.2.3 การไหลของเมธอด การเรียกใชงานเมธอดนั้น หากเปนการเรียกใชงานที่เกิดภายในคลาสเดียวกัน จะเรียกโดยใชช่ือเพียงอยางเดียว(ไมตองมีการใชเครื่องหมายจุด . ) ดังแสดงในรูปที่ 4-3

รูปที่ 4-3 การเรยีกใชงานที่เกิดภายในคลาสเดยีวกัน

จากรูปจะเห็นวา สมมติคลาสมี 2 เมธอด คือ compute และ myMethod โดยภายในเมธอด compute นั้น หากมีความตองการที่จะเรียกใชงานเมธอด myMethod ก็จะสามารถเรียกไดเลย โดย

Page 69: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

65

ผานชื่อของเมธอดเทานั้น ตอมาโปรแกรมจะไปทํางานในสวนของเมธอด myMethod จนเสรจ็ แลวจึงกลับมายงัเมธอด compute เพื่อทํางานตอไป สังเกตการไหลผานหวัลูกศร หากเปนการเรียกใชงานเมธอดซึ่งอยูตางคลาสกันนั้น จะตองมีการเรียกใชผานเครื่องหมาย . หากเปนการเรียกใชงานเมธอดของออบเจ็ค หนาจุดนั้นจะเปนตัวแปรอางอิง แตหากเปนการเรียกใชงานเมธอดของคลาส หนาจุดก็จะเปนช่ือคลาส

รูปที่ 4-4 การเรยีกใชงานที่เมธอดซึ่งอยูคลาสตางกัน

จากรูปที่ 4-4 จะเห็นวาโปรแกรมมีการใชงานคลาส 2 คลาส(สังเกตไดจากกรอบสีฟา 2 กรอบ) โดยข้ันแรกโปรแกรมจะเริ่มทํางานที่เมธอด main ซึ่งในเมธอด main จะมีการเรียกใชงานเมธอด doIt

ซึ่งอยูอีกคลาสหนึ่ง จึงตองใชงานเรียกผานออบเจ็คของคลาส (ในที่นี้ใหช่ือของตัวแปรอางอิงวา obj) และเมื่อโปรแกรมกระโดดไปทํางานที่เมธอด doIt ก็จะพบวามีการเรียกใชงานเมธอด helpMe

ซึ่งเมธอด helpMe นี้ เปนเมธอดที่อยูในคลาสเดียวกัน จึงไมตองเรียกผานออบเจ็ค เมื่อทํางานในสวนของเมธอด helpMe เสร็จสิ้นแลว โปรแกรมก็จะกลับมายังสวนของเมธอด doIt และทํางานตามคําสั่งภายในเมธอด doIt จนเสร็จสิ้นแลวจึงกลับมาทํางานที่เมธอด main ตอไป

4.2.4 ตัวอยางของการสรางคลาส เมื่อไดเรียนรูการสรางเมธอดและขอบเขตของตัวแปรซึ่งเปนสวนประกอบคลาสและออบเจ็คไปแลวนั้น ในหัวขอศึกษานี้จึงเปนหัวขอของการสรางคลาส ซึ่งในที่นี้จะสรางคลาสที่มีช่ือวาคลาส Coin (คลาสเหรียญ) และ คลาส CountFlips

ในตัวอยางนี้เราจะเขียนโปรแกรมเพื่อใหเกิดการจําลองการพลิกของเหรยีญ(เหมือนกับที่เราเคยเลนโดยหวั-กอย) วาหากทําการพลิกเหรียญเปนจาํนวน 1,000 ครั้ง จะเกิดหนาเหรียญที่เปนหัวกี่ครั้ง และหนาเหรียญที่เปนกอยกี่ครั้ง ดังนั้น จึงไดมีการสรางคลาสขึ้นมา 2 คลาส คือ

• คลาส Coin (คลาสเหรียญ) คลาสนี้จะเปนคลาสที่เปนตนแบบใหกับออบเจ็ค ซึ่งจะมีสวนประกอบตางๆเชน สถานะหนาเหรียญ, พฤติกรรมการพลิกเหรียญ เปนตน

• คลาส CountFlips สําหรับคลาสนี้จะเปนคลาสที่ทําการสรางออบเจ็คจากคลาส Coin

ข้ึนมา แลวทําพลิกเหรียญจํานวน 1,000 ครั้ง สําหรับรายละเอียดของ คลาส Coin มีดังนี ้

Page 70: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

66

เนื่องจาก คลาส Coin จะเปนคลาสที่ประกอบไปดวยหนาของเหรียญ นัน่คือ หัว หรือ กอย และมีพฤติกรรมในการพลิกเหรียญได (ซึ่งองคประกอบดังกลาว ก็เปนองคประกอบโดยทั่วไปของเหรียญอยูแลว) เราจะนําองคประกอบของเหรียญมาเขียนเปนโปรแกรมไดดังนี้ คลาส Coin จะประกอบดวยตัวแปรดังตอไปนี้

• face เปนตัวแปรที่เก็บเลขจํานวนเต็ม (0 หรือ 1) ท่ีใชแสดงหนาท่ีออกเหรียญในปจจุบัน เราจะใชเลข 0 กับ 1แทน หัว กับ กอย

• HEADS และ TAILS เปนคาคงที่ โดย HEADS(หัว) = 0 , TAILS(กอย) = 1

คลาส Coin จะประกอบดวยเมธอดดังตอไปนี้ • เมธอด Coin จะเปนคอนสตรัคเตอร ทําหนาท่ีในการกําหนดคาเริ่มตนใหกับออบเจ็ค

• เมธอด flip จะจําลองการพลิกของเหรียญโดยจะมีการสุมวาจะออกหัวหรือกอย

• เมธอด getFace จะใหผลลัพธเปนหนาปจจุบันของเหรียญ

• เมธอด toString จะใหผลลัพธเปนคําอธิบายสถานะปจจุบันของเหรียญ

หมายเหตุ สําหรับ เมธอด Coin จะเปนเมธอด ท่ีมีช่ือเดียวกับคลาส เราจะเรียกเมธอด ท่ีมีช่ือเหมือนกับคลาสวา คอนสตรัคเตอร(constructor) ซึ่งในรายละเอียดของ คอนสตรัคเตอร จะกลาวถึงในทายบท คลาส Coin ท่ีถูกนิยามขึ้นนั้นจะสามารถถูกเรียกใชงานจากคลาสอื่นๆได ในที่นี้เราจะใหคลาส CountFlips ทําการเรียกใชงาน โดยโปรแกรมหนึ่งๆไมจําเปนตองเรียกใชงานเมธอดทั้งหมดของคลาส Coin แตจะสามารถเรียกใชงานเฉพาะเมธอดที่จําเปนเทานั้น ซึ่งเมธอดทุกเมธอดของคลาส Coin นั้นเปนเมธอดของออบเจ็ค ซึ่งการใชงานตองเรียกผานตัวแปรอางอิง จากนิยามดานบน เราสามารถนํานิยามดังกลาวมาเขียนเปนโคดไดดังรูปท่ี 4-5

01 //************************************************************ 02 // Coin.java Author: Lewis/Loftus 03 // 04 // Represents a coin with two sides that can be flipped. 05 //************************************************************ 06 import java.util.Random; 07 08 public class Coin 09 { 10 public static final int HEADS = 0; 11 public static final int TAILS = 1; 12 private int face; 13 //--------------------------------------------------------- 14 // Sets up the coin by flipping it initially. 15 //--------------------------------------------------------- 16 public Coin () 17 { 18 flip(); 19 }

รูปที่ 4-5 โคดของคลาส Coin.java

Page 71: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

67

20 //--------------------------------------------------------- 21 // Flips the coin by randomly choosing a face value. 22 //--------------------------------------------------------- 23 public void flip () 24 { 25 face = (int) (Math.random() * 2); 26 } 27 28 //--------------------------------------------------------- 29 // Returns the current face of the coin as a string. 30 //--------------------------------------------------------- 31 public String toString() 32 { 33 String faceName; 34 35 if (face == HEADS) 36 faceName = "Heads"; 37 else 38 faceName = "Tails"; 39 40 return faceName; 41 } 42 43 //------------------------- 44 public int getFace(){ 45 return face; 46 } 47 }

รูปที่ 4-5 โคดของคลาส Coin.java (ตอ)

บรรทัดท่ี 11-12 เปนการประกาศคาคงที่ ท่ีมีช่ือวา HEADS , TAILS

13 เปนการประกาศตัวแปรที่มีช่ือวา face เปนตัวแปรที่ไวคอยเก็บสถานะของเหรียญ (หวัหรอืกอย)

18-21 เปนคอนสตรัคเตอรของคลาส Coin ซึ่งภายในมีการเรียกใชงานเมธอดที่ช่ือวา flip การเรียกใชงานเมธอด flip นี้จะเปนเหมือนการกําหนดคาเริ่มตนใหกับออบเจ็ค สังเกตเห็นวาเวลาเรยีกใชเมธอด flip นั้นเราสามารถเรียกใชงานไดเลยไมตองผานตัวแปรอางอิงและเครื่องหมาย .

26-29 เปนการสรางเมธอด flip ซึ่งภายในเมธอด จะมีการใชเมธอด random()

จากคลาส Math จึงทําใหตองมีการประกาศการนําเขาในบรรทัดท่ี 7 สาเหตุท่ีมีการสุมนั้นเพราะเราไมสามารถทราบแนนอนวาการโยนเหรียญในแตละครั้งจะออกหวัหรอืกอย และเนื่องจากเมธอด random() จะใหคาตั้งแต 0 จนถึง 0.999… แตไมถึงหนึ่ง เราจงึตองทําการคูณ 2 เพื่อใหคาตั้งแต 0 ถึง 1.9999 และบังคับใหเปนตัวเลขจํานวนเต็มโดยการคาสติ้ง แลวนําคาไปใหแกตัวแปร face ซึ่งเปนตัวแปรที่เรากําหนดขึ้นเพื่อทําการเก็บหนาเหรียญ

Page 72: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

68

33-44 เปนการเรียกใชงานเมธอด toString ซึ่งภายในจะมีการตรวจสอบสถานะวาเปนHeads หรือ Tails แลวจึงสงคาออกมาเปนผลลัพธสตริงท่ีเปนหนาเหรียญกลับมา

47-48 เปนเมธอด getFace จะใหผลลัพธเปนหนาปจจุบันของเหรียญ (face)

กลับมา เนื่องจาก ตัวแปร face ถูกประกาศใหเปนแบบ private ดังนั้นคลาสอื่นๆจะไมสามารถเขาถึงตัวแปร face ได และหากเขาถึงตัวแปร face ไมไดเราก็จะไมมีทางทราบไดวาเหรียญของเราเปนหัวหรือกอย จึงตองมีการสรางเมธอด getFace ข้ึนเพื่อใหไดคาของ face ออกมา สําหรับเหตุผลท่ีประกาศตัวแปร face ใหเปนแบบ private นั้นจะไดกลาวถึงในลําดับถัดไป

หลังจากที่ไดทําการสราง คลาส Coin เปนที่เรียบรอยแลว ในลําดับตอไปก็จะเปนการสรางคลาส CountFlips เพื่อทําวนรอบเปนจํานวน 1,000 ครั้ง และจะนับวาจะในการพลิกเหรียญ 1,000 ครั้งนี้ จะเกิดหนาท่ีเปนหัวและกอยอยางละกี่ครั้ง ดังนั้นสําหรับคลาสนี้ก็จะประกอบดวยสวนของการสรางออบเจ็คของคลาส Coin , สวนของการวนรอบ 1,000 ครั้ง และสวนของการแสดงผล วาไดจํานวนหัวและกอยกี่ครั้ง สวนของโปรแกรมแสดงในรูปท่ี 4-6

01 //************************************************************ 02 // CountFlips.java Author: Lewis/Loftus 03 // 04 // Demonstrates the use of a programmer-defined class. 05 //************************************************************ 06 07 public class CountFlips 08 { 09 //--------------------------------------------------------- 10 // Flips a coin multiple times and counts the number of

heads 11 // and tails that result. 12 //--------------------------------------------------------- 13 14 public static void main (String[] args) 15 { 16 final int NUM_FLIPS = 1000; 17 int heads = 0, tails = 0; 18 19 Coin myCoin = new Coin(); //instantiate the Coin object

รูปที่ 4-6โคดของคลาส CountFlips.java

Page 73: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

69

20 for (int count=1; count <= NUM_FLIPS; count++) 21 { 22 myCoin.flip(); 23 24 if (myCoin.getFace() == Coin.HEADS) 25 heads++; 26 else 27 tails++; 28 } 29 30 System.out.println ("The number flips: " + NUM_FLIPS); 31 System.out.println ("The number of heads: " + heads); 32 System.out.println ("The number of tails: " + tails); 33 } 34 }

รูปที่ 4-6โคดของคลาส CountFlips.java (ตอ)

บรรทัดท่ี 7 เปนเมธอด main ซึ่งใชในการรันโปรแกรม ซึ่งจะมีการเรียกใชงานเมธอดและตัวแปรจากคลาส Coin.java ดวย

16 เปนการประกาศ NUM_FLIPS ใหเปนคาคงที่มีเทากับ 1000 เพื่อใหชในการวนรอบ

17 เปนการประกาศตัวแปร heads และ tails เพื่อใชในการนับและเก็บคาวาเกิดหัวหรือกอยเปนจํานวนกี่ครั้ง โดยกําหนดคาเริ่มตนที่ 0 เพราะยังไมมีการโยนหรือพลิกเหรียญขึ้น

19 เปนการสรางออบเจ็คจากคลาสของ Coin โดยใหช่ือวา myCoin

21-29 เปนการเรียกใชเมธอดflip สําหรับสุมสถานะของเหรียญ โดยมีการใชงานการทําซ้ํา for เปนจํานวนทั้งหมด 1000 ครั้ง โดยแตละรอบจะทําการเปรียบเทียบวาหนาหรียญที่ไดจากเมธอด getFace() นั้นเปนหัวหรอืกอย โดยใหจะมีการเก็บจํานวนครั้งท่ีเปนหัวท่ีตัวแปร heads และกอยท่ีตัวแปรtails

31-33 เปนการเรียกแสดงผลลัพธท้ังหมดของการพลิกเหรียญจํานวน 1,000 ครั้ง วาออกหัวและกอยเปนจําวนกี่ครั้ง

4.2.5 ตัวแปรของออบเจ็ค

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

ถูกสรางขึ้น ตัวแปร face ตัวใหมก็จะถูกสรางขึ้นเชนเดียวกัน ซึ่งตัวแปร face ท่ีถูกสรางขึ้นในแตละออบเจ็คนั้นจะเปนอิสระตอกันโดยมีการแยกเนื้อท่ีสําหรับการเก็บขอมูล แตจะมีการนิยามเมธอดรวมกัน ดังตัวอยางที่จะกลาวถึงคือคลาส FlipRace.java รูปที่ 4-7 คลาสดังกลาวจะเปนการแขงขันกันวา ระหวางการโยนเหรียญของคน 2 คนนั้นใครที่ไดหนาหัวติดกัน 3 ครั้งกอนจะเปนผูชนะ จาก

Page 74: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

70

การแขงขันดังกลาวจะเห็นวาจะตองมีการสรางออบเจ็คของคลาส Coin กันอีกครั้งและครั้งนี้ก็จะทําการสรางเปน 2 ออบเจ็ค เพราะเปนการแขงขันกัน 2 ผูเลน และสังเกตเห็นวา ตัวแปร face ท่ีเก็บหนาเหรียญของออบเจ็คแตละตัวจะเปนคนละตัวกันนั้น 01 //*********************************************************** 02 // FlipRace.java Author: Lewis/Loftus 03 //************************************************************ 04 05 public class FlipRace 06 { 07 public static void main (String[] args) 08 { 09 final int GOAL = 3; 10 int count1 = 0, count2 = 0; 11 12 // Create two separate coin objects 13 Coin coin1 = new Coin(); 14 Coin coin2 = new Coin(); 15 16 while (count1 < GOAL && count2 < GOAL) 17 { 18 coin1.flip(); 19 coin2.flip(); 20 21 // Print the flip results (uses Coin's toString method) 22 System.out.print ("Coin 1: " + coin1); 23 System.out.println (" Coin 2: " + coin2); 24 25 // Increment or reset the counters 26 if (coin1.getFace()==Coin.HEADS) 27 count1=count1+1; 28 else count1=0; 29 30 if (coin2.getFace()==Coin.HEADS) 31 count2=count2+1; 32 else count2=0; 33 } 34 35 // Determine the winner 36 if (count1 < GOAL) 37 System.out.println ("Coin 2 Wins!"); 38 else 39 if (count2 < GOAL) 40 System.out.println ("Coin 1 Wins!"); 41 else 42 System.out.println ("It's a TIE!"); 43 } 44 }

รูปที่ 4-7โคดของคลาส FlipRace.java

คลาส FlipRace.java มีการเรียกใชงานคลาส Coin.java

บรรทัดท่ี 9 เปนการประกาศคาคงที่ GOAL ใหมีคาเปน 3 เนื่องจากตองการเปรียบเทียบวาผูเลนคนใดไดหนาหัวติดกัน 3 ครั้ง

Page 75: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

71

10 เปนการประกาศตัวแปร count1 และ count2 เพื่อเปนตัวนับใหกับผูเลนหรือออบ เจ็ความีคาเปน 3 หรือไม

13-14 สรางออบเจ็คจากคลาส Coin โดยใหช่ือออบเจ็ควา coin1 และ coin2

เปรียบเสมือนกับผูเลนคนที่ 1 และ 2

16-19 เปนการใชงานคําสั่งทําซ้ํา while จะเปนการตรวจสอบจํานวนของ count1 และ count2 วานอยกวาคาในตัวแปร GOAL หรือไม ซึ่งจะเปนการตรวจสอบวามีไดหนาเหรียญหัวติดกัน 3 ครั้งหรือไม หากยังไมครบก็จะทําการสุมหนาเหรียญโดยผานเมธอด flip หากเปนเท็จ จะมีการออกจากloop และเรียกใชงานคําสั่งในบรรทัดท่ี 36 จะเห็นวาในคําสั่งท่ี 18-19 นั้นเปนการเรียกเมธอด flip ผานตัวแปรอางอิง coin1 และ coin2 เพราะเมธอด flip นั้นอยูกันคนละคลาสกัน และหนาเหรียญที่เกิดข้ึนใน coin1 และ coin2 นั้นจะถูกเก็บอยูในตัวแปร face ของตัวแปรแตละตัวเชนกัน

22-23 เปนการแสดงผลลัพธท่ีไดจากพลิกหนาเหรียญของแตละออบเจ็ค

26-28 เปนการตรวจสอบสถานะในแตละครั้งวาออบเจ็ค coin1 ไดรับหนาเหรียญหัวหรือไม โดยการที่ทราบวาไดหนาเหรียญอะไรจะเรียกผานเมธอดที่ ช่ือวา getFace()แลวทําการเปรียบเทียบวาใชหนาหัวหรือไม ถาใชก็ใหตัวแปร count1

เปนตัวนับไปเรื่อยๆแตหากเปนกอยก็จะมีการเริ่มนับจํานวนครั้งใหมอีกครั้งโดยเริ่มจาก 0

30-33 เปนการตรวจสอบสถานะในแตละครั้งของออบเจ็ค coin2 เชนเดียวกับของ coin1

36-42 เปนการตรวจสอบวาของ count1 วามีคานอยกวาคาของ GOALหรือไม หากเปนจริงแสดงวา coin2 เปนผูชนะ จึงใหแสดงขอความวา Coin 2 Wins แตถาหากผลการเปรียบเทียบเปนเท็จ แสดงวา coin1เปผูชนะ จึงใหแสดงขอความวา Coin1

Wins หากการตรวจสอบไมตรงกับเงื่อนไขขางตน โปรแกรมจะเขาทํางานในคําสั่ง else ซึ่งจะใหผลเปน It ‘s a TIE นั่นคือเสมอกัน

4.3 การหอหุม(Encapsulation)

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

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

Page 76: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

72

ออบเจ็คอื่นๆในโปรแกรม ซึง่การมองออบเจ็คจากภายนอกนี้ ออบเจ็คจะมีการซอนรายละเอียดไวทําใหเรามองเห็นเพียงรูปแบบการติดตอกับออบเจ็คเทานั้น(interface)

เมื่อออบเจ็คมีการปองกันแลวออบเจ็คก็จะตองดูแลตนเอง โดยการเปลี่ยนสถานะของออบเจ็คควรทําโดยเมธอดของออบเจ็คเทานั้น ดังภาพจะเปนการอธิบายเกี่ยวกับการหอหุม ดังในรูปที่ 4-8

รูปที่ 4-8 การหอหุมของขอมูล

จากรูปที่ 4-8 จะเห็นวาออบเจ็คท่ีมีการหอหุมเปรียบไดกับกลองดํา ซึ่งการทํางานภายในจะถูกซอนจากผูขอใชบริการ ซึ่งเรียกวาเปนเมธอดที่ออบเจ็คเตรียมไวให(interface methods)

4.4 ตัวปรับปรุงการมองเห็น

เมื่อเราตองการทําใหออบเจ็คเปนไปตามหลักการของการหอหุม กลาวคือ หากเราตองการจะปองกันคลาสของเรา โดยอนญุาตใหภายนอกเห็นหรอืใชบริการไดเฉพาะที่เราตองการเทานั้น เราก็ทําได โดยการใชตัวปรับปรุงการมองเห็น ซึง่ตัวปรับปรุงท่ีเราไดทําความรูจักมาแลวคือ final ซึ่งเปนตัวปรับปรุงท่ีทําใหตัวแปรเปนคาคงที่ แตสําหรับหัวขอนี้จะกลาวถึงตัวปรับปรงุการมองเห็น ซึ่งมี 2 ตัวคือ public และ private และตัวปรับปรุง(modifier) ทุกตัวจะเปนคําสงวน

• public จะสามารถเขาถึงไดจากทุกแหง • private จะสามารถเขาถึงไดจากภายในคลาสเทานั้น

• ไมระบุ จะสามารถเขาถึงไดจากคลาสที่อยูในแพกเกจเดียวกนัเทานั้น

4.4.1 หลักการเลือกตัวปรับปรุงการมองเห็น • public สําหรับเมธอดที่มีไวสําหรับบริการท่ัวไปหรือเปนเมธอดที่ถูกเรียกใชจากภายนอก

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

หมายเหตุ ตัวปรับปรุงการมองเห็นนี้สามารถใชไดกับตัวแปรและเมธอด ข้ึนอยูกับความเหมาะสม

Page 77: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

73

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

เมธอดจะประกอบดวย 2 สวน คือ สวนหัว(head) และสวนตัว(body) ในการประกาศเมธอดนั้นจะเริ่มตนดวยหวัของเมธอดรูปที่ 4-9 แลวตามดวยสวนตวัดังตัวอยาง รูปท่ี 4-10

รูปที่ 4-9 การประกาศเมธอด

จากรูปที่ 4-9 เปนการประกาศสวนหวัของเมธอด สวนหวัของเมธอดนัน้เปนการบงบอกคุณสมบัติท่ัวไปของเมธอดวามลีักษณะโดยรวมเปนอยางไร จากตัวอยางดานบนจะเห็นวา เมธอดสวนหวัจะประกอบไปดวย 3

สวนหลักๆ คือ

• ชนิดของผลลัพธเมื่อมีการเรยีกใชเมธอดดังกลาว นั่นหมายความวาเมื่อเราทําการเรยีกใชงานเมธอดนี้และเมื่อเมธอดทํางานหรอืประมวลผลเสร็จสิ้นแลว สุดทายเมธอดจะใหผลลัพธเปน char

• ช่ือของเมธอด ซึ่งในที่นี้มีช่ือวา calc

• พารามิเตอร ซึ่งจะอยูเปนสวนสุดทายของสวนหัวเมธอด จะมีหรอืไมมีก็ได ซึ่งจากตัวอยาง calc นี้ จะมีอยูดวยกัน 3 พารามิเตอรซึ่งไดแก num 1 ,num 2 ซึ่งเปนจํานวนเต็ม และ message เปนสตริง

หากเราตองการจะนิยามใหเมธอดใดๆทํางานอะไรบางนั้น เราจะตองทําการกําหนดที่สวนตวัของเมธอดดังรูปที่ 4-10 สาํหรับเมธอด calc นี้จะนําพารามิเตอร num 1 และ num 2 มาบวกกันแลวนําคามาเก็บท่ีตัวแปร sum สําหรับพารามิเตอร message นั้นมาเปนตัวแปรอางองิเรยีกเมธอด charat() ใชงาน และสงผลresult กลับมา เหลานี้คือหนาท่ีหรือพฤติกรรมของเมธอด calc จะสังเกตเหน็วาสิ่งท่ีสงกลบัมาภายใตคําสั่ง return นั้นชนิดของผลลัพธจะเปนชนิดเดียวกันกับที่ไดประกาศไวบนสวนหวั (char) ท้ังนี้ยังมีตัวแปรที่ไดถกูประกาศไวในเมธอด calc คือ result , num 1 ,num 2และ message เหลานี้ถอืวาเปนตัวแปรทองถิน่ทั้งสิ้น

รูปที่ 4-10 เมธอด calc

Page 78: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

74

4.5.1 คําสั่ง return

ผลลัพธของเมธอดจะถูกกําหนดไวในหัวของเมธอด เชน char calc(int num1, int num2, String message); นั่นคือ ผลลัพธของเมธอด calc จะใหผลลัพธเปนขอมูลชนิด char หรือเปนตัวอักษรนั้นเอง หากเมธอดใดไมมีการคืนผลลัพธ จะกําหนดเปน void ตรงตําแหนง char เชน void sayHello(String name) เมธอดประเภทที่ไมมีการคืนผลลัพธนี้จะไมสามารถนําไปใชงานรวมกับตัวดําเนินการใดๆหรือเปนพารามิเตอรของเมธอดอื่นได แตหากมีการคืนคาผลลัพธนั้นจะไปสัมพันธกับคําสั่ง return โดยคําสั่ง return จะตามดวยนิพจน ท่ีมีชนิดตรงกันกับที่กําหนดไวท่ีหัวของเมธอดถาไมมีการคืนผลลัพธหลังคําสั่ง return ก็ไมมีนิพจนตามหลัง เมื่อการทํางานของโปรแกรมมาถึงคําสั่ง return จะถือวาเปนการจบการทํางานของเมธอดทันที แมวาโปรแกรมจะทํางานไปไมถึงบรรทัดสุดทายก็ตาม

4.5.2 พารามิเตอร จากรูปที่ 4-10 มีการนิยามหนาท่ีของพารามิเตอรไว หากมีการเรียกใชงานเมธอดนั้นจะตองมีการสงผานพารามิเตอรซึ่งเปนนิพจนชนิดเดียวกันกับที่กําหนดไวในหัวของเมธอด ซึ่งคาของพารามิเตอรจะถูกสําเนาไปยังตัวแปรทองถิ่นที่กําหนดไวไนหัวของเมธอด ตัวอยางเชน ch = obj.calc(25, count, “Hello”); //เรียกใชงานเมธอด char calc(int num1, int num2, String message) { int sum = num1 + num2; char result = message.charAt(sum); return result; } จากตัวอยางจะเห็นวาเมธอด calc จะรับคาพารามิเตอร 3 ตัว คือ num1, num2 เปนตัวแปรชนิด จํานวนเต็ม และ message เปนตัวแปรอางอิงชนิด String ซึ่งการเรียกใชงานเมธอด calc จากตัวอยางนี้จะเรียกใชงานผานออบเจ็คโดยจะสงพารามิเตอรไป 3 ตัวคือ 25, count และ “Hello” จะเห็นไดวาคาท่ีสงไปนั้นจะมีลําดับและชนิดของพารามิเตอรท่ีตรงกันกับที่สวนหัวของเมธอด calc

ดังนั้น num1 จะมีคาเปน 25 และ num2 จะมีคาเทากับคาของ count และ message ก็จะสําเนาคําวา Hello มาเพื่อเปนคาเริ่มตนเมื่อตัวแปรเหลานี้ถูกประกาศขึ้น ขอควรจํา ตัวแปร num1, num2 และ message จะถูกสรางขึ้นเมื่อเมธอด calc ถูกเรียกใชงานเทานั้น

Page 79: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

75

4.5.3 คอนสตรัคเตอร คอนสตรัคเตอรเปนเมธอดพิเศษที่จะใชรวมกัน new ในการสรางออบเจ็ค โดยคอนสตรัคเตอรจะมีคุณสมบัติดังตอไปนี้

• ช่ือของเมธอดจะมีช่ือเดียวกันกับชื่อคลาส

• จะไมมีการคืนผลลัพธกลับ ดังนั้นหนาของเมธอดจึงไมตองระบุชนิดของการคืนผลลัพธ และไมตองใส void

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

4.6 การเขียนคลาส

ในหัวขอนี้จะเปนการนําความรูจากในบทกอนๆ นําใชในการเขียนคลาสโดยละเอียด ตั้งแตการสรางออบเจ็ค การสรางเมธอด การไหลของเมธอด การสงพารามิเตอรตางๆไปกับเมธอด สําหรับในหัวขอนี้ จะมีการสงออบเจ็คไปกับเมธอดดวย ขอควรระวังคือ ออบเจ็คจะไมสามารถมีสมาชิกเปนออบเจ็คชนิดเดียวกันได แตสามารถทํางานสัมพันธกันได เชน r3 = r1.add(r2); นั่นคือ r1, r2 และ r3 เปนออบเจ็คชนิดเดียวกัน เมธอด add ของ r1 ถูกเรียกใชโดยมีพารามิเตอรคือ r2 ซึ่งเปนออบเจ็คชนิดเดียวกัน และจะเก็บผลลัพธของการทํางานไวท่ี r3

ตัวอยางโคดเพื่อความเขาใจคือ Account.java และ Banking.java

คลาสAccount: จะคลาสตนแบบที่จะทําหนาท่ีในการฝาก-ถอนเงิน, รวมเงิน,คิดดอกเบี้ย เปนตน ดังนั้น คลาสAccount จะประกอบดวยตัวแปร (คุณสมบัติ) และ เมธอด(พฤติกรรม) ดังนี ้

ตัวแปร

• ช่ือ acctNumber ไวคอยเกบ็คาหมายเลขบัญชีของผูฝาก โดยกําหนดใหเปนชนิด long • ช่ือ balance ไวคอยเก็บคาเงินคงเหลือในบัญชี โดยกําหนดใหเปนชนิด double • ช่ือ name ไวคอยเก็บชื่อของผูฝาก โดยกาํหนดใหเปนชนิด String เมธอด

• Account เปนคอนสตรัคเตอร ไวคอยกําหนดคาเริ่มตนใหกับออบเจ็ค

• deposit เปนเมธอดสําหรับการฝาก โดยจะรับพารามิเตอรช่ือ amount เปนตัวแปรชนิดdouble ไวคอยรับจํานวนเงินที่ตองการฝากและใหผลลัพธเปนdouble

• withdraw เปนเมธอดสําหรับการถอน โดยจะรับพารามิเตอร 2 ตัวช่ือ amount และ

fee เปนตัวแปรชนิด double ไวคอยรับจาํนวนเงินที่ตองการจะถอนและคาธรรมเนียม • addInterest)เปนเมธอดที่ไวคอยบวกดอกเบี้ยใหกับผูฝากและคืนคาเปนชนิด double

Page 80: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

76

• getBalance()เปนเมธอดที่ใชสําหรับเรียกดูยอดเงินคงเหลือ • getAccountNumber() เปนเมธอดที่ใชสําหรับเรียกดหูมายเลขบัญชี • String toString() เปนเมธอดที่ใชแสดงรายละเอยีดของผูฝาก • merge เปนเมธอดสําหรับรวมบัญชีท้ังนี้พารามิเตอรท่ีไดรับจะเปนตัวแปรอางอิงของคลาส

Account ท่ีมีช่ือวา another และตัวแปรพื้นฐาน fee เปนชนิด double

ตัวอยางโปรแกรมถูกแสดงในรูปที่ 4-11

01 //************************************************************ 02 // Account.java Author: Lewis/Loftus 03 //************************************************************ 04 05 import java.text.NumberFormat; 06 07 public class Account 08 { 09 private NumberFormat fmt= NumberFormat.getCurrencyInstance(); 10 11 private final double RATE = 0.035; //interest rate of 3.5% 12 13 private long acctNumber; 14 private double balance; 15 private String name; 16 17 //--------------------------------------------------------- 18 //Sets up the account by defining its owner,account number, 19 //and initial balance. 20 //--------------------------------------------------------- 21 22 public Account (String owner, long account, double initial) 23 { 24 name = owner; 25 acctNumber = account; 26 balance = initial; 27 } 28 29 //--------------------------------------------------------- 30 // Validates the transaction, then deposits the specified 31 // amount into the account. Returns the new balance. 32 //--------------------------------------------------------- 33 public double deposit (double amount) 34 { 35 if (amount < 0) // deposit value is negative 36 { 37 System.out.println (); 38 System.out.println("Error: Deposit amount is invalid."); 39 System.out.println(acctNumber+" "+ fmt.format(amount)); 40 } 41 else 42 balance = balance + amount; 43 44 return balance; 45 }

รูปที่ 4-11 โคดไฟล Acount.java

Page 81: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

77

46 //--------------------------------------------------------- 47 // Validates the transaction,then withdraws the specified 48 // amount from the account. Returns the new balance. 49 //--------------------------------------------------------- 50 public double withdraw (double amount, double fee) 51 { 52 amount += fee; 53 54 if (amount < 0) // withdraw value is negative 55 { 56 System.out.println (); 57 System.out.println("Error: Withdraw amount is invalid."); 58 System.out.println ("Account: " + acctNumber); 59 System.out.println ("Requested: "+ fmt.format(amount)); 60 } 61 else 62 if (amount > balance) //withdraw value exceeds balance 63 { 64 System.out.println (); 65 System.out.println ("Error: Insufficient funds."); 66 System.out.println ("Account: " + acctNumber); 67 System.out.println ("Requested: "+fmt.format(amount)); 68 System.out.println ("Available: "+fmt.format(balance)); 69 } 70 else 71 balance = balance - amount; 72 73 return balance; 74 } 75 76 //--------------------------------------------------------- 77 // Adds interest to the account and returns the new balance. 78 //--------------------------------------------------------- 79 public double addInterest () 80 { 81 balance += (balance * RATE); 82 return balance; 83 } 84 85 //--------------------------------------------------------- 86 // Returns the current balance of the account. 87 //--------------------------------------------------------- 88 public double getBalance () 89 { 90 return balance; 91 } 92 93 //--------------------------------------------------------- 94 // Returns the account number. 95 //--------------------------------------------------------- 96 public long getAccountNumber () 97 { 98 return acctNumber; 99 }

รูปที่ 4-11 โคดไฟล Acount.java (ตอ)

Page 82: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

78

100 //--------------------------------------------------------- 101 // Returns a one-line description of the account as a string. 102 //--------------------------------------------------------- 103 public String toString () 104 { 105 return (acctNumber+ "\t"+name+"\t" + fmt.format(balance)); 106 } 107 108 public void merge(Account another, double fee){ 109 double amount = another.getBalance() - fee; 110 another.withdraw(amount, fee); 111 deposit(amount); 112 113 another.withdraw(another.getBalance(), 0.0); 114 deposit(amount - fee); 115 }

รูปที่ 4-11 โคดไฟล Acount.java (ตอ)

บรรทัดท่ี 13-15 เปนการประกาศตัวแปร long โดยใหช่ือวา acctNumber ,ตัวแปร double โดยใหช่ือวา balance,ตัวแปร String โดยใหช่ือวา name

โดยประกาศใหตัวแปรทั้งสามเปน private เพื่อปองกันการแกคาจากภายนอกคลาส

บรรทัดท่ี 22-27 เปนคอนสตรัคเตอรของคลาส Account ซึ่งรบัพารามิเตอรมาเปน owner

account และ initial ซึ่งจะทําหนาท่ี

กําหนดคาของ name = owner บรรทัดท่ี 24

กําหนดคาของ acctNumber = account บรรทัดท่ี 25

กําหนดคาของ balace = initial บรรทัดท่ี 26

บรรทัดท่ี 33-45 เปนการสรางเมธอด deposit เพื่อใชสําหรับฝากเงิน โดยมีการรับพารามิเตอรเปนจํานวนเงินที่ตองการฝาก(amount) ท้ังนี้เมธอดจะมีการตรวจสอบคาจํานวนเงินที่รับเขามาดวยวามีคานอยกวา 0 หรือไม หากนอยกวา 0 ก็จะแสดงขอความบอกวาไมถูกตอง แตหากเปนเท็จก็จะมาทํางาน การกําหนดคาให balance = balance + amount ซึ่งก็คือการยอดสะสมเดิมกับจํานวนเงินที่ฝาก จากนั้นเก็บคาดังกลาวไวในยอดสะสม

บรรทัดท่ี 51-75 เปนเมธอดที่ใชสําหรับการถอนเงินโดยมีการรับพารามิเตอรเขามาเปน จํานวนเงินที่ตองการถอน(amount) และคาธรรมเนียมในการถอน(fee)

เมธอดจะมี การตรวจสอบวาคา amount มีคานอยกวา 0 หรือไม หากเปนจริงก็จะมีการแจงเตือนดวยคําสั่งในบรรทัดท่ี 57-60 แตหากเปนเท็จก็จะมีการเรียกใชงานคําสั่งในบรรทัดท่ี 63 เปนตรวจสอบคาของ amount >

balance หรือไม หากเปนจริงก็จะมีการแจงเตือนดวยขอความวามีการถอนเงินมากกวาเงินคงเหลือ แตถาหากเงินที่ตองการจะถอนมีคานอยกวา

Page 83: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

79

เงินคงเหลือ ก็จะทําการลบ amount ออกจากคา balance เดิม แลวทําการสงผลลัพธออกมาเปนคา balance

บรรทัดท่ี 80-84 เมธอด addInterest เปนเมธอดที่ใชสําหรับบวกเงินดอกเบี้ยใหแกบวก balance แลวทําการสงผลลัพธออกมาเปนคา balance

บรรทัดท่ี 89-92 เมธอด getBalance เปนเมธอดที่ใชในการเรียกดูคาของ balanceเปนการสงผลลัพธออกมาเปนคาของ balance

บรรทัดท่ี97-100 เมธอด getAccountNumber เปนเมธอดที่ใชในการเรียกดูหมายเลขบัญชี(getAccountNumber)แลวทําการสงผลลพัธออกมาเปนคาหมายเลขบัญชี(acctNumber)

บรรทัดท่ี 105-108 เมธอด toString เปนเมธอดที่ใชสําหรับ เรียกรายละเอียดของหมายเลขบัญชีนั้นๆ(acctNumber), ช่ือ(name) และยอดเงินสะสม(balance)

ออกมาเปนขอมูลชนิด String

บรรทัดท่ี 110-117 เมธอด merge เปนเมธอดที่ใชในการรวมบัญชีโดยจะรับพารามิเตอรเปนบัญชีท่ีตองการถอน(another) และคาธรรมเนียม(fee)

บรรทัดท่ี111 เปนการประกาศตัวแปรชนิด double โดยใหช่ือวา amount เพื่อทําการเก็บจํานวนเงินจากบัญชีท่ีตองการถอนลบดวยคาธรรมเนียม

บรรทัดท่ี 112 เปนการสั่งถอนเงินโดยเมธอด withdraw ผานทางออบเจ็ค another โดยมี amount และ fee เปนพารามิเตอร

บรรทัดท่ี 114 เปนการเรียกใชงานเมธอด deposit เพื่อใชในการฝากเงิน โดยมีการสงพารามิเตอรเปน amount (***ซึง่เปนคาท่ีถูกหักคาธรรมเนียมแลวในบรรทัดท่ี111)

บรรทัดท่ี 115 เปนการถอนเงนิจากบัญชีของ another โดยมคีาธรรมเนียม(fee) เปน 0

บรรทัดท่ี 116 เปนการฝากเงินเขาบัญชีท่ีเปนเจาของออบเจ็คโดยมีพารามเิตอรเปน

amount ลบดวย fee

ตอมาจะเปนตัวอยางโปรแกรมของคลาส Banking ซึ่งเก็บในไฟลช่ือ Banking.java จะเปนคลาสท่ีทําการสรางออบเจ็คจากคลาส Account จะสังเกตเห็นวา ออบเจ็คทุกออบเจ็คจะไดรับคุณสมบัติท้ังหมดที่มีอยูในคลาส Account มาทั้งหมด รูปที่ 4-12

Page 84: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

80

01 //************************************************************ 02 // Banking.java Author: Lewis/Loftus 03 // 04 // Driver to exercise the use of multiple Account objects. 05 //************************************************************ 06 07 public class Banking 08 { 09 //--------------------------------------------------------- 10 // Creates some bank accounts and requests various services. 11 //--------------------------------------------------------- 12 public static void main (String[] args) 13 { 14 Account acct1 = new Account ("Ted Murphy", 72354, 102.56); 15 Account acct2 = new Account ("Jane Smith", 69713, 40.00); 16 Account acct3 = new Account ("Edward Demsey", 93757, 759.32); 17 18 acct1.deposit (25.85); 19 20 double smithBalance = acct2.deposit (500.00); 21 System.out.println ("Smith balance after deposit: " + 22 smithBalance); 23 24 System.out.println ("Smith balance after withdrawal: " + 25 acct2.withdraw (430.75, 1.50)); 26 27 acct3.withdraw (800.00, 0.0); // exceeds balance 28 29 acct1.addInterest(); 30 acct2.addInterest(); 31 acct3.addInterest(); 32 33 System.out.println (); 34 System.out.println (acct1); 35 System.out.println (acct2); 36 System.out.println (acct3); 37 38 acct1.merge(acct2, 1.0); 39 System.out.println("-----after merging------"); 40 System.out.println (acct1); 41 System.out.println (acct2); 42 } 43 }

รูปที่ 4-12 โคดไฟล Banking.java

บรรทัดท่ี 14-16 เปนการสรางออบเจ็คAccount โดยใหช่ือวา acct1, acc2, acc3 ซึ่งมีการสงพารามิเตอรเปนชื่อเจาของบัญชี หมายเลขบัญชี และจํานวนเงิน

บรรทัดท่ี 18 เปนการเรียกใชเมธอดเพื่อทําการฝากเงิน(deposit)ของออบเจ็ค acct1 โดยมีการสงพารามิเตอรเปนจํานวนเงินที่ตองการฝากจํานวน 25.85

บรรทัดท่ี 20-21 เปนการสรางตัวแปร smithBalance เพื่อทําการเก็บผลลัพธหลังจากการฝากเงินของออบเจ็ค acct2 ท่ีเรียกใชงานเมธอด deposit พรอมท้ังแสดงผล จะเห็นวาตัวแปร smithBalance ถูกประกาศใหเปนชนิด double ซึ่งจะตรงกับผลลัพธของเมธ

Page 85: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

81

อด deposit ท้ังนี้แสดงใหเห็นวาหลังจากที่เมธอดกระทําการใดๆเสร็จแลวผลลัพธท่ีไดก็สามารถนํามาใชกับตัวแปรพื้นฐานไดตามปกติ

บรรทัดท่ี 24-25 เปนการเรียกใชเมธอดที่ใชในการถอน(withdraw)ของออบเจค็ acct2 พรอมท้ังแสดงผล จากการเรียกใชเมธอดในลักษณะนี้จะเห็นวาคาท่ีไดจากการเรียกเมธอด withdraw ซึ่งคาท่ีไดจากเมธอดดังกลาวจะใหผลลัพธเปนจํานวนทศนิยม ซึ่งเราสามารถที่จะนํามาแสดงผลผานเมธอด println ไดเลย

บรรทัดท่ี 27 เปนการเรียกใชงานเมธอดสําหรับการถอนเงิน(withdraw)ของออบเจ็ค acct3 ซึ่งจํานวนเงินที่ตองการจะถอนนั้นมีคามากกวาจํานวนเงินคงเหลือ ดังนั้นหลงัจากการรันโปรแกรมแลว ก็จะมีขอความวาเงินไมเพียงพอที่จะทําการถอนได

บรรทัดท่ี 29-31 เปนการเรียกใชงานเมธอด addInterest() สําหรับคิดดอกเบี้ยใหแกออบเจ็ค acct1,

acct2 และ acct3

บรรทัดท่ี 33-36 เปนการแสดงรายละเอียดของออบเจ็ค acct1, acct2 และ acct3 ผานเมธอด toString

บรรทัดท่ี 38 เปนการรวมบัญชี acct2 เขากับบัญชี acct1 โดยการเรียกใชเมธอด merge

บรรทัดท่ี 39-41 เปนการแสดงผลหลังจากรวมบัญชีของออบเจ็ค acct1 และ acct2

4.6.1 การโอเวอรโหลดเมธอด

การโอเวอรโหลดเมธอดคือ การท่ีคลาสหนึ่งมีการประกาศเมธอดที่ช่ือเหมือนกันมากกวา 1 เมธอด ดังนั้นเพื่อใหเกิดการแยกแยะใหไดวาเรากําลังเรียกใชงานเมธอดใดอยูนั้นรายการของพารามิเตอรของแตละ เมธอดหรือลาย เซ็นต างกัน ตัวอย าง เมธอดที่ ถู กทํ าการโอ เวอร โหลด เชน System.out.println ซึ่งเปนเมธอดที่เรารูจักและคุนเคยกันดี System.out.println(“The Total is :”); System.out.println(total); เมธอด println นี้จะรับพารามิเตอรท่ีตางกัน ซึ่งจากตัวอยางอันแรกจะรับพารามิเตอรเปน String

สวนอันที่สองรับพารามิเตอรเปนตัวแปร total

เมื่อมีการเรียกใชงานเมธอดที่ถูกโอเวอรโหลด เมธอดที่มีลายเซ็นหรือพารามิเตอรท่ีตรงกันจะถูกเลือกใหมาทํางาน ดังตัวอยางเมธอด tryMe ขางลาง

version 1 float tryMe(int x) { return x + .375; }

version 2

float try Me(int x, float y) {

Return x*y; }

การเรียกใช result = tryMe(25,4.32) แสดงวา version 2 ถูกเรียกใหทํางาน

Page 86: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

82

4.6.2 ออบเจ็คกราฟฟก ในการทํางานเกี่ยวกับกราฟฟกนั้นเราสามารถประกาศเมธอดอื่นๆเพื่อชวยในการทํางาน ดังนั้นจึงควรเลือกใชตัวปรับปรุงการมองเห็นแบบ private ในการทํางานเกี่ยวกับกราฟฟกนั้นจะเรยีกใชเมธอด paint โดยมีตัวแปรอางองิชนิด Graphics อยูดวย โดยเราสามารถสงผานตัวแปรอางอิงชนิด Graphics นี้ไปยังเมธอดอื่นหรือคลาสอื่นเพื่อใหทํางานได ดังตัวอยางในไฟล Lineup.java ดังแสดงใน รูปที่ 4-13 และ StickFigure.java ดังแสดงใน รูปที่ 4-14 ซึ่งในที่นี้ จะใหทําการสังเกต การสรางออบเจ็คในคลาสของ Lineup.java แลวทําการเรียกใชเมธอด draw ในคลาสของ StickFigure 01 //************************************************************ 02 // LineUp.java Author: Lewis/Loftus 03 // 04 // Demonstrates the use of a graphical object. 05 //************************************************************ 06 07 import java.util.Random; 08 import javax.swing.JFrame; 09 import java.awt.*; 10 11 public class LineUp extends JFrame 12 { 13 private final int WIDTH = 400; 14 private final int HEIGHT = 150; 15 private final int HEIGHT_MIN = 100; 16 private final int VARIANCE = 40; 17 18 private StickFigure figure1, figure2, figure3, figure4; 19 20 public LineUp(){

21 //เรียกใชเมธอด init() ซึ่งเราเขียนขึ้นเองเพื่อกําหนดคาเริ่มตน 22 init(); 23

24 //เมธอดสําหรบักําหนดรูปแบบของเฟรม 25 setSize(WIDTH, HEIGHT); 26 setUndecorated(true); 27 setVisible(true); 28 setDefaultCloseOperation(EXIT_ON_CLOSE); 29 }

รูปที่ 4-13โคดไฟล LineUp.java

Page 87: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

83

30 //---------------------------------------------------------

31 // สรางรูปของคนหลายๆ อัน ดวยคุณลักษณะที่แตกตางกัน 32 //--------------------------------------------------------- 33 private void init () 34 {

35 int h1, h2, h3, h4; // ความสูงของคน 36 Random generator = new Random(); 37 38 h1 = HEIGHT_MIN + generator.nextInt(VARIANCE); 39 h2 = HEIGHT_MIN + generator.nextInt(VARIANCE); 40 h3 = HEIGHT_MIN + generator.nextInt(VARIANCE); 41 h4 = HEIGHT_MIN + generator.nextInt(VARIANCE); 42 43 figure1 = new StickFigure (100, 150, Color.red, h1); 44 figure2 = new StickFigure (150, 150, Color.cyan, h2); 45 figure3 = new StickFigure (200, 150, Color.green, h3); 46 figure4 = new StickFigure (250, 150, Color.yellow, h4); 47 48 setBackground (Color.black); 49 setSize (WIDTH, HEIGHT); 50 } 51 52 //---------------------------------------------------------

53 // วาดรูปคนลงในเฟรม 54 //--------------------------------------------------------- 55 public void paint (Graphics page) 56 { 57 figure1.draw (page); 58 figure2.draw (page); 59 figure3.draw (page); 60 figure4.draw (page); 61 } 62 63 public static void main(String[] args) 64 { 65 new LineUp(); 66 System.out.println("Press Alt+F4 to exit (กดปุม Alt พรอมกับ F4

เพื่อออกจากโปรแกรม)"); 67 } 68 }

รูปที่ 4-13โคดไฟล LineUp.java (ตอ)

คลาส LineUp เปนคลาสที่ทําหนาท่ีเปนเฟรมซึ่งทําการ extends มาจากคลาส JFrame

บรรทัดท่ี 13-16 เปนการสรางตัวแปรขอมูลชนิด int WIDTH, HEIGHT, HEIGHT_MIN และ VARIANCE เปนตัวแปรชนิด private

บรรทัดท่ี 18 เปนการสรางตัวแปรออบเจ็ค StickFigure โดยใหช่ือวา figure1, figure2,

figure3 และ figure4

บรรทัดท่ี 33-50 เมธอด init เปนเมธอดที่ใชสําหรับกําหนดคาตางๆใหกับออบเจ็ค StickFigure

บรรทัดท่ี 55-61 เมธอด paint เปนเมธอดที่ใชในการวาดภาพ

Page 88: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

84

01 //************************************************************ 02 // StickFigure.java Author: Lewis/Loftus 03 // 04 // Represents a graphical stick figure. 05 //************************************************************ 06 07 import java.awt.*; 08 09 public class StickFigure 10 { 11 private int baseX; // center of figure 12 private int baseY; // floor (bottom of feet) 13 private Color color; // color of stick figure 14 private int height; // height of stick figure 15 16 //--------------------------------------------------------- 17 // Sets up the stick figure's primary attributes. 18 //--------------------------------------------------------- 19 public StickFigure (int center,int bottom,Color shade,int size) 20 { 21 baseX = center; 22 baseY = bottom; 23 color = shade; 24 height = size; 25 } 26 27 //--------------------------------------------------------- 28 // Draws this figure relative to baseX, baseY, and height. 29 //--------------------------------------------------------- 30 public void draw (Graphics page) 31 { 32 int top = baseY - height; // top of head 33 34 page.setColor (color); 35 36 page.drawOval (baseX-10, top, 20, 20); // head 37 38 page.drawLine (baseX, top+20, baseX, baseY-30); //trunk 39 40 page.drawLine (baseX, baseY-30, baseX-15, baseY); //legs 41 page.drawLine (baseX, baseY-30, baseX+15, baseY); 42 43 page.drawLine (baseX, baseY-70, baseX-25, baseY-70); //arms 44 page.drawLine (baseX, baseY-70, baseX+20, baseY-85); 45 } 46 }

รูปที่ 4-14 โคดไฟล StickFigure.java

Page 89: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

85

สรุปทายบทที่ 4

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

คําถามทายบทที่ 4

1. สวนประกอบของออบเจ็คไดแกอะไรบาง 2. จากโคดตัวอยางในรูปที่ 4-15และ รูปที่ 4-16 จงตอบคําถามตอไปนี้

public class Test { public static void main(String[] args) { Points p1= new Points(); p1.x=5; System.out.println("Output is : "+p1.showxy());

//……………สรางออบเจ็คอีก 1 ออบเจ็ค //p2.x=12; //System.out.println("Output is : "+p2.showxy()); } }

รูปที่ 4-15โคด Test.java

public class Points { public int x; public String showxy(){ return "x*x ="+x*x; } }

รูปที่ 4-16โคด Points.java

• จากโคดในรูปที่ 4-15และรูปที่ 4-16 จงหาผลลัพธ ของโปรแกรม

• จงสรางออบเจ็คอีก 1 ออบเจ็ค ของคลาส Points ในบรรทัดท่ี 7 (โคด Test.java) โดยมีช่ือวา p2 จากนั้นใหนําเครื่องหมายอธิบายในบรรทัดท่ี 8 และ 9 ออก

• จงหาผลลัพธ ของโปรแกรมเมื่อทําการสรางออบเจ็ค p2 และ ตัวแปร x ท่ีเราไดทําการกาํหนดคาใหกับ p1 และ p2 นั้น เปน x ตัวเดียวกันหรือไม

Page 90: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

86

• จากโคด Points.java ในบรรทัดท่ี 14 เปลี่ยนตัวปรับปรุงการมองเห็นเปน private เมื่อการแปลโปรแกรมแลว จะใหผลเปนอยางไร

3. จากสวนหนึ่งของโคดตัวอยางดานลาง จงหาผลลัพธของโปรแกรม public static void main(String[] args) { int a = 10; addToOne(a); System.out.println(“a = ”+a); } ………………………………… ………………………………… void addToOne(int x) { x=x+3;

System.out.println(“x = ”+x); }

4. จงเขียนคลาส Resume เพื่อแสดงชื่อ-นามสกุล และ อายุ โดยใหกําหนดคาตัวแปรเปน name, surname และ

age มีเมธอด Display สําหรับแสดง ช่ือ นามสกุล และ อายดุังกลาว โดยตองรับคามาจากตัวตัวแปร และมี เมธอด main เพื่อใชแสดงผลทั้งหมด

5. จากโปรแกรม Employee.java ท่ีกําหนดให ในรูปที่ 4-17 ใหคลาสขึ้นมาใหมท่ีมี ช่ือวา

TestEmployee.java เพื่อสรางออบเจ็คและเรียกใชงานเมธอดตางๆ และใหไดผลลัพธดังนี้

Employee's Name: Tum Position: Engineer ID: 4710323 Salary: 10000.0

Page 91: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

87

01 //Employee.java 02 public class Employee 03 { 04 private String name; 05 private String position; 06 private int employee_id; 07 private double employee_salary; 08 09 Employee(String n,String type,int id,double salary){ 10 name = n; 11 position = type; 12 employee_id = id; 13 employee_salary = salary; 14 15 } 16 17 public String getName(){ 18 return name; 19 } 20 21 public int getID(){ 22 return employee_id; 23 } 24 25 public double getSalary(){ 26 return employee_salary; 27 } 28 29 public void doProject(float score){ 30 employee_salary = employee_salary + (score * employee_salary); 31 } 32 33 public double getPaid(){ 34 return employee_salary; 35 } 36 37 public String toString(){ 38 39 String output = "Employee's Name: "+name+"\nPosition:

"+position+"\nID: "+employee_id+"\nSalary: "+employee_salary; 40 return output; 41 } 42 }

รูปที่ 4-17 Employee.java

Page 92: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

88

บทที่ 5 คลาสขั้นสูง

บทที่ คลาสขัน้สูงคลาสขัน้สูง 55

หัวขอศึกษา ตัวแปรอางอิง การสงผานออบเจ็คเปนพารามิเตอร ตัวปรับปรุง static

อินเตอรเฟซและการมีหลายรูป

เหตุการณและผูรับฟง ภาพเคลื่อนไหว

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

5.1 ตัวแปรอางอิง ตัวแปรอางอิงถูกสรางขึ้นเพื่อใชสําหรับการอางอิงไปยังออบเจ็ค โดยการอางอิงนั้นจะเปนการอางอิงไปยังตําแหนงในหนวยความจําของออบเจ็ค ซึ่งสามารถเปรียบเทียบโดยใชลูกศรช้ีไปยังออบเจ็คดังรูปที่ 5-1 bishop1 เปนตัวแปรอางอิงท่ีอางอิงไปยังออบเจ็คของคลาส ChessPiece ซึ่งออบเจ็คนี้ถูกสรางขึ้นดวยตัวดําเนินการ new

ChessPiece bishop1 = new ChessPiece();

bishop1

รูปที่ 5-1 การอางอิงของตวัแปรอางองิ

Page 93: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

89

5.1.1 การกําหนดคาใหตัวแปรอางอิง ในการกําหนดคาใหกับตัวแปร ไมวาจะเปนตัวแปรขอมูลชนิดพื้นฐานหรือตัวแปรอางอิง เครื่องหมายที่ใชในการกําหนดคาคือเครื่องหมาย = ซึ่งเครื่องหมายนี้จะสําเนาคาผลลัพธของนิพจนทางขวามือไปยังตัวแปรทางซายมือ

รูปท่ี 5-2 เปนแผนภาพแสดงตัวอยางของการกําหนดคาใหกับตัวแปรชนิดพื้นฐาน โดยตัวแปร num1 และ num2 เปนตัวแปรขอมูลชนิดพื้นฐาน เบื้องตนกําหนดให num1 = 5 และ num2 = 12 และจากคําสั่ง

num1 = num2; เปนการกําหนดใหนําคาของ num2 ใสใหกับ num1 ดังนั้น num1 และ num2 จะมีคาเทากับ 5 แตควรระวังวาคา 5 ท้ังสองคานี้เปนคนละตัวกัน เชน หากภายหลัง num1 เปลี่ยนคาเปน 7 num2 ก็ยังมีคาเปน 5 อยูเหมือนเดิม

กอนnum1

5

num2

12

หลังnum1

5

num2

5

num1 = num2;

รูปที่ 5-2 การกําหนดคาใหกับตัวแปรขอมลูชนิดพื้นฐาน

ในกรณีของตัวแปรอางอิง การกําหนดคาดวยเครื่องหมาย = เปนการสําเนาคาของตําแหนงในหนวยความจําของออบเจ็ค จากรูปที่ 5-3 เมื่อกําหนดคาของ bishop2 ใหเทากับ bishop1 การกระทําผาน bishop2 และ bishop1 เปนการกระทํากับออบเจ็คตัวเดียวกัน เปรียบเสมือนวาออบเจ็คมีหลายช่ือ แตทุกชื่อจะหมายถึงสิ่งเดียวกัน

รูปที่ 5-3 การกําหนดคาใหกับตัวแปรอางองิ

Page 94: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

90

5.1.2 การสงผานออบเจ็คไปยังเมธอด การเรียกใชงานเมธอดตางๆ นั้นจะมีการสงผานพารามิเตอรไปยังเมธอด เสมือนเปนการกําหนดคาพารามิเตอรท่ีกําหนดในสวนหัวของเมธอดใหมีคาเทากับคาพารามิเตอรท่ีถูกระบุในการเรียกใชเมธอด โดยการสงผานตัวแปรขอมูลชนิดพื้นฐานไปยังเมธอดนั้นจะเปนการสําเนาคาของตัวแปร แตหากเปนการสงผานตัวแปรอางอิงจะเปนการสําเนาตําแหนงของออบเจ็ค ซึ่งตัวแปรอางอิงท่ีระบุเปนพารามิเตอรในการเรียกใชงานเมธอดนั้น จะอางอิงไปยังออบเจ็คตัวเดียวกันกับตัวแปรอางอิงท่ีระบุในสวนหัวของเมธอด ดังตัวอยางโคดในไฟล Num.java ท่ีแสดงในรูปท่ี 5-4 และไฟล ParameterTester.java ในรูปที่ 5-5

01 public class Num 02 { 03 private int value; 04 public Num (int update) 05 { 06 value = update; 07 } 08 public void setValue (int update) 09 { 10 value = update; 11 } 12 public String toString () 13 { 14 return value + ""; 15 } 16 }

รูปที่ 5-4 โคดของไฟล Num.java

จากซอรสโคดของไฟล Num.java ในรูปที่ 5-4 สามารถอธิบายซอรสโคดไดดังนี้

บรรทัดท่ี 4-7 เปนคอนสตรัคเตอรของคลาส Num ซึ่งจะกําหนดคาใหกับตัวแปรของคลาส

บรรทัดท่ี 8-11 เมธอด setValue ทําหนาท่ีแกไขคาของตัวแปร value ของคลาส

บรรทัดท่ี 12-15 เมธอด toString ทําหนาท่ีสําหรับสงคาของ value ออกมาเปนสตริงเมื่อมีการสั่งพิมพออบเจ็คของคลาส Num

Page 95: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

91

01 public class ParameterTester 02 { 03 public void changeValues (int f1, Num f2, Num f3) 04 { 05 System.out.println ("Before changing the values:"); 06 System.out.println ("f1\tf2\tf3"); 07 System.out.println (f1 + "\t" + f2 + "\t" + f3 + "\n"); 08 09 f1 = 999; 10 f2.setValue(888); 11 f3 = new Num (777); 12 13 System.out.println ("After changing the values:"); 14 System.out.println ("f1\tf2\tf3"); 15 System.out.println (f1 + "\t" + f2 + "\t" + f3 + "\n"); 16 } 17 18 public static void main (String[] args) 19 { 20 ParameterTester tester = new ParameterTester(); 21 22 int a1 = 111; 23 Num a2 = new Num (222); 24 Num a3 = new Num (333); 25 26 System.out.println ("Before calling changeValues:"); 27 System.out.println ("a1\ta2\ta3"); 28 System.out.println (a1 + "\t" + a2 + "\t" + a3 + "\n"); 29 30 tester.changeValues (a1, a2, a3); 31 32 System.out.println ("After calling changeValues:"); 33 System.out.println ("a1\ta2\ta3"); 34 System.out.println (a1 + "\t" + a2 + "\t" + a3 + "\n"); 35 } 36 }

รูปที่ 5-5 ซอรสโคดของไฟล ParameterTester.java

จากซอรสโคดของไฟล Num.java ในรูปที่ 5-5 สามารถอธิบายซอรสโคดไดดังนี ้

บรรทัดท่ี 3-16 เมธอด changeValues เปนเมธอดที่ใชสําหรับเปลี่ยนแปลงคา โดยมีการรับพารามิเตอรเขามาเปนตัวแปร f1 (ขอมูลชนิดพื้นฐาน int), f2

(ออบเจ็ค Num) และ f3 (ออบเจ็ค Num)

บรรทัดท่ี 5-7 เปนการแสดงคากอนแกไข

บรรทัดท่ี 9 เปนการกําหนดคาใหมใหแก f1 ซึ่งเปนตัวแปรขอมูลพื้นฐาน โดยจะไมมีผลตอคาเดิมของตัวแปร (a1 ในบรรทัดท่ี 21) ท่ีสงเขามา

Page 96: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

92

บรรทัดท่ี 10 เปนการเรียกใชงานเมธอด setValue ผานทางออบเจ็ค f2 เพื่อเปลี่ยนแปลงคา ซึ่งการเปลี่ยนแปลงดังกลาวจะสงผลถึงออบเจ็ค (a2 ในบรรทัดท่ี 22) ท่ีสงเขามา

บรรทัดท่ี 11 เปนการสรางออบเจ็คข้ึนมาใหมดวยคําสั่ง new ทําใหคาดังกลาวไมสงผลถึงออบเจ็ค (a3 ในบรรทัดท่ี 23) ท่ีสงเขามา

บรรทัดท่ี 13-15 เปนการแสดงคาหลังทําการเปลี่ยนแปลง

บรรทัดท่ี 17-34 เมธอด main ซึ่งโปรแกรมจะเริ่มทํางานที่เมธอดนี ้

บรรทัดท่ี 19 เปนการสรางออบเจ็ค ParameterTester โดยใหช่ือวา tester

บรรทัดท่ี 21-23 เปนการประกาศตัวแปร int โดยใหช่ือวา a1 สรางออบเจ็คของคลาส Num โดยใหช่ือวา a2 และ a3 พรอมทั้งกําหนดคาใหกับตัวแปรทั้ง 3

บรรทัดท่ี 25-27 เปนการแสดงคาของ a1, a2 และ a3 กอนเรียกใชงานเมธอด changeValues

บรรทัดท่ี 29 เปนการเรียกใชงานเมธอด changeValues ผานทางตัวแปรอางอิง tester โดยมีการสงพารามิเตอรเปน a1, a2 และ a3

บรรทัดท่ี 31-33 เปนการแสดงคาของ a1, a2 และ a3 หลังการเรียกใชเมธอด changeValues

5.2 ตัวปรับปรุง static

การเรียกใชงานเมธอดของคลาสจะถูกเรียกใชงานผานชื่อคลาส เชน เมธอดของคลาส Math สวนใหญจะเปนเมธอดของคลาสหรือเรียกวา static method ซึ่งการทําใหเมธอดเปน static

นั้นทําไดโดยการใสตัวปรับปรุง static ไวกับการประกาศเมธอด ซึ่งตัวปรับปรุงนี้สามารถใชไดกับตัวแปรไดเชนกัน โดยทั้งตัวแปรและเมธอดที่ใช static นั้นจะเกี่ยวของกับคลาสมากกวาตัวออบเจ็ค เนื่องจากเมื่อตัวแปรเปน static จะอยูติดกับคลาสตั้งแตเริ่มประกาศคลาส จึงสามารถเรียกใชงานไดเลยโดยไมตองสรางออบเจ็ค ในการประกาศตัวแปรเปนแบบ static นั้นจะใชเมื่อตองการใหสามารถเรียกใชงานจากไดจากหลายๆ ท่ีหรือเมื่อตองการใหมีการใชงานออบเจ็ครวมกัน ซึ่งดูไดจากไฟล Coin.java ในรูปท่ี 5-6 และ CountFlips.java ในรูปที่ 5-7 จะเห็นวา HEADS เปนตัวแปร static เมื่อเรียกใชงานจะสามารถเรียกผานชื่อคลาสได เชน Coin.HEADS (ในไฟล CountFlip.java)

Page 97: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

93

01 public class Coin 02 { 03 public static final int HEADS = 0; 04 public static final int TAILS = 1; 05 06 private int face; 07 ... 08 }

รูปที่ 5-6 สวนหนึ่งของไฟล Coin.java

01 for (int count=1; count <= NUM_FLIPS; count++) 02 { 03 myCoin.flip(); 04 05 if (myCoin.getFace() == Coin.HEADS) 06 heads++; 07 else 08 tails++; 09 }

รูปที่ 5-7 สวนหนึ่งของไฟล CountFlips.java

5.2.1 เมธอดของคลาส เมธอดของคลาสจะไมสามารถเขาถึงตัวแปรของออบเจ็คได เพราะตัวแปรของออบเจ็คจะไมถูกสรางขึ้นจนกวาออบเจ็คจะถูกสราง สําหรับการเรียกเมธอดที่เปนเมธอดของคลาสหรือเมธอดแบบ static สามารถเรียกใชผานทางชื่อคลาสไดเลย เชน หากคลาส Helper มีการประกาศเมธอดช่ือ triper ดังนี้

public static int triper(int num) { int result; result = num*3; return result; }

สามารถการเรียกใชเมธอดดังกลาวไดดังนี้

int value = Helper.triple(5);

5.2.2 ตัวแปรของคลาส

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

Page 98: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

94

01 public class CountInstances 02 { 03 public static void main (String[] args) 04 { 05 Slogan obj; 06 07 obj = new Slogan ("Remember the Alamo."); 08 System.out.println (obj); 09 10 obj = new Slogan ("Don't Worry. Be Happy."); 11 System.out.println (obj); 12 13 obj = new Slogan ("Live Free or Die."); 14 System.out.println (obj); 15 16 obj = new Slogan ("Talk is Cheap."); 17 System.out.println (obj); 18 19 obj = new Slogan ("Write Once, Run Anywhere."); 20 System.out.println (obj); 21 22 System.out.println(); 23 System.out.println ("Slogans created: " + Slogan.getCount()); 24 } 25 }

รูปที่ 5-8 ซอรสโคดของไฟล CountInstances.java

ตัวอยางการประกาศตัวแปรของคลาส private static float price; เมื่อตัวแปรของคลาสถูกสรางขึ้นจะทําใหทุกเมธอดในคลาสทั้งเมธอดของออบเจ็คและเมธอดของคลาสใชตัวแปรของคลาสได ซึ่งจะเห็นไดวาเมธอดของคลาสมักทํางานรวมกับตัวแปรของคลาส

จากซอรสโคดของไฟล CountInstances.java ในรูปที่ 5-8 สามารถอธิบายไดดังนี้

บรรทัดท่ี 5 เปนการประกาศตัวแปรอางอิงของคลาส Slogan โดยใหช่ือวา obj

บรรทัดท่ี 7-20 เปนการสรางออบเจ็คของคลาส Slogan พรอมทั้งสั่งแสดงรายละเอยีดของออบเจ็ค ซึ่งการแสดงผลแตละครั้งจะใหผลแตกตางกันตามพารามิเตอรท่ีสงคาใหกับคอนสตรัคเตอร

บรรทัดท่ี 23 เปนการสั่งแสดงจํานวนครั้งท้ังหมดที่ทําการสรางออบเจ็ค โดยเปนการเรียกใชงานเมธอด getCount ผานทางคลาส Slogan เนื่องจากเปนเม ธอดชนิด static

Page 99: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

95

01 public class Slogan 02 { 03 private String phrase; 04 private static int count = 0; 05 public Slogan (String str) 06 { 07 phrase = str; 08 count++; 09 } 10 public String toString() 11 { 12 return phrase; 13 } 14 public static int getCount () 15 { 16 return count; 17 } 18 }

รูปที่ 5-9 โคดของคลาส Slogan.java

จากซอรสโคดของไฟล Slogan.java สามารถอธิบายไดดังนี้

บรรทัดท่ี 3-4 เปนการประกาศตัวแปรของคลาสโดยมีตัวแปรสตริงท่ีช่ือวา phrase และตัวแปรint ท่ีช่ือวา count ซึ่งเปนตัวแปรชนิด static จึงทําใหทุกออบเจ็คสามารถใชงาน count ไดซึ่งจะเปนประโยชนสําหรับการนับจํานวนครั้งการสรางออบเจ็คเนื่องจาก count จะไมถูกสรางใหมทุกครั้งหลังจากสรางออบเจ็ค แตจะยังใช count ตัวเดิมจนกวาจะจบโปรแกรม

บรรทัดท่ี 5-9 เปนคอนสตรัคเตอรของคลาส Slogan ทําหนาท่ีในการกําหนดคาเริ่มตนใหกับ phrase และทําการนับจํานวนครั้งของการสรางออบเจ็คไปพรอมๆกันดวย

บรรทัดท่ี 10-13 เมธอด toString เปนการสงผานคา phrase ออกมาในรูปของสตริงเพื่อใชงานในการสั่งพิมพออบเจ็ค

บรรทัดท่ี 14-17 เมธอด getCount เปนการเรียกดูจํานวนครั้งของการสรางออบเจ็ค ซึ่งจํานวนครั้งดังกลาวจะถูกเก็บไวในตัวแปร count และเนื่องจากเปนเมธอดชนิด static จึงสามารถเรียกใชงานไดผานคลาส

5.3 อินเทอรเฟซ (Interface)

อินเตอรเฟซ คือ กลุมของเมธอดที่เปนแอ็บสแตรค (Abtract) และคาคงท่ี ซึ่งเมธอดที่เปนแอ็บสแตรคคือ เมธอดที่ไมมีตัวตนโดยจะประกาศสวนหัวของเมธอดไวเทานั้น หากจะเรียกใชงานเมธอดเหลานี้จะตองทําการสรางคําสั่งหรือสรางรายละเอียดภายใน

Page 100: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

96

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

public interface Doable { public void doThis(); public int doThat(); public void doThis2(float value, char ch); public boolean doTheOther(int num); }

จะเห็นไดวามีการประกาศ Doable เปนอินเตอรเฟซ ซึ่งภายใน Doable จะมีการประกาศเมธอด ซึ่งเมธอดที่ถูกประกาศเหลานี้จะมีเฉพาะสวนหัวไมมีสวนตวัของ และตองตองใส เซมิโคลอน (;)

หลังการประกาศเมธอด อินเตอรเฟซจะตางจากคลาสคือ ไมสามารถนําไปสรางออบเจ็คได และจะตองประกาศเมธอดใหมีการมองเห็นเปนแบบ public หากคลาสใดตองการนําอินเตอรเฟสไปใชจะตองทําการอิมพลีเมนต (implements) หรือขอใชงานกอน คลาสที่ตองการอิมพลีเมนตอนิเทอรเฟซจะตองมีการระบุวาจะอิมพลีเมนตอินเตอรเฟสนี้ไวท่ีสวนหัวของคลาสอยางชัดเจน และตองมีการประกาศเมธอดตามที่ระบุไวในอินเตอรเฟซอยางครบถวน คือ มีท้ังสวนหัวและสวนตัว ไมเชนนั้นจะทําใหเกิดความผิดพลาดขณะคอมไพล นอกจากนี้คลาสสามารถประกาศเมธอดอื่นๆ นอกเหนือจากที่ระบุไวในอินเตอรเฟซได และคลาสหนึ่งๆจะสามารถอิมพลีเมนตไดหลายอินเตอรเฟซ โดยแตละอินเตอรเฟซจะคั่นดวยเครื่องหมายจุลภาคหรือคอมมา(,) ตัวอยางการอิมพลีเมนตจากอินเตอรเฟซ Doable

public class CanDo implements Double { public void doThis() { //whatever } public void doThat() { //whatever } //etc }

ตัวอยางโคดของการใชงานอินเทอรเฟซมี 3 ไฟลคือ Talkable.java, Dog.java และ Zoo1.java ซึ่งมีซอรสโคดแสดงอยูในรูปที่ 5-10, รูปที่ 5-11 และรูปที่ 5-12 ตามลําดับ

Page 101: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

97

01 interface Talkable 02 { 03 void talk(); 04 }

รูปที่ 5-10 ซอรสโคดของคลาสTalkable.java

Talkable เปนอินเทอรเฟซซึ่งมีเมธอด talk ท่ีมีสิทธิ์ในการมองเห็นแบบ public และเปนเมธอดแบบ abtract ซึ่งจะใส public และ abtract หรือไมใสก็ได 01 class Dog implements Talkable 02 { 03 public void talk(){ 04 System.out.println("bog bog"); 05 } 06 }

รูปที่ 5-11 โคดของคลาสDog.java

คลาส Dog เปนคลาสอิมพลีเมนตอินเทอรเฟซ Talkable โดยไดมีการประกาศเมธอด talk ท้ังสวนหัวและสวนตัว 01 class Zoo1 02 { 03 public static void main(String[] args) 04 { 05 Dog lucky = new Dog(); 06 Dog thongdang = new Dog(); 07 lucky.talk(); 08 thongdang.talk(); 09 } 10 }

รูปที่ 5-12 โคดของคลาสZoo1.java

คลาส Zoo1 จะมีเมธอด main ซึ่งจะมีการสรางออบเจ็คข้ึนมาใชงานและเรียกใชงานเมธอด talk

5.3.1 การมีหลายรูปดวยอินเตอรเฟซ การใชอินเตอรเฟซทําใหออบเจ็คมีหลายรูปได นั้นคือออบเจ็คสามารถอางอิงไดดวยตัวแปรอางอิงชนิดอินเทอรเฟซ เชน เราสามารถนํา Doable ซึ่งเปนอินเตอรเฟซมาประกาศตัวแปรอางอิงไดและตัวแปรอางอิงนี้ยังสามารถอางอิงไปยังออบเจ็คของทุกคลาสที่มีการอิมพลีเมนต Doable จึงทําใหออบเจ็คมีอยางนอย 2 รูปคือ ออบเจ็คของตัวมันเองและออบเจ็คของอินเตอรเฟซ แตถาหากมีการอิมพลีเมนตหลายอินเตอรเฟซก็จะทําใหมีออบเจ็คไดหลายรูป ซึ่งขอจํากัดของการเรียกเมธอด

Page 102: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

98

คือเราสามารถเรียกเมธอดเฉพาะที่ระบุไวในอินเตอรเฟซผานตัวแปรอางอิงนั้นซึ่งเมธอดที่ถูกเรียกใชจริงคือเมธอดของออบเจ็คท่ีตัวแปรอางอิงนั้นอางอิงอยู รูปที่ 5-13 - รูปที่ 5-16 เปนตัวอยางที่แสดงใหเห็นถึงการมีหลายรูปดวยอินเทอรเฟซ ซึ่งตัวอยางนี้ประกอบดวยซอรสโคด 4 ไฟล คือ Talkable.java, Dog.java, Cat.java และ Zoo2.java 01 interface Talkable 02 { 03 void talk(); 04 }

รูปที่ 5-13 โคดของไฟล Talkable.java

01 class Dog implements Talkable 02 { 03 public void talk(){ 04 System.out.println("bog bog"); 05 } 06 }

รูปที่ 5-14 ซอรสโคดของไฟล Dog.java

01 class Cat implements Talkable 02 { 03 public void talk(){ 04 System.out.println("meaw meaw"); 05 } 06 }

รูปที่ 5-15 ซอรสโคดของไฟล Cat.java

เนื่องจากคลาส Cat อิมพลีเมนตอินเทอรเฟซ Talkable ดังนั้นจึงตองประกาศเมธอด talk ท้ังสวนหัวและสวนตัว

01 class Zoo2 02 { 03 public static void main(String[] args) 04 { 05 Talkable t1 = new Dog(); 06 Talkable t2 = new Cat(); 07 t1.talk(); 08 t2.talk(); 09 } 10 }

รูปที่ 5-16 ซอรสโคดของคลาสZoo2.java

Page 103: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

99

คลาส Zoo2 มีเมธอด main ซึ่งมีการประกาศตัวแปรอางอิงชนิด Talkable จะเห็นไดวาในการใชตัวดําเนินการ new เพื่อสรางออบเจ็คของ Dog และ Cat นั้น สามารถใชตัวแปรอางอิงชนิด Talkable ไดเลย เพราะทั้ง Dog และ Cat มีการอิมพลีเมนตอินเทอรเฟซ Talkable ไวแลว

5.4 เหตุการณและผูรับฟง

เหตุการณ (Event) อาจเกิดข้ึนจากกิจกรรมของโปรแกรมเชน การท่ีเมาสเคลื่อนไหว การคลิก การท่ีปุมถูกกด หรือการที่ตัวจับเวลา (timer) สิ้นสุด เมื่อเกิดเหตุการณข้ึนโปรแกรมอาจตองการที่จะตอบสนองดวยการกระทําบางอยาง เชน ใหลูกบอลเคลื่อนไหวทุกๆ 20 ms (20/1000 วินาที) นั่นคือเมื่อครบ 20 ms ลูกบอลจะตองไมหยุดนิ่ง ซึ่งเราจะเรียกออบเจ็คท่ีตองการรับเหตุการณท่ีเกิดข้ึนเพื่อตอบสนองเหตุการณวา ผูรับฟง (Listener) ซึ่งการเกิดเหตุการณข้ึนในโปรแกรมนั้นอาจทําใหเกิดเปนภาพเคลื่อนไหวได จากรูปที่ 5-17 เมื่อเกิดเหตุการณข้ึน ออบเจ็คท่ีเปนผูสรางเหตุการณ (Generator) จะเรียกเมธอดที่เหมาะสมของผูรับฟง (Listener) และอธิบายเหตุกาณท่ีเกิดข้ึนผานพารามิเตอร

รูปที่ 5-17 เหตุการณและผูรับฟง

5.4.1 ผูรับฟงกับอินเทอรเฟซ

เราจะสามารถสรางออบเจ็คผูรับฟงโดยการอมิพลีเมนตอินเตอรเฟซที่หมาะสม ซึ่งอินเตอรเฟซมีใหเลือกใชหลายตัวในไลบรารีมาตรฐานของจาวา ตัวอยางเชน อินเตอรเฟซ ActionListener ซึง่ถูกเรียกใชจากคลาส javax.swing.Timer ซึ่งเปนตัวจับเวลาที่สามารถใหเหตุการณเมื่อครบเวลาที่กําหนดไดหรือพูดงายๆวาเปนตัวสรางเหตุการณนั่นเอง

Page 104: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

100

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

5.4.2 ภาพเคลื่อนไหว

เทคนิคพื้นฐานในการทําภาพเคลื่อนไหวท่ีสําคัญคือ ภาพเคลื่อนไหวนั้นเกิดจากการตอบสนองในทุกๆ ชวงเวลาที่กําหนดในตัวจับเวลา ดังนั้นการทําใหภาพเคลื่อนไหวใหเร็วหรือชานั้นขึ้นอยูกับชวงเวลา หากตองการใหเคลื่อนไหวเร็วก็ใหใชชวงเวลาสั้นๆ หากตองการใหเคลื่อนไหวชาก็ใหชวงเวลานานๆ นอกจากนี้การเคลื่อนไหวอาจเกิดจากการเปลี่ยนรูปภาพหรือตําแหนงของรูปภาพ และการเคลื่อนไหวยังสามารถมีทิศทางในการเคลื่อนที่ไดโดยมักถูกกําหนดโดย 1 และ -1 สามารถดูตัวอยางโคดจากไฟล Rebound.java ในรูปที่ 5-18 ซึ่งสามารถอธิบายไดดังนี้

บรรทัดท่ี 9-17 เปนการสรางตัวแปรเพื่อเก็บลักษณะตางๆ ของลูกบอล

บรรทัดท่ี 19-28 เปนคอนสตรัคเตอรซึ่งทําหนาท่ีกําหนดคาเริ่มตนใหแกคลาส Rebound

บรรทัดท่ี 29-36 เมธอด paint ทําหนาท่ีในการวาดรูปลูกบอลโดยมีการกําหนดสีและขนาดใหแกลูกบอล

บรรทัดท่ี 37-47 เมธอด actionPerformed เปนเมธอดที่ใชในการกําหนดการเคลื่อนที่ใหแกลูกบอล โดยเมธอดนี้จะถูกเรียกโดยอัตโนมัติทุกๆ ชวงเวลาที่กําหนดในตัวจับเวลา

บรรทัดท่ี 46 เปนการเรียกใชเมธอด repaint เพื่อใชในการวาดรูป ทําใหเกิดการเคลื่อนที่ของวัตถุ ซึ่งจะสังเกตเห็นวาเราจะเรียกใชงานเมธอด repaint

แทนเมธอด paint เพื่อใหโปรแกรมวาดภาพเมื่อถึงเวลาที่สมควร

บรรทัดท่ี 49-53 เปนเมธอด main ทําหนาท่ีในการสรางออบเจ็คจากคลาส Rebound

Page 105: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

101

01 import java.util.Random; 02 import javax.swing.JFrame; 03 import javax.swing.Timer; 04 import java.awt.*; 05 import java.awt.event.*; 06 07 public class Rebound extends JFrame implements ActionListener 08 { 09 private final int WIDTH = 50; 10 private final int HEIGHT = 200; 11 12 private final int BALL_SIZE = 10; 13 private final int BALL_STEP = 4; 14 private final int ANIMATE_CLOCK = 50; 15 private int ball_xpos; 16 private int ball_ypos; 17 private int ball_direction; 18 19 public Rebound(){ 20 ball_xpos = (WIDTH - BALL_SIZE)/2; 21 ball_ypos = HEIGHT/2; 22 ball_direction = 1; 23 new Timer(ANIMATE_CLOCK, this).start(); 24 setSize(WIDTH, HEIGHT); 25 setUndecorated(true); 26 setVisible(true); 27 setDefaultCloseOperation(EXIT_ON_CLOSE); 28 } 29 public void paint (Graphics page) 30 { 31 page.setColor(Color.white); 32 page.fillRect(0, 0, WIDTH, HEIGHT); 33 34 page.setColor(Color.blue); 35 page.fillOval(ball_xpos, ball_ypos, BALL_SIZE, BALL_SIZE); 36 } 37 public void actionPerformed(ActionEvent e){ 38 ball_ypos = ball_ypos + (BALL_STEP * ball_direction); 39 if(ball_ypos >= (HEIGHT - BALL_SIZE)){ 40 ball_direction = -1; 41 ball_ypos = HEIGHT - BALL_SIZE; 42 }else if(ball_ypos <=0){ 43 ball_direction = 1; 44 ball_ypos = 0; 45 } 46 repaint(); 47 } 48 49 public static void main(String[] args) 50 { 51 new Rebound(); 52 System.out.println("Press Alt+F4 to exit (กดปุม Alt พรอมกับ F4 เพือ่ออก

จากโปรแกรม)"); 53 } 54 55 }

รูปที่ 5-18 โคดของไฟล Rebound.java

Page 106: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

102

สรุปบทที่ 5

สําหรับความรูในบทนี้นอกจากจะทําใหไดความรูเกี่ยวกับการสรางคลาสในขั้นที่สูงข้ึน แลวยังไดความรูเกี่ยวกับการสรางการอินเตอรเฟซ ซึ่งความรูเกี่ยวกับอินเตอรเฟซนี้มีความสําคัญและเปนพื้นฐานของการสรางการติดตอระหวางกัน ซึ่งควรพยายามศึกษาและทําความเขาใจเปนอยางยิ่ง

Page 107: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

103

คําถามทายบทที่ 5

1. จากสวนของโคดตอไปนี้

01 String s1, s2; 02 s1 = new String("Thailand"); 03 s2 = new String("Japan"); 04 String s3; 05 s3 = s2;

มีการประกาศตัวแปรอางองิกี่ตัว และมีการสรางออปเจ็คของคลาส String กี่ออบเจ็ค และมีตัวแปรอางอิงตัวใดบางที่อางอิงไปยังออบเจ็คเดียวกัน

2. จากซอรสโคดของคลาส Car ท่ีอยูดานลางนี ้ 01 public class Car { 02 public final static double MAX_SPEED = 300.0; 03 private int numWheel; 04 private String brand; 05 06 public Car(String b, int nw) { 07 brand = b; 08 } 09 10 public String toString() { 11 return brand + numWheel; 12 } 13 14 public static double getMaxSpeed() { 15 return MAX_SPEED; 16 } 17 }

จงระบุวาจากคําสั่งในขอ A) – E) มีคําสั่งใดบางที่ทําใหเกิดขอผิดพลาดขณะคอมไพลโปรแกรม

A) Car c1 = new Car("Toyota"); B) Car c2 = new Car("Honda", 4); C) double ms = Car.MAX_SPEED; D) String s1 = Car.toString(); E) double carSpeed = Car.getMaxSpeed();

3. จากซอรสโคดของอินเทอรเฟซ Flyer

01 public interface Flyer { 02 public void fly(); 03 }

Page 108: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

104

จงเขียนซอรสโคดของคลาส Bird ซึ่งคลาสนี้จะตองอิมพลเีมนตอินเทอรเฟซ Flyer และจะตองประกาศเมธอด fly โดยการทํางานของเมธอดนี้คือ พิมพขอความวา "Birds fly by wings"

4. จากซอรสโคดของอินเทอรเฟซ Talkable, คลาส Dog และคลาส Cat ท่ีอยูดานลางนี ้

01 public interface Talkable { 02 public void talk(); 03 }

01 public class Dog implements Talkable { 02 public void talk(){ 03 System.out.println("bog bog"); 04 } 05 }

01 public class Cat implements Talkable { 02 public void talk(){ 03 System.out.println("meaw meaw"); 04 } 05 }

หากมีการเขียนไฟล TestTalk.java ซึ่งมีการเรียกใชอนิเทอรเฟซและคลาสขางตนดังนี้

01 public class TestTalk { 02 public static void main(String[] args) { 03 Talkable tRef; 04 Cat t1 = new Cat(); 05 Dog t2 = new Dog(); 06 07 tRef.talk(); 08 } 09 }

จงระบุวาจากคําสั่งในขอ A) – D) มีคําสั่งใดบางที่สามารถนําไปวางในบรรทัดท่ี 6 ของไฟล TestTalk.java แลวจะทําใหผลการรันของโปรแกรมนี้มีการพิมพขอความวา bog bog

พรอมทั้งใหเหตุผลประกอบ

A) tRef = t1; B) tRef = t2; C) tRef = new Dog(); D) ไมตองใสคําสั่งใดเลย

Page 109: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

105

5. โปรแกรม CountDown.java เปนโปรแกรมที่สามารถแสดงการนบัถอยหลังได โดยโปรแกรมนี้จะมีการแสดงตัวเลขบนเฟรม โดยจะลดคาของตัวเลขบนเฟรมทุก 1 วินาที จากซอรสโคดของไฟล CountDown.java ท่ีอยูดานลางนี้จะเห็นวายังมีโคดบางสวนที่ขาดหายไป

01 import javax.swing.*; 02 import java.awt.*; 03 import java.awt.event.*; 04 05 public class CountDown extends JFrame 06 __________________________{ 07 private final int WIDTH = 100; 08 private final int HEIGHT = 100; 09 private int count; //Number to show on frame 10 11 public CountDown() { 12 //Initial count to be 10; 13 count = 10; 14 15 //Create Timer object with interval 1 seconds (1000 ms) 16 //Register with this timer,use this object as the listener 17 ______________________________________ 18 //Start timer 19 ______________________________________ 20 21 //Set properties of frame 22 setSize(WIDTH, HEIGHT); 23 setUndecorated(true); 24 setVisible(true); 25 setDefaultCloseOperation(EXIT_ON_CLOSE); 26 } 27 28 public void paint(Graphics page) { 29 //Draw background 30 page.setColor(Color.white); 31 page.fillRect(0, 0, WIDTH, HEIGHT); 32 33 //Convert count to String and draw it on the frame 34 String str = "" + count; 35 page.setColor(Color.blue); 36 page.drawString(str,45,45); 37 } 38 39 public void actionPerformed(ActionEvent e) { 40 //Add your code here 41 //Decrease count by 1 if count is more than 0 42 //Otherwise set count to be 10 43 //And call repaint method 44 //... 45 } 46 47 public static void main(String[] args) { 48 new CountDown(); 49 } 50 }

Page 110: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

106

จงเพิ่มโคดในสวนที่หายไปดังนี้ • บรรทัดท่ี 6 ใหเพิ่มโคดเพื่อระบุวาคลาส CountDown มีการอิมพลีเมนตอินเทอรเฟซ

ActionListener • บรรทัดท่ี 17 สรางออบเจ็คของคลาส Timer โดยระบุชวงเวลาเปน 1000 ms และ

ลงทะเบียนกับออบเจ็คของ Timer วาจะใชออบเจ็คของคลาส CountDown (ใชตัวแปรอางอิง this) เปนผูรับฟง

• บรรทัดท่ี 19 สั่งใหออบเจ็คของ Timer เริ่มจบัเวลา • ในเมธอด actionPerformed (อาจตองมีการเพิ่มโคดหลายบรรทัด) กําหนดใหมีการ

ทํางานดังนี้ - ใหลดคา count ดวย 1 ถา count มีคามากกวา 0

- แตถาคาของ count เปน 0 หรือนอยกวา 0 ใหกําหนดคา count เปน 10

- เรียกเมธอด repaint เพื่อใหเมธอด paint ถูกเรียกโดยอัตโนมัต ิ

Page 111: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

107

บทที่ 6 อารเรยและเว็คเตอร

บทที่ อารเรยและเว็คเตอรอารเรยและเว็คเตอร 66

วัตถุประสงค การประกาศและการใชงานอารเรย ออบเจ็คอารเรย การเรียงขอมูลในอารเรย อารเรยหลายมิติ คลาสเว็คเตอร การใชอารเรยจัดการงานกราฟฟค

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

6.1 อารเรย(Array)

อารเรย คือ รายการของขอมูลท่ีมีการอางอิงตาํแหนงท่ีแนนอน ซึ่งในการเก็บขอมูลจะถูกเก็บภายใตช่ือตัวแปรเพียงช่ือเดียวแตสามารถเก็บขอมูลไดมากกวา 1 ขอมูล ซึ่งแตละขอมูลก็จะมีตําแหนงเปนตัวอางองิวาเปนขอมูลตัวใด โดยตําแหนงจะเริ่มท่ีตําแหนงท่ี 0 (ตั้งแต 0,1,2,…)

รูปที่ 6-1 การอางอิงตําแหนงของอารเรย

Page 112: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

108

การอางองิถึงขอมูลท่ีเก็บในอารเรยนั้นๆ จะอางถึงโดยใชช่ือของอารเรย ตามดวยหมายเลขตําแหนงซึ่งอยูในวงเล็บ [] ตัวอยางในรูปที่ 6-1 score[2] ซึ่งจะหมายถึงขอมูลท่ีถูกเก็บในลําดับท่ี 3 นั่นคือ 94 นั่นเอง จากตัวอยางจะพบวานิพจน score[2] นั้นเปรียบไดเหมือนจํานวนเต็มตัวเดียว ซึ่งสามารถนํานิพจนนี้ไปใชงานไดในทุกที่ท่ีสามารถใชจํานวนเต็มได ไมวาจะเปนการพิมพ การเรียกใชเมธอด การกําหนดคาใหกับตัวแปรอื่นหรอืการกําหนดคาใหตัวแปรในอารเรยเอง และยังสามารถนําไปคํานวณในนิพจนตางๆได แตขอควรระวังคือ อารเรยท่ีอางถึงนั้นจะตองมีการระบุตําแหนงดวย การเก็บขอมูลภายในอารเรยนัน้สามารถเก็บไดหลายตัว แตขอมูลท่ีถูกเก็บภายใตอารเรยนั้นจะตองเปนขอมูลชนิดเดียวกนั ซึ่งชนิดขอมูลนี้อาจเปนขอมูลชนิดพื้นฐานหรืออ็อบเจ็คก็ได ซึ่งในภาษาจาวาจะถือวาอารเรยกเ็ปนออบเจ็คตัวหนึ่งซึ่งช่ือของอารเรยก็คือตัวแปรอางอิงท่ีอางอิงไปยังอารเรยท่ีนําเปนตองสรางขึ้นดวยการ new เชนเดียวกนั

6.1.1 การประกาศอารเรย รูปแบบ ชนิดขอมูล [] ช่ือตัวแปร = new ชนิดขอมูล [] ตัวอยาง int[] scores = new int[10]; นั่นคือเปนการสรางอารเรยของจํานวนเต็มข้ึนมาโดยมีช่ือวา scores ในการประกาศอารเรยนั้นจะตองมีเครื่องหมาย[] เพื่อเปนการแสดงวาตัวแปรดังกลาวเปนอารเรยมิใชตัวแปรทั่วไป สําหรับทางดานขวาของเครื่องหมายเทากับจะเปนการสรางออบเจ็ค ผานการ new ซึ่งอารเรยท่ีถูกสรางขึ้นนี้จะสามารถเก็บขอมูลท่ีเปนตัวเลขจํานวนเต็มได 10 ตัว จากตัวอยางจะพบวาการประกาศอารเรยนั้นชนิดขอมูลของอารเรยไมจําเปนตองระบุขนาดของอารเรย แตการสรางออบเจ็คของอารเรยนั้นจะตองระบุขนาดดวย ดังเชนตัวอยางดานลางเปนการประกาศอารเรยในรูปอื่นๆ float[] price = new float[500]; boolean[] flag; flags = new Boolean[20]; ตัวอยางโคดการใชงานอารเรย

Page 113: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

109

01 public class BasicArray 02 { 03 final static int LIMIT = 15; 04 final static int MULTIPLE = 10; 05 06 public static void main (String[] args) 07 { 08 int[] list = new int[LIMIT]; 09 10 // Initialize the array values 11 for (int index = 0; index < LIMIT; index++) 12 list[index] = index * MULTIPLE; 13 14 list[5] = 999; // change one array value 15 16 for (int index = 0; index < LIMIT; index++) 17 System.out.print (list[index] + " "); 18 19 System.out.println (); 20 } 21 }

รูปที่ 6-2 โคด BasicArray.java

ผลลัพธของโปรแกรม 0 10 20 30 40 999 60 70 80 90 100 110 120 130 140

บรรทัดท่ี 3-4 เปนการกําหนดคาคงที่l โดยใหช่ือวา LIMIT เพื่อใชในการกําหนดขนาด

ของอารเรย และMULTIPLE เพื่อใชในคูณ

บรรทัดท่ี 8 เปนการประการสรางอารเรยของ int ช่ือวา list โดยมีการ new ออบเจ็คของ int ข้ึนมาขนาดเทากับ 15

บรรทัดท่ี 11-12 เปนการใชงานลูป for ในการดําเนินการกําหนดคาใหกับแตละสมาชิกของอารเรย สําหรับการใชงานอารเรยนั้นโดยปกติเราจะใช การวนลูปมาชวยในการเขาถึงสมาชิกของอารเรย จากตัวอยางในบรรทัดท่ี 11 นั้น ใหสังเกตการกําหนดเงื่อนไขของการวนลูป เพราะถึงแมวาอารเรยนี้จะสามารถเก็บคาได 15 ขอมูล แตวาตําแหนงนั้นสูงสุดจะอยูท่ี 14 เทานั้น (0-14)

บรรทัดท่ี 14 เปนการกําหนดคาใหกับอารเรยในตําแหนงท่ี 5(ลําดับตัวท่ี 6) ใหเทากับ 999

บรรทัดท่ี 16-17 เปนการใชงานลูป for เพื่อแสดงคาของอารเรยแตละตัว ขอควรจํา หมายเลขภายใน[] ในการสรางออบเจ็คอารเรยนั้น คือขนาดของอารเรยแตหมายเลขใน [] ท่ีมีการเรียกใชงานอารเรยนั้นเปนตําแหนงของขอมูล

Page 114: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

110

6.1.2 การตรวจสอบของเขต

เมื่ออารเรยถูกสรางขึ้นนั้นขนาดของอารเรยจะเปลี่ยนแปลงไมได ดังนั้นในการใชงาน หมายเลขที่ใชอางอิงถึงขอมูลในอารเรยจะตองระมัดระวงั โดยหมายเลขตําแหนงจะมีคาจาก 0 ถึง n-1 หากมีการเรียกใชงานที่เกินขอบเขตอารเรย คอมไพเลอรจะไมคนพบขอผิดพลาดขณะคอมไพล แตจาวาอินเตอรพริตเตอรจะคนพบขอผิดพลาดนี้ในการรันโปรแกรม ซึ่งเมื่อมีขอผิดพลาดนี้เกิดข้ึนจะทําใหโปรแกรมหยุดทํางานทันที ดังตัวอยางโคด for(int index = 0; index <= 100; index++) codes[index] = index*50 + epsilon; หาก codes มีขอมูล 100 ขอมูล ขอมูลจะมีตั้งแตตําแหนงท่ี 0 ถึง 99 ดังนั้นจากโคดพบวาจะเกดิปญหา โปรแกรมจะวนเปนจํานวน 101 ครั้ง คือตั้งแต 0 จนถึง 100

สําหรับการใชงานอารเรย เราสามารถที่จะหาความยาวของอารเรยไดโดยผานคาคงที่หนึ่งตัวท่ีสามารถใชงานไดคือ length ซึ่งจะเก็บขนาดของอารเรย ขอควรระวัง คือ length จะเก็บจํานวนของขอมูลแตไมใชหมายเลขตําแหนงสูงสุด ดังนั้นจะพบวาขอมูลตัวสุดทายคือ scores[scores.length-1]; ตัวอยางการใชงาน 01 import cs 1. Keyboard; 02 03 public class ReverseOrder 04 { 05 public static void main (String[] args) 06 { 07 double[] numbers = new double[ 10[ ; 08 09 Systemout.println("The size of the array: "+

numbers.length); 10 11 for (int index = 0; index < numbers.length; index++) 12 { 13 System.out.print ("Enter number " +(index+ 1(" :" + ( ; 14 numbers[index] = Keyboard.readDouble(); 15 } 16 17 System.out.println ("The numbers in reverse order:"); 18 19 for (int index = numbers.length-1; index >= 0; index--) 20 System.out.print (numbers[index] + " "); 21 22 System.out.println (); 23 } 24 }

รูปที่ 6-3โคด ReverseOrder.java

Page 115: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

111

คลาส ReverseOrder ใชในการกลับลําดับของตัวเลขเชนหากทําการปอนตัวเลข 1.2 3.4 4.5 2.3 0.5 0.3 13.4 33.4 9.0 123.4 ผลลัพธคือ 123.4 9.0 33.4 13.4 0.3 0.5 2.3 4.5 3.4 1.2

บรรทัดท่ี 7 เปนการประกาศตัวแปรอารเรยของ double ซึ่งมีช่ือวา numbers และมี

ขนาดเทากับ 10

บรรทัดท่ี 9 เปนการแสดงคาของขนาดอารเรย บรรทัดท่ี 11-15 เปนการใชงานลูป for ในอานคาขอมูลจากคียบอรดเพื่อเก็บคาลงใน

อารเรย จะเห็นวาในการวนลูปนี้จะใหวนนอยกวา numbers.length ซึ่งมีคาเปน 10 ท้ังนี้เพราะอาร เรยจะเริ่มเก็บคาตั้งแตตําแหนงท่ี 0-9

บรรทัดท่ี 19-20 เปนการใชงานลูป for เพื่ออานคาในอารเรยโดยกําหนดใหมีการอานคาจากตําแหนงสุดทายกอนแลวยอนมาเรื่องๆจนถึงตําแหนงแรก ซึ่งในตําแหนงสุดทายนี้ก็หาคาไดจากนํา numbers.length มาลบกับ 1 ก็จะไดคาของตําแหนงสุดทายพอด ี

และในทํานองเดียวกับคลาส LetterCount ในรูปที่ 6-4 ซึ่งเปนตัวอยางที่ใชในการนับจํานวนตัวอักษรวาเปนตัวอักษรอะไรบางเชน หากผูใชปอนสตริงวา Hello ก็จะทําการแสดงผลออกมาวามี ตัวอักษร H ท่ีเปนตัวพิมพใหญ 1 ตัว ตัวอักษร e ท่ีเปนตัวพิมพเล็ก 1 ตัว ตัวอักษร l ท่ีเปนตัวพิมพเล็ก 2 ตัว ตัวอักษร o ท่ีเปนตัวพิมพเล็ก 1 ตัว

ท้ังนี้โปรแกรมนี้ ก็ยังคงใชเทคนิคการวนลูปมาชวยในการหาตัวอักษรแตละประเภท แลวเก็บขอมูลในรูปแบบของอารเรย

Page 116: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

112

01 import cs1.Keyboard; 02 03 public class LetterCount 04 { 05 public static void main (String[] args) 06 { 07 final int NUMCHARS = 26; 08 09 int[] upper = new int[NUMCHARS]; 10 int[] lower = new int[NUMCHARS]; 11 12 char current; // the current character being processed 13 int other = 0; // counter for non-alphabetics 14 15 System.out.println ("Enter a sentence:"); 16 String line = Keyboard.readString(); 17 18 // Count the number of each letter occurence 19 for (int ch = 0; ch < line.length(); ch++) 20 { 21 current = line.charAt(ch); 22 if (current >= 'A' && current <= 'Z') 23 upper[current-'A']++; 24 else 25 if (current >= 'a' && current <= 'z') 26 lower[current-'a']++; 27 else 28 other++; 29 } 30 31 // Print the results 32 System.out.println (); 33 for (int letter=0; letter < upper.length; letter++) 34 { 35 System.out.print ( (char) (letter + 'A') ); 36 System.out.print (": " + upper[letter]); 37 System.out.print ("\t\t" + (char) (letter + 'a') ); 38 System.out.println (": " + lower[letter]); 39 } 40 41 System.out.println (); 42 System.out.println ("Non-alphabetic characters: " +

other); 43 } 44 }

รูปที่ 6-4 โคด LetterCount.java

บรรทัดท่ี 9 เปนการประกาศตัวแปรอารเรยของจํานวนเต็มมีช่ือวา upper และมีขนาดเทากับ 26 ซึ่งจะเทากับจํานวนของตัวอักษรพิมพใหญในภาษาอังกฤษอารเรยนี้จะมีหนาท่ีสําหรับเก็บคาของแตละตัวอักษรท่ีถูกปอนเขามาวามีกี่ตัว

บรรทัดท่ี 10 เปนการประกาศตัวแปรอารเรยของจํานวนเต็มมีช่ือวา lower และมีขนาดเทากับ 26 ซึ่งจะเทากับจํานวนของตัวอักษรพิมพเล็กในภาษาอังกฤษ

Page 117: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

113

อารเรยนี้จะมีหนาท่ีสําหรับเก็บคาของแตละตัวอักษรท่ีถูกปอนเขามาวามีกี่ตัวเชนเดียวกับ upper

บรรทัดท่ี 15-16 เปนการแสดงขอความใหผูใชปอนขอความและขอความดังกลาวก็จะถูกเก็บใน line

บรรทัดท่ี 19 เปนการวนลูปตั้งแตตําแหนงท่ี 0 ถึงตําแหนงสุดทายของขอความ

บรรทัดท่ี 21 เปนการเรียกใชเมธอด charAt() ของคลาสString เพื่อใชในการหาวา ณ ตําแหนงตางๆของแตละการวนรอบ เปนตัวอักษรตัวใด จากนั้นนําตัวอักษรมาเก็บในตัวแปร current

บรรทัดท่ี 22-26 เปนการตรวจสอบวาตัวอักษรที่เก็บอยูในตัวแปร current นั้นเปนตัวอักษรพิมพใหญหรือพิมพเล็ก หากเปนตัวอักษรพิมพใหญ ก็จะนํามาลบกับตัวอักษร ‘A’ ท่ีทําเชนนี้เพราะเราจะไดทราบวาตัวอักษรดังกลาวเปนตัวใดเชนหากเปนตัวอักษร ‘B’ เมื่อนํามาลบกับ‘A’ แลวก็จะไดคาออกมาเปน 1 แลวหลังจากนั้นก็ทําการสั่งใหอารเรยท่ีตําแหนง’B’ นั้นเพิ่มคา และทําเชนเดียวกันกับตัวอักษรพิมพเล็ก

บรรทัดท่ี 27-28 หากตัวอักษรท่ีปอนเขามานั้นไมใชตัวอักษรพิมพใหญหรือพิมพเล็กก็แสดงวาเปนอักษรพิเศษตางๆ จึงใหทําการเพิ่มคากับตัวแปร other

บรรทัดท่ี 33-43 เปนการแสดงขอมูลท้ังหมดที่อยูในอารเรย upper และ lower วาตัวอักษรท่ีถูกปอนเขามานั้นเปนตัวใดบางและกี่ตัว

6.1.3 รายการคาเริ่มตน

ในบางครั้งผูพัฒนาอาจจะมีความตองการในการกําหนดคาเริ่มตนใหกับอารเรยเลย โดยไมตองการทําการรับคาจากผูใช สําหรับการกําหนดคาเริ่มตนสามารถทําไดตั้งแตในการสรางออบเจ็คและกําหนดคาเริ่มตนใหกับอารเรยไปพรอมกันโดยขอมูลแตละตัวจะอยูภายใตปกกาเปดและปด {…}

โดยขอมูลแตละตัวจะคั่นดวยเครื่องหมายคอมมา( , ) ซึ่งขนาดของอารเรยจะถูกกาํหนดโดยอัตโนมัติ โดยจะเทากับจํานวนของขอมูลในรายการคาเริ่มตน ดังตัวอยาง int scores = {147,323,89,933,540,269,97,114,298,476}; char[] letterGrades = {‘A’,’B’,’C’,’D’,’F’};

ตัวอยางของการกําหนดคาเริ่มตนใหกับอารเรยนั้นถูกแสดงในรูปที่ 6-5

Page 118: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

114

01 public class Primes 02 { 03 public static void main (String[] args) 04 { 05 int[] primeNums = {2, 3, 5, 7, 11, 13, 17, 19}; 06 07 System.out.println ("Array length: "+ primeNums.length); 08 09 System.out.println ("The first few prime numbers are:"); 10 11 for (int scan = 0; scan < primeNums.length; scan++) 12 System.out.print (primeNums[scan] + " "); 13 14 System.out.println (); 15 } 16 }

รูปที่ 6-5 โคด Primes.java

ผลลัพธของโปรแกรม

Array length: 8 The first few prime numbers are:

2 3 5 7 11 13 17 19 บรรทัดท่ี 5 เปนการกําหนดคาเริ่มตนที่เปนจํานวนเฉพาะ 8 จํานวนใหกับอารเรย

primeNums บรรทัดท่ี 7 เปนการนําความยาวของอารเรย primeNums มาแสดงจะเห็นวาความยาว

ของอารเรยจะถูกกําหนดขึ้นโดยอัตโนมัติ ท้ังๆท่ีไมไดทําการกําหนดใหแตอยางใด โดยใชคาคงที่ length

บรรทัดท่ี 11-12 เปนการวนลูปแสดงคาของอารเรย

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

6.1.5 อารเรยของออบเจ็ค

สมาชิกของอารเรยอาจเปนตัวแปรอางอิง การสรางอารเรยของตัวแปรอางอิงจะไดเนื้อท่ีสําหรับตัวแปรอางอิงเทานั้น เชน

Page 119: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

115

String[] words = new String[25]; ไมมีออบเจ็ค String ใดๆเลยที่ถูกสรางขึ้น แตจากตัวอยางจะเปนการสรางอารเรยจํานวน 25 ตัว หากเปนการสรางออบเจ็คจะตอง new แลวตามดวยคอนสตรัคเตอร

6.1.6 การแบงขอความ

เราสามารถใชเมธอดเพื่อทําการแบงขอความออกเปนสวนๆไดคือ เมธอด split ซึ่งเปนเมธอดของคลาส String เมธอดนี้เปนเมธอดของออบเจค็ การเรียกใชงานจึงเรียกผานตัวแปรอางอิง ซึ่งผลลัพธท่ีไดจะอยูในรูปอารเรยของString

ในการใชงานเมธอด split จะตองสงพารามิเตอรใหเมธอด split ซึ่งพารามิเตอรดังกลาวจะเปนการบอกวา ใหแบงขอความออกเปนสวนๆ โดยใชสัญลักษณใด String msg = “20-31-H1”; String[] items = msg.split(“-“); จะไดขอความ 3 ขอความ ถูกเปนอยูในอารเรย items คือ 20,30 และ H1 นั่นคือจะทําการแบงขอความ 20-30-H1 ดวยเครื่องหมาย –

6.1.7 การเรียงลําดับขอมูลอยางงาย

การเรียงลําดับขอมูลจะทําโดยการเปรียบเทียบขอมูลทีละคู หากขอมูลอยูไมเรียงลําดับ ใหสลับใหถูกตอง โดยจะตองทําซ้ําไปเรื่อยๆจนครบ n-1 รอบ ซึ่งจะพบวาขอมูลจะเรียงลําดับอยางเรยีบรอย

รูปที่ 6-6 แสดงการเรียงลําดับขอมูลอยางงาย

ตัวอยางโคดของการเรียงลําดับนั้นแสดงอยูในรูปที่ 6-7 ในคลาสSorts และการเรียกใชคลาสSorts

เพื่อเรียงลําดับจะแสดงอยูในรูปที่ 6-8 คลาส SortGrade

สําหรับคลาสSorts ท่ีสัมพันธกับ คลาส SortGrade นี้ จะอธิบายการทํางานจนถึงบรรทัดท่ี 17

สําหรับอีกหนึ่งเมธอดจะถูกอธบิายในตัวอยางถัดไป

Page 120: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

116

01 public class Sorts 02 { 03 public static void sort(int[] data) 04 { 05 int tmp; 06 for(int i = 0; i < data.length - 1; i++){ 07 for(int j = 0; j < data.length - 1; j++){

08 //เรียงจากนอยไปหามาก 09 if(data[j] > data[j+1]){

10 //เมื่อขอมูลอยูผิดลําดับ สลับตําแหนง 11 tmp = data[j]; 12 data[j] = data[j+1]; 13 data[j+1] = tmp; 14 } 15 } 16 } 17 } 18 19 public static void sort(Comparable[] data) 20 { 21 Comparable tmp; 22 for(int i = 0; i < data.length - 1; i++){ 23 for(int j = 0; j < data.length - 1; j++){

24 //เรียงจากนอยไปหามาก 25 if(data[j].compareTo(data[j+1]) > 0){

26 //เมื่อขอมูลอยูผิดลําดับ สลับตําแหนง 27 tmp = data[j]; 28 data[j] = data[j+1]; 29 data[j+1] = tmp; 30 } 31 } 32 } 33 } 34 }

รูปที่ 6-7โคด Sorts.java

คลาส Sorts มีเมธอด sort ท่ีใชในการเรียงลําดับโดยมีการใชงานแบบ overload โดยมีการรับคาแบบอารเรยของ int และมีการรับคาเปนอารเรยของ Comparable จากนั้นจึงนํามาเรียงลําดบั

บรรทัดท่ี 6-7 เปนการวนลูปโดยใชคําสั่ง for โดยในการวนนี้ จะทําการวนทั้งหมด n-1

ตําแหนงหรือ data.length – 1 สําหรับการวนในบรรทัดท่ี 7 นี้จะเปนการ วนจับคูเพื่อหาขยับตัวเลขที่มีคานอยนํามาวางดานหนา

บรรทัดท่ี 9-14 เปนการตรวจสอบวาขอมูลท่ีอยูตําแหนงปจจุบันมีคามากกวาตําแหนงถัดไปหรือไม หากเปนจริงหรือมากกวา เราก็จะตองทําการสลับท่ีของขอมูลโดยใหขอมูลของตําแหนงปจจุบันไปอยูในตําแหนงถัดไป และนําขอมูลท่ีอยูในตําแหนงถัดไปมาใสไวในตําแหนงปจจุบัน โดยนําคาของขอมูลท่ีอยูตําแหนงปจจุบัน ไปเก็บไวในตัวแปรtmp กอน จากนั้นนําขอมูลของตําแหนงถัดไป ไปใหกับตําแหนงปจจุบัน(การทําเชนนี้เปนการ

Page 121: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

117

นําคาท่ีนอยกวาใหกับตําแหนง j ) จากนั้นก็นําคาท่ีอยูในตัวแปร tmp ซึ่งเปนคาท่ีมากกวามาใหกับตําแหนงถัดไปหรอื ตําแหนง j+1

สําหรับคลาส SortGrade เปนการคลาสที่ตองการเรียงตัวเลขจากนอยไปมาก ดังนั้นจึงตองมีการสงผานคาขอมูลท่ีตองการเรียงไปใหกับเมธอดsort

01 public class SortGrade 02 { 03 public static void main(String[] args) 04 { 05 int[] grades = {5, 8, 3, 10, 9, 4, 1, 2}; 06 Sorts.sort(grades); 07 08 for(int i = 0; i < grades.length; i++) 09 System.out.println(grades[i]); 10 } 11 }

รูปที่ 6-8 โคด SortGrade.java

บรรทัดท่ี 5 เปนการสรางตัวแปรอารเรยของ int ท่ีช่ือวา grades โดยมีการกําหนดคาไปพรอมกันดวย

บรรทัดท่ี 6 เปนการสงผานพารามิเตอรเปนอารเรยของ int โดยหากมีการเปลี่ยนแปลงคาใดๆเกิดข้ึนก็จะสงผลถึงคาเดิมของสมาชิกของอารเรยgrades ดวยเชนกัน เนื่องจากการสงพารามิเตอรเปนอารเรยจะใหผลเสมือนการสงพารามิเตอรเปนตัวแปรอางอิงเพระวาอารเรยถือเปนออบเจ็ค สําหรับเมธอด sort ท่ีถูกเรียกนี้จะเปนเมธอด sort ท่ีอยูในบรรทัดท่ี 3

เพราะเมธอดนี้ตองการพารามิเตอรท่ีเปนอารเรย

6.1.8 การเรียงลําดับออบเจ็ค

ในการเรียงลําดับจะตองมีการเปรียบเทียบโดยขอมูลชนิดพื้นฐานจะสามารถเปรียบเทียบผานตัวดําเนินการ จากตัวอยางของเมธอด sort ในคลาส Sorts จะใชเครื่องหมายมากกวา (>) แตสําหรับการเปรียบเทียงออบเจ็คจะไมสามารถเปรียบเทียบผานตัวดําเนินการได ดังนั้นในการเปรียบเทียบออบเจ็คจะตองเปรียบเทียบผานเมธอดชื่อ compareTo ซึ่งจะตองมีการอิมพลีเมนตอินเตอรเฟซชื่อ Comparable สําหรับตัวอยางของการเรียงลําดับออบเจ็คนี้มีคลาส 3 คลาสที่เกี่ยวของกับการเรียงลําดับคือ • คลาส Sorts ในรูปที่ 6-7 จะเห็นวาเมธอด sort ในบรรทัดท่ี 19 นั้นจะเปนการเปรียบเทียบ

ออบเจ็คโดยพารามิเตอรท่ีรับเขามานั้นจะเปนออบเจ็คของอินเตอรเฟซ Comparable สังเกตเห็นวากระบวนการการเปรียบเทียบจะไมเปรียบเทียบผานเครื่องหมายดําเนินการแลว แตจะผานเมธอดที่ช่ือ compareTo แตหลักการเปรียบเทียบโดยการจับทีละคูนั้นก็ยังเปน

Page 122: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

118

เชนเดิม ดังนั้นเราจึงตองทําการกําหนดการเรียงลําดับออบเจ็คในเมธอด compareTo จึงทําใหเราตองทําการอิมพลีเมนตอินเตอรเฟซ Comparable และรายละเอียดท้ังหมดก็จะแสดงในคลาส Contact

• คลาส Contact แสดงในรูปที่ 6-9

01 public class Contact implements Comparable 02 { 03 private String firstName, lastName, phone; 04 05 public Contact (String first, String last,String telephone) 06 { 07 firstName = first; 08 lastName = last; 09 phone = telephone; 10 } 11 12 public String toString () 13 { 14 return lastName + ", " + firstName + "\t" + phone; 15 } 16 public int compareTo (Object other) 17 { 18 int result; 19 20 if (lastName.equals(((Contact)other).lastName)) 21 result=firstName.compareTo(((Contact)other).firstName); 22 else 23 result = lastName.compareTo(((Contact)other).lastName); 24 25 return result; 26 } 27 }

รูปที่ 6-9โคด Contact.java

บรรทัดท่ี 1 เปนการประกาศคลาสชื่อ Contact โดยอิมพลีเมนตอินเตอรเฟซ Comparable

บรรทัดท่ี 3 เปนการประกาศตัวแปรชนิดสตริงช่ือ firstName, lastNameและ phone เพื่อทําการเก็บช่ือ,นามสกุล และ เบอรโทรศัพท ตามลําดับ

บรรทัดท่ี 5 คอนสตรัคเตอร Contact เปนการกําหนดคาเริ่มตนใหกับตัวแปร

firstName, lastNameและ phone บรรทัดท่ี 12 เมธอด toString () เปนเมธอดที่ใชสําหรับแสดงรายละเอียดของออบเจ็ค

โดยใหคากลับเปนสตริง บรรทัดท่ี 16-25 เมธอด compareTo จะมีการรับพารามิเตอรเปนออบเจ็คของคลาส

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

Page 123: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

119

นามสกุลมาเปรียบเทียบกัน ท้ังนี้สําหรับการวนรอบและการเปรียบเทียบกันทีละคู จะอยูภายใตการทํางานของเมธอด sort ในคลาส Sorts

• คลาส SortPhoneList เปนคลาสที่ตองการเรยีงลําดับออบเจค็ซึ่งแตละ ออบเจ็คจะประกอบไปดวยช่ือ,นามสกลุ และเบอรโทรศัพท ดังรูปท่ี 6-10

01 public class SortPhoneList 02 { 03 public static void main (String[] args) 04 { 05 Contact[] friends = new Contact[7]; 06 07 friends[0] = new Contact ("John","Smith","610-555-7384"); 08 friends[1] = new Contact ("Sarah", "Barnes", "215-555-3827"); 09 friends[2] = new Contact ("Mark", "Riley", "733-555-2969"); 10 friends[3] = new Contact ("Laura", "Getz", "663-555-3984"); 11 friends[4] = new Contact ("Larry", "Smith", "464-555-3489"); 12 friends[5] = new Contact ("Frank", "Phelps", "322-555-2284"); 13 friends[6] = new Contact ("Marsha", "Grant", "243-555-2837"); 14 15 Sorts.sort(friends); 16 17 for (int index = 0; index < friends.length; index++) 18 System.out.println (friends[index]); 19 } 20 }

รูปที่ 6-10โคด SortPhoneList.java

ผลลัพธของโปรแกรม

Barnes, Sarah 215-555-3827 Getz, Laura 663-555-3984 Grant, Marsha 243-555-2837 Phelps, Frank 322-555-2284 Riley, Mark 733-555-2969 Smith, John 610-555-7384 Smith, Larry 464-555-3489

บรรทัดท่ี 5 เปนการสรางอารเรยของตวัแปรอางอิงของคลาสContactโดยใหช่ือวา

friends บรรทัดท่ี 7-13 เปนการสรางออบเจ็คของสมาชิกแตละตัวของอารเรย

บรรทัดท่ี 15 เปนการเรียกใชงานเมธอด sort ของคลาส Sorts เพื่อใชเรียงลําดับออบเจ็ค โดยทําการสง อารเรยของออบเจ็คไป

บรรทัดท่ี 17-18 เปนการใชงานลูป for เพื่อแสดงรายละเอียดของสมาชกิแตละตัวของอารเรยของออบเจ็ค friends

Page 124: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

120

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

int[][] table = new int[3][5]; // อารเรย table มี 3 แถว แตละแถวจะมี 5 หลัก

หลักที่ 0 1 2 3 4 table แถวท่ี 0

แถวท่ี 1 แถวท่ี 2

ในการใชงานอารเรยสองมิตินั้นจะตองมีการระบุหมายเลขตําแหนงสองตัวคือ หมายเลขระบุแถวและหมายเลขระบุหลัก อารเรยท่ีมีมากกวาสองมิติก็ยังคงใชหลักการเดียวกัน โดยแตละมิติจะมี length เปนของตนเอง ตัวอยางของการใชอารเรย 2 มิติ ดังแสดงในรูปที่ 6-11 01 public class TwoDArray 02 { 03 public static void main (String[] args) 04 { 05 int[][] table = new int[5][10]; 06 /* 07 int[][] table = new int[3][]; 08 table[0] = new int[2]; 09 table[1] = new int[5]; 10 table[2] = new int[3]; 11 */ 12 13 // Load the table with values 14 for (int row=0; row < table.length; row++) 15 for (int col=0; col < table[row].length; col++) 16 table[row][col] = row * 10 + col; 17 18 // Print the table 19 for (int row=0; row < table.length; row++) 20 { 21 for (int col=0; col < table[row].length; col++) 22 System.out.print (table[row][col] + "\t"); 23 System.out.println(); 24 } 25 } 26 }

รูปที่ 6-11 โคด TwoDArray.java

Page 125: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

121

ผลลัพธของโปรแกรม 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49

บรรทัดท่ี 5 เปนการกําหนดอารเรยสองมติิของ int โดยใหช่ือวา table เปนจํานวน 5

แถว 10 หลัก บรรทัดท่ี14-16 เปนการใชงานลูป for สองชัน้เพื่อกําหนดคาใหกับอารเรยสองมิต ิโดยใน

ลูปแรก จะเปนการเริ่มตน วนที่แถว 0 กอน แลวก็วนในแตละหลักในแถว

0เมื่อทําการวนทุกหลักแลว จึงใหมาทําการวนที่แถวตอมาซึ่งคือแถวที่ 1 จากนั้นก็จะทําการวนในแตละหลักอีกครั้ง ทําเชนนี้ไปเรื่อยๆจนครบทุกแถว

ในการหาวาอารเรยนั้นมีกี่แถวสามารถทําไดโดยใช table.length และสําหรับการหาคาวาแตละแถวมีกี่หลักนั้นจะใช table[row].length

บรรทัดท่ี19-24 เปนการใชงานลูป for สองชั้นเพื่อแสดงคาของอารเรยสองมิติ หมายเหตุ สําหรับคําสั่งในบรรทัดท่ี 7-10 นั้น เปนการกําหนดคาใหแตละแถวของอารเรยมีหลักที่ไมเทากัน ซึ่งสามารถทําได ดังนั้นหากนําเครื่องหมายอธิบาย /* … */ ในบรรทัดท่ี 6 กับ 11 ออก แลวใสเครื่องหมายอธิบาย // ในบรรทัดท่ี 5 แทน ผลลัพธของโปรแกรมจะเปนดังนี้ 0 1

10 11 12 13 14

20 21 22

6.2 คลาสเว็คเตอร(Vector)

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

• Vector จะเก็บเฉพาะตัวแปรอางอิง • ไมมีการใช[]เหมือนอารเรย • ขนาดหรือความจุสามารถขยายไดโดยอัตโนมัติ

คลาสVector มาจากแพกเกจ java.util ดังนั้นจะตองมีการนําเขาแพกเกจดังกลาวในการเขียนโปรแกรม และหากออบเจ็คภายใน Vector มีการอิมพลีเมนตอินเทอรเฟซ Comparable สามารถ

Page 126: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

122

นํา Vector ไปเรียงลําดับผาน Collections.sort() ได ซึ่ง Collections เปนคลาสมาจากแพกแก็จ java.util เชนเดียวกัน สําหรับตัวอยางในการใช คลาส Vector นี้จะมีอยูดวยกัน 2 ตัวอยางคือ • Beatles.java ดังแสดงในรูปท่ี 6-12 คลาส Beatles เปนคลาสที่แสดงการใชงานคลาสเว็ค

เตอรและเมธอดที่อยูในคลาสเว็คเตอร • SortPhoneList2.java ดังแสดงในรูปที่ 6-13 คลาส SortPhoneList2 เปนคลาสที่ตองการ

เรียงลําดับออบเจ็คเชนกันตัวอยางกอนหนานี้ แตข้ันตอนจะสะดวกกวา 01 import java.util.Vector; 02 03 public class Beatles 04 { 05 public static void main (String[] args) 06 { 07 Vector band = new Vector(); 08 09 band.add ("Paul"); 10 band.add ("Pete"); 11 band.add ("John"); 12 band.add ("George"); 13 14 System.out.println (band); 15 16 int location = band.indexOf ("Pete"); 17 band.remove (location); 18 19 System.out.println (band); 20 System.out.println ("At index 1: " + band.get(1)); 21 22 band.add (2, "Ringo"); 23 24 System.out.println (band); 25 System.out.println ("Size of the band: " + band.size()); 26 } 27 }

รูปที่ 6-12โคด Beatles.java

ผลลัพธของโปรแกรม [Paul, Pete, John, George] [Paul, John, George] At index 1: John [Paul, John, Ringo, George] Size of the band: 4

บรรทัดท่ี 7 เปนการสราง Vector โดยใชคําสั่ง new โดยกําหนดใหมีตัวแปรอางอิง

ช่ือ band

บรรทัดท่ี 9-12 เปนการเรียกใชเมธอด add ของคลาสVector เพื่อทําการเก็บคาลงไปใน Vector ท้ังนี้เว็คเตอรจะทําการเรียงลําดับของขอมูลท่ีปอนเขาไปให

Page 127: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

123

โดยอัตโนมัติ ซึ่งในที่นี้ก็จะเรียงลําดับดังนี้ Paul, Pete, John และ George

บรรทัดท่ี 14 เปนการแสดงคาท้ังหมดของ Vector

บรรทัดท่ี 16 เปนการหาตําแหนงของ Pete โดยการเรียกใชงานเมธอด indexOf ซึ่งในท่ีนี้ตําแหนงของ Pete คือ 1 จากนั้นนําคา 1นี้ไปเก็บไวในตัวแปร location โดยหากหา Pete ไมเจอจะมีการคืนคาเปน -1

บรรทัดท่ี 17 เปนการลบคาตําแหนงของ Pete โดยใชเมธอด remove ดังนั้นมีการถอยรนตําแหนงของ John ลงมาแทนที่ตําแหนงของ Pete และ ตําแหนงของ George ก็จะมาแทนที่ John

บรรทัดท่ี 19 เปนการแสดงคาท้ังหมดของ Vector หลังจากที่ลบ Pete ออกไป บรรทัดท่ี 20 เปนการพิมพคาโดยมีการเรียกดูคาในตําแหนงท่ี 1 ของ Vector ผานทาง

เมธอด get โดยมีการสงพารามิเตอรเปนตําแหนงท่ีตองการ

บรรทัดท่ี 22 เปนการใชงานเมธอด add อีกครั้ง ในที่นี้จะเปนการเพิ่มช่ือของ Ringo

ลงไปในตําแหนงท่ี 2 ซึ่งเปนตําแหนงของ George ทําใหเกิดการถอยของ George

01 import java.util.Vector; 02 import java.util.Collections; 03 04 public class SortPhoneList2 05 { 06 public static void main (String[] args) 07 { 08 Vector friends = new Vector(); 09 10 friends.add(new Contact ("John", "Smith", "610-555-7384")); 11 friends.add(new Contact ("Sarah", "Barnes", "215-555-3827")); 12 friends.add(new Contact ("Mark", "Riley", "733-555-2969")); 13 friends.add(new Contact ("Laura", "Getz", "663-555-3984")); 14 friends.add(new Contact ("Larry", "Smith", "464-555-3489")); 15 friends.add(new Contact ("Frank", "Phelps", "322-555-2284")); 16 friends.add(new Contact ("Marsha", "Grant", "243-555-2837")); 17 18 Collections.sort(friends); 19 20 for (int index = 0; index < friends.size(); index++) 21 System.out.println (friends.get(index)); 22 } 23 }

รูปที่ 6-13โคด SortPhoneList2.java

ผลลัพธของโปรแกรม Barnes, Sarah 215-555-3827 Getz, Laura 663-555-3984 Grant, Marsha 243-555-2837 Phelps, Frank 322-555-2284

Page 128: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

124

Riley, Mark 733-555-2969 Smith, John 610-555-7384 Smith, Larry 464-555-3489

บรรทัดท่ี 8 เปนการสรางตัวแปรอางอิงช่ือวา friends จากคลาส Vector

บรรทัดท่ี 10-16 เปนการกําหนดรายละเอียดขอมูลของแตละออบเจ็ค โดยใชเมธอด add

สําหรับพารามิเตอรท่ีใสลงไปในเมธอดนี้ จะเปนออบเจ็คเนื่องจากเว็คเตอรนั้น จะเก็บแตตัวแปรอางอิงเทานั้น

บรรทัดท่ี 18 เปนการเรียกใชงานเมธอด sort ของคลาส Collections เพื่อใชในการเรียงลําดับคาในเว็คเตอร

6.3 อารเรยกับกราฟฟก

อารเรยมีสวนชวยมากในการจดัการทางดานกราฟฟก เชน รูปหลายเหลี่ยมเกิดจากการกําหนดคาภายในอารเรย ซึ่งใชในการสรางโพลีกอนและโพลีไลน ดังนั้นเราจะใชอารเรยในการเก็บจุดพิกัดตางๆของรูปที่เราตองการจะทําการสราง ดังตัวอยางในคลาส Rocket รูปที่ 6-14 โพลีไลนจะคลายกับโพลีกอน(รูปหลายเหลียม)ยกเวนจุดสุดทายของโพลีไลนจะไมเช่ือมกับจุดแรก ดังนั้นเราจะระบายสีโพลีไลนไมได ผลลัพธของโปรแกรมคลาส Rocket

Page 129: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

125

01 import javax.swing.JFrame; 02 import java.awt.*; 03 04 public class Rocket extends JFrame 05 { 06 private final int WIDTH = 200; 07 private final int HEIGHT = 200; 08 09 private int[] xRocket = {100, 120, 120, 130, 130, 70, 70,

80, 80}; 10 private int[] yRocket = {15, 40, 115, 125, 150, 150, 125,

115, 40}; 11 12 private int[] xWindow = {95, 105, 110, 90}; 13 private int[] yWindow = {45, 45, 70, 70}; 14 15 private int[] xFlame = {70,70,75,80,90,100,110,115,120, 16 130, 130}; 17 private int[] yFlame = {155, 170, 165, 190, 170, 175, 160,

185, 160, 175, 155}; 18 19 public void paint (Graphics page) 20 { 21 setBackground (Color.black); 22 page.setColor (Color.cyan); 23 page.fillPolygon (xRocket, yRocket, xRocket.length); 24 25 page.setColor (Color.gray); 26 page.fillPolygon (xWindow, yWindow, xWindow.length); 27 28 page.setColor (Color.red); 29 page.drawPolyline (xFlame, yFlame, xFlame.length); 30 } 31 32 public Rocket(){ 33 setSize(WIDTH, HEIGHT); 34 setUndecorated(true); 35 setVisible(true); 36 setDefaultCloseOperation(EXIT_ON_CLOSE); 37 } 38 39 public static void main(String[] args) 40 { 41 new Rocket(); 42 } 43 }

รูปที่ 6-14โคด Rocket.java

บรรทัดท่ี 9-10 เปนการสรางอารเรย int เก็บคาของตําแหนง x และ y เพื่อใชในการวาด

รูปจรวด บรรทัดท่ี 12-13 เปนการสรางอารเรย int เก็บคาของตําแหนง x และ y เพื่อใชในการวาด

รูปหนาตาง บรรทัดท่ี 15-17 เปนการสรางอารเรย int เก็บคาของตําแหนง x และ y เพื่อใชในการวาด

รูปเสนไอพนของจรวด

Page 130: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

126

บรรทัดท่ี 19-29 เปนการใชงานเมธอด paint เพื่อทําการระบายสีใหกับจรวดโดยผานตัว

แปรอางอิง page ของคลาส Graphics

สรุปทายบท

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

คําถามทายบทที ่6

1. จากการประกาศและสรางอารเรยในแตละขอ จงหาวาขอใดถูก ขอใดผิด 1.1. int num[];

1.2. double[] nums;

1.3. char ch[6];

1.4. String[3] str;

1.5. int[] score = new int[];

1.6. int[] a,b,c; จะมีความหมายเหมือนกับ int a[],b,c;

1.7. double[] d; d = new double[3];

1.8. int[] high= new [4];

1.9. char ch[]=[‘B’, ‘A’];

1.10. int[] x = new int [2]; x[1] = 8; x[2] = 12;

1.11. char text[][] = new char [][4];

1.12. int[][] x = new int [3][]; 1.13. String[] handsome = new String[25]; มีออบเจ็คที่ถูกสรางขึ้น 25 ออบเจ็ค

1.14. int[][] a = new int [2][3]; a[0][0] = 1; a[0][1] = 2; a[1][0] = 4;

การกําหนดคาอารเรยa ดังกลาวจะเหมือนกับการกําหนดคาดานลาง int[][] a = {{1,2},{4}};

Page 131: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

127

2. จงหาผลลัพธของโปรแกรม

10 class Test 11 { 12 public static void main(String [] args) 13 { 14 String msg = "COE-PSU-AC-TH"; 15 String meaning = "Handsome MAN-Best University-Academy-

Smile Country"; 16 String[] items1 = msg.split("-"); 17 String[] items2 = meaning.split("-"); 18 19 for(int i = 0; i<4; i++){ 20 System.out.println(items1[i]+"="+items2[i]); 21 } 22 }

3. จากสวนหนึ่งของโปรแกรมที่กําหนดใหดานลาง จงตอบคําถาม

int [][] a = {{1,3,5},{2,4},{4,5,6,7},{0}}; int len=a.length;

3.1. จงหาคาของ len

3.2. System.out.println(a[1].length); 3.3. System.out.println(a[2].length+ a[3].length); 3.4. System.out.println(a[4].length);

4. จงหาผลลัพธของโปรแกรม

01 import java.util.Vector; 02 03 public class Car 04 { 05 public static void main (String[] args) 06 { 07 Vector car = new Vector(); 08 09 car.add (new String ("Honda")); 10 car.add (new String ("Toyota")); 11 car.add (new String ("Ford")); 12 car.add (new String ("BMW")); 13 System.out.println (car); 14 15 car.add (car.size(), "Volvo"); 16 System.out.println (car); 17 18 car.remove ("Honda"); 19 System.out.println (car); 20 21 System.out.println ("Size of the band: " + car.size()); 22 } 23 }

Page 132: สารบัญ - Prince of Songkla Universityfivedots.coe.psu.ac.th/~suthon/youngjava/slides_doc.pdf · 2 J2ME ย อมาจาก Java2, Micro Edition ใช สําหรับการพ

128

5. จงเขียนโปรแกรมหาผลบวกของเมทริก A และ เมทริก B โดย

• กําหนดคาเริ่มตนใหกับเมทริก A คือ {{1,2,3},{4,5,6},{7,8,9}};

• กําหนดคาเริ่มตนใหกับเมทริก B คือ {{10,20,30},{40,50,60},{70,80,90}};

• ใหนําผลท่ีไดจากการบวกของทั้ง 2 เมทริก มาเก็บที่เมทริก C แลวแสดงผลลัพธใหไดดังนี้ 11 22 33

44 55 66

77 88 99