java programming:...

109
บทท 6 การพฒนาโปรแกรมภาษาจาวาเชงออบเจกต (Object Oriented Java Programming) ผศ.ธนศา เคร$อไวศยวรรณ คณะเทคโนโลย.สารสนเทศ สถาบนเทคโนโลย.พระจอมเกล5าเจ5าค6ณทหารลาดกระบง

Upload: thanachart-numnonda

Post on 12-Jan-2015

6.876 views

Category:

Documents


0 download

DESCRIPTION

แนะนำการเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์ โดยแนะนำการใช้เมธอด การใช้ constructor การเขียนโปรแกรมโดยใช้คุณลักษณะเด่นของโปรแกรมเชิงอ็อบเจกต์ อาทิเช่น การห่อหุ้ม การสืบทอด และการมีได้หลาย รูปแบบ เป็นต้น จากนั้นจะเป็นการแนะนำคลาสภายใน Generic Type และ Annotation

TRANSCRIPT

Page 1: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

บทท�� 6

การพ�ฒนาโปรแกรมภาษาจาวาเช�งอ�อบเจกต� (Object Oriented Java Programming)

ผศ.ธน�ศา เคร$อไวศยวรรณคณะเทคโนโลย.สารสนเทศ

สถาบ�นเทคโนโลย.พระจอมเกล5าเจ5าค6ณทหารลาดกระบ�ง

Page 2: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ว�ตถ�ประสงค�อธ�บายเมธอด และการเร�ยกใช$เมธอดอธ�บายค�ย�เว�ร�ดท��ใช$เป%น modifier ของเมธอดแนะน'าการเข�ยนโปรแกรมภาษาจาวาเช�งอ�อบเจกต�อธ�บายค�ณล�กษณะเด=นของโปรแกรมเช�งอ�อบเจกต�อธ�บายความหมายของ Constructor แนะนDาคลาสประเภท Wrapper อธ�บายเมธอดของคลาสท.Fช$Fอ Object ค.ยGเว�รGดอ$Fนๆ ท.FสDาค�ญ แนะนDาคลาสภายใน Generic และ คDาส�Fง Annotation

Page 3: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

รKปแบบการเร�ยกใช$เมธอดร*ปแบบของคDาส�Fงท.Fม.การเร.ยกใช5เมธอดเปLนด�งน.M obj.methodName([arguments]); arguments อาจจะเปLนข$อม*ลค+าคงท��หร-อต�วแปรชน�ดข5อมKลของ arguments ท.Fใช5ในการเร.ยกเมธอด จะต$องสอดคล$องก�น

ก�บชน�ดข5อมKลของ arguments ของเมธอด

Page 4: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

การเร.ยกใช5เมธอดเมธอดท.FกDาหนดขNMนในคลาสใดๆสามารถเร.ยกใช5งานได5สองรKปแบบค$อ

• การเร.ยกใช5งานจากคลาสท.Fต=างก�น• การเร.ยกใช5งานภายในคลาสเด.ยวก�น

การเร.ยกใช5เมธอดจากคลาสท.Fต=างก�น จะต5องม.การสร5างอPอบเจกตGของคลาสท.Fม.เมธอดท.FจะถKกเร.ยกใช5งานก=อน จNงจะสามารถเร.ยกใช5เมธอดได5

การเร.ยกใช5เมธอดภายในคลาสเด.ยวก�น ในบางกรณ.จะสามารถทDาได5โดยไม=จDาเปLนต5องสร5างอPอบเจกตGของคลาสขNMนมาก=อน และสามารถเร.ยกเมธอดได5ท6กเมธอด

Page 5: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมท��ม.การเร.ยกใช5เมธอดจากคลาสต=างก�น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");}

}}

Page 6: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมท��ม.การเร.ยกใช5เมธอดจากคลาสต=างก�น

public class MyMain {public static void main(String args[]) {

NumericalClass obj = new NumericalClass();obj.calculate();

}}

Page 7: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมท��ม.การเร.ยกใช5เมธอดในคลาสเด.ยวก�น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();}

}

Page 8: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

การส=งผ+าน argumentกรณ�ท��เมธอดม� argument ท��จะร�บค+าเพ$FอนDาไปใช5ในเมธอด อาท�เช+น

public void setGPA(double GPA) {...

}ค'าส��งท.Fเร�ยกใช5เมธอดน�0 จะต$องส+ง argument ท.Fม.ชน�ดข5อมKลเปLน double

ไปพร5อมก�บช$Fอเมธอด เช=น setGPA(3.0);

Page 9: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรม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);

}}

Page 10: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

argument ของเมธอดargument ของเมธอดจะม.ชน�ดข5อมKลเปLนสองแบบตามชน�ดข5อมKลของ

ต�วแปรด�งน.M • argument ท.Fม.ชน�ดข5อมKลแบบพ$Mนฐาน • argument ท.Fม.ชน�ดข5อมKลแบบอ5างอ�ง

ในกรณ.ของ argument ท.Fม.ชน�ดข5อมKลแบบพ$Mนฐาน เราสามารถท.Fจะส=งค=าคงท.Fข5อมKล ต�วแปร หร$อน�พจนGให5ก�บ argument ได5 ต�วอย=างเช=น• ค=าคงท.Fข5อมKล เช=น

s1.setGPA(3.0);• ต�วแปร เช=น

double x = 3.0; s1.setGPA(x);

• น�พจนG เช=นs1.setGPA(3.0+0.05);

Page 11: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

argument ท��ม�ชน�ดข$อม*ลแบบอ$างอ�ง เราจะต5องส=งอPอบเจกตGท.Fม.ชน�ดข5อมKลท.Fสอดคล5องไปเท=าน�Mน ยกเว5นกรณ.ท.F argument น�Mนม.ชน�ดข5อมKลเปLน String ซNFงในกรณ.น.Mจะ

สามารถส=งข5อมKลค=าคงท.Fได5

Page 12: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมท��ม.การส=ง argument ท.FเปLนอPอบเจกตGpublic class StudentV1 {

String id; String name; MyDate dob; public void setDOB(MyDate d) {

dob = d;}public MyDate getDOB() { return dob;}

}------------------------------------------------------------------------------------------public class TestStudentV1 { public static void main(String args[]) {

StudentV1 s1 = new StudentV1(); MyDate d1 = new MyDate(16, 12, 1980); s1.setDOB(d1);

}}

Page 13: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมคลาส MyDatepublic 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); }}

Page 14: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ชน�ดข5อมKลและจDานวนของ argumentชน�ดข5อมKลของ argument ท.Fจะส=งผ=านไปย�งเมธอดไม=จDาเปLนท.Fจะต5องเปLน

ชน�ดข5อมKลเด.ยวก�น แต=ต5องเปLนชน�ดข5อมKลท.Fสามารถแปลงข5อมKลให5กว5างขNMนได5โดยอ�ตโนม�ต�

เมธอดใดๆอาจม. argument สDาหร�บร�บค=ามากกว=าหนNFงต�ว แต=การเร.ยกใช5เมธอดเหล=าน.Mจะต5องส=ง argument ท.Fม.ชน�ดข5อมKลท.Fสอดคล5องก�นและม.จDานวนเท=าก�น

Page 15: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมท��ม.การส=ง argument จDานวนสองต�วpublic class NumericalSample {

public void calMax(int i, double d) { if (i > d) {

System.out.println("Max = "+i); } else {

System.out.println("Max = "+d); }}public static void main(String args[]) { NumericalSample obj = new NumericalSample(); obj.calMax(3,4.0);}

}

Page 16: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

การเปล.Fยนแปลงค=าของ argumentการส=ง argument ท.Fม�ชน�ดข$อม*ลเป%นแบบพ-0นฐาน หากม�การเปล��ยนแปลงค+า

