ต วอย างโค ดท ม ภาษาจาวาท ม หลายๆคลาส

  • 1. (Object Oriented Java Programming) ผศ.ธนศา เคร$อไวศยวรรณ คณะเทคโนโลย.สารสนเทศ สถาบนเทคโนโลย.พระจอมเกล5าเจ5าค6ณทหารลาดกระบง
  • 2. modifier ของเมธอด แนะน'าการเขยนโปรแกรมภาษาจาวาเชงออบเจกต อธบายคณลกษณะเด=นของโปรแกรมเชงออบเจกต อธบายความหมายของ Constructor  แนะนDาคลาสประเภท Wrapper  อธบายเมธอดของคลาสท.Fช$Fอ Object  ค.ยGเวรGดอ$Fนๆ ท.FสDาคญ  แนะนDาคลาสภายใน Generic และ คDาสFง Annotation
  • 3. F obj.methodName([arguments]);  arguments อาจจะเปLนข$อม*ลค+าคงทหร-อตวแปร ชนดข5อมKลของ arguments ท.Fใช5ในการเร.ยกเมธอด จะต$องสอดคล$องกน กบชนดข5อมKลของ arguments ของเมธอด
  • 4. • การเร.ยกใช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ของคลาสขNนมาก=อน และสามารถเร.ยกเมธอดได5 M ท6กเมธอด
  • 5. { public void calculate() { double score = Math.random()*100; if (score >= 80) { System.out.println("Grade is A"); } else if (score >= 70) { System.out.println("Grade is B"); } else if (score >= 60){ System.out.println("Grade is C"); } else if (score >= 50){ System.out.println("Grade is D"); } else { System.out.println("Grade is F"); } } }
  • 6. { public static void main(String args[]) { NumericalClass obj = new NumericalClass(); obj.calculate(); } }
  • 7. { 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(); } }
  • 8. ทจะรบค+าเพ$อนDาไปใช5ในเมธอด อาทเช+น F public void setGPA(double GPA) { ... } ค'าสงท.เรยกใช5เมธอดน0 จะต$องส+ง argument ท.Fมชนดข5อมKลเปLน double F . ไปพร5อมกบช$Fอเมธอด เช=น setGPA(3.0);
  • 9. { 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); } }
  • 10. ตวแปรดงน.M • argument ท.Fม.ชนดข5อมKลแบบพ$Mนฐาน • argument ท.Fม.ชนดข5อมKลแบบอ5างอง ในกรณ.ของ argument ท.Fม.ชนดข5อมKลแบบพ$นฐาน เราสามารถท.Fจะส=งค=าคงท.F M ข5อมKล ตวแปร หร$อนพจนGให5กบ argument ได5 ตวอย=างเช=น • ค=าคงท.ข5อมKล เช=น F s1.setGPA(3.0); • ตวแปร เช=น double x = 3.0; s1.setGPA(x); • นพจนG เช=น s1.setGPA(3.0+0.05);
  • 11. F ยกเว5นกรณ.ท.F argument นMนม.ชนดข5อมKลเปLน String ซNFงในกรณ.นจะ .M สามารถส=งข5อมKลค=าคงท.ได5 F
  • 12. F เจกตG public 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); } }
  • 13. 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); } }
  • 14. ท.จะส=งผ=านไปยงเมธอดไม=จDาเปLนท.Fจะต5องเปLน F ชนดข5อมKลเด.ยวกน แต=ตองเปLนชนดข5อมKลท.Fสามารถแปลงข5อมKลให5กว5างขNMน 5 ได5โดยอตโนมต เมธอดใดๆอาจม. argument สDาหรบรบค=ามากกว=าหนNงตว แต=การเร.ยกใช5 F เมธอดเหล=าน.Mจะต5องส=ง argument ท.ม.ชนดข5อมKลท.Fสอดคล5องกนและม. F จDานวนเท=ากน
  • 15. 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); } }
  • 16. ท.มชนดข$อม*ลเป%นแบบพ-นฐาน หากมการเปลยนแปลงค+า F 0 ของ argument ภายในเมธอดทถ*กเรยกใช$งาน จะไม+มผลท'าให$ค+าของ argument ทส+งไปเปลยนค+าไปด$วย การส=ง argument ท.มชนดข$อม*ลเป%นแบบอ$างอง จะเป%นการส+งต'าแหน+ง F อ$างองของออบเจกตไปให$กบเมธอดทถ*กเรยกใช$งาน ดงน0นการเปลยนแปลง ค+าของคณลกษณะของอPอบเจกตGจะมผลท'าให$ค+าของคณลกษณะของออบ เจกตทส+งไปเปลยนไปด$วย
  • 17. 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; }
  • 18. 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(); } }
  • 19. = เมธอดใดๆของคลาสสามารถท.Fจะม.ค=าท.ส=งกลบมาได5 ซNFงชนดข5อมKลของค=าท.F F จะส=งกลบอาจเปLนชนดข5อมKลแบบพ$Mนฐาน หร$อเปLนชนดข5อมKลแบบอ5างอง เมธอดท.Fม.ค=าท.Fจะส=งกลบมาจะต5องม.คDาสFง return ซNFงจะระบ6ค=าท.Fสงกลบ = โดยม.รKปแบบดงน.M return value; คDาสFงท.เร.ยกใช5เมธอด อาจจะรบค=าท.FสงกลบมาเกPบไว5ในตวแปรหร$อเปLนตว F = ถKกดDาเนนการในนพจนG ตวอย=างเช=น double d = getGPA(); System.out.println("GPA:"+getGPA());
  • 20. • access modifier • static • abstract • synchronized • final access modifier ใช5เพ$อระบ6ระดบการเข5าถNง โดยม.ค.ยGเวรGดต=างๆดงน.M F • public • protected • private • default (ไม+ระบ ค.ยเวรGดใดๆ บ6 G )
  • 21. 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); } }
  • 22. 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(); } }
  • 23. 5 การส$บทอด และการม.ได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ทตองการให5อPอบเจกตGอ$Fนๆเร.ยกใช5ให5ม. modifier เปLน .F 5 public
  • 24. { 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); } } }
  • 25. แบ=งออกได5เปLนสองประเภทค$อ • เมธอดแบบ setter • เมธอดแบบ getter เมธอดแบบ setter จะใช5ในการกDาหนดค=าของค6ณลกษณะ โดยทFวไปช$Fอของเมธอดแบบ setter จะขNนต5นด5วยคDาว=า set แล5วตามด5วยช$Fอ M ของค6ณลกษณะ ซNFงม.รปแบบดงน.M K public void setAttributeName(dataType arg) { attributeName = arg; }
  • 26. { 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()); } }
  • 27. จะใช5ในการเร.ยกค=าของค6ณลกษณะ โดยทFวไปช$Fอของเมธอดแบบ getter จะขNMนต5นด5วยคDาว=า get แล5วตามด5วยช$Fอ ของค6ณลกษณะ ซNFงม.รปแบบดงน.M K public dataType getAttributeName() { return attributeName; }
  • 28. { 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; } }
  • 29. public String getID() { return id; } public String getName() { return name; } public double getGPA() { return gpa; } }
  • 30. G ค.ยเวรGด this หมายถNงอPอบเจกตGของตวเอง เราสามารถท.จะเร.ยกใช5เมธอดหร$อค6ณลกษณะภายในคลาสได5โดยใช5 F ค.ยGเวรGด this ซNFงม.รปแบบดงน.M K this.methodName(); this.attributeName โดยทFวไปเราจะไม=ใช5ค.ยเวรGด this ในคDาสFง ยกเว5นในกรณ.ท.FจDาเปLน G
  • 31. 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); } }
  • 32. ค6ณลกษณะหร$อเมธอดในคลาสใหม= การพฒนาคลาสขNMนใหม=ทช$Fอ GradStudent .F สามารถท.จะเล$อกวธ.การได5 F สองแบบค$อ • สร5างคลาสขNMนมาใหม=โดยไม=อ5างองกบคลาสเดมท.Fชอ Student $F • สร5างคลาสท.สบทอดมาจากคลาสเดมท.ช$Fอ Student F $ F
  • 33. F public 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); } }
  • 34. F 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; }
  • 35. F 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); } }
  • 36. F 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); } }
  • 37.
  • 38. F เราสามารถท.ตรวจสอบหลกการของการส$บทอดด5วยคDาว=า is a F public class Shirt { char size; float price; } public class Skirt extends Shirt { boolean long; }
  • 39. K public class Clothing { char size; float price; } public class Shirt extends Clothing { } public class Skirt extends Clothing { boolean long; }
  • 40. ท.Fม. modifier เปLนแบบ private จะทDาให5 subclass ไม=สามารถท.Fจะเร.ยกใช5ได5 ภาษาจาวากDาหนดให5ม. access modifier ท.ช$Fอ protected ซNFงจะทDาให5 F subclass สามารถเร.ยกใช5เมธอดหร$อค6ณลกษณะของ superclass ได5 ตวอย=างเช=น protected String name;
  • 41. modifier ท.ช$Fอ protected ซNFงจะทDาให5คลาสท.F F เปLน subclass สามารถท.Fจะเร.ยกใช5เมธอดหร$อค6ณลกษณะของ superclass ได5 แม5ว=าจะอยKต=างคลาสหร$ออยKต=างแพคเกPจกนกPตาม = = คลาสท.อยK= F คลาสท.F คลาส modifier ในแพจเกPจ เปLนsubcla คลาสใดๆ เด.ยวกน เด.ยวกน ss √ √ √ √ public √ √ √ protected √ √
  • 42. . G 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); } }
  • 43. คลาสเด.ยวเท=านMน คลาสท6กคลาสในภาษาจาวาถ5าไม=ได5สบทอดจากคลาสใดเลยจะถ$อว=าคลาส $ นMนส$บทอดจากคลาสท.ช$Fอ Object F ตวอย=างเช=น public class Student extends Object { ... } คลาสท.ช$Fอ Object จะม.เมธอดท.สDาคญค$อ F F public String toString() และ public boolean equals(Object o)
  • 44. G  super เปLนค.ยGเวรGดท.ใช5ในการอ5างองถNง superclass เพ$อท.จะเร.ยกใช5 F F F เมธอดหร$อ constructor ของ superclass โดยม.รปแบบคDาสFงดงน.M K super.methodName([arguments]) ตวอย=างเช=น คลาส GradStudent อาจม.เมธอดท.ช$Fอ showDetails() F โดยม.คDาสFงท.Fเร.ยกใช5เมธอด showDetails() ของคลาส Student และ showThesis() ของคลาส GradStudent public void showDetails() { super.showDetails(); showThesis(); }
  • 45. . public 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); } }
  • 46. . 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); } }
  • 47. 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
  • 48. F อบเจกตGได5หลายรKปแบบ ตวอย=างเช=น จากรKปแบบ SuperClass obj; เราสามารถท.จะสร5างอPอบเจกตGท.Fช$Fอ obj ซNFงอาจเปLนอPอบเจกตGของคลาสท.F F เปLน superclass หร$อท.เปLน subclass ได5 โดยใช5คDาสFงท.Fม.รKปแบบดงน.M F obj = new SuperClass(); หร$อ obj = new SubClass(); ตวอย=างเช=น Student s; s = new GradStudent();
  • 49. Student s1 = new Student(); Student s1 = new GradStudent(); Student s1 = new PhDStudent();
  • 50. F ได5 แต=เมธอดเหล=านMนจะต5องม.จDานวนหร$อชนดข5อมKลของ argument ท.ต=าง F กน ตวอย=างต=อไปน.เปLนการเข.ยนเมธอดแบบ M overloaded ท.ถKกต5อง F public void setDetails(String ID, String n) { } public void setDetails(String ID, double GPA) { } public double setDetails(double GPA, String n) { } ตวอย=างต=อไปน.เปLนการเข.ยนเมธอดแบบ M overloaded ท.ไม=ถKกต5อง F public void setDetails(String ID,double GPA) { } public void setDetails(String n,double GPA) { }
  • 51. 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; } }
  • 52. เปLนหลกการท.Fสบเน$องมาจากหลกการ $ F ของการส$บทอด โดยคลาสท.FเปLน subclass สามารถท.จะเข.ยนเมธอดของ F superclass ขNMนใหม=ได5 วธ.การน.เร.ยกว=า เมธอดใน subclass เปLนเมธอดแบบ M overridden การเข.ยนเมธอดแบบ overridden ม.ขอกDาหนดดงน.M 5 • จDานวนและชนดข5อมKลของ argument จะต5องเหม$อนเดม • ชนดข5อมKลของค=าท.Fสงกลบจะต5องเหม$อนเดม = • access modifier จะต5องไม=ม.ระดบตFDากว=าเดมอาทเช=น ถ5าเมธอดเดมเปLน public จะไม=สามารถเปล.FยนเปLน private ได5
  • 53. { : 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); } }
  • 54. ข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 ท.กDาหนดไว5 ตวอย=างเช=น = F Student s1 = new GradStudent(); s1.getSupervisor(); // Fail to compile
  • 55. argument เปLนข5อมKลชนดคลาส เราสามารถท.Fจะส=ง อP อบเจกตGของคลาสท.FเปLน subclass ของคลาสนMนแทนได5 ตวอย=างเช=น คDาสFง Student s1 = new Student(); PhDStudent s2 = new GradStudent(); เราสามารถท.จะเร.ยกใช5เมธอด printInfo(Student s)ได5หลายรKปแบบ F ดงน.M printInfo(s1) printInfo(s2)  หร$อ printInfo(new FullTimeStudent())
  • 56. เป%นตวด'าเนนการทใช$กบออบเจกตและคลาส เพ-อ ตรวจสอบว+าเป%นออบเจกตของคลาสน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!
  • 57. F 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"); } }
  • 58. 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อผดพลาดในช=วงของการรนโปรแกรม
  • 59. ชนดของอPอบเจกตGในช=วงของการรนโปรแกรม ว=าอPอบเจกตGดงกล=าวเปLน อP อบเจกตGของคลาสใด และคลาสนMนม.เมธอดท.Fเร.ยกใช5หร$อไม= หากไม=พบกPจะ เกดข5อผดพลาดในช=วงของการรนโปรแกรม ตวอย=างเช=น Student s1 = new Student(); ((GradStudent) s1).getSupervisor(); // คอมไพลGผ=านได5 แต=จะเกดข5อผดพลาดในช=วงของการรนโปรแกรม
  • 60. { private String id; private String name; private double gpa; public String getID() { return id; } public String getName() { return name; } public double getGPA() { return gpa; } }
  • 61. extends Student { private String thesisTitle; private String supervisor; public String getThesisTitle() { return thesisTitle; } public String getSupervisor() { return supervisor; } }
  • 62. { public static void main(String args[]) { Student s1 = new GradStudent(); s1.getSupervisor(); // compile error Student s2 = new Student(); ((GradStudent) s2).getSupervisor(); // runtime error } }
  • 63. F K [modifier] ClassName([arguments]) { [statements] } constructor เปLนเมธอดท.ไม=ม.ค=าท.จะส=งกลบแต=ไม=ตองระบ6ค.ยGเวรGด void F F 5 โดยทวไปคลาสทกคลาสจะม default constructor ซNงม.รปแบบดงน.M F K public ClassName() { } เราสามารถทจะเขยน constructor ในคลาสใดๆขNMนมากได$ default constructor จะหายไปเม-อมการเขยน constructor ข40นใหม+
  • 64. 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"); } }
  • 65. 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; } }
  • 66. MyDate d1 = new MyDate(16,8,1972); ขMนตอนท.หนNFง F ขMนตอนท.สอง F ขMนตอนท.สาม F ขMนตอนท.ส.F F
  • 67. constructor แบบ overloaded ของคลาสได$ F constructor แบบ overloaded จะมจ'านวนหร-อชนดข$อม*ลทแตกต+างกนของ arguments ค'าสง new ท.ใช5ในการสร5างอPอบเจกตGจะเร.ยกใช5 constructor ท.ม. argument F F ท.Fสงผ=านมาสอดคล5องกบ constructor ท.กDาหนด = F ข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
  • 68. overloaded 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) { id = ID; name = n; gpa = GPA; } }
  • 69. เปLนการเร.ยกใช5 constructor ของคลาสตวเอง โดยจะ ต5องเปLนคDาสFงแรกส6ดท.FอยK=ใน constructor แบบ overloaded
  • 70. 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; } }
  • 71. superclass จะไม+สบทอดมายง - subclass เราสามารถท.จะเร.ยกใช5 constructor ของ superclass ได5โดยใช5เมธอดท.Fช$Fอ F super() โดยส=งผ=าน argument ท.Fสอดคล5องกน เมธอด super() จะต5องเปLนคDาสFงแรกของ constructor เช=นเด.ยวกบ เมธอดท.Fช$Fอ this() โดยทFวไปการทDางานของ constructor ของคลาสใดๆจะม.ผลทDาให5ม.การ เร.ยกใช5 constructor ของ superclass นMน ซNงถ5าไม=ม.คDาสFง super() อยKใน F = คDาสFงแรกของ constructor ของคลาสนMน ภาษาจาวาจะเร.ยกใช5 constructor แบบ default ของ superclass นMนโดยอตโนมต
  • 72. superclass public 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) */ } }
  • 73. ถ5าม.คDาสFง this() ใน constructor กPจะเร.ยกใช5 constructor แบบ overloaded ท.สอดคล5องกบคDาสFง this() แล5วข5ามไปขMนตอนท.F 3 F • เร.ยกใช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 ของคลาสท.ใช5นน F M
  • 74. 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(" "); } }
  • 75. F คลาสท.ช$Fอ Object จะเปLนคลาสท.ท6กๆคลาสจะส$บทอดมา F F เมธอดของคลาส Object ทส'าคญค-อ • toString() เป%นเมธอดทใช$ในการแปลงค+าของออบเจกตให$เป%น String ซNFงจะส=งค=ากลบเปLน ข5อมKลชนดคลาส String • equals(Object o) เปLนเมธอดท.Fใช5ในการเปร.ยบเท.ยบค=าของอPอบเจกตG ซNFงจะส=งค=ากลบเปLนข5อมKลชนด boolean
  • 76. 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);
  • 77. 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); } } ผลลพธGท.Fได5จากการรนโปรแกรม Thana
  • 78. ไม+ จะต$องม.เมธอดแบบ overriden ท.ช$Fอ F equals()
  • 79. { 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)); } } ผลลพธGท.Fได5จากการรนโปรแกรม true
  • 80. จะช=วยในการสร5างอPอบเจกตGท.FเกPบชนดข5อมKลแบบ พ$นฐานไว5ในคอลเลPกชFนแบบ Heterogeneous M คลาสประเภท Wrapper ม.ดงน.M
  • 81. public 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 ผลลพธGทได5จากการรนโปรแกรม .F A 1.234
  • 82. คDาสFง Autoboxing ค$อการแปลงจากชนดข5อมKลพ$นฐานเช=น intไปเปLนคลาส M ประเภท Wrapper เช=น Integer คDาสFง Auto-unboxing ค$อการแปลงจากคลาสประเภท Wrapper เช=น Byte ไปเปLนชนดข5อมKลพ$นฐานเช=น byte M
  • 83. 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); } } ผลลพธGทได5จากการรนโปรแกรม .F 1 4
  • 84. static คยเวรด static สามารถทจะใช$กบค6ณลกษณะและเมธอดของคลาสได$ ค6ณลกษณะของคลาสทเป%นแบบ static จะเป%นค6ณลกษณะททกออบ M เจกตของคลาสน.ใช$ร+วมกน ค6ณลกษณะของคลาสทเป%นแบบ static สามารถถKกเรยกใช$จากช-อของ คลาสได$โดยไม+จ'าเป%นต$องสร$างออบเจกต อาทเช+น • Student.counter
  • 85. G 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); } } 2 2 ผลลพธGท.Fได5จากการรนโปรแกรม 2
  • 86. 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 ได$โดยตรง
  • 87. ค-อบลอกในคลาสใดๆทอย*+นอกเมธอด และมคยเวรด static เพ-อนยามให$เป%นบลอกแบบ static รKปแบบของ Static Initializer static { ... } ค'าสงในบลอกแบบ static จะถ*กเรยกใช$เพยงคร0งเดยวเม-อ JVM โหลด คลาสดงกล+าวข40นมา Static Initializer ใช$ในการด.บก (debug) โปรแกรม หร-อใช5ในกรณ.ทต5องกา .F รสร5างอPอบเจกตGของคลาสขNMนโดยอตโนมต เราสามารถท.จะกDาหนดบลPอกแบบ static ได5มากกว=าหนNงบลPอก โดยการ F F ทDางานจะถKกเร.ยงจากบนลงล=าง
  • 88. class TestStaticBlock { static int x=5; static { x += 1; } public static void main(String args[]) { System.out.println("x = "+x); } static { x /= 2; } } ผลลพธGท.Fได5จากการรนโปรแกรม x = 3
  • 89. สามารถจะใช$ได$กบคลาส ตวแปร และเมธอด คลาสทม modifier เป%น final จะทDาให5คลาสอ$Fนไม+สามารถส-บทอดคลาสน.M ได$ เมธอดทม modifier เป%น final ค$อเมธอดท.Fจะไม=สามารถม.เมธอดแบบ overriden ได5 ตวแปรทม modifier เป%น final ค-อค+าคงท ซNFงจะทDาให5สามารถกDาหนดค=า ได5เพ.ยงครMงเด.ยวเท=านMน
  • 90. ค$อคลาสท.FประกาศอยK=ภายในคลาสอ$Fนๆ ซNFงบาง ครMงเร.ยกว=าคลาสแบบซ5อน (nested class) คลาสภายในอน6ญาตให5ประกาศค6ณลกษณะหร$อเมธอดภายในคลาสอ$Fนได5 คลาสภายในม.ประโยชนGในกรณ.ท.Fตองการจะจดกล6=มของคลาสท.FตองทDางาน 5 5 ร=วมกน โดยต5องการควบค6มไม=ให5ม.การเข5าถNงโดยตรงจากคลาสอ$Fนๆ และ ต5องการเร.ยกใช5ค6ณลกษณะหร$อเมธอดของคลาสท.อยK=ภายนอกได5โดยตรง F คลาสภายในทใช$ในภาษาจาวาแบ+งออกเป%น • คลาสภายในทอย*+ภายในคลาสโดยตรง • คลาสภายในทอย*+ภายในเมธอด
  • 91. F = กรณ.นเปLนการประกาศคลาสภายในคลาสอ$Fนท.Fเร.ยกว=า คลาสภายนอก .M (Outer class) คลาสภายในสามารถม access modifier เป%น public, private, default หร$อ protected ได5 การสร5างอPอบเจกตGของคลาสภายในม.ขอแตกต=างดงน.M 5 • การสร5างอPอบเจกตGของคลาสภายในนอกคลาสภายนอก จะต5องทDาการสร5างอPอบ เจกตGของคลาสภายนอกก=อน แล5วจNงสร5างอPอบเจกตGของคลาสภายในได5 • การสร5างอPอบเจกตGภายในเมธอดท.อยK=ในคลาสภายนอกสามารถทDาได5โดยตรง F คลาสท.อยK=ภายในสามารถท.Fจะเร.ยกใช5ค6ณลกษณะและเมธอดของคลาส F ภายนอกได5
  • 92. { 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(); } }
  • 93. F คลาสภายในประเภทน.Mจะม. access modifier เปLน default เราจะไม=สามารถท.Fจะสร5างอPอบเจกตGของคลาสภายในประเภทน.นอกเมธอด M ท.Fประกาศคลาสได5 คลาสประเภทน.จะสามารถเร.ยกใช5ตวแปรภายในของเมธอดได5ในกรณ.ท.F M ตวแปรนMนประกาศเปLน final เท=านMน ส=วนตวแปรท.เปLนค6ณลกษณะของ F คลาสหร$อค6ณลกษณะของอPอบเจกตG สามารถท.จะเร.ยกใช5ได5เช=นเด.ยวกบ F คลาสภายในท.FอยK=ภายในคลาส
  • 94. ถ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
  • 95. F 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 } } } }
  • 96. F ท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>();
  • 97. F 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); } }
  • 98. Type กบเมธอดหร$อ constructor ใดๆกPได5 F [modifier] <TypeVariable> return_type methodName(TypeVaraible varName) { [method_body] } โดยท.F – TypeVariable ค$อช$Fอของตวแปรชนดข5อมKล – varName ค$อช$Fอ argument
  • 99. F public 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); } }
  • 100. ภาษาจาวาม.ค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 สามารถท.จะประมวลผลข5อมKล annotation ในการสร5างโค5ดท.FเปLนไฟลG XML ได5 F – ช=วยในกระบวนการขMนตอน runtime ทMงน.Mจาก annotation บางคDาสFงจะสามารถตว รสอบได5ในช=วง runtime
  • 101. ค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() { }
  • 102. { 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 }
  • 103. ภาษาจาวาได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ไม=ตองแสดงคDาสFง 5 warning ท.Fอาจ ปรากฎขNนจากการใช5คDาสFงท.Fตามมาน.ในช=วงการคอมไพลGโปรแกรม M M
  • 104. M เมธอดท.FกDาหนดขNนในคลาสใดๆสามารถเร.ยกใช5งานได5สองรKปแบบค$อ การ M เร.ยกใช5งานจากคลาสท.Fตางกน และการเร.ยกใช5งานภายในคลาสเด.ยวกน = เมธอดท.FกDาหนดขNนในคลาสอาจม. argument ท.Fรบค=าเพ$FอนDาไปใช5ในเมธอด M เมธอดใดๆของคลาสสามารถท.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อเด.ยวกนแต=จะม.จDานวนหร$อชนด F ข5อมKลของ argument ท.Fต=างกน
  • 105. M โดยทFวไป ค6ณลกษณะของคลาสจะม. modifier เปLนแบบ private ทMงน.เพ$อ M F ปoองกนการเข5าถNงจากคลาสอ$Fน โดยทFวไป เมธอดของคลาสจะม. modifier เปLนแบบ public ทMงน.เพ$อให5 M F เมธอดจากคลาสอ$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
  • 106. M คลาสท6กคลาสในภาษาจาวาถ5าไม=ได5สบทอดจากคลาสใดเลยจะถ$อว=าคลาส $ นMนส$บทอดจากคลาสท.ช$Fอ Object F เมธอดแบบ overriden จะเปLนการเข.ยนเมธอดของ superclass ขNMนใหม=  super เปLนค.ยเวรGดท.Fใช5ในการอ5างองถNง superclass G การม.ได5หลายรKปแบบหมายถNง – การท.เราสามารถท.จะสร5างหร$ออ5างถNงอPอบเจกตGของคลาสท.ส$บทอดกนได5 F F F หลายรKปแบบ – การท.เราสามารถท.จะอ5างถNงเมธอดช$Fอเด.ยวกนได5หลายรKปแบบ F F เมธอดแบบ overloaded หมายถNงเมธอดท.ม.ช$Fอเด.ยวกนมากกว=าหนNงเมธอด F F โดยม.จDานวนหร$อชนดของ argument ท.Fแตกต=างกน
  • 107. M เมธอดแบบ overridden หมายถNงการท.F subclass สร5างเมธอดท.ม.อยKแล5วใน F = superclass ขNMนใหม= โดยใช5ช$Fอ argument และชนดข5อมKลของค=าท.ส=งกลบ F ของเมธอดเหม$อนเดม ค.ยGเวรGด instanceof เปLนตวดDาเนนการท.Fใช5กบอPอบเจกตGและคลาส เพ$อตรวจ F สอบว=าอPอบเจกตGใดๆ เปLน อPอบเจกตGของคลาสท.ระบ6หร$อไม= F การ 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ด void โดยคลาสท6กคลาสจะม. default G constructor มาให5อยK=แล5ว แต=เราสามารถท.FจะกDาหนด constructor ขNMนใหม= เองได5
  • 108. M Constructor แบบ overloaded หมายถNง constructor ท.Fม.จDานวนหร$อชนด ของ argument ท.Fแตกต=างกน เมธอดท.Fช$Fอ this() เปLนการเร.ยกใช5 constructor ของคลาสตวเอง Constructor แบบ default ของคลาสท.FเปLน superclass จะถKกเร.ยกใช5โดย อตโนมตท6กครMงท.ม.การสร5าง อPอบเจกตGของคลาส F คลาสท.ช$Fอ Object ม.เมธอดท.FสDาคญอยKสองเมธอดค$อเมธอด toString() และ F = เมธอด equals() Auto-boxing / Auto-unboxing ค$อการแปลงค=าระหว=างชนกข5อมKลพ$นฐาน M กบคลาสประเภท Wrapper ท.Fสอดคล5องกนโดยอตโนมต เมธอดแบบ static สามารถถKกเร.ยกใช5จากช$Fอของคลาสได5โดยไม=จDาเปLน ต5องสร5างอPอบเจกตG
  • 109. M คลาสแบบ final ค$อคลาสท.ไม=สามารถส$บทอดได5 F คลาสภายในหมายถNงคลาสท.อยK=ภายในคลาส หร$อคลาสท.FอยKภายในเมธอด F = Generic Type สามารถท.จะทDาให5เราประกาศคลาสหร$ออนเตอรGเฟสใดๆให5ม. F ชนดข5อมKลเปLนแบบทFวไป (Generic Type) แล5วค=อยระบ6ชนดข5อมKลแบบ เจาะจงตอนท.สร5างอPอบเจกตGได5 F เมธอดแบบ Generic ค$ดเมธอดท.Fม. argument ท.เปLน Generic Type F Annotation จะให5ข5อมKลเก.Fยวกบโปรแกรม โดยท.Fจะไม=ม.ผลโดยตรงต=อคDาสFง ใดๆของ code ท.ทDาการบนทNก F

