แพ็คเกจ
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

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

  • 1.
  • 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