ของ argument ภายในเมธอดท��ถ*กเร�ยกใช$งาน จะไม+ม�ผลท'าให$ค+าของ argument ท��ส+งไปเปล��ยนค+าไปด$วย

การส=ง argument ท.Fม�ชน�ดข$อม*ลเป%นแบบอ$างอ�ง จะเป%นการส+งต'าแหน+งอ$างอ�งของอ�อบเจกต�ไปให$ก�บเมธอดท��ถ*กเร�ยกใช$งาน ด�งน�0นการเปล��ยนแปลงค+าของค�ณล�กษณะของอPอบเจกตGจะม�ผลท'าให$ค+าของค�ณล�กษณะของอ�อบเจกต�ท��ส+งไปเปล��ยนไปด$วย

Page 17: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมท��แสดงการเปล.Fยนแปลงค=าของ argument

public class ArgumentPassing {public void method1(int x) {

x = 3;}public void method2(MyDate d) {

d.setDay(1); d.setMonth(1); d.setYear(2002); }

public int method3() {return 0;

}

Page 18: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมท��แสดงการเปล.Fยนแปลงค=าของ argument

public static void main(String args[]) {int x = 4;

ArgumentPassing obj = new ArgumentPassing(); MyDate d1 = new MyDate(16, 12, 1980); obj.method1(x); System.out.println("x = " + x); obj.method2(d1); d1.showDetails(); obj.method3();

}}

Page 19: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

การร�บค=าท.Fส=งกล�บมาจากเมธอดเมธอดใดๆของคลาสสามารถท.Fจะม.ค=าท.Fส=งกล�บมาได5 ซNFงชน�ดข5อมKลของค=าท.F

จะส=งกล�บอาจเปLนชน�ดข5อมKลแบบพ$Mนฐาน หร$อเปLนชน�ดข5อมKลแบบอ5างอ�ง เมธอดท.Fม.ค=าท.Fจะส=งกล�บมาจะต5องม.คDาส�Fง return ซNFงจะระบ6ค=าท.Fส=งกล�บ

โดยม.รKปแบบด�งน.Mreturn value;

คDาส�Fงท.Fเร.ยกใช5เมธอด อาจจะร�บค=าท.Fส=งกล�บมาเกPบไว5ในต�วแปรหร$อเปLนต�วถKกดDาเน�นการในน�พจนG ต�วอย=างเช=น

double d = getGPA();System.out.println("GPA:"+getGPA());

Page 20: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

modifier ของเมธอดmodifier ของเมธอดประกอบด5วย

• access modifier• static• abstract• synchronized• final

access modifier ใช5เพ$Fอระบ6ระด�บการเข5าถNง โดยม.ค.ยGเว�รGดต=างๆด�งน.M• public• protected• private• default (ไม+ระบ�บ6ค.ยGเว�รGดใดๆ )

Page 21: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมท��แสดงการประกาศเมธอดและค6ณล�กษณะpublic class PrivateStudent { private String id; private String name; private double gpa; public void setDetails(String ID,String n,double GPA) {

id = ID;name = n;gpa = GPA;

} public void showDetails() { System.out.println("ID: "+id);

System.out.println("Name: "+name);System.out.println("GPA: "+gpa);

}}

Page 22: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมท��แสดงการประกาศเมธอดและค6ณล�กษณะ

public class TestPrivateStudent { public static void main(String args[]) {

PrivateStudent ps = new PrivateStudent(); /* ps.id = "12345"; illegal ps.name = "Thana"; illegal

ps.gpa = 3.25; illegal */ ps.setDetails("12345","Thana",3.25); ps.showDetails();

}}

Page 23: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

การเข.ยนโปรแกรมโดยใช5หล�กการของการห=อห65มค6ณล�กษณะเด=นของโปรแกรมเช�งอPอบเจกตGม.อยK=สามอย=างค$อ การห=อห65ม

การส$บทอด และการม.ได5หลายรKปแบบข5อด.ของการห=อห65มประการหนNFงค$อการซ=อนเร5นข5อมKล หล�กการห=อห65มของอPอบเจกตGทDาได5ด�งน.M

• กDาหนดค6ณล�กษณะของอPอบเจกตGให5ม. modifier เปLน private เพ$Fอซ=อนไม=ให5อPอบเจกตGอ$Fนๆเร.ยกใช5ได5

• กDาหนดเมธอดของอPอบเจกตGท.Fต5องการให5อPอบเจกตGอ$Fนๆเร.ยกใช5ให5ม. modifier เปLน public

Page 24: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมท.Fไม=ได5ใช5หล�กการของการห=อห65มpublic class Student {

String ID;String name;public double gpa;

}--------------------------------------------------------------------------------------------------public class NoEncapDemo {

public static void main(String args[]) {Student s1 = new Student();double temp = Double.parseDouble(args[0]);if ((temp<0) || (temp>4.00)) {

System.out.println("Incorrect Format!");} else {

s1.gpa = temp;System.out.println("GPA: "+s1.gpa);

}}

}

Page 25: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

เมธอดแบบ setterเมธอดแบบ accessor แบ=งออกได5เปLนสองประเภทค$อ

• เมธอดแบบ setter• เมธอดแบบ getter

เมธอดแบบ setter จะใช5ในการกDาหนดค=าของค6ณล�กษณะ โดยท�Fวไปช$Fอของเมธอดแบบ setter จะขNMนต5นด5วยคDาว=า set แล5วตามด5วยช$Fอ

ของค6ณล�กษณะ ซNFงม.รKปแบบด�งน.M public void setAttributeName(dataType arg) {

attributeName = arg; }

Page 26: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมท.Fใช5หล�กการของการห=อห65มpublic class Student {

String ID;String name;private double gpa;public void setGPA(double GPA) {

if ((GPA<0) || (GPA>4.00)) {System.out.println("Incorrect Format!");

} else {gpa = GPA;

}}public double getGPA() {

return gpa;}

}--------------------------------------------------------------------------------------------------public class EncapDemo {

public static void main(String args[]) {Student s1 = new Student();double temp = Double.parseDouble(args[0]);s1.setGPA(temp);System.out.println("GPA: "+s1.getGPA());

}}

Page 27: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

เมธอดแบบ getterเมธอดแบบ getter จะใช5ในการเร.ยกค=าของค6ณล�กษณะ โดยท�Fวไปช$Fอของเมธอดแบบ getter จะขNMนต5นด5วยคDาว=า get แล5วตามด5วยช$Fอ

ของค6ณล�กษณะ ซNFงม.รKปแบบด�งน.M public dataType getAttributeName() {

return attributeName; }

Page 28: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมท.Fใช5หล�กการของการห=อห65มpublic class EncapStudent {

private String id;private String name;private double gpa;public void setID(String ID) { id = ID;}public void setName(String n) { name = n;}public void setGPA(double GPA) {

if ((GPA<0) || (GPA>4.00)) {System.out.println("Incorrect Format!");

} else {gpa = GPA;

}}

Page 29: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมท.Fใช5หล�กการของการห=อห65มpublic String getID() { return id;}public String getName() { return name;}public double getGPA() {

return gpa;}

}

Page 30: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ค.ยGเว�รGด thisค.ยเว�รGด this หมายถNงอPอบเจกตGของต�วเอง เราสามารถท.Fจะเร.ยกใช5เมธอดหร$อค6ณล�กษณะภายในคลาสได5โดยใช5

ค.ยGเว�รGด this ซNFงม.รKปแบบด�งน.Mthis.methodName(); this.attributeName

โดยท�Fวไปเราจะไม=ใช5ค.ยGเว�รGด this ในคDาส�Fง ยกเว5นในกรณ.ท.FจDาเปLน

Page 31: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมการใช$ thispublic class ThisStudent {

private String id;private String name;private double gpa;public void setDetails(String id,String name, double gpa) {

this.id = id;this.name = name;this.gpa = gpa;

} public void showDetails() { System.out.println("ID: "+this.id);

System.out.println("Name: "+name);System.out.println("GPA: "+gpa);

}}

