บทท่ี1 โปรแกรมภาษาจาวาเบืองต ้ ้ น (Basic of Java Programming Language)
วตถั ุ ประสงค์ แนะนําภาษาจาวาและเทคโนโลยีจาวา อธบายขนตอนการทางานของโปรแกรมภาษาจาวา ิบายขนตอนการท ั้างานของโปรแกรมภาษาจาวาํ อธิบายจดเด ุ ่ นของภาษาจาวา อธิบายหลกการเข ัียนโปรแกรมเชิงออปเจค โดยอธ็ิบายความหมายของ •ออปเจค็ (object) •คลาส (class) •คณล ุ กษณะ ั (attribute) •เมธอด (method) อธิบายการประกาศคลาสที่มีคณล ุ กษณะและเมธอดอย ั่ในคลาส ู
วตถั ุ ประสงค์ อธิบายการประกาศและสร้างออปเจค็ อธบายการเรยกใชค ิบายการเรียกใช้คณลกษณะและเมธอดของออปเจค ุ กษณะและเมธอดของออปเจ ัค็ แนะนําไวยากรณ์ภาษาจาวา •สญลกษณและคาตางๆทใชในภาษาจาวา ญล ักษณ ั์และคาตํ่างๆที่ใช้ในภาษาจาวา แนะนําข้อมลค ู ่ าคงที่ (literals) และชนิดข้อมลแบบพูืนฐาน ้ (primitive data t ) ypes อธิบายการประกาศตวแปร ั (variables) และคาสํงกั่าหนดคํ่า (assignment statement) อธิบายการแปลงชนิดข้อมล ู
วตถั ุ ประสงค์ อธิบายคณล ุ กษณะเด ั่นของโปรแกรมเชิงออปเจคสามประการค็ือ •การห่อห้ม ุ (Encapsulation) •การสืบทอด (Inheritance) •การมีได้หลายรปแบบ ู (Polymorphism) อธบายหลกการของการหอห ิั่้มท ุ ี่ป ไป ระกอบไปดวย้ •การซ่อนเรนข้้อมล ู (Information Hiding) •ความเป็นโมดลู ( y) Modularity) แนะนําเมธอดแบบ accessor อธิบายความหมายและการประกาศ Constructor
วตถั ุ ประสงค์ อธิบายขนตอนการท ั้างานของคําสํงั่ new อธบายการใชคยเวรด ิบายการใช้คียเว์ิรด์ this แนะนําโครงสร้างโปรแกรมภาษาจาวาที่มีการใช้คาสํงั่ packageและ import อธิบายหลกการใช ั้ค่ม ู อ ื API (Application Programming Interface) ของ ภาษาจาวา
ภาษาจาวา พฒนาข ัึนโดยท ้ีมวิจยของบร ัิษทซันไมโครซ ัิสเตมส็์ เปน็ภาษาคอมพ ภาษาคอมพวเตอรเชงออปเจค วเตอริ์เชิงออปเจค็ (Object Oriented Programming) สามารถทางานไดํ้กบระบบคอมพ ัิวเตอรหลายแพลตฟอร ์ม์ เร่ิมเป็นที่นิยมแพรหลายในช่่วงปลายปีค.ศ. 1995 ชดพุฒนาโปรแกรมภาษาจาวาเวอร ัช์นแรก ั่ (JDK 1.0) JDK 1.2 (Java 2) ออกมาในปีค.ศ. 1998
องค์ประกอบของเทคโนโลยจาวาี JVM (Java Virtual Machine) •ทาหนํ้าที่เป็นอินเตอรพร์ีตเตอร์ JRE (Java Runtime Environment) •ใช้ในการรนัโปรแกรม J2SDK (Java 2 Software Development Kit) •เป็นชดพ ุ ฒนาโปรแกรมภาษาจาวา ั
Java Virtual Machine (JVM) โปรแกรมภาษาจาวาจะคอมไพล์ได้ไบท์โค้ ด โดยJVM จะเป็น อนเตอร ิ ์ พรี ต เตอร์ ทแปลไบท ี่์โค้ดให้เป็นคาสํั่งทภาษาเคร ี่ื่ องเข้าใจ จาวาไบท์โค้ดสามารถจะรันข้ามแพลตฟอร์ ม (platform) ได้ ถ้าแพลตฟอร์มน้ันมี JVM อยู่ JVM เป็นโปรแกรมท ข ี่ นอย ึู้่ กบแพลตฟอร ั ์ ม (platform specific) JVM อาจพฒนาเ ั ป็ นโป ฟ รแกรมซอ ฟ ต์แวร์หรือฮาร์ดแวร์ ไ ด้
ขนตอนการท ั้างานของ ํ โปรแกรมภาษาจาวา
Java Runtime Environment (JRE) JRE จะรันโค้ดทแปลมาจาก ี่ JVM โดยจะทางานํ 3 ข้นตอน ค ั อ ื •โหลดไบท์โค้ดโดยใช้Class Loader •ตรวจสอบไบท์โ ค้ ดโ ใ ดย ช้Byte Code Verifier •รันไบท์โค้ดโดยใช้Runtime Interpreter
ขนตอนการท ั้างานของ ํ JRE
Java Development Kit (JDK) คือชดพุฒนาโปรแกรมภาษาจาวาของ ับริ ษ ทั ซนไมโครซ ั ิ สเตมส ็ ์ ชอใหมของ ื่อใหม่ของ JDK เวอรชน์ ชั่น 1.2 คอื Java 2 เวอร ช์ นั ปัจจุ บัน คื อเวอร์ ชั◌่น 1.4 ประกอบไปด้วยโปรแกรมต่างๆ อาทิเช่น •โปรแกรมคอมไพเลอร์(javac.exe) •โปรแกรมอ โปรแกรมอนเตอรพรตเตอร ินเตอรพร์ ี ตเตอร์(java.exe) •โปรแกรมดี บกเกอร ั ์ แตจะไมมโปรแกรมอดเตอร ่จะไม ม่ีโปรแกรมอี ดิเตอร์
แพลตฟอรมของ ์เทคโนโลยจาวาี ประกอบไปด้วย • Java Virtual Machine (JVM) • Java Application Programming Interface (Java API)
แพลตฟอรมของ ์ Java 2
หลกการของ ัโปรแกรมเชิงออปเจค็ โปรแกรมเชิงกระบวนการ(procedural) จะแบ่งการทางานของโปรแกรมํ ออกเป็นส่วนๆตามฟังก์ชันของการทางานํ การปรบปร ังหร ุ ื อแก้ไขโปรแกรมเชิงกระบวนการทาไดํ้ยาก โปรแกรมเช โปรแกรมเชงออปเจคจะ ิงออปเจคจะ็แบงการทางานของโปรแกรมเปนออปเจค ่งการทางานของโปรแกรมเปํ็นออปเจค็ การปรบปร ังหร ุ ื อแก้ไขโปรแกรมเชิงออปเจคท็าไดํ้ง่ายกว่า จึงเหมาะกบการ ั พฒนา ัโป ใ รแกรมขนาดใหญ่ที่จะต้องมีการปรบัปรงแกุ้ไ โป ขรแกรมอย่ตลอดู
ออปเจค็ ออปเจค็ (object) แบงได่้เป็นสองประเภทคือ •สิ่งที่เป็นรปธรรม ู (tangible) คือสิ่งที่เป็นวตถัและจุบตั้องได้อาทิเช่น นักศึกษา ใบ ลงทะเบียนปากกา และรถ เป็นต้น •สิ่งที่เป็นนามธรรม (intangible) คือสิ่งที่ไมสามารถจ่บตั้องได้อาทิเช่น คะแนนรายชื่อ วิชา บญัชีเงินฝาก และตารางเที่ยวบิน เป็นต้น ออปเจคประกอบไปด็้วย •คณล ุกษณะ ั ( ) attribute)หรือข้อมูล( ) data •เมธอด (method) หรือพฤตกรรมิ (behavior)
ตวอย ั่างของออปเจค็ นักศึกษา อาจจะประกอบไปด้วยคณล ุ กษณะเช ั่นรหสัชื่อและเกรดเฉลี่ย และอาจจะม และอาจจะมเมธอดเชน ีเมธอดเช่นลงทะเบยน ลงทะเบียนสอบและเดนิ รถยนต์อาจจะประกอบไปด้วยคณล ุ กษณะเช ั่นยี่ห้อร่น ุ และสี และอาจจะมีเมธอดเช่นเคลื่อนท่ีหยดและเล ุ ี้ยว สนุ ัข อาจจะประกอบไปด้วยคณล ุกษณะเช ั่นชื่อพนธั์ุและสี และอาจจะมีเมธอดเช่นเห่าคลานและกระดิกหาง
คลาส เปรียบเสมอนพืมพิ์เขยวี (template) ของออปเจค็ ออปเจค็ที่ถกสร ูางมาจากคลาส ้างมาจากคลาส (class) (class)บางครงเรยกวาเปน ้ังเรียกว่าเป็น instance instance ของคลาส ของคลาส คลาสหนึ่งคลาสสามารถสร้างออปเจคได็้หลายออปเจค อาท็เชิ่น คลาส Student อาจสรางออปเจค ้างออปเจ็ค s1,s2หรอื s3ซงเปนออปเจค ึ่งเป็นออปเจค็ของคลาส ของคลาส St d t u en
ตวอย ั่างของออปเจคและคลาส ็
การประกาศคลาส รูปแบบการประกาศ [modifier] class ClassName { [modifier] class ClassName { [class member] } ตวอย ั่าง public class Student { }
การประกาศคุณลกษณะ ั รูปแบบการประกาศ [modifier] dataType attributeName; [modifier] dataType attributeName; ตวอยางการประกาศค วอย ั่างการประกาศคณลกษณะทชอ ุ กษณะท ัี่ชื่อ id,nameและ gpaในคลาส Student public class Student { public class Student { public String id; public String name; public String name; public double gpa; }
การประกาศเมธอด รูปแบบการประกาศ [modifier] return_type methodName([arguments]) { [method_body] } ตัวอย่าง public void setName(String n) { name = n; }
การประกาศและสร้างออปเจค็ รปแบบการประกาศ ู [modifier] ClassName objectName; [modifier] ClassName objectName; ตวอย ั่าง Student s1; รปแบบการสร รปแบบการสราง ู ้าง objectName = new ClassName([arguments]); ตวอย ั่าง s1 = new Student(); = new Student();
การเรียกใช้สมาชิกของออปเจค็ รปแบบการเร ู ียกใช้คณล ุ กษณะของออปเจ ัค็ objectName attributeName objectName.attributeName ตวอย ั่าง s1.name รปแบบการเร รปแบบการเรยกใชเมธอดของออปเจค ู ียกใช้เมธอดของออปเจค็ objectName.methodName([arguments]); ตวอย ั่าง s1.setName(“Thana”);
ไวยากรณ์ภาษาจาวา สัญลกษณ ั์และคาทํใชี่้ในภาษาจาวาประกอบด้วย •คอมเมนต ็์(comment) •การต้งชัื่อ(identifier) •คย ี์ เวร ิ์ ด (keywords) •สัญลกษณ ั์แยกคาํ ( ) separators) •ช่องว่าง (white space) •ข้อมลค ู ่ าคงที่ (literals)
ชนิดข้อมูลแบบพนฐานื้ ชนิดข้อมลในภาษาจาวาแบ ู งเป่็นสองประเภทใหญ่ๆคือ •ชนิดข้อมลแบบพ ู ื นฐาน ้ (primitive data type) •ชนิดข้อมลแบบอ ู ้างอิง (reference data type) ชนิดข้อมูลแบบพนฐานื้แบงออกเ ่ป็น 4ประเภทดงนัี้ •ชนิดข้อมูลตรรกะ (Logical) คอชนืิด boolean •ชนิดข้อมูลอกขระ ั ( ) Textual)คอชนืิด char •ชนิดข้อมูลตวเลข ัจานวนเตํม็ (Integral) คอชนืิด byte,short,intและ long •ชนิดข้อมูลตวเลข ัทศนิยม (Floating point) คอชนืิด floatและ double
ขนาดและช่วงค่าของชนิดข้อมลแบบพ ู ื นฐาน ้ ชนิดข้อมล ู ขนาด (บิต)ช่วงค่า boolean boolean 1 trueหรอื false char 16 '\u0000' ถึง '\uFFFF' byte 8 -128 ถึง +127 short 16 -32,768 ถึง +32,767 int 32 -231ถึง +231-1 long 64 263ถึง +263 long 64 -2ถง +2 -1 float 32 -3.40E+38 ถึง+3.40E+38 double 64 -1.80E+308 ถึง+1.80E+308
ตวแปรและการก ัาหนดคํ่า ตวแปรในภาษาจาวาอาจเป ั็นตวแปรท ัี่มีชนิดข้อมลแบบพ ู ื นฐานหร ้ือชนิด ข้อมลแบบอ ู ้างอิง ตวแปรท ัี่มีชนิดข้อมลแบบพ ู ื นฐานจะเก ้บค็่าของตวแปรในหน ั่วยความจาํ •เช่น int x = 7; ตวแปรท ัี่มีชนิดข้อมลแบบอ ู ้างอิงจะเกบต็าแหนํ่งอ้างอิงในหน่วยความจาํ •เช่น String s = new String(“Thana”);
ตวแปรและการก ัาหนดคํ่า ภาษาจาวาจะกาหนดตําแหนํ่งอ้างอิงเริ่มต้นให้มีค่าเป็น nullโดยอตโนม ัตัิ ซึ่งเนื้อที่ในหน่วยความจาเพํื่อเกบข็้อมลต ู ่ างๆ ของตวแปรชน ัิดข้อมลแบบู อ้างอิงจะถกสร ู ้างขึน เม ้อม่ืีการเรียกใช้คาสํงั่ new ตวอย ั่าง •คาส ํ งั่ Date d; •และคาส ํ งั่ d = new Date(16,8,2002);
การส่งตวแปร ัผ่าน argument กรณทีสี่่งตัวแปรชนิดข้อมูลแบบพนฐานใหื้้กบั argument การเปลยนี่แปลงค่าของ argument ในเมธอดจะไมม่ีผลกระทบต่อค่าของตัวแปรที่ส่งมา กรณทีี่ส่งตวแปรชน ัิดข้อมลแบบอ ู ้างอิงให้กบั argumentจะเป็นการส่งตาแหนํ่ง อ้างองใหิ้กบั argument จึงทาใหํ้ค่าของตัวแปรที่ส่งมาจะถกูเปลยนี่แปลงตาม argument ในเมธอด
ตวอย ั่างโปรแกรม import java.util.*; p g g{ ublic class ArgumentPassing { public void method1(int x) { x = 3; }publi id th d blic void method2(D t d) { (Date d) { d.setDate(1); d.setMonth(1); d.setYear(2002); }public int method3() { return 0; }
ตวอย ั่างโปรแกรม public static void main(String args[]) { int x = 4; Arg g j g g() umentPassing obj = new ArgumentPassing(); Date d1 = new Date(16,12,1980); obj.method1(x); System.out.println("x = "+x); obj th d .method2(d1); System.out.println("Date = "+d1); obj.method3(); } }
การแปลงชนิดข้อมล ู การแปลงชนิดข้อมลม ู ีสองรปแบบค ู ื อ •การแปลงข้อมลท ู ี่ กว้างขึน้ (widening conversion) คือการแปลงจากชนิดข้อมลทูี่มี ขนาดเลกกว ็่าไปเป็นชนิดข้อมลท ู ี่ มีขนาดใหญ่กว่า •การแปลงข้อมลท ู ี่ แคบลง (narrowing conversion) คือการแปลงจากชนิดข้อมลทูี่มี ขนาดใหญ่กว่าไป ปเ็นชนิดข้อมูลท่ีมีขนาดเลกลง ซ็ึ่งอาจมีผลให้เสียความละเอียด ของข้อมลบางส ู ่วนไป
ตวอย ั่างของการแปลงชนิดข้อมล ู ภาษาจาวาจะปรับชนิดข้อมูลให้อตโนม ัตัิในกรณตี่อไปนี้ กาหนดคาชนดขอม าหนดคํ่าชนิดข้อมลทูเลกกวาใหกบตวแปรชนดขอม เลี่กกว็่าให้กบตัวแปรชน ัิดข้อมลทูใหญกวาอาทเชน ใหญ ี่่กว่าอาทเชิ่น int i = 4; long l = i; นพจน ิ์iจะถกปร ูบัชนดขอม ิ้ลจาก ู intใหเปน ้็ longโดยอตโนมต ััิ กาหนดคํ่าชนิดข้อมูลจานวนเตํ็มให้กบจัานวนเลขทศนํิยมอาทเชิ่น double x double x = 3; นิพจน์3 จะถูกปรับชนิดข้อมูลจาก intให้เป็น doubleโดยอตโนม ัตัิ
Typecasting ภาษาจาวาจะสามารถทาการแปลงชนํิดข้อมล ให ู ้เป็นชนิดข้อมลท ู ี่ มีขนาด เลกลงได็้โดยใช้วิธีการที่เรียกว่า typecasting รปแบบ ู (targetT pe) e pression (targetType) expression ตวอย ั่าง int amount = (int)3.0;
คุณลกษณะเด ั่นของโปรแกรมเชิงออปเจค็ การห่อห้ม ุ (Encapsulation) การสบทอด ื (Inheritance) การมีได้หลายรปแบบ ู (Polymorphism)
การห่อห้ม ุ คุณลกษณะของออปเจ ัคจะถ็ูกป้องกนไว ั้ไม่ให้ออปเจคอ็นทื่อยีู่่ภายนอกเข้าถงขึ้อมูลได้ อย่างอสระิ ออปเจคอ็นๆสามารถจะเรื่ียกใช้คุณลกษณะของออปเจ ัคได็้โดยเรียกผ่านเมธอด
ข้อดของการหี่อหุ้ม การซ่อนเร้นข้อมูล(Information Hiding) •ออปเจคสามารถต็ดติ่อกบออปเจ ัคภายนอกผ็่านเมธอดทเปี่็น public interface ดงนั้ันเรา สามารถทจะเ ี่ปลยนต่ีวแัปร หรือเมธอดอนๆขอื่งออปเจค็โ ไ ดยม่มีผลกระทบใดๆ ความเป็นโมดูล(Modularity) •การพฒนา ัโปรแกรมของแต่ละออปเจคเ็ป็นอสระติ่อกน ถ ั้ามีการเปลยนแ ่ีปลงเกดขินภายึ้ใ ป นออ เจคหน ็ึ่ งกจะไม็่มีผลกระทบต่อออปเจคอ็นๆื่
เมธอดแบบ accessor คุณลกษณะของคลาสจะถ ัูกซ่อนไว้โดยการกาหนดใหํ้modifier เป็นprivate การกาหนดคาหรอเรยกด าหนดคํ่าหรือเรียกดคณล ูุกษณะของคลาสจะใชเมธอดทม กษณะของคลาสจะใช ั้เมธอดทมี่ีmodifier modifier เปน็ public การกาหนดคาจะใชเมธอด าหนดคํ่าจะใช้เมธอดแบบ setter การเรียกดูค่าคุณลกษณะจะใช ั้เมธอดแบบ getter
เมธอดแบบ setter รปแบบ ู public void setAttributeName(dataType arg) { public void setAttributeName(dataType arg) { attributeName = arg; } ตวอยาง ั่ public void setGPA(double GPA) { gpa = GPA; gpa = GPA; }
เมธอดแบบ getter รปแบบ ู public dataType getAttributeName() { public dataType getAttributeName() { return attributeName; } ตวอย ั่าง publi d bl tGPA() { blic double getGPA() { return gpa; }
ตวอย ั่างโปรแกรม public class EncapStudent { private String id; private String name; private double gpa; private double gpa; public void setID(String ID) { id = ID; }public void setName(String n) { name = n; }public void setGPA(double GPA) { public void setGPA(double GPA) { if ((GPA<0) || (GPA>4.00)) { System.out.println("Incorrect Format!"); } else {gpa = GPA; } }
ตวอย ั่างโปรแกรม public String getID() { return id; }public String getName() { return name; }publi d bl tGPA() { blic double getGPA() { return gpa; } }
Constructor เป็นเมธอดที่มีชื่อเดียวกบชัื่อคลาส จะถกเร ูยกีใชงาน ้เมอมการสรางออปเจคโดยใชคาสง อมื่การสรี้างออปเจคโดยใช็้คาสํั่ง new รปแบบ ู [modifier] ClassName([arguments]) { [statements] } constructor จะเป็นเมธอดทไมี่่ต้องระบุชนิดข้อมูลของค่าที่ส่งกลบและไม ั่ต้องใช้คยี์ เวรดิ์ void
Constructor แบบ default โดยทวไปคลาสท ั่ ุ กคลาสจะมีconstructor แบบ default รปแบบ ู public ClassName() { } constructor แบบ default จะเป็น constructor ที่ไมม่ีคาสํงใดๆอย ั่่ภายในู คอมไพเลอรของภาษาจาวาจะ ์ใส่constructor แบบ default ให้กบัโปรแกรม โดยอตโนม ัตัิ ตวอย ั่าง constructor แบบ default ของคลาส Student public Student() { }
การเขียน constructor เราสามารถทจะเขี่ยนี constructor ของคลาสใดๆกได็้ ตวอยางการเขยน วอย ั่างการเขียน constructor ของคลาส Student public Student(String ID,String n,double GPA) { id = ID; name = n; gpa = GPA; } constructor constructor แบบ default default จะหายไปเม จะหายไปเมอมการเขยน อมื่การเขียนี constructor constructor ขนใหม ึ้่
ขนตอนการท ั้างานของคําสํงั่ new กาหนดเนํื้อที่ในหน่วยความจาใหํ้กบออปเจ ัค็ กาหนดคาเรมตนใหกบค าหนดคํ่าเริ่มต้นให้กบคณล ักษณะของออปเจค ุ กษณะของออปเจ ัค็ กาหนดคํ่าของคณล ุ กษณะของออปเจ ัคตามค็าสํงกั่าหนดคํ่าที่ประกาศไว้ เรียกใช้constructor
ตวอย ั่างคลาส MyDate public class MyDate { private int day = 1; private int month = 1; private int year = 2000; publi (i d i i ) { blic MyDate(int d,int m,int y) { day = d; month = m; month = m; year = y; } }
รปแสดงข ู นตอนการท ั้างานของคําสํงั่ new คาสํงั่ MyDate d1 = new MyDate(16,8,1972);
คย ี์ เวร ิ์ ด this คียเว์ิรด์ thisหมายถึงออปเจคของต็วเอง ั คยเวรด ี์ิ์ thisใชอางองค ้อ้างองคณลิ ุ ณลกษณะและเมธอดของออปเจคภายในเมธอด กษณะและเมธอดของออปเจ ัคภายในเมธอด็ซงมึ่ี รปแบบด ู งนัี้ this attirb teName this.attirbuteName; this.methodName();