51. นอกจากน;เY ราสามารถท;จะนZาชอต)วแปรท;จะกZาหนดคLามาประกอบในนพจน#ไดU อาทเชLน
x = x+1;
เปyนคZาส)งท;ใหUนพจน#เพมคLาของต)วแปร x ท;ม;อยVLแลUวไปอ;ก 1 แลUวนZาผลล)พธ#ท;ไดUเก5บไวUในต)วแปร x เชLนเดม
อาทเชLน ถUา x ม;คาเปyน 5 จะกลายเปyน 6
L
เราสามารถท;จะประกาศและกZาหนดคLาเรมตUนของต)วแปร ภายในคZาส)งเด;ยวก)นไดU โดยม;รVปแบบคZาส)งด)งน;Y
[modifier] dataType variableName = expression [,variableName = expression];
อาทเชLน
int amount = 123;
float price = 12.0f;
double x = 4.0, y = 2.5;
โปรแกรมท; 2.3 เปyนต)วอยLางท;แสดงการประกาศต)วแปรและการใชUคZาส)งกZาหนดคLาของต)วแปรท;ม;ชนดขUอมVล
ตLางๆ ซxงโปรแกรมน;YจะใหUผลล)พธ#ด)งแสดงในรVปท; 2.3
โปรแกรมท( 2.3 ต)วอยางการใชค(าส)งก(าหนดคา
public class VariableAssignDemo {
public void showDemo() {
int x,y;
boolean b1;
float z = 3.414f; /* The program will not be
compiled successfully if
a character f is missing */
double w;
x = 5;
y = 4;
b1 = (x > y);
w = x * 3.2;
System.out.println("x = " + x + " y = " + y);
System.out.println("b1 = " + b1);
System.out.println("z = " + z + " w = " + w);
}
}
-----------------------------------------------------------------
public class Main {
public static void main(String args[]) {
VariableAssignDemo obj = new VariableAssignDemo();
obj.showDemo();
}
}
40 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
52. รปท 2.3 ผลลพธทได*จากการรนโปรแกรมท 2.3
2.4.2 ค0าคงท
การประกาศคLาคงท;ในภาษาจาวาทZาไดUโดยการใสLค;ย#เวร#ด final หนUาคZาส)งประกาศชอ โดยม;รVปแบบด)งน;Y
[modifier] final dataType CONSTANT_NAME = expression;
โดยท;
• modifier คอค;ย#เวร#ดระบJคJณสมบ)ตตLางๆ ของคLาคงท;เชLน access modifier
• dataType คอชนดขUอมVลของคLาคงท;
• CONSTANT_NAME คอชอของคLาคงท;ซxงโดยท)วไปนยมใชUตวอ)กษรพมพ#ใหญL และแยกคZาดUวยเครองหมาย _
)
• expression คอนพจน#ท;ใหUผลล)พธ#เปyนชนดขUอมVลท;สอดคลUองก)บชนดขUอมVลของคLาคงท;
ต)วอยLางเชLน คZาส)ง
final int MINIMUM = 4;
final double MIN_GPA = 2.00;
เปyนการประกาศคLาคงท; MINIMUM ใหUม;ชนดขUอมVลเปyน int โดยม;คLาเปyน 4 และคLาคงท; MIN_GPA ใหUม;ชนด
ขUอมVลเปyน double โดยม;คาเปyน 2.00
L
คLาคงท;จะกZาหนดคLาไดUเพ;ยงคร)Yงเด;ยว โดยจะตUองม;การกZาหนดคLากLอนท;จะม;การเร;ยกใชUงาน ซxงเมอกZาหนดคLา
แลUวจะไมLสามารถเปล;ยนแปลงคLาไดU
โปรแกรมท; 2.4 เปyนต)วอยLางท;แสดงการประกาศคLาคงท;และการใชUคาคงท; ซxงจะใหUผลล)พธ#ด)งแสดงในรVปท;
L
2.4
ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 41
53. โปรแกรมท( 2.4 ต)วอยางแสดงการประกาศคาคงท%
public class ConstantDemo {
public void showDemo() {
final int MAXIMUM = 10;
final double MIN_GPA;
System.out.println("Maximum is " + MAXIMUM);
MIN_GPA = 2.00;
System.out.println("Minimum GPA is " + MIN_GPA);
// MIN_GPA = 3.00; //illegal
}
}
--------------------------------------------------------
public class Main {
public static void main(String args[]) {
ConstantDemo obj = new ConstantDemo();
obj.showDemo();
}
}
รปท 2.4 ผลลพธทได*จากการรนโปรแกรมท 2.4
2.4.3 ขอบเขตของตวแปรและค0าคงท
ต)วแปรและคLาคงท;ซxงประกาศขxนจะสามารถใชUงานภายในบล5อกคZาส)ง { } ท;ประกาศเทLาน)น โดยภาษาจาวา
Y Y
แบLงต)วแปรและคLาคงท;เปyนสองประเภทคอ
1. ต)วแปรหรอคLาคงท;ท;เปyนคJณล)กษณะของอ5อบเจกต# หรอคJณล)กษณะของคลาส
2. ต)วแปรหรอคLาคงท;ท;อยVLในบล5อกของเมธอดท;เร;ยกวLาคLาคงท;ภายใน (Local Constant) หรอต)วแปรภายใน
(Local Variable)
42 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
54. ต)วแปรหรอคLาคงท; ท;เปyนคJณล)กษณะของอ5อบเจกต#หรอคJณล)กษณะของคลาส คอ ต)วแปรหรอคงท;ท;ประกาศ
ภายในบล5อกของคลาส ซxงอยVLนอกเมธอดของคลาส ต)วแปรหรอคLาคงท;ประเภทน;จะม;ขอบเขตใชUงานอยVLภายในคลาส
Y
โดยท;ทJกๆ เมธอดในคลาสสามารถเร;ยกใชUไดU สZาหร)บต)วแปรประเภทน;YจะถVกกZาหนดคLาเรมตUนใหUโดยอ)ตโนม)ตด)ง
ตารางท; 2.5
ตารางท 2.5 คLาเรมตUนท;ถVกกZาหนดใหUอ)ตโนม)ต
ชน,ดขอมล ค0าเร,มตน
boolean false
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0
char ‘u0000’
คลาส null
สZาหร)บคLาคงท;หรอต)วแปรท;อยVLภายในบล5อกของเมธอด จะม;ขอบเขตการใชUงานอยVLภายในบล5อกเทLาน)น
Y
โปรแกรมท; 2.5 แสดงต)วอยLางต)วแปรท;เปyนคJณล)กษณะของอ5อบเจกต#และต)วแปรท;เปyนต)วแปรภายใน โดยโปรแกรมน;Y
ม;ต)วแปร i ท;เปyนคJณล)กษณะของอ5อบเจกต# สLวนต)วแปร j และ k ในเมธอด method1()เปyนต)วแปรภายใน และ
ต)วแปร j ในเมธอด method2() ก5เปyนต)วแปรภายในอ;กต)วหนxง เราไมLสามารถท;จะเร;ยกใชUต)วแปร k นอกเมธอด
method1()ไดU นอกจากน;Yต)วแปร j ในเมธอดท)YงสองจะถอวLาเปyนต)วแปรคนละต)วก)น
โปรแกรมท( 2.5 ต)วอยางแสดงขอบเขตของต)วแปร
public class VariableScopeDemo {
public int i; // object variable
public void method1() {
int j = 4; // local variable
int k = 2; // another local variable
}
public void method2() {
int j = 0; // local variable
System.out.println(i); // calling an object variable i
// System.out.println(k); // illegal
}
}
ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 43
55. ต)วแปรท;เปyนคJณล)กษณะของอ5อบเจกต#จะสามารถเก5บ และเปล;ยนแปลงคLาท;เ ก5บไวUในหนLวยความจZาไดU
ตราบใดท;อ5อบเจกต#ย)งถVกอUางองในโปรแกรม ต)วแปรภายในจะเปyนต)วแปรท;กZาหนดในบล5อกของเมธอด ซxงจะม;
ขอบเขตการใชUงานอยVLภายในบล5อกท;กZาหนดขxนเทLาน)น ต)วแปรประเภทน;จะถVกสรUางขxนเมอม;การเร;ยกใชUงานเมธอดท;
Y Y Y Y
ต)วแปรประกาศอยVL และจะถVกลบทYงเมอสYนสJดการทZางานของเมธอด ด)งน)นในบางคร)Yงจะเร;ยกต)วแปรประเภทน;Yวา
Y L
ต)วแปรช)วคราว (temporary variable) ต)วแปรท;ประกาศอยVLใน argument ของเมธอด ก5จ)ดอยVLในต)วแปรประเภทน;Y
เชLนก)น
โปรแกรมท; 2.6 แสดงต)วอยLางของการประกาศและใชUงานต)วแปรภายในและต)วแปรของอ5อบเจกต# คลาส
ScopeExample จะม;ต)วแปรของอ5อบเจกต# i ท;ถVกสรUางขxนเมอม;การสรUางอ5อบเจกต#ของคลาสและจะเก5บอยVLใน
Y
Heap Memory ด)งแสดงในรVปท; 2.5 และเมอม;การเร;ยกใชUเมธอด method1() และ method2() ต)วแปรภายใน i
และ j จะถVกสรUางขxนและถVกลบทYงไปเมอออกจากเมธอดด)งแสดงในรVปท; 2.5
Y
โปรแกรมท( 2.6 ต)วอยางแสดงต)วแปรภายในและต)วแปรของอ9อบเจกต
public class ScopeExample {
private int i=1;
public void method1() {
int i=4, j=5;
this.i = i+j;
method2(7);
}
public void method2(int i) {
int j=8;
this.i = i+j;
}
}
----------------------------------------------------------
public class TestScoping {
public static void main(String args[]) {
ScopeExample scope = new ScopeExample();
scope.method1();
}
}
44 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
56. รปท 2.5 การเก-บค%าของตวแปรในหน%วยความจา
ภาษาจาวากZาหนดวLาตUองม;การกZาหนดคLาเรมตUนใหUก)บต)วแปรท;ประกาศไวU กLอนท;จะสามารถเร;ยกใชUงานไดU ใน
กรณ;ของต)วแปรของอ5อบเจกต#หรอต)วแปรของคลาส ภาษาจาวาจะกZาหนดคLาเรมตUนใหUโดยอ)ตโนม)ตด)งตารางท; 2.5 แตL
ในกรณ;ของต)วแปรภายใน จะตUองม;คZาส)งในการกZาหนดคLาเรมตUนเอง มฉะน)นจะเกดขUอผดพลาดในข)Yนตอนคอมไพล#
Y
(Compile Error) ต)วอยLางเชLน คZาส)ง
public void demoMethod(){
int x = (int)(Math.random()*10);
int y,z;
if (x > 5) {
y = 6;
}
z = x+y;
}
จะทZาใหUโปรแกรมไมLสามารถคอมไพล#ผLานไดU เนองจากคLา y ม;โอกาสท;จะไมLถVกกZาหนดคLาเรมตUนกLอนใชUงาน
2.5 ตวดDาเน,นการ
นพจน#ในภาษาจาวาอาจจะประกอบดUวยขUอมVลคLาคงท; ต)วแปร หรอคLาคงท;ตLางๆ โดยจะม;ต)วดZาเนนการตLางๆ
ไวUเพอคZานวณหาผลล)พธ#ท;เปyนชนดขUอมVลตLางๆ ต)วดZาเนนการในภาษาจาวาแบLงออกเปyน 4 ประเภทคอ
1. ต)วดZาเนนการทางคณตศาสตร# (Arithmetic Operator)
2. ต)วดZาเนนการแบบส)มพ)นธ# (Relational Operator)
3. ต)วดZาเนนการทางตรรกศาสตร# (Logical Operator)
4. ต)วดZาเนนการแบบบต (Bitwise Operator)
ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 45
65. 9 ซ>)ยไปขว) (L to R) |
10 ซ>)ยไปขว) (L to R) &&
11 ซ>)ยไปขว) (L to R) ||
12 ขว)ไปซ>)ย (R to L) ?:
=, +=, -=, *=, /=, %=, <<=,
13 ขว)ไปซ>)ย (R to L)
>>=, >>>=, &=, ^=, |=
ต)วอยLางเชLน คZาส)ง
x = 2+3*4-(7+2);
จะคZานวณหาผลล)พธ#ตามลZาด)บด)งน;Y
1. คZานวณหาผลล)พธ#คา 7+2 ทZาใหUไดU
L
x = 2+3*4-9
2. คZานวณหาผลล)พธ#คา 3*4 ทZาใหUไดU
L
x = 2+12-9
3. คZานวณหาผลล)พธ#คา 2+12 ทZาใหUไดU
L
x = 14-9
4. คZานวณหาผลล)พธ#คา 14-5 ทZาใหUไดU
L
x=5
2.6 การแปลงชน,ดขอมล
นพจน#ทางคณตศาสตร#ในภาษาจาวาอาจม;ต)วถVกดZาเนนการทางคณตศาสตร# ท;ม;ชนดขUอมVลเปyนประเภทตLางๆ
ภาษาจาวาไดUกZาหนดใหUผลล)พธ#ของนพจน#เปyนด)งน;Y
• ในกรณ;ท;ต)วถVกดZาเนนการท)Yงสองต)วม;ชนดขUอมVลเปyน double เหมอนก)น จะทZาใหUไดUผลล)พธ#ท;ม;ชนด
ขUอมVลเปyน double
• ในกรณ;ท;ต)วถVกดZาเนนการท)Yงสองต)วม;ชนดขUอมVลเปyน float เหมอนก)น จะทZาใหUไดUผลล)พธ#ท;ม;ชนดขUอมVล
เปyน float
• ในกรณ;ท;ต)วถVกดZาเนนการท)Yงสองม;ชนดขUอมVลท;ตLางก)น ภาษาจาวาจะม;หล)กการแปลงชนดขUอมVล (type
conversion) ด)งน;Y
o ถUาต)วถVกดZาเนนการต)วหนxงม;ชนดขUอมVลเปyน double ต)วถVกดZาเนนการอ;กต)วหนxงจะถVกแปลงใหUม;ชนด
ขUอมVลเปyน double โดยอ)ตโนม)ต
o ถUาต)วถVกดZาเนนการท)YงสองไมLไดUม;ชนดขUอมVลเปyน double แตLม;ต)วถVกดZาเนนการต)วหนxงท;ม;ชนดขUอมVล
54 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
66. เปyน float ต)วถVกดZาเนนการอ;กต)วหนxงจะถVกแปลงใหUม;ชนดขUอมVลเปyน float โดยอ)ตโนม)ต
o ถUาต)วถVกดZาเนนการท)YงสองไมLไดUม;ชนดขUอมVลเปyน double หรอ float แตLม;ต)วถVกดZาเนนการต)วหนxง
ท;ม;ชนดขUอมVลเปyน long ต)วถVกดZาเนนการอ;กต)วหนxงจะถVกแปลงใหUม;ชนดขUอมVลเปyน long โดย
อ)ตโนม)ต
o กรณ;อนๆ ต)วถVกดZาเนนการท)YงสองจะแปลงใหUมชนดขUอมVลเปyน int
;
จากหล)กการขUางตUนจะเห5นไดUวาผลล)พธ#ท;ไดUจากการคZานวณนพจน#คณตศาสตร# จะม;ชนดขUอมVลเปyน
L
int เปyนอยLางนUอย ด)งน)นคZาส)งตLอไปน;Y
Y
byte b1, b2, b3;
b1 = 2;
b2 = 4;
b3 = b1+b2; // illegal
จxงเปyนคZาส)งท;ไมLถVกตUอง เนองจาก b1+b2 จะใหUคLาผลล)พธ#ท;ม;ชนดขUอมVลเปyน int ซxงไมLสามารถ
กZาหนดคLาใหUก)บต)วแปรท;ม;ชนดขUอมVลเปyน byte ไดU
2.6.1 การแปลงขอมลในคDาสงกDาหนดค0า
ภาษาจาวากZาหนดใหUคZาส)งกZาหนดคLาจะตUองม;ชนดขUอมVลของต)วแปรทางดUานซUายและชนดขUอมVลของนพจน#ทาง
ดUานขวาสอดคลUองก)น อาทเชLน
int i = 4;
double x = 3.0;
ในกรณ;ท;ต)วแปรและนพจน#ม;ชนดขUอมVลท;แตกตLางก)น คอมไพเลอร#ของภาษาจาวาจะทZาการแปลงชนดขUอมVล
ท)YงสองชนดใหUสอดคลUองก)น โดยการแปลงชนดขUอมVลม;สองรVปแบบคอ
1. การแปลงขUอมVลท;กวUางขxYน (widening conversion) คอการแปลงจากชนดขUอมVลท;ม;ขนาดเล5กกวLาไปเปyน
ชนดขUอมVลท;ม;ขนาดใหญLกวLา
2. การแปลงขUอมVลท;แคบลง (narrowing conversion) คอการแปลงจากชนดขUอมVลท;ม;ขนาดใหญLกวLาไปเปyน
ชนดขUอมVลท;ม;ขนาดเล5กลง ซxงอาจม;ผลใหUเส;ยความละเอ;ยดของขUอมVลบางสLวนไป
ภาษาจาวากZาหนดขนาดของชนดขUอมVลตLางๆ ท;สามารถแปลงขUอมVลใหUกวUางขxYนไดU ด)งแสดงในรVปท; 2.8 ซxงม;
หล)กการด)งน;Y
• ชนดขUอมVลต)วเลขจZานวนเต5มสามารถแปลงใหUเปyนชนดขUอมVลต)วเลขทศนยมไดU
• ชนดขUอมVล float สามารถแปลงใหUเปyนชนดขUอมVล double ไดU
• ชนดขUอมVลต)วเลขจZานวนเต5มม;ขนาดเร;ยงก)นจากนUอยไปมากด)งน;Y
ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 55
67. byte → short → int → long
• ชนดขUอมVล char สามารถแปลงใหUเปyนชนดขUอมVล int ไดU
• ชนดขUอมVล boolean จะไมLม;ความส)มพ)นธ#ก)บชนดขUอมVลแบบพYนฐานอนๆ
รปท 2.8 การแปลงชนดข*อมล
ในคZาส)งกZาหนดคLา ถUาผลล)พธ#ของนพจน#เปyนชนดขUอมVลท;ม;ขนาดเล5กกวLาชนดขUอมVลของต)วแปร ภาษาจาวาจะ
ทZาการแปลงขUอมVลใหUเปyนชนดขUอมVลของต)วแปรด)งกลLาวโดยอ)ตโนม)ตอาทเชLน คZาส)ง
int i = 4;
long l = i;
นพจน# i จะถVกปร)บชนดขUอมVลจาก int ใหUเปyน long โดยอ)ตโนม)ต
หรอคZาส)ง
double x = 3;
นพจน#ท;ม;คาเปyน 3 จะถVกปร)บชนดขUอมVลจาก int ใหUเปyน double โดยอ)ตโนม)ต
L
ในกรณ;ทคZาส)งกZาหนดคLาม;ชนดขUอมVลของต)วแปรท;ม;ขนาดเล5กกวLา ชนดขUอมVลของนพจน# ภาษาจาวาจะไมL
;
สามารถแปลงชนดขUอมVลของนพจน#ใหUเปyนขนาดท;เล5กลงเทLาก)บชนดขUอมVลของต)วแปรโดยอ)ตโนม)ต แตLคอมไพเลอร#
จะแจUงขUอผดพลาดในข)นตอนการคอมไพล# (compile error) ต)วอยLางเชLน คZาส)ง
Y
int amount = 123L;
หรอ
float f = 4.0;
จะไมLสามารถคอมไพล#ผานไดU เนองจากชนดขUอมVลของนพจน#ม;ขนาดใหญLกวLาชนดขUอมVลของต)วแปร
L
โปรแกรมท; 2.9 แสดงต)วอยLางของขUอผดพลาดในการแปลงชนดขUอมVล ซxงจะทZาใหUโปรแกรมน;YไมLสามารถคอมไพล#
ผLานไดU
56 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
68. โปรแกรมท( 2.9 โปรแกรมท%ม%ขอผดพลาดในการแปลงชนดขอม1ล
public class PromotionDemo {
public void showDemo() {
int i;
long l;
float fl = 4.2f;
i = 4;
l = i;
fl = i;
double x = fl;
fl = 4.2; //illegal
}
}
2.6.2 Typecasting
ภาษาจาวาจะสามารถทZาการแปลงชนดขUอมVล ใหUเปyนชนดขUอมVลท;ม;ขนาดเล5กลงไดU โดยใชUวธ;การท;เร;ยกวLา
typecasting ซxงม;รVปแบบด)งน;Y
(targetType) expression
โดยท;
• targetType คอชนดขUอมVลท;ตUองการ
การใชU typecasting จะชLวยทZาใหUโปรแกรมท;มคZาส)งซxงจZาเปyนตUองแปลงชนดขUอมVลใหUม;ขนาดเล5กลงสามารถ
;
คอมไพล#ผานไดU แตLจะทZาใหUขUอมVลบางสLวนสVญหายไปในบางกรณ;
L
ต)วอยLางเชLน คZาส)ง
int amount = (int)3.0;
จะทZาการแปลงนพจน# 3.0 ท;ม;ชนดขUอมVลเปyน double ใหUเปyน 3 ท;ม;ชนดขUอมVลเปyน int
หรอต)วอยLางคZาส)ง
int x;
double y = 1.25;
x = (int)y;
จะทZาการแปลงนพจน# y ท;ม;คา 1.25 ใหUมชนดขUอมVลเปyน int ท;ม;คา 1 แตLจะทZาใหUตวเลขท;เปyนสLวนทศนยม
L ; L )
หายไป
ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 57
69. โปรแกรมท;2.10 แสดงต)วอยLางการใชU typecasting ในการแปลงชนดขUอมVล โดยนพจน# b1+b2 จะใหUผลล)พธ#
ท;ม;ชนดขUอมVลเปyน int จxงตUองแปลงชนดขUอมVลใหUเปyน byte เพอท;จะสามารถกZาหนดคLาใหUก)บต)วแปร b3 ซxงม;ชนด
ขUอมVลเปyน byte ไดU เชLนเด;ยวก)นก)บคLา 3.2 ซxงม;ชนดขUอมVลเปyน double จะถVกแปลงชนดขUอมVลใหUเปyน float
โปรแกรมท( 2.10 การใช typecasting ในการแปลงชนดขอม1ล
public class TypecastingDemo {
public void showDemo() {
byte b1 = 4;
byte b2 = 3;
byte b3;
b3 = (byte) (b1 + b2);
float f1;
f1 = (float) 3.2;
}
}
----------------------------------------------------------------
public class Main {
public static void main(String args[]) {
TypecastingDemo obj = new TypecastingDemo();
obj.showDemo();
}
}
2.7 ชน,ดขอมลแบบอางอ,ง
ต)วแปรหรอคLาคงท;ท;ประกาศเปyนชนดขUอมVลอนๆ ซxงไมLใชLชนดขUอมVลแบบพYนฐาน จะเปyนชนดขUอมVลแบบ
อUางองซxงก5คออ5อบเจกต#ในภาษาจาวา โดยแบLงออกเปyนสองแบบคอ
1. ชนดขUอมVลท;เปyนคลาส
2. ชนดขUอมVลท;เปyนอะเรย#
ต)วอยLางของชนดขUอมVลท;เปyนคลาสคอ ชนดขUอมVล String โดย String ไมLใชLชนดขUอมVลแบบพYนฐาน แตL
เปyนคลาสท;นยามไวUใน Java API อาทเชLน คZาส)ง
String id;
เปyนคZาส)งประกาศต)วแปร id ใหUเปyนอ5อบเจกต#ของคลาส String สZาหร)บต)วอยLางของชนดขUอมVลท;เปyน
อะเรย#จะถVกกลLาวถxงในบทท; 8
58 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
70. ชนดขUอมVลแบบอUางองจะม;วธ;การเก5บขUอมVลในหนLวยความจZาท;แตกตLางจาก การเก5บขUอมVลของชนดขUอมVลแบบ
พYนฐาน ท)Yงน;ขUอมVลท;เก5บในหนLวยความจZาของชนดขUอมVลแบบอUางองจะเปyนตZาแหนLงอUางองท;เก5บขUอมVลในหนLวยความ
Y
จZา แตLในกรณ;ของชนดขUอมVลแบบพYนฐาน ขUอมVลท;เก5บในหนLวยความจZาจะเปyนคLาของขUอมVลจรงๆ อาทเชLน คZาส)ง
int x = 7;
String s = new String(“Thana”);
เปyนการประกาศต)วแปรท;ม;ชนดขUอมVลแบบพYนฐาน int ท;ชอ x และใหUเก5บคLาเปyน 7 และเปyนการประกาศ
ต)วแปรชนดขUอมVลแบบอUางอง (ซxงก5คออ5อบเจกต#) s ของคลาส String และใหUเก5บคLาเปyนขUอความวLา Thana ซxง
ต)วแปรท)Yงสองต)วอาจจะม;การเก5บขUอมVลในหนLวยความจZาด)งแสดงในรVปท; 2.9 ซxงคLาท;เก5บในต)วแปร x จะเปyนคLาขUอมVล
ท;เปyนคLา 7 สLวนคLาของต)วแปร s จะเปyนตZาแหนLงอUางองในหนLวยความจZาท;ใชUเก5บขUอความวLา Thana
รปท 2.9 ตวอย%างของการเก-บข*อมลในหน%วยความจา
การประกาศต)วแปร (หรออ5อบเจกต#) ของชนดขUอมVลแบบอUางองจะเปyนเพ;ยงการประกาศชอต)วแปร (หรอ
อ5อบเจกต#) แตLจะไมLม;การจองเนYอท;ในหนLวยความจZาเพอเก5บขUอมVล ในกรณ;ท;ต)วแปรด)งกลLาวเปyนคJณล)กษณะของ
อ5อบเจกต# หรอคJณล)กษณะของคลาส ภาษาจาวาจะกZาหนดตZาแหนLงอUางองเรมตUนใหUม;คาเปyน null โดยอ)ตโนม)ต ซxง
L
เนYอท;ในหนLวยความจZาเพอเก5บขUอมVลตLางๆ ของต)วแปรชนดขUอมVลแบบอUางองจะถVกสรUางขxYน เมอม;การเร;ยกใชUคZาส)ง
new อาทเชLน คZาส)ง
Date d;
เปyนคZาส)งในการประกาศต)วแปร (หรออ5อบเจกต#) d ใหUเปyนคลาสชนด Date ท;กZาหนดไวUใน Java API และ
จะไดUคLาในหนLวยความจZาด)งแสดงในรVปท; 2.10 (ก)
และคZาส)ง
d = new Date(16, 8, 2002);
จะเปyนคZาส)งในการจองเนYอท;ในหนLวยความจZาเพอเก5บคJณล)กษณะของอ5อบเจกต#ท;ชอ d ท;ม;อยVL 3 ต)ว คอ day,
month และ year ซxงม;ชนดขUอมVลเปyน int ด)งแสดงในรVปท; 2.10 (ข)
ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 59
71. (ก)
(ข)
รปท 2.10 ตวอย%างของการเก-บข*อมลในหน%วยความจา
2.7.1 คลาส String
• String เปyนคลาสท;กZาหนดไวUใน Java API ต)วแปรท;ม;ชนดขUอมVลเปyน String ก5คออ5อบเจกต#ชนดหนxง
ซxง String ม;ขUอแตกตLางจากอ5อบเจกต#ท)วๆ ไปด)งน;Y
• String เปyนอ5อบเจกต#ท;ม;คาคงท;ขUอมVลซxงก5คอขUอความใดๆ ท;อยVLภายในเครองหมาย double quote
L
(“ ”) ต)วอยLางเชLน
“This is a java course”
• String เปyนอ5อบเจกต#ท;สามารถถVกสรUางขxนและกZาหนดคLาไดUโดยไมLจZาเปyนตUองใชUคZาส)ง new ต)วอยLางเชLน
Y
เราสามารถใชUคZาส)ง
String s = “Thana”;
โดยไมLจZาเปyนท;จะตUองใชUคZาส)ง
String s = new String(“Thana”);
• ในกรณ;ท;ไมLใชUคZาส)ง new ภาษาจาวาจะกZาหนดตZาแหนLงอUางองในหนLวยความจZาของขUอความท;ระบJใน
เครอง (“ ”) โดยพจารณาจาก String Pool วLาม;ขอความเดมอยVLหรอไมL หากม;ก5จะใชUตZาแหนLงอUางองท;ซYZา
U
ก)น แตLถาย)งไมLม;ก5จะสรUางขUอความขxYนมาใหมLและกZาหนดตZาแหนLงอUางองของขUอความน)น สLวนกรณ;ท;ใชUคZา
U Y
ส)ง new ภาษาจาวาจะสรUางขUอความใหมLและจองเนYอท;ในหนLวยความจZาเสมอ โปรแกรมท; 2.11 แสดง
60 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
72. ต)วอยLางการสรUางและกZาหนดคLาอ5อบเจกต#ชนด String ท)Yงในกรณ;ท;ใชUและไมLใชUคZาส)ง new อ5อบเจกต#
s1 และ s2 จะม;ขUอมVลในหนLวยความจZาเปyนตZาแหนLงอUางองท;เด;ยวก)น สLวน s3 จะม;ขUอมVลในหนLวยความ
จZาเปyนตZาแหนLงอUางองท;ตLางก)นเนองจากม;การสรUางขUอความขxนมาใหมLด)งแสดงในรVปท; 2.11
Y
โปรแกรมท( 2.11 ต)วอยางการประกาศและสรางอ9อบเจกตชนด String
public class StringDemo {
public void showDemo() {
String s1 = "Thana";
String s2 = "Thana";
String s3 = new String("Thana");
}
}
-------------------------------------------------------------
public class Main {
public static void main(String args[]) {
StringDemo obj = new StringDemo();
obj.showDemo();
}
}
รปท 2.11 ตวอย%างการเก-บข*อมลชนด String ในหน%วยความจา
• String เปyนอ5อบเจกต#ท;เปล;ยนคLาไมLไดU (Immutable Object) การกZาหนดคLาใหUก)บอ5อบเจกต#ชนด
String ใหมL เปyนการเปล;ยนตZาแหนLงอUางองในหนLวยความจZาของอ5อบเจกต#ด)งกลLาว แตLจะไมLไดUม;การ
เปล;ยนคLาภายในตZาแหนLงอUางองเดม ต)วอยLางเชLน คZาส)ง
String s1;
s1 = “Thanachart”;
s1 = “Somchai”;
จะม;ผลทZาใหUตZาแหนLงอUางองในหนLวยความจZาของอ5อบเจกต# s1 เปล;ยนไป ด)งแสดงในรVปท; 2.12 ซxงเปyน
ผศ. ธนศา เครอไวศยวรรณ พYนฐานโปรแกรมภาษาจาวา 61
73. ต)วอยLางของการเปล;ยนตZาแหนLงอUางองในการเก5บขUอมVลชนด String ในหนLวยความจZา
รปท 2.12 ตวอย%างการเปลยนตาแหน%งอ*างองในการเก-บข*อมล
• String เปyนอ5อบเจกต#ท;ม;ต)วดZาเนนการท;ใชUในการเชอมขUอความสองขUอความเขUาดUวยก)น โดยใชU
เครองหมาย + อาทเชLน
String s1 = “Hello”+“ World”;
ต)วดZาเนนการในการเชอมขUอความสามารถใชUเชอมขUอมVลชนด String ก)บต)วถVกดZาเนนการท;เปyนชนดขUอ
มVลอนๆ ท;ไมLใชLชนด String ไดU ซxงภาษาจาวาจะแปลงชนดขUอมVลด)งกลLาวใหUเปyนชนด String โดย
อ)ตโนม)ตอาทเชLน คZาส)ง
String s1 = “This”;
String s2 = s1+ “ is a test ”;
String s3 = s1+4;
จะทZาใหUไดUขUอความของต)วแปร s2 เปyน “This is a test” และ s3 เปyน “This4”
ต)วดZาเนนการเพอเชอมขUอความจะม;ต)วดZาเนนการแบบยLอท;ใชUเครองหมาย += เพอเชอมขUอความ แลUว
กZาหนดคLาในอ5อบเจกต#ของคลาส String โดยใชUชอเดมอาทเชLน คZาส)ง
String s1 = “This”;
s1 += “ is a test”;
เปyนคZาส)งเชอมขUอความของอ5อบเจกต# s1 เดมก)บขUอความท;วา “ is a test” แลUวเก5บลงในอ5อบเจกต# s1 เชLน
L
เดม โดยทZาใหU s1 ม;ขUอความเปyน “This is a test”
2.7.2 คลาส Math
Java API ไดUกZาหนดใหUม;คลาส Math ท;อยVLในแพคเก5จ java.lang ซxงจะม;เมธอดตLางๆ ในการจ)ดการก)บ
ฟwงก#ช)นหรอคZาส)งทางคณตศาสตร#ตLางๆ คลาส Math เปyนคลาสแบบ final และเมธอดทJกเมธอด จะเปyนเมธอดของ
คลาส (ม;ค;ยเ# วร#ด static อยVL ซxงจะกลLาวถxงในบทท; 6) การเร;ยกใชUเมธอดเหลLาน;YทZาไดUโดยไมLจZาเปyนตUองสรUาง
อ5อบเจกต# แตLสามารถเร;ยกผLานชอคลาสไดUโดยตรงอาทเชLน Math.exp(4.0); เปyนการคZานวณหาคLา exponential
62 พYนฐานโปรแกรมภาษาจาวา ผศ. ธนศา เครอไวศยวรรณ
87. รปท 3.7 โฟวชารตของคาสง if แบบซ*อน
โครงสรUางเลอกทZาแบบซUอนย)งม;กรณ;ท;เปyนด)งโฟว#ชาร#ตในรVปท; 3.7 ซxงจะม;ขนตอนการทZางานคอ โปรแกรม
)Y
จะทZาชJดคZาส)งท; 1 ถUานพจน#ตรรกศาสตร#ท; 1 เปyนจรง แตLถาเปyนเท5จจะตรวจสอบผลล)พธ#ของนพจน#ตรรกศาสตร#ท; 2
U
ซxงถUาม;คาเปyนจรง จะทZาชJดคZาส)งท; 2 แตLถUาม;คาเปyนเท5จจะทZาชJดคZาส)งท; 3 ซxงจะม;รVปแบบของคZาส)งด)งน;Y
L L
if (logical expression 1) {
statements 1
} else {
if (logical expression 2) {
statements 2
} else {
statements 3
}
}
ในกรณ;น;Yสามารถท;เข;ยนคZาส)ง if แบบซUอนไดUใหมL ในรVปของ if..else if..else โดยม;รปแบบของ
V
คZาส)งด)งน;Y
76 โครงสรUางควบคJม ผศ. ธนศา เครอไวศยวรรณ
88. if (logical expression 1) {
statements 1
} else if (logical expression 2) {
statements 2
} else {
statements 3
}
ต)วอยLางของการใชUคZาส)ง if..else if..else ม;ด)งน;Y
if (score >= 80) {
System.out.println(‘A’);
} else if(score >= 70) {
System.out.println(‘B’);
} else if(score >= 60) {
System.out.println(‘C’);
} else if(score >= 50) {
System.out.println(‘D’);
} else {
System.out.println(‘F’);
}
ต)วอยLางน;Yจะพมพ#ต)วอ)กษร A ถUาต)วแปร score ม;คLามากกวLาหรอเทLาก)บ 80 พมพ#ต)วอ)กษร B ถUาต)วแปร
score ม;คLาต)YงแตL 70 จนถxง 79 พมพ#ต)วอ)กษร C ถUาต)วแปร score ม;คLาต)YงแตL 60 จนถxง 69 พมพ#ต)วอ)กษร D ถUา
ต)วแปร score ม;คาต)YงแตL 50 จนถxง 59 และพมพ#ต)วอ)กษร F ถUาต)วแปร score ม;คาตZากวLา 50
L L
โปรแกรมท 3.3 การใชUคZาส)ง if..else if..else
import javax.swing.JOptionPane;
public class SampleIfElseIf {
public void showDemo() {
String inputStr = JOptionPane.showInputDialog("Enter value");
int x = Integer.parseInt(inputStr);
if (x == 1) {
JOptionPane.showMessageDialog(null, "Value is one");
} else if (x == 2) {
JOptionPane.showMessageDialog(null, "Value is two");
} else {
JOptionPane.showMessageDialog(null, "Other than 1 and 2 ");
}
}
}
โปรแกรมท; 3.3 แสดงต)วอยLางการใชUคZาส)ง if..else if..else โปรแกรมน;จะอLานคLาท;ป‚อนเขUามาทาง
Y
ไดอะล5อกบล5อก โดยโปรแกรมจะพมพ#ขUอความวLา “Value is one” ถUาคLาท;ป‚อนเขUามาเปyน 1 พมพ#ขUอความวLา
ผศ. ธนศา เครอไวศยวรรณ โครงสรUางควบคJม 77
89. ”Value is two” ถUาคLาท;ป‚อนเขUามาเปyน 2 และพมพ#ขUอความวLา “Other than 1 or 2” ถUาคLาท;ป‚อนเขUามาเปyนคLา
อนๆ
3.2.4 คDาสง switch
คZาส)ง switch เปyนคZาส)งโครงสรUางแบบเลอกทZา โดยม;รVปแบบด)งน;Y
switch (expression) {
case value 1 : statements 1
break;
case value 2 : statements 2
break;
:
case value N : statements N
break;
default : statements N+1
break;
}
โดยท;
• expression คอนพจน#ท;ตUองม;ชนดขUอมVลเปyน char, byte, short หรอ int เทLาน)น
Y
• value 1 .. value N คอขUอมVลคLาคงท;ซxงม;ชนดขUอมVลท;สอดคลUองก)บชนดขUอมVลของ expression
คZาส)ง switch จะตรวจสอบคLาของนพจน#ท;อาจเปyนชนดขUอมVล char, byte, short หรอ int กรณ;ท;คLา
ของนพจน#ม;คาตรงก)บคLาท; 1 โปรแกรมจะทZาชJดคZาส)งท; 1 ถUาม;คาตรงก)บคLาท; 2 ก5จะทZาชJดคZาส)งท; 2 ถUาม;คาตรงก)บคLาท;
L L L
N ก5จะทZาชJดคZาส)งท; N สLวนกรณ;ท;ม;คาไมLตรงก)บคLาใดๆ เลยในคZาส)ง case ก5จะทZาชJดคZาส)งใน default คอชJดคZาส)งท;
L
N+1 ซxงแสดงข)YนตอนการทZางานไดUด)งโฟว#ชาร#ตในรVปท; 3.8
78 โครงสรUางควบคJม ผศ. ธนศา เครอไวศยวรรณ
90. รปท 3.8 โฟวชารตของคาสง switch
ต)วอยLางของการใชUคZาส)ง switch ม;ด)งน;Y
switch (x) {
case 1 : System.out.println(“One”);
break;
case 2 : System.out.println(“Two”);
break;
case 3 : System.out.println(“Three”);
break;
default : System.out.println(“Other”);
}
ต)วอยLางน;จะพมพ#ขUอความตามคLาของ x ต)YงแตL 1 ถxง 3 และจะพมพ#ขUอความวLา other ถUาคLาของ x เปyนคLาอนๆ
Y
คZาส)ง switch ม;ขUอกZาหนดตLางๆ ด)งน;Y
• นพจน#ตUองม;ชนดขUอมVลเปyน char,byte,short หรอ int เทLาน)น Y
• ชนดขUอมVลของนพจน#และคLาท; 1 ถxง N ตUองเปyนชนดขUอมVลเด;ยวก)น
• คZาส)ง break จะหยJดการทZางานภายในบล5อก { } ถUาไมLม;คZาส)ง break โปรแกรมจะทZาคZาส)งถ)ดไป ต)วอยLาง
ผศ. ธนศา เครอไวศยวรรณ โครงสรUางควบคJม 79
91. เชLน
switch (x) {
case 1 : System.out.println(“One”);
case 2 : System.out.println(“Two”);
break;
default : System.out.println(“Other”);
}
จะพมพ#ขUอความ One ตามดUวย Two ในกรณ;ท; x ม;คLาเปyน 1
• เงอนไข default จะม;หรอไมLม;ก5ไดU
โปรแกรมท; 3.4 แสดงต)วอยLางของการใชUคZาส)ง switch ซxงจะไดUผลล)พธ#เปyนขUอความวLา Value is one ถUา
ต)วเลขท;ป‚อนเขUามาม;คLาเปyน 1 เปyนขUอความวLา Value is two ถUาต)วเลขท;ป‚อนเขUามาม;คาเปyน 2 และเปyนขUอความวLา
L
Other than 1 or 2 ถUาต)วเลขท;ป‚อนเขUามาม;คLาอนๆ
โปรแกรมท( 3.4 ต)วอยางการใชค(าส)ง switch
import javax.swing.JOptionPane;
public class SampleSwitch {
public void showDemo() {
String inputStr = JOptionPane.showInputDialog("Enter value");
int x = Integer.parseInt(inputStr);
switch (x) {
case 1: JOptionPane.showMessageDialog(null, "Value is one");
break;
case 2: JOptionPane.showMessageDialog(null, "Value is two");
break;
default: JOptionPane.showMessageDialog(null, "Other than 1 and 2");
}
}
}
3.3 โครงสรางแบบทDาซDา
โครงสรUางแบบทZาซYZา เปyนคZาส)งท;ใชUในการส)งใหUชJดคZาส)งใดๆ ทZาซYZาหลายคร)Yงตามเงอนไขท;ระบJ ซxงชJดคZาส)ง
โครงสรUางแบบทZาซYZาประกอบดUวยคZาส)ง
• คZาส)ง while
• คZาส)ง do..while
• คZาส)ง for
80 โครงสรUางควบคJม ผศ. ธนศา เครอไวศยวรรณ
92. 3.3.1 คDาสง while
คZาส)ง while จะม;รVปแบบด)งน;Y
initial statements
while (logical expression) {
statements
update statements
}
โดยท;
• initial statements คอคZาส)งท;ใชUในการกZาหนดคLาเรมตUน
• logical expression คอนพจน#ตรรกศาสตร#
• update statements คอคZาส)งท;ใชUในการเปล;ยนแปลงคLา
คZาส)ง while จะทZาชJดคZาส)งและคZาส)งเปล;ยนแปลงคLาท;อยVLในบล5อก { } ตราบใดท;นพจน#ตรรกศาสตร#ย)งม;คLา
เปyนจรง คZาส)งท;อยVLในบล5อก { } จะตUองม;คZาส)งในการเปล;ยนแปลงคLา เพอเปล;ยนคLานพจน#ตรรกศาสตร#ใหUม;คาเปyนเท5จ
L
มฉะน)นแลUวโปรแกรมจะทZาคZาส)งท;อยVLในบล5อกแบบไมLม;ท;สYนสJด คZาส)ง while สามารถเข;ยนเปyนโฟว#ชาร#ตไดU ด)ง
Y
แสดงในรVปท; 3.9
รปท 3.9 โฟวชารตของคาสง while
ผศ. ธนศา เครอไวศยวรรณ โครงสรUางควบคJม 81
93. ต)วอยLางของการใชUคZาส)ง while เพอพมพ#ขUอความวLา Hello World สบคร)Yง ม;ด)งน;Y
int count = 1;
while(count <= 10) {
System.out.println(“Hello World”);
count++;
}
ต)วอยLางน;ม;คZาส)ง int count = 1; เปyนคZาส)งกZาหนดคLาเรมตUน โดยม;นพจน#ตรรกศาสตร#คอ count <=
Y
10 ซxงโปรแกรมจะทZาคZาส)งในบล5อก { } ตราบเทLาท;นพจน#ตรรกศาสตร#ม;คาเปyนจรง (กลLาวคอคLาของต)วแปร count
L
นUอยกวLาหรอเทLาก)บ 10) สLวนคZาส)ง count++; เปyนคZาส)งเปล;ยนแปลงคLาของต)วแปร count โดยจะเพมคLาท;ละหนxง
ในแตLละรอบจนกระท)งม;คาเปyน 11 ซxงจะม;ผลทZาใหUนพจน# count <= 10 ม;คLาเปyนเท5จ หากไมLมคZาส)ง count++;
L ;
ในบล5อก { } จะทZาใหUคา count ม;คาเปyน 1 ตลอด และจะทZาใหUนพจน# count <= 10 ม;คาเปyนจรงเสมอ ซxงก5จะ
L L L
ทZาใหUโปรแกรมพมพ#ขUอความ Hello World โดยไมLม;ท;สYนสJด
โปรแกรมท( 3.5 ต)วอยางการใชค(าส)ง while
public class SampleWhile {
public void showDemo() {
int i = 1;
while(i <= 10) {
System.out.print(i+" ");
i++;
}
}
}
โปรแกรมท(& 3.5 แสดงตวอยางการใชค1าส&ง while เพ&อพมพคาตวเลข 1 ถ4ง 10 ซ4&งผลลพธของโปรแกรมเป$นดง
แสดงในร)ปท(& 3.10
รปท 3.10 ผลลพธทได*จากการรนโปรแกรมท 3.5
82 โครงสรUางควบคJม ผศ. ธนศา เครอไวศยวรรณ
94. 3.3.2 คDาสง do..while
คZาส)ง do..while เปyนคZาส)งท;เปyนโครงสรUางแบบทZาซYZาท;ม;การทZางานคลUายก)บคZาส)ง while โดยม;รVปแบบ คZา
ส)งด)งน;Y
initial statements
do {
statements
update statements
} while(logical expression);
โดยม;โฟว#ชาร#ตของการทZางานของคZาส)งน;ด)งแสดงในรVปท; 3.11 ขUอแตกตLางของคZาส)ง while ก)บคZาส)ง
Y
do..while คอคZาส)ง do..while จะทZาคZาส)งในบล5อก { } อยLางนUอยหนxงคร)YงแลUวจxงทZาการตรวจสอบเงอนไขใน
นพจน#ตรรกศาสตร# ขณะท;คZาส)ง while จะทZาการตรวจสอบเงอนไขในนพจน#ตรรกศาสตร#กLอนซxงหากม;คาเปyนจรงถxง
L
จะทZาคZาส)งในบล5อก { }
รปท 3.11 โฟวชารตของคาสง do..while
ต)วอยLางของการใชUคZาส)ง do..while เพอพมพ#ขUอความวLา Hello World สบคร)Yงม;ด)งน;Y
int count = 1;
do {
System.out.println(“Hello World”);
count++;
} while(count <= 10);
ผศ. ธนศา เครอไวศยวรรณ โครงสรUางควบคJม 83
95. โปรแกรมท( 3.6 ต)วอยางการใชค(าส)ง do..while
public class SampleDoWhile {
public void showDemo() {
int i = 1;
do {
System.out.print(i+" ");
i++;
} while (i <= 10);
}
}
โปรแกรมท; 3.6 แสดงต)วอยLางการใชUคZาส)ง do..while เพอพมพ#คาต)วเลข 1 ถxง 10 ซxงจะไดUผลล)พธ#เชLน
L
เด;ยวก)บโปรแกรมท; 3.5
3.3.3 คDาสง for
คZาส)ง for เปyนคZาส)งท;เปyนโครงสรUางแบบทZาซYZา ท;ม;รปแบบของคZาส)งด)งน;Y
V
for(initial statements; expression; update statements) {
statements
}
โดยม;โฟว#ชาร#ตของการทZางานของคZาส)งน;YเชLนเด;ยวก)บโฟว#ชาร#ตชองคZาส)ง while ในรVปท; 3.9 คZาส)ง for จะ
ใชUในกรณ;ท;ทราบจZานวนคร)YงในการทZาซYZาท;แนLนอน สLวนคZาส)ง while หรอ do..while นยมใชUในกรณ;ท;ไมLทราบ
จZานวนคร)YงในการทZาซYZาลLวงหนUา
ต)วอยLางเชLนคZาส)งพมพ#ขUอความ Hello World สบคร)Yง ควรใชUคZาส)ง for มากกวLาใชUคZาส)ง while หรอ
do..while โดยสามารถเข;ยนคZาส)งไดUด)งน;Y
for (int count = 1; count <= 10; count++) {
System.out.println(“Hello World”);
}
ในกรณ;นจะเห5นไดUวาชJดคZาส)งท;ใชUคZาส)ง for จะม;รVปแบบท;กระช)บกวLาเมอเท;ยบก)บกรณ;ของคZาส)ง while
;Y L
หรอ do..while
คZาส)งกZาหนดคLาเรมตUนหรอคZาส)งเปล;ยนแปลงคLาท;อยVLในคZาส)ง for สามารถท;จะม;มากกวLาอยLางละหนxงคZาส)ง
โดยจะใชUเครองหมาย , ในการแยกคZาส)ง อาทเชLน
84 โครงสรUางควบคJม ผศ. ธนศา เครอไวศยวรรณ
96. for (int i = 0, j = 0; i < 4; i++, j += 2) {
System.out.println(i + “ ” + j);
}
เปyนคZาส)งท;จะพมพ#คาของต)วแปร i และ j ท;กZาหนดขxนภายในคZาส)ง for ส;คร)Yง โดยต)วแปร i จะเพมคLาขxYนท;
L Y
ละหนxง และต)วแปร j จะเพมคLาขxYนท;ละสอง
โปรแกรมท( 3.7 ต)วอยางการใชค(าส)ง for
public class SampleFor {
public void showDemo() {
for (int i=1; i<=10; i++) {
System.out.print(i+" ");
}
}
}
โปรแกรมท; 3.7 แสดงต)วอยLางการใชUคZาส)ง for เพอพมพ#ต)วเลข 1 ถxง 10 ซxงจะไดUผลล)พธ#เชLนเด;ยวก)บ
โปรแกรมท; 3.5 และโปรแกรมท; 3.6
ต)วแปรท;ประกาศในคZาส)งกZาหนดคLาของคZาส)ง for จะม;ขอบเขตการใชUงานไดUเฉพาะภายในบล5อก { } ของคZา
ส)ง for เทLาน)น การใชUงานต)วแปรนอกบล5อก { } จะเกด compile error ด)งแสดงในต)วอยLางของโปรแกรมท; 3.8
Y
โปรแกรมท( 3.8 ขอบเขตการใชงานของต)วแปร
public class VariableScope {
public void showDemo() {
for (int i=1; i<10; i++) {
System.out.print(i+" ");
}
System.out.println("i = "+i); //illegal
}
}
เราไมLสามารถใชUคZาส)ง for ในกรณ;ท;ไมLทราบจZานวนคร)งในการทZาซYZาท;แนLนอนต)วอยLางเชLนโปรแกรมท; 3.9
Y
เปyนการสJLมต)วเลขสองต)วท;ม;คLาระหวLาง 1 ถxง 10 โดยใหUทZาการสJLมต)วเลขท)YงสองจนกวLาผลการสJLมของเลขท)Yงสองม;คLา
เทLาก)น เมธอด Math.random() เปyนเมธอดท;ใชUในการสJLมเลขจZานวนทศนยมระหวLาง 0 ถxง 1 และคZาส)ง
ผศ. ธนศา เครอไวศยวรรณ โครงสรUางควบคJม 85
97. i = (int)(Math.random()*10) + 1;
เปyนคZาส)งท;ใชUในการสJLมต)วเลขระหวLาง 1 ถxง 10 แลUวกZาหนดคLาใหUก)บต)วแปร i โปรแกรมน;Yสามารถเข;ยนใหมL
โดยใชUคZาส)ง while ไดU แตLไมLสามารถท;จะเข;ยนโดยใชUคZาส)ง for เนองจากไมLทราบจZานวนคร)Yงท;ตUองการสJLมต)วเลขท;
แนLนอนไดU
โปรแกรมท 3.9 การสJLมต)วเลขสองต)วท;ม;คาระหวLาง 1 ถxง 10
L
public class ShowNotFor {
public void showDemo() {
int i,j;
do {
i = (int)(Math.random()*10)+1;
j = (int)(Math.random()*10)+1;
} while (i != j);
}
}
3.4 โครงสรางแบบซอน (Nested Structure)
คZาส)งโครงสรUางควบคJมสามารถเข;ยนซUอนก)นไดUอาทเชLน ใชUคZาส)ง if แบบซUอน คZาส)ง for แบบซUอน
โครงสรUางแบบซUอนสามารถท;จะม;คZาส)งโครงสรUางควบคJมท;อยVLภายในและภายนอกแตกตLางก)นไดU อาทเชLน คZาส)ง
for (int i = 1; i <= 40; i++) {
if ((i%5) == 0) {
System.out.println(i);
}
}
เปyนคZาส)ง if ท;อยVLภายในคZาส)ง for เพอท;จะพมพ#ต)วเลขระหวLาง 1 ถxง 40 ท;หาร 5 ลงต)วออกมา
ภาษาจาวาอนJญาตใหUเข;ยนคZาส)งโครงสรUางควบคJมซUอนก)นหลายๆ ช)YนไดU คZาส)งโครงสรUางแบบซUอนท;ใชUก)น
ท)วไปแบบหนxงคอคZาส)ง for แบบซUอน ต)วอยLางเชLน คZาส)ง
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 4; j++) {
System.out.println(“i =”+i+“ j =” +j);
}
}
ม;คZาส)ง for ท;อยVLภายนอกท;จะทZาซYZาสามคร)ง โดยกZาหนดใหUต)วแปร i ม;คาเรมตUนเปyน 1 และเพมท;ละหนxง
Y L
สLวนคZาส)ง for ท;อยVLภายในจะทZาซYZาส;คร)Yง ในแตLละรอบของคZาส)ง for ภายนอก โดยกZาหนดใหUต)วแปร j ม;คLาเรมตUน
เปyน 1 และเพมคLาท;ละหนxง ด)งน)นคZาส)งแสดงผล (System.out.println()) จะทZาซYZาท)Yงหมด 12 คร)Yง
Y
86 โครงสรUางควบคJม ผศ. ธนศา เครอไวศยวรรณ
98. โปรแกรมท; 3.10 เปyนต)วอยLางการใชUคZาส)ง for แบบซUอน โดยคZาส)ง for ท;อยVLภายในจะพมพ#เครองหมาย ‘*’
เทLาก)บจZานวนคอล)มน# (5 คร)Yง) และคZาส)ง for ท;อยVLภายนอกจะทZาคZาส)ง for ท;อยVLภายในซYZาเทLาก)บจZานวนแถว (3 คร)ง)
Y
โปรแกรมจะไดUผลล)พธ#ด)งรVปท; 3.12
โปรแกรมท( 3.10 ต)วอยางการใชค(าส)ง for แบบซอน
public class NestedFor {
public void showDemo() {
for (int i=1; i<=3; i++) {
for (int j=1; j<=5; j++) {
System.out.print('*');
}
System.out.println();
}
}
}
รปท 3.12 ผลลพธทได*จากการรนโปรแกรมท 3.10
โปรแกรมท; 3.11 แสดงต)วอยLางโปรแกรมท;ม;คZาส)งโปรแกรมแบบซUอนหลายๆ รVปแบบอยVLภายใน โปรแกรมน;Y
จะสJLมเลขจZานวนเต5มมาสองคLา แลUวจะพมพ#ต)วเลขเฉพาะ (Prime Number) ท;อยVLระหวLางเลขท)Yงสองน)นออกมา ซxงรVป
Y
ท; 3.13 แสดงต)วอยLางผลล)พธ#ท;ไดUจากการร)นโปรแกรมท; 3.11
ผศ. ธนศา เครอไวศยวรรณ โครงสรUางควบคJม 87
99. โปรแกรมท( 3.11 ต)วอยางการใชค(าส)งโครงสรางแบบซอนหลายร1ป
public class SampleNested {
public void showDemo() {
int n1 = (int) (Math.random()*10)+2;
int n2 = (int) (Math.random()*50);
boolean flag = false;
int j = 0;
System.out.println("The prime number between n1+" to "+n2+" are ");
for (int i=n1; i<=n2; i++) {
flag = false;
j = 2;
do {
if ((i % j++) == 0)
flag = true;
} while ((j < i) & (!flag));
if (!flag)
System.out.print(i+" ");
}
}
}
รปท 3.13 ตวอย%างผลลพธทได*จากการรนโปรแกรมท 3.11
3.4.1 คDาสง break, continue และ label
คZาส)ง break และ continue เปyนคZาส)งท;ใชUในโครงสรUางแบบทZาซYZา เพอท;จะควบคJมการทZางานของคZาส)งใน
บล5อก { } โดยคZาส)ง break จะทZาใหUหยJดสYนสJดการทZางานของโครงสรUางแบบทZาซYZา สLวนคZาส)ง continue จะขUาม
การทZางานคZาส)งท;เหลอภายในบล5อก { } โดยไปเรมการทZาซYZาในรอบตLอไปใหมL
ต)วอยLางเชLน คZาส)ง
for (int i = 1; i <= 5; i++) {
if (i == 3)
break;
System.out.println(i);
}
จะพมพ#คLา i ต)YงแตL 1 ถxง 2 ออกมา แลUวจะหยJดการทZางานของคZาส)ง แตLถUาเปล;ยนจากคZาส)ง break ไปเปyน
88 โครงสรUางควบคJม ผศ. ธนศา เครอไวศยวรรณ
100. คZาส)ง continue ด)งน;Y
for (int i = 1; i <= 5; i++) {
if (i == 3)
continue;
System.out.println(i);
}
โปรแกรมจะพมพ#คLา i ต)YงแตL 1 ถxง 5 โดยขUามคLาท; 3 ท)Yงน;YเนองจากเจอคZาส)ง continue
ในกรณ;ของคZาส)งโครงสรUางควบคJมแบบซUอน ถUาคZาส)ง break หรอ continue ปรากฏอยVLในคZาส)งโครงสรUาง
แบบทZาซYZาท;อยVLขางใน คZาส)งโครงสรUางแบบทZาซYZาท;อยVขUางนอกจะย)งทZาซYZาตLอ โปรแกรมท; 3.12 แสดงต)วอยLางของการ
U L
ใชUคZาส)งโครงสรUางควบคJมแบบซUอนท;มคZาส)ง break อยVLในคZาส)งโครงสรUางแบบทZาซYZาท;อยVขUางใน โปรแกรมน;Yจะร)น
; L
คZาส)ง break เมอ j ม;คาเปyน 3 โดยคZาส)งในคZาส)ง for ภายในจะหยJดทZางาน แตLคZาส)ง for ภายนอกจะย)งทZางาน
L
ตLอ โดยจะไดUผลล)พธ#ด)งแสดงในรVปท; 3.14
โปรแกรมท( 3.12 ต)วอยางการใชค(าส)ง break
public class SampleBreak1 {
public void showDemo() {
int i, j, product;
for (i=1; i<=3; i++) {
for (j=1; j<=3; j++) {
product = i*j;
if (j==3) break;
System.out.println(i+" * "+j+" = "+product);
}
}
}
}
รปท 3.14 ผลลพธทได*จากการรนโปรแกรมท 3.12
ผศ. ธนศา เครอไวศยวรรณ โครงสรUางควบคJม 89
101. ในกรณ;ท;ตUองการจะหยJดการทZางานของคZาส)งโครงสรUางควบคJมท;อยVLภายนอก เราจะตUองกZาหนด label ขxนมาY
เตม ด)งต)วอยLางในโปรแกรมท; 3.13 ซxงกZาหนด label ท;ชอ outer และม;คZาส)ง break outer; เพอท;จะทZาใหU
โปรแกรมหยJดการทZางานของคZาส)ง for ภายนอก โดยจะไดUผลล)พธ#ด)งแสดงในรVปท; 3.15
โปรแกรมท( 3.13 ต)วอยางการใชค(าส)ง break และ label
public class SampleBreak2 {
public void showDemo() {
int i, j, product;
outer: for (i=1; i<=3; i++) {
for (j=1; j<=3; j++) {
product = i*j;
if (j==3) break outer;
System.out.println(i+" * "+j+" = "+product);
}
}
System.out.println("Outside nested loops.");
}
}
รปท 3.15 ผลลพธทได*จากการรนโปรแกรมท 3.13
สร%ปเนอหาของบท
• คZาส)งโครงสรUางควบคJม เปyนคZาส)งท;ใชUในการกZาหนดลZาด)บการทZางานของคZาส)งตLางๆ โดยม;สามรVปแบบคอ
โครงสรUางแบบตามลZาด)บ โครงสรUางแบบเลอกทZา และ โครงสรUางแบบทZาซYZา
• คZาส)งท;เปyนคZาส)งของโครงสรUางแบบเลอกทZาคอ คZาส)ง if, if..else หรอ switch
• คZาส)ง if..else แตกตLางจากคZาส)ง if ตรงท; คZาส)ง if..else จะม;การทZาคZาส)งสZาหร)บคLาเท5จถUานพจน#
ตรรกศาสตร#เปyนเท5จ สLวนคZาส)ง if จะไมLม;การทZาคZาส)งใดถUานพจน#ตรรกศาสตร#เปyนเท5จ
90 โครงสรUางควบคJม ผศ. ธนศา เครอไวศยวรรณ
102. • คZาส)ง if หรอ if..else สามารถท;จะซUอนอยVLขางในคZาส)ง if หรอ if..else อนไดU
U
• คZาส)ง switch จะม;ล)กษณะโครงสรUางการทZางานคลUายคลxงก)บคZาส)ง if..else if..else .. แตLชนด
ขUอมVลของต)วแปรท;จะนZามาใชUก)บคZาส)ง switch จะตUองเปyนชนด char, byte, short หรอ int
เทLาน)นY
• คZาส)งท;เปyนคZาส)งของโครงสรUางแบบทZาซYZาคอ คZาส)ง while, do..while หรอ for
• คZาส)ง while แตกตLางจากคZาส)ง do..while ตรงท; คZาส)ง while จะไมLม;การทZาชJดคZาส)งเลยถUานพจน#
ตรรกศาสตร#เปyนเท5จ สLวนคZาส)ง do..while จะม;การทZาชJดคZาส)งหนxงคร)YงถUานพจน#ตรรกศาสตร#เปyนเท5จ
• คZาส)ง for ม;ล)กษณะการทZางานท;เหมอนก)บคZาส)ง while แตLจะม;การรวมคZาส)งกZาหนดคLาเรมตUน นพจน#
ตรรกศาสตร#และคZาส)งเปล;ยนแปลงคLาไวUหล)งคZาส)ง for
• คZาส)ง for จะใชUในกรณ;ท;ทราบจZานวนคร)YงในการทZาซYZาท;แนLนอน สLวนคZาส)ง while หรอ do..while
นยมใชUในกรณ;ท;ไมLทราบจZานวนคร)งในการทZาซYZาลLวงหนUา
Y
• คZาส)งโครงสรUางท)Yงหมดท;กลLาวมาแลUวขUางตUน สามารถนZามาใชUรLวมก)นเปyนล)กษณะแบบซUอนไดU เชLน คZาส)ง
switch อยVLภายในคZาส)ง while หรอคZาส)ง for อยVLภายในคZาส)ง for ซxงเร;ยกโครงสรUางในล)กษณะน;วาYL
โครงสรUางแบบซUอน
• คZาส)ง break จะทZาใหUหยJดสYนสJดการทZางานของโครงสรUางแบบทZาซYZา สLวนคZาส)ง continue จะขUามการ
ทZางานคZาส)งท;เหลอภายในบล5อก { } โดยไปเรมการทZาซYZาในรอบตLอไปใหมL
ผศ. ธนศา เครอไวศยวรรณ โครงสรUางควบคJม 91
128. แสดงอ5อบเจกต# s1 และ s2 ของคลาส Student จากรVปจะเห5นไดUวาส)ญล)กษณ#ลVกศรท;เปyนเสUนปะจะเปyนการระบJวา
L L
อ5อบเจกต# s1 เปyนอ5อบเจกต#ของคลาส Student
รปท 4.12 ไดอะแกรมของอ-อบเจกต s1 และ s2 ของคลาส Student
4.7 ขนตอนการพฒนาโปรแกรม
การพ)ฒนาโปรแกรมคอมพวเตอร# ไมLไดUหมายถxงเพ;ยงแคLการเข;ยนโปรแกรมคZาส)งภาษาคอมพวเตอร#ภาษาใด
ภาษาหนxง แตLจะรวมถxงข)นตอนท)Yงหมดในการพ)ฒนาโปรแกรม ซxงข)นตอนการพ)ฒนาโปรแกรมน;Yเร;ยกวLา ว)ฎจ)กรการ
Y Y
พ)ฒนาโปรแกรม (Software Development Life Cycle เร;ยกยLอวLา SDLC) ซxงจะประกอบไปดUวยข)นตอนตLางๆ 5
Y
ข)Yนตอนคอ
1. ข)นตอนการวเคราะห# (Analysis)
Y
2. ข)นตอนการออกแบบ (Design)
Y
3. ข)นตอนการเข;ยนโปรแกรม (Programming)
Y
4. ข)นตอนการทดสอบ (Testing)
Y
5. ข)นตอนการทZางาน (Operation)
Y
ซxงแตLละข)Yนตอนม)กไมLไดUผลล)พธ#ท;สมบVรณ#ท;จะสามารถทZาข)YนตอนตLอไปไดU โดยไมLตUองกล)บมาทZาข)Yนตอนเดม
อ;ก แตLระหวLางทZางานในแตLละข)YนตอนอาจตUองยUอนกล)บไปทZางานในข)นตอนอนๆ กLอนหนUาน)นด)งแสดงรVปท; 4.13
Y Y
ผศ. ธนศา เครอไวศยวรรณ หล)กการเชงอ5อบเจกต# 117
129. รปท 4.13 ขนตอนการพฒนาโปรแกรม
ข)นตอนการวเคราะห# เปyนการศxกษาความเปyนไปไดU (feasibility study) ของปwญหาท;ตUองการพ)ฒนาโปรแกรม
Y
ท;มพ)ฒนาโปรแกรมจะทZาการวเคราะห#ปwญหาและพจารณาวLาสามารถท;จะพ)ฒนาโปรแกรมคอมพวเตอร#เพอแกUไข
ปwญหาไดUหรอไมL ผลล)พธ#ท;ไดUจากข)นตอนน;คอขUอกZาหนดตามความตUองการ (requirement specification) ซxงจะ
Y Y
อธบายคJณล)กษณะของโปรแกรม โดยขUอกZาหนดน;จะเข;ยนอยVในรVปแบบตLางๆ เพอใหUผVUใชU ผVปฏบ)ตงาน และน)กพ)ฒนา
Y L U
โปรแกรมสามารถเขUาใจไดU และสามารถทดสอบโปรแกรมท;พ)ฒนาขxนไดUวLาถVกตUองและตรงตามความตUองการของผVUใชU
Y
หรอไมL
ข)นตอนการออกแบบ จะเปyนการทZาใหUขUอกZาหนดตามความตUองการเปล;ยนไปอยVLในรVปแบบของรายละเอ;ยด
Y
ของโปรแกรมท;จะตUองพ)ฒนา ซxงในการออกแบบโดยใชUหล)กการเชงอ5อบเจกต#ก5อาจจะไดUไดอะแกรมตLางๆ ในรVปของ
UML เพอท;จะอธบายคลาสและอ5อบเจกต#ตLางๆ ท;สอดคลUองก)บขUอกZาหนดตามความตUองการ
ข)นตอนการเข;ยนโปรแกรม จะเปyนการเข;ยนโปรแกรมโดยใชUภาษาคอมพวเตอร#ภาษาใดภาษาหนxงใหUเปyนไป
Y
ตามโปรแกรมท;ไดUออกแบบไวU ซxงการเลอกใชUภาษาคอมพวเตอร#ควรท;จะตUองสอดคลUองก)บวธ;การท;ไดUออกแบบไวU ใน
กรณ;ท;ขนตอนการออกแบบเปyนการใชUหล)กการเชงอ5อบเจกต#ก5ควรท;จะตUองใชUภาษาคอมพวเตอร#เชงอ5อบเจกต#เชLน
)Y
ภาษาจาวาในการเข;ยนโปรแกรม ข)นตอนน;จะเปyนข)นตอนท;ไมLยากน)กเนองจากเปyนการเข;ยนโปรแกรมตามขUอกZาหนดท;
Y Y Y
ไดUจากการออกแบบ ด)งน)Yนการพ)ฒนาโปรแกรมท;ด;จะตUองม;ขนตอนการออกแบบท;ด;เพอใหUไดUโปรแกรมท;ถVกตUอง
)Y
ข)นตอนการทดสอบ จะเปyนข)นตอนท;จะทดสอบโปรแกรมท;ไดUพ)ฒนาขxน โดยอาจเปyนการทดสอบการทZางาน
Y Y Y
ของโปรแกรมจากขUอมVลท;นZามาทดสอบตLางๆ และตรวจสอบดVวLาโปรแกรมสามารถทZางานไดUถVกตUองตามขUอกZาหนด
ตามความตUองการหรอไมL การทดสอบโปรแกรมเชงอ5อบเจกต#อาจเปyนการทดสอบท;ละยVนต (Unit Testing) หรอการ
118 หล)กการเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
130. ทดสอบโดยรวม (Integration Testing) การทดสอบท;ละยVนตเปyนการทดสอบการทZางานของแตLละคลาส สLวนการ
ทดสอบโดยรวมเปyนการทดสอบการทZางานเมอรวมคลาสตLางๆ เขUาดUวยก)น
ข)นตอนการทZางาน เปyนข)นตอนสJดทUายท;ไดUสLงมอบโปรแกรมใหUก)บผVใชUงานแลUว ซxงโปรแกรมท;สLงมอบก5
Y Y U
เปร;ยบเสมอนสนคUาอนๆ เชLน บUานหรอรถยนต# ท;อาจม;ขUอบกพรLองท;ตUองแกUไขและตUองม;การบZารJงร)กษา ผVUใชUโปรแกรม
อาจพบขUอผดพลาดของโปรแกรมในระหวLางการใชUงาน ซxงขUอผดพลาดเหลLาน;อาจเกดขxนจากข)นตอนการออกแบบ ข)น
Y Y Y Y
ตอนการเข;ยนโปรแกรม หรอแมUกระท)งเกดขxYนในข)นตอนการวเคราะห#โปรแกรม ท;อาจวเคราะห#ความตUองการผดพลาด
Y
ซxงจากขUอผดพลาดเหลLาน;ทZาใหUน)กพ)ฒนาโปรแกรมอาจจะตUองนZาโปรแกรมมาแกUไข ข)นตอนน;Yเปร;ยบเสมอนข)นตอน
Y Y Y
การบZารJงร)กษาโปรแกรม (software maintenance) ซxงจะม;ระยะเวลายาวนานตามระยะเวลาการใชUงานของโปรแกรม
ซxงม)กจะพบวLาข)นตอนน;Yจะม;คาใชUจLายในการพ)ฒนาโปรแกรมมากท;สJดเมอเท;ยบก)บข)Yนตอนอนๆ
Y L
จากท;กลLาวมาขUางตUนแลUววLา ว)ฎจ)กรของการพ)ฒนาโปรแกรมไมLสามารถท;จะทZาแตLละข)นตอนใหUสมบVรณ#
Y
100% ไดU แตLจะตUองม;การยUอนกล)บมาทZาข)นตอนอนๆ เสมอ โดยท)วไปน)กพ)ฒนาโปรแกรมท;ด;จะตUองใหUความสZาค)ญ
Y
ก)บข)Yนตอนการวเคราะห# และข)นตอนการออกแบบใหUมากท;สJด เพราะโปรแกรมท;ม;การออกแบบท;ด;จะชLวยลดความยJLง
Y
ยากในข)นตอนการทZางาน (บZารJงร)กษา) ซxงจะม;ผลทZาใหUตUนทJนในการพ)ฒนาโปรแกรมถVกลง
Y
สร%ปเนอหาของบท
• โปรแกรมเชงอ5อบเจกต#จะม;คZานยามท;สZาค)ญสองคZาคอ อ5อบเจกต#และคลาส
• อ5อบเจกต#คอสงตLางๆ ท;ม;อยVLในช;วตประจZาว)นจะประกอบไปดUวยคJณล)กษณะและ เมธอด
• คลาสเปร;ยบเสมอนพมพ#เข;ยวของอ5อบเจกต# อ5อบเจกต#จะถVกสรUางมาจากคลาส อ5อบเจกต#หลายอ5อบเจกต#
สามารถถVกสรUางจากคลาสหนxงคลาสไดU
• คJณล)กษณะของอ5อบเจกต#คอขUอมVลท;เก5บอยVLในอ5อบเจกต# ซxงจะแบLงออกเปyนต)วแปรและคLาคงท;
• คJณล)กษณะของคลาสเปyนคJณล)กษณะท;ใชUรวมก)นของทJกอ5อบเจกต#
L
• เมธอดคอวธ;การเพอใชUในการจ)ดการก)บคJณล)กษณะของอ5อบเจกต#หรอคJณล)กษณะของคลาส
• ภาษาจาวาม;นยามในการเข;ยนโปรแกรมเชงอ5อบเจกต#เพอประกาศคลาส คJณล)กษณะ เมธอด และอ5อบเจกต#
• โปรแกรมเชงอ5อบเจกต#จะม;คณล)กษณะเดLนอยVLสามประการคอ การหLอหJUม การสบทอด และการม;ไดUหลาย
J
รVปแบบ
• การหLอหJUมคอการท;ใหUคJณล)กษณะถVกหLอหJUมอยVLภายในเมธอด โดยกZาหนดใหUคJณล)กษณะม; access modifier
เปyน private และกZาหนดใหUเมธอดม; ccess modifier เปyน public
ผศ. ธนศา เครอไวศยวรรณ หล)กการเชงอ5อบเจกต# 119
151. รปท 5.14 ตวอยาง Look and Feel คลาสทเป5นส%วนประกอบกราฟ9กในแพคเกจ Swing
5.4.1 คลาส JButton
เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;แสดงเปyนปJšม โดยจะม;ขอความ (text) ปรากฎอยVLบนปJšม ผVUใชU
JButton U
สามารถใชUอJปกรณ#อนพJตเชLนเมาส#หรอค;ย#บอร#ดกดเลอกปJšมไดU JButton เปyนคลาสท;สบทอดมาจากคลาส
JComponent เราสามารถท;จะสรUางอ5อบเจกต#ของคลาส JButton โดยเร;ยกใชU constructor ของคลาส JButton ท;ม;
รVปแบบด)งน;Y
• public JButton()
• public JButton(String text)
• public Jbutton(Icon icon)
• public JButton(String text, Icon icon)
โดยท;
• text คอขUอความท;จะปรากฏอยVLบนปJšม
• Icon คอไอคอนท;ตUองการแสดง
140 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
152. คลาส Button ย)งม;เมธอดอนๆ ท;สZาค)ญในการจ)ดการก)บขUอความด)งน;Y
• public void setText(String text) เปyนเมธอดท;ใชUในการกZาหนดหรอเปล;ยนขUอความของปJšม
• public String getText() เปyนเมธอดท;ใชUในการเร;ยกดVขUอความของปJšม
• public void setMnemonic(char c) หรอ void setMnemonic(int i)
เปyนเมธอดในการกZาหนดค;ย#ท;เปyน shortcut ใหUก)บอ5อบเจกต#ของคลาส JButton
• public void setIcon(Icon c)
เปyนเมธอดในการใสLไอคอน (icon) ลงในอ5อบเจกต#ของคลาส JButton
นอกจากน;เY ราย)งสามารถเร;ยกใชUเมธอดของคลาส JComponent ซxงเปyน superclass ของ JButton ท;ม;เมธอดท;
เพมล)กษณะตLางๆ ใหUก)บอ5อบเจกต#ท;เปyนสLวนประกอบกราฟmก อาทเชLน
• public void setBorder(Border bd) เปyนเมธอดสZาหร)บกZาหนดขอบใหUก)บสLวนประกอบกราฟmก
• public void setToolTipText(String text) เปyนเมธอดสZาหร)บกZาหนดขUอความท;จะแสดงเปyน
tooltip ใหUก)บสLวนประกอบกราฟmก
ต)วอยLางการสรUางอ5อบเจกต#ของคลาส JButton ท;แสดงขUอความ ค;ย#ท;เปyน shortcut และ tooltip สามารถ
กZาหนดไดUตามคZาส)งด)งน;Y
JButton b1 = new JButton("Demo button");
b1.setMnemonic(KeyEvent.VK_D);
b1.setToolTipText("Click this button ");
5.4.2 คลาส JLabel
JLabel เปyนคลาสท;ใชUสรUางอ5อบเจกต#ท;เปyนสLวนประกอบกราฟmกท;ใชUในการแสดงขUอความ โดยท;คลาส
JLabel ม; constructor ท;สZาค)ญด)งน;Y
• public JLabel(String text)
• public JLabel(String text, int align)
• public Jlabel(Icon icon)
• public Jlabel(Icon icon, int align)
• public JLabel(String text, Icon icon)
โดยท;
• text คอขUอความท;ตUองการแสดง
• align คอการกZาหนดการวางแนว(ชดซUาย ขวา หรอตรงกลาง) ของขUอความ
ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 141
153. • Icon คอไอคอนท;ตUองการแสดง
คลาส JLabel ย)งม;เมธอดอนๆในการจ)ดการและกZาหนด Look and Feel ของอ5อบเจกต#เชLนเด;ยวก)บ JButton
ซxงคZาส)งเหลLาน;สามารถหาไดUจาก Java API หรอเร;ยกดVจากคZาส)งในโปรแกรม IDE เชLน NetBeans
Y
โปรแกรมท; 5.6 แสดงต)วอยLางการสรUางอ5อบเจกต#ชนด JLabel ขxนมาสามอ5อบเจกต#โดยแตLละอ5อบเจกต#จะใชU
Y
คZาส)ง constructor ท;แตกตLางก)น และจะม;ไอคอนประกอบขUอความในอ5อบเจกต#ชอ label1 และ label3 โดยไอคอนจะ
สรUางมาจากไฟล#ท;ชอ testImg.jpg ท;เก5บอยVLในไดเร5กทอร;ท;ชอ images ซxงอยVLภายในไดเร5กทอร;เด;ยวก)บไฟล#ท;ชอ
JLabelDemo.class โปรแกรมน;จะทZาการโหลดไฟล#ด)งกลLาวมาไสLในอ5อบเจกต#ท;ชอ icon โดยม;คZาส)งด)งน;Y
Y
URL imageURL = JLabelDemo.class.getResource("images/testImg.jpg");
if (imageURL != null) {
icon = new ImageIcon(imageURL);
}
โปรแกรมน;จะใหUผลล)พธ#ด)งรVปท; 5.15
Y
โปรแกรมท( 5.6 ต)วอยางการสรางอ9อบเจกตชนด JLabel
import java.awt.*;
import java.net.URL;
import javax.swing.*;
public class JLabelDemo {
private JFrame fr;
private JLabel label1, label2, label3;
public void init() {
ImageIcon icon = null;
fr = new JFrame("JLabel Sample");
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
URL imageURL = JLabelDemo.class.getResource("images/testImg.jpg");
if (imageURL != null) {
icon = new ImageIcon(imageURL);
}
fr.setLayout(new GridLayout(3, 1));
//Create the first label.
label1 = new JLabel("Image and Text", icon, JLabel.CENTER);
//Set the position of its text, relative to its icon:
label1.setVerticalTextPosition(JLabel.BOTTOM);
label1.setHorizontalTextPosition(JLabel.CENTER);
142 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
154. //Create the other labels.
label2 = new JLabel("Text-Only Label");
label3 = new JLabel(icon);
//Create tool tips, for the heck of it.
label1.setToolTipText("A label containing both image and text");
label2.setToolTipText("A label containing only text");
label3.setToolTipText("A label containing only an image");
//Add the labels.
fr.add(label1);
fr.add(label2);
fr.add(label3)
fr.pack();
fr.setVisible(true);
}
public static void main(String args[]) {
JLabelDemo obj = new JLabelDemo();
obj.init();
}
}
รปท 5.15 ผลลพธทได*จากการรนโปรแกรมท 5.6
ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 143
155. 5.4.3 คลาส JTextField
JTextFieldคอคลาสท;ใชUในการสรUางอ5อบเจกต#เพอใหUผใชUป‚อนขUอความหนxงบรรท)ด โดยท;คลาส
VU
JTextField ม; constructor ท;สZาค)ญด)งน;Y
• public JTextField()
• public JTextField(int col)
• public JTextField(String text)
• public JTextField(String text, int col)
โดยท;
• text คอขUอความเรมตUนท;ตUองการแสดง
• col คอจZานวนคอล)มน#ท;ตUองการแสดง
คลาส JTextField ม;เมธอดท;สZาค)ญด)งน;Y
• public int getColumns()
• public String getText()
• public boolean isEditable()
• public void select(int selectionStart, int selectionEnd)
• public void selectAll()
• public void setEditable(boolean b)
• public void setText(String t)
• public void setColumn(int column)
เมธอด setText() ใชUในการกZาหนดหรอเปล;ยนขUอความของอ5อบเจกต#ชนด JTextFiled ในกรณ;ท;เรา
ตUองการกZาหนดใหU JTextField สามารถอLานขUอความไดUอยLางเด;ยว เราสามารถทZาไดUโดยเร;ยกใชUเมธอด
setEditable(boolean b) โดยกZาหนดใหU argument ม;คLาเปyน false สLวนเมธอด select()ใชUในการเลอก
ขUอความใน JTextField
โปรแกรมท; 5.7 แสดงต)วอยLางการสรUางเฟรมท;ม;อ5อบเจกต#ของคลาส Label และ TextField แสดงอยVL โป
แกรมน;จะกZาหนดใหUอ5อบเจกต# fr ของคลาส JFrame ม;การจ)ดวางผ)งแบบ FlowLayout ผลล)พธ#ของโปรแกรมน;เY ปyน
Y
ด)งแสดงในรVปท; 5.12
144 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
156. โปรแกรมท 5.7 ต)วอยLางการสรUางอ5อบเจกต# JTextField
import java.awt.*;
import javax.swing.*;
public class JTextFieldDemo {
private JFrame fr;
private JLabel l;
private JTextField tf;
public void init() {
fr = new JFrame("JTextField Demo");
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
l = new JLabel("Name: ");
tf = new JTextField("Numnonda", 15);
fr.setLayout(new FlowLayout());
fr.add(l);
fr.add(tf);
fr.pack();
fr.setVisible(true);
}
public static void main(String args[]) {
JTextFieldDemo obj = new JTextFieldDemo();
obj.init();
}
}
รปท 5.16 ผลลพธทได*จากการรนโปรแกรมท 5.7
5.4.4 คลาส JTextArea
JTextArea เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;สามารถป‚อนและแกUไขขUอความไดU JTextArea จะแตก
ตLางจาก JTextField ตรงท;จะสามารถกZาหนดจZานวนบรรท)ดไดUหลายบรรท)ด โดยท;คลาส JTextArea ม;
constructor ท;สZาค)ญด)งน;Y
• public JTextArea()
• public JTextArea(String Text)
• public JTextArea(String Text, int row, int col)
• public JTextArea(int row, int col)
ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 145
157. โดยท;
• text คอขUอความเรมตUนท;ตUองการแสดง
• row และ col คอจZานวนแถวและคอล)มน#ของ TextArea
• scrollbar เปyนการกZาหนดการม; scrollbar ของ TextArea
คลาส JTextArea จะม;เมธอดท;สZาค)ญด)งน;Y
• public int getColumns()
• public int getRows()
• public String getSelectedText()
• public boolean isEditable()
• public void select(int selectionStart, int selectionEnd)
• public void selectAll()
• public void setEditable(boolean b)
• public void setText(String t)
• public void setColumns(int column)
• public void setRows(int rows)
ท)Yงน;Yเมธอดท;สZาค)ญท;อยVLในคลาส JTextArea จะคลUายก)บเมธอดของคลาส JTextArea แตLจะเพมเมธอดท;
เก;ยวขUองก)บการจ)ดการจZานวนแถวขxนมา อาทเชLน setRow() และ getRow()
Y
โปรแกรมท; 5.8 แสดงต)วอยLางการสรUาง JFrame ท;ม;อ5อบเจกต#ของคลาส JTextArea โดยโปรแกรมน;จะใหU
Y
ผลล)พธ#ด)งแสดงในรVปท; 5.8
โปรแกรมท 5.8 ต)วอยLางการสรUางอ5อบเจกต# JTextArea
import java.awt.*;
import javax.swing.*;
public class JTextAreaDemo {
private JFrame fr;
private JTextArea ta;
public void init() {
fr = new JFrame("JTextArea Demo");
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ta = new JTextArea("Text Area", 5, 30);
JscrollPane jScrollPane = new JScrollPane(ta);
fr.setLayout(new FlowLayout());
fr.add(jScrollPane);
fr.pack();
fr.setVisible(true);
}
public static void main(String args[]) {
JTextAreaDemo obj = new JTextAreaDemo();
obj.init();
}
}
146 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
158. รVปท; 5.17 ผลล)พธ#ท;ไดUจากการร)นโปรแกรมท; 5.8
5.4.5 คลาส JCheckBox และ JRadioButton
JCheckBox เปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;ทZาหนUาท;คลUายปJšม โดยใหUผVUใชUกดชLองท;เปyนสวทซ#เพอ
เลอกหรอไมLเลอกรายการ JCheckBox จะม;ขUอความอยVLขUางๆ เพออธบายความหมายของรายการ JCheckBox ม;
constructor ท;สZาค)ญด)งน;Y
• public JCheckBox(String label)
• public JCheckBox(String label, boolean state)
• public JCheckBox(Icon icon)
• public JCheckBox(Icon icon, boolean state)
• public JCheckBox(String label, Icon icon)
• public JCheckBox(String label, Icon icon, boolean state)
โดยท;
• label คอขUอความท;ตUองการแสดงใน JCheckBox
• Icon คอไอคอนท;ตUองการแสดง โดยท;
• state เปyนต)วกZาหนดสถานะเรมตUนของ JCheckBox กรณ;ท; constructor ไมLไดUกZาหนดสถานะเรมตUนจะ
ถอวLาม;คาเปyน false (ไมLถVกเลอก)
L
คลาส JCheckBox ม;เมธอดท;สZาค)ญด)งน;Y
• public String getLabel()
• public Object[] getSelectedObjects()
• public void setLabel(String label)
• public void setSelected(boolean state)
โปรแกรมท; 5.9 แสดงต)วอยLางการใชU JCheckBox โดยโปรแกรมจะสรUางเฟรมท;ม;อ5อบเจกต#ชนด
JCheckBox เพอใหUผVUใชUเลอกสามอ5อบเจกต#ด)งแสดงในในรVปท; 5.18
ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 147
159. เราสามารถท;จะสรUางต)วเลอกท;เปyนแบบ Radio Button โดยใชU JRadioButton ในกรณ;น;YจะกZาหนดใหU
อ5อบเจกต# JRadioButton หลายต)วอยVในกลJLมเด;ยวก)น โดยอยVLในกลJLมของอ5อบเจกต#ของคลาส ButtonGroup ซxงจะ
L
ตUองใชUเมธอด add()
คลาส ButtonGroup ไมLใชLคลาสท;เปyนสLวนประกอบกราฟmก แตLจะใชUในการสรUางอ5อบเจกต#เพอกZาหนด
กลJLมของ AbstractButton โดยม; constructor ด)งน;Y
• public ButtonGroup()
โปรแกรมท; 5.10 แสดงต)วอยLางของการสรUาง JRadioButton โดยปร)บเปล;ยน JRadioButton ใน
โปรแกรมท; 5.9 ใหUอยVLในกลJLมของอ5อบเจกต#ท;ชอ chg โปรแกรมน;จะม;ผลล)พธ#ท;เปyนสLวนตดตLอก)บผVUใชUด)งรVปท; 5.19
Y
โปรแกรมท( 5.9 ต)วอยางการสรางอ9อบเจกต JCheckBox
import java.awt.FlowLayout;
import javax.swing.*;
public class JCheckBoxDemo {
private JFrame fr;
private JCheckBox c1, c2, c3;
public void init() {
fr = new JFrame("JCheckBox Demo");
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
c1 = new JCheckBox("Visual Basic");
c2 = new JCheckBox("C++", false);
c3 = new JCheckBox("Java", true);
fr.setLayout(new FlowLayout());
fr.add(c1);
fr.add(c2);
fr.add(c3);
fr.pack();
fr.setVisible(true);
}
public static void main(String args[]) {
JCheckBoxDemo obj = new JCheckBoxDemo();
obj.init();
}
}
รปท 5.18 ผลลพธทได*จากการรนโปรแกรมท 5.9
148 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
160. โปรแกรมท( 5.10 ต)วอยางของการสรางอ9อบเจกต JRadioButton
import java.awt.GridLayout;
import javax.swing.*;
public class JRadioButtonDemo {
private JFrame fr;
private JRadioButton c1, c2, c3;
private ButtonGroup chg;
public void init() {
fr = new JFrame("JRadioButton Demo");
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
c1 = new JRadioButton("Visual Basic");
c2 = new JRadioButton("C++", false);
c3 = new JRadioButton("Java", true);
chg = new ButtonGroup();
chg.add(c1);
chg.add(c2);
chg.add(c3);
fr.setLayout(new GridLayout(3,1));
fr.add(c1);
fr.add(c2);
fr.add(c3);
fr.pack();
fr.setVisible(true);
}
public static void main(String args[]) {
JRadioButtonDemo obj = new JRadioButtonDemo();
obj.init();
}
}
รปท 5.19 ผลลพธทได*จากการรนโปรแกรมท 5.10
ผศ. ธนศา เครอไวศยวรรณ การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU 149
161. 5.4.6 คลาส JComboBox
JComboBoxเปyนคลาสท;ใชUในการสรUางอ5อบเจกต#ท;เปyนรายการใหUผใชUสามารถเลอกไดUโดย JComboBox จะ
VU
แสดงรายการปรากฏใหUเห5นเฉพาะรายการท;เลอกเพ;ยงรายการเด;ยว ปกตกLอนท;จะม;การเลอกรายการ JComboBox จะ
แสดงรายการแรกท;ม;อยVL และหากม;การคลกเมาส# อ5อบเจกต# JComboBox จะแสดงรายการท)Yงหมดท;ม;อยVL โดยท;คลาส
JComboBox ม; constructor ท;สZาค)ญด)งน;Y
• public JComboBox()
• public JcomboBox([]Object objs)
คลาส JComboBox ม;เมธอดตLางๆ ท;สZาค)ญด)งน;Y
• public void addItem(Object item)
• public void insertItemAt(Object item, int pos)
• public Object getItem(int index)
• public int getItemCount()
• public Object getSelectedIndex()
• public Object getSelectedItem()
• public void setSelectedIndex(int pos)
• public void setSelectedItem(Object item)
เราสามารถท;จะใสLรายการลงในอ5อบเจกต# JComboBox ไดUโดยใชUเมธอด addItem(Object item) คลาส
JComboBox ย)งม;เมธอด setSelectedIndex(int pos) และ setSelectedItem(Object item) เพอใชUใน
การเลอกใหUอ5อบเจกต# JComboBox แสดงรายการท;ตZาแหนLงหรอขUอความท;ตUองการใหUแสดงไดU สLวนเมธอด
getSelectedIndex() และ getSelectedItem() ใชUในการแสดงตZาแหนLงหรอขUอความท;ถVกเลอก
โปรแกรมท; 5.11 แสดงต)วอยLางเฟรมท;ม;อ5อบเจกต#ชนด JComboBox แสดงอยVL คZาส)ง cb.addItem() ใชUใน
การใสLรายการตLางๆ ลงในอ5อบเจกต# cb สLวนคZาส)ง cb.setSelectedItem (“Thailand”) เปyนการกZาหนดใหU
อ5อบเจกต# cb เลอกแสดงรายการท;ชอ Thailand โปรแกรมน;YจะใหUผลล)พธ#ท;เปyนสLวนตดตLอก)บผVUใชUด)งรVปแสดงในรVป
ท; 5.20
150 การสรUางสLวนตLอประสานกราฟmกก)บผVUใชU ผศ. ธนศา เครอไวศยวรรณ
177. การเร;ยกใชUเมธอดภายในคลาสเด;ยวก)นสามารถทZาไดUโดยไมLจZาเปyนตUองสรUางอ5อบเจกต#ของคลาสขxYนมากLอน
และสามารถเร;ยกเมธอดไดUทJกเมธอด ยกเวUนเมธอดท;ม; modifier เปyน static จะไมLสามารถเร;ยกใชUเมธอดท;ไมLม;
modifier เปyน static (เร;ยกวLา เมธอดแบบ non-static) ไดU ซxงจะกลLาวถxงภายหล)ง โปรแกรมท; 6.2 แสดงต)วอยLาง
การเร;ยกใชUเมธอดภายในคลาสเด;ยวก)น โปรแกรมน;กZาหนดเมธอดในคลาส NumericalClass ขxYนมาใหมLท;ชอ
Y
callMethod() แลUวเร;ยกใชUเมธอด calculate() ภายในเมธอดท;กZาหนดขxนใหมL Y
โปรแกรมท 6.1 การเร;ยกใชUเมธอดจากคลาสท;ตLางก)น
public class NumericalClass {
public void calculate() {
double score = Math.random()*100;
if (score >= 80) {
System.out.println("Grade is A");
} else if (score >= 70) {
System.out.println("Grade is B");
} else if (score >= 60){
System.out.println("Grade is C");
} else if (score >= 50){
System.out.println("Grade is D");
} else {
System.out.println("Grade is F");
}
}
}
โปรแกรมท
--------------------------------------------------------------------------------------------------------------------------------------------------------
6.
public class MyMain {
public static void main(String args[]) {
NumericalClass obj = new NumericalClass();
obj.calculate();
}
}
6.1.2 การส0งผ0าน argument
เมธอดท;กZาหนดขxนในคลาสอาจม; argument ท;ร)บคLาเพอนZาไปใชUในเมธอดอาทเชLน เมธอด setGpa() ใน
Y
คลาส Student ของโปรแกรมท; 6.3 จะม; argument สZาหร)บร)บคLาขUอมVลท;ม;ชนดขUอมVลเปyน double ในกรณ;นการ ;Y
เร;ยกใชUเมธอดจะตUองสLง argument ท;ม;ชนดขUอมVลท;สอดคลUองก)นไปพรUอมก)น ด)งน)นการเร;ยกใชUเมธอด setGpa() จะ
Y
ตUองสLง argument ท;ม;ชนดขUอมVลเปyน double ไปพรUอมก)บชอเมธอด ด)งแสดงในคลาส MyMain2 ในโปรแกรมท; 6.3
(คZาส)ง s1.setGpa(3.0);)
166 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
178. โปรแกรมท 6.2 การเร;ยกใชUเมธอดภายในคลาสเด;ยวก)น
public class NumericalClass {
public void calculate() {
double score = Math.random()*100;
if (score >= 80) {
System.out.println("Grade is A");
} else if (score >= 70) {
System.out.println("Grade is B");
} else if (score >= 60){
System.out.println("Grade is C");
} else if (score >= 50){
System.out.println("Grade is D");
} else {
System.out.println("Grade is F");
}
}
public void callMethod() {
calculate();
}
}
โปรแกรมท 6.3 ต)วอยLางการสLงผLาน argument
public class Student {
String id;
String name;
double gpa;
public void setGpa(double GPA) {
gpa = GPA;
}
public double getGpa() {
return gpa;
}
}
------------------------------------------------------
public class MyMain2 {
public static void main(String args[]) {
Student s1 = new Student();
s1.setGpa(3.0);
}
}
argument ของเมธอดจะม;ชนดขUอมVลเปyนสองแบบตามชนดขUอมVลของต)วแปรด)งน;Y
1.argument ท;ม;ชนดขUอมVลแบบพYนฐาน
2.argument ท;ม;ชนดขUอมVลแบบอUางอง
ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 167
179. ในกรณ;ของ argument ท;ม;ชนดขUอมVลแบบพYนฐาน เราสามารถท;จะสLงคLาคงท;ขUอมVล ต)วแปร หรอนพจน#ใหU
ก)บ argument ไดUอาทเชLน การเร;ยกใชUเมธอด setGpa() น)น argument ท;จะสLงผLานอาจม;รVปแบบเปyน
Y
• คLาคงท;ขUอมVล เชLน
s1.setGpa(3.0);
• ต)วแปร เชLน
double x = 3.0;
s1.setGpa(x);
• นพจน# เชLน
s1.setGpa(3.0+0.05);
สLวนกรณ; argument ท;ม;ชนดขUอมVลแบบอUางอง เราจะตUองสLงอ5อบเจกต#ท;ม;ชนดขUอมVลท;สอดคลUองไปเทLาน)น
Y
ยกเวUนกรณ;ท; argument น)นม;ชนดขUอมVลเปyน String ซxงในกรณ;นจะสามารถสLงขUอมVลคLาคงท;ไดU โปรแกรมท; 6.4
Y ;Y
เปyนต)วอยLางของคลาส StudentV1 ท;ม;คJณล)กษณะ dob ซxงม;ชนดขUอมVลเปyนคลาส MyDate ท;กZาหนดไวUในโปรแกรม
ท; 6.5 เพอเก5บว)น เดอน ป}เกดของอ5อบเจกต#ชนด StudentV1 คลาส StudentV1 ม;เมธอด setDOB()เพอใชUในการ
กZาหนดคLาใหUก)บคJณล)กษณะ dob
โปรแกรมท 6.4 ต)วอยLางการสLงผLาน argument ท;เปyนอ5อบเจกต#
public class StudentV1 {
String id;
String name;
MyDate dob;
public void setDOB(MyDate d) {
dob = d;
}
public MyDate getDOB() {
return dob;
}
}
โปรแกรมท; 6.6 แสดงการเร;ยกใชUเมธอดด)งกลLาวโดยตUองสLงผLานอ5อบเจกต#ของคลาส MyDate ใหUก)บเมธอด
ด)งน;Y
MyDate d1 = new MyDate(16, 12, 1980);
s1.setDOB(d1);
สZาหร)บกรณ;ของโปรแกรมท; 6.6 เนองจากอ5อบเจกต# d1 ท;สรUางขxYนมา จะไมLม;การอUางองภายในโปรแกรมน;อ;ก
Y
168 การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# ผศ. ธนศา เครอไวศยวรรณ
180. ด)งน)นเราสามารถท;จะสรUางอ5อบเจกต#และสLงผLานไปย)ง argument ในคZาส)งเด;ยวก)นไดUด)งน;Y
Y
s1.setDOB(new MyDate (16, 12, 1980));
โปรแกรมท 6.5 คลาส MyDate เพอเก5บคLาว)น เดอน และป}
public class MyDate {
private int day;
private int month;
private int year;
public MyDate(int d, int m, int y) {
day = d;
month = m;
year = y;
}
public void setDay(int d) {
day = d;
}
public void setMonth(int m) {
month = m;
}
public void setYear(int y) {
year = y;
}
public void showDetails() {
System.out.println("Date : " + day + "/" + month + "/" + year);
}
}
โปรแกรมท 6.6 ต)วอยLางการเร;ยกใชUเมธอดท;ม; argument เปyนอ5อบเจกต#
public class TestStudentV1 {
public static void main(String args[]) {
StudentV1 s1 = new StudentV1();
MyDate d1 = new MyDate(16, 12, 1980);
s1.setDOB(d1);
}
}
ผศ. ธนศา เครอไวศยวรรณ การเข;ยนโปรแกรมภาษาจาวาเชงอ5อบเจกต# 169
252. บทท 8 อะเรย.และคอลเล-กชน
เนYอหาในบทน;YเปyนการแนะนZาการใชUอะเรย#ของขUอมVลชนดพYนฐาน และชนดคลาส อธบายการประกาศและ
สรUางอะเรย#หลายมต แนะนZาเมธอดท;เก;ยวขUองก)บอะเรย# อธบายความหมายของคอลเล5กช)น แนะนZาอนเตอร#เฟสและ
คลาสตLางๆ ท;อยVLใน Collection API และการนZาไปใชUงาน
8.1 อะเรย.
อะเรย#ในภาษาจาวา คอต)วแปรท;เปyนชนดขUอมVลแบบอUางองท;สามารถใชUเก5บขUอมVลชนดเด;ยวก)นไดUหลายคLา
ต)วแปรอะเรย#จะเปyนต)วแปรท;ม;ชอเด;ยวก)นแตLจะม;จZานวนสมาชกไดUหลายต)ว โดยตZาแหนLงในหนLวยความจZาท;เ ก5บขUอมVล
เหลLาน;จะอยVLตดก)น ต)วอยLางเชLน หากตUองการกZาหนดต)วแปรใหUม;ชนดขUอมVลเปyน int เพอเก5บขUอมVลไดU 5 คLาโดยต)Yงชอ
Y
ต)วแปรเปyน x1, x2, x3, x4 และ x5 ด)งน;Y
int x1, x2, x3, x4, x5;
ต)วแปรด)งกลLาวจะถอวLาเปyนต)วแปรคนละต)วก)น โดยม;ชอตLางก)นและไมLมความส)มพ)นธ#ซxงก)นและก)น แตLหาก
;
ประกาศใหUต)วแปร x เปyนต)วแปรอะเรย#ท;ม;จZานวนสมาชก 5 ต)ว โดยใชUคZาส)งด)งน;Y
int []x = new int[5];
จะทZาใหUต)วแปรอะเรย# x เปyนต)วแปรท;ม;ชนดขUอมVลเปyน int ซxงม;สมาชก 5 ต)ว โดยม;หมายเลขสมาชกต)YงแตL 0
ถxง 4 และเปyนชนดขUอมVลแบบอUางอง กลLาวคอคLาของ x จะเก5บตZาแหนLงของหนLวยความจZาเพออUางองถxงตZาแหนLงท;เก5บ
ขUอมVลสมาชกของอะเรย#แตLละต)ว ด)งแสดงในรVปท; 8.1
รปท 8.1 การเก-บตาแหน%งอ*างองของตวแปรอะเรย
ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 241
253. ภาษาจาวาแบLงต)วแปรอะเรย#เปyนสองประเภทคอ
1.อะเรย#ของขUอมVลชนดพYนฐาน
2.อะเรย#ของขUอมVลชนดคลาส
อะเรย#ของขUอมVลชนดพYนฐาน คออะเรย#ท;สามารถใชUเก5บขUอมVลท;ม;ชนดขUอมVลแบบพYนฐานชนดใดชนดหนxงไดU
หลายคLา เชLนอะเรย#ของขUอมVลชนด int หรออะเรย#ของขUอมVลชนด boolean เปyนตUน
อะเรย#ของขUอมVลชนดคลาส คออะเรย#ท;สามารถใชUเก5บขUอมVลท;เปyนอ5อบเจกต#ของคลาสใดๆ ไดUหลายอ5อบเจกต#
เชLนอะเรย#ของขUอมVลชนด String เปyนตUน
8.2 อะเรย.ของขอมลชน,ดพนฐาน
ภาษาจาวาสามารถท;จะสรUางอะเรย# เพอใชUเก5บขUอมVลท;ม;ชนดขUอมVลแบบพYนฐานไดU การสรUางต)วแปรอะเรย# จะม;
ข)YนตอนเชLนเด;ยวก)บการสรUางต)วแปรท;เปyนชนดขUอมVลแบบอUางองท)วไปสองข)Yนตอนคอ
1. ข)Yนตอนแรกเปyนการประกาศชอต)วแปร ข)นตอนน;จะเปyนการจองเนYอท;ในหนLวย ความจZาเพอเก5บคLาของ
Y Y
ตZาแหนLงอUางองท;เก5บขUอมVลสมาชกในหนLวยความจZา แตLขนตอนน;Yจะย)งไมLม;การจองเนYอท;ในหนLวยความจZา เพอ
)Y
ใชUเก5บคLาขUอมVลสมาชกของอะเรย#แตLละต)ว ด)งน)นคLาของต)วแปรในข)นตอนน;จะเปyน null
Y Y Y
2. ข)Yนตอนท;สองเปyนการสรUางต)วแปร เพอบอกจZานวนสมาชกของอะเรย# และจองเนYอท;ในหนLวยความจZาสZาหร)บ
เก5บคLาขUอมVลสมาชกของอะเรย#แตLละต)ว โดยใชUคZาส)ง new เชLนเด;ยวก)บการสรUางอ5อบเจกต#ของคลาส ข)นตอนน;Y
Y
จะทZาใหUคLาของต)วแปรเปล;ยนไปเปyนคLาของตZาแหนLงอUางองท;เก5บขUอมVลสมาชกของอะเรย#
8.2.1 การประกาศชอตวแปรอะเรย.ของขอมลชน,ดพนฐาน
การประกาศชอของต)วแปรอะเรย#จะม;รVปแบบคลUายก)บการประกาศชอต)วแปรของชนดขUอมVลแบบพYนฐาน แตL
การประกาศต)วแปรอะเรย#จะตUองม;เครองหมาย [] อยVLดานหนUาหรอดUานหล)งชอต)วแปรด)งน;Y
U
[modifier] dataType []variableName;
หรอ [modifier] dataType variableName[];
ต)วอยLางเชLน คZาส)ง
int x[];
private char []ch;
public double y[];
242 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
254. ตLางก5เปyนการประกาศใหUต)วแปร x, ch และ y เปyนต)วแปรอะเรย# โดยม;ชนดขUอมVลเปyน int,char และ
double ตามลZาด)บ
การประกาศชอต)วแปรย)งเปyนการจองเนYอท;ในหนLวยความจZา เพอเก5บคLาของตZาแหนLงอUางองท;เก5บขUอมVลสมาชก
ในหนLวยความจZา ซxงในข)นตอนน;จะเก5บคLาเปyน null ไวUกLอน เนองจากย)งไมLม;การจองเนYอท;ในหนLวยความจZาเพอเก5บ
Y Y
ขUอมVลสมาชกของอะเรย#
ภาษาจาวาแตกตLางจากภาษาซ;ตรงท;อนJญาตใหUใชUเครองหมาย [] อยVLดานหนUาชอต)วแปรอะเรย#ท;ตUองการ
U
ประกาศไดU สLวนขUอแตกตLางของการใชUเครองหมาย [] ดUานหนUาและดUานหล)งจะเกดขxYน ในกรณ;ท;ตUองการประกาศต)ว
แปรหลายๆ ต)ว ต)วอยLางเชLน คZาส)ง
int []x,y;
จะเปyนการประกาศใหUต)วแปร x และ y เปyนต)วแปรอะเรย#ชนดขUอมVล int ท)YงคVLแตLคZาส)ง
int x[],y;
จะเปyนการประกาศใหUต)วแปร x เปyนต)วแปรอะเรย#ท;ม;ชนดขUอมVลเปyน int สLวนต)วแปร y เปyนต)วแปรปกตท;
ไมLใชLต)วแปรอะเรย#โดยม;ชนดขUอมVลเปyน int
8.2.2 การสรางตวแปรอะเรย.ของขอมลชน,ดพนฐาน
การประกาศชอต)วแปรอะเรย#จะไมLม;การจองเนYอท;ในหนLวยความจZา เพอเก5บขUอมVลสมาชกของอะเรย# เนYอท;ใน
หนLวยความจZาด)งกลLาวจะถVกจองขxYนเมอม;การใชUคZาส)ง new ซxงม;รVปแบบคZาส)งด)งน;Y
variableName = new dataType[size];
โดยท; size คอจZานวนสมาชกของอะเรย#ท;ตUองการ
คZาส)งน;เY ปyนการระบJจZานวนสมาชกของต)วแปรอะเรย#และเปyนการจองเนYอท;ในหนLวย ความจZาสZาหร)บสมาชก
ของอะเรย#แตLละต)ว นอกจากน;Yย)งจะทZาใหUคLาในหนLวยความจZาท;เก5บตZาแหนLงอUางองของต)วแปรน)Yนเปล;ยนคLาจาก null
ไปเปyนตZาแหนLงท;เก5บขUอมVลด)งแสดงในรVปท; 8.2 ต)วอยLางเชLน คZาส)ง
x = new int[5];
ch = new char[4];
y = new double[6];
ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 243
255. เปyนคZาส)งสรUางต)วแปรอะเรย# x, ch และ y ใหUมชนดขUอมVลเปyน int,
; char และ double และม;จZานวน
สมาชกของอะเรย#เทLาก)บ 5, 4 และ 6 ตามลZาด)บ
รปท 8.2 การเก-บตาแหน%งอ*างองของตวแปรอะเรย
ในการสรUางต)วแปรอะเรย# dataType ท;อยVLในคZาส)ง new จะตUองเปyนชนดขUอมVลชนดเด;ยวก)นก)บชนดขUอมVลของ
ต)วแปรอะเรย# ด)งน)นคZาส)ง
Y
int []x;
x = new double[4];
จxงเปyนคZาส)งในการสรUางต)วแปรอะเรย#ท;ไมLถVกตUอง เนองจากต)วแปรอะเรย# x ถVกประกาศใหUม;ชนดขUอมVลเปyน
int แตLคZาส)ง new เปyนการมาสรUางอะเรย#ของขUอมVลชนด double
เราสามารถท;จะรวมคZาส)งประกาศชอต)วแปรและคZาส)งการสรUางต)วแปรอะเรย# ไวUในคZาส)งเด;ยวก)นไดU โดยม;
รVปแบบคZาส)งด)งน;Y
dataType []variableName = new dataType[size];
หรอ dataType variableName[] = new dataType[size];
ต)วอยLางเชLน
int []x = new int[5];
244 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
263. โปรแกรมท( 8.4 ต)วอยางอะเรยของขอม1ลชนดคลาส
public class Student {
private String name;
public Student(String n) {
name = n;
}
public String getName() {
return name;
}
}
-----------------------------------------------------------
public class TestClassArrays {
public static void main(String args[]) {
Student []s = {new Student(“Thana”),
new Student(“Somchai”),
new Student(“Somsak”)};
for(int i=0; i<s.length; i++) {
System.out.print(s[i].getName()+" ");
}
}
}
รปท 8.6 ผลลพธทได*จากการรนโปรแกรมท8.4
8.4 อะเรย.หลายม,ต,
ภาษาจาวากZาหนดใหUม;ต)วแปรอะเรย#ท;เปyนหลายมตอาทเชLน การกZาหนดต)วแปรท;ม;ล)กษณะเปyนเมตรกซ#
(matrix) หรอตารางจะตUองใชUต)วแปรอะเรย#ท;เปyนสองมต การประกาศ ต)วแปรอะเรย#ท;ม;ขนาดมากกวLาหนxงมตทZาไดU
โดยการเพมเครองหมาย [ ] ในแตLละมต ด)งน)YนรVปแบบการประกาศต)วแปรอะเรย#สองมตม;ด)งน;Y
[modifier] dataType [][]variableName;
252 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
264. หรอ [modifier] dataType variableName[][];
ต)วอยLางเชLน
int [][]x;
เปyนการประกาศต)วแปรอะเรย#สองมต x ซxงม;ชนดขUอมVลเปyน int
การสรUางต)วแปรอะเรย#หลายมตจะตUองระบJจZานวนสมาชกของอะเรย#ในแตLละมตโดยใชUคZาส)ง new ด)งน)นรVป
Y
แบบการสรUางต)วแปรอะเรย#สองมตเปyนด)งน;Y
variableName = new dataType[row][col];
โดยท;
• row คอจZานวนสมาชกในแตLละแถว
• col คอจZานวนสมาชกในแตLละคอล)มน#
ต)วอยLางเชLน
x = new int[3][4];
เปyนการสรUางต)วแปรอะเรย#สองมต x ซxงม;ขนาด 3 แถว 4 คอล)มน#
การเร;ยกใชUสมาชกของอะเรย#สองมตจะตUองระบJตZาแหนLงของแถวและคอล)มน# โดยม;รVปแบบด)งน;Y
variableName[row_number][col_number]
โดยท;
• row_number คอหมายเลขแถวของสมาชกของอะเรย#สองมต
• col_number คอหมายเลขคอล)มน#ของสมาชกของอะเรย#สองมต
ต)วอยLางเชLน
x[2][3]
หมายถxงสมาชกของอะเรย# x ตZาแหนLงแถวท; 2 คอล)มน#ท; 3 เปyนตUน
ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 253
265. 8.4.1 การเขยนโปรแกรมเพอจดการกบเมตร,กซ.
โปรแกรมทางดUานคณตศาสตร#ท;เก;ยวขUองก)บการจ)ดการเมตรกซ# จะตUองใชUต)วแปร อะเรย#ขนาดสองมต
โปรแกรมท; 8.5 เปyนต)วอยLางแสดงการบวกและคVณเมตรกซ#สองเมตรกซ#โดยการบวกเมตรกซ#สองเมตรกซ#น)Yนเมตรกซ#
ท)YงสองจะตUองม;ขนาดเทLาก)น ผลล)พธ#ท;ไดUจะเปyนการรวมสมาชกแตLละต)วของเมตรกซ#เขUาดUวยก)น อาทเชLน
a 11 a 12 a 13 a 14 a 15 b 11 b 12 b 13 b 14 b 15
a b
21 a 22 a 23 a 24 a 25 21 b 22 b 23 b 24 b 25
a 31 a 32 a 33 a 34 a 35 + b 31 b 32 b 33 b 34 b 35 =
a 41 a 42 a 43 a 44 a 45 b 41 b 42 b 43 b 44 b 45
a 51
a 52 a 53 a 54 a 55
b 51
b 52 b 53 b 54 b 55
a 11 + b 11 a 12 + b 12 a 13 + b 13 a 14 + b 14 a 15 + b 15
a
21 + b 21 a 22 + b 22 a 23 + b 23 a 24 + b 24 a 25 + b 25
a 31 + b 31 a 32 + b 32 a 33 + b 33 a 34 + b 34 a 35 + b 35
a 41 + b 41 a 42 + b 42 a 43 + b 43 a 44 + b 44 a 45 + b 45
a 51
+ b 51 a 52 + b 52 a 53 + b 53 a 54 + b 54 a 55 + b 55
สLวนการคVณเมตรกซ# A ก)บเมตรกซ# B น)นจZานวนคอล)มน#ของเมตรกซ# A จะตUองม;ขนาดเทLาก)บจZานวนแถวของ
Y
เมตรกซ# B โดยถUาเมตรกซ# C เปyนผลล)พธ#ท;ไดUจากการคVณ เมตรกซ#ด)งน;Y
c 11 c 12 c 13 c 14 c 15
c
21 c 22 c 23 c 24 c 25
c 31 c 32 c 33 c 34 c 35 =
c 41 c 42 c 43 c 44 c 45
c 51
c 52 c 53 c 54 c 55
a 11 a 12 a 13 a 14 a 15 b 11 b 12 b 13 b 14 b 15
a b
21 a 22 a 23 a 24 a 25 21 b 22 b 23 b 24 b 25
a 31 a 32 a 33 a 34 a 35 x b 31 b 32 b 33 b 34 b 35
a 41 a 42 a 43 a 44 a 45 b 41 b 42 b 43 b 44 b 45
a 51
a 52 a 53 a 54
a 55 b 51
b 52 b 53 b 54 b 55
จะไดUสมาชกของเมตรกซ# C แตLละต)วม;คาด)งน;Y
L
254 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
266. cij = ai1x b1j + ai2x b2j + ai3x b3j + ai4x b4j + ai5x b5j
โปรแกรมท; 8.5 จะม;คZาส)ง int[][]a = new int[5][5]; ท;ใชUในการสรUางต)วแปรอะเรย#สองมต โดยม;
คLาของสมาชกของอะเรย#จากการสJLมต)วเลขจZานวนระหวLาง 0 ถxง 9 จากคZาส)ง
a[i][j] = (int)(Math.random()*10);
โปรแกรมน;จะใชUคZาส)ง for ท;ม;โครงสรUางแบบซUอนอยVLหลายท; ท)Yงน;YเพอชLวยในการจ)ดการประมวลผลขUอมVล
Y
ของสมาชกต)วแปรอะเรย#คลาส Matrices ม;เมธอดด)งน;Y
• addMatrices(int[][] m1, int[][] m2) ใชUเพอคZานวณหาผลล)พธ#ท;ไดUจากการบวกเมตรกซ# โดย
ร)บ argument เขUามาเปyนต)วแปรอะเรย#สองมต 2 ต)ว
• mulMatrices(int[][] m1, int[][] m2) ใชUเพอคZานวณหาผลล)พธ#ท;ไดUจากการคVณเมตรกซ# โดย
ร)บ argument เขUามาเปyนต)วแปรอะเรย#สองมต 2 ต)ว
• printMatrix(int[][] m) ใชUเพอแสดงคLาสมาชกแตLละต)วของเมตรกซ#ท;ร)บเขUามาเปyน argument
ต)วอยLางผลล)พธ#ท;ไดUจากโปรแกรมน;Yเปyนด)งแสดงในรVปท; 8.7
โปรแกรมท( 8.5 ต)วอยางการค(านวณเมตรกซ
public class CalMatrices {
public static void main(String args[]) {
int[][] a = new int[5][5];
int[][] b = new int[5][5];
int[][] c = new int[5][5];
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
a[i][j] = (int) (Math.random() * 10);
b[i][j] = (int) (Math.random() * 10);
}
}
Matrices mt = new Matrices();
System.out.println("Matrix A:");
mt.printMatrix(a);
System.out.println("Matrix B:");
mt.printMatrix(b);
c = mt.addMatrices(a, b);
System.out.println("Matrix A+B:");
mt.printMatrix(c);
c = mt.mulMatrices(a, b);
System.out.println("Matrix A*B:");
mt.printMatrix(c);
}
}
ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 255
267. public class Matrices {
int [][]m = new int[5][5];
public int[][] addMatrices(int[][] m1, int[][] m2) {
for (int i=0; i<m1.length; i++) {
for (int j=0; j<m1[i].length; j++) {
m[i][j] = m1[i][j] + m2[i][j];
}
}
return m;
}
public int[][] mulMatrices(int[][] m1, int[][] m2) {
int sum;
for (int i=0; i<m1.length; i++) {
for (int j=0; j<m1[i].length; j++) {
sum = 0;
for (int k = 0;k < m1[i].length; k++) {
sum += m1[i][k] * m2[k][j];
}
m[i][j] = sum;
}
}
return m;
}
public void printMatrix(int[][] m) {
for (int i=0; i<m.length; i++) {
for (int j=0; j<m[i].length; j++) {
System.out.print(m[i][j]+"t");
}
System.out.println();
}
}
}
อนxงคJณล)กษณะ length เมอนZามาใชUก)บต)วแปรอะเรย#สองมตจะใหUคLาด)งน;Y x.length จะไดUคาเทLาก)บจZานวน
L
แถวของต)วแปรอะเรย# สLวน x[i].length จะไดUคาเทLาก)บจZานวนคอล)มน#ในแถวท; i ของต)วแปรอะเรย#
L
256 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
268. รปท 8.7 ตวอย%างผลลพธทได*จากการรนโปรแกรมท 8.5
8.4.2 อะเรย.สองม,ต,ทมจDานวนคอลมน.ต0างกน
ภาษาจาวาอนJญาตใหUม;การสรUางอะเรย#สองมตท;ม;ขนาดของคอล)มน#ในแตLละแถวไมLเทLาก)นไดU โดยจะตUองระบJ
จZานวนแถวโดยใชUคZาส)ง new กLอน แลUวระบJจZานวนคอล)มน#ในแตLละแถว ต)วอยLางเชLนคZาส)ง
int [][]x;
x = new int[3][];
x[0] = new int[4]
x[1] = new int[2];
x[2] = new int[3]
เปyนการสรUางต)วแปรอะเรย# x ซxงม;สมาชกจZานวน 3 แถว โดยท;แถวท;หนxงม; 4 คอล)มน# แถวท;สองม; 2
คอล)มน# และแถวท;สามม; 3 คอล)มน#
ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 257
269. โปรแกรมท; 8.6 แสดงการสรUางต)วแปรอะเรย#สองมตท;แตLละแถวม;จZานวนคอล)มน#ตLางก)น โปรแกรมน;จะไดU
Y
ผลล)พธ#ด)งแสดงในรVปท; 8.8 และรVปท; 8.9 แสดงขUอมVลท;อยVLในสมาชกแตLละต)วของอะเรย#
โปรแกรมท( 8.6 ต)วอยางการสรางอะเรยสองมตท%แตละแถวม%จ(านวนคอล)มนตางก)น
public class TwoDimensionArrays {
public static void main(String args[]) {
int x[][] = new int[3][];
x[0] = new int[4];
x[1] = new int[2];
x[2] = new int[3];
for(int i=0; i<x.length; i++) {
for(int j=0; j<x[i].length; j++) {
x[i][j] = (i+j)*2;
}
}
for(int i=0; i<x.length; i++) {
for(int j=0; j<x[i].length; j++) {
System.out.print(x[i][j]+" ");
}
System.out.println();
}
}
}
รปท 8.8 ผลลพธทได*จากการรนโปรแกรมท 8.6
รปท 8.9 แสดงตวอย%างข*อมลทอย%ในอะเรย ซ4งเป5นผลลพธทได*จากการรนโปรแกรมท 8.6
258 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
270. 8.4.3 เมธอดทเกยวของกบอะเรย.
ภาษาจาวาม;เมธอดหลายเมธอดท;ร)บ argument เปyนอะเรย#ของขUอมVลชนดตLางๆ ต)วอยLางเชLนแพคเก5จ
java.lang ม;คลาสท;ชอ Arrays ซxงม;เมธอดท;เก;ยวขUองก)บอะเรย#ท;สZาค)ญด)งน;Y
• sort() เปyนเมธอดท;ใชUในการเร;ยงคLาขUอมVลสมาชกของอะเรย#จากนUอยไปมาก
• binarySearch() เปyนเมธอดท;ใชUในการคUนหาคLาขUอมVลท;ตUองการจากชJดขUอมVลท)Yงหมดของสมาชกของ
อะเรย# ซxงถVกเร;ยงจากนUอยไปมากหรอมากไปนUอยไวUแลUว
• fill() เปyนเมธอดท;ใชUในการกZาหนดคLาขUอมVลเด;ยวก)นใหUก)บสมาชกท)Yงหมดของอะเรย#
เนองจากเมธอดท)Yงสามเมธอดท;กลLาวมาขUางตUนเปyนเมธอดแบบ static ด)งน)นการเร;ยกใชUงานเมธอดเหลLาน;Yจxง
Y
สามารถเร;ยกโดยใชUชอคลาส Arrays ไดUเลย ไมLจZาเปyนตUองสรUางอ5อบเจกต#ของคลาส Arrays ขxYนมากLอนการเร;ยกใชU
งาน
โปรแกรมท; 8.7 แสดงต)วอยLางการเร;ยกใชUเมธอดของคลาส Arrays ท;กลLาวไวUขางตUน โปรแกรมน;เY ร;ยกใชU
U
เมธอด sort() โดยสLง argument ท;เปyนต)วแปรอะเรย# d ไปเพอเร;ยงคLาขUอมVลของสมาชกของต)วแปรอะเรย# d
จากนUอยไปมาก เมธอด binarySearch() จะใชUในการคUนหาสมาชกของต)วแปรอะเรย# d ท;ม;คLาเทLาก)บ 1.65 สLวน
เมธอด fill() ใชUในการกZาหนดคLาของสมาชกของต)วแปรอะเรย# d ทJกต)วใหUม;คาเปyน 1.0 โปรแกรมน;จะใหU
L Y
ผลล)พธ#ด)งแสดงในรVปท; 8.10
ภาษาจาวาไมLยอมใหUม;การเปล;ยนแปลงขนาดของอะเรย# ด)งน)นการใชUคZาส)ง new เพอประกาศขนาดของต)วแปร
Y
อะเรย#ใหมL จะทZาใหUคาของขUอมVลเดมหายไป ต)วอยLางเชLนคZาส)ง
L
int []x = {4,7,9};
x = new int[4];
จะเปyนคZาส)งในการประกาศต)วแปรอะเรย# x และสรUางอะเรย#พรUอมก)บกZาหนดคLาเรมตUนใหUก)บสมาชกท)Yง 3 ต)ว
ของอะเรย# โดยม;คLาขUอมVลเปyน 4, 7 และ 9 ตามลZาด)บ แตLคZาส)งถ)ดมาจะเปyนการสรUางอะเรย# x ขxนมาใหมLโดยไมLสามารถ
Y
นZาคLาของขUอมVลเดมกล)บมาไดU จxงทZาใหUคาขUอมVลสมาชกของอะเรย#ท)Yง 4 ต)วม;คLาเทLาก)บ 0 ท&(งหมด
L
ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 259
274. ใดคลาสหนxง เมธอดน;จะสLงคLากล)บมาเปyนชนดขUอมVลแบบ boolean โดยจะใหUคาเปyน true ถUา
Y L
สามารถใสLขUอมVลไดU
• boolean remove (Object element)
เปyนเมธอดท;ใชUในการลบสมาชกออกจากคอลเล5กช)น โดยตUองสLงผLาน argument ท;เปyนอ5อบเจกต#
ท;ตUองการลบออก เมธอดน;จะสLงคLากล)บมาเปyนชนดขUอมVลแบบ boolean โดยจะใหUคาเปyน
Y L
true ในกรณ;ท;ลบขUอมVลไดU
• int size()
เปyนเมธอดท;ใชUในการหาจZานวนสมาชกท;ม;อยVLในคอลเล5กช)น
• boolean isEmpty()
เปyนเมธอดท;ใชUในการตรวจวLาคอลเล5กช)นม;สมาชกอยVLหรอไมL โดยจะสLงคLากล)บมาเปyน true ถUา
ไมLม;สมาชกอยVLในคอลเล5กช)น
• boolean contains(Object element)
เปyนเมธอดท;ใชUในการตรวจสอบวLา คอลเล5กช)นม;สมาชกท;ม;คาเปyนอ5อบเจกต#ของ argument ท;สLง
L
ผLานมาหรอไมL
• Iterator iterator()
เปyนเมธอดท;ใชUในการแจกแจงขUอมVลของสมาชกในคอลเล5กช)น
8.5.2 อ,นเตอร.เฟส Set
Set เปyนอนเตอร#เฟสท;สบทอดมาจากอนเตอร#เฟส Collection โดยม;คลาสท;สZาค)ญท; implements
อนเตอร#เฟสน;Yคอคลาส HashSet คลาส HashSet ใชUในการสรUางอ5อบเจกต#ประเภทคอลเล5กช)นซxงจะม;สมาชกของ
ขUอมVลซYZาก)นไมLไดU โปรแกรมท; 8.9 แสดงต)วอยLางการใชUคลาส HashSet โปรแกรมน;YจะตUองม;คZาส)ง import
java.util.*; เพอท;จะเร;ยกใชUคลาสตLางๆ ท;กZาหนดใน Collection API โปรแกรมน;YไดUสรUางอ5อบเจกต# s ซxงเปyน
อ5อบเจกต#ของคลาส HashSet และเร;ยกใชUเมธอด add() ในการใสLขUอมVลลงในอ5อบเจกต# s โดยปกตแลUว argument
ของเมธอด add() จะตUองเปyน อ5อบเจกต#ของคลาสท;ชอ Object แตLโปรแกรมน;YจะสLง argument ท;เปyนอ5อบเจกต#
ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 263
275. ของคลาส String ซxงสามารถทZาไดUเนองจากคลาส String เปyนคลาสท;สบทอดมาจากคลาสท;ชอ Object
โปรแกรมน;YตUองการจะแสดงใหUเห5นวLาเราไมLสามารถท;จะใสLขUอมVลท;ซYZาก)น (ขUอความ “Java”) ลงในอ5อบเจกต#ชนด
HashSet ไดU ซxงโปรแกรมน;จะไดUผลล)พธ#ด)งแสดงในรVปท; 8.13
Y
โปรแกรมท( 8.9 ต)วอยางการใชคลาส HashSet
import java.util.*;
public class SampleSet {
public static void main(String args[]) {
Set s = new HashSet();
s.add("C#");
s.add("Java");
s.add("Pascal");
System.out.println("The size of this set is " + s.size());
System.out.println("The contents are " + s);
System.out.println("Removing C#");
s.remove("C#");
System.out.println("Now this set contains C#: " + s.contains("C#"));
s.add("Java");
System.out.println("Now the size is " + s.size());
System.out.println("The contents are " + s);
}
}
รปท 8.13 ผลลพธทได*จากการรนโปรแกรมท 8.9
8.5.3 อ,นเตอร.เฟส List
List เปyนอนเตอร#เฟสท;สบทอดมาจากอนเตอร#เฟส Collection แตLจะแตกตLางจากอนเตอร#เฟส Set ตรง
ท;จะม;ลZาด)บของสมาชกอยVL (index) และสามารถท;ม;สมาชกซxงม;ขอมVลซxงซYZาก)น ซxงอนเตอร#เฟส List จะเพมเมธอดท;
U
264 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
276. เก;ยวขUองก)บขUอมVลลZาด)บของสมาชก ด)งน;Y
• void add(int index,Object element)
เปyนเมธอดในการใสLสมาชกลงในคอลเล5กช)นท;เปyนอ5อบเจกต#ท;ม;คาเปyน argument ท;สLงผLาน โดยม;
L
ลZาด)บท;เ ปyนเลขจZานวนเต5มใน argument ท;ชอ index
• Object remove(int index)
เปyนเมธอดในการลบสมาชกลZาด)บท;ซxงม;เลขจZานวนเต5มใน argument ท;ชอ index ออกจาก
คอลเล5กช)น
• Object get(int index)
เปyนเมธอดน;YใชUในการเร;ยกขUอมVลของสมาชกลZาด)บท;ม;เลขจZานวนเต5มใน argument ท;ชอ index
• int indexOf(Object element)
เปyนเมธอดน;YใชUในการตรวจสอบวLาอ5อบเจกต#ท;ม;คLาใน argument ท;สLงผLานมาเปyนสมาชกลZาด)บท;
เทLาไรของคอลเล5กช)น
• ListIterator listIterator()
เปyนเมธอดน;YใชUในการแจกแจงขUอมVลของสมาชกในคอลเล5กช)นแบบ List
คลาสสZาค)ญท; implements อนเตอร#เฟส List ซxงระบJไวUใน Collection API คอคลาส LinkedList และ
ArrayList โปรแกรมท; 8.10 แสดงต)วอยLางการใชUคลาส LinkedList โปรแกรมน;Yจะม;คZาส)ง l.get(0)
เปyนการเร;ยกขUอมVลของสมาชกลZาด)บท; 0 ในอ5อบเจกต# l ท;เปyนอ5อบเจกต#ของคลาส LinkedList สLวนคZาส)ง
l.indexOf(“Java”) เปyนคZาส)งเร;ยกดVลZาด)บท;ของสมาชกในอ5อบเจกต# l ซxงม;ขUอมVลเปyนอ5อบเจกต# String ท;ม;
ขUอความใน “Java” โปรแกรมน;แสดงต)วอยLางของขUอแตกตLางระหวLางคลาสประเภท Set และ List ท)Yงน;จะเห5นไดU
Y Y
จากคZาส)ง l.add(“Java”) สามารถท;จะใสLขUอมVลท;ซYZาก)นไดUโดยโปรแกรมจะไดUผลล)พธ#ด)งแสดงในรVปท; 8.14
ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 265
277. โปรแกรมท( 8.10 ต)วอยางการใชคลาส LinkedList
import java.util.*;
public class SampleList {
public static void main(String args[]) {
List l = new LinkedList();
l.add("C#");
l.add("Java");
l.add("Pascal");
System.out.println("The size is "+l.size());
System.out.println("The contents are "+l);
System.out.println("The first one is "+l.get(0));
l.add("Java");
System.out.println("The contents are "+l);
System.out.println("The index of Java is "+
l.indexOf("Java"));
}
}
รปท 8.14 ผลลพธทได*จากการรนโปรแกรมท 8.10
8.5.4 อ,นเตอร.เฟส Map
Map เปyนอนเตอร#เฟสท;สบทอดมาจากอนเตอร#เฟส Collection ซxงสมาชกแตLละต)วของคอลเล5กช)นท;เปyน
Map จะม;ขUอมVลอยVLสองสLวนคอ สLวนท;เปyนค;ย#และสLวนท;เปyนขUอมVลซxงเปyนอ5อบเจกต#ของคลาสใดๆ ค;ย#จะทZาหนUาท;ชวย
L
ในการสบคUนสLวนท;เปyนขUอมVลสมาชกของ Map โดยจะตUองม;คย#ท;ไมLซYZาก)นแตLอาจม;สLวนท;เปyนขUอมVลซYZาก)นไดU
;
อนเตอร#เฟส Map จะม;เมธอดตLางๆ ท;เพมขxYนมาเพอชLวยสน)บสนJนการทZางานของค;ย#ด)งน;Y
266 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
278. • Object put(Object key, Object value)
เปyนเมธอดท;ใชUในการใสLสมาชกลงในคอลเล5กช)น โดยตUองใสLอ5อบเจกต#ท)YงสLวนท;เปyนค;ย#และสLวนท;
เปyนขUอมVลตาม argument ท;ชอ key และ value ตามลZาด)บ
• Object remove(Object key)
เปyนเมธอดท;ใชUในการลบสมาชกออกจากคอลเล5กช)น โดยสมาชกท;ถVกลบจะม;คาของค;ย#เปyน
L
อ5อบเจกต#ท;ม;คLาตาม argument ท;ชอ key
• Object get(Object key)
เปyนเมธอดท;ใชUในการเร;ยกดVขUอมVลของสมาชกในคอลเล5กช)นท;ม;คาของค;ย#เปyนคLาของอ5อบเจกต#ท;
L
ชอ key ท;ผานมาย)ง argument
L
• Set entrySet()
เปyนเมธอดท;ใชUเร;ยกดVขUอมVลของสมาชกท)Yงหมดในคอลเล5กช)น
• Set keySet()
เปyนเมธอดท;ใชUเร;ยกดVค;ยของสมาชกท)Yงหมดในคอลเล5กช)น
#
• int size()
เปyนเมธอดท;ใชUในการหาจZานวนสมาชกของคอลเล5กช)น
คลาสท;สZาค)ญท; implements อนเตอร#เฟส Map คอคลาส HashMap โปรแกรมท; 8.11 แสดงต)วอยLางการ
สรUางอ5อบเจกต#ของคลาสน;แลUวเร;ยกใชUเมธอด put() ในการใสLสมาชกลงในคอลเล5กช)น ท)Yงน;Yเมธอดน;จะตUองสLงผLาน
Y Y
argument สองต)ว ในท;น;Yท)Yงสองต)วจะสLงผLานอ5อบเจกต#ชนด String เมธอด remove() ในท;นจะใชUในการลบ
;Y
สมาชกท;ม;คาของค;ย#เปyน String ท;ม;คLาเปyน “3” โปรแกรมน;YจะใหUผลล)พธ#ด)งแสดงในรVปท; 8.15
L
ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 267
279. โปรแกรมท( 8.11 ต)วอยางการใชคลาส HashMap
import java.util.*;
public class SampleMap {
public static void main(String args[]) {
Map m = new HashMap();
m.put("1","C#");
m.put("2","Java");
m.put("3","Pascal");
System.out.println("Removing Pascal");
m.remove("3");
System.out.println("The size is "+m.size());
System.out.println("The first one is "+
m.get("1"));
m.put("3","Java");
System.out.println("The key of this map are "+
m.keySet());
System.out.println("The contents are "+ m.entrySet());
}
}
รปท 8.15 ผลลพธทได*จากการรนโปรแกรมท 8.11
8.5.5 อ,นเตอร.เฟส Iterator
Iterator เปyนอนเตอร#เฟสท;ใชUในการเร;ยกดVสมาชกของคอลเล5กช)น ท)Yงน;อนเตอร#เฟส Collection จะม;
Y
เมธอด iterator() ซxงจะสLงอ5อบเจกต#ของคลาสประเภท Iterator กล)บคนมา อนเตอร#เฟส Iterator จะม;
เมธอดตLางๆ ท;ใชUในการเร;ยกดVขUอมVลด)งน;Y
• boolean hasNext()
เปyนเมธอดท;จะตรวจสอบวLาย)งม;ขUอมVลอยVLใน Iterator อ;กหรอไมL
268 อะเรย#และคอลเล5กช)น ผศ. ธนศา เครอไวศยวรรณ
280. • Object next()
เปyนเมธอดท;จะเร;ยกดVคาของอ5อบเจกต#ของสมาชกต)วถ)ดไปของ Iterator โดยจะสLงคLากล)บมา
L
เปyนอ5อบเจกต#ของคลาสท;ชอ Object
• void remove()
เปyนเมธอดท;ใชUในการลบสมาชกตZาแหนLงปwจจJบ)นออกจาก Iterator
โดยท)วไปตZาแหนLงเรมตUนของ Iterator จะช;Yไปท;ตZาแหนLงกLอนสมาชกของ Iterator ต)วแรกและจะใชU
เมธอด next() ในการเร;ยกดVสมาชกต)วตLอๆ ไป โปรแกรมท; 8.12 แสดงต)วอยLางการใชUอนเตอร#เฟส Iterator ใน
การเร;ยกดVขUอมVลของสมาชกของอ5อบเจกต#ชนด ArrayList โปรแกรมน;จะใหUผลล)พธ#ด)งแสดงในรVปท; 8.16
Y
โปรแกรมท( 8.12 ต)วอยางการใชอนเตอรเฟส Iterator
import java.util.*;
public class SampleIterator {
public static void main(String args[]) {
Set scrSet = new HashSet();
scrSet.add("C#");
scrSet.add("Java");
scrSet.add("Pascal");
Iterator it = scrSet.iterator();
Set dstSet = new HashSet();
for(int i=0; i<scrSet.size(); i++) {
if(it.hasNext()) {
dstSet.add(it.next());
}
}
System.out.println(dstSet);
}
}
รปท 8.16 ผลลพธทได*จากการรนโปรแกรมท 8.12
ผศ. ธนศา เครอไวศยวรรณ อะเรย#และคอลเล5กช)น 269