Page 32: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

การเข.ยนโปรแกรมโดยใช5หล�กการของการส$บทอดข5อด.ของการส$บทอดค$อ การนDาคลาสท.Fม.อยK=แล5วมาใช5ใหม=โดยการเพ�Fมเต�ม

ค6ณล�กษณะหร$อเมธอดในคลาสใหม= การพ�ฒนาคลาสขNMนใหม=ท.Fช$Fอ GradStudent สามารถท.Fจะเล$อกว�ธ.การได5

สองแบบค$อ • สร5างคลาสขNMนมาใหม=โดยไม=อ5างอ�งก�บคลาสเด�มท.Fช$Fอ Student • สร5างคลาสท.Fส$บทอดมาจากคลาสเด�มท.Fช$Fอ Student

Page 33: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมแสดงคลาสท.Fช$Fอ Studentpublic class Student { private String id;

private String name;private double gpa;public void setID(String ID) { id = ID;}public void setName(String n) { name = n;}public void setGPA(double GPA) { gpa = GPA;}public void showDetails() {

System.out.println("ID: "+id);System.out.println("Name: "+name);System.out.println("GPA: "+gpa);

}}

Page 34: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมท.Fไม=ได5ใช5หล�กการของการส$บทอดpublic class GradStudent {

private String id;private String name;private double gpa;private String thesisTitle;private String supervisor;public void setID(String ID) { id = ID;}public void setName(String n) { name = n;}public void setGPA(double GPA) { gpa = GPA;}

Page 35: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมท.Fไม=ได5ใช5หล�กการของการส$บทอดpublic void setThesisTitle(String t) { thesisTitle = t;}public void setSupervisor(String s) { supervisor = s;

}public void showThesis() {

System.out.println("ThesisTitle: "+thesisTitle);System.out.println("Supervisor: "+supervisor);

}}

Page 36: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมท.Fใช5หล�กการของการส$บทอดpublic class GradStudent extends Student {

private String thesisTitle;private String supervisor;

public void setThesisTitle(String t) { thesisTitle = t;}

public void setSupervisor(String s) { supervisor = s;

} public void showThesis() {

System.out.println("ThesisTitle: "+thesisTitle);System.out.println("Supervisor: "+supervisor);

}}

Page 37: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

รKปแสดงหล�กการของการส$บทอด

Page 38: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย=างการส$บทอดท.Fไม=ถKกต5องเราสามารถท.Fตรวจสอบหล�กการของการส$บทอดด5วยคDาว=า is a

public class Shirt {char size;float price;

}public class Skirt extends Shirt {

boolean long;}

Page 39: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย=างการส$บทอดท.FถKกต5อง

public class Clothing {char size;float price;

}public class Shirt extends Clothing {}public class Skirt extends Clothing {

boolean long;}

Page 40: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ค.ยGเว�รGด protectedค6ณล�กษณะหร$อเมธอดของ superclass ท.Fม. modifier เปLนแบบ private

จะทDาให5 subclass ไม=สามารถท.Fจะเร.ยกใช5ได5ภาษาจาวากDาหนดให5ม. access modifier ท.Fช$Fอ protected ซNFงจะทDาให5

subclass สามารถเร.ยกใช5เมธอดหร$อค6ณล�กษณะของ superclass ได5 ต�วอย=างเช=น

protected String name;

Page 41: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ค.ยGเว�รGด protectedภาษาจาวากDาหนดให5ม. access modifier ท.Fช$Fอ protected ซNFงจะทDาให5คลาสท.F

เปLน subclass สามารถท.Fจะเร.ยกใช5เมธอดหร$อค6ณล�กษณะของ superclass ได5 แม5ว=าจะอยK=ต=างคลาสหร$ออยK=ต=างแพคเกPจก�นกPตาม

modifier คลาสเด.ยวก�น

คลาสท.FอยK=ในแพจเกPจ

เด.ยวก�น

คลาสท.FเปLนsubcla

ssคลาสใดๆ

public√ √ √ √

protected√ √ √

default√ √

private√

Page 42: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย=างโปรแกรมท.Fใช5ค.ยGเว�รGด protected public class Student {

protected String id; protected String name; protected double gpa; public void setDetails(String ID,String n,double GPA) {

id = ID;name = n;gpa = GPA;

} public void showDetails() { System.out.println("ID: "+id);

System.out.println("Name: "+name);System.out.println("GPA: "+gpa);

}}

Page 43: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

คลาสท.Fช$Fอ Objectภาษาจาวาได5กDาหนดให5คลาสใดๆ สามารถจะส$บทอดคลาสอ$Fนได5เพ.ยง

คลาสเด.ยวเท=าน�Mน คลาสท6กคลาสในภาษาจาวาถ5าไม=ได5ส$บทอดจากคลาสใดเลยจะถ$อว=าคลาส

น�Mนส$บทอดจากคลาสท.Fช$Fอ Object ต�วอย=างเช=น

public class Student extends Object { ...

}คลาสท.Fช$Fอ Object จะม.เมธอดท.FสDาค�ญค$อ

public String toString() และ public boolean equals(Object o)

Page 44: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ค.ยGเว�รGด super super เปLนค.ยGเว�รGดท.Fใช5ในการอ5างอ�งถNง superclass เพ$Fอท.Fจะเร.ยกใช5

เมธอดหร$อ constructor ของ superclass โดยม.รKปแบบคDาส�Fงด�งน.Msuper.methodName([arguments])

ต�วอย=างเช=น คลาส GradStudent อาจม.เมธอดท.Fช$Fอ showDetails() โดยม.คDาส�Fงท.Fเร.ยกใช5เมธอด showDetails() ของคลาส Student และ showThesis() ของคลาส GradStudent

public void showDetails() { super.showDetails(); showThesis();

}

Page 45: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย=างโปรแกรมท.Fใช5ค.ยGเว�รGด superpublic class Student {

private String id;private String name;private double gpa;public void showDetails() { System.out.println("ID: "+id); System.out.println("Name: "+name); System.out.println("GPA: "+gpa);

}}

Page 46: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย=างโปรแกรมท.Fใช5ค.ยGเว�รGด super

public class GradStudent extends Student {private String thesisTitle;private String supervisor;

public void showDetails() { super.showDetails();

System.out.println("Thesis Title: "+ thesisTitle); System.out.println("Supervisor: "+supervisor);

}}

Page 47: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

การเข.ยนโปรแกรมโดยใช5หล�กการของการม.ได5หลายรKปแบบ

การม.ได5หลายรKปแบบหมายถNง ค6ณสมบ�ต�ของอPอบเจกตGของคลาสท.Fต=างก�นสามารถตอบสนองต=อเมธอดเด.ยวก�นในว�ธ.การท.Fต=างก�นได5 ซNFงหมายถNงการเข.ยนเมธอดแบบ overridden และการใช5 Dynamic Binding

การเข.ยนเมธอดแบบ overridden ม.ข5อกDาหนดด�งน.M • จDานวนและชน�ดข5อมKลของ argument จะต5องเหม$อนเด�ม• ชน�ดข5อมKลของค=าท.Fส=งกล�บจะต5องเหม$อนเด�ม• access modifier จะต5องไม=ม.ระด�บตFDากว=าเด�มอาท�เช=น ถ5าเมธอดเด�มเปLน public

จะไม=สามารถเปล.FยนเปLน private ได5

Page 48: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

Dynamic Bindingข5อด.ของการม.ได5หลายรKปแบบอ.กประการหนNFง ค$อการท.FสามารถกDาหนดอP

อบเจกตGได5หลายรKปแบบ ต�วอย=างเช=น จากรKปแบบSuperClass obj;

