SlideShare a Scribd company logo
1 of 20
Download to read offline
แพ็คเกจ
Package
วัตถุประสงค
♦ เพื่อใหมีความรูความเขาใจในหลักการทํางานของแพ็คเกจ
♦ เพื่อใหมีความรูความเขาใจในการเขาถึงขอมูลคลาสที่อยูตางแพ็คเกจกัน
บทที่
7
บทที่ 7 แพ็คเกจ หนาที่ 162
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
เนื้อหาบทเรียน
♦ รูจักกับแพ็คเก็จ
♦ หลักการทํางานของแพ็คเก็จ
♦ การใชคําสั่ง import
♦ ขอกําหนดการประกาศคลาส
บทที่ 7 แพ็คเกจ หนาที่ 163
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
Package
คลาสของภาษาจาวาจะถูกแยกเก็บหนึ่งคลาสตอหนึ่งไฟล ทําใหระบบขนาดใหญมีไฟลจํานวน
มากและมักจะมีปญหาในการนําสงโปรแกรม ภาษาจาวาจึงนํา package ไวเปนที่เก็บรวบรวม class
คลายกับ library ในภาษา c แตตางกันตรงที่ package เปนสวนหนึ่งของภาษาจาวา ผูเขียนโปรแกรม
สามารถกําหนดให class ใดๆ อยูใน package ใดไดโดยการเขียน code ในโปรแกรม และ package มี
โครงสรางเปนแบบ hierarchical หรือโครงสรางแบบตนไม คือใน package หนึ่งสามารถสราง package
ยอยลงไปไดอีก เพื่อการแบงหมวดหมูยอยในหมวดหมูที่ใหญกวาลงมาเปนสาขา เหมือนกับโครงสราง
ของไดเรกทอรีของระบบปฏิบัติการ
ทุกคลาสที่ถูกสรางขึ้นจะตองอยูใน package ใด package หนึ่งเสมอ หากเราไมระบุวาคลาสที่
สรางอยูใน package ใด ดังในตัวอยางที่เคยสรางกอนมา คอมไพเลอรจะใหคลาสนั้นอยูใน default
package ซึ่งก็คือไดเร็กทรอรีปจจุบัน การระบุใหคลาสอยูใน package ที่ตองการจะตองขึ้นตนโปรแกรม
ของคลาสนั้นดวย keyword ‘package’ และตามดวยชื่อ package ดังนี้
package [<package_name>] .<sub_package_name>;
package_name : ชื่อของpackage ตามหลักการตั้งชื่อของ folder
sub_package_name : ชื่อของ package ยอย จะมีหรือไมมีก็ไดและสามารถระบุแพ็คเก็จยอยกี่ชั้น
ก็ไดตามความตองการ
หมายเหตุ
- การประกาศชื่อแพ็คเก็จนิยมใชตัวอักษรเล็กทั้งหมด
- การประกาศแพ็คเก็จจะตองประกาศไวที่บรรทัดแรกสุดเทานั้น แตสามารถใสคอมเมนตหรือ
ชองวางไวกอนการประกาศแพ็คเก็จได
- สามารถประกาศแพ็คเก็จไดเพียง 1 แพ็คเก็จตอ 1 ซอรสไฟล(ไฟล .java) เทานั้น
- ถาไมระบุแพ็คเก็จไวสวนตนไฟล แลวไฟล .class ที่ไดจากการคอมไพลจะถูกเก็บไวในไดเร็ค
ทรอรีเดียวกับไดเร็คทรอรีที่กําลังทํางานอยู
บทที่ 7 แพ็คเกจ หนาที่ 164
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
ตัวอยาง การสรางคลาส A ใน package ที่ชื่อ myPackage
จากนั้นทําการคอมไพลโปรแกรมโดยการใช command ดังตอไปนี้
D:chap7javac -d . <filename.java>
-d เปน option ของ java compiler(javac.exe) ใชระบุเพื่อบอกคอมไพเลอรวาเมื่อคอมไพลได
ไฟล .class ออกมาแลวใหนําไฟล .class ไปเก็บไวที่ไดเร็กทรอรีใด
//A.java บันทึกใน directory d:chap7
package myPackage;
public class A{
public void print(){
System.out.println("Hello , I am A class.");
}
}
บทที่ 7 แพ็คเกจ หนาที่ 165
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
ผลลัพธที่ไดจากการคอมไพล ตัวอยาง คอมไพเลอรจะสรางโฟรเดอรชื่อ myPackage ในโฟร
เดอร chap7 ซึ่งเปนที่เก็บไฟลนามสกุล A.java และภายใน package ชื่อ myPackage จะประกอบดวย
ไฟล A.class อยูภายใน
ตัวอยาง สราง class B ใน package ชื่อ mySubPackage ซึ่งอยูภายใต myPackage
// B.java save in chap7
package myPackage.mySubPackage;
public class B{
public void print(){
System.out.println("Hello , I am B class");
}
}
บทที่ 7 แพ็คเกจ หนาที่ 166
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
จากการ compile ทั้งสองโปรแกรมจะไดไฟลอยูในโฟลเดอรดังตอไปนี้
D:chap7
A.java
B.java
myPackage
A.class
mySubPackage
B.class
คลาส A และ คลาส B จะตองระบุเปน public มิเชนนั้นจะไมสามารถอางถึงไดจากภายนอก
package และในทํานองเดียวกัน method print ของทั้งสอง class ตองเปน public ดวย มิเชนนั้นจะไม
สามารถเรียกใชงานจากภายนอก package ได
ตัวอยางการเรียกใชงาน class A และ class B
จากตัวอยางสังเกตวาการอางถึงคลาส A และ คลาส B ในทุกตําแหนงจะตองระบุชื่อเต็มของ
package เปน myPackage.A และ mySubPackage.B ตามลําดับ จึงเปนเรื่องที่ยุงยากและทําใหเกิด
ความผิดพลาดไดงาย ภาษาจาวาจึงนําเอาประโยค import สําหรับทําใหชื่อของ package รูจักกันทั้ง
โปรแกรมและอางถึงไดโดยใชเพียงชื่อคลาสเทานั้น
//testPackage1.java save in chap7 folder
class testPackage1{
public static void main(String[] args) {
new myPackage.A().print();
new myPackage.mySubPackage.B().print();
}
}
ผลลัพธที่ไดคือ
Hello , I am A class.
Hello , I am B class
บทที่ 7 แพ็คเกจ หนาที่ 167
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
หากตองการนําคลาสที่มีอยูแลวมาใชในโปรแกรมที่กําลังจะสรางขึ้นใหม เราจะตองใชคําสั่ง
import เพื่อบอกใหคอมไพเลอรทราบวาจะสามารถหาคลาสที่เราตองการใชงานไดจากในแพ็กเก็จใด
โดยตองใชคําสั่ง import กอนการประกาศคลาสเสมอ
รูปแบบของการใชคําสั่ง import เพื่อนําคลาสในแพ็กเก็จที่ตองการเขามาใชงานคือ
import <package_name>.<sub_package>.<class_name>;
ในการระบุชื่อคลาสที่ตองการใชงานนั้น จะระบุชื่อคลาสลงไปตรงๆ หรือระบุเปน * ซึ่ง
หมายถึงคลาสทุกคลาสก็ได
การระบุชื่อคลาสใดคลาสหนึ่ง กับการระบุ * หมายถึง ทุกคลาสจะไมมีผลตางกัน เพราะการ
ระบุ * ไมไดหมายความวาคลาสทุกคลาสจะถูกโหลดเขาสูหนวยความจําใหสิ้นเปลือง เพราะความจริง
แลวจะมีแตเฉพาะคลาสที่ถูกเรียกใชงานเทานั้น ที่จะถูกโหลดเขาสูหนวยความจํา
ตัวอยาง การใชงานประโยค import
ประโยค import จะตองอยูหลังจากประโยค package (ถามี) และอยูกอนประโยคอื่นๆ ใน
โปรแกรม ยกเวน comment ประโยค import ระบุถึงชื่อคลาสที่จะใชงาน หากตองการใชงานหลาย
คลาสอาจจะแยก import คลาสละประโยคหรือจะ import ทุกคลาสใน package โดยใช * ก็ได อยางเชน
import myPackage.*; จะทําใหอางถึงทุกๆ คลาสใน myPackage ได แตไมรวมไปถึงใน sub-package
สวน import myPackage.mySubPackage.*; จะทําใหอางถึงทุกคลาสใน myPackage.mySubPackage ได
//testPackage2.java save in week13 directory
import myPackage.A;
import myPackage.mySubPackage.B;
class testPackage2{
public static void main(String args[]){
new A().print();
B b = new B();
b.print();
}
}
ผลลัพธที่ไดคือ
Hello , I am A class.
Hello , I am B class
บทที่ 7 แพ็คเกจ หนาที่ 168
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
การ import คลาสไมไดทําใหโปรแกรมของคลาสนั้นถูกนําเขามารวมกับโปรแกรมที่ถูก
คอมไพล เนื่องจากคลาสที่ถูกอางถึงนั้นจะถูกโหลดเขาสู java Interpreter ตอนโปรแกรมทํางาน
ประโยค import ชวยเพียงใหคอมไพเลอรมองหาคลาสนั้นไดพบและสรางโปรแกรมที่อางถึงคลาสนั้น
ในขณะทํางานไดถูกตอง การ import เพียงคลาสเดียวหรือ import ทุกคลาสดวย ‘*’ จะไมทําใหไฟล
.class ที่ไดมีขนาดตางกัน รวมทั้งความเร็วในตอนทํางานก็ไมตางกัน
คลาสพื้นฐานที่จําเปนสําหรับโปรแกรมสวนใหญในภาษา java จะถูกเก็บอยูใน package ที่ชื่อ
java.lang และจะทําการ import package ดังกลาวโดย default คอมไพเลอรของภาษาจาวา จะ import
package นี้มาใชในทุกๆ โปรแกรมทําใหไมตองมีประโยค import java.lang.*; ในโปรแกรมหรือถา
กําหนดเขาไปก็ไมเปนไร
ประโยชนของ package คือ ชวยใหสามารถระบุที่อยูของคลาสใน package ผานทางชื่อของ
package เพียงชื่อเดียวได จึงสะดวกในการ import และอางถึงผานทาง network สวนประโยชนในการ
สรางโปรแกรมคือ package ทําใหเกิดขอบเขตการมองเห็นใหแกคลาสที่จะทํางานรวมกันโดยมีกฎเกณฑ
ดังนี้
- คลาสใดคลาสหนึ่งจะถูกระบุใหเปน public , default หรือ protected แตไมอาจระบุเปน
protected ได
- ทุกคลาสใน package จะอางถึงคลาสที่เปน public , default หรือ protected ภายใน package
เดียวกันได
- ทุกคลาสใน package หนึ่งจะอางถึงสมาชิกที่เปน public , default หรือ protected ของคลาสอื่น
ภายใน package เดียวกันได
ตัวอยาง แสดงการใช package ในการจํากัดขอบเขตการมองเห็น ทําการบันทึก ไฟล ClassA.java และ
ไฟล ClassB.java ในไดเรกทอรี d:chap7
//ClassA.java save in d: chap7
package temp;
public class ClassA{
//ClassB is visible here
void defaultMethod(){
System.out.println("ClassA default method");
}
public void publicMethod(){
System.out.println("ClassA public method");
}
}
บทที่ 7 แพ็คเกจ หนาที่ 169
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
//TestTemp.java save in d: chap7
import temp.*;
class TestTemp{
public static void main(String[] args) {
ClassA a = new ClassA();
//ClassB is not visible
a.publicMethod();
//a.defaultMethod() is not visible
}
}
ผลลัพธที่ไดคือ
ClassA public method
จากตัวอยาง classA และ classB จะมองเห็นกันและกันเพราะอยูใน package temp เหมือนกัน
หากคลาสใดคลาสหนึ่งสราง instance ของอีกคลาสหนึ่ง ก็สามารถเรียกใชทั้ง publicMethod( ) กับ
defaultMethod() ของ instance นั้นได
คลาส ClassA ถูกระบุใหเปน public สวนคลาส ClassB เปน default ขอแตกตางนี้ ทําให
TestTemp.java ซึ่งไมไดอยูใน package temp สามารถมองเห็นไดเพียงคลาส ClassA เทานั้น
เมื่อ TestTemp สราง instance ของคลาส ClassA ขึ้นก็จะสามารถเรียกไดแตเพียง
a.publicMethod( ) แตไมสามารถเรียก a.defaultMethod( ) ได
สรุป คือ คลาสหรือ method ที่เปน public หรือ default จะมองเห็นไดเหมือนกันภายใน
package เดียวกัน แตจากภายนอก package จะมองเห็นไดแตคลาสหรือสมาชิกที่เปน public เทานั้น
//ClassB.java save in D: chap7
package temp;
class ClassB{
//ClassA is visible here
void defaultMethod(){
System.out.println("ClassB default method");
}
public void publicMethod(){
System.out.println("ClassB public method");
}
}
บทที่ 7 แพ็คเกจ หนาที่ 170
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
ตัวอยาง การเรียกใชงานแพ็คเกจสามารถ import package เพื่อใชในการสราง subclass ได
จะไดกลาวถึงในบทตอไป
import java.util.*;
class MyDate extends Date{
…….
}
ตัวอยาง ในกรณีที่ตองการสราง subclass จาก package อาจจะเขียนแบบยอๆ ไดโดยไมตอง
ใชคําสั่ง import ก็ได
import java.util.*;
class MyDate extends java.util.Date{
……
}
บทที่ 7 แพ็คเกจ หนาที่ 171
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
ตัวอยาง. แสดงการนํา class มาใชงานโดยการเรียกใช class กันเอง ไมตองใช package
โปรแกรมหลักที่ class อื่น เรียกใช class นี้
public class Car{
int wheel;
int tires;
int speed;
public Car(int inWheels,int inTires,int inSpeed ){ //constructor method
wheels = inWheels;
tires = inTires;
speed = inSpeed;
}
}
//class Van จะเรียกใชงาน class Car โดยตรง
public class Van{
Car theCar;// เรียกใช Car class โดยตรง ไมตองทําการ import เขามาไวในโปรแกรม
int door;
public Van(Car inCar, int inDoor){ //constructor method
theCar = inCar;
doors = inDoor;
}
}
บทที่ 7 แพ็คเกจ หนาที่ 172
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
แพ็คเกจมาตรฐาน
ในภาษาจาวามีแพ็คเกจมาตรฐานกลุมหนึ่งซึ่งเก็บคลาสพื้นฐานของภาษาจาวาเอาไวใหนักเขียน
โปรแกรมเมอรภาษาจาวาอิมพอรตไปใชไดเลย ตัวอยางของแพ็คเกจมาตรฐานที่ควรรูจักไดแก
java.lang
แพ็คเกจนี้เปนแพ็คเกจพื้นฐานที่สุดของภาษาจาวา ตัวอยางคลาสในแพ็คเกจนี้ไดแก คลาสMath
คลาส String คลาสของตัวแปรพื้นฐาน คลาสเกี่ยวกับเอ็กซเซฟชั่น และคลาสเกี่ยวกับเทรด แพ็คเกจนี้เปน
แพ็คเกจพิเศษเพราะเวลาตองการใชงานคลาสในแพ็คเกจนี้ไมตองใชคําสั่ง import สามารถเรียกใชคลาส
ในแพ็คเกจไดโดยตรง
ตัวอยาง แสดงการนํา Car class มาทําเปน package เพื่อให Van class import เขามาใชในโปรแกรม
ของตนเอง
package Transportation; //สราง package ชื่อ “Transportation”
public class Car{
int wheel;
int tires;
int speed;
public Car(int inWheels,int inTires,int inSpeed ){ //constructor method
wheels = inWheels;
tires = inTires;
speed = inSpeed;
}
public class Van{
Transportation.Car theCar; //import Package เขามาในโปรแกรม
Car theCar;// เรียกใช Car class โดยตรง ไมตองทําการ import เขามาไวในโปรแกรม
int door;
public Van(Car inCar, int inDoor){ //constructor method
theCar = inCar;
doors = inDoor;
}
}
บทที่ 7 แพ็คเกจ หนาที่ 173
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
java.util
แพ็คเกจนี้เก็บคลาสเกี่ยวกับการจัดการวันที่ โซนเวลา การจัดการขอมูล การจัดการ
ภาษาตางประเทศ เวลาตองการใชงานคลาสในแพ็คเกจนี้ตองใชคําสั่ง import java.util.*;
java.io
แพ็คเกจนี้เก็บคลาสเกี่ยวกับการเขียนอานดิสก การรับคาคียบอรด และการแสดงผลออกนอกจอ
เวลาตองการใชงานคลาสในแพ็คเกจนี้ตองใชคําสั่ง import java.io.*;
java.awt
แพ็คเกจนี้เก็บคลาสเกี่ยวกับการสราง GUI ที่เปนกราฟฟก เวลาตองการเรียกใชงานตองใชคําสั่ง
import java.awt.*;
java.awt.event
แพ็คเกจนี้เก็บคลาสเกี่ยวกับการรับคําสั่งจากเมาสหรือคียบอรด แพ็คเกจนี้เปนสับแพ็คเกจของ
แพ็คเกจ java.awt แตเวลาใชงานตองเรียกดวยคําสั่งตางหากคือ java.awt.event.*; เพราะเครื่องหมาย * ไม
นับรวมสับแพ็คเกจดังที่ไดกลาวไปแลว
javax.swing
แพ็คเกจนี้เก็บคลาสเกี่ยวกับการสราง GUI เชนเดียวกับ java.awt ถาตองการทราบวาคลาสใน
แพ็คเกจเหลานี้มีอะไรบาง สามารถคนควาไดจากเวบไซต http://java.sun.com การรวมคลาส
และแมธธอสหลายๆ อันไวในแพ็คเกจนี้ก็คลายๆ กับการจัดระเบียบ API เปนกลุมๆ นั้นเอง
ตัวกํากับตัวแปรคลาสและแมธธอส
ปกติแลวคลาสที่เราสรางขึ้นมาจะสามารถถูกอางถึงไดภายในตัวมันเอง และภายในคลาสอื่นๆ ที่
อยูในแพจเกจเดียวกัน ถาเราตองการใหคลาสในแพจเกจอื่นๆ อางถึงคลาสที่เราสรางขึ้นไดดวยเราจะประ
กาสคลาสนั้นใหเปน คลาสสาธารณะ ดวยการใชคําสั่ง public เราสามารถกําหนดขอบเขตของการเขาถึง
ตัวแปรคลาส และ แมธธอส ไดในทํานองเดียวกัน กับการใชคําสั่ง public ในกรณีของคลาส แตคําสั่ง
สําหรับตัวแปรคลาส และ แมทธอด มีมากกวาแคคําสั่ง public เราเรียกคําสั่งเหลานี้วา ตัวกํากับตัวแปร
(modifier) ดังรายละเอียดตอไปนี้
คําสั่ง Private
โดยปกติแลวทั้งตัวแปรคลาส และแมธธอส สามารถถูกอางถึงไดทั้งในและนอกคลาส พิจารณา
ตัวอยางตอไปนี้
บทที่ 7 แพ็คเกจ หนาที่ 174
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
public class TestACar {
public static void main (String[] args) {
Vehicle myCar = new Vehicle();
if (myCar.hasEngine) { // (4)
myCar.run(); // (5)
}
Truck t = new Truck();
}
}
ผลลัพธที่ไดคือ
I am running
I am running
I am running
I am running
//class testAcar.java
class Vehicle {
int numberOfWheels;
boolean hasEngine;
Vehicle() { // (1)
numberOfWheels = 10;
hasEngine = true;
run();
}
void run(){ // (2)
numberOfWheels = 4;
if (numberOfWheels >= 4) {
System.out.println("I am running");
}
}
}
class Truck extends Vehicle {
float maximumLoad;
Truck() { // (3)
numberOfWheels = 6;
hasEngine = true;
run();
}
void load(float weight) {
if (weight <= maximumLoad)
System.out.println("I am carrying a " + weight + "-pound load.");
}
}
บทที่ 7 แพ็คเกจ หนาที่ 175
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
คลาส Vehicle มีตัวแปร numberOfWheels hasEngine และแมธธอส run() ซึ่งสามารถถูก
นําไปใชที่ไหนก็ไดภายในคลาส Vehicle เชนในคอนสตรัคเตอรในบรรทัด (1) หรือในตัวแมธธอส run()
เองในบรรทัด (2) นอกจากนี้ยังถูกนําไปใชไดภายในคลาส Truck ซึ่งเปนสับคลาสของ Vehicle เชนใน
คอนสตรัคเตอรในบรรทัด (3) รวมทั้งถูกนําไปใชไดในคลาส TestACar ซึ่งไมไดสืบทอดคลาส Vehicle
โดยการประกาศอินสแตนทของคลาส
Vehicle และเรียกผานอินสแตนทดังในบรรทัด (4) และ (5) กลาวคือสามารถนําไปใชไดทุกที่ใน
ซอรสไฟลเราสามารถบังคับใหตัวแปรคลาสและแมธธอสถูกนําไปใชไดเฉพาะในคลาสที่มันเปนเจาของ
เทานั้นไดดวยการใช คําสั่ง private นําหนา การเขียนโปรแกรมเชิงวัตถุที่ดีควรกําหนดตัวแปรคลาสให
เปน private เสมอ ถาคลาสอื่นๆ ตองการใชงานตัวแปรคลาสนั้นๆ ก็ใหเขียนแมธธอสขึ้นมาไวสําหรับตั้ง
คาโดยเฉพาะ เราสามารถปรับปรุงโปรแกรมขางตนของเราใหเปนโปรแกรมที่ดีตามหลักของการเขียน
โปรแกรมเชิงวัตถุไดดังตัวอยางขางลางนี้
class Vehicle {
private int numberOfWheels; // (1)
private boolean hasEngine; // (2)
Vehicle() { // (3)
numberOfWheels = 10;
hasEngine = true;
run();
}
void setNumberOfWheels(int i) { // (4)
numberOfWheels = i;
}
void setHasEngine(boolean b) { // (5)
hasEngine = b;
}
int getNumberOfWheels() { // (6)
return numberOfWheels;
}
boolean getHasEngine() { // (7)
return hasEngine;
}
private boolean isReady() { // (8)
return (numberOfWheels == 4 && hasEngine);
}
บทที่ 7 แพ็คเกจ หนาที่ 176
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
void run(){ // (9)
numberOfWheels = 4;
if (isReady()) {
System.out.println("I am running");
}
}
}
class Truck extends Vehicle {
float maximumLoad;
Truck() { // (10)
setNumberOfWheels(6);
setHasEngine(true);
run();
}
void load(float weight) {
if (weight <= maximumLoad)
System.out.println("I am carrying a " + weight + "-poundload.");
}
}
public class TestACar2 {
public static void main (String[] args) {
Vehicle myCar = new Vehicle();
if (myCar.getHasEngine()) { // (11)
myCar.run();
}
Truck t = new Truck();
}}
ผลลัพธที่ไดคือ
I am running
I am running
I am running
I am running
บทที่ 7 แพ็คเกจ หนาที่ 177
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
ในบรรทัด (1) และ (2) ตัวแปรคลาส numberOfWheels และ hasEngine ถูกกําหนดใหเปนตัว
แปร private ตัวแปรทั้งสองยังคงถูกนําไปใชไดภายในคลาส Vehicle ดังในบรรทัด (3) และ (9) แตถา
ตองการอางถึงตัวแปรเหลานี้นอกคลาส Vehicle ตองอางถึงโดยการผานแมธธอสในบรรทัด (4) (5) (6)
และ (7) ตัวอยางเชนคอนสตรัคเตอรในบรรทัด (10) ตองเซตคาตัวแปรคลาสจึงใชแมธธอส
setNumberOfWheels() และ setHasEngine() โดยสงผานคาคงตัวที่ตองการเขาไปในบรรทัด (11)
แมธธอส main() ตองการรูคาของตัวแปร hasEngine จึงใชแมธธอส getHasEngine() ซึ่งสงคาของตัวแปร
hasEngine ออกมาแทนที่จะเขาถึงตัวแปรhasEngine โดยตรงการตั้งชื่อแมธธอสสําหรับการเขาถึงตัวแปร
private นี้นิยมใชคําวา set และ get ตามดวยชื่อของตัวแปรนั้นๆ ในกรณีที่ตองการเซตคาและทราบคา
ตามลําดับ ทั้งนี้เปนเพียงความนิยมเทานั้น ไมจําเปนตองตั้งชื่อแบบนี้เสมอไป
ในกรณีของแมธธอส เราสามารถกําหนดใหเปน private ไดดวย การเขียนโปรแกรมเชิงวัตถุที่ดี
จะกําหนดใหแมธธอสใดที่มีประโยชนเฉพาะในคลาสเปน private เสมอ ตัวอยางเชนในบรรทัด (8)
isReady() เปนแมธธอสที่เขียนขึ้นใชเฉพาะสําหรับการเช็คความเรียบรอยของรถยนตกอนออกวิ่ง ดังนั้น
จึงมีที่ใชเฉพาะในแมธธอส run() ในบรรทัด (9) เทานั้น เราจึงกําหนดคาแมธธอส isReady() เปน private
ในขณะที่ตัวแมธธอส run() เองมีประโยชนนอกคลาส Vehicle จึงไมกําหนดใหเปน privateการที่ตัวแปร
คลาสและแมธธอสถูกกําจัดใหใชงานไดเฉพาะแตในคลาสดวยการกําหนดใหเปน private นี้อยาสับสน
กับการโอเวอรรายด สับคลาสของซูปเปอรคลาสยังคงสามารถโอเวอรรายดตัวแปรและแมธธอสของ
ซูปเปอรคลาสไดเสมอไมวาตัวแปรและแมธธอสเหลานั้นจะถูกกําหนดใหเปน private หรือไมอยางไรก็
ตามการกําหนดตัวแปรคลาสใหเปน private ก็มีความเสี่ยงอยูเหมือนกัน เพราะถาเราตองการสรางสับ
คลาสของคลาสนั้นในอนาคต และสับคลาสนั้นตองมีการใชตัวแปรคลาสที่เปน private ที่สืบทอดมา จะมี
ปญหาเพราะตัวแปรคลาส private ไมสามารถถูกกลาวถึงไดเลยในสับคลาส เราตองกลับไปแกไข
ซูปเปอรคลาสอีก ซึ่งเปนเรื่องไมนาพึงประสงคสําหรับการเขียนโปรแกรมที่ดีจําไววาสับคลาสจะสืบ
ทอดตัวแปรคลาสและแมธธอสทั้งหมดของซูปเปอรคลาสยกเวนตัวแปรคลาสและแมธธอสที่ประกาศให
เปน private
คําสั่ง public
เราไดเรียนรูมาแลววาเราสามารถกําหนดใหตัวแปรคลาสและแมธธอสถูกอางถึงไดเฉพาะใน
คลาสเทานั้นดวยการใชคําสั่ง private แตถาเราไมกําหนดอะไรเลย ตัวแปรคลาสและแมธธอสจะถูกอาง
ถึงไดทั้งในคลาส และนอก คลาส แตตองเปนคลาสที่อยูในแพจเกจเดียวกันเทานั้น ถาตองการใหตัวแปร
คลาสและ แมธธอสถูกอางถึงนอกแพจเกจไดดวย เราตองใชคําสั่ง public ทั้งนี้คลาสนั้นตองเปน public
ดวยมิฉะนั้นคําสั่ง public สําหรับตัวแปรคลาสและแมธธอส ก็ไมมีประโยชนอะไรแมธธอส main() เปน
แมธธอสหนึ่งที่ตองระบุใหเปน public เสมอ
บทที่ 7 แพ็คเกจ หนาที่ 178
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
คําสั่ง protected
คําสั่ง protected เปนคําสั่งที่อยูตรงกลางระหวางการไมระบุอะไรเลยใหตัวแปรคลาส
และแมธธอส กับการะบุใหเปน public ตัวแปรคลาสและแมธธอสที่ถูกระบุใหเปน protectedจะถูกอางถึง
ไดทั้งในคลาส นอกคลาสในแพจเกจเดียวกัน รวมทั้งสับคลาสของคลาสนั้นๆ นอกแพจเกจ คลาสที่ไมใช
สับคลาสและอยูนอกแพจเกจเดียวกันเทานั้นที่อางถึงไมได ทั้งนี้คลาสนั้นตองเปน public ดวยมิฉะนั้น
คําสั่ง protected สําหรับตัวแปรคลาสและ แมธธอสก็ไมมีประโยชนอะไร
เคล็ดลับ
ตามหลักการเขียนโปรแกรมเชิงวัตถุที่เขมงวด ตัวแปรคลาสควรประกาศเปน private คลาสใดที่
จะอางถึงหรือเปลี่ยนคาของตัวแปรคลาสตองเขาถึงผาน แมธธอสที่สรางไวใหโดยเฉพาะ แตถาคลาสนั้น
มีแนวโนมที่จะถูกสืบทอดในอนาคต ใหกําหนดเปน protected แทน เพราะสับคลาสมักตองอางถึงตัว
แปรคลาสของซูปเปอรคลาส
สรุป Accessibility method และ attribute แบงออกเปน 4 ชนิด
- Public เรียกใชไดไมวาจะอยู class หรือ package ใดก็ตาม
- Private เรียกใชไดเฉพาะภายใน class เทานั้น class อื่นเรียกใชไมได
- Protected ใชไดเหมือน public รวมทั้ง class ที่เปน subclass แตกรณีที่อยูตาง package กันจะใช
ไมได
- Default กรณีที่ไมกําหนดคา accessibility ไว จะหมายถึงเปนคา default โดยจะใชไดเฉพาะ
class และ subclass ที่อยูใน package เดียวกัน (ตาง package จะใชไมได)
บทที่ 7 แพ็คเกจ หนาที่ 179
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
รูปแสดง การเขาถึง member ภายใน class ที่มี modifier ตางๆ []
ตาราง สรุป modifier ของ method และ instance variable ที่อยูภายในคลาส
Public Protect Default Private
Class เดียวกัน / / / /
Subclass ใน package เดียวกัน / / / X
ไมเปน subclass แตอยูใน package กัน / / / X
Subclass ที่อยูตาง package กัน / / X X
Class ที่อยูตาง Package กัน และไมไดเปน subclass / X x X
บทที่ 7 แพ็คเกจ หนาที่ 180
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
แบบฝกหัด
1. ใหนิสิตเขียนโปรแกรมทายตัวเลขจากการเรียกใชงาน class Random เพื่อเขียนโปรแกรมทาย
ตัวเลข ทําการสุมตัวเลขขึ้นมาหนึ่งตัว อยูในชวง 0-100 แลวใหผูใชงานสุมทายวาเลขที่เครื่อง
คอมพิวเตอรสุมขึ้นมานั้นคือเลขอะไร โดยทายไดไมเกิน 10 ครั้ง หากเกินนี้คอมพิวเตอรชนะ โดยใน
การทายแตละครั้งหากไมถูกตองคอมพิวเตอรตองบอกดวยวา เลขที่สุมมากับคนทาย มากกวาหรือนอย
กวากัน
2. ใหนิสิตเขียนโปรแกรมโดยเรียกใชงาน method ในคลาส String ใหมากที่สุด โดยทําการรับ
คา String มาหนึ่งชุด แลวทําการ reverse ตัวอักษรกลับพรอมทั้งแสดงเปนตัวอักษรใหญทั้งหมด เชน
input : Advance Programming Language
output : EGAUGNAL GNIMMARGORP ECNAVDA

More Related Content

Viewers also liked

Javacentrix com chap07-0
Javacentrix com chap07-0Javacentrix com chap07-0
Javacentrix com chap07-0Theeravaj Tum
 
Javacentrix com chap05-0
Javacentrix com chap05-0Javacentrix com chap05-0
Javacentrix com chap05-0Theeravaj Tum
 
บทที่ 9 การพ้องรูป
บทที่ 9 การพ้องรูปบทที่ 9 การพ้องรูป
บทที่ 9 การพ้องรูปTheeravaj Tum
 
บทที่ 13 การดักจับเ
บทที่ 13 การดักจับเบทที่ 13 การดักจับเ
บทที่ 13 การดักจับเTheeravaj Tum
 
บทที่ 5 คลาส
บทที่ 5 คลาสบทที่ 5 คลาส
บทที่ 5 คลาสTheeravaj Tum
 
Javacentrix com chap01-0
Javacentrix com chap01-0Javacentrix com chap01-0
Javacentrix com chap01-0Theeravaj Tum
 
Javacentrix com chap11-2
Javacentrix com chap11-2Javacentrix com chap11-2
Javacentrix com chap11-2Theeravaj Tum
 
Projets sur les carrières
Projets sur les carrièresProjets sur les carrières
Projets sur les carrièresguimondghislain
 
Fake it ('till you make it)
Fake it ('till you make it)Fake it ('till you make it)
Fake it ('till you make it)Rémi Delhaye
 
[FRENCH] - Neo4j and Cypher - Remi Delhaye
[FRENCH] - Neo4j and Cypher - Remi Delhaye[FRENCH] - Neo4j and Cypher - Remi Delhaye
[FRENCH] - Neo4j and Cypher - Remi DelhayeRémi Delhaye
 
Presentation1
Presentation1Presentation1
Presentation1ashokkol
 
Etude cas maroc vs-infostratégique (2)
Etude cas maroc vs-infostratégique (2)Etude cas maroc vs-infostratégique (2)
Etude cas maroc vs-infostratégique (2)Chouaib Yousfi
 

Viewers also liked (15)

Javacentrix com chap07-0
Javacentrix com chap07-0Javacentrix com chap07-0
Javacentrix com chap07-0
 
Javacentrix com chap05-0
Javacentrix com chap05-0Javacentrix com chap05-0
Javacentrix com chap05-0
 
บทที่ 9 การพ้องรูป
บทที่ 9 การพ้องรูปบทที่ 9 การพ้องรูป
บทที่ 9 การพ้องรูป
 
บทที่ 13 การดักจับเ
บทที่ 13 การดักจับเบทที่ 13 การดักจับเ
บทที่ 13 การดักจับเ
 
บทที่ 5 คลาส
บทที่ 5 คลาสบทที่ 5 คลาส
บทที่ 5 คลาส
 
Javacentrix com chap01-0
Javacentrix com chap01-0Javacentrix com chap01-0
Javacentrix com chap01-0
 
Javacentrix com chap11-2
Javacentrix com chap11-2Javacentrix com chap11-2
Javacentrix com chap11-2
 
Projets sur les carrières
Projets sur les carrièresProjets sur les carrières
Projets sur les carrières
 
Fake it ('till you make it)
Fake it ('till you make it)Fake it ('till you make it)
Fake it ('till you make it)
 
[FRENCH] - Neo4j and Cypher - Remi Delhaye
[FRENCH] - Neo4j and Cypher - Remi Delhaye[FRENCH] - Neo4j and Cypher - Remi Delhaye
[FRENCH] - Neo4j and Cypher - Remi Delhaye
 
Presentation1
Presentation1Presentation1
Presentation1
 
Rupeee vs dollar
Rupeee vs dollarRupeee vs dollar
Rupeee vs dollar
 
Etude cas maroc vs-infostratégique (2)
Etude cas maroc vs-infostratégique (2)Etude cas maroc vs-infostratégique (2)
Etude cas maroc vs-infostratégique (2)
 
Demutualization of stock exchanges
Demutualization of stock exchanges Demutualization of stock exchanges
Demutualization of stock exchanges
 
Support de cours
Support de coursSupport de cours
Support de cours
 

More from Theeravaj Tum

Javacentrix com chap10-0
Javacentrix com chap10-0Javacentrix com chap10-0
Javacentrix com chap10-0Theeravaj Tum
 
Javacentrix com chap08-0
Javacentrix com chap08-0Javacentrix com chap08-0
Javacentrix com chap08-0Theeravaj Tum
 
Javacentrix com chap06-0
Javacentrix com chap06-0Javacentrix com chap06-0
Javacentrix com chap06-0Theeravaj Tum
 
Javacentrix com chap02-0
Javacentrix com chap02-0Javacentrix com chap02-0
Javacentrix com chap02-0Theeravaj Tum
 
บทที่ 12 กราฟฟิก
บทที่ 12 กราฟฟิกบทที่ 12 กราฟฟิก
บทที่ 12 กราฟฟิกTheeravaj Tum
 
บทที่ 10 ตัวแปรสตริ
บทที่ 10 ตัวแปรสตริบทที่ 10 ตัวแปรสตริ
บทที่ 10 ตัวแปรสตริTheeravaj Tum
 
บทที่ 8 คุณสมบัติก
บทที่ 8 คุณสมบัติกบทที่ 8 คุณสมบัติก
บทที่ 8 คุณสมบัติกTheeravaj Tum
 
บทที่ 6 อาร์เรย์
บทที่ 6 อาร์เรย์บทที่ 6 อาร์เรย์
บทที่ 6 อาร์เรย์Theeravaj Tum
 
บทที่ 4 แอทริบิวท์
บทที่ 4 แอทริบิวท์บทที่ 4 แอทริบิวท์
บทที่ 4 แอทริบิวท์Theeravaj Tum
 
บทที่ 3 คำสั่งควบค
บทที่ 3 คำสั่งควบคบทที่ 3 คำสั่งควบค
บทที่ 3 คำสั่งควบคTheeravaj Tum
 

More from Theeravaj Tum (10)

Javacentrix com chap10-0
Javacentrix com chap10-0Javacentrix com chap10-0
Javacentrix com chap10-0
 
Javacentrix com chap08-0
Javacentrix com chap08-0Javacentrix com chap08-0
Javacentrix com chap08-0
 
Javacentrix com chap06-0
Javacentrix com chap06-0Javacentrix com chap06-0
Javacentrix com chap06-0
 
Javacentrix com chap02-0
Javacentrix com chap02-0Javacentrix com chap02-0
Javacentrix com chap02-0
 
บทที่ 12 กราฟฟิก
บทที่ 12 กราฟฟิกบทที่ 12 กราฟฟิก
บทที่ 12 กราฟฟิก
 
บทที่ 10 ตัวแปรสตริ
บทที่ 10 ตัวแปรสตริบทที่ 10 ตัวแปรสตริ
บทที่ 10 ตัวแปรสตริ
 
บทที่ 8 คุณสมบัติก
บทที่ 8 คุณสมบัติกบทที่ 8 คุณสมบัติก
บทที่ 8 คุณสมบัติก
 
บทที่ 6 อาร์เรย์
บทที่ 6 อาร์เรย์บทที่ 6 อาร์เรย์
บทที่ 6 อาร์เรย์
 
บทที่ 4 แอทริบิวท์
บทที่ 4 แอทริบิวท์บทที่ 4 แอทริบิวท์
บทที่ 4 แอทริบิวท์
 
บทที่ 3 คำสั่งควบค
บทที่ 3 คำสั่งควบคบทที่ 3 คำสั่งควบค
บทที่ 3 คำสั่งควบค
 

บทที่ 7 แพ็คเกจ

  • 2. บทที่ 7 แพ็คเกจ หนาที่ 162 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ เนื้อหาบทเรียน ♦ รูจักกับแพ็คเก็จ ♦ หลักการทํางานของแพ็คเก็จ ♦ การใชคําสั่ง import ♦ ขอกําหนดการประกาศคลาส
  • 3. บทที่ 7 แพ็คเกจ หนาที่ 163 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ Package คลาสของภาษาจาวาจะถูกแยกเก็บหนึ่งคลาสตอหนึ่งไฟล ทําใหระบบขนาดใหญมีไฟลจํานวน มากและมักจะมีปญหาในการนําสงโปรแกรม ภาษาจาวาจึงนํา package ไวเปนที่เก็บรวบรวม class คลายกับ library ในภาษา c แตตางกันตรงที่ package เปนสวนหนึ่งของภาษาจาวา ผูเขียนโปรแกรม สามารถกําหนดให class ใดๆ อยูใน package ใดไดโดยการเขียน code ในโปรแกรม และ package มี โครงสรางเปนแบบ hierarchical หรือโครงสรางแบบตนไม คือใน package หนึ่งสามารถสราง package ยอยลงไปไดอีก เพื่อการแบงหมวดหมูยอยในหมวดหมูที่ใหญกวาลงมาเปนสาขา เหมือนกับโครงสราง ของไดเรกทอรีของระบบปฏิบัติการ ทุกคลาสที่ถูกสรางขึ้นจะตองอยูใน package ใด package หนึ่งเสมอ หากเราไมระบุวาคลาสที่ สรางอยูใน package ใด ดังในตัวอยางที่เคยสรางกอนมา คอมไพเลอรจะใหคลาสนั้นอยูใน default package ซึ่งก็คือไดเร็กทรอรีปจจุบัน การระบุใหคลาสอยูใน package ที่ตองการจะตองขึ้นตนโปรแกรม ของคลาสนั้นดวย keyword ‘package’ และตามดวยชื่อ package ดังนี้ package [<package_name>] .<sub_package_name>; package_name : ชื่อของpackage ตามหลักการตั้งชื่อของ folder sub_package_name : ชื่อของ package ยอย จะมีหรือไมมีก็ไดและสามารถระบุแพ็คเก็จยอยกี่ชั้น ก็ไดตามความตองการ หมายเหตุ - การประกาศชื่อแพ็คเก็จนิยมใชตัวอักษรเล็กทั้งหมด - การประกาศแพ็คเก็จจะตองประกาศไวที่บรรทัดแรกสุดเทานั้น แตสามารถใสคอมเมนตหรือ ชองวางไวกอนการประกาศแพ็คเก็จได - สามารถประกาศแพ็คเก็จไดเพียง 1 แพ็คเก็จตอ 1 ซอรสไฟล(ไฟล .java) เทานั้น - ถาไมระบุแพ็คเก็จไวสวนตนไฟล แลวไฟล .class ที่ไดจากการคอมไพลจะถูกเก็บไวในไดเร็ค ทรอรีเดียวกับไดเร็คทรอรีที่กําลังทํางานอยู
  • 4. บทที่ 7 แพ็คเกจ หนาที่ 164 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ ตัวอยาง การสรางคลาส A ใน package ที่ชื่อ myPackage จากนั้นทําการคอมไพลโปรแกรมโดยการใช command ดังตอไปนี้ D:chap7javac -d . <filename.java> -d เปน option ของ java compiler(javac.exe) ใชระบุเพื่อบอกคอมไพเลอรวาเมื่อคอมไพลได ไฟล .class ออกมาแลวใหนําไฟล .class ไปเก็บไวที่ไดเร็กทรอรีใด //A.java บันทึกใน directory d:chap7 package myPackage; public class A{ public void print(){ System.out.println("Hello , I am A class."); } }
  • 5. บทที่ 7 แพ็คเกจ หนาที่ 165 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ ผลลัพธที่ไดจากการคอมไพล ตัวอยาง คอมไพเลอรจะสรางโฟรเดอรชื่อ myPackage ในโฟร เดอร chap7 ซึ่งเปนที่เก็บไฟลนามสกุล A.java และภายใน package ชื่อ myPackage จะประกอบดวย ไฟล A.class อยูภายใน ตัวอยาง สราง class B ใน package ชื่อ mySubPackage ซึ่งอยูภายใต myPackage // B.java save in chap7 package myPackage.mySubPackage; public class B{ public void print(){ System.out.println("Hello , I am B class"); } }
  • 6. บทที่ 7 แพ็คเกจ หนาที่ 166 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ จากการ compile ทั้งสองโปรแกรมจะไดไฟลอยูในโฟลเดอรดังตอไปนี้ D:chap7 A.java B.java myPackage A.class mySubPackage B.class คลาส A และ คลาส B จะตองระบุเปน public มิเชนนั้นจะไมสามารถอางถึงไดจากภายนอก package และในทํานองเดียวกัน method print ของทั้งสอง class ตองเปน public ดวย มิเชนนั้นจะไม สามารถเรียกใชงานจากภายนอก package ได ตัวอยางการเรียกใชงาน class A และ class B จากตัวอยางสังเกตวาการอางถึงคลาส A และ คลาส B ในทุกตําแหนงจะตองระบุชื่อเต็มของ package เปน myPackage.A และ mySubPackage.B ตามลําดับ จึงเปนเรื่องที่ยุงยากและทําใหเกิด ความผิดพลาดไดงาย ภาษาจาวาจึงนําเอาประโยค import สําหรับทําใหชื่อของ package รูจักกันทั้ง โปรแกรมและอางถึงไดโดยใชเพียงชื่อคลาสเทานั้น //testPackage1.java save in chap7 folder class testPackage1{ public static void main(String[] args) { new myPackage.A().print(); new myPackage.mySubPackage.B().print(); } } ผลลัพธที่ไดคือ Hello , I am A class. Hello , I am B class
  • 7. บทที่ 7 แพ็คเกจ หนาที่ 167 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ หากตองการนําคลาสที่มีอยูแลวมาใชในโปรแกรมที่กําลังจะสรางขึ้นใหม เราจะตองใชคําสั่ง import เพื่อบอกใหคอมไพเลอรทราบวาจะสามารถหาคลาสที่เราตองการใชงานไดจากในแพ็กเก็จใด โดยตองใชคําสั่ง import กอนการประกาศคลาสเสมอ รูปแบบของการใชคําสั่ง import เพื่อนําคลาสในแพ็กเก็จที่ตองการเขามาใชงานคือ import <package_name>.<sub_package>.<class_name>; ในการระบุชื่อคลาสที่ตองการใชงานนั้น จะระบุชื่อคลาสลงไปตรงๆ หรือระบุเปน * ซึ่ง หมายถึงคลาสทุกคลาสก็ได การระบุชื่อคลาสใดคลาสหนึ่ง กับการระบุ * หมายถึง ทุกคลาสจะไมมีผลตางกัน เพราะการ ระบุ * ไมไดหมายความวาคลาสทุกคลาสจะถูกโหลดเขาสูหนวยความจําใหสิ้นเปลือง เพราะความจริง แลวจะมีแตเฉพาะคลาสที่ถูกเรียกใชงานเทานั้น ที่จะถูกโหลดเขาสูหนวยความจํา ตัวอยาง การใชงานประโยค import ประโยค import จะตองอยูหลังจากประโยค package (ถามี) และอยูกอนประโยคอื่นๆ ใน โปรแกรม ยกเวน comment ประโยค import ระบุถึงชื่อคลาสที่จะใชงาน หากตองการใชงานหลาย คลาสอาจจะแยก import คลาสละประโยคหรือจะ import ทุกคลาสใน package โดยใช * ก็ได อยางเชน import myPackage.*; จะทําใหอางถึงทุกๆ คลาสใน myPackage ได แตไมรวมไปถึงใน sub-package สวน import myPackage.mySubPackage.*; จะทําใหอางถึงทุกคลาสใน myPackage.mySubPackage ได //testPackage2.java save in week13 directory import myPackage.A; import myPackage.mySubPackage.B; class testPackage2{ public static void main(String args[]){ new A().print(); B b = new B(); b.print(); } } ผลลัพธที่ไดคือ Hello , I am A class. Hello , I am B class
  • 8. บทที่ 7 แพ็คเกจ หนาที่ 168 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ การ import คลาสไมไดทําใหโปรแกรมของคลาสนั้นถูกนําเขามารวมกับโปรแกรมที่ถูก คอมไพล เนื่องจากคลาสที่ถูกอางถึงนั้นจะถูกโหลดเขาสู java Interpreter ตอนโปรแกรมทํางาน ประโยค import ชวยเพียงใหคอมไพเลอรมองหาคลาสนั้นไดพบและสรางโปรแกรมที่อางถึงคลาสนั้น ในขณะทํางานไดถูกตอง การ import เพียงคลาสเดียวหรือ import ทุกคลาสดวย ‘*’ จะไมทําใหไฟล .class ที่ไดมีขนาดตางกัน รวมทั้งความเร็วในตอนทํางานก็ไมตางกัน คลาสพื้นฐานที่จําเปนสําหรับโปรแกรมสวนใหญในภาษา java จะถูกเก็บอยูใน package ที่ชื่อ java.lang และจะทําการ import package ดังกลาวโดย default คอมไพเลอรของภาษาจาวา จะ import package นี้มาใชในทุกๆ โปรแกรมทําใหไมตองมีประโยค import java.lang.*; ในโปรแกรมหรือถา กําหนดเขาไปก็ไมเปนไร ประโยชนของ package คือ ชวยใหสามารถระบุที่อยูของคลาสใน package ผานทางชื่อของ package เพียงชื่อเดียวได จึงสะดวกในการ import และอางถึงผานทาง network สวนประโยชนในการ สรางโปรแกรมคือ package ทําใหเกิดขอบเขตการมองเห็นใหแกคลาสที่จะทํางานรวมกันโดยมีกฎเกณฑ ดังนี้ - คลาสใดคลาสหนึ่งจะถูกระบุใหเปน public , default หรือ protected แตไมอาจระบุเปน protected ได - ทุกคลาสใน package จะอางถึงคลาสที่เปน public , default หรือ protected ภายใน package เดียวกันได - ทุกคลาสใน package หนึ่งจะอางถึงสมาชิกที่เปน public , default หรือ protected ของคลาสอื่น ภายใน package เดียวกันได ตัวอยาง แสดงการใช package ในการจํากัดขอบเขตการมองเห็น ทําการบันทึก ไฟล ClassA.java และ ไฟล ClassB.java ในไดเรกทอรี d:chap7 //ClassA.java save in d: chap7 package temp; public class ClassA{ //ClassB is visible here void defaultMethod(){ System.out.println("ClassA default method"); } public void publicMethod(){ System.out.println("ClassA public method"); } }
  • 9. บทที่ 7 แพ็คเกจ หนาที่ 169 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ //TestTemp.java save in d: chap7 import temp.*; class TestTemp{ public static void main(String[] args) { ClassA a = new ClassA(); //ClassB is not visible a.publicMethod(); //a.defaultMethod() is not visible } } ผลลัพธที่ไดคือ ClassA public method จากตัวอยาง classA และ classB จะมองเห็นกันและกันเพราะอยูใน package temp เหมือนกัน หากคลาสใดคลาสหนึ่งสราง instance ของอีกคลาสหนึ่ง ก็สามารถเรียกใชทั้ง publicMethod( ) กับ defaultMethod() ของ instance นั้นได คลาส ClassA ถูกระบุใหเปน public สวนคลาส ClassB เปน default ขอแตกตางนี้ ทําให TestTemp.java ซึ่งไมไดอยูใน package temp สามารถมองเห็นไดเพียงคลาส ClassA เทานั้น เมื่อ TestTemp สราง instance ของคลาส ClassA ขึ้นก็จะสามารถเรียกไดแตเพียง a.publicMethod( ) แตไมสามารถเรียก a.defaultMethod( ) ได สรุป คือ คลาสหรือ method ที่เปน public หรือ default จะมองเห็นไดเหมือนกันภายใน package เดียวกัน แตจากภายนอก package จะมองเห็นไดแตคลาสหรือสมาชิกที่เปน public เทานั้น //ClassB.java save in D: chap7 package temp; class ClassB{ //ClassA is visible here void defaultMethod(){ System.out.println("ClassB default method"); } public void publicMethod(){ System.out.println("ClassB public method"); } }
  • 10. บทที่ 7 แพ็คเกจ หนาที่ 170 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ ตัวอยาง การเรียกใชงานแพ็คเกจสามารถ import package เพื่อใชในการสราง subclass ได จะไดกลาวถึงในบทตอไป import java.util.*; class MyDate extends Date{ ……. } ตัวอยาง ในกรณีที่ตองการสราง subclass จาก package อาจจะเขียนแบบยอๆ ไดโดยไมตอง ใชคําสั่ง import ก็ได import java.util.*; class MyDate extends java.util.Date{ …… }
  • 11. บทที่ 7 แพ็คเกจ หนาที่ 171 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ ตัวอยาง. แสดงการนํา class มาใชงานโดยการเรียกใช class กันเอง ไมตองใช package โปรแกรมหลักที่ class อื่น เรียกใช class นี้ public class Car{ int wheel; int tires; int speed; public Car(int inWheels,int inTires,int inSpeed ){ //constructor method wheels = inWheels; tires = inTires; speed = inSpeed; } } //class Van จะเรียกใชงาน class Car โดยตรง public class Van{ Car theCar;// เรียกใช Car class โดยตรง ไมตองทําการ import เขามาไวในโปรแกรม int door; public Van(Car inCar, int inDoor){ //constructor method theCar = inCar; doors = inDoor; } }
  • 12. บทที่ 7 แพ็คเกจ หนาที่ 172 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ แพ็คเกจมาตรฐาน ในภาษาจาวามีแพ็คเกจมาตรฐานกลุมหนึ่งซึ่งเก็บคลาสพื้นฐานของภาษาจาวาเอาไวใหนักเขียน โปรแกรมเมอรภาษาจาวาอิมพอรตไปใชไดเลย ตัวอยางของแพ็คเกจมาตรฐานที่ควรรูจักไดแก java.lang แพ็คเกจนี้เปนแพ็คเกจพื้นฐานที่สุดของภาษาจาวา ตัวอยางคลาสในแพ็คเกจนี้ไดแก คลาสMath คลาส String คลาสของตัวแปรพื้นฐาน คลาสเกี่ยวกับเอ็กซเซฟชั่น และคลาสเกี่ยวกับเทรด แพ็คเกจนี้เปน แพ็คเกจพิเศษเพราะเวลาตองการใชงานคลาสในแพ็คเกจนี้ไมตองใชคําสั่ง import สามารถเรียกใชคลาส ในแพ็คเกจไดโดยตรง ตัวอยาง แสดงการนํา Car class มาทําเปน package เพื่อให Van class import เขามาใชในโปรแกรม ของตนเอง package Transportation; //สราง package ชื่อ “Transportation” public class Car{ int wheel; int tires; int speed; public Car(int inWheels,int inTires,int inSpeed ){ //constructor method wheels = inWheels; tires = inTires; speed = inSpeed; } public class Van{ Transportation.Car theCar; //import Package เขามาในโปรแกรม Car theCar;// เรียกใช Car class โดยตรง ไมตองทําการ import เขามาไวในโปรแกรม int door; public Van(Car inCar, int inDoor){ //constructor method theCar = inCar; doors = inDoor; } }
  • 13. บทที่ 7 แพ็คเกจ หนาที่ 173 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ java.util แพ็คเกจนี้เก็บคลาสเกี่ยวกับการจัดการวันที่ โซนเวลา การจัดการขอมูล การจัดการ ภาษาตางประเทศ เวลาตองการใชงานคลาสในแพ็คเกจนี้ตองใชคําสั่ง import java.util.*; java.io แพ็คเกจนี้เก็บคลาสเกี่ยวกับการเขียนอานดิสก การรับคาคียบอรด และการแสดงผลออกนอกจอ เวลาตองการใชงานคลาสในแพ็คเกจนี้ตองใชคําสั่ง import java.io.*; java.awt แพ็คเกจนี้เก็บคลาสเกี่ยวกับการสราง GUI ที่เปนกราฟฟก เวลาตองการเรียกใชงานตองใชคําสั่ง import java.awt.*; java.awt.event แพ็คเกจนี้เก็บคลาสเกี่ยวกับการรับคําสั่งจากเมาสหรือคียบอรด แพ็คเกจนี้เปนสับแพ็คเกจของ แพ็คเกจ java.awt แตเวลาใชงานตองเรียกดวยคําสั่งตางหากคือ java.awt.event.*; เพราะเครื่องหมาย * ไม นับรวมสับแพ็คเกจดังที่ไดกลาวไปแลว javax.swing แพ็คเกจนี้เก็บคลาสเกี่ยวกับการสราง GUI เชนเดียวกับ java.awt ถาตองการทราบวาคลาสใน แพ็คเกจเหลานี้มีอะไรบาง สามารถคนควาไดจากเวบไซต http://java.sun.com การรวมคลาส และแมธธอสหลายๆ อันไวในแพ็คเกจนี้ก็คลายๆ กับการจัดระเบียบ API เปนกลุมๆ นั้นเอง ตัวกํากับตัวแปรคลาสและแมธธอส ปกติแลวคลาสที่เราสรางขึ้นมาจะสามารถถูกอางถึงไดภายในตัวมันเอง และภายในคลาสอื่นๆ ที่ อยูในแพจเกจเดียวกัน ถาเราตองการใหคลาสในแพจเกจอื่นๆ อางถึงคลาสที่เราสรางขึ้นไดดวยเราจะประ กาสคลาสนั้นใหเปน คลาสสาธารณะ ดวยการใชคําสั่ง public เราสามารถกําหนดขอบเขตของการเขาถึง ตัวแปรคลาส และ แมธธอส ไดในทํานองเดียวกัน กับการใชคําสั่ง public ในกรณีของคลาส แตคําสั่ง สําหรับตัวแปรคลาส และ แมทธอด มีมากกวาแคคําสั่ง public เราเรียกคําสั่งเหลานี้วา ตัวกํากับตัวแปร (modifier) ดังรายละเอียดตอไปนี้ คําสั่ง Private โดยปกติแลวทั้งตัวแปรคลาส และแมธธอส สามารถถูกอางถึงไดทั้งในและนอกคลาส พิจารณา ตัวอยางตอไปนี้
  • 14. บทที่ 7 แพ็คเกจ หนาที่ 174 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ public class TestACar { public static void main (String[] args) { Vehicle myCar = new Vehicle(); if (myCar.hasEngine) { // (4) myCar.run(); // (5) } Truck t = new Truck(); } } ผลลัพธที่ไดคือ I am running I am running I am running I am running //class testAcar.java class Vehicle { int numberOfWheels; boolean hasEngine; Vehicle() { // (1) numberOfWheels = 10; hasEngine = true; run(); } void run(){ // (2) numberOfWheels = 4; if (numberOfWheels >= 4) { System.out.println("I am running"); } } } class Truck extends Vehicle { float maximumLoad; Truck() { // (3) numberOfWheels = 6; hasEngine = true; run(); } void load(float weight) { if (weight <= maximumLoad) System.out.println("I am carrying a " + weight + "-pound load."); } }
  • 15. บทที่ 7 แพ็คเกจ หนาที่ 175 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ คลาส Vehicle มีตัวแปร numberOfWheels hasEngine และแมธธอส run() ซึ่งสามารถถูก นําไปใชที่ไหนก็ไดภายในคลาส Vehicle เชนในคอนสตรัคเตอรในบรรทัด (1) หรือในตัวแมธธอส run() เองในบรรทัด (2) นอกจากนี้ยังถูกนําไปใชไดภายในคลาส Truck ซึ่งเปนสับคลาสของ Vehicle เชนใน คอนสตรัคเตอรในบรรทัด (3) รวมทั้งถูกนําไปใชไดในคลาส TestACar ซึ่งไมไดสืบทอดคลาส Vehicle โดยการประกาศอินสแตนทของคลาส Vehicle และเรียกผานอินสแตนทดังในบรรทัด (4) และ (5) กลาวคือสามารถนําไปใชไดทุกที่ใน ซอรสไฟลเราสามารถบังคับใหตัวแปรคลาสและแมธธอสถูกนําไปใชไดเฉพาะในคลาสที่มันเปนเจาของ เทานั้นไดดวยการใช คําสั่ง private นําหนา การเขียนโปรแกรมเชิงวัตถุที่ดีควรกําหนดตัวแปรคลาสให เปน private เสมอ ถาคลาสอื่นๆ ตองการใชงานตัวแปรคลาสนั้นๆ ก็ใหเขียนแมธธอสขึ้นมาไวสําหรับตั้ง คาโดยเฉพาะ เราสามารถปรับปรุงโปรแกรมขางตนของเราใหเปนโปรแกรมที่ดีตามหลักของการเขียน โปรแกรมเชิงวัตถุไดดังตัวอยางขางลางนี้ class Vehicle { private int numberOfWheels; // (1) private boolean hasEngine; // (2) Vehicle() { // (3) numberOfWheels = 10; hasEngine = true; run(); } void setNumberOfWheels(int i) { // (4) numberOfWheels = i; } void setHasEngine(boolean b) { // (5) hasEngine = b; } int getNumberOfWheels() { // (6) return numberOfWheels; } boolean getHasEngine() { // (7) return hasEngine; } private boolean isReady() { // (8) return (numberOfWheels == 4 && hasEngine); }
  • 16. บทที่ 7 แพ็คเกจ หนาที่ 176 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ void run(){ // (9) numberOfWheels = 4; if (isReady()) { System.out.println("I am running"); } } } class Truck extends Vehicle { float maximumLoad; Truck() { // (10) setNumberOfWheels(6); setHasEngine(true); run(); } void load(float weight) { if (weight <= maximumLoad) System.out.println("I am carrying a " + weight + "-poundload."); } } public class TestACar2 { public static void main (String[] args) { Vehicle myCar = new Vehicle(); if (myCar.getHasEngine()) { // (11) myCar.run(); } Truck t = new Truck(); }} ผลลัพธที่ไดคือ I am running I am running I am running I am running
  • 17. บทที่ 7 แพ็คเกจ หนาที่ 177 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ ในบรรทัด (1) และ (2) ตัวแปรคลาส numberOfWheels และ hasEngine ถูกกําหนดใหเปนตัว แปร private ตัวแปรทั้งสองยังคงถูกนําไปใชไดภายในคลาส Vehicle ดังในบรรทัด (3) และ (9) แตถา ตองการอางถึงตัวแปรเหลานี้นอกคลาส Vehicle ตองอางถึงโดยการผานแมธธอสในบรรทัด (4) (5) (6) และ (7) ตัวอยางเชนคอนสตรัคเตอรในบรรทัด (10) ตองเซตคาตัวแปรคลาสจึงใชแมธธอส setNumberOfWheels() และ setHasEngine() โดยสงผานคาคงตัวที่ตองการเขาไปในบรรทัด (11) แมธธอส main() ตองการรูคาของตัวแปร hasEngine จึงใชแมธธอส getHasEngine() ซึ่งสงคาของตัวแปร hasEngine ออกมาแทนที่จะเขาถึงตัวแปรhasEngine โดยตรงการตั้งชื่อแมธธอสสําหรับการเขาถึงตัวแปร private นี้นิยมใชคําวา set และ get ตามดวยชื่อของตัวแปรนั้นๆ ในกรณีที่ตองการเซตคาและทราบคา ตามลําดับ ทั้งนี้เปนเพียงความนิยมเทานั้น ไมจําเปนตองตั้งชื่อแบบนี้เสมอไป ในกรณีของแมธธอส เราสามารถกําหนดใหเปน private ไดดวย การเขียนโปรแกรมเชิงวัตถุที่ดี จะกําหนดใหแมธธอสใดที่มีประโยชนเฉพาะในคลาสเปน private เสมอ ตัวอยางเชนในบรรทัด (8) isReady() เปนแมธธอสที่เขียนขึ้นใชเฉพาะสําหรับการเช็คความเรียบรอยของรถยนตกอนออกวิ่ง ดังนั้น จึงมีที่ใชเฉพาะในแมธธอส run() ในบรรทัด (9) เทานั้น เราจึงกําหนดคาแมธธอส isReady() เปน private ในขณะที่ตัวแมธธอส run() เองมีประโยชนนอกคลาส Vehicle จึงไมกําหนดใหเปน privateการที่ตัวแปร คลาสและแมธธอสถูกกําจัดใหใชงานไดเฉพาะแตในคลาสดวยการกําหนดใหเปน private นี้อยาสับสน กับการโอเวอรรายด สับคลาสของซูปเปอรคลาสยังคงสามารถโอเวอรรายดตัวแปรและแมธธอสของ ซูปเปอรคลาสไดเสมอไมวาตัวแปรและแมธธอสเหลานั้นจะถูกกําหนดใหเปน private หรือไมอยางไรก็ ตามการกําหนดตัวแปรคลาสใหเปน private ก็มีความเสี่ยงอยูเหมือนกัน เพราะถาเราตองการสรางสับ คลาสของคลาสนั้นในอนาคต และสับคลาสนั้นตองมีการใชตัวแปรคลาสที่เปน private ที่สืบทอดมา จะมี ปญหาเพราะตัวแปรคลาส private ไมสามารถถูกกลาวถึงไดเลยในสับคลาส เราตองกลับไปแกไข ซูปเปอรคลาสอีก ซึ่งเปนเรื่องไมนาพึงประสงคสําหรับการเขียนโปรแกรมที่ดีจําไววาสับคลาสจะสืบ ทอดตัวแปรคลาสและแมธธอสทั้งหมดของซูปเปอรคลาสยกเวนตัวแปรคลาสและแมธธอสที่ประกาศให เปน private คําสั่ง public เราไดเรียนรูมาแลววาเราสามารถกําหนดใหตัวแปรคลาสและแมธธอสถูกอางถึงไดเฉพาะใน คลาสเทานั้นดวยการใชคําสั่ง private แตถาเราไมกําหนดอะไรเลย ตัวแปรคลาสและแมธธอสจะถูกอาง ถึงไดทั้งในคลาส และนอก คลาส แตตองเปนคลาสที่อยูในแพจเกจเดียวกันเทานั้น ถาตองการใหตัวแปร คลาสและ แมธธอสถูกอางถึงนอกแพจเกจไดดวย เราตองใชคําสั่ง public ทั้งนี้คลาสนั้นตองเปน public ดวยมิฉะนั้นคําสั่ง public สําหรับตัวแปรคลาสและแมธธอส ก็ไมมีประโยชนอะไรแมธธอส main() เปน แมธธอสหนึ่งที่ตองระบุใหเปน public เสมอ
  • 18. บทที่ 7 แพ็คเกจ หนาที่ 178 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ คําสั่ง protected คําสั่ง protected เปนคําสั่งที่อยูตรงกลางระหวางการไมระบุอะไรเลยใหตัวแปรคลาส และแมธธอส กับการะบุใหเปน public ตัวแปรคลาสและแมธธอสที่ถูกระบุใหเปน protectedจะถูกอางถึง ไดทั้งในคลาส นอกคลาสในแพจเกจเดียวกัน รวมทั้งสับคลาสของคลาสนั้นๆ นอกแพจเกจ คลาสที่ไมใช สับคลาสและอยูนอกแพจเกจเดียวกันเทานั้นที่อางถึงไมได ทั้งนี้คลาสนั้นตองเปน public ดวยมิฉะนั้น คําสั่ง protected สําหรับตัวแปรคลาสและ แมธธอสก็ไมมีประโยชนอะไร เคล็ดลับ ตามหลักการเขียนโปรแกรมเชิงวัตถุที่เขมงวด ตัวแปรคลาสควรประกาศเปน private คลาสใดที่ จะอางถึงหรือเปลี่ยนคาของตัวแปรคลาสตองเขาถึงผาน แมธธอสที่สรางไวใหโดยเฉพาะ แตถาคลาสนั้น มีแนวโนมที่จะถูกสืบทอดในอนาคต ใหกําหนดเปน protected แทน เพราะสับคลาสมักตองอางถึงตัว แปรคลาสของซูปเปอรคลาส สรุป Accessibility method และ attribute แบงออกเปน 4 ชนิด - Public เรียกใชไดไมวาจะอยู class หรือ package ใดก็ตาม - Private เรียกใชไดเฉพาะภายใน class เทานั้น class อื่นเรียกใชไมได - Protected ใชไดเหมือน public รวมทั้ง class ที่เปน subclass แตกรณีที่อยูตาง package กันจะใช ไมได - Default กรณีที่ไมกําหนดคา accessibility ไว จะหมายถึงเปนคา default โดยจะใชไดเฉพาะ class และ subclass ที่อยูใน package เดียวกัน (ตาง package จะใชไมได)
  • 19. บทที่ 7 แพ็คเกจ หนาที่ 179 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ รูปแสดง การเขาถึง member ภายใน class ที่มี modifier ตางๆ [] ตาราง สรุป modifier ของ method และ instance variable ที่อยูภายในคลาส Public Protect Default Private Class เดียวกัน / / / / Subclass ใน package เดียวกัน / / / X ไมเปน subclass แตอยูใน package กัน / / / X Subclass ที่อยูตาง package กัน / / X X Class ที่อยูตาง Package กัน และไมไดเปน subclass / X x X
  • 20. บทที่ 7 แพ็คเกจ หนาที่ 180 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ แบบฝกหัด 1. ใหนิสิตเขียนโปรแกรมทายตัวเลขจากการเรียกใชงาน class Random เพื่อเขียนโปรแกรมทาย ตัวเลข ทําการสุมตัวเลขขึ้นมาหนึ่งตัว อยูในชวง 0-100 แลวใหผูใชงานสุมทายวาเลขที่เครื่อง คอมพิวเตอรสุมขึ้นมานั้นคือเลขอะไร โดยทายไดไมเกิน 10 ครั้ง หากเกินนี้คอมพิวเตอรชนะ โดยใน การทายแตละครั้งหากไมถูกตองคอมพิวเตอรตองบอกดวยวา เลขที่สุมมากับคนทาย มากกวาหรือนอย กวากัน 2. ใหนิสิตเขียนโปรแกรมโดยเรียกใชงาน method ในคลาส String ใหมากที่สุด โดยทําการรับ คา String มาหนึ่งชุด แลวทําการ reverse ตัวอักษรกลับพรอมทั้งแสดงเปนตัวอักษรใหญทั้งหมด เชน input : Advance Programming Language output : EGAUGNAL GNIMMARGORP ECNAVDA