ต วอย างโค ดท ม ภาษาจาวาท ม หลายๆคลาส
- 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