i
สารบัญ กอนจะถึง Java 1 intro. to Java (FEU.faa)
บทที่ 1 21
บทท่ี 2 1.1 ทาํ ไมถงึ เลอื ก Java เปนภาษาในการเขยี น code
1.2 กอ นทเ่ี ราจะเขยี นโปรแกรมดว ย Java ตองมีอะไรบา ง 75
บทท่ี 3 1.3 เตรียมความพรอ ม
1.3.1 ติดต้งั JDK
1.3.2 การกําหนด path
1.4 เขียน code แบบ application หรือ applet
1.5 เครอ่ื งมือหรือคาํ ส่งั (SDK tools) ทตี่ องใชในการพฒั นาโปรแกรม
1.6 การสรางโปรแกรม Java ท่ีเปน application
1.6.1 การ compile โปรแกรม HelloWorld
1.6.2 การ execute โปรแกรม HelloWorld
1.6.3 สรุปขัน้ ตอนของการพัฒนาโปรแกรมท่เี ปน application
1.7 การสรางโปรแกรม Java ท่เี ปน applet
1.7.1 สรุปขัน้ ตอนการเขยี นโปรแกรมแบบ applet
1.8 การเขียน Java program ดว ย Crimson Editor
1.9 การใช NetBeans 5.0 สําหรบั การพัฒนาโปรแกรม
1.10 ทีม่ าของ Java โดยสงั เขป
ขอมูล ตวั แปร และ การประมวลผล
2.1 ขอมูล และ ตวั แปร (data and variables)
2.2 ชนดิ ของขอมูล (datatype)
Keyword
Primitive datatype
2.3 ตัวอยางการประกาศตัวแปร
2.3.1 การกําหนดคาใหกับตวั แปร
2.3.2 การกาํ หนดคาใหกบั ตัวแปรภายในโปรแกรม
2.4 การใช final ในการกําหนดคาใหกับตัวแปร
2.5 อายุ และ ขอบเขตการใชงาน (life-time and scope) ของตัวแปร
2.6 การสรางประโยค (statement and expression)
2.7 การประมวลผล
2.7.1 การประมวลผลขอมลู ทเ่ี ปน integer
2.7.2 การประมวลผลดวย integer ขนาดเล็ก
2.7.3 การเปลย่ี นแปลงชนดิ ของขอ มูล (casting)
2.8 การประมวลดว ยตวั แปรท่มี จี ุดทศนยิ ม (Floating-point Calculations)
2.8.1 การใช printf() ในการแสดงผล
2.8.1.1 การใชเ ครอื่ งหมายอืน่ ๆ (flag) ใน printf()
2.8.2 การใช format() แทน printf()
2.8.3 การแสดงผลที่ไมตองใชค าํ วา System นําหนา
2.9 การประมวลผลขอ มูลตางชนดิ กัน (Mixed Type Calculations)
2.9.1 Autoboxing และ Unboxing
2.10 การประมวลผลตัวเลขท่มี ีขนาดใหญ
2.10.1 การใช BigInteger
2.11 การใช Mathematical Functions ตา ง ๆ ที่ Java มใี ห
2.12 การใชข อ มลู ท่ีเปนตัวอักษร (char)
2.13 การใชตัวแปรชนดิ boolean
Logical operator
Relational operator
2.14 การประมวลระดับ bit ดว ยการใช operator shift และ bitwise
2.15 การกําหนดคาใหต วั แปรผา นสื่อการนําเขา ขอ มูลมาตรฐาน
2.15.1 การนําขอ มูลเขา ผา นทาง Scanner
2.15.2 การนาํ ขอมูลเขาและออกผา น Dialog Box
2.16 การใช enum
การตัดสินใจ และการประมวลผลแบบวน
3.1 การตัดสนิ ใจ และ การเปรยี บเทยี บ
3.1.1 การใช if เพอื่ การตัดสนิ ใจ
3.1.2 การใช if ในประโยคทม่ี ีมากกวา หนง่ึ ประโยค (if-block)
3.1.3 การใช enum กับ if-else
3.2 การใช Conditional operator (? :)
3.3 การใชค าํ ส่งั switch
3.4 การทาํ งานแบบวน (Repetition หรือทีเ่ รยี กกันงาย ๆ วา Loop)
3.4.1 การใช for/loop
3.4.1.1 การใช for-in/loop (for/each)
3.4.2 การใช while/loop
ii
บทที่ 4 3.4.3 การใช do-while/loop 117 intro. to Java (FEU.faa)
บทที่ 5 3.5 การใช break และ continue 159
3.6 การใช loop ใน loop
บทที่ 6 3.7 การใช label continue และ label break ใน for/loop 207
Array และ String
4.1 อารเรย (Array)
4.2 การกําหนดคา เบอ้ื งตนใหก ับ Array
4.3 การอางถึง array ดวยการ clone และการ copy array
4.4 การใช array แบบยืดหยุน (Dynamic Array)
4.5 การคนหาขอมลู ใน array (Searching)
4.5.1 การคนหาแบบตามลาํ ดับ (Sequential search)
4.5.2 การคน หาแบบไบนารี (Binary search)
4.6 การจัดเรยี งลาํ ดบั (sort) ขอมลู ใน array
4.7 การสรา ง array ทมี่ ขี อ มลู เปน array (Array of arrays)
4.7.1 การใช array ที่มีจาํ นวนของขอมลู ในแตละแถวไมเ ทากนั
4.8 String
4.8.1 Array of characters
4.8.2 String ใน Java
4.8.3 การเปรียบเทียบ String
4.8.4 การเปรียบเทยี บความไมเทา กันของ String
4.8.5 การเขาหาตวั อกั ษรที่อยูใน String
4.8.6 การใช class StringBuffer ในการสรา ง String
4.8.7 การกาํ หนดใหข อมลู ของ array เปน String (Array of Strings)
Objects และ Classes
5.1 Class และ Object
[Class Modifier]
[Field Modifier]
5.1.1 Object และองคป ระกอบของ object
[สิง่ ท่ตี องคิดเมอื่ ออกแบบ Class (เมอ่ื สราง Object)]
5.1.2 ขอ แตกตา งระหวาง class กบั object
5.2 Method (สงิ่ ที่ object ทาํ ได)
5.2.1 การเขา หาตวั แปร และ method ของ class
5.2.2 การสรา ง method
[Method Modifier]
5.2.3 กระบวนการท่เี กิดขึน้ เมื่อมีการใช parameter list
5.2.4 การสง คาอา งอิง (Passing object's reference)
[การสลับคา ของส่ิงสองสิง่ ]
5.3 การเขา หา field ของ class (attributes หรอื access modifier)
[finalize method]
5.4 Constructor อีกคร้ัง
[initialization blocks]
[static initialization blocks]
[constructor overloading]
5.4.1 การเรยี ก constructor จาก constructor
[this]
5.5 การ overload method
5.5.1 การสง parameter แบบไมจาํ กดั จํานวน (Varargs)
5.6 การสรา ง class ภายใน class (nested class)
5.6.1 ตวั อยา งการสราง class: MyArray
5.7 Generic Class
[การสงคาที่เปน generic ออกจาก generic array]
[การกําหนดขอบเขตของ type variable]
5.8 Package
5.8.1 การสราง package
Classes และการถายทอดคุณสมบัติ
6.1 การสรา ง class ใหมจาก class เดิมและการถา ยทอดคณุ สมบัติ
[Access Modifier: protected]
6.1.1 ลาํ ดับการเรยี ก constructor
6.1.2 การ override method ใน class แมจาก class ลูก
6.2 Polymorphism (ความมรี ปู แบบท่หี ลากหลาย)
6.3 method กับความมรี ปู แบบทห่ี ลากหลาย
6.4 การสรา ง interface
[การใช interface Comparable เพ่ือเปรยี บเทียบ object]
iii
6.4.1 การถา ยทอดคณุ สมบัติจากหลายแหลง (Multiple Inheritance) intro. to Java (FEU.faa)
6.5 การใช interface ActionListener ของ Java
บทท่ี 7 การตรวจสอบและดกั จับ Error (Exceptions) 231
บทที่ 8
บทที่ 9 7.1 การตรวจสอบ error
บทที่ 10
7.2 การสราง exception ขึ้นมาใชเ อง
บทท่ี 11 7.3 การใช Assertions
Streams I/O 245
8.1 Streams
8.2 การเรยี กใช class File
8.3 Input and Output streams (ชองทางขอ มูลเขา /ออก)
8.3.1 Text File (ไฟลทเี่ กบ็ ขอมูลเปน character)
8.3.2 การสราง Sequential Access File (record)
8.3.3 การสรา ง Binary File ในรปู แบบตา ง ๆ
8.4 การทาํ งานกับ Random-access file
8.4.1 การปรบั ปรงุ (Update) ขอมูลในไฟล
Thread 275
9.1 Thread คอื อะไร
9.2 การสรา ง Thread เบอื้ งตน จาก class Thread
9.4 การสราง Thread เบ้ืองตนจาก Interface Runnable
9.5 Priority ของ Thread
9.6 Thread Synchronization (การประสานเวลาการทํางาน)
9.6.1 การใช locks ในการประสานเวลา
9.6.2 การใช synchronized ในการประสานเวลา
9.6.3 Deadlock
Graphics Programming 299
10.1 Simple Window
10.2 การวางตําแหนงของหนา ตา งบนจอ
10.3 การแสดงขอมลู ในหนาตางดวยการวาด
10.3.1 การวาดเสน (Line)
10.3.2 การวาดรูปเหลย่ี ม
10.3.3 การวาดรปู หลายเหลี่ยม (Polygon)
10.3.4 การวาดรูปวงรี (Oval)
10.4 การวาดรูปทรงสองมติ จิ าก Graphics2D
[การกําหนดรปู แบบ (style) ของเสน
10.4.1 การสรา งเสน โคง (Quadratic and Cubic Curves)
10.4.2 การแสดงผลของพืน้ ทที่ ่ีทบั ซอนกัน (Area)
10.4.3 การยายภาพ (Translation)
10.4.4 การหมนุ ภาพ (Rotation)
10.4.5 การปรบั เปลย่ี นขนาด (Scale) และการเปลยี่ นรูป (Shear)
10.4.6 การกําหนดความโปรงแสง (Transparency)
10.5 การใช Font
[การใช class FontMetrics ในการแสดงขอความ]
10.6 การแสดง Image
10.7 การตัดภาพ (Clipping)
10.8 การสรา งภาพเคลอ่ื นไหวอยา งงาย (Simple Animation)
10.8.1 การใช class Timer ควบคมุ การเคลอ่ื นท่ขี องภาพ
10.8.2 การสราง Off-screen Image และการสรา งภาพเคลอ่ื นไหวดวย Thread
10.8.2.1 การเคลื่อนยา ยขอ ความ
10.8.2.2 การเคล่ือนยาย image (Image Animation)
[การใช mouse เคล่อื นยา ยภาพ]
GUI และ Event Handling เบื้องตน 343
11.1 การสราง Swing Application อยางงา ย
[การสรางปุม ดว ย JButton]
[การสราง JLabel]
[การใส Icon ในปุม]
[การดักฟงเหตกุ ารณ (Event Listener)]
[การสนองตอบเหตุการณภายใน method actionPerformed()]
11.2 Layout Manager
แนะนําการจัดวางดวย [Flow layout]
iv
11.2.1 Border layout 403 intro. to Java (FEU.faa)
11.2.2 Grid layout
[การใช JPanel ในการจัดวาง Componenet]
[การกาํ หนดการทาํ งานของปมุ ในเครอ่ื งคดิ เลข]
11.3 JRadioButton และ JComboBox
[การใช BorderFactory]
11.4 JCheckBox, JTextField และ JTextArea
[การแสดงผลลัพธทันทีท่ผี ุใชเลือก check box]
11.5 JSlider และ JSpinner
11.6 JProgressBar และ ProgressMonitor
11.7 JFileChooser, JMenuBar, JMenu และ JMenuItem
[การใช Action ใน menu]
[Pop-up Menu]
[Accelerator ใน menu]
[Toolbar]
11.8 Swing กับ Netbeans 5.0
[การสรา ง GUI ดวย Netbeans]
[Design Area, Palette, Properties Window and Inspector]
[Running โปรแกรมภายนอก IDE]
ตารางตาง ๆ
ตาราง ASCII และ UNICODE (บางสว น)
ตาราง Constant ทใี่ ชบอ ย ๆ ในโปรแกรม
ตาราง ชนดิ ของขอ มลู
ตาราง Escape sequences
ตาราง Format ตาง ๆ สําหรบั ขอ มูลท่ีเปนตัวเลข
ตาราง การใชสัญลักษณแ สดงผลของ printf() และ format()
ตาราง การใช operator && || & และ |
ตาราง การใช operator shift << >> และ >>>
ในบทท่หี น่ึงนเี้ ราจะมาดกู ารตดิ ตง้ั เครอ่ื งมอื ท่ีใช ในการพัฒนาโปรแกรมดวยภาษา Java ตวั อยางการ intro. to Java (FEU.faa)
เขียนโปรแกรมในรูปแบบของ application และ การเขียนโปรแกรมในรปู แบบของ applet
หลังจากจบบทนแ้ี ลว ผอู านจะไดทราบถงึ
o การตดิ ตง้ั เครอ่ื งมือที่ใชในการพฒั นาโปรแกรมในภาษา Java
o ตวั อยางการเขยี นโปรแกรมในรปู แบบของ application
o ตัวอยา งการเขยี นโปรแกรมในรูปแบบของ applet
o ตัวอยางการเขยี น HTML ไฟลทใี่ ชในการ execute applet
o การเขียนโปรแกรม Java ดวย Crimson Editor
o Netbeans กับการเขยี นโปรแกรม
o ประวตั ิครา ว ๆ ของภาษา Java
1.1 ทําไมถึงเลือก Java เปน ภาษาในการเขยี น code
Java เปนภาษาท่นี กั พัฒนาโปรแกรมสามารถทจี่ ะเขียน code เพยี งครงั้ เดยี ว แลวนาํ ไปใชไดกบั
เคร่ือง computer ชนิด (platform) ตาง ๆ ได โดยไมต อ ง compile ใหม เชน ถา เราเขียนโปรแกรม
บนเครื่อง pc เราสามารถทีจ่ ะนําเอา code ท่ีได compile เรยี บรอยแลวไปใช (execute1) ในเครอ่ื ง
อนื่ ๆ ท่ไี มใช pc ได เชน apple, linux, unix, หรือ อน่ื ๆ ทม่ี ี JVM (Java Virtual Machine) อยู
Java เปนภาษาทไ่ี ดถกู พัฒนาขึ้นเพ่ือสนองตอการพฒั นาโปรแกรมในรูปแบบของการเขียนโปรแกรม
ที่เรยี กวา OOP หรือ Object-Oriented Programming ซงึ่ เปนภาษาท่ชี ว ยใหก ารพฒั นาโปรแกรมมี
ความยืดหยุน สงู ผเู ขยี น หรอื ผพู ฒั นาสามารถทจี่ ะสนองตอบความตอ งการของผใู ช (user) ได
มากกวาการพัฒนาในลกั ษณะของการเขยี นโปรแกรมแบบเดิม (procedural language
programming) และท่ีสําคญั อีกอยา งหน่ึงก็คือ Java เปน ภาษาทไ่ี มต อ งเสยี คา ใชจายใด ๆ เลย เรา
สามารถที่จะ download โปรแกรมสําหรบั การพัฒนาไดจากบริษทั Sun Micro System หรือที่อนื่ ๆ
ท่ที าง Sun ไดอ นญุ าตใหมกี าร download ได
1.2 กอนทเี ราจะเขยี นโปรแกรมดว ย Java เราตองมีอะไรบาง
1. เชนเดียวกันกบั การเขียนโปรแกรมในภาษาอ่ืน ๆ เราตอ งมี Text Editor ท่ีใชสรางและเก็บ
source code
2. JDK (Java Development Kit) ซ่ึงมหี ลาย version ลา สดุ ในขณะที่เขยี นตาํ ราเลม น้ี คอื J2SE
5.0 (jdk1_5_0) ซ่งึ download ไดที่ http://java.sun.com/j2se/1.5.0/download.jsp เรา
ตอ งใช JDK ในการ compile โปรแกรมที่เราไดเขียนขึน้
3. Java VM หรือที่เรียกวา Java Virtual Machine ซึง่ เปน ตวั กลางท่ีเปลีย่ น code ทีไ่ ดจากการ
compile เปน code ที่สามารถ execute บนเครื่องตา ง ๆ (code ทเ่ี ครอ่ื งนั้น ๆ รูจกั – machine
code หรอื ที่ชาว Java เรียกวา byte code) โดยปกติ VM จะถูกตดิ ต้งั พรอ มกับ JDK
ถาเรามอี ปุ กรณท ้งั หมดที่ไดกลาวมาแลว ขัน้ ตอนตอไปทเี่ ราตอ งทําเพื่อใหการพฒั นาโปรแกรมของ
เรา เปน ไปไดดวยความเรียบรอ ย (ไมมีอุปสรรคที่คาดไมถ งึ ) เราตอ งเตรยี มความพรอ มของเครื่อง
กอน
1 ในหนังสอื เลม นีก้ ารนาํ เอาโปรแกรมท่ี compile แลว ไปใชเราจะเรียกวาการ execute หรอื run ตามศัพทของภาษาอังกฤษ
เร่มิ ตนการเขียนโปรแกรมดว ย Java intro. to Java (FEU.faa)
1.3 เตรยี มความพรอ ม (สําหรบั pc)
1. ติดตั้ง JDK
2. กาํ หนดท่อี ยขู องไฟลตา ง ๆ (path) ทจ่ี าํ เปนสําหรับการ compile ภายในเครือ่ งเพ่ือใหก าร
compile และ execute โปรแกรมเปน ไปได – ถาเราไมกาํ หนด path เครือ่ งของเราจะไมร ูจัก
คําส่งั ตา ง ๆ ที่ Java ใช
1.3.1 ติดตงั้ JDK
เมื่อ download JDK มาแลว การติดต้ังก็ทําไดงา ย เนอื่ งจาก JDK เปนไฟลทีเ่ ราเรยี กวา self-
extracting file คือ ไฟลท จ่ี ะตดิ ต้ังโดยอัตโนมัตเิ ม่ือเรา execute (doubling click หรอื ดว ยวิธีการ
อื่น ๆ เชน click บน icon ของ file แลวกด enter) สาํ หรับไฟล j2se 5.0 นัน้ มีขนาดประมาณ 44 MB
ซงึ่ เปนไฟลท ่ีใหญพอสมควร และใชเวลานานในการ download (ถา speed ในการ download ไมดี
พอ) ซ่ึงเมอ่ื ขยายออกจะมขี นาดประมาณ 170 MB เพราะฉะน้ันเราตอ งเตรียมเนอื้ ที่ไวใ หเ หมาะสมใน
การตดิ ตั้ง JDK ถาหากวาเน้ือที่ในการจัดเก็บมนี อย เรากค็ วรใช JDK version อน่ื ๆ ท่ีมีขนาดเล็กกวา
หลังจากทีต่ ิดตงั้ J2se เรยี บรอยแลว ผอู านกค็ วรที่จะตดิ ตัง้ Java API (Application Programming
Interface) เพ่ือใหเปนการอา งอิงถงึ การใช class และ methods ตา งๆ ที่ Java มใี หซ ่งึ API นี้
สามารถ download ไดท่ี http://java.sun.com/j2se/1.5.0/download.jsp เมอื่ ไดไ ฟลมาแลว กท็ าํ
การแตกไฟล (upzip) ไวใ นท่ีๆ เขา หาไดง า ย และถาหากผูอา นอยากท่จี ะดูวา code ของ Java
หนา ตาเปนยังไงก็สามารถ unzip source code ทีม่ ากับ J2se ได
หลงั จากที่ไดต ดิ ตง้ั J2se พรอมทัง้ ไฟลอ ่นื ๆ แลวหนาตาของ directory ของ Java ก็จะมี folder
ตางๆ คลา ยๆ กบั ทเี่ ห็นน้ี
bin – ท่ีเกบ็ compiler และเครอื่ งมอื อ่ืน ๆ
demo – เกบ็ ตัวอยา งการใชง าน Java
docs – เก็บรายละเอียด API
include – เกบ็ method พ้นื ฐานตาง ๆ ของ Java
jre – เกบ็ ไฟลตาง ๆ ท่ีเกีย่ วของกับการ run โปรแกรม
lib – เก็บไฟลท ่ีใชในการทํางาน
sample – เกบ็ ตวั อยางโปรแกรม
src – เกบ็ source code ของ Java
ภาพท่ี 1-1 Folder ทอ่ี ยูใต j2sdk1.5.0 หลังจากการติดตั้งไฟลท เี่ กีย่ วของ
1.3.2 การกาํ หนด path
ถา การพฒั นาโปรแกรมเปนการพัฒนาบนเครื่อง Windows 9x การกําหนด path กส็ ามารถทจี่ ะทาํ ได
ดว ยวธิ กี ารตาง ๆ ดังน้ี
1. เปดไฟล autoexec.bat แลว เพ่ิม path ท่ีไดต ิดตั้ง JDK ไว ซงึ่ ถา เราติดตงั้ J2SDK 1.5.0 ไวใ น
drive c การกําหนด path ในไฟล autoexec.bat ก็ทาํ ไดดงั น้ี
ใสคาํ สง่ั set path=c:\j2sdk1.5.0\bin ในบรรทัดใหมถายังไมมีมีคาํ สั่ง set path อยูเลย แตถา
มกี ารใช คาํ สั่ง set path อยแู ลว ก็ใหใ ส ; (semicolon) หลงั ตัวสดุ ทา ยของ path แลวจึงใส
c:\j2sdk1.5.0\bin
2. หรอื เราอาจกาํ หนด path ทุกคร้งั กอ นการเขียนโปรแกรม (ถา เราไมไดก าํ หนดในไฟล
autoexec.bat) โดยไปท่ี Command Prompt (หรอื ท่ีรูจกั กันในคนรนุ เกาวา dos window) และ
set path บน Command Prompt ดงั ท่เี ห็นในภาพ
2
บทที่ 1: กอนจะถงึ Java intro. to Java (FEU.faa)
ภาพที่ 1-2 การกาํ หนด path ของ Java
3. ทาํ การพฒั นาโปรแกรมใน directory ทีม่ ี JDK อยู เชนเปลี่ยน drive ไปท่ี c:\j2sdk1.5.0\bin
แลว เรมิ่ ทํางานใน directory น้ี ไฟลท กุ ตวั ทเ่ี กยี่ วของกับการเขยี นโปรแกรมจะตอ งเก็บไวทีน่ ่ี –
วิธนี ี้ ไมแ นะนาํ เพราะจะทาํ ให directory ของ java เปรอะไปดวยไฟลท่ีเราเขยี นขนึ้ เอง
ถาเราใช Windows XP หรือ Windows 2000 การกาํ หนด path ทําไดด ว ยขน้ั ตอนตอไปน้ี
(Windows XP และ Windows 2000 ใชคาํ ส่ังทีแ่ ตกตา งกันนิดหนอย ตัวอยา งท่ีทําใหดูน้ี เปนการ
กาํ หนด path บนเคร่ืองที่ใช Windows XP)
1. กดปมุ ขวาของ mouse บน icon My Computer (หรือ ไปที่ปุม start ท่ีมุมลา งซายของจอแลว
เลอื ก My Computer) แลว เลอื ก Properties
ภาพที่ 1-3 การเขาหา My computer
2. กดปมุ advanced บน System Properties
ภาพท่ี 1-4 ปุม Advanced
3
เริ่มตนการเขียนโปรแกรมดว ย Java intro. to Java (FEU.faa)
3. กดปมุ Environment Variables
ภาพที่ 1-5 ปมุ Environment Variables
4. ใน System Variables เลอื กขอความท่ขี น้ึ ตนดว ยคาํ วา Path
ภาพที่ 1-6 ท่ีอยูข องตัวแปร Path
5. เมือ่ กดปมุ Edit กจ็ ะไดห นา จอดงั ทเ่ี หน็
ภาพที่ 1-7 การกําหนดคาใหก บั Path
6. เตมิ ; (semicolon) ถายงั ไมม ี แลวจงึ ใส path ท่ไี ดตดิ ต้ัง J2SDK ไว เสร็จแลวกดปุม OK
เพอื่ ใหร ะบบบันทึกการเปลยี่ นแปลงที่ไดทําข้ึน
หลังจากที่ไดกําหนด path ใหกบั เคร่อื งท่ีเราจะใชใ นการเขียนโปรแกรมแลว ขน้ั ตอนตอ ไปก็ข้ึนอยู
กบั ผเู ขียน การพัฒนาโปรแกรมกท็ าํ ไดโดยไมต อ งวุนวายกบั การกําหนด path ตา ง ๆ อกี (ยก
เวน เสียแตวา path ท่ไี ดกาํ หนดข้ึนไมมีอยูจ ริง – เราก็ตอ งกลับไปเริ่มตน ใหม พรอมกบั path ทม่ี อี ยู
จริง)
ท้งั นีท้ ั้งน้ัน ผูพัฒนาโปรแกรมตองเลอื กเองวา วธิ ีไหนเหมาะสมท่ีสุด ถาตองใช Java อยบู อย ๆ และ
สม่าํ เสมอก็ควรทจี่ ะเลอื กกาํ หนด path แบบถาวร เพ่อื จะไดไ มตองเสยี เวลากบั การกาํ หนด path
สิ่งท่ีสาํ คัญอีกสิง่ หนึ่งทีข่ าดไมไดใ นการทดสอบและ execute code ที่เขียนขึน้ ดว ย Java กค็ ือ JRE
หรอื ทีเ่ รยี กวา Java Run-time Environment ถา เรานําเอา code ที่ไดผานการ compile จาก J2SDK
แลว ไป execute บนเครือ่ งทยี่ งั ไมไ ดติดตง้ั JRE ผลลพั ธก ค็ อื execute ไมได แตถ าเคร่ืองนน้ั ไดรบั
การติดตงั้ J2SDK ก็จะไดร ับการติดตัง้ JRE พรอมกนั ไปดวย ดังทีไ่ ดก ลา วไวก อนหนานี้ สาเหตุท่ี
Sun ทาํ แบบนก้ี ็เพราะวา หลาย ๆ คนอาจไมใชผูพัฒนา Java โปรแกรมแตเ ปน ผูใ ชโปรแกรมท่เี ขยี น
4
บทท่ี 1: กอ นจะถงึ Java
ขน้ึ ดว ย Java ก็ได ดังน้ันหากเคร่ืองใด ๆ ตอ งใชโปรแกรมที่เขียนขน้ึ ดวย Java บอย ๆ ก็ตอ ง intro. to Java (FEU.faa)
download JRE มาไวท ่เี ครอื่ งดวย
1.4 เขียน code ทีเ่ ปน application หรือเขยี น code ทเ่ี ปน applet
Applet เปน code ทีเ่ ขยี นขน้ึ มาเพอ่ื ใหส ามารถทจี่ ะ execute ใน web browser ผา นทาง HTML
ไฟล ซง่ึ โดยทวั่ ไปมกั จะมีขนาดเลก็ เพอื่ ใหการ download applet ทาํ ไดรวดเรว็ ยิง่ ข้ึน สว น
application เปนการ execute ไฟลผา นทาง command line ดังน้นั ขนาดจงึ ไมเ ปน อปุ สรรค (เพราะ
ไมตอ งมกี าร download) หนังสอื เลมนจ้ี ะแสดงโปรแกรมตวั อยางดว ยการเขยี น code ในรูปแบบของ
application
1.5 เครอ่ื งมือ หรอื คาํ สั่ง (SDK tools) ท่ตี องใชใ นการพัฒนาโปรแกรม
Java Development Kit ไดถ กู เปล่ียนใหมีชอ่ื เปน J2SDK – Java 2 Software Development Kit
ดังนั้นเราจะใชชอ่ื เครอื่ งมือในการพฒั นาโปรแกรมน้ีสลับกันไปมา แตใหตัง้ สมมตฐิ านวา ทง้ั สอง ตางก็
เปนเครอ่ื งมอื ที่ใชในการพัฒนา Java โปรแกรมเชนเดยี วกัน
javac เปนเครือ่ งมือท่ีใชในการ compile (compiler) ทีท่ ําการเปลี่ยน source code ท่เี รา
เขยี นขึน้ ใหเปน byte code
java เปนเครือ่ งมือท่ีใชในการ execute byte code สาํ หรบั โปรแกรมท่เี ขยี นขน้ึ ในแบบของ
application
javaw เชนเดียวกับ java
appletviewer เปนเคร่อื งมอื ท่ีใชในการ execute โปรแกรมที่เขยี นขน้ึ ในแบบของ applet
ยงั มเี ครอื่ งมอื อีกหลายตัวที่ java มใี ห แตต อนน้เี ราจะใชเฉพาะเครื่องมือท่ีไดกลาวไวแ คส ามตวั น้ี
เทา นนั้
การพัฒนาโปรแกรมท้ังทเ่ี ปน application และ applet น้ันจะมขี ั้นตอนท่แี ตกตางกันพอสมควร ดัง
แสดงใหเ ห็นในภาพท่ี 1-8 และในภาพท่ี 1-9 ในการเขยี น code นน้ั เราจะตองมี editor ที่เปน text
editor กลาวคอื เปน editor ทีไ่ มม กี ารเก็บ format ตาง ๆ ของตวั อกั ษรดงั เชนท่ี Microsoft Word
เก็บ แตจ ะเกบ็ เปนรหัส ASCII ที่ SDK สามารถอา นและ execute ได สมมตวิ าเรามี text editor และ
SDK แลวการพฒั นากเ็ ปน ไปตามขั้นตอนที่แสดงในภาพท้งั สอง
Text Editor Javac Java Class File
First.class
Java Source File
First.java Java
Java Program
Output
ภาพท่ี 1-8 ขน้ั ตอนการพฒั นาโปรแกรมทีเ่ ปน application
5
เรมิ่ ตนการเขยี นโปรแกรมดว ย Java
Text Editor Javac Java Class File intro. to Java (FEU.faa)
Java Source File First.class
First.java appletviewer
HTML file Java Program
First.html Output
ภาพท่ี 1-9 ขั้นตอนการพัฒนาโปรแกรมทเ่ี ปน applet
1.6 การสรางโปรแกรม Java ท่เี ปน application
สมมตวิ าเราเลอื กใช text editor ตัวใดตัวหนงึ่ ทมี่ ีอยมู ากมาย ท้งั ที่ free และทั้งที่ตอ งจายเงนิ ซอ้ื มา
เรากม็ าลองเร่มิ เขียนโปรแกรมตวั แรก กนั เลยดกี วา
เพ่ือใหเ ขาใจไดงา ยถึงขัน้ ตอนและทม่ี าท่ีไปในการเขยี นโปรแกรมดว ยภาษา Java เราจะเขยี น
โปรแกรมทีไ่ มทาํ อะไรมากมายนกั เพยี งแตสง ขอมลู ไปยังหนา จอเม่ือ user เรยี กใช (execute)
โปรแกรมน้ี เราจะตงั้ ช่ือโปรแกรมน้ีวา HelloWorld.java และมีขอมลู ดงั น้ี
1: /**
2: Display a sentence "Hello World" to screen
3: */
4: class HelloWorld {
5: public static void main(String[] args) {
6: System.out.println("Hello World!");
7: }
8: }
ผอู านยงั ไมตองกงั วลกบั ความหมายของศัพทเ ฉพาะ (keyword) ตาง ๆ ของ Java ท่ีเห็นในตอนน้ี
หลงั จากทีเ่ ขยี นโปรแกรมไดส ักพกั หนง่ึ ผอู านก็จะเขา ใจถงึ ความหมายเหลา นด้ี ขี ้นึ แตต อนน้ีตอ ง
เขา ใจวา ไฟลท่เี ราเขียนขน้ึ มีนิยามของ class ที่เราเขยี นข้ึนชื่อ HelloWorld ซงึ่ Java กาํ หนดไวว า
ช่อื ของ class และชือ่ ของไฟลท เี่ กบ็ code ของ class น้จี ะตองเปนชื่อเดยี วกนั
class นี้มี method อยหู นงึ่ ตวั ชือ่ main() เม่อื เรา execute โปรแกรมน้ี JRE จะคนหา method ท่ชี อ่ื
main() เพ่ือทําการประมวลผลชุดคาํ สง่ั ตาง ๆ ท่มี ีอยู ทง้ั นี้ method main() จะตอ งมี keyword ทช่ี ่อื
public, static, และ void อยู รวมไปถงึ parameter ทเ่ี ปน array ทเ่ี กบ็ String ดว ย ถา ผอู า นเคย
เขยี นโปรแกรมดว ย ภาษา C หรือ ภาษา C++ มากอ นก็จะเห็นถึงความคลา ยคลึงกนั ของ method
main() น้ี
ตัวแปรท่มี อี ยใู นวงเลบ็ (Parameter) ของ method main() ท่เี ปน String[] args บง บอกถงึ คา
(command-line argument) ตาง ๆ ที่ผูใชโ ปรแกรมสงผานไปยังตัวโปรแกรมเพื่อเอาไวใชในการ
ทํางานตา ง ๆ ซึ่งอาจมี หรอื ไมมกี ไ็ ด และเราจะยังไมกลา วถึงคาเหลานใี้ นเวลานี้ ในตัว method
main() เองมีประโยคทีข่ ึ้นตน ดวย System.out.println("…") ซ่ึงเปน คาํ สง่ั ทใ่ี ชสงขอความไปยัง
System.out ที่โดยทวั่ ๆ ไปก็คือ console window หรอื ทเี่ รียกกันติดปากวา dos window หรอื dos
prompt ดงั ตัวอยา งที่แสดงใหเ ห็นในภาพที่ 1-10
6
บทท่ี 1: กอ นจะถึง Java
ภาพท่ี 1-10 การ compile และ run โปรแกรม intro. to Java (FEU.faa)
1.6.1 การ compile โปรแกรม HelloWorld
ดังเชน ท่แี สดงใหเหน็ ในภาพท่ี 1-10 การ compile ไฟลท เ่ี ขยี นขึ้นตองใชคําสั่ง javac ตามดว ยชอื่
ไฟล พรอ มกบั นามสกุล ดังน้ี
javac HelloWorld.java
ในการ compile ทุกครัง้ เราจะตองไมล มื ใสน ามสกุลใหก ับไฟลท เี่ ราไดเขยี นขึน้ ไมเ ชน น้ันแลว
compiler จะฟอ ง โดยการสงขอ ความที่บอกถึงขอผดิ พลาดในโปรแกรม (error message) ใหเ รา
เชน ถา เรา compile ไฟล HelloWorld โดยไมใ ส .java เรากจ็ ะได error ดงั น้ี
E:\bc221Book\source>javac HelloWorld
javac: invalid flag: HelloWorld
Usage: javac <options> <source files>
where possible options include:
-g Generate all debugging info
-g:none Generate no debugging info
-g:{lines,vars,source} Generate only some debugging info
…
…
…
(ผูเขียนไดต ดั ขอ ความบางสว นที่ java ฟอ งออก)
1.6.2 การ execute โปรแกรม HelloWorld
สมมติวา เรา compile โปรแกรม HelloWorld โดยไมมี error ใด ๆ เกิดขึน้ การ execute โปรแกรมก็
ทาํ ไดด วยคําสงั่ java ตามดว ยชอ่ื ไฟล ดังนี้
java HelloWorld
และกจ็ ะได output ดังที่เห็นในภาพที่ 1-10
ในการ execute โปรแกรมนัน้ เราจะไมใส .class ตามหลงั ชอ่ื ไฟล (ถงึ แมวา เราตองมีไฟลน ีก้ ต็ าม) ถา
เราใส compilerกจ็ ะฟองดวย error ท่ีบอกวา หาไฟลไ มเ จอ (java.lang.NoClassDefFoundError)
ดังทเ่ี ห็นในภาพท่ี 1-11
ภาพท่ี 1-11 error ทเ่ี กิดข้ึนจากการใส .class ตามหลงั ชอ่ื ไฟลในขณะ run โปรแกรม
7
เร่มิ ตนการเขียนโปรแกรมดวย Java intro. to Java (FEU.faa)
1.6.3 สรุปขน้ั ตอนของการพฒั นาโปรแกรมทีเ่ ปน application
1. compile ดว ยคาํ ส่ัง javac ตามดวยชอื่ ไฟล พรอ มกบั นามสกุล
2. execute ดวยคาํ ส่ัง java ตามดวยชอื่ ไฟลโดยไมมีนามสกลุ ใด ๆ ตอทาย
การเขยี นโปรแกรมทีด่ ีนั้น ผูเขียนควรใสค าํ อธบิ าย (comment) ถึงการทํางานของโปรแกรมทเี่ ขยี น
ขนึ้ เพือ่ ใหผ ูทน่ี าํ โปรแกรมไปใช หรือผูอา นคนอนื่ เขา ใจถึงวธิ ีการใชท ่ีถกู ตอง ในการเขียน
comment ดวยภาษา Java น้ัน มกี ารทําไดสองวธิ ี คือ
1. การใช //
2. การใช /* … */
การใชใ นแบบที่หนง่ึ น้ัน เปน การใส comment ไดไ มเกิน 1 บรรทดั สว นการใชในแบบที่สอง ผูใช
สามารถทจ่ี ะใส comment ไดม ากกวา หนึ่งบรรทัด แต comment ตองอยภู ายในเครื่องหมาย /* …
*/ เทา นั้น ดังตัวอยางจากการนําโปรแกรม HelloWorld มาเขยี นใหมด วย comment
1: /**
2: Display a sentence "Hello World" to screen
3: */
4: class HelloWorld {
5: //Java launcher will call this method to
6: //display string "Hello World!"
7: public static void main(String[] args) {
8: System.out.println("Hello World!");
9: }
10: }
1.7 การสรางโปรแกรม Java ท่เี ปน applet
ในการเขยี นโปรแกรมที่เปน Java applet นนั้ เราจะตอ งมีไฟลอ ยอู ยางนอย 2 ไฟล ซงึ่ หนงึ่ ในน้นั คือ
Java source file และอีกไฟลหนึ่งคอื HTML file เราลองมาเขียน applet เลก็ ๆ ที่สง ขอ ความไปยงั
web browser เหมือนกบั ท่เี ราเขยี น application กอนหนานี้
1: /**
2: My first Java applet
3: */
4:
5: import javax.swing.JApplet;
6: import java.awt.Graphics;
7:
8: public class HelloWorldApplet extends JApplet {
9: public void paint(Graphics g) {
10: g.drawString("Hello World! สวสั ดคี รบั โลกเกา ๆ ใบนี"้ , 25, 25);
11: }
12: }
เน่อื งจากวา เราตอ งการ applet สําหรับการสงขอความไปยงั web browser ดังนัน้ เราจึงตองดงึ เอา
เครื่องมือทีช่ วยใหเ ราสามารถแสดงขอ ความทวี่ า ดวยการใชก ารถา ยทอดคุณสมบตั ิ (inheritance) ที่
Java มีใหด ว ยการเพิ่มคําวา extends Applet ทางดา นหลงั ของ class HelloWorldApplet เราจะยัง
ไมพดู ถึงรายละเอียดเกี่ยวกับการถายทอดคณุ สมบัติของ Java ตอนนี้ อีกส่ิงหนง่ึ ทีข่ าดไมไดใ นการ
เขียน applet ของเราตอนน้กี ็คอื method paint() ซึ่งเปน method ทที่ าํ การวาดขอความลงบน
applet ดว ยการเรียกใช method drawstring() จาก class Graphics ในตาํ แหนงท่ีกาํ หนดไว จาก
คาํ ส่งั น้ี
g.drawString("Hello World! สวัสดีครบั โลกเกา ๆ ใบน"ี้ , 25, 25);
เม่ือ compile โปรแกรม HelloWorldApplet ดวยคาํ สั่ง javac แลวเราก็สามารถท่ีจะ execute applet
ไดด วยการเรยี ก HTML ไฟลท ่เี ขยี นขึน้ ดังนี้
<html>
<applet code="HelloWorldApplet.class" width="300" height="80"></applet>
</html>
8
บทที่ 1: กอ นจะถึง Java intro. to Java (FEU.faa)
ดวยการใช applet tag ใน HTML ไฟลพ รอ มกบั การใสช ่อื ของ Java ไฟลท ่ี compile แลว ในสว นของ
field ท่ชี ื่อ code และกาํ หนดขนาดความกวา งของ applet ใน field ที่ช่อื width และความยาว (สูง)
ใน field ทช่ี ือ่ height
การ execute ไฟล HelloWorldApplet.html กส็ ามารถทาํ ไดด ว ยการใชค ําสง่ั appletviewer ตาม
ดว ยช่อื ไฟล เราก็จะได output ดงั นี้
ภาพท่ี 1-12 Applet แสดงคา Hello World
1.7.1 สรุปขั้นตอนการเขยี นโปรแกรมแบบ applet
1. สรา ง Java source file ดว ยการ extends Applet
2. สรา ง HTML file ที่มี applet tag และขอมลู ท่สี าํ คัญในการแสดง applet คอื (1) class file ของ
Java โปรแกรม (2) ขนาดของ applet – width และ height
เราคงจะทิง้ เร่ืองการเขียน applet ไวเ พยี งแคน ี้ แตจะไปศึกษาถงึ โครงสรางตา ง ๆ ของภาษา Java
ขั้นตอนการออกแบบ และการเรียกใช class รวมไปถึงเทคนิคและวิธีการใช method ตาง ๆ ที่ Java
มใี หใ นรูปแบบของการสราง application เทาน้นั
1.8 การสราง Java program ดวย Crimson Editor
ตัวอยา งของโปรแกรม HelloWorld.java ทเ่ี ราไดเขียนขน้ึ กอ นหนานใ้ี ชภาษาอังกฤษท้ังหมดในการ
เขยี น ผลลพั ธทีไ่ ดจ ากการ run โปรแกรมก็เปนภาษาอังกฤษ ผานทาง Dos Window ถา เราตอ งการ
ที่จะเขยี นโปรแกรมเพือ่ ใหแสดงผลลัพธ หรือ ขอความทเี่ ปน ภาษาไทยนัน้ จะตองใช Operating
System ทีร่ องรับการปอ นและสง ขอ มลู ที่เปน ภาษาไทย เชน Windows ตาง ๆ ทส่ี รา งข้ึนมาเพ่อื คน
ไทยโดยเฉพาะ ซึง่ จะสังเกตไดจากคําวา Thai Edition หรือ คําวา ไทย ตอ ทา ย แตกม็ ี OS หลาย ๆ
ตวั ท่ียอมใหม กี ารปอนและสงขอมลู ท่เี ปนภาษาไทยผานทางชอ งทางอนื่ ๆ ท่ีไมใ ช Dos Window ใน
การฝกฝนการเขยี นโปรแกรม Java ใหม ๆ น้ันเราจําเปนทจี่ ะตองมีชองทางในการแสดงผลทสี่ ามารถ
ใชไ ดท ง้ั ภาษาไทย และภาษาอังกฤษ ดังนั้นเพอ่ื ใหการปอนและสง ขอมลู ใชไดท ้ังภาษาไทยและ
ภาษาอังกฤษ เราจะเลอื กใช Text Editor ทร่ี องรับภาษาไทย เชน Crimson
กอนอน่ื เราตองหา Crimson มาติดตัง้ ในเคร่อื งทเี่ ราใชในการสรางโปรแกรมดวยภาษา Java เสียกอน
ซงึ่ สามารถท่จี ะไป download มาไดจาก http://www.crimsoneditor.com/ โปรแกรมตวั นี้เปน
freeware เม่อื ติดตง้ั เรยี บรอยแลวก็ใหเขาไปใน menu ท่ชี ่อื วา Tools
9
เรมิ่ ตนการเขยี นโปรแกรมดว ย Java intro. to Java (FEU.faa)
ภาพท่ี 1-13 การกําหนดคา Preferences
เลอื ก Preferences ก็จะไดห นาตางที่เห็นนี้
ภาพท่ี 1-14 หนาตางการกาํ หนด font
click ท่ี Fonts และเลือก font ใหกับ Screen fonts ซ่ึงเปนหนา ตา งสาํ หรบั การ edit ผอู า นควรเลอื ก
font ทร่ี องรับภาษาไทย เชน Tahoma หรอื font ตระกูลอื่นๆ ทม่ี ีคาํ วา UPC ตามหลงั เสรจ็ แลวให
ทําแบบเดยี วกบั Printer fonts และ Miscellaneous (เราจะแสดงใหด ูเฉพาะการกําหนด font ใหกับ
หนาตางแสดงผล)
ในการกาํ หนด font ของหนาตางแสดงผล ผอู า นจะตองกดปุม สองครง้ั ใน Output Window เพือ่
เปลี่ยนคาตา งๆ ท่ตี องการ
10
บทที่ 1: กอนจะถงึ Java intro. to Java (FEU.faa)
ภาพที่ 1-15 หนา ตา งแสดงผล
หลงั จากกดปุมสองครงั้ ก็จะไดหนาตางของการกําหนด font ใหก ับหนาตางแสดงผล ดงั ทแ่ี สดงใน
ภาพท่ี 1-16 ซ่งึ ผูอานสามารถท่จี ะกําหนดตางๆ ไดเอง
ภาพท่ี 1-16 การกําหนด font และคาตางๆ
หลังจากท่กี าํ หนดคาใหกับหนา ตางทกุ ตัวเรียบรอยแลว เราก็ตองมากาํ หนดให Crimson รูจกั กับการ
compile และ execute โปรแกรมในภาษา Java ดวยการเลอื ก Conf. User Tools ในสวนของ
Preference ซึ่งจะไดห นา ตางดงั ทเี่ ห็นในภาพท่ี 1-17
11
เร่มิ ตนการเขียนโปรแกรมดว ย Java
ภาพท่ี 1-17 หนาตางการกาํ หนดคาของ User Tools intro. to Java (FEU.faa)
เร่ิมตน ดวยชอ งแรกสดุ ใน User Tools ท่เี ขียนวา Empty ใสขอ มลู ดงั ตัวอยา งท่ีเห็นในภาพที่ 1-18
ภาพที่ 1-18 การกําหนดคาใหกบั การ compile
รายละเอยี ดขอมูลทีใ่ สดังทเ่ี ห็นในภาพท่ี 1-18
Menu Text: Compile Java Source File ผูอานจะใสอะไรก็ไดท ่สี ือ่ ความหมาย
Command: ท่ีทผ่ี อู า นได install Java ไว เชน c:\j2sdk1.5.0\bin\javac.exe
ซ่ึงอาจคน หาดว ยการ browse ผา นทางปมุ ที่มีให
Argument: $(FileName) เปน ไฟลทม่ี นี ามสกลุ เลอื กจาก drop-down list
Initial directory: $(FileDir) เลือกจาก drop-down list
Hot key: กดปมุ Ctrl แลว ตามดว ยปุมฟง คชน่ั ท่ีตอ งการใชเ ชน F5
พรอ มกบั ใสเ คร่ืองหมาย 9 ในชอ ง Capture output และ Save before execute
หลงั จากนนั้ ก็ทาํ การกําหนดคําส่งั ใหกับการ run โปรแกรมดังตัวอยางทแี่ สดงในภาพท่ี 1 – 19 โดย
เปล่ียนขอ มูลในชองของ Argument ใหเ ปน $(FileTitle) เพราะJava ตอ งการเพยี งแคช่ือไฟลทไี่ มม ี
นามสกลุ ในการ run
12
บทที่ 1: กอนจะถงึ Java intro. to Java (FEU.faa)
ภาพที่ 1-19 การกําหนดคา ใหกบั การ run โปรแกรม
เมื่อทาํ ทุกอยางเรยี บรอยแลว ใหกดปมุ OK เพ่ือทาํ การบันทึกคาํ สั่งท่ีเราสรางขน้ึ ให Crimson รจู ัก
และเม่ือได compile และ run ผลลพั ธท ่ีเราไดคือ
ภาพที่ 1-20 ผลของการ run โปรแกรม HelloWorld.java
13
เร่มิ ตนการเขียนโปรแกรมดว ย Java intro. to Java (FEU.faa)
ถา เราตองการท่จี ะ run โปรแกรม HelloWorldApplet ทเี่ ราไดเขียนขน้ึ และแสดงผลลพั ธของการ
run ผานทาง Crimson เราตอ งทําการกําหนดคําส่งั อกี ตวั หนงึ่ ขึน้ มา เพ่อื ใหสามารถทจี่ ะ run Applet
ได และโดยเฉพาะอยางย่งิ การสง ขอความทเ่ี ปน ภาษาไทยไปยงั applet
ขัน้ ตอนและวิธกี ารกค็ ลายๆ การกาํ หนดในสวนอ่นื กอนหนา นี้ เพียงแตวา เราตอ งกําหนด option ของ
การแสดงผลใหใช HTML encoding ท่ีสามารถแสดงผลเปนภาษาไทย ซ่งึ ทําไดง า ยๆ ดังภาพท่ี
แสดงนี้
ภาพท่ี 1-22 การกําหนด option ใหก ับคําส่ัง appletviewer
ภาพที่ 1-23 แสดงผลลัพธข องการใชคําส่งั ที่เราไดกําหนดไวหลังจากท่ีเรากด ctrl + F7 ซึ่งเปน ภาพ
เดยี วกันกับภาพ 1-12
ภาพท่ี 1-23 ผลลัพธจากการ run HelloWorldApplet.html
Crimson ยังมี features ตา งๆ อกี มากมายที่เราสามารถที่จะ set ไวช ว ยในการทํางานของเราไดท้ังน้ี
ผูอานสามารถทีจ่ ะหาขอ มูลเพ่มิ เติมไดจาก help file ของตัว Crimson เอง
สิ่งท่เี ราตองการบอยมากกค็ ือการใสขอ มลู เขาสโู ปรแกรมผา นทาง keyboard ซึ่งอาจเปน ขอมลู
ทดสอบ หรอื เปนขอ มูลที่ตองการใชจรงิ ในโปรแกรม แตเ ราไมสามารถทาํ ได (งา ย ๆ) ดว ย Crimson
ดังน้นั เราจงึ จาํ เปนตองใชเครอื่ งมอื ตวั อน่ื ในการนาํ ขอมูลเขา เชน command window หรือ การใช
IDE ตวั อื่น ๆ ท่ีมอี ยู เชน netbeans
1.9 การใช NetBeans สาํ หรับการพัฒนาโปรแกรม
ปจ จุบันผใู ชส ามารถทีจ่ ะเลอื ก download Java 1.5 ทมี่ ี NetBeans IDE รวมอยดู ว ยจาก Sun
โดยตรง NetBeans เปนโปรแกรมท่ีดมี ากตวั หนึ่งสาํ หรบั การพัฒนาโปรแกรมทตี่ อ งการใช GUI
(Graphical User Interface) ทง้ั โปรแกรมที่ run บน web และบนเครอ่ื งโดยตรง
14
บทที่ 1: กอ นจะถึง Java intro. to Java (FEU.faa)
ภาพที่ 1.28 โปรแกรม NetBeans
อกี ทีห่ นึง่ ท่ผี อู า นสามารถ download NetBeans ไดก ็คอื http://www.netbeans.org/ เราจะแสดง
วิธีการสรา งโปรแกรมอยางงา ย ๆ ดวย Netbeans ใหด ู
ภาพท่ี 1.29 New Java Application Project Dialogbox
หลงั จากท่ีเปด Netbeans พรอมกับเลือก General และ Java Application เราก็จะไดห นา ตา งดงั ที่
เหน็ ในภาพ 1.29 และเม่ือกดปุม Next เราก็จะได
15
เริม่ ตนการเขียนโปรแกรมดวย Java intro. to Java (FEU.faa)
ภาพที่ 1.30 การต้ังชื่อ project และตําแหนงทเ่ี กบ็ project
และเมือ่ เรากดปุม Finish เราก็จะไดห นาตางสาํ หรบั เขียน code ดังท่แี สดงในภาพ 1.31 น้ี
ภาพท่ี 1.31 แสดง project windows ตาง ๆ ท่ถี ูกกําหนดจาก Netbeans
หลังจากทีใ่ ส code เสรจ็ เราก็ compile project ดวยการกด Build Æ Build Main Project และเม่อื
compile เสร็จโดยไมม ี error เราก็ execute project ดว ยการกด Run Æ Run Main Project เราก็
จะเหน็ ผลลัพธท่แี สดงใน output window ดานลา ง
16
บทที่ 1: กอนจะถงึ Java intro. to Java (FEU.faa)
ในการสรา ง applet น้ันเราตอ งเลอื ก Java Library Class ภายใต Java Application ซ่ึงเมือ่ เลือกแลว
เราก็จะไดหนา ตา งดงั นี้
ภาพที่ 1.32 หนา ตาง HelloWorldApplet ภายใต New Java Library Class
หลงั จากที่กดปมุ Next เราก็จะไดหนา ตางท่ีมี Project อยเู ราก็กดปมุ ขวาบน HelloWorldApplet (เรา
เรยี กสวนตา ง ๆ เหลานี้วา node) เลอื ก New File/Folder เรากจ็ ะไดห นาตา งใหม ซงึ่ เราตองเลอื ก
Java Classes ภายใต Categories และเลอื ก Applet ภายใต File Types หลังจากนัน้ กก็ ดปุม Next
เราก็จะไดหนาตางใหมดงั นี้
ภาพที่ 1.33 หนา ตางของ New Applet
17
เรม่ิ ตนการเขยี นโปรแกรมดว ย Java intro. to Java (FEU.faa)
เราจะใหชอ่ื Class Name วา HelloWorldApplet พรอมกบั กําหนดให Package เปน
org.neramit.hello ซ่ึงผอู านสามารถกําหนดใหเ ปนอะไรก็ไดตามทชี่ อบ และเมอ่ื กด Finish เราก็จะ
ไดห นา ตางสําหรับเขยี น code ใหก ับ applet ของเรา และเพื่อใหงายขึน้ เรานาํ เอา code ทเ่ี ห็นนี้ใส
เขาสู method init() ทม่ี อี ยู
public void init() {
String greeting = "Hello from Netbeans!";
setLayout(new BorderLayout());
JLabel label = new JLabel(greeting, SwingConstants.CENTER);
add(label, BorderLayout.CENTER);
JPanel panel= new JPanel();
JButton source = new JButton("neramit");
source.addActionListener(listenToURL("http://sci.fareastern.ac.th/faa"));
panel.add(source);
add(panel, BorderLayout.SOUTH);
}
private ActionListener listenToURL(final String url) {
return new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
getAppletContext().showDocument(new URL(url));
}
catch(MalformedURLException ex) {
ex.printStackTrace();
}
}
};
}
หลงั จากน้ันกก็ ดปมุ ขวาบน HelloWorldApplet ใน Project window เลอื ก Build Project และเม่อื
เลือก Files tab เราก็จะเหน็
ภาพที่ 1.34 ไฟลท ่ีถูกสรางข้นึ จาก Netbeans โดยอัตโนมัติ
เราเรียกใช applet viewer เพือ่ ดูผลลพั ธไดดว ยการกดปุมขวาบน HelloWorldApplet.java ใน
Project window เลือก Run File
18
บทท่ี 1: กอนจะถึง Java intro. to Java (FEU.faa)
ภาพท่ี 1.35 ผลลัพธจากการ run ไฟล HelloWorldApplet.java
อีกทางหนงึ่ ทเี่ ราเรยี กดู applet ของเราไดก ค็ ือ ผา นทาง web browser ซ่งึ เราสามารถทําผา นทาง
Netbeans ไดด วยการกดปมุ ขวาบน HelloWorldApplet.html ท่ีอยูใน Files tab แลวเลอื ก view เรา
กจ็ ะเห็น applet ใน browser ดังนี้
ภาพท่ี 1.36 applet ท่ีเปดใน browser
19
เร่ิมตน การเขยี นโปรแกรมดว ย Java intro. to Java (FEU.faa)
และถาผอู านกดปมุ neramit web browser ก็จะไป load web site ของผเู ขยี นมาแสดง เราจะ
กลบั มาดถู งึ การใช Netbeans ในบทที่ 11 เรื่องของการสรา ง GUI สําหรับ application ตา ง ๆ
1.10 ที่มาของภาษา Java โดยสงั เขป
Java เปน ภาษาท่ีเกดิ ข้ึนจากการพัฒนาของบรษิ ัท Sun Microsystems โดยมีทม่ี าจากภาษาที่ช่อื วา
Oak ซึง่ เปน ภาษาทใี่ ชภายใน Sun เอง เขียนขึ้นโดย Patrick Naughton และ James Gosling (มี
การตงั้ สมมตุ ฐิ านวาโปรแกรมตวั น้ไี ดช่ือวา Oak ก็เพราะวา James Gosling มองเหน็ ตน Oak นอก
หนา ตา งทที่ ํางานทกุ วัน) หนาทีเ่ บื้องตน ท่ี Oak ตองทาํ ก็คอื เปนภาษาทีเ่ ล็ก มีความสามารถในเร่ือง
ของชุดคําสง่ั สงู ใชหนว ยความจาํ นอย ไมยึดติดกบั ระบบคําส่งั ของ CPU ในรูปแบบ (platform) ตางๆ
เพราะจะตอ งนําไปใชก บั อุปกรณอ ิเล็กทรอนิกส เชน ตูสบั เปล่ยี นชอ ง ของ cable TV แตห ลังจากท่ี
Sun ไดพ ฒั นา Oak และใชม าอกี ระยะหนง่ึ Sun ก็ไดนาํ เอา Oak ออกมาสูสายตาชาวบา นทัว่ ไป แต
เนอ่ื งจากวา ช่ือของ Oak ไดม ีผใู ชอ ยูกอนแลว Sun จงึ ตอ งหาชอ่ื ใหมใหกบั ภาษาน้ี ซงึ่ ในตอนแรก็
ไดทดลองหลายชอื่ เชน Silk, Ruby และ WRL (Web Runner Language) แตช อื่ เหลา น้กี ไ็ มไดถ ูก
เลอื ก ในท่ีสุด Java กก็ ลายเปนชอ่ื ของภาษานี้ (ท้งั ๆ ทไ่ี มมีอะไรเกีย่ วของกับ กาแฟ จากชวา หรอื
อะไรทีเ่ กี่ยวขอ งกบั เกาะชวาเลย)
Java ไดอ อกสูสายตาของชาวโลกจริงเม่ือตน ป ค.ศ. 1996 โดยทาง Sun ไดเ พ่ิมความสามารถใหก ับ
Java คอื สามารถที่จะ execute code ทีอ่ ยูภายใน web page ได ทําให java ไดร ับความนยิ มในหมู
นกั พัฒนาโปรแกรมมาก แต Java รุนแรกๆ ก็ยงั มีขีดความสามารถท่ีจํากัด ยงั ไมส ามารถทาํ อะไรได
มากมายนัก จนกระทั่งปลายป ค.ศ. 1998 ทาง Sun ก็ไดเ ปด ตัว Java 1.2 ซงึ่ เปนรุนท่ีทาง Sun
ภมู ิใจมากทีส่ ดุ มีการปรับแตง อยางมากมาย เพมิ่ ขดี ความสามารถใหกบั Java เพ่ือใหส มกับคําทที่ าง
Sun ไดสญั ญาไวกบั ชาวโลกวา Java เปน ภาษาท่ีเขียนขนึ้ มาครั้งเดยี ว แลว เอาไป run ทไี่ หนกไ็ ด
(Write Once, Run Anywhere)
ทาง Sun ไดเ ปลีย่ นใหมให Java เปน Java 2 Standard Edition Software Development Kit
Version 1.2 หลังจากนัน้ ไมนาน Sun กอ็ อกรนุ อ่ืนอีก 2 รุนมาสสู ายตาชาวโลก คอื รนุ Micro Edition
สําหรับการทาํ งานบนเครือ่ งมอื สอ่ื สาร เชน โทรศัพทเคลื่อนท่ี และรุน Enterprise edition ซงึ่ เปนรนุ
ที่ออกมาสาํ หรับการทาํ งานบนเซริ ฟ เวอร
Java มอี ยมู ากมายหลาย version แต version ลาสุดของ Java ขณะที่เขียนตําราเลมน้ี คือ
J2SDK1.5.0 ผูอ านสามารถตดิ ตาม version ใหม ๆ และ download ไดท ่ี web site ของ Sun ที่ได
ใหไวกอนหนานี้
ในบททีส่ องเราจะมาทําความรูจกั กบั ขอ กําหนด ตาง ๆ ของ โปรแกรม ขอ มูล (data) ตวั แปร
(variable) และ การประมวลผล (calculation – evaluation)
20
ในบทท่สี องนี้เราจะมาทําความเขาใจในเรอื่ งของชนดิ ขอมูลท่ี Java มีไวในการรองรับการเขียน intro. to Java (FEU.faa)
โปรแกรม ทัง้ ขอมูลทเี่ ปน ตวั เลข และขอ มูลทีเ่ ปนตัวอกั ษร เราจะทดลองเขียนโปรแกรมดวยขอ มูล
ชนิดตาง ๆ นี้
หลังจากจบบทเรยี นนแ้ี ลว ผูอ า นจะไดท ราบถงึ
o วิธีการประกาศตวั แปร (variable declaration) ทมี่ ชี นิดเปน integer และ floating-point
o วธิ ีการประกาศตวั แปรท่ีมีชนิดเปน character และ boolean
o วิธีการกาํ หนด (assignment) คา ใหกบั ตวั แปรตาง ๆ
o การสรางประโยค (statement หรือ expression)
o การประมวลผล (calculation และ evaluation) ที่เกย่ี วกับตวั แปรชนิดตา ง ๆ
o การเปลย่ี นแปลง (casting) ชนิดของขอมลู
o การแสดงผลดว ยการใช printf() และ format()
o การใชฟ ง คช่นั ทางคณติ ศาสตร (Mathematical Functions) ที่ Java มีให
กอนทีเ่ ราจะพดู ถึงขอมลู และการประมวลผลขอ มูล เราควรกลับไปดถู ึงโครงสรา งทจี่ าํ เปน ตอ งมใี นการ
เขียนโปรแกรมดว ย Java
public class ClassName {
public static void main(String[] args) {
program statements
}
}
Java โปรแกรมทกุ ตัว (ทีไ่ มใช applet) ตองมี method ท่ีชื่อ main() ทม่ี รี ปู แบบดังท่เี ห็นดา นบนน้ี
ClassName จะเปน ท้ังช่ือของ class และชอ่ื ของไฟลทเี่ ก็บโปรแกรมน้ี สวน program statements
จะเปน ชุดคําสัง่ ทอ่ี ยูในโปรแกรม
2.1 ขอ มลู และ ตัวแปร (data and variable)
โดยทั่วไปถา เราตอ งการคํานวณหาคา ทางคณิตศาสตร เชน 354 + 45 * 12 เรามักจะใชเครือ่ งคิด
เลข หรือไมก็ใชวธิ คี ดิ ในกระดาษ ซึ่งวิธคี ดิ แบบท่สี องนีเ้ ราใชกระดาษเปน ตวั กลางในการหาคาน้ัน ๆ
กลา วคือ เราใชกระดาษเปนที่เก็บตัวเลขท่ีตอ งการหาคา รวมไปถงึ ผลลัพธของการหาคานัน้ ๆ ดวย
เชน เดียวกบั การเขยี นโปรแกรมทางคอมพวิ เตอร คา ตาง ๆ เหลา นจ้ี าํ เปน จะตองมีทเี่ ก็บ และท่ีเกบ็
ขอ มูลเหลา นต้ี อ งเปน ท่เี กบ็ ท่ีสามารถรองรับการประมวลผล หรอื การคาํ นวณไดอยางพอเพยี ง
ดงั นัน้ ในการเขียนโปรแกรม เราจงึ ตองใชต วั แปรเปนที่เก็บขอมูลตาง ๆ ทเ่ี ราจะตอ งใชในการ
ประมวลผล ตัวแปรทว่ี า น้ีเปนสัญลกั ษณแ ทนหนว ยความจาํ (memory) ท่ีอยใู นเครื่อง และ compiler
จะเปน ผูก าํ หนดวา อยูท ่ใี ด มขี นาดเทา ใด (address เรม่ิ ตน และ offset) ท่ีเกบ็ ขอ มลู นี้จะเก็บขอมูล
ไดเพยี งชนดิ ท่ีเราไดกําหนดไว เพียงชนิดเดยี วเทานั้น ขอมูลถกู แบง ออกตามชนดิ ของขอ มูล หลกั ๆ
คือ ขอมลู ท่เี ปนตัวเลข และ ขอ มลู ทีไ่ มใชตัวเลข แตจะแบง ยอย ๆ ลงไปอกี เชน ถาเรากําหนดใหตัว
แปรตวั ใดตัวหนง่ึ เก็บขอ มลู ชนดิ ทเี่ ปน ตัวเลขในแบบของ integer (จํานวนเต็ม เชน 2, 45, 90 เปน
ตน) เราก็ไมสามารถที่จะนําเอาขอมลู ท่ีเปน ตวั เลขในรูปแบบอื่น เชน double หรือ float (เลขทม่ี ีจุด
ทศนยิ ม เชน 2.35, 3.00 เปนตน) มาเกบ็ ไวในตัวแปรนีไ้ ด เนื่องจากวาขอ มูลทีต่ ัวแปรเก็บไดนน้ั มี
ขนาดตายตัว ตามการออกแบบของภาษา ดังนน้ั การนาํ เอาขอมลู ชนดิ อืน่ มาใสไวในตวั แปรนจี้ ะถูก
ตรวจสอบโดย compiler และ compiler จะฟองไปยังผเู ขียนโปรแกรมทันที
เริม่ ตนการเขียนโปรแกรมดวย Java
การประกาศตวั แปรน้ัน ผูเขยี นโปรแกรมจะใชสญั ลักษณใด ๆ ก็ไดท่ี Java ยอมใหใ ช ซ่ึงตองอยใู น intro. to Java (FEU.faa)
กฎเกณฑ ตอ ไปน้ี
1. ตอ งขึ้นตนดว ยตวั อักษร (letter) หรอื เครอ่ื งหมาย _ (underscore) หรอื เครือ่ งหมาย $ (dollar
sign)
2. เครอ่ื งหมายอนื่ ๆ ท่ตี ามมาเปนไดท้งั ตัวอักษร ตัวเลข และ สญั ลกั ษณอ ื่น ๆ ทีไ่ มไ ดถ กู ใชโดย
Java (เชน operator ตาง ๆ ที่ Java ใชด ังตัวอยา งของการ + (บวก) – (ลบ) * (คูณ) / (หาร)
เปนตน )
ตวั อยางของตวั แปรที่ถูกตอ ง
taxRate
pricePerUnit
_timeInSecond
$systemClock
unit897
เน่ืองจากวา Java ไดออกแบบใหผใู ชสามารถท่จี ะกาํ หนดตวั แปรใหเ ปน Unicode1 เพือ่ เปด โอกาสให
การออกแบบตวั แปรเปน ไปไดใ นภาษานัน้ ๆ ของ ผเู ขยี นโปรแกรม เราจงึ สามารถท่จี ะใชต ัวแปรทเ่ี ปน
ภาษาไทยได สง่ิ ทเี่ ราตองคํานงึ ถงึ กค็ ือ text editor ทเ่ี ราใชในการเขยี น code ตองยอมใหเราใช
ภาษาไทยดว ย ในบทน้แี ละบทอ่นื ๆ ของตํารานจ้ี ะใชต ัวแปรทีเ่ ปน ภาษาองั กฤษเทา น้ัน เพอ่ื ใหงาย
ตอ การเขียน และการทําความเขา ใจในเน้ือหาไดรวดเรว็ ขน้ึ
โดยทวั่ ไปเราจะเรียกตัวแปรทไี่ ดก าํ หนดใหเ กบ็ ขอมูลชนดิ ใด ชนิดหน่งึ วา variable หรอื identifier
และ identifier ท่ีวาน้ี มคี วามยาวเทาไรกไ็ ด (จํานวนของตวั อักษร) แตก็ตองอยูภายใตขอ กําหนดที่
ไดก ลาวมาแลว พรอ มกนั นี้ ตัวแปรท่สี รา งข้นึ จะตองไมใชคาํ เฉพาะ (keyword หรอื reserved word)
ท่ี Java ไดส รางขึ้นไวใชงาน ดังท่ีแสดงในตาราง 2.1
ตารางที่ 2.1 keyword
abstract const finally interface return throws
float long short transient
assert continue for native static try
goto new strictfp void
boolean default if null super volatile
implements package switch while
break do import private synchronized
instanceof protected this
byte double int public throw
case else
catch enum
char extends
class final
2.2 ชนิดของขอมูล (Data Type)
ในการประกาศตวั แปรทุกคร้ังเราจะตองบอกชนดิ ของขอมลู ใหก บั ตัวแปรนนั้ ดวย ซง่ึ การประกาศตวั
แปรน้นั ตองเร่ิมตน ดว ย ชนดิ ของขอ มลู (datatype) และตามดว ย ชือ่ ของตัวแปร (identifier หรอื
variable) ตามรูปแบบทีก่ าํ หนดดังน้ี
datatype identifier
โดยท่ี datatype คอื ชนิดของขอ มลู ที่ ตัวแปรสามารถเก็บได และในภาษา Java datatype เปนไดท ้งั
ขอ มูลท่เี รยี กวา ขอ มลู พนื้ ฐาน (primitive datatype) และขอมลู ทีเ่ ปนขอมลู อางอิง (reference
type) ซง่ึ เราจะไดมาดูกนั เมอ่ื เราพดู ถึงเรอ่ื งของ class และ object
Java กาํ หนดใหมี primitive datatype จาํ นวนทงั้ สน้ิ 8 ชนิดซง่ึ สามารถแบง ออกเปนกลุมได 4 กลมุ
ดงั นี้ (ดตู ารางท่ี 2.2)
1 มีความจุ 2 byte เพ่อื รองรบั ภาษาท่ีใชกันในประเทศตา ง ๆ (เดมิ ใช ASCII ซึ่งมีความจเุ พียง 1 byte)
22
บทท่ี 2: ขอ มูล ตัวแปร และการประมวลผล
1. ตรรกะ (Logical) – boolean intro. to Java (FEU.faa)
2. ตัวอกั ษร (Textual) – char
3. เลขจํานวนเต็ม (Integral) – byte, short, int, และ long
4. เลขทีม่ ีจุดทศนยิ ม (Floating point) – double และ float
ตาราง 2.2 ขอมลู พนื้ ฐาน (primitive datatype)
datatype คาํ อธบิ าย ขนาด (bit)
มีคา เปน true หรอื false
boolean คา ทางตรรกะ 8
16
byte ตวั เลขท่ไี มม จี ุดทศนิยม 32
64
short ตวั เลขท่ไี มมีจุดทศนยิ ม 32
64
int ตัวเลขที่ไมมจี ดุ ทศนิยม 16
long ตัวเลขทไี่ มม จี ดุ ทศนยิ ม
float ตัวเลขท่ีมีจุดทศนยิ ม
double ตัวเลขท่มี ีจุดทศนยิ ม
char ตวั อกั ษร
ขนาดของ datatype จะเปน ตวั กําหนดคา ทีเ่ ราสามารถเกบ็ ไดในตวั แปรที่ไดป ระกาศในโปรแกรม ยิง่
จาํ นวนของ bit มากเทา ไรเรากส็ ามารถเกบ็ คาสงู ๆ ได ตารางที่ 2.3 แสดงคา ตา ง ๆ ทสี่ ามารถเกบ็ ได
ใน datatype ชนดิ ตา ง ๆ
ตาราง 2.3 คาท่เี กบ็ ไดใน primitive datatype ตาง ๆ
datatype คา ตํา่ สดุ คาสงู สดุ
byte -128 (-27) 127 (27 - 1)
-32768 (-215) 32767 (215 - 1)
short 2147483647 (231 - 1)
9223372036854775807 (263 - 1)
int -2147483648 (-231)
3.4 x 1038
long -9223372036854775808 (-263) 1.7 x 10308
float -3.4 x 1038
double -1.7 x 10308
2.3 ตวั อยางการประกาศตวั แปร
int numberOfBikes;
float taxRate;
double interests, PI;
boolean yesOrNo;
char response;
โดยทวั่ ไปนักพฒั นาโปรแกรมมักจะใช ตวั อกั ษรตวั เล็กเปนตวั เริม่ ตนของตวั แปร และจะเปลีย่ นเปน
อกั ษรตัวใหญเม่อื คาํ น้ัน ๆ สน้ิ สุดลง เชน การประกาศตวั แปรทเี่ หน็ ดา นบนนี้ อกี วธิ หี นึง่ ทหี่ ลาย ๆ คน
ชอบใช คือการใชเ ครือ่ งหมาย _ (underscore) เปน ตัวแบง คํา เชน
int number_of_bikes;
float tax_rate;
double cum_gpa;
boolean yes_or_no;
ท้ังน้แี ละทั้งนน้ั การประกาศตัวแปรทัง้ สองวิธีทําใหก ารอานตัวแปรทําไดง ายขึน้ แตสิง่ สาํ คญั ทเ่ี รา
จาํ เปนจะตองคํานงึ ถึงในการประกาศตัวแปรกค็ ือ การเลือกใชค าํ ที่ส่อื ถงึ ความหมายของขอ มูลทตี่ วั
แปรนน้ั ๆ รองรับ หรือ เก็บอยู เชน ถา เราตอ งการเก็บขอมูลทเี่ ปน เกรดที่เปนตวั อักษร เราก็ควรใช ตวั
แปรท่ีสือ่ ถงึ เกรดท่เี ปน ตัวอักษร เชน คําวา letterGrade และถาเราตองการเก็บเกรดทีเ่ ปนคาเฉลีย่ เรา
กค็ วรใช ตวั แปร เชน gpa หรือ cumulativeGPA เปน ตน
2.3.1 การกาํ หนดคา ใหกบั ตวั แปร (Assignment)
หลงั จากท่ีเราไดประกาศตัวแปรสาํ หรับการใชงานแลว เราจะตองกําหนดใหต ัวแปรท่เี ราสรางขึ้นมคี า
เบื้องตนสําหรับการใชง านนน้ั ๆ ไมเชนนั้นแลว Java จะฟองถึงความผดิ พลาดที่เกดิ ข้ึน ดังเชนทเ่ี กดิ
ข้ึนกับโปรแกรมตัวอยา งนี้
23
เริ่มตน การเขียนโปรแกรมดวย Java
1: class TestDefault { intro. to Java (FEU.faa)
2: public static void main(String[] args) {
3: byte bt;
4: short st;
5: int in;
6: long ln;
7: float ft;
8: double db;
9: char ch;
10: boolean bo;
11:
12: System.out.println(ch);
13: System.out.println(bt);
14: System.out.println(st);
15: System.out.println(in);
16: System.out.println(ln);
17: System.out.println(ft);
18: System.out.println(db);
19: System.out.println(bo);
20: }
21: }
หลงั จากทเี่ รา compile โปรแกรม error ท่ีเราไดค ือ
TestDefault.java:12: variable ch might not have been initialized
System.out.println(ch);
^
TestDefault.java:13: variable bt might not have been initialized
System.out.println(bt);
^
TestDefault.java:14: variable st might not have been initialized
System.out.println(st);
^
TestDefault.java:15: variable in might not have been initialized
System.out.println(in);
^
TestDefault.java:16: variable ln might not have been initialized
System.out.println(ln);
^
TestDefault.java:17: variable ft might not have been initialized
System.out.println(ft);
^
TestDefault.java:18: variable db might not have been initialized
System.out.println(db);
^
TestDefault.java:19: variable bo might not have been initialized
System.out.println(bo);
^
8 errors
ผอู านจะเหน็ วา Java ไมย อมใหเราใชตัวแปรเหลานถ้ี า ไมมกี ารกาํ หนดคากอ น ดังนั้นเราจึงจาํ เปนที่
จะตอ งกาํ หนดคาเบอ้ื งตนของตวั แปรกอนการใชทุกคร้งั 2
การกาํ หนดคา ใหก ับตวั แปรนน้ั ทาํ ไดดวยการใชเครือ่ งหมาย = (เรียกกันวา assignment operator)
ซ่ึงมคี วามหมายวา "ใหนําคา ทางขวามือ (rvalue) ของเคร่ืองหมาย = ไปเกบ็ ไวใ นตัวแปรท่อี ยู
ทางดา นซา ยมอื (lvalue) ของเครอื่ งหมาย =" rvalue สามารถเปน ไดทง้ั คา คงที่ ตวั แปร หรือ
2 Java เรียกตวั แปรที่มีการประกาศใชภายใน method (เชน method main() ทีเ่ ห็น) วา local variable ซ่ึงเปน การ
ประกาศใชท่ีตอ งการกาํ หนดคาเบอ้ื งตนกอ น แตม ตี ัวแปรอกี แบบหนง่ึ ที่ Java เรยี กวา member variable หรอื reference
variable (เชน variable ทอ่ี ยูใน class) ทไี่ มจาํ เปนตองมีการกาํ หนดคา ผา นเรา แต Java จะกําหนดคา เบอื้ งตนใหกับตวั แปร
เหลานัน้ เอง ซ่งึ มคี าตา ง ๆ ดงั น้ี
ชนิดของตัวแปร คาเบ้ืองตน จาก Java
boolean false
char '0'
byte, short, int, long 0
double, float 0.0
24
บทท่ี 2: ขอ มูล ตัวแปร และการประมวลผล intro. to Java (FEU.faa)
ประโยคใด ๆ ท่ีสามารถหาคา ได สวน lvalue เปน ไดเ ฉพาะตัวแปรเทานนั้ เพราะจะตอ งเปนทีท่ ีเ่ กบ็
ขอ มูลได (physical memory) เชน
numberOfBikes = 2;
area = PI * r * r;
taxReturned = calculateTaxReturned(income);
แตไ มใ ชแบบนี้
2 = numberOfBikes;
PI * r * r = area;
calculateTaxReturned(income) = taxReturned;
ในการกาํ หนดคา ใหกบั ตัวแปรนน้ั ถา เรามองในมุมมองของทม่ี าของคาท่ีนาํ มาใสใ หกับตัวแปร เราก็
สามารถทจี่ ะแบงการกาํ หนดคา ไดเปน สองแบบ คอื (1) การกําหนดคา ใหก ับตัวแปรภายในตวั
โปรแกรม และ (2) การกาํ หนดคาใหก ับตวั แปรผานทางส่อื การนําเขา ขอ มลู มาตรฐาน (standard I/O
channel) เราจะมาทําความเขาใจการกําหนดคาในแบบทหี่ นง่ึ กนั กอ น เพราะเปน การกาํ หนดคา ที่งา ย
ท่สี ุด
2.3.2 การกาํ หนดคาใหก บั ตัวแปรภายในโปรแกรม
ดงั ที่ไดกลาวมาแลว วาการกําหนดคา ใหก บั ตวั แปรนน้ั สําคัญมาก เพราะโดยทวั่ ไปตวั แปรจะไมมคี าใด
ๆ เลยหลังจากการประกาศ ภาษาในการเขยี นโปรแกรมหลาย ๆ ภาษาบงั คบั ใหผเู ขียนโปรแกรม
กาํ หนดคา เบอ้ื งตน กอ นที่จะใชตัวแปรนัน้ ๆ ซงึ่ ก็เปนสิ่งทด่ี ี เพราะจะทําใหก ารเขียนโปรแกรมเปนไป
ไดง าย และสะดวกตอ การตรวจสอบหากมขี อผิดพลาดเกิดขน้ึ โปรแกรมตัวอยา งท่ีเห็นนีแ้ สดงถงึ
วิธีการประกาศตัวแปรพรอ มกับการกําหนดคา เบ้ืองตนใหกบั ตัวแปรเหลาน้ัน
1: /**
2: Demonstrates variables declaration and initialization
3: */
4:
5: class Variables {
6: public static void main(String[] args) {
7: boolean booleanVar = true;
8: byte byteVar = 0;
9: byte maxByte = Byte.MAX_VALUE;
10: byte minByte = Byte.MIN_VALUE;
11: short shortVar = 0;
12: short maxShort = Short.MAX_VALUE;
13: short minShort = Short.MIN_VALUE;
14: int intVar = 0;
15: int maxInt = Integer.MAX_VALUE;
16: int minInt = Integer.MIN_VALUE;
17: long longVar = 0L;
18: long maxLong = Long.MAX_VALUE;
19: long minLong = Long.MIN_VALUE;
20: float floatVar = 0.0F;
21: float maxFloat = Float.MAX_VALUE;
22: float minFloat = Float.MIN_VALUE;
23: double doubleVar = 0.0D;
24: double maxDouble = Double.MAX_VALUE;
25: double minDouble = Double.MIN_VALUE;
26: char charVar = 'A';
27:
28: System.out.println("boolean variable: " + booleanVar);
29: System.out.println("byte variable: " + byteVar);
30: System.out.println("short variable: " + shortVar);
31: System.out.println("int variable: " + intVar);
32: System.out.println("long variable: " + longVar);
33: System.out.println("float variable: " + floatVar);
34: System.out.println("double variable: " + doubleVar);
35: System.out.println("char variable: " + charVar);
36:
37: System.out.println("Max byte: " + maxByte);
38: System.out.println("Min byte: " + minByte);
39: System.out.println("Max short: " + maxShort);
40: System.out.println("Min short: " + minShort);
41: System.out.println("Max int: " + maxInt);
25
เรมิ่ ตน การเขียนโปรแกรมดว ย Java intro. to Java (FEU.faa)
42: System.out.println("Min int: " + minInt);
43: System.out.println("Max long: " + maxLong);
44: System.out.println("Min long: " + minLong);
45: System.out.println("Max float: " + maxFloat);
46: System.out.println("Min float: " + minFloat);
47: System.out.println("Max double: " + maxDouble);
48: System.out.println("Min double: " + minDouble);
49: }
50: }
เรากําหนดคาที่เปน ศูนยใ หก ับตวั แปรทุกตวั ยกเวน ตัวแปรท่เี ปน boolean ซงึ่ เรากําหนดคา ใหเปน
true และตัวแปรที่เปน char ที่เรากาํ หนดคาใหเ ปนตวั อกั ษร A สว นตวั แปรทข่ี ึ้นตนดว ย max หรอื
min เราจะกาํ หนดคาใหเปน คาสูงสดุ และคาตา่ํ สดุ ท่ี Java มีให เราบอกให Java รูวาคาทกี่ ําหนด
ใหก บั ตวั แปรตา ง ๆ มีชนิดเปนอะไรไดดวยการใสต วั อักษรท่ีบงบอกชนดิ นั้น ๆ ของตวั แปร เชน 0L
0.0F และ 0.0D ซึ่งหมายถงึ คาของศูนยท ี่เปน long คาของศนู ยท ีเ่ ปน float และ คา ของศูนยท ่เี ปน
double ตามลําดับ ทั้งนี้เพอ่ื บอกให Java รวู าเราตองการใชคาที่เกบ็ ชนิดน้ัน ๆ จรงิ ซ่ึงเราจําเปนท่ี
จะตอ งทําเพยี งคา ของตัวแปรทเ่ี ปน float และ double เทา นนั้ เพราะวาตวั แปรท่มี ีชนิดเปน float ถา
มีการกําหนดคา Java จะเหมาเอาวา เปน double เราจงึ ตอ งกาํ หนดคาตามชนิดของตัวแปรจรงิ ๆ ท่ี
เราตอ งการ สว นตวั แปรอน่ื ๆ เรากาํ หนดใหมคี า เปน คาสูงสดุ และคาต่ําสุดที่ Java ยอมใหเปนได
ผลลพั ธของโปรแกรม Variables.java
boolean variable: true
byte variable: 0
short variable: 0
int variable: 0
long variable: 0
float variable: 0.0
double variable: 0.0
char variable: A
Max byte: 127
Min byte: -128
Max short: 32767
Min short: -32768
Max int: 2147483647
Min int: -2147483648
Max long: 9223372036854775807
Min long: -9223372036854775808
Max float: 3.4028235E38
Min float: 1.4E-45
Max double: 1.7976931348623157E308
Min double: 4.9E-324
เรามาดขู ้ันตอนที่ Java เกบ็ ขอมูลในตัวแปรกนั ดีกวา (หากจะบอกวาภาษาอน่ื ๆ ก็เกบ็ แบบนกี้ ค็ งจะ
ไมผิดนกั ) เราจะใชต วั แปรจากโปรแกรมตวั อยา งขา งบน จากประโยคของการประกาศและกําหนดคา
long longVar = 0L;
ประโยคท่เี ห็นดานบนน้ีสามารถทจ่ี ะเขยี นไดอ ีกแบบหนึง่ คือ
long longVar;
longVar = 0L;
ประโยค long longVar; นน้ั เปน การประกาศตวั แปรชื่อ longVar ทมี่ ีชนดิ เปน long สวนประโยค
longVar = 0L; นัน้ เปน การกําหนดคา 0 ใหกับตัวแปร longVar (ภาพที่ 2-1 แสดงถงึ ขนั้ ตอนในการ
สรางตัวแปรและการกําหนดคาใหกบั ตวั แปรของ Java) การประกาศพรอมกับกําหนดคา ใหกบั ตัวแปร
ในประโยคเดยี วกัน ชว ยใหก ารเขยี น code เมอ่ื มองดแู ลว สวยและกะทดั รดั ข้นึ ทงั้ นี้กค็ งจะขึน้ อยูก ับ
ตวั ผูอานเองวามคี วามคิดเหน็ อยา งไร สําหรับตวั ผเู ขียนเองคิดวาถาเปนการประกาศท่ีมีตัวแปรไมกี่ตวั
ในบรรทดั นั้นก็คงมองดแู ลว สวยดี แตถา มีมากเกนิ ไปกค็ งจะไมเขา ทาเทาไรนัก ตัวอยา งเชน
double price = 0.0D, tax = 0.7D, returned = 0.0D, interests = 0.0D, principal =
10000.0D;
โปรแกรมเมอรควรจะแยกการประกาศทเ่ี ห็นดา นบนนี้ใหอยคู นละบรรทัดเพ่อื ใหงา ยตอ การอา น และ
เปล่ียนแปลง หากมกี ารเปล่ยี นแปลงเกิดข้นึ ในโปรแกรม
26
บทท่ี 2: ขอมลู ตวั แปร และการประมวลผล
long longVar; longVar = 0L; intro. to Java (FEU.faa)
??? 0
ประกาศตัวแปรชนิด long ชอ่ื วา หลังจากกําหนดคา 0 ใหกับ
longVar ซงึ่ Java จะจอง longVar แลว หนวยความจํา ณ
หนวยความจําใหแตไ มมคี า ใด ๆ ตาํ แหนงนัน้ กจ็ ะมีคา ตามที่
ณ หนวยความจํานั้น กาํ หนดให คอื 0
ภาพท่ี 2-1 การกาํ หนดคา ใหกับตวั แปร
ในการกาํ หนดคา ใหกับตัวแปรน้นั เราไมจาํ เปนทจ่ี ะตองกําหนดคา ของตวั แปรตา ง ๆ ใหเปนศนู ย เรา
สามารถที่จะกาํ หนดคา อะไร ก็ไดใหก ับตวั แปรเหลาน้ี ทง้ั นีข้ ้ึนอยกู บั การใชง านของตวั แปรน้ัน ๆ
หลาย ๆ คร้งั ที่เราตองตดั สนิ ใจวา ควรจะใชต วั แปรชนิดใดดี ในกรณที ขี่ อ มลู เปนชนิดท่อี ยูในหมวด
เดียวกนั เชน ขอมลู เปน เลขท่ีไมมจี ุดทศนยิ ม หรอื ขอ มลู เปนเลขที่มีจดุ ทศนิยม ซง่ึ ถา เหตกุ ารณ
เหลา น้ีเกิดขน้ึ เราก็จาํ เปนทจ่ี ะตอ งคิดถงึ คา ความเปนไปไดของขอ มูลวาต่ําสดุ และสงู สุดควรเปน
เทาใด (range) เชน ถาเราตอ งการใชต ัวแปรรองรบั ขอมลู ทเ่ี ปนเลขท่ไี มม ีจุดทศนยิ มทมี่ ขี นาดไมเ กนิ
127 เรากค็ วรท่ีจะประกาศตัวแปรดว ยการใช byte แทนการใช int เปนตน
เราสามารถทจ่ี ะประกาศตัวแปรพรอมกบั การกําหนดคา ใหกับตวั แปร หลาย ๆ ตวั ในหนึ่งประโยค เชน
int length = 2, height = 8, width = 4;
double angles = 30.5, distance = 24.50;
การประกาศตวั แปรในรปู แบบนตี้ อ งใชเครือ่ งหมาย , (comma) เปนตวั แบง ตวั แปรออกจากกัน และตวั
แปรเหลานั้นจะมีชนิดเปนชนดิ เดียวกนั ตลอด เราไมสามารถประกาศตัวแปรตางชนดิ กนั ไดดวยวิธีการ
ประกาศแบบนี้ เชน
int cats = 90, float tax = 0.50; // ERROR – mixed-type
การประกาศตวั แปรไมจาํ เปน ตอ งกําหนดคา ใหท นั ที แตส ามารถที่จะกําหนดไดภ ายหลัง เชน
double radius;
radius = 2.54;
ลองมาดกู ารประกาศและกาํ หนดคาในรูปแบบอกี รูปแบบหนึ่ง
int one = 1, two = 2, three = one + two;
Java ยอมใหมีการประกาศและกาํ หนดคาแบบน้ีได เนือ่ งจากวา ตวั แปร one และ two มกี าร
กําหนดคา เรยี บรอยแลว ดังนน้ั การประกาศและกาํ หนดคาใหก บั ตวั แปร three จึงทําไดโดยไมมี
ปญหาใด ๆ จาก compiler เลย ประโยค three = one + two; เปนประโยคทมี่ กี ารประมวลผลของ
one + two กอนแลวจึงนาํ คา ท่ีไดมาเก็บไวท ต่ี ัวแปร three เราจะพดู ถึง ประโยค และ การ
ประมวลผลทีเ่ กิดข้นึ ในประโยคในโอกาสตอไป
2.4 การใช final ในการกาํ หนดคา ใหกบั ตัวแปร
หลาย ๆ ครัง้ ทีเ่ ราตองการใชคา บางคาตลอดอายกุ ารทํางานของโปรแกรม เชน คา ของ PI หรอื
คาคงทีท่ ่จี ะไมมีการเปลีย่ นแปลงใด ๆ ในขณะใชงานในโปรแกรม Java มคี าํ สัง่ ที่ user ไมสามารถที่
นํามาใชใ นการประกาศตัวแปรได (reserved word) แตเ อาไวใ ชในงานนี้โดยเฉพาะ คอื คําวา final
27
เริ่มตนการเขยี นโปรแกรมดวย Java intro. to Java (FEU.faa)
ถาเราขนึ้ ตนการประกาศตัวแปรดว ยคาํ วา final ตัวแปรนนั้ ๆ จะไมสามารถมีคา อน่ื ๆ ไดอกี ไมวาจะ
เปน การเปลย่ี นคาภายในโปรแกรม หรือ การเปลี่ยนแปลงทีเ่ กดิ จากการใสขอมลู ใหมผานทาง
keyboard ดังโปรแกรมตวั อยางท่แี สดงใหเ หน็ นี้
1: /**
2: Demonstrates the use of final keyword
3: */
4:
5: class Final {
6: public static void main(String[] args) {
7: final double PI = 3.14;
8: int radius = 2;
9:
10: System.out.println("The value of PI is " + Math.PI);
11:
12: double area = radius * radius * Math.PI;
13: System.out.println("Area of a circle is " + area);
14: }
15: }
หลังจากท่ี compile และ run โปรแกรม ผลลัพธทไี่ ดคือ
The value of PI is 3.14
Area of a circle is 12.56
ถา เราเปลีย่ นแปลงโปรแกรม Final.java ดว ยการกาํ หนดคา ใหกับตวั แปร PI ใหม ดงั ทเี่ ห็นใน
โปรแกรม FinalWithError.java น้ี compiler จะฟองดว ยขอมลู ดังท่ีเห็น
1: /**
2: Changing the value of final keyword
3: */
4:
5: class FinalWithError {
6: public static void main(String[] args) {
7: final double PI = 3.14;
8: int radius = 2;
9:
10: double area = radius * radius * PI;
11: System.out.println("Area of a circle is " + area);
12:
13: PI = 3.142;
14: area = radius * radius * PI;
15: System.out.println("Area of a circle is " + area);
16: }
17: }
ผลของการ compile
FinalWithError.java:13: cannot assign a value to final variable PI
PI = 3.142;
^
1 error
ขออธิบายถึงขอ ความ error ที่ Java ฟอ งสกั นดิ หนอย ถาผูอ า นสังเกต error ทเ่ี กิดข้ึนจะเหน็ เลข 13
ถดั จากชือ่ ของโปรแกรมทไ่ี ดรับการ compile ซงึ่ บงบอกถงึ เลขทบ่ี รรทดั ท่ี error นเี้ กิดข้ึน รวมไปถึง
ตําแหนงที่ error เกดิ ขึน้ ซง่ึ เปน ตวั ชวยใหเ รากลบั เขาไปแกไขโปรแกรมของเราไดง ายย่งิ ขนึ้ (ไมต อ ง
เสียเวลาคน หาบรรทดั ท่ีเกดิ error)
การใช final ทําใหโปรแกรมมีความแมนยําและม่นั คงมากยงิ่ ขนึ้ ความพยายามทจี่ ะเปลยี่ นคาเหลาน้ีก็
ไมสามารถทาํ ได ทําใหก ารออกแบบและพัฒนาโปรแกรมเปนไปไดดวยดี ลดขอ ผดิ พลาดทีอ่ าจ
เกิดข้นึ จากตวั โปรแกรมเมอรเ อง
ในบางครงั้ การประกาศตวั แปรตอ งการใชค าท่ีสูงมาก ๆ หรือ คา ทเ่ี ล็กมาก ๆ เชน ระยะทางจากโลก
ไปยงั ดวงอาทติ ย ซ่ึงมคี า โดยประมาณเทากับ 149, 600,000 กโิ ลเมตร (1.496 x 108) หรอื การ
กาํ หนดคา ของมวลของอเิ ลคตรอน (electron mass) ซง่ึ มีคา เล็กมาก ขนาดของมวลโดยประมาณมี
28
บทท่ี 2: ขอ มลู ตวั แปร และการประมวลผล
คา เทากับ 0.0000000000000000000000000009 กรมั (9.0 x 10-28) เรากส็ ามารถทาํ ไดด ว ยการ intro. to Java (FEU.faa)
ใชการประกาศในรปู แบบของการกําหนดคา ทางวทิ ยาศาสตร (scientific notation) เชน
final double sunDistance = 1.496E8; // 1.496 x 108
final float electronMass = 9.0E-28F; // 9.0 x 10-28
การประกาศและกําหนดคาในรูปแบบนท้ี าํ ใหการมองเห็น และ การเขยี นหรือการอานทาํ ไดงา ยยิ่งขนึ้
ลองนกึ ถงึ การทเ่ี ราตองเขยี นประโยคในการกําหนดคา ใหกับ มวลของอิเลคตรอน ทไี่ ดก ลา วถึง
ขา งตนซ่งึ มศี นู ยถงึ 27 ตวั วา นา รําคาญขนาดไหน (โปรแกรมเมอรสว นใหญร ูเรือ่ งน้ดี )ี ยิ่งถาเราเขียน
code เยอะ ๆ การกาํ หนดคา ใหก บั ตวั แปรเหลา น้ดี ว ยการเขยี นที่สนั้ ทีส่ ดุ ยอมเปน การดเี สมอ (เขียน
โปรแกรมไดไวข้นึ ?)
2.5 อายุ และ ขอบเขตการใชง าน (life-time and scope) ของตัวแปร
หลังจากที่มกี ารประกาศใชตวั แปรใด ๆ ในโปรแกรม ตวั แปรเหลา นจ้ี ะมขี อบเขต หรืออายุการใชงาน
ตามลักษณะการประกาศตวั แปรของผูเขียนโปรแกรมเอง โดยทั่วไปตวั แปรจะมอี ายุการใชง านตาม
เน้ือท่ี (block) ทต่ี วั แปรเหลานน้ั ปรากฏอยู ซงึ่ จะอยูในเครื่องหมาย {} เชนโปรแกรมตัวอยางตอไปน้ี
1: /**
2: Showing scope of variables
3: */
4:
5: class Scope {
6: public static void main(String[] args) {
7: int x = 5, y = 8;
8:
9: System.out.print("Value of x is ");
10: System.out.println(" Value of y is " + y);
11: //create scope for x and w
12: {
13: int x = 45;
14: int w = 89;
15: System.out.println("Value of w in brackets is " + x);
16: System.out.println("Value of y in brackets is " + y);
17: }
18: //error w is out of scope
19: System.out.println("Value of w is " + w);
20: }
21: }
เปนทีแ่ นน อนอยูแลววา โปรแกรม Scope.java จะ compile ไมผ าน เนอ่ื งจากเหตผุ ลสองอยา งดังที่
compiler ฟอง คอื (1) ตัวแปร int x ไดม กี ารประกาศใน main() แลว และ (2) ตัวแปร int w ไมไ ด
อยูใน scope ของมนั เอง ซงึ่ ในที่นคี้ อื block ทม่ี ีการประการ int x และ int w
Scope.java:13: x is already defined in main(java.lang.String[])
int x = 45;
^
Scope.java:19: cannot find symbol
symbol : variable w
location: class Scope
System.out.println("Value of w is " + w);
^
2 errors
ในภาษาอนื่ เชน C++ การประกาศตัวแปรใน block ใหมด ว ยตัวแปรทมี่ ีช่ือซา้ํ กนั สามารถทําไดโ ดย
ไมมเี ง่อื นไขใด ๆ (ดังทเ่ี หน็ ในโปรแกรม Scope.java) แตต วั Java เองไมยอมใหม กี ารประกาศตวั
แปรซํา้ ถงึ แมว าจะอยูใน block ใหมทซ่ี อนกันอยูก็ตาม ยกเวน ในกรณีทเ่ี ราสราง block ใหมท ีไ่ มซอน
กัน ดังทีเ่ ห็นน้ี
{
int w = 3;
}
{
int w = 5;
}
29
เรม่ิ ตนการเขียนโปรแกรมดว ย Java intro. to Java (FEU.faa)
ลองมาดโู ปรแกรม Scope2.java
1: /**
2: Showing scope of variables
3: */
4:
5: class Scope2 {
6: static int x = 8, y;
7: public static void main(String[] args) {
8: {
9: int x;
10: x = 5;
11: y = x;
12: System.out.println("Value of y is " + y);
13: }
14: y = x;
15: System.out.println("Value of y is " + y);
16: }
17: }
โปรแกรม Scope2.java หลังจากท่ี compile ผานแลว จะไดผ ลลพั ธด งั น้ี
Value of y is 5
Value of y is 8
จะเหน็ วา compiler ยอมใหผานท้งั นเี้ พราะตวั แปร x ใน block ดา นในมกี ารประกาศและกําหนดคา
อยา งสมบรูณ และ ตัวแปร x ใน scope ดานนอกมีการกาํ หนดใหเปน static ซึง่ เปนตัวแปรที่ Java
เรยี กวา class variable ดังนนั้ ตวั แปรท้ังสองจึงไมใชต วั แปรเดยี วกัน เพราะฉะนนั้ การกําหนดคา ใหกบั
ตวั แปร y ใน block ดา นในจะไดค า ของตวั แปร x ท่อี ยดู า นใน และการกาํ หนดคาใหกับ y อีกครง้ั ดา น
นอกจึงไดค าของ class variable ท่ชี ่ือวา x
เรามาลองดโู ปรแกรมตวั อยางอีกโปรแกรมหน่งึ
1: /**
2: Showing scope of variables
3: */
4:
5: class Scope2v1 {
6: static int x = 8, y;
7: public static void main(String[] args) {
8: {
9: x = 5;
10: y = x;
11: System.out.println("Value of y is " + y);
12: }
13: y = x;
14: System.out.println("Value of y is " + y);
15: }
16: }
โปรแกรม Scope2v1.java แสดงการใชต วั แปร x ตัวเดยี วทไี่ ดป ระกาศกอ น method main() ซ่ึงมคี า
เปน 8 ดังนน้ั การเปลี่ยนคา ของ x ใน block ดา นในทาํ ใหค า ของตัวแปร x เปนคาลาสดุ คอื 5 ผลลัพธ
ของการ run โปรแกรมนีจ้ ึงไดอ ยา งท่ีคาดหวงั ไว คือ
Value of y is 5
Value of y is 5
ลองมาดูอีกตวั อยางหนึ่ง
1: /**
2: Showing scope of variables
3: */
4:
5: class Scope3 {
6: static int x = 20;
7: public static void main(String[] args) {
8: System.out.println("x = " + x);
30
บทที่ 2: ขอ มูล ตวั แปร และการประมวลผล intro. to Java (FEU.faa)
9: int x = (x = 12) + 8;
10: System.out.println("Value of local x is " + x);
11: }
12: }
ในโปรแกรม Scope3.java นเี้ ราประกาศตวั แปรสองตวั ที่มชี ื่อเหมอื นกันคือ x โดยที่ตวั หนงึ่ มี scope
อยใู น class Scope3 และอกี ตัวหนึ่งมี scope อยูใ น method main() และเมือ่ compile ผา นแลว
ผลลัพธท ีไ่ ด คอื
x = 20
Value of local x is 20
ในบรรทดั ท่ี 8 การแสดงผลท่เี กดิ ขึ้นเปน การแสดงผลของตัวแปร x ทีอ่ ยูภายนอก main() สวนการ
แสดงผลในบรรทัดที่ 10 เปนการแสดงผลของตัวแปร x ทเี่ ราไดป ระกาศใชภายใน main() ซึ่งเปนคน
ละตัวกนั เหมอื นท่ีไดก ลาวไวแลว
1: /**
2: Showing scope of variables
3: */
4:
5: class Scope4 {
6: public static void main(String[] args) {
7: int x = (x = 12) + 8;
8: System.out.println("Value of local x is " + x);
9: }
10: }
โปรแกรม Scope4.java เปน โปรแกรมเดยี วกนั กบั โปรแกรม Scope3.java เพยี งแตเ ราลบการประกาศ
ตวั แปรทอี่ ยดู านนอกออก และเมือ่ compile และ run ผลลัพธท่ไี ดก ็คอื ผลลพั ธเดิมที่ไดจ าก
โปรแกรม Scope3.java
ลองมาดอู ีกตวั อยา งหนง่ึ
1: /**
2: Showing scope of variables
3: */
4:
5: class Scope6 {
6: public static void main(String[] args) {
7: int x = 12, y = x + 8;
8: System.out.println("Value of local y is " + y);
9: }
10: }
ซงึ่ ไดผลลัพธห ลงั จากการ compile และ run ดงั นี้
Value of local y is 20
การประกาศและกําหนดคา แบบน้ีสามารถทําไดเ พราะ x ไดร ับการกําหนดคากอนที่จะถกู นาํ มาใชใน
การประกาศและกาํ หนดคา ใหก บั ตัวแปร y
การประกาศและกาํ หนดคา ใหก ับตวั แปรใด ๆ นนั้ จะตองคาํ นงึ ถึงการใช และขอบเขตของการใชเสมอ
ท้ังนใ้ี นการกาํ หนดคา ใด ๆ ใหก บั ตัวแปรน้ันสิ่งท่นี าํ มากําหนดคา นัน้ ในตวั ของมันเองจะตองมีคาอยู
แลว หรอื สามารถทจ่ี ะทาํ การประมวลคาไดก อ นท่จี ะนาํ มาใชในการกําหนดคา ใหก ับตัวแปรอ่นื ดงั เชน
ตัวอยา งทเี่ หน็ กอนหนา นี้
2.6 การสรางประโยค (statement and expression)
ในภาษา Java ประโยค (statement) จะตอ งจบดวยเครือ่ งหมาย ; (semicolon) เสมอดังตวั อยา งท่ี
แสดงใหเห็นน้ี
int priceOfBook = 125;
float taxReturn;
31
เร่ิมตนการเขยี นโปรแกรมดวย Java intro. to Java (FEU.faa)
เราไมจ ําเปนจะตองเขยี นประโยคใหจ บภายในบรรทดั เดยี ว แตท ่สี ําคญั ตอ งมีเครื่องหมาย ; ปด ทา ย
เสมอ เชน
int
priceOfBook
=
125
;
Java จะมองหาเครือ่ งหมาย ; เสมอโดยไมแ ยแสวาประโยคนั้น ๆ จะกนิ เนอื้ ทก่ี ี่บรรทัด แตท ี่สาํ คัญก็
คอื การเขียนท่ีทําใหอ านไดง า ย ยอมจะทาํ ใหทง้ั เรา และผูอ่ืนสามารถทจี่ ะดู code ไดรวดเร็วยงิ่ ข้นึ ถา
ไมเชื่อลองดู code จากโปรแกรมน้ดี ูสิ
/* Scope2v1.java - Showing scope of variables* @author faa xumsai*/class
Scope2v1{static int x = 8, y;public static void main(String[] args) { {int x;x =
5;y = x;System.out.println("Value of y is " + y);}y = x; System.out.println("Value
of y is " + y);}}
การเขยี น code ใหม ีรปู แบบทเี่ หมาะสม อานไดง าย จะทําใหการพัฒนาโปรแกรมเปนไปไดด ว ยความ
รวดเรว็ และเปนท่ียอมรับตามระบบสากล รูปแบบที่เหมาะสมนนั้ คือมกี ารยอ หนา (indentation)
เพื่อใหก ารอา นทําไดงา ย และมองดูแลวสวยงาม ดังโปรแกรมตวั อยา งหลาย ๆ ตวั ทแ่ี สดงใหเ ห็นกอ น
หนา นี้
Expression หมายถงึ ประโยคในภาษา Java ที่ไดร ับการยอมรบั วา อยูในรูปแบบที่ไดกําหนดไว เชน
ประโยคในเรือ่ งของการกําหนดคา ใหก บั ตวั แปร ประโยคท่ีตองมกี ารประมวลผลในรปู แบบตา ง ๆ เชน
การประมวลผลทางดานคณิตศาสตร (mathematical evaluation) การประมวลผลทางดานตรรกะ
(relational evaluation) เปนตน
การประมวลผลทางดา นคณิตศาสตรน้ัน มี operator ที่ใชอ ยูดงั น้ี คือ + (บวก), – (ลบ), * (คณู ), /
(หาร) และ % (การหาเศษทเี่ หลือจากการหารตัวเลขสองตวั ) โปรแกรมตวั อยางตอไปน้ีแสดงถงึ การ
ประมวลผลของขอมูลดวย operator ชนดิ ตา ง ๆ ทไี่ ดกลาวถงึ
1: /**
2: Shows mathematical operators
3: */
4:
5: class OperatorsOnInt {
6: public static void main(String[] args) {
7: int i, j, k;
8:
9: //generate random number between 1 and 10
10: j = 1 + (int)(Math.random() * 10);
11: k = 1 + (int)(Math.random() * 10);
12: System.out.println("j = " + j + " and k = " + k);
13:
14: //evaluate and display results of math operators
15: i = j + k; System.out.println("j + k = " + i);
16: i = j - k; System.out.println("j - k = " + i);
17: i = j * k; System.out.println("j * k = " + i);
18: i = j / k; System.out.println("j / k = " + i);
19: i = j % k; System.out.println("j % k = " + i);
20: }
21: }
เนือ่ งจากวาเราตองการทจี่ ะแสดงถึงการสรา งประโยคและการประมวลผลดว ยคาทม่ี าจาก ขางใน
โปรแกรมเอง และเราไดใ ชเ คร่ืองมือในการสรางคาเหลา นใี้ หเ ราแบบอตั โนมตั ิ ซึ่งเครื่องมอื ท่ีวานก้ี ็คือ
method random() ท่ีมาจาก class Math (มอี ยใู น Java แลว ) method random() จะสรางคา
ระหวา ง 0 – 0.9+ พูดงา ย ๆ ก็คอื คา ตํา่ สุดคือ 0 และคาสงู สุดคอื คา ที่ใกล 1 แตไมเทา กบั 1 (คา n
ใด ๆ ทีอ่ ยใู นเงื่อนไขน้ี Æ 0.0 <= n < 1.0) เมอื่ ไดค านีแ้ ลว เราคณู คานด้ี วย 10 แลวบวก 1 เราก็จะ
ไดค าระหวาง 1 – 10 หลงั จากนัน้ เราก็คํานวณหาคา i ดว ยการใช operator ตาง ๆ พรอ มทั้งแสดง
คา ทหี่ าไดไปยงั หนา จอ และเมอื่ run โปรแกรมผลลพั ธท่ไี ดค อื
j = 5 and k = 2
j+k=7
32
บทที่ 2: ขอ มูล ตัวแปร และการประมวลผล intro. to Java (FEU.faa)
j-k=3
j * k = 10
j/k=2
j%k=1
และเนอื่ งจากวาเราใช method random() เปนตัวหาคา ดงั นนั้ การ run ในแตละครัง้ กจ็ ะไดผ ลลพั ธท ่ี
อาจซ้าํ กนั หรือแตกตา งกนั
Operator ตวั อนื่ ๆ ก็เหมือนกับการคํานวณ ทางดานคณิตศาสตรทีเ่ ราคุน เคยโดยทวั่ ไป ยกเวน %
ซง่ึ เปนการหาเศษจากการหารตวั เลขที่เปน integral และ floating point ประโยคจากโปรแกรมทว่ี า
i = j % k;
จะนาํ เอาคาของตวั แปร k คือ 2 ไปหารคาของตัวแปร j ซึ่งมคี า เปน 5 แลวเก็บเศษทไี่ ดจากการหาร
ไว (ซึง่ ก็คือ 1) เม่ือไดแ ลวก็นําคาน้ีไปเกบ็ ไวใ นตวั แปร i ตอ ไป
โปรแกรมตัวอยางตอไปน้แี สดงถึงการกาํ หนดคาดวยขอมลู ชนดิ int และ double
1: /**
2: Shows mathematical operators
3: */
4: import java.util.Random;
5:
6: class Operators {
7: public static void main(String[] args) {
8: //do the ints
9: int i, j, k;
10:
11: //generate random number between 1 and 10
12: Random rand = new Random();
13: j = 1 + rand.nextInt(10);
14: k = 1 + rand.nextInt(10);
15: System.out.println("j = " + j + " and k = " + k);
16:
17: //evaluate and display results of math operators
18: i = j + k; System.out.println("j + k = " + i);
19: i = j - k; System.out.println("j - k = " + i);
20: i = j * k; System.out.println("j * k = " + i);
21: i = j / k; System.out.println("j / k = " + i);
22: i = j % k; System.out.println("j % k = " + i);
23:
24: //do the doubles
25: double v1, v2, v3;
26: //generate random double between 1.0 and 10.0
27: v1 = 1.0 + rand.nextDouble() * 9;
28: v2 = 1.0 + rand.nextDouble() * 9;
29: System.out.println("v1 = " + v1 + " v2 = " + v2);
30: v3 = v1 + v2; System.out.println("v1 + v2 = " + v3);
31: v3 = v1 - v2; System.out.println("v1 - v2 = " + v3);
32: v3 = v1 * v2; System.out.println("v1 * v2 = " + v3);
33: v3 = v1 / v2; System.out.println("v1 / v2 = " + v3);
34: }
35: }
ผลลัพธท ไ่ี ดคอื
j = 7 and k = 6
j + k = 13
j-k=1
j * k = 42
j/k=1
j%k=1
v1 = 3.5279786640632915 v2 = 9.035898448743211
v1 + v2 = 12.563877112806502
v1 - v2 = -5.5079197846799195
v1 * v2 = 31.878456937808643
v1 / v2 = 0.39044027376757345
33
เรมิ่ ตนการเขียนโปรแกรมดว ย Java
โปรแกรม Operators.java แสดงตวั อยางของการกาํ หนดคา และ การคาํ นวณดว ย operator อยา ง intro. to Java (FEU.faa)
งาย ๆ ทางดา นคณิตศาสตร โดยเริ่มตน ดว ยการกําหนดคา ใหกับตัวแปร i และ j ดว ยการสรา งคาแบบ
สุม (random) จาก method nextInt(max value) ซง่ึ method นี้จะกําหนดคาทอี่ ยรู ะหวาง 0 ถงึ
คา ที่กาํ หนดใน max value แตไ มร วมตัว max value ดว ยซง่ึ ถา เราตอ งการท่ีจะสรา งคา ที่อยูระหวาง
1 ถึง 10 เรากต็ อ งบวก 1 เขากับคาที่เกดิ จากการเรียกใช method นีด้ ว ย ดงั ทีไ่ ดก าํ หนดไวใน
โปรแกรม
เราสามารถทจ่ี ะเขียนประโยคท่มี ีการประมวลผลในรูปของประโยคทมี่ หี ลายตัวแปรในประโยคเดยี วกนั
ได ดงั ตวั อยา งน้ี
1: /**
2: Shows mathematical operators
3: */
4:
5: class Operators1 {
6: public static void main(String[] args) {
7: int a, b, c, d, e;
8:
9: b = 1 + (int)(Math.random() * 10);
10: c = 1 + (int)(Math.random() * 10);
11: d = 1 + (int)(Math.random() * 10);
12: e = 1 + (int)(Math.random() * 10);
13:
14: System.out.print("b = " + b + " c = " + c);
15: System.out.println(" d = " + d + " e = " + e);
16: a = b + c - d;
17: System.out.println("Value of a is " + a);
18: a = b * c - d;
19: System.out.println("Value of a is " + a);
20: a = b / c * d;
21: System.out.println("Value of a is " + a);
22: }
23: }
ผลลพั ธท่ไี ดจ ากการ run คือ
b=8c=2d=6e=5
Value of a is 4
Value of a is 10
Value of a is 24
2.7 การประมวลผล
เม่ือมีตวั แปรหลายตวั ในการประมวลผลของประโยค ลําดบั ขัน้ (precedence) ของการประมวลผลมี
ความสําคญั ทันที ท้ังนกี้ เ็ นือ่ งมาจากรปู แบบของการประมวลผลตามช้ันของ operator ตา ง ๆ มีลําดบั
การประมวลผลท่ีไมเ ทา กนั (กอ น หรือ หลงั ) ซึง่ เปนไปตามลาํ ดับขัน้ ของการประมวลผลตามกฎของ
การประมวลผลทางดานคณิตศาสตร ดังตารางที่ 2.4
ตาราง 2.4 Operator Precedence การประมวลผล
Operator ตามกลุม
ซายไปขวา
(), [], ., postfix ++, postfix -- ขวาไปซา ย
unary +, unary –, prefix ++, prefix -- ซา ยไปขวา
(datatype), new ซา ยไปขวา
*, /, %
ซายไปขวา
+, - ซายไปขวา
<<, >>, >>> ซา ยไปขวา
<, <=, >, >=, instanceof ซา ยไปขวา
==, !=
ซายไปขวา
& ซายไปขวา
^ ซา ยไปขวา
| ซายไปขวา
&&
34
บทท่ี 2: ขอมลู ตัวแปร และการประมวลผล
|| ซายไปขวา intro. to Java (FEU.faa)
?: ซายไปขวา
=, +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, |=, ^= ขวาไปซาย
2.7.1 การประมวลผลขอมลู ทเ่ี ปน integer
การประมวลผลขอ มลู ท่ีเปน integer ทง้ั หมดไมม ีความสลับซับซอ นอะไรเลย เปน การประมวลผล
เหมือนกบั ทเ่ี ราเคยเรยี นมา ในวิชาคณิตศาสตรซงึ่ ลําดับข้ันของการประมวลผลก็ข้ึนอยกู บั ชนิดของ
operator ทีใ่ ชในการประมวลผลนน้ั ๆ เชน การคูณและการหาร ทํากอน การบวกและการลบ
statement
50 * 2 – 45 / 5
จะไดผลลพั ธค อื 91 ซงึ่ ไดม าจากการนําเอา 2 ไปคณู 50 กอนหลังจากน้ันกเ็ อา 5 ไปหาร 45 เม่ือได
แลว ก็นําเอาผลลพั ธท่ไี ดไปลบออกจากผลลพั ธข องการคูณ 50 กับ 2 ซง่ึ มีคาเทา กับ 100 – 9
แตถ า เราตองการท่จี ะใหการประมวลผลอยูในรูปแบบอ่ืน ท่เี ราตอ งการเราก็ใชว งเลบ็ เปนตัวกาํ หนด
เชน ถาเราตอ งการที่จะใหก ารลบเกิดกอน ในประโยคท่เี ห็นกอนหนาน้ีเรากเ็ ขียนใหมเ ปน
50 * (2 – 45) / 5
ซึ่งมคี า เทาเทยี มกบั ประโยค
50 * -43 / 5
และมีคาเทากบั -430
เน่อื งจากวา การประมวลผลขอ มูลทเี่ ปน integer โดยเฉพาะการหารนนั้ เราจะไมม ีเศษเหลือใหท าํ การ
หารตอไปเหมือนที่เราเคยหารกันมา เชน ถาเราเอา 4 ไปหาร 9 เรากจ็ ะได 2.25 แตถ า เปนการหาร
ดว ย integer ใน Java แลวผลลัพธที่เราไดจากการหารนจ้ี ะเปน 2 เทา น้ัน เราจะไมไดเศษ เราจะได
แตสวน ลองดตู ัวอยางตอไปนี้
5/2=2
125 / 4 = 31
3/9=0
15 / 15 = 1
แตเราก็หาเศษไดดวยการใช operator % ดงั ท่ีไดแสดงในโปรแกรมตวั อยางกอนหนาน้ี หรอื ดงั
ตัวอยางการหาเศษตอ ไปนี้
5%2=1
125 % 4 = 1
3%9=3
15 % 15 = 0
โดยท่วั ไปเทา ทพี่ บเห็นและประสพมา ผูอานทีใ่ หมตอ การเขียนโปรแกรม มกั จะสบั สนในเรื่องของการ
หาเศษ หรอื การหาสวนของขอมูลท่ีเปน integer อยา งไรก็ตามเรอื่ งเหลานม้ี ักจะหายไปถา ไดท ดลอง
ทําอยางสมํ่าเสมอ สาํ หรับ Java น้ันการหาเศษสามารถท่ีจะทาํ ไดกับขอ มลู ที่เปน double หรือ float
ดวย แตใ นท่นี จ้ี ะทิ้งไวใหผ ูอา นไดท ดลองทําการตรวจสอบดเู อง (เนอื่ งจากวาผูเขียนเองยังมองไม
เห็นประโยชนข องการหาเศษจากขอมูลทเี่ ปน double หรอื float เลย)
ในการเขียนโปรแกรมนนั้ เราเก็บขอมูลไวใ นตวั แปร ดงั นั้นการประมวลผลก็ตอ งทาํ กับตวั แปรเหลาน้นั
เชน เราสามารถทีจ่ ะคาํ นวณหาคาของภาษมี ลู คา เพมิ่ (vat) จากตวั แปร price และ rate ถา ตวั แปร
ทั้งสองไดร ับการกําหนดคาเรยี บรอยแลว เชน
double price = 120.0, rate = 7.5;
35
เรม่ิ ตนการเขียนโปรแกรมดวย Java intro. to Java (FEU.faa)
double vat = price * rate;
ลองมาดูโปรแกรมตัวอยางการประมวลผลดว ยขอ มลู ทเ่ี ปน integer
1: /**
2: Integer calculation
3: */
4:
5: class IntegerCal {
6: public static void main(String[] args) {
7: //declares and initialize three variables
8: int studentNumber = 40;
9: int teacherNumber = 30;
10: int totalNumber = 0;
11:
12: totalNumber = studentNumber + teacherNumber;
13:
14: //display result
15: System.out.print(studentNumber + " students + " + teacherNumber);
16: System.out.println(" teachers = " + totalNumber + " people");
17:
18: System.out.println("30 + 45 = " + 30 + 45);
19: }
20: }
โปรแกรม Integer.java เปนการแสดงถึงการคํานวณหาคาของผลรวมของจํานวนนักศกึ ษา
(studentNumber)และครู (teacherNumber) จากประโยค
totalNumber = studentNumber + teacherNumber;
ซ่ึงขน้ั ตอนของการประมวลผล อาจพดู ไดค ราว ๆ คอื Java นาํ เอาคาท่ีเกบ็ ไวในตัวแปร
studentNumber และคาท่เี กบ็ ไวในตัวแปร teacherNumber มารวมกนั และนาํ เอาผลลัพธท ีไ่ ดไป
เกบ็ ไวในตัวแปร totalNumber ผา นทางเครื่องหมาย = (assignment operator) ลองดภู าพที่ 2-2
teacherNumber
studentNumber
40 + 30
totalNumber 70
ภาพที่ 2-2 การบวก integer สองตัว
ในการแสดงผลลัพธท ไ่ี ดจากการประมวลผลไปยังหนาจอนนั้ เราสงผานทาง System.out.print()
และ System.out.println() ประโยค
System.out.print(studentNumber + " students + " + teacherNumber);
จะใหผ ลลัพธค ือ คา ทเี่ ก็บไวในตวั แปร studentNumber ตามดวย string ทม่ี คี า เปน "student +"
ตามดวยคา ทเี่ กบ็ ไวใ นตัวแปร teacherNumber ในบรรทดั เดียวกัน หลงั จากน้ันประโยค
System.out.println(" teachers = " + totalNumber + " people");
36
บทท่ี 2: ขอ มลู ตัวแปร และการประมวลผล intro. to Java (FEU.faa)
ก็จะใหผ ลลัพธ คอื string ที่มคี าเปน " teachers = " ตามดว ยคา ทเี่ ก็บไวใ นตัวแปร totalNumber
ตามดว ย string ท่มี คี าเปน " people" ซึ่งเม่อื รวมแลว ทั้งหมดก็จะไดผ ลลัพธท ีแ่ สดงไปยงั หนาจอ
ดงั นี้ (หลังจากแสดงผลลพั ธ cursor จะไปอยใู นบรรทัดใหม)
40 students + 30 teachers = 70 people
คําวา "ตามดว ย" จากคําอธิบายดา นบนน้เี กดิ จากการประมวลผลของ Java กับเคร่อื งหมาย + ในการ
ใชป ระโยคของการแสดงผล (System.out) ขอ มลู ใด ๆ ที่อยูใ นเคร่ืองหมาย " " จะถูกสง ไปยัง
หนา จอ แตถาเปนตวั แปรหรือประโยคที่ตองมกี ารประมวลผลอีก Java จะทําการประมวลผลกอ น
เพ่ือใหไ ดค า สดุ ทายที่สามารถจะสงออกไปหนาจอได เชน
System.out.println("30 + 45 = " + (30 + 45));
ส่ิงทถ่ี ูกสง ออกไปกอนคอื "30 + 45 = " ตามดว ยคา ของการประมวลผลของประโยค (30 + 45) ซง่ึ
กค็ อื 75 ดงั นั้นผลลัพธท ่สี งไปยงั หนาจอคือ
30 + 45 = 75
วงเลบ็ ในประโยคของการบวก 30 กบั 45 ก็มีสวนสาํ คัญเพราะถา ไมมี Java กจ็ ะแสดงผลเปน
30 + 45 = 3045
การใสว งเล็บเปนการบอก Java ใหท าํ การคาํ นวณหาคาของประโยคนั้น ๆ ทัง้ นีเ้ ฉพาะในประโยคท่ใี ช
System.out เทานนั้ สวนการประมวลผลทอ่ี ่ืน ๆ ก็ทําตามเดมิ เหตุทีเ่ ปน เชน นก้ี เ็ พราะวา System.out
จะนําคา นั้น ๆ ทเี่ ปนอยไู ปแสดงถา ไมมีการคาํ นวณใด ๆ
สมมติวาเราตอ งทาํ การบวกคา ใดคาหนง่ึ ใหกบั ตวั แปร เราก็สามารถทจ่ี ะสรางประโยคไดเหมือนกบั ท่ี
เราเคยทาํ มากอนหนานี้ เชน total = total + value;
ถาเราลองเขียนภาพแทนประโยคดงั กลา ว เรากอ็ าจเขียนไดดังน้ี
value
total
total + value
ภาพที่ 2-3 การเพิ่มคาใหกับตัวแปรตัวเดิม
ประโยคทีเ่ หน็ ดา นบนนสี้ ามารถทจี่ ะเขียนอีกแบบได ดงั นคี้ อื
total += value;
เราใชเคร่อื งหมาย += ในการสรา งประโยคของเรา แตไดผลลพั ธเ ชน เดยี วกันกบั ประโยคกอ นหนานี้
และลดเวลาในการเขียนลง (ถึงแมวา จะไมมากก็ตาม) เชนเดียวกับการประมวลผลดว ย operator ตัว
อ่ืน ๆ เราก็สามารถจะใชว ธิ ีเดยี วกนั น้ีได ดงั ทไ่ี ดส รปุ ไวใ น ตาราง 2.5
37
เรม่ิ ตน การเขียนโปรแกรมดว ย Java
ตาราง 2.5 การใช operator ตา ง ๆ รวมกับการกําหนดคา intro. to Java (FEU.faa)
ประโยคตัวอยาง ประโยคทไ่ี ดผ ลลพั ธเ หมอื นกนั
sum = sum + count; sum += count;
sum = sum - count; sum -= count;
sum = sum * count; sum *= count;
sum = sum / count; sum /= count;
sum = sum % count; sum %= count;
การกาํ หนดคาแบบนไ้ี มจ ําเปนที่จะตองทํากับตัวแปรเทา น้ัน เราสามารถที่จะทํากบั คาคงทีอ่ ่ืน ๆ ได
เชน
total += 4;
sum += 1;
ยังมี operator ทเ่ี ราสามารถใชไดโ ดยไมต องเสยี เวลาในการเขียนมากมายนกั เชน การเพ่ิม หรือ ลด
ทีละหนงึ่ คา ดังประโยคตัวอยาง
count = count + 1;
value -= 1;
ทั้งสองประโยคทเี่ ห็นดา นบนทาํ การเพ่มิ คาและลดคา ทีละหน่งึ คา ตามลําดบั เราสามารถท่ีจะเขยี น
ใหมดว ยการใช operator ++ และ operator -- ไดดังนี้ คอื
count++;
value--;
จะเห็นวา ถาเราตองการเพม่ิ คา เพยี งแคห น่ึงคา เราก็ใชเครือ่ งหมาย ++ ตามหลงั ตัวแปรนน้ั
เชนเดยี วกนั ถา เราตองการลดคา ลงหน่ึงคา เราก็ใชเครอ่ื งหมาย –- ตามหลังตัวแปรนน้ั เราเรียกการ
เขยี นแบบน้ีวา การเขียนแบบ postfix (postfix notation) ซึง่ เปน การใช operator ตามหลงั ตวั แปร
และ Java ยอมใหม ีการเพิม่ หรือลดคา ไดเ พยี งแคหนงึ่ คาเทานัน้ ถา เราตอ งการเพิ่มหรอื ลดคามากกวา
หนง่ึ คา เราตองใชวิธีสองวิธีทไี่ ดแ สดงการใชก อนหนานี้ เชน ถา ตอ งการเพมิ่ ทีละสอง เราก็เขียนเปน
total += 2;
และถา เราตอ งการลดทีละสาม เรากเ็ ขยี นเปน
total -= 3;
Java ยงั มี Operator อีกตัวหนงึ่ ที่เราสามารถเลอื กใช ในการประมวลผลถา เราคํานงึ ถงึ ขน้ั ตอนของ
การประมวลผล วา ควรจะทําอะไรกอ น อะไรหลงั ดงั ประโยคตวั อยา งตอ ไปน้ี
int count = 8, value = 5;
count = count + value++;
ถา มองดเู ผนิ ๆ เราก็อาจบอกวาประโยคนเี้ ปน การบวกคา ของตวั แปร value เขากบั ตวั แปร count
พรอมกับการเพิ่มคาใหก บั ตัวแปร value อกี หนึ่งคา แตเรารูหรอื ไมว า อะไรไดร บั การประมวลผลกอน
count + value กอน หรอื value++ กอ น และผลลัพธท ไี่ ดจ ากการบวกคืออะไร
จากประโยคดา นบน Java จะนําเอาคาของ value มาบวกเขากับคาของ count กอน หลังจากนน้ั จงึ
เพ่ิมคา ใหกบั ตัวแปร value อีหนึง่ คา ดงั นัน้ ถา เรา execute ประโยค count = count + value++ เรา
กจ็ ะไดผ ลลพั ธเปน 13 และคาของ value หลงั จากการบวกจะเปน 6 แตถา เราเปลี่ยนประโยคใหเ ปน
ดงั นี้
count = count + ++value;
เราจะไดผลลพั ธจากการบวกเปน 14 (ทาํ ไม)
38
บทที่ 2: ขอมลู ตัวแปร และการประมวลผล intro. to Java (FEU.faa)
เน่อื งจากวาเราใชเคร่อื งหมาย ++ นาํ หนาตัวแปร ดงั น้ัน Java จึงทําการเพ่ิมคาใหก ับตัวแปร value
กอน หลังจากนั้นจงึ นาํ คา ทีไ่ ดน ี้ไปบวกเขา กับคา ของตัวแปร count ผลลพั ธท่ีไดจงึ เปน 14 ดังทีเ่ ห็น
เราเรียกการเขียนแบบน้วี าการเขยี นแบบ prefix (prefix notation)
ขน้ึ อยกู ับตาํ แหนง ที่ใช prefix หรอื postfix ในประโยค บางครัง้ การประมวลผลจาก Java อาจได
ผลลพั ธท ่เี หมือนกนั เราจะกลับมาพูดถงึ กรณดี ังกลา วในเร่ืองของการทาํ งานแบบวน หรอื loop
(repetition)
ลองมาดตู วั อยา งการใช prefix และ postfix กันอกี สกั หนอย
int count = 10, value = 5;
count--;
value++;
value = ++count + ++value;
ถาเรา execute ประโยค value = ++count + --value; เราก็จะไดผ ลลัพธ คือ value มีคาเปน 17
เพราะกอนหนาน้ัน count มคี า เปน 9 และ value มคี าเปน 6 (จาก count—และ value++) แตไ ดรบั
การเพ่มิ ใหอ กี หนง่ึ คากอ นการบวกในประโยคสุดทาย
ถาหากวาเราตอ งการให code ทเ่ี ขียนนัน้ อานไดงายขน้ึ เราก็อาจใชว งเล็บเปนตวั ชว ยกไ็ ด เชน
value = (++count) + (++value);
หรืออาจเขยี นใหด ูแลว เวียนหวั แบบน้ี
value = (count += 1) + (value += 1);
หรือแบบน้ี
value = (count = count + 1) + (value = value + 1);
สว นประโยคตอ ไปนีจ้ ะใหผ ลลัพธต างจากตัวอยา งดานบน (ทาํ ไม?)
value = (count++) + (value++);
ถาเราลองวเิ คราะหป ระโยคดานบนนี้ ดวยคาของ count = 10 และคา ของ value = 5 และตาม
ขอ กาํ หนดการใชงานของ postfix ++ เราก็ตองสรปุ วา Java จะนาํ เอาคา ของ count ซ่งึ มคี า เทากบั
10 บวกเขากับคาของ value ซึง่ มีคา เทา กับ 5 เมอ่ื ไดแลว กน็ ําผลลพั ธท ีไ่ ดไปเกบ็ ไวในตัวแปร value
ดังนัน้ value จึงมคี า เทา กับ 15 หลงั จากนัน้ กจ็ ะเพ่มิ คา ใหก บั count และ value อีกหน่ึงคา ซงึ่ ทําให
count มคี าเทากับ 11 และ value มคี าเทา กบั 16
แตเม่อื ทดลอง run ดูแลวผลลพั ธทไ่ี ดกลับเปน value = 15 และ count = 11 ทาํ ไม? เพือ่ ใหเ กดิ
ความกระจางเราก็ทดลองเขยี นประโยคตรวจสอบใหม คอื
value = 5;
value = value++;
และเมอ่ื run ดูเราก็ไดผลลพั ธเปน value = 5 ทําใหเราคอนขางจะมัน่ ใจวา Java ไมยอมให postfix
operator ++ เพิ่มคา ใหก ับตัวแปรเดิมทไี่ ดร บั การกาํ หนดคา ในประโยคเดียวกนั แตเ พอ่ื ใหแ นใจขน้ึ
อีกเราก็ทดลอง run ดว ยประโยค
int sum = value++;
เราไดผลลัพธเ ปน sum มคี า เทากับ 5 และ value มคี า เทา กับ 6 ดังน้ันเราจึงมัน่ ใจวา postfix
operator ++ ไมย อมใหมกี ารเพมิ่ คาใหกับตวั แปรตวั เดียวกันกบั ที่ใชในการกําหนดคาในประโยค
เดยี วกนั (ดังทีไ่ ดก ลาวไว แตถ า เราตองการท่จี ะเพิ่มคาใหกบั ตวั แปรเดิมจรงิ ๆ เราก็ทําไดด ว ยการ
เปล่ียนประโยคใหเ ปน value = value + 1 แทน)
การเขียนโปรแกรมทดี่ ีนั้นไมควรเขียนใหอา นยาก เชน ตัวอยา งของการใช ++ ที่ไดก ลา วถึงกอนหนา
นี้ ถา การเขยี นนัน้ ไดผ ลลัพธดงั ทีเ่ ราตอ งการ ถงึ แมวาจะเขยี นดวยประโยคหลาย ๆ ประโยค กย็ งั
39
เรมิ่ ตนการเขยี นโปรแกรมดว ย Java intro. to Java (FEU.faa)
ดกี วา ที่เขียนดว ยจาํ นวนประโยคท่สี นั้ แตอ านไดย ากกวา ตัวอยา งตอไปน้เี ปน การใช operator ++
และ operator – ในรปู แบบตาง ๆ
1: /**
2: Shows increment operators
3: */
4: class Increments {
5: public static void main(String[] args) {
6: int value = 25, number = 25;
7:
8: System.out.println("value is " + value);
9: System.out.println("number is " + number);
10: --value;
11: number++;
12: System.out.println("value is " + value);
13: System.out.println("number is " + number);
14: value = value + --number;
15: System.out.println("value is " + value);
16: System.out.println("number is " + number);
17: number = number - value++;
18: System.out.println("value is " + value);
19: System.out.println("number is " + number);
20: number--;
21: value++;
22: System.out.println("value is " + value);
23: System.out.println("number is " + number);
24: value = --value;
25: number = number++;
26: System.out.println("value is " + value);
27: System.out.println("number is " + number);
28: }
29: }
ผลลัพธท ไี่ ดจ ากการ run
value is 25
number is 25
value is 24
number is 26
value is 49
number is 25
value is 50
number is -24
value is 51
number is -25
value is 50
number is -25
ผูอ า นควรทดสอบการใช operator increment ทงั้ สอง (++ และ --) ในประโยคสมมตติ า ง ๆ เพ่อื ให
เกิดความเขา ใจในการใช operator ทงั้ สองไดด ยี ่งิ ขน้ึ ผูอา นควรพงึ ระลกึ วาขอ แตกตางระหวา ง
operator ทงั้ สองนัน้ จะเกดิ ข้ึนเมื่อไปปรากฏอยใู น expression เชนทเี่ ราไดแสดงใหดจู ากตวั อยาง
หลาย ๆ ตวั อยา งกอ นหนา น้ี
แตผ ูเ ขยี นไมข อแนะนาํ ใหใช operator ทง้ั สองเพราะจะทําใหเกิดความลาํ บากในการทจี่ ะเขาใจ
โดยเฉพาะผูอ่นื ที่นาํ เอา code ของเราไปใชห รอื นําไปปรบั ปรุง อยา งไรก็ตาม การใชท ี่เหมาะสมก็
ยงั คงมีอยูไ ด
2.7.2 การประมวลผลดว ย integer ขนาดเลก็ (short และ byte)
ในการประมวลผลดวยขอ มูลทเี่ ปน byte หรือ short นน้ั Java จะทาํ การประมวลผลเชน เดียวกันกบั
การประมวลผลดว ยขอมลู ท่ีเปน int และผลลัพธข องการประมวลผลขอมลู ที่เปน short หรอื byte นั้น
จะถูกเก็บอยูในรูปแบบของขอ มูลท่เี ปน int ดงั ตวั อยา งตอ ไปน้ี (ByteShort.java)
1: /**
2: Shows byte and short integer calculation
3: */
4: class ByteShort {
40
บทที่ 2: ขอมูล ตวั แปร และการประมวลผล
5: public static void main(String[] args) { intro. to Java (FEU.faa)
short numScooters = 10;
6: short numChoppers = 5;
7: short total = 0;
8: total = numScooters + numChoppers;
9:
10: System.out.println("Number of scooters is " + numScooters);
System.out.println("Number of choppers is " + numChoppers);
11: System.out.println("Total number of bikes is " + total);
12: }
13:
14:
15:
16: }
เม่อื ได compile แลว Java จะฟอ งวามี error เกดิ ขึ้น
ByteShort.java:10: possible loss of precision
found : int
required: short
total = numScooters + numChoppers;
^
1 error
เนือ่ งจากวา ผลลัพธของการบวกจะตอ งเก็บเปน integer ท่ีมีขนาดเทากับ 64 bit แตต วั แปร total
สามารถเกบ็ ขอ มลู ไดส งู สุดเทากบั 16 bit ดังน้นั compiler จึงฟองทันที วิธกี ารแกไขกอ็ าจจะตอ ง
เปล่ียนตวั แปรทงั้ สามใหเปน int หรือไมก ็ใชวิธีการเปลย่ี นชนดิ ของขอ มลู ที่เรียกวา casting
2.7.3 การเปลี่ยนแปลงชนดิ ของขอ มูล (casting)
ในการเปล่ียนชนิดขอ มลู น้นั เราจําเปนที่จะตอ งคํานึงถงึ การจัดเกบ็ ขอ มลู วาเราจะตองใชข อ มูลชนดิ
ไหนในการจัดเก็บ การประกาศตัวแปรกต็ องทําดว ยความระมดั ระวงั เนอ่ื งจากวา การ cast นน้ั ถา เรา
cast ขอมูลท่ีมขี นาดใหญไ ปสูขอ มูลท่ีมีขนาดเล็ก เราจะสญู เสียคาความเปนจรงิ ของขอ มลู นน้ั เรามา
ทําการแกไ ขโปรแกรม ByteShort.java เพ่อื ให Java ยอมใหก าร compile เปนไปอยางถูกตอง
วธิ ีการกไ็ มยากเพยี งแตเ ปลีย่ นประโยค total = numScooters + numChoppers; ใหเ ปน
total = (short)(numScooters + numChoppers);
เทา นี้ Java ก็ยอมใหเรา compile และเม่ือเราทดลอง run ดูก็ไดผ ลลัพธดงั ท่คี าดไว คือ
Number of scooters is 10
Number of choppers is 5
Total number of bikes is 15
ทีน้เี ราลองมาดกู นั วา ถาเราเปลยี่ นคา ของ numScooters ใหเ ปน 32767 ดงั ท่เี หน็ ดา นลา ง ผลลพั ธท ่ี
ไดในการ compile และ run โปรแกรมของเราจะเปน อยา งไร
short numScooters = 32767; //คาสงู สดุ ทีเ่ ปน ไปได
short numChoppers = 5;
ผลลัพธท ี่ได คอื
Number of scooters is 32767
Number of choppers is 5
Total number of bikes is -32764
จะเหน็ วาคาของ total เปน -32764 ซง่ึ เปนคาท่ีไมถกู ตอง ซึง่ ถาบวกกนั แลวคาทไ่ี ดต อ งเปน 32772
ทาํ ไม?
เน่อื งจากวาตวั แปรทั้งสามตวั มชี นดิ เปน short และสามารถเก็บขอมูลไดส งู สดุ เพยี งแค 32767 ดังนน้ั
การนาํ เอาผลรวมทมี่ ีคา เกนิ กวาคาสงู สุดท่เี ปนไปไดม าเกบ็ ไวใ นตัวแปร total จงึ ไมสามารถทําไดแ ต
Java กจ็ ะนาํ เอาคา อ่ืนทีไ่ ดจ ากการประมวลผล (ทถี่ ูกตองตามหลักการแตมีคาความคลาดเคล่ือนของ
การประมวลผล – จํานวน bit ทใี่ ชในการคาํ นวณหายไปครง่ึ หน่งึ จาก 64 bit เหลือเพียง 32 bit) มา
ใสไ วให ผูเ ขยี นโปรแกรมจะตองทําความเขา ใจเกยี่ วกับชนิดของขอ งมูล และการประมวลผลตามชนดิ
41
เร่ิมตนการเขียนโปรแกรมดวย Java intro. to Java (FEU.faa)
น้ัน ๆ ของขอ มูล ถา หากวาหลกี เล่ยี งได ผูเขียนโปรแกรมก็ควรหลีกเล่ยี งการใช cast นอกเสียจากวา
จําเปนตองใชจ รงิ ๆ เทา นน้ั
เรามาดกู าร cast อน่ื ๆ จากโปรแกรม Casting.java
1: /**
2: Changing type of data
3: */
4:
5: class Casting {
6: public static void main(String[] args) {
7: byte byteVar = 127;
8: short shortVar = 32767;
9: long longVar = 100000;
10: int intVar = 300000;
11:
12: System.out.println("byteVar is " + byteVar);
13: System.out.println("shortVar is " + shortVar);
14: System.out.println("longVar is " + longVar);
15: System.out.println("intVar is " + intVar);
16:
17: byteVar = (byte)shortVar;
18: shortVar = (short)longVar;
19: longVar = (int)intVar * (int)longVar;
20: intVar = (short)intVar * (short)intVar;
21:
22: System.out.println("byteVar is " + byteVar);
23: System.out.println("shortVar is " + shortVar);
24: System.out.println("longVar is " + longVar);
25: System.out.println("intVar is " + intVar);
26: }
27: }
ผลลพั ธท ่ีไดจ ากการ run คือ
byteVar is 127
shortVar is 32767
longVar is 100000
intVar is 300000
byteVar is -1
shortVar is -31072
longVar is -64771072
intVar is 766182400
ในการประมวลผลดวยการใชขอมูลท่ีมชี นิดเปน long นั้น (บังคบั ใหเปน long ดวยการใส L ดานหลงั
คา ทก่ี ําหนดใหก บั ตวั แปรนั้น ๆ) ขอ มูลชนิดอ่ืนจะถูกเปล่ยี นใหเปน long กอ นการประมวลผล เชน
long value = 125;
long price = 200L;
int total = 0;
total = value * price;
กอนการประมวลผลคาของตวั แปร value จะถูกเปล่ียนใหเปน long แลว จงึ นาํ มาคณู กับตัวแปร price
เพราะฉะน้นั ในการประมวลผลขอ มูลทเ่ี ปน integer นนั้ ขอควรคาํ นึงถึงกค็ ือ
o การประมวลผลกับตัวแปรท่ปี ระกาศเปน long ทมี่ กี ารกาํ หนดคาดวยตัว L จะเปนการ
ประมวลผลดว ยการใชจาํ นวน bit เทา กับ 64 bit
o การประมวลผลกับตัวแปรทีป่ ระกาศเปน int จะเปนการประมวลผลดว ยการใชจ ํานวน bit
เทา กบั 32 bit
ปญหาของการประมวลผลดวยขอ มูลทีม่ ีชนดิ เปน integer
o ถาเราหารตัวแปรที่มีชนดิ เปน int ดว ย 0 เราไมส ามารถหาคาํ ตอบได เพราะฉะนน้ั Java จะ
ทาํ การฟอ งดว ย error แตเ ราก็สามารถทจี่ ะตรวจสอบและแกไขไดด วยการใช exception
42
บทท่ี 2: ขอมูล ตวั แปร และการประมวลผล intro. to Java (FEU.faa)
ซึ่งเปนวิธดี ักจับ error ที่ Java เอ้ืออาํ นวยใหผเู ขียนโปรแกรมไดทําการเอง เราจะพูดถึง
exception ในโอกาสตอ ไป
o การประมวลผลดวยคาที่เกนิ ขดี จํากดั ของตัวแปรจะทาํ ใหไ ดผลลัพธท คี่ ลาดเคลอื่ น
o การประมวลผลดว ย % ทีม่ ีคาของ 0 อยทู างขวากท็ าํ ใหเกิด error เหมอื นกบั การหารดว ย 0
2.8 การประมวลผลดวยตัวแปรที่มีจุดทศนิยม (Floating Point Calculations)
การประมวลผลของขอ มูลทเี่ ปนเลขทศนยิ มนั้นก็คลายกันกบั การประมวลผลดว ยขอมูลทีเ่ ปน integer
การใช operator ตาง ๆ กเ็ หมอื นกนั คือ + - * / ลองมาดตู วั อยา งกัน
1: /**
2: Calculating with floating-point numbers
3: */
4: class FloatingPoint {
5: public static void main(String[] args) {
6: double weeklyPay = 1075 * 5;//1075 per day
7: double extras = 1580;
8: final double TAX_RATE = 8.5;//tax rate in percent
9:
10: //calculate tax and income
11: double tax = (weeklyPay + extras) * TAX_RATE / 100;
12: double totalIncome = (weeklyPay + extras) - tax;
13:
14: System.out.println("Tax = " + tax);
15: System.out.println("Total income = " + totalIncome);
16: }
17: }
โปรแกรม FloatingPoint.java เปน การคาํ นวณหาภาษี และรายไดตอหน่ึงอาทติ ย โดยเราสมมติให
รายไดตอ วันเทากับ 1075 บาท และรายไดพ เิ ศษเทา กบั 1580 บาท อดั ตราภาษเี ทา กับ 8.5% เมอื่
เรา execute โปรแกรมเราก็จะไดผ ลลัพธด งั นี้
Tax = 591.175
Total income = 6363.825
ในการคาํ นวณหาภาษีนั้นเราจาํ เปน ทจ่ี ะตองใชว งเลบ็ ในประโยค
double tax = (weeklyPay + extras) * TAX_RATE / 100;
เนอื่ งจากวาเราตองการใหก ารบวกทํากอนการคณู และการหาร ถา ไมเชนน้ันแลวเราจะไมไดคา รายได
โดยรวมทเี่ ปน จรงิ ถา เราสังเกตใหด ีผลลพั ธท ไี่ ดจะมีเลขหลงั จดุ ทศนยิ มอยูสามตัว เราทําใหเปน สอง
ตัวดังทีใ่ ชก ันอยทู ่ัวไปไดม ยั้ ? คําตอบกค็ ือ ได ดว ยการเพมิ่ code เขา ไปในโปรแกรมดงั น้ี
1: /**
2: Calculating floating-point with formatted output
3: */
4:
5: import java.text.*; //for NumberFormat
6:
7: class FloatingPoint2 {
8: public static void main(String[] args) {
9: double weeklyPay = 1075 * 5;//1075 per day
10: double extras = 1580;
11: final double TAX_RATE = 8.5;//tax rate in percent
12:
13: //set format output
14: NumberFormat form = NumberFormat.getNumberInstance();
15: form.setMaximumFractionDigits(2);
16:
17: //calculate tax and income
18: double tax = (weeklyPay + extras) * TAX_RATE / 100;
19: double totalIncome = (weeklyPay + extras) - tax;
20:
21: System.out.println("Tax = " + form.format(tax));
22: System.out.println("Total income = " +
form.format(totalIncome));
23: }
43
เริม่ ตนการเขียนโปรแกรมดวย Java intro. to Java (FEU.faa)
24: }
เราเพิ่มประโยค
NumberFormat form = NumberFormat.getNumberInstance();
form.setMaximumFractionDigits(2);
และเปล่ียนการแสดงผลลัพธดว ยการใช form.format(tax) และ form.format(totalIncome)
เพ่อื ใหผลลพั ธที่ออกมาเปน
Tax = 591.18
Total income = 6,363.82
จะเห็นวา 591.175 จะถกู ปด ใหเ ปน 591.18 และ 6363.825 ถูกปดใหเปน 6363.82 โดยทีค่ าของ
totalIncome มี , (comma) เปนตัวบอกถึงจาํ นวนของหลกั รอยดว ย
ในการใช method ทัง้ getNumbereInstance() และ setMaximumFractionDigits() น้ันเราจาํ เปน
ท่จี ะตอง import class NumberFormat เขา สโู ปรแกรมของเรา ถาไมแ ลว เราจะไมสามารถใช
method เหลานี้ได
ยงั มี method อ่ืนใน class DecimalFormat ท่เี ราสามารถเรียกใชในการ format ผลลัพธที่เปน จุด
ทศนิยมได เชนถาเราไมต อ งการ , (comma) เปน ตวั แบงหลกั เราจะทําอยา งไร? ลองดตู วั อยางน้ีดู
(FloatingPoint3.java)
1: /**
2: Calculating floating-point with formatted output
3: */
4:
5: import java.text.*; //for DecimalFormat
6:
7: class FloatingPoint3 {
8: public static void main(String[] args) {
9: double weeklyPay = 1075 * 5;//1075 per day
10: double extras = 1580;
11: final double TAX_RATE = 8.5;//tax rate in percent
12:
13: //set format output
14: DecimalFormat form = new DecimalFormat("#.00");
15:
16: //calculate tax and income
17: double tax = (weeklyPay + extras) * TAX_RATE / 100;
18: double totalIncome = (weeklyPay + extras) - tax;
19:
20: System.out.println("Tax = " + form.format(tax));
21: System.out.println("Total income = " + form.format(totalIncome));
22: }
23: }
ผลลพั ธท ่ไี ดค อื
Tax = 591.18
Total income = 6363.82
เราเพยี งแตเรียกใช class DecimalFormat แทน NumberFormat และเปลีย่ นการกาํ หนด format
ใหเปน
DecimalFormat form = new DecimalFormat("#.00);
เราก็จะไดผ ลลพั ธท่ีมเี ลขหลงั จุดทศนยิ มอยูสองตวั และไมม ี , (comma) เปน ตัวแบงหลกั ยังมีวธิ กี าร
กาํ หนดรูปแบบของการแสดงผลลพั ธอีกหลายแบบ หนง่ึ ในน้นั มีมากับ Java 1.5 น่นั กค็ ือการใช
printf() เปนตวั แสดงผล
44
บทที่ 2: ขอมูล ตัวแปร และการประมวลผล intro. to Java (FEU.faa)
2.8.1 การใช printf() ในการแสดงผล
ใน Java 1.5 เราสามารถเรียกใช printf() เพอ่ื แสดงผลใหเ ราตามโครงสรางท่ีเราตอ งการไดอยา ง
งาย ๆ ดงั โปรแกรมตัวอยา งน้ี
1: /**
2: Using printf() for formatted output
3: */
4:
5: class UsingPrintf {
6: public static void main(String[] args) {
7: double weeklyPay = 1075 * 5;//1075 per day
8: double extras = 1580;
9: final double TAX_RATE = 8.5;//tax rate in percent
10: String total = "Total income = ";
11:
12: //calculate tax and income
13: double tax = (weeklyPay + extras) * TAX_RATE / 100;
14: double totalIncome = (weeklyPay + extras) - tax;
15:
16: System.out.printf("Tax = %.2f%n", tax);
17: System.out.printf("%s %.2f", total, totalIncome);
18: }
19: }
การแสดงผลของการประมวลในบรรทดั ท่ี 16 จากโปรแกรมตัวอยา งนี้ ใช printf() แสดงผลลัพธโ ดย
กําหนดใหก ารแสดงผลเปนเลขท่มี ีจดุ ทศนยิ มสองจดุ ดว ยการใชสญั ลกั ษณ '%.2f' ซึง่ ตวั กําหนดใหม ี
ทศนิยมสองตําแหนงคอื ตวั เลขท่ีอยูหลงั จุด ตามดวยตวั อักษร 'f' สว นตวั %n หมายถงึ การเล่ือน
บรรทดั ผอู า นจะสังเกตวา เราจะตองกาํ หนดรูปแบบท่ตี องการภายในเครือ่ งหมาย " " สวนตวั แปรที่
เกบ็ คา ของขอมลู ท่ตี องการแสดงผลนน้ั จะอยภู ายนอกและตองตามหลงั เคร่ืองหมาย ',' เสมอ
ในบรรทัดที่ 17 เราแสดงผลขอ มลู สองตวั ตัวแรกมชี นดิ เปน String สว นตวั ท่สี องเปน เลขทมี่ ีจุด
ทศนยิ มเหมอื นกับที่แสดงในบรรทดั ที่ 16 ผอู านจะตองใช %s ในการแสดงผลขอ มลู ทีเ่ ปน String
และถา มกี ารแสดงผลขอ มลู มากกวา หน่งึ ตัวเราก็ใชเ ครื่องหมาย ',' เปน ตวั แบงเสมอ และจํานวนของ
สญั ลกั ษณแสดงผลภายในเครอ่ื งหมาย " " ตองมีจาํ นวนเทากับตวั แปรที่อยภู ายนอก
2.8.1.1 การใชเ คร่ืองหมายอื่น ๆ (flag) ใน printf()
โปรแกรมตัวอยา งตอไปนแ้ี สดงถึงการควบคุมหนา ตาของสิ่งท่เี ราตอ งการสงไปยงั ชองทางออก (เชน
หนา จอ เปน ตน ) ซึง่ มีเครอ่ื งหมายทนี่ าสนใจดงั น้ี
1. เครื่องหมายลบ (-)
2. เครื่องหมายบวก (+)
3. ศนู ย (0)
4. เครอ่ื งหมาย comma (,)
5. เครอื่ งหมายวงเลบ็ เปด ( สําหรับการแทนคา ท่ีเปน ลบ
1: /**
2: Using flags in printf()
3: */
4:
5: class FlagInPrintf {
6: public static void main(String[] args) {
7:
8: System.out.println("column:\t01234567890123456789");
9: System.out.printf("\t%+d %d %n", 1234, 1234);
10: System.out.printf("\t%-10.2f%n", 1234.567);
11: System.out.printf("\t%+09d%n", 493);
12: System.out.printf("\t%09d%n", 493);
13: System.out.printf("\t%,d%n", 123456);
14: System.out.printf("\t%,.2f%n", 1234.567);
15: System.out.printf("\t%(d%n", -1234);
16: System.out.printf("\t%(.1e%n", -493.0);
17: }
18: }
45
เรมิ่ ตนการเขียนโปรแกรมดวย Java
ผลลพั ธท่เี ราไดค อื intro. to Java (FEU.faa)
column: 01234567890123456789
+1234 1234
1234.57
+00000493
000000493
123,456
1,234.57
(1234)
(4.9e+02)
ผอู า นควรศึกษาถึงผลลพั ธที่ไดจ ากโปรแกรมตวั อยางนเ้ี พือ่ ใหเ กิดความเขา ใจใหม ากยิ่งข้ึน (column
ทีอ่ ยูด านบนของผลลพั ธมไี วเ พือ่ เปนการอางองิ ถึงตาํ แหนง ที่ผลลัพธควรจะเปนเม่ือมกี ารเรียกใช flag
ตาง ๆ)
2.8.2 การใช format() แทน printf()
เราสามารถท่จี ะใช format() แทนการแสดงผลดว ย printf() โดยไมตอ งมกี ารเปล่ยี นแปลง code
ของเราแตอ ยา งใด เชน ถา เราเปล่ียนชดุ คาํ สัง่ ในบรรทดั ท่ี 16 และ 17 ของโปรแกรม UsingPrintf ให
เปน
System.out.format("Tax = %.2f%n", tax);
System.out.format("%s %.2f", total, totalIncome);
ผลลพั ธของการประมวลผลทเ่ี ราไดก เ็ หมือนกนั คอื
Tax = 591.18
Total income = 6363.83
ผูอานกเ็ ลือกใชตามแตท ี่ตนเองชอบกแ็ ลว กัน ยังมีสญั ลกั ษณอ ีกหลายตัวทีเ่ ราสามารถเรียกใชไ ด ซึ่ง
เราไดนาํ มาแสดงไวในตารางที่ 2.6 น้ี
ตาราง 2.6 การใชสญั ลกั ษณแ สดงผล
สญั ลักษณแสดงผล ความหมาย
%% แสดง % ใน String
%a, %A แสดงคา เลขทมี่ จี ุดทศนิยม
%b, %B แสดงคา ทีเ่ ปน จรงิ หรือเท็จ
%c, %C แสดงคา ของตวั อักษรหนึ่งตัว
%d แสดงคาของตวั เลขที่ไมมจี ุดทศนิยม
%e, %E แสดงคาเลขทมี่ จี ุดทศนิยมในรูปแบบของ exponential notation
%f แสดงคาเลขทมี่ จี ุดทศนยิ ม
%g, %G แสดงคาเลขทมี่ จี ุดทศนยิ มสงู สดุ หกตาํ แหนง
%h, %H แสดงคาเลขในฐานสิบหก (hash code)
%n เลอ่ื นบรรทดั ใหมหนึง่ บรรทัด
%o แสดงคา เลขในฐานแปด
%s, %S แสดงคาของ String
%t, %T แสดงคา ของเวลา
%x, %X แสดงคา ตัวเลขในฐานสิบหก
2.8.3 การแสดงผลท่ไี มตอ งใชค ําวา System นาํ หนา
หลาย ๆ คร้ังทีเ่ ราตอ งการแสดงผลลพั ธไ ปยงั หนา จอ แตก็ตอ งมาเสียเวลาในการพิมพค าํ วา System
กอ นหนาคําวา out.println() หรอื out.printf() ดงั ทเ่ี ราไดเ หน็ จากตวั อยา งตางๆ ท่ผี านมา ใน Java
1.5 เราสามารถทจ่ี ะลดการเขียนลงดวยการใชก าร import ท่ีเรียกวา static import แทนการ import
ท่เี ราไดเ คยทาํ มา ดูโปรแกรมตวั อยางตอ ไปนี้
1: /**
2: Display output without 'System'
46