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
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('*');
}
}