Toplist

โพสต์ล่าสุด

แท็ก

ไทยแปลอังกฤษ แปลภาษาไทย โปรแกรม-แปล-ภาษา-อังกฤษ พร้อม-คำ-อ่าน lmyour แปลภาษา แปลภาษาอังกฤษเป็นไทย pantip ไทยแปลอังกฤษ ประโยค แอพแปลภาษาอาหรับเป็นไทย ห่อหมกฮวกไปฝากป้าmv ระเบียบกระทรวงการคลังว่าด้วยการจัดซื้อจัดจ้างและการบริหารพัสดุภาครัฐ พ.ศ. 2560 แปลภาษาอาหรับ-ไทย Terjemahan พจนานุกรมศัพท์ทหาร หยน แปลภาษา มาเลเซีย ไทย Bahasa Thailand ข้อสอบภาษาอังกฤษ พร้อมเฉลย pdf บบบย tor คือ จัดซื้อจัดจ้าง การ์ดแคปเตอร์ซากุระ ภาค 4 ชขภใ ยศทหารบก เรียงลําดับ ห่อหมกฮวกไปฝากป้า หนังเต็มเรื่อง เขียน อาหรับ แปลไทย แปลภาษาอิสลามเป็นไทย Google map กรมพัฒนาฝีมือแรงงาน อบรมออนไลน์ กระบวนการบริหารทรัพยากรมนุษย์ 8 ขั้นตอน ข้อสอบคณิตศาสตร์ พร้อมเฉลย ค้นหา ประวัติ นามสกุล อาจารย์ ตจต แจ้ง ประกาศ น้ำประปาไม่ไหล แปลบาลีเป็นไทย แปลภาษา ถ่ายรูป แปลภาษาจีน แปลภาษามลายู ยาวี โรงพยาบาลภมูพลอดุยเดช ที่อยู่ Google Drive Info TOR คือ กรมพัฒนาฝีมือแรงงาน ช่างไฟฟ้า กรมพัฒนาฝีมือแรงงาน อบรมฟรี 2566 กลยุทธ์ทางการตลาด มีอะไรบ้าง การบริหารทรัพยากรมนุษย์ มีอะไรบ้าง การประปาส่วนภูมิภาค การ์ดแคปเตอร์ซากุระ ภาค 3 ขขขขบบบยข ่ส ข่าว น้ำประปา วันนี้ ข้อสอบโอเน็ต ม.6 มีกี่ตอน ตารางธาตุ ประปาไม่ไหล วันนี้