เราสามารถท.Fจะสร5างอPอบเจกตGท.Fช$Fอ obj ซNFงอาจเปLนอPอบเจกตGของคลาสท.FเปLน superclass หร$อท.FเปLน subclass ได5 โดยใช5คDาส�Fงท.Fม.รKปแบบด�งน.M

obj = new SuperClass(); หร$อ obj = new SubClass();

ต�วอย=างเช=น Student s;s = new GradStudent();

Page 49: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

รKปแสดงการม.ได5หลายรKปแบบต�วอย=าง

Student s1 = new Student(); Student s1 = new GradStudent();Student s1 = new PhDStudent();

Page 50: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

เมธอดแบบ Overloadedภาษาจาวาอน6ญาตให5คลาสใดๆม.เมธอดท.Fม.ช$Fอเด.ยวก�นมากกว=าหนNFงเมธอด

ได5 แต=เมธอดเหล=าน�Mนจะต5องม.จDานวนหร$อชน�ดข5อมKลของ argument ท.Fต=างก�น

ต�วอย=างต=อไปน.MเปLนการเข.ยนเมธอดแบบ overloaded ท.FถKกต5อง public void setDetails(String ID, String n) {}public void setDetails(String ID, double GPA) {}public double setDetails(double GPA, String n) {}

ต�วอย=างต=อไปน.MเปLนการเข.ยนเมธอดแบบ overloaded ท.Fไม=ถKกต5อง public void setDetails(String ID,double GPA) {}public void setDetails(String n,double GPA) {}

Page 51: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมแสดงเมธอดแบบ overloadedpublic class StudentV2 {

private String id;private String name;private double gpa; public void setDetails(String ID,String n) { id = ID; name = n;}public void setDetails(String ID,String n,double GPA) { id = ID; name = n; gpa = GPA;}

}

Page 52: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

เมธอดแบบ overriddenการกDาหนดเมธอดแบบ overridden เปLนหล�กการท.Fส$บเน$Fองมาจากหล�กการ

ของการส$บทอด โดยคลาสท.FเปLน subclass สามารถท.Fจะเข.ยนเมธอดของ superclass ขNMนใหม=ได5 ว�ธ.การน.Mเร.ยกว=า เมธอดใน subclass เปLนเมธอดแบบ overridden

การเข.ยนเมธอดแบบ overridden ม.ข5อกDาหนดด�งน.M • จDานวนและชน�ดข5อมKลของ argument จะต5องเหม$อนเด�ม• ชน�ดข5อมKลของค=าท.Fส=งกล�บจะต5องเหม$อนเด�ม• access modifier จะต5องไม=ม.ระด�บตFDากว=าเด�มอาท�เช=น ถ5าเมธอดเด�มเปLน public

จะไม=สามารถเปล.FยนเปLน private ได5

Page 53: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมแสดงเมธอดแบบ overriddenclass Student {

: public void showDetails() {

System.out.println("ID: "+id);System.out.println("Name: "+name);System.out.println("GPA: "+gpa);

}}public class GradStudentV2 extends Student {

: public void showDetails() {

super.showDetails();System.out.println("ThesisTitle: "+thesisTitle);System.out.println("Supervisor: "+supervisor);

}}

Page 54: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

Virtual Method Invocationโปรแกรมภาษาจาวาพ�จารณาเร.ยกใช5เมธอดจากชน�ดของอPอบเจกตGท.Fสร5าง

ขNMน ต�วอย=างเช=น คDาส�FงStudent s1 = new GradStudent(); s1.showDetails();

เปLนคDาส�Fงท.Fเร.ยกใช5เมธอด showDetails() ของคลาส GradStudent ไม=ใช=เมธอดของคลาส Student

แต=คอมไพเลอรGของภาษาจาวาจะไม=อน6ญาตให5เร.ยกใช5เมธอดใดๆกPตามท.Fไม=ม.การประกาศอยK=ในเมธอดของ superclass ท.FกDาหนดไว5 ต�วอย=างเช=น

Student s1 = new GradStudent();s1.getSupervisor(); // Fail to compile

Page 55: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

การส+งผ+าน argument ได5หลายรKปแบบในกรณ.ท.Fเมธอดม. argument เปLนข5อมKลชน�ดคลาส เราสามารถท.Fจะส=ง อP

อบเจกตGของคลาสท.FเปLน subclass ของคลาสน�Mนแทนได5 ต�วอย=างเช=น คDาส�FงStudent s1 = new Student();PhDStudent s2 = new GradStudent();

เราสามารถท.Fจะเร.ยกใช5เมธอด printInfo(Student s)ได5หลายรKปแบบด�งน.M

printInfo(s1)printInfo(s2)

หร$อ printInfo(new FullTimeStudent())

Page 56: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วด'าเน�นการ instanceofค�ย�เว�ร�ด instanceof เป%นต�วด'าเน�นการท��ใช$ก�บอ�อบเจกต�และคลาส เพ-�อ

ตรวจสอบว+าเป%นอ�อบเจกต�ของคลาสน�Mนหร$อไม= โดยจะให$ผลล�พธ�เป%นข$อม*ลชน�ด boolean

ถ5าได5ผลล�พธ�เป%น true แสดงว=าอPอบเจกตGเป%นของคลาสน�0นหร-อเปLนของคลาสท��คลาสน�Mนส-บทอดมา

ต�วอย+างเช+นGradStudent s1 = new GradStudent();

(s1 instanceof GradStudent) → true (s1 instanceof Student) → true (s1 instanceof Object) → true (s1 instanceof String) → Compilation fail!

Page 57: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างเมธอดท.Fแสดงการใช5 instanceof public void printInfo(Student s) { if (s instanceof PhDStudent) {

System.out.println("PhD Student"); } else if (s instanceof GradStudent) {

System.out.println("Graduate Student"); } else if (s instanceof FullTimeStudent) {

System.out.println("Full-Time Student"); } else if (s instanceof PartTimeStudent) {

System.out.println("Part-Time Student"); } else if (s instanceof Student) { System.out.println("Student"); } }

Page 58: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

การ Casting อ�อบเจกต�การ Casting อ�อบเจกต�จะทDาให5ต�วแปรของ subclass สามารถท.Fจะอ$างอ�งถ4ง

อ�อบเจกต�ของ subclass ผ=านต�วแปรของ superclass ได5 อาท�เช=นStudent s1 = new GradStudent();GradStudent s2 = (GradStudent)s1;

ภาษาจาวาจะตรวจสอบชน�ดของอ�อบเจกต�ในช+วงของการร�นโปรแกรม ด�งน�0นต�วแปรของ subclass จะไม=สามารถอ$างอ�งถ4งอ�อบเจกต�ของ superclass ได5 แม5ว=าจะทDาการ casting อ�อบเจกต�แล5วกPตาม อาท�เช=น

Student s1 = new Student();GradStudent s2 = (GradStudent)s1;// คอมไพลGผ=านได5 แต=จะเก�ดข5อผ�ดพลาดในช=วงของการร�นโปรแกรม

Page 59: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

การเร�ยกใช$เมธอดของอ�อบเจกต�การเร.ยกใช5เมธอดของอPอบเจกตGท.FทDาการ casting ภาษาจาวาจะตรวจสอบ

ชน�ดของอPอบเจกตGในช=วงของการร�นโปรแกรม ว=าอPอบเจกตGด�งกล=าวเปLน อPอบเจกตGของคลาสใด และคลาสน�Mนม.เมธอดท.Fเร.ยกใช5หร$อไม= หากไม=พบกPจะเก�ดข5อผ�ดพลาดในช=วงของการร�นโปรแกรม ต�วอย=างเช=นStudent s1 = new Student();

((GradStudent) s1).getSupervisor();// คอมไพลGผ=านได5 แต=จะเก�ดข5อผ�ดพลาดในช=วงของการร�นโปรแกรม

Page 60: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมแสดงการเร.ยกใช5เมธอด public class Student {

private String id;private String name;private double gpa;public String getID() { return id;}public String getName() { return name;}public double getGPA() { return gpa;}

}

