• Like
Java Programming: การเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

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

  • 6,906 views
Published

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

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

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
6,906
On SlideShare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
182
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. บทท 6 การพฒนาโปรแกรมภาษาจาวาเชงออบเจกต (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. รKปแบบการเรยกใช$เมธอด ร*ปแบบของคDาสFงท.ม.การเร.ยกใช5เมธอดเปLนดงน.M F obj.methodName([arguments]);  arguments อาจจะเปLนข$อม*ลค+าคงทหร-อตวแปร ชนดข5อมKลของ arguments ท.Fใช5ในการเร.ยกเมธอด จะต$องสอดคล$องกน กบชนดข5อมKลของ arguments ของเมธอด
  • 4. การเร.ยกใช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ของคลาสขNนมาก=อน และสามารถเร.ยกเมธอดได5 M ท6กเมธอด
  • 5. ตวอย+างโปรแกรมทม.การเร.ยกใช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"); } } }
  • 6. ตวอย+างโปรแกรมทม.การเร.ยกใช5เมธอดจากคลาสต=างกน public class MyMain { public static void main(String args[]) { NumericalClass obj = new NumericalClass(); obj.calculate(); } }
  • 7. ตวอย+างโปรแกรมทม.การเร.ยกใช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(); } }
  • 8. การส=งผ+าน argument กรณทเมธอดม argument ทจะรบค+าเพ$อนDาไปใช5ในเมธอด อาทเช+น F public void setGPA(double GPA) { ... } ค'าสงท.เรยกใช5เมธอดน0 จะต$องส+ง argument ท.Fมชนดข5อมKลเปLน double F . ไปพร5อมกบช$Fอเมธอด เช=น setGPA(3.0);
  • 9. ตวอย+างโปรแกรม 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); } }
  • 10. argument ของเมธอด argument ของเมธอดจะม.ชนดข5อมKลเปLนสองแบบตามชนดข5อมKลของ ตวแปรดงน.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. argument ทมชนดข$อม*ลแบบอ$างอง เราจะต5องส=งอPอบเจกตGท.Fม.ชนดข5อมKลท.สอดคล5องไปเท=านMน F ยกเว5นกรณ.ท.F argument นMนม.ชนดข5อมKลเปLน String ซNFงในกรณ.นจะ .M สามารถส=งข5อมKลค=าคงท.ได5 F
  • 12. ตวอย+างโปรแกรมทม.การส=ง argument ท.เปLนอPอบ 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 public 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); } }
  • 14. ชนดข5อมKลและจDานวนของ argument ชนดข5อมKลของ argument ท.จะส=งผ=านไปยงเมธอดไม=จ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. ตวอย+างโปรแกรมทม.การส=ง 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); } }
  • 16. การเปล.Fยนแปลงค=าของ argument การส=ง argument ท.มชนดข$อม*ลเป%นแบบพ-นฐาน หากมการเปลยนแปลงค+า F 0 ของ argument ภายในเมธอดทถ*กเรยกใช$งาน จะไม+มผลท'าให$ค+าของ argument ทส+งไปเปลยนค+าไปด$วย การส=ง argument ท.มชนดข$อม*ลเป%นแบบอ$างอง จะเป%นการส+งต'าแหน+ง F อ$างองของออบเจกตไปให$กบเมธอดทถ*กเรยกใช$งาน ดงน0นการเปลยนแปลง ค+าของคณลกษณะของอPอบเจกตGจะมผลท'าให$ค+าของคณลกษณะของออบ เจกตทส+งไปเปลยนไปด$วย
  • 17. ตวอย+างโปรแกรมทแสดงการเปล.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; }
  • 18. ตวอย+างโปรแกรมทแสดงการเปล.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(); } }
  • 19. การรบค=าท.Fสงกลบมาจากเมธอด = เมธอดใดๆของคลาสสามารถท.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. modifier ของเมธอด modifier ของเมธอดประกอบด5วย • access modifier • static • abstract • synchronized • final access modifier ใช5เพ$อระบ6ระดบการเข5าถNง โดยม.ค.ยGเวรGดต=างๆดงน.M F • public • protected • private • default (ไม+ระบ ค.ยเวรGดใดๆ บ6 G )
  • 21. ตวอย+างโปรแกรมทแสดงการประกาศเมธอดและค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); } }
  • 22. ตวอย+างโปรแกรมทแสดงการประกาศเมธอดและค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(); } }
  • 23. การเข.ยนโปรแกรมโดยใช5หลกการของการห=อห65ม ค6ณลกษณะเด=นของโปรแกรมเชงอPอบเจกตGม.อยK=สามอย=างค$อ การห=อห6ม 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. ตวอย+างโปรแกรมท.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); } } }
  • 25. เมธอดแบบ setter เมธอดแบบ accessor แบ=งออกได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. ตวอย+างโปรแกรมท.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()); } }
  • 27. เมธอดแบบ getter เมธอดแบบ getter จะใช5ในการเร.ยกค=าของค6ณลกษณะ โดยทFวไปช$Fอของเมธอดแบบ getter จะขNMนต5นด5วยคDาว=า get แล5วตามด5วยช$Fอ ของค6ณลกษณะ ซNFงม.รปแบบดงน.M K public dataType getAttributeName() { return attributeName; }
  • 28. ตวอย+างโปรแกรมท.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; } }
  • 29. ตวอย+างโปรแกรมท.Fใช5หลกการของการห=อห65ม public String getID() { return id; } public String getName() { return name; } public double getGPA() { return gpa; } }
  • 30. ค.ยเวรGด this 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. ตวอย+างโปรแกรมการใช$ this public 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); } }
  • 32. การเข.ยนโปรแกรมโดยใช5หลกการของการส$บทอด ข5อด.ของการส$บทอดค$อ การนDาคลาสท.Fม.อยK=แล5วมาใช5ใหม=โดยการเพFมเตม ค6ณลกษณะหร$อเมธอดในคลาสใหม= การพฒนาคลาสขNMนใหม=ทช$Fอ GradStudent .F สามารถท.จะเล$อกวธ.การได5 F สองแบบค$อ • สร5างคลาสขNMนมาใหม=โดยไม=อ5างองกบคลาสเดมท.Fชอ Student $F • สร5างคลาสท.สบทอดมาจากคลาสเดมท.ช$Fอ Student F $ F
  • 33. ตวอย+างโปรแกรมแสดงคลาสท.ช$Fอ Student 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. ตวอย+างโปรแกรมท.ไม=ได5ใช5หลกการของการส$บทอด 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. ตวอย+างโปรแกรมท.ไม=ได5ใช5หลกการของการส$บทอด 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. ตวอย+างโปรแกรมท.ใช5หลกการของการส$บทอด 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. รKปแสดงหลกการของการส$บทอด
  • 38. ตวอย=างการส$บทอดท.ไม=ถKกต5อง F เราสามารถท.ตรวจสอบหลกการของการส$บทอดด5วยคDาว=า is a F public class Shirt { char size; float price; } public class Skirt extends Shirt { boolean long; }
  • 39. ตวอย=างการส$บทอดท.Fถกต5อง K public class Clothing { char size; float price; } public class Shirt extends Clothing { } public class Skirt extends Clothing { boolean long; }
  • 40. ค.ยGเวรGด protected ค6ณลกษณะหร$อเมธอดของ superclass ท.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. ค.ยGเวรGด protected ภาษาจาวากDาหนดให5ม. access 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. ตวอย=างโปรแกรมท.Fใช5คยเวรGด protected . 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. คลาสท.Fช$Fอ Object ภาษาจาวาได5กDาหนดให5คลาสใดๆ สามารถจะส$บทอดคลาสอ$Fนได5เพ.ยง คลาสเด.ยวเท=าน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 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. ตวอย=างโปรแกรมท.Fใช5คยGเวรGด super . 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. ตวอย=างโปรแกรมท.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); } }
  • 47. การเข.ยนโปรแกรมโดยใช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
  • 48. Dynamic Binding ข5อด.ของการม.ได5หลายรKปแบบอ.กประการหนNง ค$อการท.FสามารถกDาหนดอP 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. รKปแสดงการม.ได5หลายรKปแบบ ตวอย=าง Student s1 = new Student(); Student s1 = new GradStudent(); Student s1 = new PhDStudent();
  • 50. เมธอดแบบ Overloaded ภาษาจาวาอน6ญาตให5คลาสใดๆม.เมธอดท.Fม.ช$Fอเด.ยวกนมากกว=าหนNงเมธอด 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. ตวอย+างโปรแกรมแสดงเมธอดแบบ overloaded public 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; } }
  • 52. เมธอดแบบ overridden การกDาหนดเมธอดแบบ overridden เป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. ตวอย+างโปรแกรมแสดงเมธอดแบบ overridden class 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); } }
  • 54. 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 ท.กDาหนดไว5 ตวอย=างเช=น = F Student s1 = new GradStudent(); s1.getSupervisor(); // Fail to compile
  • 55. การส+งผ+าน 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(); เราสามารถท.จะเร.ยกใช5เมธอด printInfo(Student s)ได5หลายรKปแบบ F ดงน.M printInfo(s1) printInfo(s2)  หร$อ printInfo(new FullTimeStudent())
  • 56. ตวด'าเนนการ 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!
  • 57. ตวอย+างเมธอดท.แสดงการใช5 instanceof 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 ออบเจกต การ 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. การเรยกใช$เมธอดของออบเจกต การเร.ยกใช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อผดพลาดในช=วงของการรนโปรแกรม
  • 60. ตวอย+างโปรแกรมแสดงการเร.ยกใช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; } }
  • 61. ตวอย+างโปรแกรมแสดงการเร.ยกใช5เมธอด public class GradStudent extends Student { private String thesisTitle; private String supervisor; public String getThesisTitle() { return thesisTitle; } public String getSupervisor() { return supervisor; } }
  • 62. ตวอย+างโปรแกรมแสดงการเร.ยกใช5เมธอด public class TestCallingMethods { public static void main(String args[]) { Student s1 = new GradStudent(); s1.getSupervisor(); // compile error Student s2 = new Student(); ((GradStudent) s2).getSupervisor(); // runtime error } }
  • 63. Constructor constructor เป%นเมธอดทมช-อเดยวกบช-อคลาส ซNงม.รปแบบดงน.M 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. ตวอย+างโปรแกรมแสดงการเร.ยกใช5 constructor public 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"); } }
  • 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. รKปแสดงตวอย=างการทDางานขMนตอนคDาสFง new คDาสFง MyDate d1 = new MyDate(16,8,1972); ขMนตอนท.หนNFง F ขMนตอนท.สอง F ขMนตอนท.สาม F ขMนตอนท.ส.F F
  • 67. Constructor แบบ Overloaded เราสามารถท.จะสร5าง 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. ตวอย+างโปรแกรมแสดง constructor แบบ 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. เมธอด this() เมธอดท.Fช$Fอ this() เปLนการเร.ยกใช5 constructor ของคลาสตวเอง โดยจะ ต5องเปLนคDาสFงแรกส6ดท.FอยK=ใน constructor แบบ overloaded
  • 70. ตวอย+างโปรแกรมแสดงการใช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; } }
  • 71. เมธอด super() constructor ของ 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. ตวอย+างการเร.ยกใช5 constructor ของ 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. ข0นตอนการท'างานของ constructor • ถ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. ตวอย+างคลาสท.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(" "); } }
  • 75. เมธอดของคลาสท.ช$Fอ Object 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. ตวอย+างโปรแกรมแสดงเมธอด 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); } } ผลลพธGท.Fได5จากการรนโปรแกรม Thana
  • 78. เมธอด equals() คลาสทต$องการสร$างเมธอดเพ-อเปรยบเทยบค=าของอPอบเจกตGว+าเท+ากนหร-อ ไม+ จะต$องม.เมธอดแบบ overriden ท.ช$Fอ F equals()
  • 79. ตวอย+างโปรแกรมแสดงเมธอด 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)); } } ผลลพธGท.Fได5จากการรนโปรแกรม true
  • 80. คลาสประเภท Wrapper คลาสประเภท Wrapper จะช=วยในการสร5างอPอบเจกตGท.FเกPบชนดข5อมKลแบบ พ$นฐานไว5ในคอลเลPกชFนแบบ Heterogeneous M คลาสประเภท Wrapper ม.ดงน.M
  • 81. ตวอย=างโปรแกรมแสดงการใช5คลาสประเภท Wrapper 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. Autoboxing และ Auto-unboxing  คDาสFง Autoboxing ค$อการแปลงจากชนดข5อมKลพ$นฐานเช=น intไปเปLนคลาส M ประเภท Wrapper เช=น Integer คDาสFง Auto-unboxing ค$อการแปลงจากคลาสประเภท Wrapper เช=น Byte ไปเปLนชนดข5อมKลพ$นฐานเช=น byte M
  • 83. ตวอย=างการใช5คDาสFง Auto-boxing/Auto-unboxing public 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. ค6ณลกษณะแบบ static คยเวรด static สามารถทจะใช$กบค6ณลกษณะและเมธอดของคลาสได$ ค6ณลกษณะของคลาสทเป%นแบบ static จะเป%นค6ณลกษณะททกออบ M เจกตของคลาสน.ใช$ร+วมกน ค6ณลกษณะของคลาสทเป%นแบบ static สามารถถKกเรยกใช$จากช-อของ คลาสได$โดยไม+จ'าเป%นต$องสร$างออบเจกต อาทเช+น • Student.counter
  • 85. ตวอย+างโปรแกรมแสดงการใช5ค.ยเวรGด static 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 Initializer Static Initializer ค-อบลอกในคลาสใดๆทอย*+นอกเมธอด และมคยเวรด 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. ตวอย+างโปรแกรมแสดง 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; } } ผลลพธGท.Fได5จากการรนโปรแกรม x = 3
  • 89. คยเวรด final คยเวรด final สามารถจะใช$ได$กบคลาส ตวแปร และเมธอด คลาสทม modifier เป%น final จะทDาให5คลาสอ$Fนไม+สามารถส-บทอดคลาสน.M ได$ เมธอดทม modifier เป%น final ค$อเมธอดท.Fจะไม=สามารถม.เมธอดแบบ overriden ได5 ตวแปรทม modifier เป%น final ค-อค+าคงท ซNFงจะทDาให5สามารถกDาหนดค=า ได5เพ.ยงครMงเด.ยวเท=านMน
  • 90. คลาสภายใน คลาสภายใน (Inner class) ค$อคลาสท.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. คลาสภายในท.อยKภายในคลาส 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 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(); } }
  • 93. คลาสภายในท.อยK=ภายในเมธอด 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. ค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
  • 95. ตวอย+างโปรแกรมแสดงคลาสท.อยK=ภายในเมธอด 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. Generic Types เราสามารถท.จะประกาศคลาสหร$ออนเตอรGเฟสใดๆให5ม.ชนดข5อมKลเปLนแบบ 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. ตวอย+างแสดงคลาสท.ใช5 Generic Type 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. เมธอดแบบ Generic เราสามารถท.จะใช5 Generic Type กบเมธอดหร$อ constructor ใดๆกPได5 F [modifier] <TypeVariable> return_type methodName(TypeVaraible varName) { [method_body] } โดยท.F – TypeVariable ค$อช$Fอของตวแปรชนดข5อมKล – varName ค$อช$Fอ argument
  • 99. ตวอย+างแสดงคลาสท.ประกาศเมธอดแบบ Generic 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. 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 สามารถท.จะประมวลผลข5อมKล annotation ในการสร5างโค5ดท.FเปLนไฟลG XML ได5 F – ช=วยในกระบวนการขMนตอน runtime ทMงน.Mจาก annotation บางคDาสFงจะสามารถตว รสอบได5ในช=วง runtime
  • 101. 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() { }
  • 102. 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 }
  • 103. 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ไม=ตองแสดงคDาสFง 5 warning ท.Fอาจ ปรากฎขNนจากการใช5คDาสFงท.Fตามมาน.ในช=วงการคอมไพลGโปรแกรม M M
  • 104. สร6ปเน$อหาของบท 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. สร6ปเน$อหาของบท 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. สร6ปเน$อหาของบท 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. สร6ปเน$อหาของบท 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. สร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งท.ม.การสร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. สร6ปเน$อหาของบท 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