SlideShare a Scribd company logo
1 of 20
Download to read offline
คลาสและออบเจ็ค
Class and Object
วัตถุประสงค
♦ เพื่อใหมีความรูความเขาใจหลักการเขียนโปรแกรมเชิงวัตถุ
♦ เพื่อใหมีความรูความเขาใจหลักการทํางานคลาสและออบเจ็คโดยศึกษาจากภาษาจาวา
♦ เพื่อสามารถสรางและเรียกใชงานวัตถุได
บทที่
5
บทที่ 5 คลาสและออบเจ็ค หนาที่ 122
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
เนื้อหาบทเรียน
♦ การสรางวัตถุจากคลาส(Object Declaration)
♦ การเรียกใชงานวัตถุ
♦ การสงขอมูลดวยคา
♦ การสงขอมูลดวยวัตถุ
♦ คอนสตรัคเตอร(Constructor)
♦ สแตติกแอทริบิวต(Static data)
♦ สแตติกเมธอด(Static method)
บทที่ 5 คลาสและออบเจ็ค หนาที่ 123
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
การสรางวัตถุจากคลาส(Object Declaration)
ออบเจ็คที่สรางขึ้นจากคลาส บางครั้งเรียกวา instance of class รูปแบบในการสราง instance
ประกอบดวย 3 แบบคือ
1. class_name Object_ identifier ;
// ประกาศ instance
Object_ identifier = new class_name([class_parameter]);
// เตรียมพื้นที่บนหนวยความจําสําหรับ instance ที่สราง
เชน ในการออกแบบคลาสตามภาษา UML(Unified Modeling Language) การวิเคราะหและออกแบบ
โปรแกรมดวยวิธีการเชิงวัตถุ แสดงสัญลักษณของคลาสไดดังนี้
คลาส StaticFun ประกอบดวย
class StaticFun{
int id ;
String name;
void setId(int i){ }
int getId() {
return id;
}
}
StaticFun sf1;
// ประกาศ instance ชื่อ sf1
sf= new StaticFun();
//ทําการสรางออบเจ็ค Static Fun
และใหตัวแปร sf1 ที่ประกาศ อางอิงมายังออบเจ็คนี้
StaticFun
id : int
name : String
setId(int)
getId() : int
sf1
StaticFun
id : int
name : String
setId(int)
getId() : int
sf1
บทที่ 5 คลาสและออบเจ็ค หนาที่ 124
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
StaticFun sf2 , sf3 , sf4; // ประกาศ instance ทีละหลายๆ ตัว ชื่อ sf2, sf3 และ sf4
sf2 = new StaticFun() ; sf3 = new StaticFun(); sf4 = new StaticFun();
หากมีการสรางออบเจ็คโดยใชตัวแปรออบเจ็คเดิม เชน
StaticFun sf5;
sf5 = new StaticFun();
sf5 = new StaticFun();
sf2 sf3 sf4
StaticFun
id : int
name : String
setId(int)
getId() : int
sf4StaticFun
id : int
name : String
setId(int)
getId() : int
f4StaticFun
id : int
name : String
setId(int)
getId() : int
sf4
StaticFun
id : int
name : String
setId(int)
getId() : int
sf5
StaticFun
id : int
name : String
setId(int)
getId() : int
sf5
StaticFun
id : int
name : String
setId(int)
getId() : int
พื้นที่สวนนี้จะถูก deallocate โดย
garbage collection จัดการโดย JVM
บทที่ 5 คลาสและออบเจ็ค หนาที่ 125
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
2. ประกาศ instance พรอมเตรียมพื้นที่บนหนวยความจําสําหรับ instance ที่สรางใหม
class name Object_ identifier = new class_name();
เชน StaticFun sf = new StaticFun();
3. สรางออบเจ็คโดยไมประกาศตัวแปรออบเจ็ค เพื่อใชอางอิงออบเจ็คได
new class_name();
เชน new StaticFun();
ในหนึ่งคลาสสามารถสรางออบเจ็คใชงานไดหลายครั้ง ในการใชคียเวิรด new ทุกครั้งจะเปน
การขอใชพื้นที่หนวยความจําใหม และหาก instance ใดไมถูกใชงานในภาษาจาวาจะมี garbage collector
เปนผูจัดการคืนหนวยความจําใหกับระบบ ซึ่งความสามารถนี้ทําใหภาษาจาวาเปนภาษาที่มีคุณสมบัติ
ของการทนทาน (robust) เนื่องจากมีตัวกําจัดขยะ(garbage collection)
การเรียกใชงานแอทริบิวต
แอทริบิวตเปนสมาชิกของคลาส ดังนั้นการที่เราจะทํางานกับแอทริบิวตไดนั้นจึงตองกระทําผาน
ตัวแปรออบเจ็คที่อางอิงอบบเจ็คของคลาสนั้นๆ อยู
รูปแบบ : Object_ identifier.attribut_name
ตัวอยาง sf1.id = 1001;
sf1.name = “Surangkana”;
sf2.id = 1002;
sf2.name = “Somporn” ;
ตัวอยาง โปรแกรมการเรียกใชงานแอทริบิวต โดยบันทึกไฟลชื่อ TestCallAttribute.java
StaticFun
id : int
name : String
setId(int)
getId() : int
sf
StaticFun
id : int
name : String
setId(int)
getId() : int
บทที่ 5 คลาสและออบเจ็ค หนาที่ 126
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
class StaticFun{
int id ;
String name;
void setId(int i){
id = i;
}
int getId() {
return id;
}
}
public class TestCallAttribute{
public static void main(String args[]){
StaticFun sf1 = new StaticFun();
sf1.id = 1001;
sf1.name = “Surangkana”;
System.out.println(“Identification =” + sf1.id);
System.out.println(“Name =” + sf1.name);
}
}
ผลลัพธที่ไดจากการรัน :
Identification = 1001
Name = Surangkana
หมายเหตุ
การที่เราจะกําหนดคาใหกับแอทริบิวตที่อยูในคลาสไดโดยตรงตามรูปแบบนี้นั้น modifier ของ
แอทริบิวตจะตองเปน public , protected หรือ default ในกรณีที่ทุกคลาสอยูในแพ็กเกจเดียวกัน แตหากมี
สวน modifier เปน private นั้นจะตองดําเนินการผานเมธอด เปนไปตามหลักการ information hiding
StaticFun
id = 1001
name =Surangkana
setId(int)
getId() : int
sf1
บทที่ 5 คลาสและออบเจ็ค หนาที่ 127
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
การเรียกใชงานเมธอดภายในคลาส
เมธอดก็เปนสมาชิกของคลาสของคลาสเชนเดียวกับแอทริบิวต ดังนั้นการที่เราจะเรียกใชงานได
นั้นจึงตองกระทําผานตัวแปรออบเจ็คที่อางอิงอบบเจ็คของคลาสนั้นๆ อยู
รูปแบบ : Object_ identifier.method_name(parameter_list);
ตัวอยาง sf1.setId(1001);
name1 = sf1.getName();
sf2.setId(“1002”);
name2 = sf2.getName();
ตัวอยาง โปรแกรมการเรียกใชงานแอทริบิวต โดยบันทึกไฟลชื่อ TestCallMethod.java
class StaticFun{
private int id ;
private String name;
public void setId(int i){
id = i;
}
int getId() {
return id;
}
void run(){
System.out.println(“Print from method run() ”);
}
}
public class TestCallAttribute{
public static void main(String args[]){
StaticFun sf1 = new StaticFun();
Sf1.setId(1001);
System.out.println(“Identification =” + sf1.getId());
System.out.println(sf1.run());
}
}
StaticFun
id = 1001
name
setId(int)
getId() : int
run( )
sf1
บทที่ 5 คลาสและออบเจ็ค หนาที่ 128
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
ผลลัพธที่ไดจากการรัน :
Identification = 1001
Print from method run()
ตัวแปรที่อยูภายในคลาสมี 2 ประเภทคือ
1. instance variable หมายถึง เปนตัวแปรที่ประกาศไวเปน attribute ของ classes และอยูนอก
methods และ constructors ตัวแปรชนิดนี้จะถูกกําหนดคาตั้งตนใหโดยอัตโนมัติถึงแมวาเราจะ
ไมไดกําหนดไวโดยจะมีคาดังนี้
object reference = null
byte, short ,int ,long = 0
float , double = 0.0
Boolean = false
char = ‘u000’
ตัวอยาง Instance variables
public class BirthDate{
int year ; // Instance variable
public static void main(String args[]){
BirthDate bd = new BirthDate();
bd.showYear();
}
public void showYear(){
System.out.println(“The year is” + year);
}
}
ตัวแปร year จะถูกกําหนดคาใหเปน 0 โดยอัตโนมัติ
ผลลัพธที่ได
The year is 0
บทที่ 5 คลาสและออบเจ็ค หนาที่ 129
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
2. local variable หมายถึง ตัวแปรที่ประกาศไวเปน method หรือ constructors ตัวแปรพวกนี้เรา
จะตองกําหนดคาตั้งตนหรือใหคาไวกอนที่เราจะนําไปใชประมวลผลใดๆ ดังตัวอยาง
ตัวอยาง public class TimeTravel{
public static void main(String args[]){
int date; // local variable:ประกาศแตไมไดกําหนดคาเริ่มตน
System.out.println(“The date is ”+ date); // compiler error
}
}
ตัวแปร year จะไมถูกกําหนดคาตั้งตนอัตโนมัติให เมื่อนําไปใชก็จะเกิดขอผิดพลาด
ขณะทําการคอมไพล
ตัวอยาง public class TimeTravel{
public static void main(String args[]){
int date = 29052007; // local variable:ประกาศพรอมกําหนดคาเริ่มตน
System.out.println(“The date is ”+ date);
}
}
ผลลัพธที่ไดคือ
The date is 29052007
การสงขอมูลดวยคาของตัวแปร(Pass by value-copy)
ในการเรียกใชงานเมธอดบางครั้งจําเปนตองสงคาไปยัง method ที่เรียกใชงานโดยผานคลาสดัง
ตัวอยางตอไปนี้ซึ่งตัวแปรที่เรียกใชงานจะเปนการสงเฉพาะคาของตัวแปรเทานั้น หากกลับมายัง method
main หรือ method ที่เรียกใชงานจะไมทําใหคานั้นเปลี่ยนแปลง Java จะสงใน Parameter ของ Method
ในลักษณะ copy คาของตัวแปรแลวสงไปให method เสมอ ดังตัวอยาง
ตัวอยาง การสงขอมูลดวยคาของตัวแปร
public class Test {
static void setData(int a,int b){
a = 5;b = 10;
}
public static void main (String [] args) {
int a = 50,b = 100;
บทที่ 5 คลาสและออบเจ็ค หนาที่ 130
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
System.out.println(“a=“+a+” b=“+b);
setData(a,b);
System.out.println(“a=“+a+” b=“+b);
}
}
ผลลัพธที่ได
50 100
50 100
การสงขอมูลดวยวัตถุ(Pass by reference)
ในกรณีที่ Parameter ของ Method เปน Object Variable ก็จะเปนการ copy คา Reference ของ
Object ดังตัวอยางตอไปนี้
ตัวอยาง การสงพารามิเตอรที่มีชนิดเปน object variable
public class Test {
int data;
static void setData(Test a){
a.data = 50;
}
public static void main (String [] args) {
Test a = new Test();
a.data = 10;
System.out.println(“a=“+a.data);
setData(a);
System.out.println(“a=“+a.data);
}
}
ผลลัพธที่ได:
10
50
บทที่ 5 คลาสและออบเจ็ค หนาที่ 131
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
Date
-day : String
-month : String
-year : int
+setDay(int) : void
+setMonth(String a) : void
+setYear(int ) : void
+getDay( ) : int
+getMonth( ) : String
+getYear( ) : int
+printDate() : void
คอนสตรัคเตอร(Constructor)
คอนสตรัคเตอรเปนสวนที่ใชในการกําหนดคาเริ่มตนใหกับแอทริบิวตตางๆ ของออบเจ็ค โดย
คอนสตรัคเตอรจะถูกเรียกใชใหทํางานโดยอัตโนมัติเมื่อเราสรางออบเจ็คขึ้นจากคลาสดวยคียเวิรด new
แมวา instances ของคลาสเดียวกันจะมีโครงสรางและสมาชิกเหมือนกัน แตคาใน field ตางๆ
ของแตละ instances อาจจะตางกันได ภาษาเชิงวัตถุจึงมีวิธีการกําหนดคาเริ่มตนใหแก fields ตางๆ
ในขณะที่สรางแตละ instances ขึ้นมา โดยใชสิ่งที่เรียกวา constructor ซึ่ง constructor นี้มีก็คือ method ที่
มีชื่อเดียวกันกับคลาสนั้น โดยในสวนของ modifier ของ constructor จะมี default เปน public ดังนั้นจึง
ไมจําเปนตองใส modifier ไวหนา constructor หากจําเปนตองใสก็สามารถกําหนดเปน public ไดเทานั้น
เนื่องจากคอมไพเลอรของ Java จะไมยอมให constructor เปน private มิเชนนั้นจะไมสามารถเรียกใชงาน
constructor ได และ constructor จะถูกเรียกใชเสมอเมื่อมีการสราง instance ดังนั้นจําเปนตองประกาศ
constructor เปน public
ในการสราง instance ขึ้นดวยการ new นี้เองที่ constructor ของคลาสนั้นถูกเรียกคลายกับ
methods ทั่วไป ซึ่งอาจมีการสงพารามิเตอรใหแก constructor นําไปใชในการกําหนดคาเริ่มตนใหแก
fields ใน instance นั้นไดดวย ผลของการ new ทําให instance ที่ถูกสรางขึ้นมี reference ถูกสงออกมา
เสมอ ดวยเหตุนี้ constructor จึงไมสามารถสงคาอยางอื่นออกมา ทําใหในการเขียนโปรแกรมของ
constructor ไมตองระบุชนิดขอมูลของคาที่จะสงออกมากํากับหนาชื่อ constructor หรือระบุเปน void
และในตัวโปรแกรมของ constructor จะมีประโยคที่ return คาออกมาไมได
บทที่ 5 คลาสและออบเจ็ค หนาที่ 132
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
ตัวอยาง แสดง class ที่มีการกําหนด constructor
ในคลาสหนึ่งอาจมี constructor ไดมากกวาหนึ่งตัว สังเกตวา constructors เหลานี้ชื่อเหมือนกัน
แตมีพารามิเตอรตางกัน จุดประสงคก็เพื่อใหสามารถกําหนดคาเริ่มตนสําหรับการสราง instance ได
หลายแบบ และในภาษา java และ C++ เรียกการที่ method มีชื่อเหมือนกันแตพารามิเตอรตางกันอยางนี้
วา overloading ซึ่งหมายถึงการใชงานชื่อ methods นั้นมากกวาหนึ่งหนาที่ การใชงาน overload
constructor นั้นทําไดโดยการเรียกใช constructor และสงพารามิเตอรที่ตองการเหมือนปกติที่เคยใชงาน
method สวนจะเปน constructor ใดที่ถูกเรียกใชงานนั้นคอมไพเลอรจะเปนผูเลือกใหเอง โดยพิจารณา
จากพารามิเตอรที่สงไป
ภาษา Java กําหนดไววา ทุกคลาสจะตองมี constructor อยางนอยหนึ่งตัว แตจากตัวอยางที่เคย
ศึกษามาคลาสตางๆไมมี constructor ซึ่งจากการ compile และ run โปรแกรมไมพบ error ใดๆ เนื่องจาก
หากไมไดกําหนด constructor ใหแกคลาสใดๆก็ตาม คอมไพเลอรก็จะสราง empty constructor หรือ
class MyDate {
String day ;
String month;
int year;
MyDate ( ) {
// หากประกาศ constructor อื่นแลว ไมประกาศempty constructor จะเกิด error เมื่อสราง instance ปกติ
// เชนมีการเรียกใช new MyDate(); จะเกิด error ได
day = null;
month = null;
year = 0;
}
MyDate(String d , String m , int y){
day = d;
month = m;
year = y;
}
MyDate (MyDate d){
day = d.day;
month = d.month;
year = d.year;
}
void setDay(String d){
day = d;
}
…….
……
void printDate(){
System.out.println(day + “ : ” + month + “ :” + year);
}
บทที่ 5 คลาสและออบเจ็ค หนาที่ 133
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
default constructor (constructor ที่ไมมีพารามิเตอร เชน MyDate() ) ใหแก class นั้นๆ ซึ่งหาก fields ใน
คลาสเปนขอมูลพื้นฐาน(primitive data type) จะถูกกําหนดใหมีคาเริ่มตนเปนคา default ตามชนิดของ
ขอมูล แตหากเปน fields ของ array , String หรือ refence(instance of object) จะถูกกําหนดคาเริ่มตนให
เปน null
ตัวอยาง แสดง class ที่มีการสราง instance หนึ่งของ class MyDate จากตัวอยางกอนหนา
สรุปไดวา
- ขณะที่ Object ถูกสรางนั้น Constructors อันใดอันหนึ่งจะถูกเรียกเสมอ
- โดยชื่อของ Constructors ตองเปนชื่อเดียวกับชื่อ Class
- Constructors จะตองไมมี return type หนาชื่อ method (หากวามีจะถือวาไมเปน Constructors
หากแตเปน method ธรรมดา)
- คลาสหนึ่งๆอาจจะมี Constructor หลายๆตัวได แตตองมี Argument ตางกันเรียกวา Overloading
Constructors
class test
{
public static void main(String[] args)
{
MyDate x = new MyDate("Sunday","January", 2006);
MyDate y = new MyDate(x);
y.printDate();
new MyDate();
new MyDate().printDate();
new MyDate("Monday" , "February" , 2006).printDate();
}
}
ผลลัพธที่ไดคือ
Sunday:January:2006
null:null:0
Monday:February:2006
บทที่ 5 คลาสและออบเจ็ค หนาที่ 134
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
Constructors แบงออกเปน 2 ชนิดคือ
– Empty Constructor คือ Constructor ที่ไมมี Argument ใดๆเลย
– Copy Constructor คือ Constructor ที่มี Argument
ตัวอยาง คอนสตรัคเตอร
public class A {
public A() {
.......
} // empty constructor
public A(int i) {
.......
} // copy constructor
}
คุณลักษณะของ Constructors
o ทุกๆ class จะตองมีอยางนอย 1 constructor เสมอ
o หากไมมีการระบุ constructor ใดๆเลย compiler จะใส empty constructor ใหโดยอัตโนมัติ
คลาสที่สราง
public class A {
int i=0;
}
=
คอมไพลเลอรสรางให
public class A{
public A() { } // Compiler จัดให
int i=0;
}
คลาสที่สราง
public class A {
public A(int i){
}
int i=0;
}
คอมไพลเลอร
public class A {
public A(int i){
}
int i=0;
}
=
บทที่ 5 คลาสและออบเจ็ค หนาที่ 135
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
Static data member
data member ที่ถูกกําหนดใหเปน static จะเปนการขอจองพื้นที่หนวยความจําเดียวกันใหกับคา
ของตัวแปรนั้น แมวามีการสราง instance ใหมอีกกี่ครั้งก็ตาม ดังตัวอยางตอไปนี้แสดงใหเห็นวา i เปน
ตัวแปร static หากมีการสราง instance ใหมขึ้นแลวจะมีผลตอการทํางานดังนี้
ในการประกาศให instance variable หรือ method เปน static นั้น สามารถถูกเรียกใชโดยไมตอง
สราง object ของ class เจาของกอน โดยใหชื่อ class ตามดวย instance variable หรือ method ในการ
เขาถึง เชน Student.id = 10 ; Student.setId(10);
class StaticTest {
static int i = 47; // static data member
}
class testData{
public static void main(String[] args){
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
System.out.println("before StaticTest.i++");
System.out.println("StaticTest.i = " + StaticTest.i);
StaticTest.i++;
System.out.println("after StaticTest.i++");
System.out.println("st1.i = " + st1.i);
System.out.println("st2.i =" + st2.i);
System.out.println("StaticTest.i =" + StaticTest.i);
}
}
ผลลัพธที่ได
before StaticTest.i++
StaticTest.i = 47
after StaticTest.i++
st1.i = 48
st2.i = 48
StaticTest.i = 48
//เปนที่นาสังเกตวา ตัวดําเนินการ ++ ทําใหเพิ่มคาของตัวแปรไดทั้ง st1.i และ st2.i เพราะ ตางก็มีคา 48.
บทที่ 5 คลาสและออบเจ็ค หนาที่ 136
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
ตัวอยาง
public class StaticDataTest {
static int data;// data เปน static data member
int value;// value เปน data member
static void setDataOne(StaticDataTest a){//setDataOne เปน static method
a.data = 50;
}
static void setDataTwo(int data){//setDataTwo เปน static method
data =100;
}
static void setDataThree(int b){// setDataThree เปน static method
data = 200;
}
public static void main (String [] args) {
StaticDataTest a = new StaticDataTest();
a.data = 10;
System.out.println("a= "+a.data);
setDataOne(a); // static method สามารถเรียกใชไดโดยไมตองสรางinstance
System.out.println("a= "+a.data);
setDataTwo(a.data);
System.out.println("a= " +a.data);
setDataThree(a.data);
System.out.println("a= "+ a.data);
System.out.println("After new B");
StaticDataTest b = new StaticDataTest();
System.out.println("b =" + b.data);
System.out.println("a =" + a.data);
System.out.println("StaticDataTest.data= " + StaticDataTest.data);
// StaticDataTest.data เปน static data ทําใหสามารถเรียกผาน class ไดเลยโดยไมตองสราง instance
//System.out.println("StaticDataTest.data= " + StaticDataTest.value); //error
}}
บทที่ 5 คลาสและออบเจ็ค หนาที่ 137
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
ผลลัพธที่ได :
a= 10
a= 50
a= 50
a= 200
After new B
b =200
a =200
StaticDataTest.data= 200
จากตัวอยาง หากนํา comment บันทัดสุดทายออกจะเกิด error เพราะ value เปน data member ที่
ไมใช static ไมสามารถเรียกผาน class ได ตองกําหนดคาผาน method เทานั้น
สังเกตุวาถึงแมจะสราง object ขึ้นมา instance variable และ method ที่ประกาศเปน static ก็จะ
เปนตัวเดียวกัน
Static method
Method ที่ถูกระบุเปน static method จะสามารถเรียกใชไดภายในคลาสเดียวกันไดเลยและตอง
เปน method ที่เปน static ดวยกันเชน main() ถาเรียกใชนอกคลาสจะสามารถเรียกไดโดยผานชื่อคลาสได
เลยไมตองสราง instance ขึ้นมา ตางจาก method ทั่วไปที่ตองสราง instance ขึ้นมากอน
o Static Members หมายถึงสมาชิก(attribute และ method)ที่สามารถใชงานใด แมวา Class นั้นๆ
จะยังไมถูกนําไปสรางเปน Object และหาก class นั้นถูกนําไปสรางเปน Object ไมวาจะกี่
instance เมื่ออางอิงถึง Static Member ก็จะเปนการอางอิงที่ตัวเดียวกัน
o Code ภานใน Static Method นั้นจะอางอิงไดแต static members ดวยกันหรือ local variable
เทานั้น
วิธีการเรียกใชงาน method ที่ถูกกําหนดใหเปน static
รูปแบบ : ClassName.method( );
เชน Student.setId(5);
บทที่ 5 คลาสและออบเจ็ค หนาที่ 138
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
ตัวอยางโปรแกรม
class StaticTest { static int i = 47; // static data member}
class StaticFun {
static void incr() {
StaticTest.i++;
}
}
จากตัวอยาง class StaticFun ประกอบไปดวย method ที่ชื่อ incr() ซึ่งเปน static method และ มี i เปน
static data member ดวย เมื่อเรียกใชงานเมธอด incr() สามารถเรียกใชงานผานอ็อบเจ็กไดดังนี้
StaticFun sf = new StaticFun();
sf.incr();
หรือ เนื่องจาก method incr() เปน static method สามารถเรียกใชงาน class ไดโดยตรงดังนี้
StaticFun.incr();
ตัวอยางโปรแกรมที่สราง method ที่มีคียเวิรด static ใชงานเอง
class testMethod{
static void print(String str){
// static method สามารถเรียกใชงานไดเลยโดยไมตองประกาศ instance
System.out.println();
System.out.println(str);
}
static void printChar(char ch){
System.out.print(Character.toString(ch)); //converse character to String
}
static void printStar(int stp){
for ( int i = 0; i < stp ; i++ ){
printChar('*');
}
}
บทที่ 5 คลาสและออบเจ็ค หนาที่ 139
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
public static void main(String[] args){
printStar(5);
print("Hello");
printStar(10);
testMethod.print(“print from call class”);
}
}
ผลลัพธที่ได
*****
Hello
**********
print from call class
ตัวอยางโปรแกรมที่ java compiler ทําการ import class ที่อยูใน java.lang เขามาอัตโนมัติทําใหตอนเขียน
โปรแกรม ไมตอง import java.lang.* เขามายังสวนตนของโปรแกรม ทําใหสามารถเรียกใช เมธอดใน
คลาส Math ที่เก็บไวในแพ็คเกจ java.lang ได ซึ่งจะกลาวถึงเรื่องแพ็คเกจในบทที่ 7 และทําการศึกษา
คลาส Math เพิ่มเติมไดในภาคผนวก
class testMethodMathClass{
public static void main(String[] args){
double ansD1 , ansD2 , ansD3 ;
double t1 = 9.9 , t2 = 9.5 , t3 = 9.2;
//การเรียกใช method Math.ceil เพื่อทําการปดทศนิยมขึ้น
ansD1 = Math.ceil(t1);
ansD2 = Math.ceil(t2);
ansD3 = Math.ceil(t3);
System.out.println("Show answer from CEIL function");
//การเรียกใช method Double.toString เพื่อทําการแปลงคาของ double ใหเปน String
System.out.println(Double.toString(ansD1));
System.out.println(Double.toString(ansD2));
System.out.println(Double.toString(ansD3));
บทที่ 5 คลาสและออบเจ็ค หนาที่ 140
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
//การเรียกใช method Math.floor เพื่อทําการปดทศนิยมทิ้ง
ansD1 = Math.floor(t1);
ansD2 = Math.floor(t2);
ansD3 = Math.floor(t3);
System.out.println("Show answer from FLOOR function");
System.out.println(Double.toString(ansD1));
System.out.println(Double.toString(ansD2));
System.out.println(Double.toString(ansD3));
//การเรียกใช method Math.floor เพื่อทําการปดทศนิยมหากเกิน 5 ปดเศษขึ้น ต่ํากวา 5 ปดเศษทิ้ง
ansD1 = Math.round(t1);
ansD2 = Math.round(t2);
ansD3 = Math.round(t3);
System.out.println("Show answer from ROUND function");
System.out.println(Double.toString(ansD1));
System.out.println(Double.toString(ansD2));
System.out.println(Double.toString(ansD3));}}
ผลลัพธที่ได
Show answer from CEIL function
10.0
10.0
10.0
Show answer from FLOOR function
9.0
9.0
9.0
Show answer from ROUND function
10.0
10.0
9.0
หมายเหตุ
Prototype ของ method ทั้ง 3 method ที่อยูใน class Math แสดงไดดังนี้
1. public static double ceil(double argument)
2. public static double round(double argument)
3. public static double floor(double argument)

More Related Content

What's hot

Java Programming: การจัดการกับข้อผิดพลาด
Java Programming: การจัดการกับข้อผิดพลาดJava Programming: การจัดการกับข้อผิดพลาด
Java Programming: การจัดการกับข้อผิดพลาดThanachart Numnonda
 
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้นคลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้นFinian Nian
 
Java-Chapter 11 Recursions
Java-Chapter 11 RecursionsJava-Chapter 11 Recursions
Java-Chapter 11 RecursionsWongyos Keardsri
 
Java-Answer Chapter 12-13 (For Print)
Java-Answer Chapter 12-13 (For Print)Java-Answer Chapter 12-13 (For Print)
Java-Answer Chapter 12-13 (For Print)Wongyos Keardsri
 
นางสาว จรัญญา-กฤตย์ณัชช์-59170236-กลุ่ม-1
นางสาว จรัญญา-กฤตย์ณัชช์-59170236-กลุ่ม-1นางสาว จรัญญา-กฤตย์ณัชช์-59170236-กลุ่ม-1
นางสาว จรัญญา-กฤตย์ณัชช์-59170236-กลุ่ม-1หน่อย หน่อย
 
Java Programming: หลักการเชิงอ็อบเจกต์
Java Programming: หลักการเชิงอ็อบเจกต์Java Programming: หลักการเชิงอ็อบเจกต์
Java Programming: หลักการเชิงอ็อบเจกต์Thanachart Numnonda
 
Java Programming [8/12] : Arrays and Collection
Java Programming [8/12] : Arrays and CollectionJava Programming [8/12] : Arrays and Collection
Java Programming [8/12] : Arrays and CollectionIMC Institute
 
ความรู้เบื้องต้นภาษาจาวา
ความรู้เบื้องต้นภาษาจาวาความรู้เบื้องต้นภาษาจาวา
ความรู้เบื้องต้นภาษาจาวาThanachart Numnonda
 
Java-Chapter 12 Classes and Objects
Java-Chapter 12 Classes and ObjectsJava-Chapter 12 Classes and Objects
Java-Chapter 12 Classes and ObjectsWongyos Keardsri
 
Java-Chapter 01 Introduction to Java Programming
Java-Chapter 01 Introduction to Java ProgrammingJava-Chapter 01 Introduction to Java Programming
Java-Chapter 01 Introduction to Java ProgrammingWongyos Keardsri
 
Java Programming: การสร้างส่วนต่อประสานกราฟิกกับผู้ใช้ (Java GUI)
Java Programming: การสร้างส่วนต่อประสานกราฟิกกับผู้ใช้ (Java GUI)Java Programming: การสร้างส่วนต่อประสานกราฟิกกับผู้ใช้ (Java GUI)
Java Programming: การสร้างส่วนต่อประสานกราฟิกกับผู้ใช้ (Java GUI)Thanachart Numnonda
 
Java Programming [4/12] : Object Oriented Concept
Java Programming [4/12] : Object Oriented ConceptJava Programming [4/12] : Object Oriented Concept
Java Programming [4/12] : Object Oriented ConceptIMC Institute
 
Java Programming: คลาสอินพุตและเอาต์พุต
Java Programming: คลาสอินพุตและเอาต์พุตJava Programming: คลาสอินพุตและเอาต์พุต
Java Programming: คลาสอินพุตและเอาต์พุตThanachart Numnonda
 
Java Programming [9/12]: Exception Handling
Java Programming [9/12]: Exception HandlingJava Programming [9/12]: Exception Handling
Java Programming [9/12]: Exception HandlingIMC Institute
 
Java Programming [6/12] : Object Oriented Java Programming
Java Programming [6/12] : Object Oriented Java ProgrammingJava Programming [6/12] : Object Oriented Java Programming
Java Programming [6/12] : Object Oriented Java ProgrammingIMC Institute
 

What's hot (20)

Java Programming: การจัดการกับข้อผิดพลาด
Java Programming: การจัดการกับข้อผิดพลาดJava Programming: การจัดการกับข้อผิดพลาด
Java Programming: การจัดการกับข้อผิดพลาด
 
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้นคลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
 
Java-Chapter 11 Recursions
Java-Chapter 11 RecursionsJava-Chapter 11 Recursions
Java-Chapter 11 Recursions
 
Java-Answer Chapter 12-13 (For Print)
Java-Answer Chapter 12-13 (For Print)Java-Answer Chapter 12-13 (For Print)
Java-Answer Chapter 12-13 (For Print)
 
นางสาว จรัญญา-กฤตย์ณัชช์-59170236-กลุ่ม-1
นางสาว จรัญญา-กฤตย์ณัชช์-59170236-กลุ่ม-1นางสาว จรัญญา-กฤตย์ณัชช์-59170236-กลุ่ม-1
นางสาว จรัญญา-กฤตย์ณัชช์-59170236-กลุ่ม-1
 
Java Programming: หลักการเชิงอ็อบเจกต์
Java Programming: หลักการเชิงอ็อบเจกต์Java Programming: หลักการเชิงอ็อบเจกต์
Java Programming: หลักการเชิงอ็อบเจกต์
 
4.Oop
4.Oop4.Oop
4.Oop
 
Java Programming [8/12] : Arrays and Collection
Java Programming [8/12] : Arrays and CollectionJava Programming [8/12] : Arrays and Collection
Java Programming [8/12] : Arrays and Collection
 
5.Methods cs
5.Methods cs5.Methods cs
5.Methods cs
 
ความรู้เบื้องต้นภาษาจาวา
ความรู้เบื้องต้นภาษาจาวาความรู้เบื้องต้นภาษาจาวา
ความรู้เบื้องต้นภาษาจาวา
 
3.Expression
3.Expression3.Expression
3.Expression
 
Java-Chapter 12 Classes and Objects
Java-Chapter 12 Classes and ObjectsJava-Chapter 12 Classes and Objects
Java-Chapter 12 Classes and Objects
 
Java-Chapter 01 Introduction to Java Programming
Java-Chapter 01 Introduction to Java ProgrammingJava-Chapter 01 Introduction to Java Programming
Java-Chapter 01 Introduction to Java Programming
 
Java Programming: การสร้างส่วนต่อประสานกราฟิกกับผู้ใช้ (Java GUI)
Java Programming: การสร้างส่วนต่อประสานกราฟิกกับผู้ใช้ (Java GUI)Java Programming: การสร้างส่วนต่อประสานกราฟิกกับผู้ใช้ (Java GUI)
Java Programming: การสร้างส่วนต่อประสานกราฟิกกับผู้ใช้ (Java GUI)
 
662305 08
662305 08662305 08
662305 08
 
Java Programming [4/12] : Object Oriented Concept
Java Programming [4/12] : Object Oriented ConceptJava Programming [4/12] : Object Oriented Concept
Java Programming [4/12] : Object Oriented Concept
 
Java AWT
Java AWTJava AWT
Java AWT
 
Java Programming: คลาสอินพุตและเอาต์พุต
Java Programming: คลาสอินพุตและเอาต์พุตJava Programming: คลาสอินพุตและเอาต์พุต
Java Programming: คลาสอินพุตและเอาต์พุต
 
Java Programming [9/12]: Exception Handling
Java Programming [9/12]: Exception HandlingJava Programming [9/12]: Exception Handling
Java Programming [9/12]: Exception Handling
 
Java Programming [6/12] : Object Oriented Java Programming
Java Programming [6/12] : Object Oriented Java ProgrammingJava Programming [6/12] : Object Oriented Java Programming
Java Programming [6/12] : Object Oriented Java Programming
 

Similar to บทที่ 5 คลาส

คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้นคลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้นFinian Nian
 
บทที่ 6 อาร์เรย์
บทที่ 6 อาร์เรย์บทที่ 6 อาร์เรย์
บทที่ 6 อาร์เรย์Theeravaj Tum
 
บทที่ 12 กราฟฟิก
บทที่ 12 กราฟฟิกบทที่ 12 กราฟฟิก
บทที่ 12 กราฟฟิกTheeravaj Tum
 
บทที่ 9 การพ้องรูป
บทที่ 9 การพ้องรูปบทที่ 9 การพ้องรูป
บทที่ 9 การพ้องรูปTheeravaj Tum
 
พื้นฐานภาษาจาวา
พื้นฐานภาษาจาวาพื้นฐานภาษาจาวา
พื้นฐานภาษาจาวาAeew Autaporn
 
น.ส.ศิริวิภา กาญจนาวิล-59170116-sec-1
น.ส.ศิริวิภา กาญจนาวิล-59170116-sec-1น.ส.ศิริวิภา กาญจนาวิล-59170116-sec-1
น.ส.ศิริวิภา กาญจนาวิล-59170116-sec-1หน่อย หน่อย
 
KMUTNB - Internet Programming 7/7
KMUTNB - Internet Programming 7/7KMUTNB - Internet Programming 7/7
KMUTNB - Internet Programming 7/7phuphax
 
(Big One) C Language - 03 ฟังก์ชันส่งผ่านสตรัค
(Big One) C Language - 03 ฟังก์ชันส่งผ่านสตรัค(Big One) C Language - 03 ฟังก์ชันส่งผ่านสตรัค
(Big One) C Language - 03 ฟังก์ชันส่งผ่านสตรัคKittinan Noimanee
 
บทที่ 10 ตัวแปรสตริ
บทที่ 10 ตัวแปรสตริบทที่ 10 ตัวแปรสตริ
บทที่ 10 ตัวแปรสตริTheeravaj Tum
 

Similar to บทที่ 5 คลาส (20)

คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้นคลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
 
บทที่ 6 อาร์เรย์
บทที่ 6 อาร์เรย์บทที่ 6 อาร์เรย์
บทที่ 6 อาร์เรย์
 
บทที่ 12 กราฟฟิก
บทที่ 12 กราฟฟิกบทที่ 12 กราฟฟิก
บทที่ 12 กราฟฟิก
 
C lang
C langC lang
C lang
 
Lab Computer Programming 1
Lab Computer Programming 1Lab Computer Programming 1
Lab Computer Programming 1
 
Ass1 1
Ass1 1Ass1 1
Ass1 1
 
Power point
Power pointPower point
Power point
 
Inet
InetInet
Inet
 
Computer Programming 2.2
Computer Programming 2.2Computer Programming 2.2
Computer Programming 2.2
 
Java intro
Java introJava intro
Java intro
 
บทที่ 9 การพ้องรูป
บทที่ 9 การพ้องรูปบทที่ 9 การพ้องรูป
บทที่ 9 การพ้องรูป
 
พื้นฐานภาษาจาวา
พื้นฐานภาษาจาวาพื้นฐานภาษาจาวา
พื้นฐานภาษาจาวา
 
น.ส.ศิริวิภา กาญจนาวิล-59170116-sec-1
น.ส.ศิริวิภา กาญจนาวิล-59170116-sec-1น.ส.ศิริวิภา กาญจนาวิล-59170116-sec-1
น.ส.ศิริวิภา กาญจนาวิล-59170116-sec-1
 
1 weka introducing
1 weka introducing1 weka introducing
1 weka introducing
 
KMUTNB - Internet Programming 7/7
KMUTNB - Internet Programming 7/7KMUTNB - Internet Programming 7/7
KMUTNB - Internet Programming 7/7
 
Control structure
Control structureControl structure
Control structure
 
(Big One) C Language - 03 ฟังก์ชันส่งผ่านสตรัค
(Big One) C Language - 03 ฟังก์ชันส่งผ่านสตรัค(Big One) C Language - 03 ฟังก์ชันส่งผ่านสตรัค
(Big One) C Language - 03 ฟังก์ชันส่งผ่านสตรัค
 
Chapter3
Chapter3Chapter3
Chapter3
 
66
6666
66
 
บทที่ 10 ตัวแปรสตริ
บทที่ 10 ตัวแปรสตริบทที่ 10 ตัวแปรสตริ
บทที่ 10 ตัวแปรสตริ
 

More from Theeravaj Tum

Javacentrix com chap11-2
Javacentrix com chap11-2Javacentrix com chap11-2
Javacentrix com chap11-2Theeravaj Tum
 
Javacentrix com chap11-1
Javacentrix com chap11-1Javacentrix com chap11-1
Javacentrix com chap11-1Theeravaj Tum
 
Javacentrix com chap10-0
Javacentrix com chap10-0Javacentrix com chap10-0
Javacentrix com chap10-0Theeravaj Tum
 
Javacentrix com chap09-0
Javacentrix com chap09-0Javacentrix com chap09-0
Javacentrix com chap09-0Theeravaj Tum
 
Javacentrix com chap08-0
Javacentrix com chap08-0Javacentrix com chap08-0
Javacentrix com chap08-0Theeravaj Tum
 
Javacentrix com chap07-0
Javacentrix com chap07-0Javacentrix com chap07-0
Javacentrix com chap07-0Theeravaj Tum
 
Javacentrix com chap06-0
Javacentrix com chap06-0Javacentrix com chap06-0
Javacentrix com chap06-0Theeravaj Tum
 
Javacentrix com chap04-0
Javacentrix com chap04-0Javacentrix com chap04-0
Javacentrix com chap04-0Theeravaj Tum
 
Javacentrix com chap03-0
Javacentrix com chap03-0Javacentrix com chap03-0
Javacentrix com chap03-0Theeravaj Tum
 
Javacentrix com chap02-0
Javacentrix com chap02-0Javacentrix com chap02-0
Javacentrix com chap02-0Theeravaj Tum
 
Javacentrix com chap01-0
Javacentrix com chap01-0Javacentrix com chap01-0
Javacentrix com chap01-0Theeravaj Tum
 
Javacentrix com chap05-0
Javacentrix com chap05-0Javacentrix com chap05-0
Javacentrix com chap05-0Theeravaj Tum
 
บทที่ 13 การดักจับเ
บทที่ 13 การดักจับเบทที่ 13 การดักจับเ
บทที่ 13 การดักจับเTheeravaj Tum
 
บทที่ 11 การดักจับข
บทที่ 11 การดักจับขบทที่ 11 การดักจับข
บทที่ 11 การดักจับขTheeravaj Tum
 
บทที่ 8 คุณสมบัติก
บทที่ 8 คุณสมบัติกบทที่ 8 คุณสมบัติก
บทที่ 8 คุณสมบัติกTheeravaj Tum
 
บทที่ 7 แพ็คเกจ
บทที่ 7 แพ็คเกจบทที่ 7 แพ็คเกจ
บทที่ 7 แพ็คเกจTheeravaj Tum
 
บทที่ 4 แอทริบิวท์
บทที่ 4 แอทริบิวท์บทที่ 4 แอทริบิวท์
บทที่ 4 แอทริบิวท์Theeravaj Tum
 
บทที่ 3 คำสั่งควบค
บทที่ 3 คำสั่งควบคบทที่ 3 คำสั่งควบค
บทที่ 3 คำสั่งควบคTheeravaj Tum
 
บทที่ 2 ชนิดของตัว
บทที่ 2 ชนิดของตัวบทที่ 2 ชนิดของตัว
บทที่ 2 ชนิดของตัวTheeravaj Tum
 

More from Theeravaj Tum (19)

Javacentrix com chap11-2
Javacentrix com chap11-2Javacentrix com chap11-2
Javacentrix com chap11-2
 
Javacentrix com chap11-1
Javacentrix com chap11-1Javacentrix com chap11-1
Javacentrix com chap11-1
 
Javacentrix com chap10-0
Javacentrix com chap10-0Javacentrix com chap10-0
Javacentrix com chap10-0
 
Javacentrix com chap09-0
Javacentrix com chap09-0Javacentrix com chap09-0
Javacentrix com chap09-0
 
Javacentrix com chap08-0
Javacentrix com chap08-0Javacentrix com chap08-0
Javacentrix com chap08-0
 
Javacentrix com chap07-0
Javacentrix com chap07-0Javacentrix com chap07-0
Javacentrix com chap07-0
 
Javacentrix com chap06-0
Javacentrix com chap06-0Javacentrix com chap06-0
Javacentrix com chap06-0
 
Javacentrix com chap04-0
Javacentrix com chap04-0Javacentrix com chap04-0
Javacentrix com chap04-0
 
Javacentrix com chap03-0
Javacentrix com chap03-0Javacentrix com chap03-0
Javacentrix com chap03-0
 
Javacentrix com chap02-0
Javacentrix com chap02-0Javacentrix com chap02-0
Javacentrix com chap02-0
 
Javacentrix com chap01-0
Javacentrix com chap01-0Javacentrix com chap01-0
Javacentrix com chap01-0
 
Javacentrix com chap05-0
Javacentrix com chap05-0Javacentrix com chap05-0
Javacentrix com chap05-0
 
บทที่ 13 การดักจับเ
บทที่ 13 การดักจับเบทที่ 13 การดักจับเ
บทที่ 13 การดักจับเ
 
บทที่ 11 การดักจับข
บทที่ 11 การดักจับขบทที่ 11 การดักจับข
บทที่ 11 การดักจับข
 
บทที่ 8 คุณสมบัติก
บทที่ 8 คุณสมบัติกบทที่ 8 คุณสมบัติก
บทที่ 8 คุณสมบัติก
 
บทที่ 7 แพ็คเกจ
บทที่ 7 แพ็คเกจบทที่ 7 แพ็คเกจ
บทที่ 7 แพ็คเกจ
 
บทที่ 4 แอทริบิวท์
บทที่ 4 แอทริบิวท์บทที่ 4 แอทริบิวท์
บทที่ 4 แอทริบิวท์
 
บทที่ 3 คำสั่งควบค
บทที่ 3 คำสั่งควบคบทที่ 3 คำสั่งควบค
บทที่ 3 คำสั่งควบค
 
บทที่ 2 ชนิดของตัว
บทที่ 2 ชนิดของตัวบทที่ 2 ชนิดของตัว
บทที่ 2 ชนิดของตัว
 

บทที่ 5 คลาส