Page 61: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมแสดงการเร.ยกใช5เมธอด public class GradStudent extends Student {

private String thesisTitle;private String supervisor;public String getThesisTitle() {

return thesisTitle;}public String getSupervisor() { return supervisor;}

}

Page 62: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมแสดงการเร.ยกใช5เมธอด public class TestCallingMethods {

public static void main(String args[]) {Student s1 = new GradStudent();s1.getSupervisor();// compile errorStudent s2 = new Student();((GradStudent) s2).getSupervisor();// runtime error

} }

Page 63: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

Constructorconstructor เป%นเมธอดท��ม�ช-�อเด�ยวก�บช-�อคลาส ซNFงม.รKปแบบด�งน.M

[modifier] ClassName([arguments]) {[statements]

}constructor เปLนเมธอดท.Fไม=ม.ค=าท.Fจะส=งกล�บแต=ไม=ต5องระบ6ค.ยGเว�รGด voidโดยท��วไปคลาสท�กคลาสจะม� default constructor ซNFงม.รKปแบบด�งน.M

public ClassName() {}

เราสามารถท��จะเข�ยน constructor ในคลาสใดๆขNMนมาก�ได$ default constructor จะหายไปเม-�อม�การเข�ยน constructor ข40นใหม+

Page 64: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมแสดงการเร.ยกใช5 constructorpublic class Student {

private String id;private String name;public Student(String ID,String n) { id = ID; name = n;}

}public class TestConstructor {

public static void main(String args[]) { Student s = new Student(); //illegal Student s = new Student("1122","Somchai");}

}

Page 65: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ค'าส��ง new()ม�ข�0นตอนการท'างานด�งน�0

• ก'าหนดเน-0อท��ในหน+วยความจ'าให$ก�บอ�อบเจกต�• ก'าหนดค+าเร��มต$นให$ก�บค�ณล�กษณะของอ�อบเจกต�• กDาหนดค=าของค6ณล�กษณะของอPอบเจกตGตามคDาส�FงกDาหนดค=าท.Fประกาศไว5 • เร�ยกใช$ constructor

ต�วอย=างเช=น public class MyDate {

private int day = 1; private int month = 1; private int year = 2000; public MyDate(int d,int m,int y) {

day = d;month = m; year = y;

} }

Page 66: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

รKปแสดงต�วอย=างการทDางานข�MนตอนคDาส�Fง newคDาส�Fง

MyDate d1 = new MyDate(16,8,1972);

ข�Mนตอนท.FหนNFง ข�Mนตอนท.Fสอง

ข�Mนตอนท.Fสาม ข�Mนตอนท.Fส.F

Page 67: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

Constructor แบบ Overloadedเราสามารถท.Fจะสร5าง constructor แบบ overloaded ของคลาสได$constructor แบบ overloaded จะม�จ'านวนหร-อชน�ดข$อม*ลท��แตกต+างก�นของ

argumentsค'าส��ง new ท.Fใช5ในการสร5างอPอบเจกตGจะเร.ยกใช5 constructor ท.Fม. argument

ท.Fส=งผ=านมาสอดคล5องก�บ constructor ท.FกDาหนด ข5อด.ของการสร5าง constructor แบบ overloaded ค$อทDาให5เราสามารถท.F

สร5างอPอบเจกตGเร�Fมต5นได5หลายรKปแบบเมธอดท.Fช$Fอ this() เปLนการเร.ยกใช5 constructor ของคลาสต�วเอง โดยจะ

ต5องเปLนคDาส�Fงแรกส6ดท.FอยK=ใน constructor แบบ overloaded

Page 68: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมแสดง constructor แบบ overloadedpublic class Student {

private String id;private String name;private double gpa;public Student(String ID,String n) { id = ID; name = n;}public Student(String ID,String n,double GPA) { id = ID; name = n; gpa = GPA;}

}

Page 69: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

เมธอด this() เมธอดท.Fช$Fอ this() เปLนการเร.ยกใช5 constructor ของคลาสต�วเอง โดยจะ

ต5องเปLนคDาส�Fงแรกส6ดท.FอยK=ใน constructor แบบ overloaded

Page 70: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมแสดงการใช5เมธอด this() public class Student {

private String id;private String name;private double gpa;public Student(String ID,String n) {

id = ID; name = n;}public Student(String ID,String n,double GPA) { this(ID,n); gpa = GPA;}

}

Page 71: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

เมธอด super()constructor ของ superclass จะไม+ส-บทอดมาย�ง subclassเราสามารถท.Fจะเร.ยกใช5 constructor ของ superclass ได5โดยใช5เมธอดท.Fช$Fอ

super() โดยส=งผ=าน argument ท.Fสอดคล5องก�น เมธอด super() จะต5องเปLนคDาส�Fงแรกของ constructor เช=นเด.ยวก�บ

เมธอดท.Fช$Fอ this() โดยท�FวไปการทDางานของ constructor ของคลาสใดๆจะม.ผลทDาให5ม.การ

เร.ยกใช5 constructor ของ superclass น�Mน ซNFงถ5าไม=ม.คDาส�Fง super() อยK=ในคDาส�Fงแรกของ constructor ของคลาสน�Mน ภาษาจาวาจะเร.ยกใช5 constructor แบบ default ของ superclass น�Mนโดยอ�ตโนม�ต�

Page 72: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างการเร.ยกใช5 constructor ของ superclasspublic class StudentV1 {

protected String name;public StudentV1(String n) {

name = n;}

}------------------------------------------------------public class GradStudentV1 extends StudentV1 {

public GradStudentV1(String n) {name = n; /* compile error

should be super(n) */}

}

Page 73: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ข�0นตอนการท'างานของ constructor• ถ5าม.คDาส�Fง this() ใน constructor กPจะเร.ยกใช5 constructor แบบ

overloaded ท.Fสอดคล5องก�บคDาส�Fง this() แล5วข5ามไปข�Mนตอนท.F 3• เร.ยกใช5 constructor ของ superclass ถ5าไม=ม.คDาส�Fง super() จะเร.ยกใช5

constructor แบบ default ยกเว5นคลาสท.Fช$Fอ Object จะไม=ม.การเร.ยกใช5 constructor ของ superclass เน$Fองจากคลาสท.Fช$Fอ Object จะไม=ม. superclass

• เร.ยกใช5คDาส�FงกDาหนดค=าเร�Fมต5นของค6ณล�กษณะของอPอบเจกตG• เร.ยกใช5คDาส�Fงภายใน constructor ของคลาสท.Fใช5น�Mน

Page 74: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างคลาสท.Fม. constructor ในรKปแบบต=างๆpublic class Student {

protected String name;public Student(String n) { name = n;}

}public class GradStudent extends Student {

public GradStudent(String n) { super(n);}public GradStudent() { this(" ");}

}

Page 75: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

เมธอดของคลาสท.Fช$Fอ Objectคลาสท.Fช$Fอ Object จะเปLนคลาสท.Fท6กๆคลาสจะส$บทอดมา เมธอดของคลาส Object ท��ส'าค�ญค-อ

• toString() เป%นเมธอดท��ใช$ในการแปลงค+าของอ�อบเจกต�ให$เป%น String ซNFงจะส=งค=ากล�บเปLนข5อมKลชน�ดคลาส String

• equals(Object o) เปLนเมธอดท.Fใช5ในการเปร.ยบเท.ยบค=าของอPอบเจกตG ซNFงจะส=งค=ากล�บเปLนข5อมKลชน�ด boolean

Page 76: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

เมธอด toString() คลาสท��ต$องการจะแปลงข$อม*ลเป%น String จะต5องม.เมธอดแบบ overriden

ท.Fช$Fอ toString() เช=นคลาส Date ได5กDาหนดคDาส�FงสDาหร�บเมธอด toString() ไว5แล5ว ด�ง

น�Mนการเร.ยกใช5เมธอด System.out.println()โดยท.F argument เปLนอPอบเจกตGของคลาส Date จะทDาให5ม.การเร.ยกใช5เมธอด toString() ของคลาส Date โดยอ�ตโนม�ต� ต�วอย=างเช=น คDาส�Fง

Date d = new Date();System.out.println(d);

Page 77: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมแสดงเมธอด toString()public class Student {

private String name;public Student(String n) { name = n;}public String toString() { return name;}

}public class TestToString {

public static void main(String args[]) { Student s1 = new Student("Thana");

System.out.println(s1);}

}

Thanaผลล�พธGท.Fได5จากการร�นโปรแกรม

Page 78: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

เมธอด equals()คลาสท��ต$องการสร$างเมธอดเพ-�อเปร�ยบเท�ยบค=าของอPอบเจกตGว+าเท+าก�นหร-อ

ไม+ จะต$องม.เมธอดแบบ overriden ท.Fช$Fอ equals()

Page 79: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมแสดงเมธอด equals() class Student {

private String name;public Student(String n) { name = n;}public boolean equals(Object obj) { if (obj.equals(name)) { return true;} else return false;}

} public class TestEquals {

public static void main(String args[]) { Student s1 = new Student("Thana");

Student s2 = new Student("Thana"); System.out.println(s1.equals(s2));}

}

trueผลล�พธGท.Fได5จากการร�นโปรแกรม

Page 80: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

คลาสประเภท Wrapperคลาสประเภท Wrapper จะช=วยในการสร5างอPอบเจกตGท.FเกPบชน�ดข5อมKลแบบ

พ$Mนฐานไว5ในคอลเลPกช�Fนแบบ Heterogeneous คลาสประเภท Wrapper ม.ด�งน.M

Page 81: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย=างโปรแกรมแสดงการใช5คลาสประเภท Wrapperpublic class ShowWrapper {

public static void main(String args[]) { Boolean b = new Boolean(true); Character c = new Character('A'); Double d = new Double(1.234); System.out.println(b); System.out.println(c); System.out.println(d);

}}

true A 1.234ผลล�พธGท.Fได5จากการร�นโปรแกรม

Page 82: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

Autoboxing และ Auto-unboxing คDาส�Fง Autoboxing ค$อการแปลงจากชน�ดข5อมKลพ$Mนฐานเช=น intไปเปLนคลาส

ประเภท Wrapper เช=น IntegerคDาส�Fง Auto-unboxing ค$อการแปลงจากคลาสประเภท Wrapper เช=น Byte

ไปเปLนชน�ดข5อมKลพ$Mนฐานเช=น byte

Page 83: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย=างการใช5คDาส�Fง Auto-boxing/Auto-unboxingpublic class ShowWrapper {

public static void main(String []args) { Integer myInt = 1; // int into Integer System.out.println(myInt);

int i = myInt + 3; // mix Integer and int System.out.println(i);

}}

14ผลล�พธGท.Fได5จากการร�นโปรแกรม

Page 84: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ค6ณล�กษณะแบบ staticค�ย�เว�ร�ด static สามารถท��จะใช$ก�บค6ณล�กษณะและเมธอดของคลาสได$ค6ณล�กษณะของคลาสท��เป%นแบบ static จะเป%นค6ณล�กษณะท��ท�กอ�อบ

เจกต�ของคลาสน.Mใช$ร+วมก�นค6ณล�กษณะของคลาสท��เป%นแบบ static สามารถถKกเร�ยกใช$จากช-�อของ

คลาสได$โดยไม+จ'าเป%นต$องสร$างอ�อบเจกต� อาท�เช+น • Student.counter

Page 85: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมแสดงการใช5ค.ยGเว�รGด static public class Student {

static int counter;public Student() { counter++;}

} public class TestStatic {

public static void main(String args[]) { Student s1 = new Student(); Student s2 = new Student(); System.out.println(Student.counter); System.out.println(s1.counter); System.out.println(s2.counter);}

}

222ผลล�พธGท.Fได5จากการร�นโปรแกรม

Page 86: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

เมธอดแบบ static เมธอดโดยท��วไปจะม. modifier เป%นแบบ non-staticเมธอดท��ม� modifier เป%นแบบ static จะสามารถถKกเร�ยกใช$งาน โดยใช$ช-�อ

คลาสได5เลยไม+จ'าเป%นต$องสร$างออปเจ�กของคลาสน�Mนข40นมาก+อน ซNFงม.รKปแบบด�งน�0

className.methodName();ต�วอย+างเช+น เมธอดท�กเมธอดในคลาส Math เป%นแบบ static ด�งน�0นการ

เร.ยกใช5งานท6กเมธอดในคลาสสามารถทDาได5 เช=น Math.sqrt(4);

เมธอดแบบ static จะไม+สามารถเร�ยกใช$เมธอดหร-อต�วแปรของอPอบเจกตGได$โดยตรง

Page 87: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

Static InitializerStatic Initializer ค-อบล�อกในคลาสใดๆท��อย*+นอกเมธอด และม�ค�ย�เว�ร�ด static เพ-�อน�ยามให$เป%นบล�อกแบบ static

รKปแบบของ Static Initializer static { ...

}ค'าส��งในบล�อกแบบ static จะถ*กเร�ยกใช$เพ�ยงคร�0งเด�ยวเม-�อ JVM โหลด

คลาสด�งกล+าวข40นมาStatic Initializer ใช$ในการด.บ�ก (debug) โปรแกรม หร-อใช5ในกรณ.ท.Fต5องกา

รสร5างอPอบเจกตGของคลาสขNMนโดยอ�ตโนม�ต� เราสามารถท.FจะกDาหนดบลPอกแบบ static ได5มากกว=าหนNFงบลPอก โดยการ

ทDางานจะถKกเร.ยงจากบนลงล=าง

Page 88: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมแสดง Static Initializer public class TestStaticBlock {

static int x=5;static { x += 1;}public static void main(String args[]) { System.out.println("x = "+x);}static { x /= 2;}

}

x = 3 ผลล�พธGท.Fได5จากการร�นโปรแกรม

Page 89: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ค�ย�เว�ร�ด finalค�ย�เว�ร�ด final สามารถจะใช$ได$ก�บคลาส ต�วแปร และเมธอดคลาสท��ม� modifier เป%น final จะทDาให5คลาสอ$Fนไม+สามารถส-บทอดคลาสน.M

ได$เมธอดท��ม� modifier เป%น final ค$อเมธอดท.Fจะไม=สามารถม.เมธอดแบบ

overriden ได5 ต�วแปรท��ม� modifier เป%น final ค-อค+าคงท�� ซNFงจะทDาให5สามารถกDาหนดค=า

ได5เพ.ยงคร�Mงเด.ยวเท=าน�Mน

Page 90: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

คลาสภายในคลาสภายใน (Inner class) ค$อคลาสท.FประกาศอยK=ภายในคลาสอ$Fนๆ ซNFงบาง

คร�Mงเร.ยกว=าคลาสแบบซ5อน (nested class) คลาสภายในอน6ญาตให5ประกาศค6ณล�กษณะหร$อเมธอดภายในคลาสอ$Fนได5 คลาสภายในม.ประโยชนGในกรณ.ท.Fต5องการจะจ�ดกล6=มของคลาสท.Fต5องทDางาน

ร=วมก�น โดยต5องการควบค6มไม=ให5ม.การเข5าถNงโดยตรงจากคลาสอ$Fนๆ และต5องการเร.ยกใช5ค6ณล�กษณะหร$อเมธอดของคลาสท.FอยK=ภายนอกได5โดยตรง

คลาสภายในท��ใช$ในภาษาจาวาแบ+งออกเป%น• คลาสภายในท��อย*+ภายในคลาสโดยตรง• คลาสภายในท��อย*+ภายในเมธอด

Page 91: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

คลาสภายในท.FอยK=ภายในคลาสกรณ.น.MเปLนการประกาศคลาสภายในคลาสอ$Fนท.Fเร.ยกว=า คลาสภายนอก

(Outer class) คลาสภายในสามารถม� access modifier เป%น public, private, default

หร$อ protected ได5การสร5างอPอบเจกตGของคลาสภายในม.ข5อแตกต=างด�งน.M

• การสร5างอPอบเจกตGของคลาสภายในนอกคลาสภายนอก จะต5องทDาการสร5างอPอบเจกตGของคลาสภายนอกก=อน แล5วจNงสร5างอPอบเจกตGของคลาสภายในได5

• การสร5างอPอบเจกตGภายในเมธอดท.FอยK=ในคลาสภายนอกสามารถทDาได5โดยตรง คลาสท.FอยK=ภายในสามารถท.Fจะเร.ยกใช5ค6ณล�กษณะและเมธอดของคลาส

ภายนอกได5

Page 92: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมแสดงคลาสท��อย*+ภายในคลาส public class Outer {

public void method1() { Inner in1 = new Inner(); in1.method2();}public class Inner { public void method2() {

System.out.println("Inner Demo"); }}

} public class InnerDemo {

public static void main(String args[]) { Outer.Inner in2 = new Outer().new Inner(); in2.method2();}

}

Page 93: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

คลาสภายในท.FอยK=ภายในเมธอดคลาสภายในประเภทน.Mจะม. access modifier เปLน default เราจะไม=สามารถท.Fจะสร5างอPอบเจกตGของคลาสภายในประเภทน.Mนอกเมธอด

ท.Fประกาศคลาสได5 คลาสประเภทน.Mจะสามารถเร.ยกใช5ต�วแปรภายในของเมธอดได5ในกรณ.ท.F

ต�วแปรน�MนประกาศเปLน final เท=าน�Mน ส=วนต�วแปรท.FเปLนค6ณล�กษณะของคลาสหร$อค6ณล�กษณะของอPอบเจกตG สามารถท.Fจะเร.ยกใช5ได5เช=นเด.ยวก�บคลาสภายในท.FอยK=ภายในคลาส

Page 94: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ค6ณสมบ�ต�ท.FสDาค�ญอ$FนๆของคลาสภายในคลาสภายในอาจเปLนคลาสแบบ abstract หร$ออ�นเตอรGเฟสได5คลาสภายในท.FอยK=ภายในคลาสภายนอกโดยตรง ถ5าม. modifier เปLน static

จะกลายเปLนคลาสปกต� และสามารถสร5างอPอบเจกตGโดยการเร.ยกช$Fอของคลาสภายนอกได5ด�งน.M

Outer.Inner in3 = Outer.new Inner(); คลาสภายในไม=สามารถท.Fประกาศให5ม.ค6ณล�กษณะหร$อเมธอดเปLนแบบ static ได5เว5นแต=คลาสภายในจะเปLนคลาสแบบ static

คลาสภายในสามารถท.Fจะใช5ต�วแปรท.FเปLนค6ณล�กษณะของคลาสหร$อค6ณล�กษณะของอPอบเจกตGของคลาสภายนอกได5

Page 95: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างโปรแกรมแสดงคลาสท.FอยK=ภายในเมธอด public class MOuter { private int a = 1; public void method(final int b) {

final int c = 2; int d = 3; class Inner {

private void iMethod() { System.out.println("a = "+a); System.out.println("b = "+b); System.out.println("c = "+c); System.out.println("d = "+d); //illegal}

} } }

Page 96: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

Generic Typesเราสามารถท.Fจะประกาศคลาสหร$ออ�นเตอรGเฟสใดๆให5ม.ชน�ดข5อมKลเปLนแบบ

ท�Fวไป (Generic Type) public class ClassName(TypeVariable)ต�วอย=างเช=น

– public class Box<T> จะระบ6ชน�ดข5อมKลแบบเจาะจงได5ตอนท.Fสร5างอPอบเจกตG ต�วอย=างเช=น

– Box<Integer> integerBox = new Box<Integer>();

Page 97: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างแสดงคลาสท.Fใช5 Generic Type public class Box<T> { private T t; public void add(T t) { this.t = t; } public T get() { return t; }}-----------------------------------------------------------public class BoxDemo { public static void main(String[] args) { Box<Integer> integerBox = new Box<Integer>(); integerBox.add(new Integer(10)); Integer someInteger = integerBox.get(); // no cast! System.out.println(someInteger); }}

Page 98: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

เมธอดแบบ Genericเราสามารถท.Fจะใช5 Generic Type ก�บเมธอดหร$อ constructor ใดๆกPได5 [modifier] <TypeVariable> return_type methodName(TypeVaraible varName) {

[method_body]}

โดยท.F– TypeVariable ค$อช$Fอของต�วแปรชน�ดข5อมKล– varName ค$อช$Fอ argument

Page 99: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

ต�วอย+างแสดงคลาสท.Fประกาศเมธอดแบบ Genericpublic class BoxMethod { public <U> void inspect(U u) { System.out.println("U: " + u.getClass().getName()); }}-------------------------------------------------------public class BoxMethodDemo { public static void main(String[] args) { BoxMethod box = new BoxMethod(); box.inspect(3.2); }}

Page 100: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

Annotation ภาษาจาวาม.คDาส�Fง annotation (เคร$Fองหมาย @) ซNFงจะให5ข5อมKลเก.Fยวก�บโปรแกรม โดยท.Fจะ

ไม=ม.ผลโดยตรงต=อคDาส�Fงใดๆ annotation จะถKกใช5งานในกรณ.ต=างๆ ด�งน.M

– เปLนข5อมKลสDาหร�บคอมไพเลอรG เพ$Fอตรวจจ�บข5อผ�ดพลาดหร$อ warning ของโปรแกรม– ช=วยในกระบวนการข�MนตอนการคอมไพลGและต�ดต�Mง (deployment) ท�Mงน.MซอฟตGแวรGในการ

คอมไพลG สามารถท.Fจะประมวลผลข5อมKล annotation ในการสร5างโค5ดท.FเปLนไฟลG XML ได5– ช=วยในกระบวนการข�Mนตอน runtime ท�Mงน.Mจาก annotation บางคDาส�Fงจะสามารถตว

รสอบได5ในช=วง runtime

Page 101: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

Annotation คDาส�Fง annotation @ ม�กจะถKกประกาศเปLนคDาส�Fงแรก ตามด5วยช$Fอของ annotation ซNFง

อาจม. element ท.Fม. named หร$อ unnamed valued ต�วอย=างเช=น @Author( name = "Benjamin Franklin", date = "3/27/2003" ) class MyClass() { } หร$อ

@SuppressWarnings(value = "unchecked") void myMethod() { }

Page 102: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

Annotation Document@interface ClassPreamble { String author(); String date(); int currentRevision() default 1; String lastModified() default "N/A"; String lastModifiedBy() default "N/A"; String[] reviewers(); // Note use of array}@ClassPreamble ( author = "John Doe", date = "3/17/2002", currentRevision = 6, lastModified = "4/12/2004", lastModifiedBy = "Jane Doe", reviewers = {"Alice", "Bob", "Cindy"} // Note array notation)public class Generation3List extends Generation2List {// class code goes here}

Page 103: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

Annotation ท.Fใช5โดยคอมไพเลอรG ภาษาจาวาได5กDาหนด annotation สDาหร�บคอมไพเลอรGไว5สามคDาส�Fงค$อ @Depreacted, @Override และ @Suppresswarnings

@Deprecated เราจะใช5 annotationน.M ในกรณ.ท.Fต5องการระบ6ว=าคDาส�Fงเช=นคลาส เมธอด หร$อค6ณล�กษณะใด เปLนคDาส�Fงท.Fไม=ควรจะใช5แล5ว เพ$Fอให5คอมไพเลอรGส=งคDาส�Fง warning ออกมาในช=วงการคอมไพลG

@Override เราจะใช5 annotationน.Mเพ$FอจะบอกคอมไพเลอรGว=า element น.M override คDาส�Fง element ของ superclass

@SuppressWarnings เราจะใช5 annotationน.Mเพ$FอบอกคอมไพเลอรGไม=ต5องแสดงคDาส�Fง warning ท.Fอาจ ปรากฎขNMนจากการใช5คDาส�Fงท.Fตามมาน.Mในช=วงการคอมไพลGโปรแกรม

Page 104: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

สร6ปเน$Mอหาของบทเมธอดท.FกDาหนดขNMนในคลาสใดๆสามารถเร.ยกใช5งานได5สองรKปแบบค$อ การ

เร.ยกใช5งานจากคลาสท.Fต=างก�น และการเร.ยกใช5งานภายในคลาสเด.ยวก�นเมธอดท.FกDาหนดขNMนในคลาสอาจม. argument ท.Fร�บค=าเพ$FอนDาไปใช5ในเมธอด เมธอดใดๆของคลาสสามารถท.Fจะม.ค=าท.Fส=งกล�บมาได5 ท�Mงน.Mการประกาศ

เมธอดจะต5องระบ6ชน�ดข5อมKลของค=าท.Fจะส=งกล�บเมธอดสามารถแบ=งเปLนเมธอดของอPอบเจกตG (หร$อเร.ยกว=าเมธอดแบบ non-

static) และเมธอดของคลาส (หร$อเร.ยกว=าเมธอดแบบ static)เมธอดของคลาสใดท.Fม. modifier เปLนแบบ static จะทDาให5สามารถถKก

เร.ยกใช5งาน โดยใช5ช$Fอของคลาสน�Mนได5เลยเมธอดแบบ overloaded ค$อ ม.เมธอดท.Fม.ช$Fอเด.ยวก�นแต=จะม.จDานวนหร$อชน�ด

ข5อมKลของ argument ท.Fต=างก�น

Page 105: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

สร6ปเน$Mอหาของบทโดยท�Fวไป ค6ณล�กษณะของคลาสจะม. modifier เปLนแบบ private ท�Mงน.Mเพ$Fอ

ปoองก�นการเข5าถNงจากคลาสอ$Fนโดยท�Fวไป เมธอดของคลาสจะม. modifier เปLนแบบ public ท�Mงน.Mเพ$Fอให5

เมธอดจากคลาสอ$Fนเร.ยกใช5ได5ช$Fอของเมธอดท.Fเก.Fยวข5องก�บค6ณล�กษณะของคลาส น�ยมใช5 setXxx สDาหร�บ

เมธอดท.Fม.ไว5เพ$FอกDาหนดค=าให5ก�บค6ณล�กษณะ xxx และใช5 getXxx สDาหร�บ เมธอดท.Fจะส=งค=ากล�บเปLนค6ณล�กษณะ xxx

ค.ยGเว�รGด protected จะทDาให5คลาสท.FเปLน subclass สามารถท.Fจะอ5างอ�งถNงค6ณล�กษณะหร$อเมธอดของ superclass ได5

Page 106: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

สร6ปเน$Mอหาของบทคลาสท6กคลาสในภาษาจาวาถ5าไม=ได5ส$บทอดจากคลาสใดเลยจะถ$อว=าคลาส

น�Mนส$บทอดจากคลาสท.Fช$Fอ Objectเมธอดแบบ overriden จะเปLนการเข.ยนเมธอดของ superclass ขNMนใหม= super เปLนค.ยGเว�รGดท.Fใช5ในการอ5างอ�งถNง superclassการม.ได5หลายรKปแบบหมายถNง

– การท.Fเราสามารถท.Fจะสร5างหร$ออ5างถNงอPอบเจกตGของคลาสท.Fส$บทอดก�นได5หลายรKปแบบ

– การท.Fเราสามารถท.Fจะอ5างถNงเมธอดช$Fอเด.ยวก�นได5หลายรKปแบบเมธอดแบบ overloaded หมายถNงเมธอดท.Fม.ช$Fอเด.ยวก�นมากกว=าหนNFงเมธอด

โดยม.จDานวนหร$อชน�ดของ argument ท.Fแตกต=างก�น

Page 107: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

สร6ปเน$Mอหาของบทเมธอดแบบ overridden หมายถNงการท.F subclass สร5างเมธอดท.Fม.อยK=แล5วใน

superclass ขNMนใหม= โดยใช5ช$Fอ argument และชน�ดข5อมKลของค=าท.Fส=งกล�บของเมธอดเหม$อนเด�ม

ค.ยGเว�รGด instanceof เปLนต�วดDาเน�นการท.Fใช5ก�บอPอบเจกตGและคลาส เพ$Fอตรวจสอบว=าอPอบเจกตGใดๆ เปLน อPอบเจกตGของคลาสท.Fระบ6หร$อไม=

การ casting อPอบเจกตG ทDาให5เราสามารถจะกDาหนดอPอบเจกตGของคลาสท.FเปLน superclass ให5ก�บต�วแปรท.FกDาหนดเปLนคลาสท.FเปLน subclass ได5

Constructor หมายถNง เมธอดท.Fม.ช$Fอเด.ยวก�นก�บช$Fอคลาส แต=จะไม=ม.การส=งค=ากล�บและจะไม=ม.การใส=ค.ยGเว�รGด void โดยคลาสท6กคลาสจะม. default constructor มาให5อยK=แล5ว แต=เราสามารถท.FจะกDาหนด constructor ขNMนใหม=เองได5

Page 108: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

สร6ปเน$MอหาของบทConstructor แบบ overloaded หมายถNง constructor ท.Fม.จDานวนหร$อชน�ด

ของ argument ท.Fแตกต=างก�นเมธอดท.Fช$Fอ this() เปLนการเร.ยกใช5 constructor ของคลาสต�วเองConstructor แบบ default ของคลาสท.FเปLน superclass จะถKกเร.ยกใช5โดย

อ�ตโนม�ต�ท6กคร�Mงท.Fม.การสร5าง อPอบเจกตGของคลาสคลาสท.Fช$Fอ Object ม.เมธอดท.FสDาค�ญอยK=สองเมธอดค$อเมธอด toString() และ

เมธอด equals()Auto-boxing / Auto-unboxing ค$อการแปลงค=าระหว=างชน�กข5อมKลพ$Mนฐาน

ก�บคลาสประเภท Wrapper ท.Fสอดคล5องก�นโดยอ�ตโนม�ต�เมธอดแบบ static สามารถถKกเร.ยกใช5จากช$Fอของคลาสได5โดยไม=จDาเปLน

ต5องสร5างอPอบเจกตG

Page 109: Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์

สร6ปเน$Mอหาของบทคลาสแบบ final ค$อคลาสท.Fไม=สามารถส$บทอดได5คลาสภายในหมายถNงคลาสท.FอยK=ภายในคลาส หร$อคลาสท.FอยK=ภายในเมธอดGeneric Type สามารถท.FจะทDาให5เราประกาศคลาสหร$ออ�นเตอรGเฟสใดๆให5ม.

ชน�ดข5อมKลเปLนแบบท�Fวไป (Generic Type) แล5วค=อยระบ6ชน�ดข5อมKลแบบเจาะจงตอนท.Fสร5างอPอบเจกตGได5

เมธอดแบบ Generic ค$ดเมธอดท.Fม. argument ท.FเปLน Generic TypeAnnotation จะให5ข5อมKลเก.Fยวก�บโปรแกรม โดยท.Fจะไม=ม.ผลโดยตรงต=อคDาส�Fง

ใดๆของ code ท.FทDาการบ�นทNก