  • 1. คลาสและออบเจ็ค Class and Object วัตถุประสงค ♦ เพื่อใหมีความรูความเขาใจหลักการเขียนโปรแกรมเชิงวัตถุ ♦ เพื่อใหมีความรูความเขาใจหลักการทํางานคลาสและออบเจ็คโดยศึกษาจากภาษาจาวา ♦ เพื่อสามารถสรางและเรียกใชงานวัตถุได บทที่ 5
  • 2. บทที่ 5 คลาสและออบเจ็ค หนาที่ 122 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ เนื้อหาบทเรียน ♦ การสรางวัตถุจากคลาส(Object Declaration) ♦ การเรียกใชงานวัตถุ ♦ การสงขอมูลดวยคา ♦ การสงขอมูลดวยวัตถุ ♦ คอนสตรัคเตอร(Constructor) ♦ สแตติกแอทริบิวต(Static data) ♦ สแตติกเมธอด(Static method)
  • 3. บทที่ 5 คลาสและออบเจ็ค หนาที่ 123 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ การสรางวัตถุจากคลาส(Object Declaration) ออบเจ็คที่สรางขึ้นจากคลาส บางครั้งเรียกวา instance of class รูปแบบในการสราง instance ประกอบดวย 3 แบบคือ 1. class_name Object_ identifier ; // ประกาศ instance Object_ identifier = new class_name([class_parameter]); // เตรียมพื้นที่บนหนวยความจําสําหรับ instance ที่สราง เชน ในการออกแบบคลาสตามภาษา UML(Unified Modeling Language) การวิเคราะหและออกแบบ โปรแกรมดวยวิธีการเชิงวัตถุ แสดงสัญลักษณของคลาสไดดังนี้ คลาส StaticFun ประกอบดวย class StaticFun{ int id ; String name; void setId(int i){ } int getId() { return id; } } StaticFun sf1; // ประกาศ instance ชื่อ sf1 sf= new StaticFun(); //ทําการสรางออบเจ็ค Static Fun และใหตัวแปร sf1 ที่ประกาศ อางอิงมายังออบเจ็คนี้ StaticFun id : int name : String setId(int) getId() : int sf1 StaticFun id : int name : String setId(int) getId() : int sf1
  • 4. บทที่ 5 คลาสและออบเจ็ค หนาที่ 124 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ StaticFun sf2 , sf3 , sf4; // ประกาศ instance ทีละหลายๆ ตัว ชื่อ sf2, sf3 และ sf4 sf2 = new StaticFun() ; sf3 = new StaticFun(); sf4 = new StaticFun(); หากมีการสรางออบเจ็คโดยใชตัวแปรออบเจ็คเดิม เชน StaticFun sf5; sf5 = new StaticFun(); sf5 = new StaticFun(); sf2 sf3 sf4 StaticFun id : int name : String setId(int) getId() : int sf4StaticFun id : int name : String setId(int) getId() : int f4StaticFun id : int name : String setId(int) getId() : int sf4 StaticFun id : int name : String setId(int) getId() : int sf5 StaticFun id : int name : String setId(int) getId() : int sf5 StaticFun id : int name : String setId(int) getId() : int พื้นที่สวนนี้จะถูก deallocate โดย garbage collection จัดการโดย JVM
  • 5. บทที่ 5 คลาสและออบเจ็ค หนาที่ 125 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ 2. ประกาศ instance พรอมเตรียมพื้นที่บนหนวยความจําสําหรับ instance ที่สรางใหม class name Object_ identifier = new class_name(); เชน StaticFun sf = new StaticFun(); 3. สรางออบเจ็คโดยไมประกาศตัวแปรออบเจ็ค เพื่อใชอางอิงออบเจ็คได new class_name(); เชน new StaticFun(); ในหนึ่งคลาสสามารถสรางออบเจ็คใชงานไดหลายครั้ง ในการใชคียเวิรด new ทุกครั้งจะเปน การขอใชพื้นที่หนวยความจําใหม และหาก instance ใดไมถูกใชงานในภาษาจาวาจะมี garbage collector เปนผูจัดการคืนหนวยความจําใหกับระบบ ซึ่งความสามารถนี้ทําใหภาษาจาวาเปนภาษาที่มีคุณสมบัติ ของการทนทาน (robust) เนื่องจากมีตัวกําจัดขยะ(garbage collection) การเรียกใชงานแอทริบิวต แอทริบิวตเปนสมาชิกของคลาส ดังนั้นการที่เราจะทํางานกับแอทริบิวตไดนั้นจึงตองกระทําผาน ตัวแปรออบเจ็คที่อางอิงอบบเจ็คของคลาสนั้นๆ อยู รูปแบบ : Object_ identifier.attribut_name ตัวอยาง sf1.id = 1001; sf1.name = “Surangkana”; sf2.id = 1002; sf2.name = “Somporn” ; ตัวอยาง โปรแกรมการเรียกใชงานแอทริบิวต โดยบันทึกไฟลชื่อ TestCallAttribute.java StaticFun id : int name : String setId(int) getId() : int sf StaticFun id : int name : String setId(int) getId() : int
  • 6. บทที่ 5 คลาสและออบเจ็ค หนาที่ 126 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ class StaticFun{ int id ; String name; void setId(int i){ id = i; } int getId() { return id; } } public class TestCallAttribute{ public static void main(String args[]){ StaticFun sf1 = new StaticFun(); sf1.id = 1001; sf1.name = “Surangkana”; System.out.println(“Identification =” + sf1.id); System.out.println(“Name =” + sf1.name); } } ผลลัพธที่ไดจากการรัน : Identification = 1001 Name = Surangkana หมายเหตุ การที่เราจะกําหนดคาใหกับแอทริบิวตที่อยูในคลาสไดโดยตรงตามรูปแบบนี้นั้น modifier ของ แอทริบิวตจะตองเปน public , protected หรือ default ในกรณีที่ทุกคลาสอยูในแพ็กเกจเดียวกัน แตหากมี สวน modifier เปน private นั้นจะตองดําเนินการผานเมธอด เปนไปตามหลักการ information hiding StaticFun id = 1001 name =Surangkana setId(int) getId() : int sf1
  • 7. บทที่ 5 คลาสและออบเจ็ค หนาที่ 127 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ การเรียกใชงานเมธอดภายในคลาส เมธอดก็เปนสมาชิกของคลาสของคลาสเชนเดียวกับแอทริบิวต ดังนั้นการที่เราจะเรียกใชงานได นั้นจึงตองกระทําผานตัวแปรออบเจ็คที่อางอิงอบบเจ็คของคลาสนั้นๆ อยู รูปแบบ : Object_ identifier.method_name(parameter_list); ตัวอยาง sf1.setId(1001); name1 = sf1.getName(); sf2.setId(“1002”); name2 = sf2.getName(); ตัวอยาง โปรแกรมการเรียกใชงานแอทริบิวต โดยบันทึกไฟลชื่อ TestCallMethod.java class StaticFun{ private int id ; private String name; public void setId(int i){ id = i; } int getId() { return id; } void run(){ System.out.println(“Print from method run() ”); } } public class TestCallAttribute{ public static void main(String args[]){ StaticFun sf1 = new StaticFun(); Sf1.setId(1001); System.out.println(“Identification =” + sf1.getId()); System.out.println(sf1.run()); } } StaticFun id = 1001 name setId(int) getId() : int run( ) sf1
  • 8. บทที่ 5 คลาสและออบเจ็ค หนาที่ 128 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ ผลลัพธที่ไดจากการรัน : Identification = 1001 Print from method run() ตัวแปรที่อยูภายในคลาสมี 2 ประเภทคือ 1. instance variable หมายถึง เปนตัวแปรที่ประกาศไวเปน attribute ของ classes และอยูนอก methods และ constructors ตัวแปรชนิดนี้จะถูกกําหนดคาตั้งตนใหโดยอัตโนมัติถึงแมวาเราจะ ไมไดกําหนดไวโดยจะมีคาดังนี้ object reference = null byte, short ,int ,long = 0 float , double = 0.0 Boolean = false char = ‘u000’ ตัวอยาง Instance variables public class BirthDate{ int year ; // Instance variable public static void main(String args[]){ BirthDate bd = new BirthDate(); bd.showYear(); } public void showYear(){ System.out.println(“The year is” + year); } } ตัวแปร year จะถูกกําหนดคาใหเปน 0 โดยอัตโนมัติ ผลลัพธที่ได The year is 0
  • 9. บทที่ 5 คลาสและออบเจ็ค หนาที่ 129 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ 2. local variable หมายถึง ตัวแปรที่ประกาศไวเปน method หรือ constructors ตัวแปรพวกนี้เรา จะตองกําหนดคาตั้งตนหรือใหคาไวกอนที่เราจะนําไปใชประมวลผลใดๆ ดังตัวอยาง ตัวอยาง public class TimeTravel{ public static void main(String args[]){ int date; // local variable:ประกาศแตไมไดกําหนดคาเริ่มตน System.out.println(“The date is ”+ date); // compiler error } } ตัวแปร year จะไมถูกกําหนดคาตั้งตนอัตโนมัติให เมื่อนําไปใชก็จะเกิดขอผิดพลาด ขณะทําการคอมไพล ตัวอยาง public class TimeTravel{ public static void main(String args[]){ int date = 29052007; // local variable:ประกาศพรอมกําหนดคาเริ่มตน System.out.println(“The date is ”+ date); } } ผลลัพธที่ไดคือ The date is 29052007 การสงขอมูลดวยคาของตัวแปร(Pass by value-copy) ในการเรียกใชงานเมธอดบางครั้งจําเปนตองสงคาไปยัง method ที่เรียกใชงานโดยผานคลาสดัง ตัวอยางตอไปนี้ซึ่งตัวแปรที่เรียกใชงานจะเปนการสงเฉพาะคาของตัวแปรเทานั้น หากกลับมายัง method main หรือ method ที่เรียกใชงานจะไมทําใหคานั้นเปลี่ยนแปลง Java จะสงใน Parameter ของ Method ในลักษณะ copy คาของตัวแปรแลวสงไปให method เสมอ ดังตัวอยาง ตัวอยาง การสงขอมูลดวยคาของตัวแปร public class Test { static void setData(int a,int b){ a = 5;b = 10; } public static void main (String [] args) { int a = 50,b = 100;
  • 10. บทที่ 5 คลาสและออบเจ็ค หนาที่ 130 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ System.out.println(“a=“+a+” b=“+b); setData(a,b); System.out.println(“a=“+a+” b=“+b); } } ผลลัพธที่ได 50 100 50 100 การสงขอมูลดวยวัตถุ(Pass by reference) ในกรณีที่ Parameter ของ Method เปน Object Variable ก็จะเปนการ copy คา Reference ของ Object ดังตัวอยางตอไปนี้ ตัวอยาง การสงพารามิเตอรที่มีชนิดเปน object variable public class Test { int data; static void setData(Test a){ a.data = 50; } public static void main (String [] args) { Test a = new Test(); a.data = 10; System.out.println(“a=“+a.data); setData(a); System.out.println(“a=“+a.data); } } ผลลัพธที่ได: 10 50
  • 11. บทที่ 5 คลาสและออบเจ็ค หนาที่ 131 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ Date -day : String -month : String -year : int +setDay(int) : void +setMonth(String a) : void +setYear(int ) : void +getDay( ) : int +getMonth( ) : String +getYear( ) : int +printDate() : void คอนสตรัคเตอร(Constructor) คอนสตรัคเตอรเปนสวนที่ใชในการกําหนดคาเริ่มตนใหกับแอทริบิวตตางๆ ของออบเจ็ค โดย คอนสตรัคเตอรจะถูกเรียกใชใหทํางานโดยอัตโนมัติเมื่อเราสรางออบเจ็คขึ้นจากคลาสดวยคียเวิรด new แมวา instances ของคลาสเดียวกันจะมีโครงสรางและสมาชิกเหมือนกัน แตคาใน field ตางๆ ของแตละ instances อาจจะตางกันได ภาษาเชิงวัตถุจึงมีวิธีการกําหนดคาเริ่มตนใหแก fields ตางๆ ในขณะที่สรางแตละ instances ขึ้นมา โดยใชสิ่งที่เรียกวา constructor ซึ่ง constructor นี้มีก็คือ method ที่ มีชื่อเดียวกันกับคลาสนั้น โดยในสวนของ modifier ของ constructor จะมี default เปน public ดังนั้นจึง ไมจําเปนตองใส modifier ไวหนา constructor หากจําเปนตองใสก็สามารถกําหนดเปน public ไดเทานั้น เนื่องจากคอมไพเลอรของ Java จะไมยอมให constructor เปน private มิเชนนั้นจะไมสามารถเรียกใชงาน constructor ได และ constructor จะถูกเรียกใชเสมอเมื่อมีการสราง instance ดังนั้นจําเปนตองประกาศ constructor เปน public ในการสราง instance ขึ้นดวยการ new นี้เองที่ constructor ของคลาสนั้นถูกเรียกคลายกับ methods ทั่วไป ซึ่งอาจมีการสงพารามิเตอรใหแก constructor นําไปใชในการกําหนดคาเริ่มตนใหแก fields ใน instance นั้นไดดวย ผลของการ new ทําให instance ที่ถูกสรางขึ้นมี reference ถูกสงออกมา เสมอ ดวยเหตุนี้ constructor จึงไมสามารถสงคาอยางอื่นออกมา ทําใหในการเขียนโปรแกรมของ constructor ไมตองระบุชนิดขอมูลของคาที่จะสงออกมากํากับหนาชื่อ constructor หรือระบุเปน void และในตัวโปรแกรมของ constructor จะมีประโยคที่ return คาออกมาไมได
  • 12. บทที่ 5 คลาสและออบเจ็ค หนาที่ 132 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ ตัวอยาง แสดง class ที่มีการกําหนด constructor ในคลาสหนึ่งอาจมี constructor ไดมากกวาหนึ่งตัว สังเกตวา constructors เหลานี้ชื่อเหมือนกัน แตมีพารามิเตอรตางกัน จุดประสงคก็เพื่อใหสามารถกําหนดคาเริ่มตนสําหรับการสราง instance ได หลายแบบ และในภาษา java และ C++ เรียกการที่ method มีชื่อเหมือนกันแตพารามิเตอรตางกันอยางนี้ วา overloading ซึ่งหมายถึงการใชงานชื่อ methods นั้นมากกวาหนึ่งหนาที่ การใชงาน overload constructor นั้นทําไดโดยการเรียกใช constructor และสงพารามิเตอรที่ตองการเหมือนปกติที่เคยใชงาน method สวนจะเปน constructor ใดที่ถูกเรียกใชงานนั้นคอมไพเลอรจะเปนผูเลือกใหเอง โดยพิจารณา จากพารามิเตอรที่สงไป ภาษา Java กําหนดไววา ทุกคลาสจะตองมี constructor อยางนอยหนึ่งตัว แตจากตัวอยางที่เคย ศึกษามาคลาสตางๆไมมี constructor ซึ่งจากการ compile และ run โปรแกรมไมพบ error ใดๆ เนื่องจาก หากไมไดกําหนด constructor ใหแกคลาสใดๆก็ตาม คอมไพเลอรก็จะสราง empty constructor หรือ class MyDate { String day ; String month; int year; MyDate ( ) { // หากประกาศ constructor อื่นแลว ไมประกาศempty constructor จะเกิด error เมื่อสราง instance ปกติ // เชนมีการเรียกใช new MyDate(); จะเกิด error ได day = null; month = null; year = 0; } MyDate(String d , String m , int y){ day = d; month = m; year = y; } MyDate (MyDate d){ day = d.day; month = d.month; year = d.year; } void setDay(String d){ day = d; } ……. …… void printDate(){ System.out.println(day + “ : ” + month + “ :” + year); }
  • 13. บทที่ 5 คลาสและออบเจ็ค หนาที่ 133 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ default constructor (constructor ที่ไมมีพารามิเตอร เชน MyDate() ) ใหแก class นั้นๆ ซึ่งหาก fields ใน คลาสเปนขอมูลพื้นฐาน(primitive data type) จะถูกกําหนดใหมีคาเริ่มตนเปนคา default ตามชนิดของ ขอมูล แตหากเปน fields ของ array , String หรือ refence(instance of object) จะถูกกําหนดคาเริ่มตนให เปน null ตัวอยาง แสดง class ที่มีการสราง instance หนึ่งของ class MyDate จากตัวอยางกอนหนา สรุปไดวา - ขณะที่ Object ถูกสรางนั้น Constructors อันใดอันหนึ่งจะถูกเรียกเสมอ - โดยชื่อของ Constructors ตองเปนชื่อเดียวกับชื่อ Class - Constructors จะตองไมมี return type หนาชื่อ method (หากวามีจะถือวาไมเปน Constructors หากแตเปน method ธรรมดา) - คลาสหนึ่งๆอาจจะมี Constructor หลายๆตัวได แตตองมี Argument ตางกันเรียกวา Overloading Constructors class test { public static void main(String[] args) { MyDate x = new MyDate("Sunday","January", 2006); MyDate y = new MyDate(x); y.printDate(); new MyDate(); new MyDate().printDate(); new MyDate("Monday" , "February" , 2006).printDate(); } } ผลลัพธที่ไดคือ Sunday:January:2006 null:null:0 Monday:February:2006
  • 14. บทที่ 5 คลาสและออบเจ็ค หนาที่ 134 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ Constructors แบงออกเปน 2 ชนิดคือ – Empty Constructor คือ Constructor ที่ไมมี Argument ใดๆเลย – Copy Constructor คือ Constructor ที่มี Argument ตัวอยาง คอนสตรัคเตอร public class A { public A() { ....... } // empty constructor public A(int i) { ....... } // copy constructor } คุณลักษณะของ Constructors o ทุกๆ class จะตองมีอยางนอย 1 constructor เสมอ o หากไมมีการระบุ constructor ใดๆเลย compiler จะใส empty constructor ใหโดยอัตโนมัติ คลาสที่สราง public class A { int i=0; } = คอมไพลเลอรสรางให public class A{ public A() { } // Compiler จัดให int i=0; } คลาสที่สราง public class A { public A(int i){ } int i=0; } คอมไพลเลอร public class A { public A(int i){ } int i=0; } =
  • 15. บทที่ 5 คลาสและออบเจ็ค หนาที่ 135 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ Static data member data member ที่ถูกกําหนดใหเปน static จะเปนการขอจองพื้นที่หนวยความจําเดียวกันใหกับคา ของตัวแปรนั้น แมวามีการสราง instance ใหมอีกกี่ครั้งก็ตาม ดังตัวอยางตอไปนี้แสดงใหเห็นวา i เปน ตัวแปร static หากมีการสราง instance ใหมขึ้นแลวจะมีผลตอการทํางานดังนี้ ในการประกาศให instance variable หรือ method เปน static นั้น สามารถถูกเรียกใชโดยไมตอง สราง object ของ class เจาของกอน โดยใหชื่อ class ตามดวย instance variable หรือ method ในการ เขาถึง เชน Student.id = 10 ; Student.setId(10); class StaticTest { static int i = 47; // static data member } class testData{ public static void main(String[] args){ StaticTest st1 = new StaticTest(); StaticTest st2 = new StaticTest(); System.out.println("before StaticTest.i++"); System.out.println("StaticTest.i = " + StaticTest.i); StaticTest.i++; System.out.println("after StaticTest.i++"); System.out.println("st1.i = " + st1.i); System.out.println("st2.i =" + st2.i); System.out.println("StaticTest.i =" + StaticTest.i); } } ผลลัพธที่ได before StaticTest.i++ StaticTest.i = 47 after StaticTest.i++ st1.i = 48 st2.i = 48 StaticTest.i = 48 //เปนที่นาสังเกตวา ตัวดําเนินการ ++ ทําใหเพิ่มคาของตัวแปรไดทั้ง st1.i และ st2.i เพราะ ตางก็มีคา 48.
  • 16. บทที่ 5 คลาสและออบเจ็ค หนาที่ 136 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ ตัวอยาง public class StaticDataTest { static int data;// data เปน static data member int value;// value เปน data member static void setDataOne(StaticDataTest a){//setDataOne เปน static method a.data = 50; } static void setDataTwo(int data){//setDataTwo เปน static method data =100; } static void setDataThree(int b){// setDataThree เปน static method data = 200; } public static void main (String [] args) { StaticDataTest a = new StaticDataTest(); a.data = 10; System.out.println("a= "+a.data); setDataOne(a); // static method สามารถเรียกใชไดโดยไมตองสรางinstance System.out.println("a= "+a.data); setDataTwo(a.data); System.out.println("a= " +a.data); setDataThree(a.data); System.out.println("a= "+ a.data); System.out.println("After new B"); StaticDataTest b = new StaticDataTest(); System.out.println("b =" + b.data); System.out.println("a =" + a.data); System.out.println("StaticDataTest.data= " + StaticDataTest.data); // StaticDataTest.data เปน static data ทําใหสามารถเรียกผาน class ไดเลยโดยไมตองสราง instance //System.out.println("StaticDataTest.data= " + StaticDataTest.value); //error }}
  • 17. บทที่ 5 คลาสและออบเจ็ค หนาที่ 137 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ ผลลัพธที่ได : a= 10 a= 50 a= 50 a= 200 After new B b =200 a =200 StaticDataTest.data= 200 จากตัวอยาง หากนํา comment บันทัดสุดทายออกจะเกิด error เพราะ value เปน data member ที่ ไมใช static ไมสามารถเรียกผาน class ได ตองกําหนดคาผาน method เทานั้น สังเกตุวาถึงแมจะสราง object ขึ้นมา instance variable และ method ที่ประกาศเปน static ก็จะ เปนตัวเดียวกัน Static method Method ที่ถูกระบุเปน static method จะสามารถเรียกใชไดภายในคลาสเดียวกันไดเลยและตอง เปน method ที่เปน static ดวยกันเชน main() ถาเรียกใชนอกคลาสจะสามารถเรียกไดโดยผานชื่อคลาสได เลยไมตองสราง instance ขึ้นมา ตางจาก method ทั่วไปที่ตองสราง instance ขึ้นมากอน o Static Members หมายถึงสมาชิก(attribute และ method)ที่สามารถใชงานใด แมวา Class นั้นๆ จะยังไมถูกนําไปสรางเปน Object และหาก class นั้นถูกนําไปสรางเปน Object ไมวาจะกี่ instance เมื่ออางอิงถึง Static Member ก็จะเปนการอางอิงที่ตัวเดียวกัน o Code ภานใน Static Method นั้นจะอางอิงไดแต static members ดวยกันหรือ local variable เทานั้น วิธีการเรียกใชงาน method ที่ถูกกําหนดใหเปน static รูปแบบ : ClassName.method( ); เชน Student.setId(5);
  • 18. บทที่ 5 คลาสและออบเจ็ค หนาที่ 138 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ ตัวอยางโปรแกรม class StaticTest { static int i = 47; // static data member} class StaticFun { static void incr() { StaticTest.i++; } } จากตัวอยาง class StaticFun ประกอบไปดวย method ที่ชื่อ incr() ซึ่งเปน static method และ มี i เปน static data member ดวย เมื่อเรียกใชงานเมธอด incr() สามารถเรียกใชงานผานอ็อบเจ็กไดดังนี้ StaticFun sf = new StaticFun(); sf.incr(); หรือ เนื่องจาก method incr() เปน static method สามารถเรียกใชงาน class ไดโดยตรงดังนี้ StaticFun.incr(); ตัวอยางโปรแกรมที่สราง method ที่มีคียเวิรด static ใชงานเอง class testMethod{ static void print(String str){ // static method สามารถเรียกใชงานไดเลยโดยไมตองประกาศ instance System.out.println(); System.out.println(str); } static void printChar(char ch){ System.out.print(Character.toString(ch)); //converse character to String } static void printStar(int stp){ for ( int i = 0; i < stp ; i++ ){ printChar('*'); } }
  • 19. บทที่ 5 คลาสและออบเจ็ค หนาที่ 139 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ public static void main(String[] args){ printStar(5); print("Hello"); printStar(10); testMethod.print(“print from call class”); } } ผลลัพธที่ได ***** Hello ********** print from call class ตัวอยางโปรแกรมที่ java compiler ทําการ import class ที่อยูใน java.lang เขามาอัตโนมัติทําใหตอนเขียน โปรแกรม ไมตอง import java.lang.* เขามายังสวนตนของโปรแกรม ทําใหสามารถเรียกใช เมธอดใน คลาส Math ที่เก็บไวในแพ็คเกจ java.lang ได ซึ่งจะกลาวถึงเรื่องแพ็คเกจในบทที่ 7 และทําการศึกษา คลาส Math เพิ่มเติมไดในภาคผนวก class testMethodMathClass{ public static void main(String[] args){ double ansD1 , ansD2 , ansD3 ; double t1 = 9.9 , t2 = 9.5 , t3 = 9.2; //การเรียกใช method Math.ceil เพื่อทําการปดทศนิยมขึ้น ansD1 = Math.ceil(t1); ansD2 = Math.ceil(t2); ansD3 = Math.ceil(t3); System.out.println("Show answer from CEIL function"); //การเรียกใช method Double.toString เพื่อทําการแปลงคาของ double ใหเปน String System.out.println(Double.toString(ansD1)); System.out.println(Double.toString(ansD2)); System.out.println(Double.toString(ansD3));
  • 20. บทที่ 5 คลาสและออบเจ็ค หนาที่ 140 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ //การเรียกใช method Math.floor เพื่อทําการปดทศนิยมทิ้ง ansD1 = Math.floor(t1); ansD2 = Math.floor(t2); ansD3 = Math.floor(t3); System.out.println("Show answer from FLOOR function"); System.out.println(Double.toString(ansD1)); System.out.println(Double.toString(ansD2)); System.out.println(Double.toString(ansD3)); //การเรียกใช method Math.floor เพื่อทําการปดทศนิยมหากเกิน 5 ปดเศษขึ้น ต่ํากวา 5 ปดเศษทิ้ง ansD1 = Math.round(t1); ansD2 = Math.round(t2); ansD3 = Math.round(t3); System.out.println("Show answer from ROUND function"); System.out.println(Double.toString(ansD1)); System.out.println(Double.toString(ansD2)); System.out.println(Double.toString(ansD3));}} ผลลัพธที่ได Show answer from CEIL function 10.0 10.0 10.0 Show answer from FLOOR function 9.0 9.0 9.0 Show answer from ROUND function 10.0 10.0 9.0 หมายเหตุ Prototype ของ method ทั้ง 3 method ที่อยูใน class Math แสดงไดดังนี้ 1. public static double ceil(double argument) 2. public static double round(double argument) 3. public static double floor(double argument)