java programming:...
DESCRIPTION
แนะนำการเขียนโปรแกรมภาษาจาวาเชิงอ็อบเจกต์ โดยแนะนำการใช้เมธอด การใช้ constructor การเขียนโปรแกรมโดยใช้คุณลักษณะเด่นของโปรแกรมเชิงอ็อบเจกต์ อาทิเช่น การห่อหุ้ม การสืบทอด และการมีได้หลาย รูปแบบ เป็นต้น จากนั้นจะเป็นการแนะนำคลาสภายใน Generic Type และ AnnotationTRANSCRIPT
บทท�� 6
การพ�ฒนาโปรแกรมภาษาจาวาเช�งอ�อบเจกต� (Object Oriented Java Programming)
ผศ.ธน�ศา เคร$อไวศยวรรณคณะเทคโนโลย.สารสนเทศ
สถาบ�นเทคโนโลย.พระจอมเกล5าเจ5าค6ณทหารลาดกระบ�ง
ว�ตถ�ประสงค�อธ�บายเมธอด และการเร�ยกใช$เมธอดอธ�บายค�ย�เว�ร�ดท��ใช$เป%น modifier ของเมธอดแนะน'าการเข�ยนโปรแกรมภาษาจาวาเช�งอ�อบเจกต�อธ�บายค�ณล�กษณะเด=นของโปรแกรมเช�งอ�อบเจกต�อธ�บายความหมายของ Constructor แนะนDาคลาสประเภท Wrapper อธ�บายเมธอดของคลาสท.Fช$Fอ Object ค.ยGเว�รGดอ$Fนๆ ท.FสDาค�ญ แนะนDาคลาสภายใน Generic และ คDาส�Fง Annotation
รKปแบบการเร�ยกใช$เมธอดร*ปแบบของคDาส�Fงท.Fม.การเร.ยกใช5เมธอดเปLนด�งน.M obj.methodName([arguments]); arguments อาจจะเปLนข$อม*ลค+าคงท��หร-อต�วแปรชน�ดข5อมKลของ arguments ท.Fใช5ในการเร.ยกเมธอด จะต$องสอดคล$องก�น
ก�บชน�ดข5อมKลของ arguments ของเมธอด
การเร.ยกใช5เมธอดเมธอดท.FกDาหนดขNMนในคลาสใดๆสามารถเร.ยกใช5งานได5สองรKปแบบค$อ
• การเร.ยกใช5งานจากคลาสท.Fต=างก�น• การเร.ยกใช5งานภายในคลาสเด.ยวก�น
การเร.ยกใช5เมธอดจากคลาสท.Fต=างก�น จะต5องม.การสร5างอPอบเจกตGของคลาสท.Fม.เมธอดท.FจะถKกเร.ยกใช5งานก=อน จNงจะสามารถเร.ยกใช5เมธอดได5
การเร.ยกใช5เมธอดภายในคลาสเด.ยวก�น ในบางกรณ.จะสามารถทDาได5โดยไม=จDาเปLนต5องสร5างอPอบเจกตGของคลาสขNMนมาก=อน และสามารถเร.ยกเมธอดได5ท6กเมธอด
ต�วอย+างโปรแกรมท��ม.การเร.ยกใช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");}
}}
ต�วอย+างโปรแกรมท��ม.การเร.ยกใช5เมธอดจากคลาสต=างก�น
public class MyMain {public static void main(String args[]) {
NumericalClass obj = new NumericalClass();obj.calculate();
}}
ต�วอย+างโปรแกรมท��ม.การเร.ยกใช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();}
}
การส=งผ+าน argumentกรณ�ท��เมธอดม� argument ท��จะร�บค+าเพ$FอนDาไปใช5ในเมธอด อาท�เช+น
public void setGPA(double GPA) {...
}ค'าส��งท.Fเร�ยกใช5เมธอดน�0 จะต$องส+ง argument ท.Fม.ชน�ดข5อมKลเปLน double
ไปพร5อมก�บช$Fอเมธอด เช=น setGPA(3.0);
ต�วอย+างโปรแกรม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);
}}
argument ของเมธอดargument ของเมธอดจะม.ชน�ดข5อมKลเปLนสองแบบตามชน�ดข5อมKลของ
ต�วแปรด�งน.M • argument ท.Fม.ชน�ดข5อมKลแบบพ$Mนฐาน • argument ท.Fม.ชน�ดข5อมKลแบบอ5างอ�ง
ในกรณ.ของ argument ท.Fม.ชน�ดข5อมKลแบบพ$Mนฐาน เราสามารถท.Fจะส=งค=าคงท.Fข5อมKล ต�วแปร หร$อน�พจนGให5ก�บ argument ได5 ต�วอย=างเช=น• ค=าคงท.Fข5อมKล เช=น
s1.setGPA(3.0);• ต�วแปร เช=น
double x = 3.0; s1.setGPA(x);
• น�พจนG เช=นs1.setGPA(3.0+0.05);
argument ท��ม�ชน�ดข$อม*ลแบบอ$างอ�ง เราจะต5องส=งอPอบเจกตGท.Fม.ชน�ดข5อมKลท.Fสอดคล5องไปเท=าน�Mน ยกเว5นกรณ.ท.F argument น�Mนม.ชน�ดข5อมKลเปLน String ซNFงในกรณ.น.Mจะ
สามารถส=งข5อมKลค=าคงท.Fได5
ต�วอย+างโปรแกรมท��ม.การส=ง argument ท.FเปLนอPอบเจกตGpublic class StudentV1 {
String id; String name; MyDate dob; public void setDOB(MyDate d) {
dob = d;}public MyDate getDOB() { return dob;}
}------------------------------------------------------------------------------------------public class TestStudentV1 { public static void main(String args[]) {
StudentV1 s1 = new StudentV1(); MyDate d1 = new MyDate(16, 12, 1980); s1.setDOB(d1);
}}
ต�วอย+างโปรแกรมคลาส MyDatepublic class MyDate { private int day; private int month; private int year; public MyDate(int d, int m, int y) { day = d; month = m; year = y; } public void setDay(int d) { day = d; } public void setMonth(int m) { month = m; } public void setYear(int y) { year = y; } public void showDetails() { System.out.println("Date : " + day + "/" + month + "/" + year); }}
ชน�ดข5อมKลและจDานวนของ argumentชน�ดข5อมKลของ argument ท.Fจะส=งผ=านไปย�งเมธอดไม=จDาเปLนท.Fจะต5องเปLน
ชน�ดข5อมKลเด.ยวก�น แต=ต5องเปLนชน�ดข5อมKลท.Fสามารถแปลงข5อมKลให5กว5างขNMนได5โดยอ�ตโนม�ต�
เมธอดใดๆอาจม. argument สDาหร�บร�บค=ามากกว=าหนNFงต�ว แต=การเร.ยกใช5เมธอดเหล=าน.Mจะต5องส=ง argument ท.Fม.ชน�ดข5อมKลท.Fสอดคล5องก�นและม.จDานวนเท=าก�น
ต�วอย+างโปรแกรมท��ม.การส=ง 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);}
}
การเปล.Fยนแปลงค=าของ argumentการส=ง argument ท.Fม�ชน�ดข$อม*ลเป%นแบบพ-0นฐาน หากม�การเปล��ยนแปลงค+า
ของ argument ภายในเมธอดท��ถ*กเร�ยกใช$งาน จะไม+ม�ผลท'าให$ค+าของ argument ท��ส+งไปเปล��ยนค+าไปด$วย
การส=ง argument ท.Fม�ชน�ดข$อม*ลเป%นแบบอ$างอ�ง จะเป%นการส+งต'าแหน+งอ$างอ�งของอ�อบเจกต�ไปให$ก�บเมธอดท��ถ*กเร�ยกใช$งาน ด�งน�0นการเปล��ยนแปลงค+าของค�ณล�กษณะของอPอบเจกตGจะม�ผลท'าให$ค+าของค�ณล�กษณะของอ�อบเจกต�ท��ส+งไปเปล��ยนไปด$วย
ต�วอย+างโปรแกรมท��แสดงการเปล.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;
}
ต�วอย+างโปรแกรมท��แสดงการเปล.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();
}}
การร�บค=าท.Fส=งกล�บมาจากเมธอดเมธอดใดๆของคลาสสามารถท.Fจะม.ค=าท.Fส=งกล�บมาได5 ซNFงชน�ดข5อมKลของค=าท.F
จะส=งกล�บอาจเปLนชน�ดข5อมKลแบบพ$Mนฐาน หร$อเปLนชน�ดข5อมKลแบบอ5างอ�ง เมธอดท.Fม.ค=าท.Fจะส=งกล�บมาจะต5องม.คDาส�Fง return ซNFงจะระบ6ค=าท.Fส=งกล�บ
โดยม.รKปแบบด�งน.Mreturn value;
คDาส�Fงท.Fเร.ยกใช5เมธอด อาจจะร�บค=าท.Fส=งกล�บมาเกPบไว5ในต�วแปรหร$อเปLนต�วถKกดDาเน�นการในน�พจนG ต�วอย=างเช=น
double d = getGPA();System.out.println("GPA:"+getGPA());
modifier ของเมธอดmodifier ของเมธอดประกอบด5วย
• access modifier• static• abstract• synchronized• final
access modifier ใช5เพ$Fอระบ6ระด�บการเข5าถNง โดยม.ค.ยGเว�รGดต=างๆด�งน.M• public• protected• private• default (ไม+ระบ�บ6ค.ยGเว�รGดใดๆ )
ต�วอย+างโปรแกรมท��แสดงการประกาศเมธอดและค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);
}}
ต�วอย+างโปรแกรมท��แสดงการประกาศเมธอดและค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();
}}
การเข.ยนโปรแกรมโดยใช5หล�กการของการห=อห65มค6ณล�กษณะเด=นของโปรแกรมเช�งอPอบเจกตGม.อยK=สามอย=างค$อ การห=อห65ม
การส$บทอด และการม.ได5หลายรKปแบบข5อด.ของการห=อห65มประการหนNFงค$อการซ=อนเร5นข5อมKล หล�กการห=อห65มของอPอบเจกตGทDาได5ด�งน.M
• กDาหนดค6ณล�กษณะของอPอบเจกตGให5ม. modifier เปLน private เพ$Fอซ=อนไม=ให5อPอบเจกตGอ$Fนๆเร.ยกใช5ได5
• กDาหนดเมธอดของอPอบเจกตGท.Fต5องการให5อPอบเจกตGอ$Fนๆเร.ยกใช5ให5ม. modifier เปLน public
ต�วอย+างโปรแกรมท.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);
}}
}
เมธอดแบบ setterเมธอดแบบ accessor แบ=งออกได5เปLนสองประเภทค$อ
• เมธอดแบบ setter• เมธอดแบบ getter
เมธอดแบบ setter จะใช5ในการกDาหนดค=าของค6ณล�กษณะ โดยท�Fวไปช$Fอของเมธอดแบบ setter จะขNMนต5นด5วยคDาว=า set แล5วตามด5วยช$Fอ
ของค6ณล�กษณะ ซNFงม.รKปแบบด�งน.M public void setAttributeName(dataType arg) {
attributeName = arg; }
ต�วอย+างโปรแกรมท.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());
}}
เมธอดแบบ getterเมธอดแบบ getter จะใช5ในการเร.ยกค=าของค6ณล�กษณะ โดยท�Fวไปช$Fอของเมธอดแบบ getter จะขNMนต5นด5วยคDาว=า get แล5วตามด5วยช$Fอ
ของค6ณล�กษณะ ซNFงม.รKปแบบด�งน.M public dataType getAttributeName() {
return attributeName; }
ต�วอย+างโปรแกรมท.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;
}}
ต�วอย+างโปรแกรมท.Fใช5หล�กการของการห=อห65มpublic String getID() { return id;}public String getName() { return name;}public double getGPA() {
return gpa;}
}
ค.ยGเว�รGด thisค.ยเว�รGด this หมายถNงอPอบเจกตGของต�วเอง เราสามารถท.Fจะเร.ยกใช5เมธอดหร$อค6ณล�กษณะภายในคลาสได5โดยใช5
ค.ยGเว�รGด this ซNFงม.รKปแบบด�งน.Mthis.methodName(); this.attributeName
โดยท�Fวไปเราจะไม=ใช5ค.ยGเว�รGด this ในคDาส�Fง ยกเว5นในกรณ.ท.FจDาเปLน
ต�วอย+างโปรแกรมการใช$ thispublic class ThisStudent {
private String id;private String name;private double gpa;public void setDetails(String id,String name, double gpa) {
this.id = id;this.name = name;this.gpa = gpa;
} public void showDetails() { System.out.println("ID: "+this.id);
System.out.println("Name: "+name);System.out.println("GPA: "+gpa);
}}
การเข.ยนโปรแกรมโดยใช5หล�กการของการส$บทอดข5อด.ของการส$บทอดค$อ การนDาคลาสท.Fม.อยK=แล5วมาใช5ใหม=โดยการเพ�Fมเต�ม
ค6ณล�กษณะหร$อเมธอดในคลาสใหม= การพ�ฒนาคลาสขNMนใหม=ท.Fช$Fอ GradStudent สามารถท.Fจะเล$อกว�ธ.การได5
สองแบบค$อ • สร5างคลาสขNMนมาใหม=โดยไม=อ5างอ�งก�บคลาสเด�มท.Fช$Fอ Student • สร5างคลาสท.Fส$บทอดมาจากคลาสเด�มท.Fช$Fอ Student
ต�วอย+างโปรแกรมแสดงคลาสท.Fช$Fอ Studentpublic class Student { private String id;
private String name;private double gpa;public void setID(String ID) { id = ID;}public void setName(String n) { name = n;}public void setGPA(double GPA) { gpa = GPA;}public void showDetails() {
System.out.println("ID: "+id);System.out.println("Name: "+name);System.out.println("GPA: "+gpa);
}}
ต�วอย+างโปรแกรมท.Fไม=ได5ใช5หล�กการของการส$บทอดpublic class GradStudent {
private String id;private String name;private double gpa;private String thesisTitle;private String supervisor;public void setID(String ID) { id = ID;}public void setName(String n) { name = n;}public void setGPA(double GPA) { gpa = GPA;}
ต�วอย+างโปรแกรมท.Fไม=ได5ใช5หล�กการของการส$บทอดpublic void setThesisTitle(String t) { thesisTitle = t;}public void setSupervisor(String s) { supervisor = s;
}public void showThesis() {
System.out.println("ThesisTitle: "+thesisTitle);System.out.println("Supervisor: "+supervisor);
}}
ต�วอย+างโปรแกรมท.Fใช5หล�กการของการส$บทอดpublic class GradStudent extends Student {
private String thesisTitle;private String supervisor;
public void setThesisTitle(String t) { thesisTitle = t;}
public void setSupervisor(String s) { supervisor = s;
} public void showThesis() {
System.out.println("ThesisTitle: "+thesisTitle);System.out.println("Supervisor: "+supervisor);
}}
รKปแสดงหล�กการของการส$บทอด
ต�วอย=างการส$บทอดท.Fไม=ถKกต5องเราสามารถท.Fตรวจสอบหล�กการของการส$บทอดด5วยคDาว=า is a
public class Shirt {char size;float price;
}public class Skirt extends Shirt {
boolean long;}
ต�วอย=างการส$บทอดท.FถKกต5อง
public class Clothing {char size;float price;
}public class Shirt extends Clothing {}public class Skirt extends Clothing {
boolean long;}
ค.ยGเว�รGด protectedค6ณล�กษณะหร$อเมธอดของ superclass ท.Fม. modifier เปLนแบบ private
จะทDาให5 subclass ไม=สามารถท.Fจะเร.ยกใช5ได5ภาษาจาวากDาหนดให5ม. access modifier ท.Fช$Fอ protected ซNFงจะทDาให5
subclass สามารถเร.ยกใช5เมธอดหร$อค6ณล�กษณะของ superclass ได5 ต�วอย=างเช=น
protected String name;
ค.ยGเว�รGด protectedภาษาจาวากDาหนดให5ม. access modifier ท.Fช$Fอ protected ซNFงจะทDาให5คลาสท.F
เปLน subclass สามารถท.Fจะเร.ยกใช5เมธอดหร$อค6ณล�กษณะของ superclass ได5 แม5ว=าจะอยK=ต=างคลาสหร$ออยK=ต=างแพคเกPจก�นกPตาม
modifier คลาสเด.ยวก�น
คลาสท.FอยK=ในแพจเกPจ
เด.ยวก�น
คลาสท.FเปLนsubcla
ssคลาสใดๆ
public√ √ √ √
protected√ √ √
default√ √
private√
ต�วอย=างโปรแกรมท.Fใช5ค.ยGเว�รGด protected public class Student {
protected String id; protected String name; protected double gpa; public void setDetails(String ID,String n,double GPA) {
id = ID;name = n;gpa = GPA;
} public void showDetails() { System.out.println("ID: "+id);
System.out.println("Name: "+name);System.out.println("GPA: "+gpa);
}}
คลาสท.Fช$Fอ Objectภาษาจาวาได5กDาหนดให5คลาสใดๆ สามารถจะส$บทอดคลาสอ$Fนได5เพ.ยง
คลาสเด.ยวเท=าน�Mน คลาสท6กคลาสในภาษาจาวาถ5าไม=ได5ส$บทอดจากคลาสใดเลยจะถ$อว=าคลาส
น�Mนส$บทอดจากคลาสท.Fช$Fอ Object ต�วอย=างเช=น
public class Student extends Object { ...
}คลาสท.Fช$Fอ Object จะม.เมธอดท.FสDาค�ญค$อ
public String toString() และ public boolean equals(Object o)
ค.ยGเว�รGด super super เปLนค.ยGเว�รGดท.Fใช5ในการอ5างอ�งถNง superclass เพ$Fอท.Fจะเร.ยกใช5
เมธอดหร$อ constructor ของ superclass โดยม.รKปแบบคDาส�Fงด�งน.Msuper.methodName([arguments])
ต�วอย=างเช=น คลาส GradStudent อาจม.เมธอดท.Fช$Fอ showDetails() โดยม.คDาส�Fงท.Fเร.ยกใช5เมธอด showDetails() ของคลาส Student และ showThesis() ของคลาส GradStudent
public void showDetails() { super.showDetails(); showThesis();
}
ต�วอย=างโปรแกรมท.Fใช5ค.ยGเว�รGด superpublic class Student {
private String id;private String name;private double gpa;public void showDetails() { System.out.println("ID: "+id); System.out.println("Name: "+name); System.out.println("GPA: "+gpa);
}}
ต�วอย=างโปรแกรมท.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);
}}
การเข.ยนโปรแกรมโดยใช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
Dynamic Bindingข5อด.ของการม.ได5หลายรKปแบบอ.กประการหนNFง ค$อการท.FสามารถกDาหนดอP
อบเจกตGได5หลายรKปแบบ ต�วอย=างเช=น จากรKปแบบSuperClass obj;
เราสามารถท.Fจะสร5างอPอบเจกตGท.Fช$Fอ obj ซNFงอาจเปLนอPอบเจกตGของคลาสท.FเปLน superclass หร$อท.FเปLน subclass ได5 โดยใช5คDาส�Fงท.Fม.รKปแบบด�งน.M
obj = new SuperClass(); หร$อ obj = new SubClass();
ต�วอย=างเช=น Student s;s = new GradStudent();
รKปแสดงการม.ได5หลายรKปแบบต�วอย=าง
Student s1 = new Student(); Student s1 = new GradStudent();Student s1 = new PhDStudent();
เมธอดแบบ Overloadedภาษาจาวาอน6ญาตให5คลาสใดๆม.เมธอดท.Fม.ช$Fอเด.ยวก�นมากกว=าหนNFงเมธอด
ได5 แต=เมธอดเหล=าน�Mนจะต5องม.จDานวนหร$อชน�ดข5อมKลของ argument ท.Fต=างก�น
ต�วอย=างต=อไปน.MเปLนการเข.ยนเมธอดแบบ overloaded ท.FถKกต5อง public void setDetails(String ID, String n) {}public void setDetails(String ID, double GPA) {}public double setDetails(double GPA, String n) {}
ต�วอย=างต=อไปน.MเปLนการเข.ยนเมธอดแบบ overloaded ท.Fไม=ถKกต5อง public void setDetails(String ID,double GPA) {}public void setDetails(String n,double GPA) {}
ต�วอย+างโปรแกรมแสดงเมธอดแบบ overloadedpublic class StudentV2 {
private String id;private String name;private double gpa; public void setDetails(String ID,String n) { id = ID; name = n;}public void setDetails(String ID,String n,double GPA) { id = ID; name = n; gpa = GPA;}
}
เมธอดแบบ overriddenการกDาหนดเมธอดแบบ overridden เปLนหล�กการท.Fส$บเน$Fองมาจากหล�กการ
ของการส$บทอด โดยคลาสท.FเปLน subclass สามารถท.Fจะเข.ยนเมธอดของ superclass ขNMนใหม=ได5 ว�ธ.การน.Mเร.ยกว=า เมธอดใน subclass เปLนเมธอดแบบ overridden
การเข.ยนเมธอดแบบ overridden ม.ข5อกDาหนดด�งน.M • จDานวนและชน�ดข5อมKลของ argument จะต5องเหม$อนเด�ม• ชน�ดข5อมKลของค=าท.Fส=งกล�บจะต5องเหม$อนเด�ม• access modifier จะต5องไม=ม.ระด�บตFDากว=าเด�มอาท�เช=น ถ5าเมธอดเด�มเปLน public
จะไม=สามารถเปล.FยนเปLน private ได5
ต�วอย+างโปรแกรมแสดงเมธอดแบบ overriddenclass Student {
: public void showDetails() {
System.out.println("ID: "+id);System.out.println("Name: "+name);System.out.println("GPA: "+gpa);
}}public class GradStudentV2 extends Student {
: public void showDetails() {
super.showDetails();System.out.println("ThesisTitle: "+thesisTitle);System.out.println("Supervisor: "+supervisor);
}}
Virtual Method Invocationโปรแกรมภาษาจาวาพ�จารณาเร.ยกใช5เมธอดจากชน�ดของอPอบเจกตGท.Fสร5าง
ขNMน ต�วอย=างเช=น คDาส�FงStudent s1 = new GradStudent(); s1.showDetails();
เปLนคDาส�Fงท.Fเร.ยกใช5เมธอด showDetails() ของคลาส GradStudent ไม=ใช=เมธอดของคลาส Student
แต=คอมไพเลอรGของภาษาจาวาจะไม=อน6ญาตให5เร.ยกใช5เมธอดใดๆกPตามท.Fไม=ม.การประกาศอยK=ในเมธอดของ superclass ท.FกDาหนดไว5 ต�วอย=างเช=น
Student s1 = new GradStudent();s1.getSupervisor(); // Fail to compile
การส+งผ+าน argument ได5หลายรKปแบบในกรณ.ท.Fเมธอดม. argument เปLนข5อมKลชน�ดคลาส เราสามารถท.Fจะส=ง อP
อบเจกตGของคลาสท.FเปLน subclass ของคลาสน�Mนแทนได5 ต�วอย=างเช=น คDาส�FงStudent s1 = new Student();PhDStudent s2 = new GradStudent();
เราสามารถท.Fจะเร.ยกใช5เมธอด printInfo(Student s)ได5หลายรKปแบบด�งน.M
printInfo(s1)printInfo(s2)
หร$อ printInfo(new FullTimeStudent())
ต�วด'าเน�นการ 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!
ต�วอย+างเมธอดท.Fแสดงการใช5 instanceof public void printInfo(Student s) { if (s instanceof PhDStudent) {
System.out.println("PhD Student"); } else if (s instanceof GradStudent) {
System.out.println("Graduate Student"); } else if (s instanceof FullTimeStudent) {
System.out.println("Full-Time Student"); } else if (s instanceof PartTimeStudent) {
System.out.println("Part-Time Student"); } else if (s instanceof Student) { System.out.println("Student"); } }
การ 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อผ�ดพลาดในช=วงของการร�นโปรแกรม
การเร�ยกใช$เมธอดของอ�อบเจกต�การเร.ยกใช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อผ�ดพลาดในช=วงของการร�นโปรแกรม
ต�วอย+างโปรแกรมแสดงการเร.ยกใช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;}
}
ต�วอย+างโปรแกรมแสดงการเร.ยกใช5เมธอด public class GradStudent extends Student {
private String thesisTitle;private String supervisor;public String getThesisTitle() {
return thesisTitle;}public String getSupervisor() { return supervisor;}
}
ต�วอย+างโปรแกรมแสดงการเร.ยกใช5เมธอด public class TestCallingMethods {
public static void main(String args[]) {Student s1 = new GradStudent();s1.getSupervisor();// compile errorStudent s2 = new Student();((GradStudent) s2).getSupervisor();// runtime error
} }
Constructorconstructor เป%นเมธอดท��ม�ช-�อเด�ยวก�บช-�อคลาส ซNFงม.รKปแบบด�งน.M
[modifier] ClassName([arguments]) {[statements]
}constructor เปLนเมธอดท.Fไม=ม.ค=าท.Fจะส=งกล�บแต=ไม=ต5องระบ6ค.ยGเว�รGด voidโดยท��วไปคลาสท�กคลาสจะม� default constructor ซNFงม.รKปแบบด�งน.M
public ClassName() {}
เราสามารถท��จะเข�ยน constructor ในคลาสใดๆขNMนมาก�ได$ default constructor จะหายไปเม-�อม�การเข�ยน constructor ข40นใหม+
ต�วอย+างโปรแกรมแสดงการเร.ยกใช5 constructorpublic class Student {
private String id;private String name;public Student(String ID,String n) { id = ID; name = n;}
}public class TestConstructor {
public static void main(String args[]) { Student s = new Student(); //illegal Student s = new Student("1122","Somchai");}
}
ค'าส��ง 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;
} }
รKปแสดงต�วอย=างการทDางานข�MนตอนคDาส�Fง newคDาส�Fง
MyDate d1 = new MyDate(16,8,1972);
ข�Mนตอนท.FหนNFง ข�Mนตอนท.Fสอง
ข�Mนตอนท.Fสาม ข�Mนตอนท.Fส.F
Constructor แบบ Overloadedเราสามารถท.Fจะสร5าง constructor แบบ overloaded ของคลาสได$constructor แบบ overloaded จะม�จ'านวนหร-อชน�ดข$อม*ลท��แตกต+างก�นของ
argumentsค'าส��ง new ท.Fใช5ในการสร5างอPอบเจกตGจะเร.ยกใช5 constructor ท.Fม. argument
ท.Fส=งผ=านมาสอดคล5องก�บ constructor ท.FกDาหนด ข5อด.ของการสร5าง constructor แบบ overloaded ค$อทDาให5เราสามารถท.F
สร5างอPอบเจกตGเร�Fมต5นได5หลายรKปแบบเมธอดท.Fช$Fอ this() เปLนการเร.ยกใช5 constructor ของคลาสต�วเอง โดยจะ
ต5องเปLนคDาส�Fงแรกส6ดท.FอยK=ใน constructor แบบ overloaded
ต�วอย+างโปรแกรมแสดง constructor แบบ overloadedpublic class Student {
private String id;private String name;private double gpa;public Student(String ID,String n) { id = ID; name = n;}public Student(String ID,String n,double GPA) { id = ID; name = n; gpa = GPA;}
}
เมธอด this() เมธอดท.Fช$Fอ this() เปLนการเร.ยกใช5 constructor ของคลาสต�วเอง โดยจะ
ต5องเปLนคDาส�Fงแรกส6ดท.FอยK=ใน constructor แบบ overloaded
ต�วอย+างโปรแกรมแสดงการใช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;}
}
เมธอด super()constructor ของ superclass จะไม+ส-บทอดมาย�ง subclassเราสามารถท.Fจะเร.ยกใช5 constructor ของ superclass ได5โดยใช5เมธอดท.Fช$Fอ
super() โดยส=งผ=าน argument ท.Fสอดคล5องก�น เมธอด super() จะต5องเปLนคDาส�Fงแรกของ constructor เช=นเด.ยวก�บ
เมธอดท.Fช$Fอ this() โดยท�FวไปการทDางานของ constructor ของคลาสใดๆจะม.ผลทDาให5ม.การ
เร.ยกใช5 constructor ของ superclass น�Mน ซNFงถ5าไม=ม.คDาส�Fง super() อยK=ในคDาส�Fงแรกของ constructor ของคลาสน�Mน ภาษาจาวาจะเร.ยกใช5 constructor แบบ default ของ superclass น�Mนโดยอ�ตโนม�ต�
ต�วอย+างการเร.ยกใช5 constructor ของ superclasspublic class StudentV1 {
protected String name;public StudentV1(String n) {
name = n;}
}------------------------------------------------------public class GradStudentV1 extends StudentV1 {
public GradStudentV1(String n) {name = n; /* compile error
should be super(n) */}
}
ข�0นตอนการท'างานของ constructor• ถ5าม.คDาส�Fง this() ใน constructor กPจะเร.ยกใช5 constructor แบบ
overloaded ท.Fสอดคล5องก�บคDาส�Fง this() แล5วข5ามไปข�Mนตอนท.F 3• เร.ยกใช5 constructor ของ superclass ถ5าไม=ม.คDาส�Fง super() จะเร.ยกใช5
constructor แบบ default ยกเว5นคลาสท.Fช$Fอ Object จะไม=ม.การเร.ยกใช5 constructor ของ superclass เน$Fองจากคลาสท.Fช$Fอ Object จะไม=ม. superclass
• เร.ยกใช5คDาส�FงกDาหนดค=าเร�Fมต5นของค6ณล�กษณะของอPอบเจกตG• เร.ยกใช5คDาส�Fงภายใน constructor ของคลาสท.Fใช5น�Mน
ต�วอย+างคลาสท.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(" ");}
}
เมธอดของคลาสท.Fช$Fอ Objectคลาสท.Fช$Fอ Object จะเปLนคลาสท.Fท6กๆคลาสจะส$บทอดมา เมธอดของคลาส Object ท��ส'าค�ญค-อ
• toString() เป%นเมธอดท��ใช$ในการแปลงค+าของอ�อบเจกต�ให$เป%น String ซNFงจะส=งค=ากล�บเปLนข5อมKลชน�ดคลาส String
• equals(Object o) เปLนเมธอดท.Fใช5ในการเปร.ยบเท.ยบค=าของอPอบเจกตG ซNFงจะส=งค=ากล�บเปLนข5อมKลชน�ด boolean
เมธอด 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);
ต�วอย+างโปรแกรมแสดงเมธอด toString()public class Student {
private String name;public Student(String n) { name = n;}public String toString() { return name;}
}public class TestToString {
public static void main(String args[]) { Student s1 = new Student("Thana");
System.out.println(s1);}
}
Thanaผลล�พธGท.Fได5จากการร�นโปรแกรม
เมธอด equals()คลาสท��ต$องการสร$างเมธอดเพ-�อเปร�ยบเท�ยบค=าของอPอบเจกตGว+าเท+าก�นหร-อ
ไม+ จะต$องม.เมธอดแบบ overriden ท.Fช$Fอ equals()
ต�วอย+างโปรแกรมแสดงเมธอด equals() class Student {
private String name;public Student(String n) { name = n;}public boolean equals(Object obj) { if (obj.equals(name)) { return true;} else return false;}
} public class TestEquals {
public static void main(String args[]) { Student s1 = new Student("Thana");
Student s2 = new Student("Thana"); System.out.println(s1.equals(s2));}
}
trueผลล�พธGท.Fได5จากการร�นโปรแกรม
คลาสประเภท Wrapperคลาสประเภท Wrapper จะช=วยในการสร5างอPอบเจกตGท.FเกPบชน�ดข5อมKลแบบ
พ$Mนฐานไว5ในคอลเลPกช�Fนแบบ Heterogeneous คลาสประเภท Wrapper ม.ด�งน.M
ต�วอย=างโปรแกรมแสดงการใช5คลาสประเภท Wrapperpublic class ShowWrapper {
public static void main(String args[]) { Boolean b = new Boolean(true); Character c = new Character('A'); Double d = new Double(1.234); System.out.println(b); System.out.println(c); System.out.println(d);
}}
true A 1.234ผลล�พธGท.Fได5จากการร�นโปรแกรม
Autoboxing และ Auto-unboxing คDาส�Fง Autoboxing ค$อการแปลงจากชน�ดข5อมKลพ$Mนฐานเช=น intไปเปLนคลาส
ประเภท Wrapper เช=น IntegerคDาส�Fง Auto-unboxing ค$อการแปลงจากคลาสประเภท Wrapper เช=น Byte
ไปเปLนชน�ดข5อมKลพ$Mนฐานเช=น byte
ต�วอย=างการใช5คDาส�Fง Auto-boxing/Auto-unboxingpublic class ShowWrapper {
public static void main(String []args) { Integer myInt = 1; // int into Integer System.out.println(myInt);
int i = myInt + 3; // mix Integer and int System.out.println(i);
}}
14ผลล�พธGท.Fได5จากการร�นโปรแกรม
ค6ณล�กษณะแบบ staticค�ย�เว�ร�ด static สามารถท��จะใช$ก�บค6ณล�กษณะและเมธอดของคลาสได$ค6ณล�กษณะของคลาสท��เป%นแบบ static จะเป%นค6ณล�กษณะท��ท�กอ�อบ
เจกต�ของคลาสน.Mใช$ร+วมก�นค6ณล�กษณะของคลาสท��เป%นแบบ static สามารถถKกเร�ยกใช$จากช-�อของ
คลาสได$โดยไม+จ'าเป%นต$องสร$างอ�อบเจกต� อาท�เช+น • Student.counter
ต�วอย+างโปรแกรมแสดงการใช5ค.ยGเว�รGด static public class Student {
static int counter;public Student() { counter++;}
} public class TestStatic {
public static void main(String args[]) { Student s1 = new Student(); Student s2 = new Student(); System.out.println(Student.counter); System.out.println(s1.counter); System.out.println(s2.counter);}
}
222ผลล�พธGท.Fได5จากการร�นโปรแกรม
เมธอดแบบ 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ได$โดยตรง
Static InitializerStatic Initializer ค-อบล�อกในคลาสใดๆท��อย*+นอกเมธอด และม�ค�ย�เว�ร�ด static เพ-�อน�ยามให$เป%นบล�อกแบบ static
รKปแบบของ Static Initializer static { ...
}ค'าส��งในบล�อกแบบ static จะถ*กเร�ยกใช$เพ�ยงคร�0งเด�ยวเม-�อ JVM โหลด
คลาสด�งกล+าวข40นมาStatic Initializer ใช$ในการด.บ�ก (debug) โปรแกรม หร-อใช5ในกรณ.ท.Fต5องกา
รสร5างอPอบเจกตGของคลาสขNMนโดยอ�ตโนม�ต� เราสามารถท.FจะกDาหนดบลPอกแบบ static ได5มากกว=าหนNFงบลPอก โดยการ
ทDางานจะถKกเร.ยงจากบนลงล=าง
ต�วอย+างโปรแกรมแสดง Static Initializer public class TestStaticBlock {
static int x=5;static { x += 1;}public static void main(String args[]) { System.out.println("x = "+x);}static { x /= 2;}
}
x = 3 ผลล�พธGท.Fได5จากการร�นโปรแกรม
ค�ย�เว�ร�ด finalค�ย�เว�ร�ด final สามารถจะใช$ได$ก�บคลาส ต�วแปร และเมธอดคลาสท��ม� modifier เป%น final จะทDาให5คลาสอ$Fนไม+สามารถส-บทอดคลาสน.M
ได$เมธอดท��ม� modifier เป%น final ค$อเมธอดท.Fจะไม=สามารถม.เมธอดแบบ
overriden ได5 ต�วแปรท��ม� modifier เป%น final ค-อค+าคงท�� ซNFงจะทDาให5สามารถกDาหนดค=า
ได5เพ.ยงคร�Mงเด.ยวเท=าน�Mน
คลาสภายในคลาสภายใน (Inner class) ค$อคลาสท.FประกาศอยK=ภายในคลาสอ$Fนๆ ซNFงบาง
คร�Mงเร.ยกว=าคลาสแบบซ5อน (nested class) คลาสภายในอน6ญาตให5ประกาศค6ณล�กษณะหร$อเมธอดภายในคลาสอ$Fนได5 คลาสภายในม.ประโยชนGในกรณ.ท.Fต5องการจะจ�ดกล6=มของคลาสท.Fต5องทDางาน
ร=วมก�น โดยต5องการควบค6มไม=ให5ม.การเข5าถNงโดยตรงจากคลาสอ$Fนๆ และต5องการเร.ยกใช5ค6ณล�กษณะหร$อเมธอดของคลาสท.FอยK=ภายนอกได5โดยตรง
คลาสภายในท��ใช$ในภาษาจาวาแบ+งออกเป%น• คลาสภายในท��อย*+ภายในคลาสโดยตรง• คลาสภายในท��อย*+ภายในเมธอด
คลาสภายในท.FอยK=ภายในคลาสกรณ.น.MเปLนการประกาศคลาสภายในคลาสอ$Fนท.Fเร.ยกว=า คลาสภายนอก
(Outer class) คลาสภายในสามารถม� access modifier เป%น public, private, default
หร$อ protected ได5การสร5างอPอบเจกตGของคลาสภายในม.ข5อแตกต=างด�งน.M
• การสร5างอPอบเจกตGของคลาสภายในนอกคลาสภายนอก จะต5องทDาการสร5างอPอบเจกตGของคลาสภายนอกก=อน แล5วจNงสร5างอPอบเจกตGของคลาสภายในได5
• การสร5างอPอบเจกตGภายในเมธอดท.FอยK=ในคลาสภายนอกสามารถทDาได5โดยตรง คลาสท.FอยK=ภายในสามารถท.Fจะเร.ยกใช5ค6ณล�กษณะและเมธอดของคลาส
ภายนอกได5
ต�วอย+างโปรแกรมแสดงคลาสท��อย*+ภายในคลาส 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();}
}
คลาสภายในท.FอยK=ภายในเมธอดคลาสภายในประเภทน.Mจะม. access modifier เปLน default เราจะไม=สามารถท.Fจะสร5างอPอบเจกตGของคลาสภายในประเภทน.Mนอกเมธอด
ท.Fประกาศคลาสได5 คลาสประเภทน.Mจะสามารถเร.ยกใช5ต�วแปรภายในของเมธอดได5ในกรณ.ท.F
ต�วแปรน�MนประกาศเปLน final เท=าน�Mน ส=วนต�วแปรท.FเปLนค6ณล�กษณะของคลาสหร$อค6ณล�กษณะของอPอบเจกตG สามารถท.Fจะเร.ยกใช5ได5เช=นเด.ยวก�บคลาสภายในท.FอยK=ภายในคลาส
ค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
ต�วอย+างโปรแกรมแสดงคลาสท.FอยK=ภายในเมธอด public class MOuter { private int a = 1; public void method(final int b) {
final int c = 2; int d = 3; class Inner {
private void iMethod() { System.out.println("a = "+a); System.out.println("b = "+b); System.out.println("c = "+c); System.out.println("d = "+d); //illegal}
} } }
Generic Typesเราสามารถท.Fจะประกาศคลาสหร$ออ�นเตอรGเฟสใดๆให5ม.ชน�ดข5อมKลเปLนแบบ
ท�Fวไป (Generic Type) public class ClassName(TypeVariable)ต�วอย=างเช=น
– public class Box<T> จะระบ6ชน�ดข5อมKลแบบเจาะจงได5ตอนท.Fสร5างอPอบเจกตG ต�วอย=างเช=น
– Box<Integer> integerBox = new Box<Integer>();
ต�วอย+างแสดงคลาสท.Fใช5 Generic Type public class Box<T> { private T t; public void add(T t) { this.t = t; } public T get() { return t; }}-----------------------------------------------------------public class BoxDemo { public static void main(String[] args) { Box<Integer> integerBox = new Box<Integer>(); integerBox.add(new Integer(10)); Integer someInteger = integerBox.get(); // no cast! System.out.println(someInteger); }}
เมธอดแบบ Genericเราสามารถท.Fจะใช5 Generic Type ก�บเมธอดหร$อ constructor ใดๆกPได5 [modifier] <TypeVariable> return_type methodName(TypeVaraible varName) {
[method_body]}
โดยท.F– TypeVariable ค$อช$Fอของต�วแปรชน�ดข5อมKล– varName ค$อช$Fอ argument
ต�วอย+างแสดงคลาสท.Fประกาศเมธอดแบบ Genericpublic class BoxMethod { public <U> void inspect(U u) { System.out.println("U: " + u.getClass().getName()); }}-------------------------------------------------------public class BoxMethodDemo { public static void main(String[] args) { BoxMethod box = new BoxMethod(); box.inspect(3.2); }}
Annotation ภาษาจาวาม.คDาส�Fง annotation (เคร$Fองหมาย @) ซNFงจะให5ข5อมKลเก.Fยวก�บโปรแกรม โดยท.Fจะ
ไม=ม.ผลโดยตรงต=อคDาส�Fงใดๆ annotation จะถKกใช5งานในกรณ.ต=างๆ ด�งน.M
– เปLนข5อมKลสDาหร�บคอมไพเลอรG เพ$Fอตรวจจ�บข5อผ�ดพลาดหร$อ warning ของโปรแกรม– ช=วยในกระบวนการข�MนตอนการคอมไพลGและต�ดต�Mง (deployment) ท�Mงน.MซอฟตGแวรGในการ
คอมไพลG สามารถท.Fจะประมวลผลข5อมKล annotation ในการสร5างโค5ดท.FเปLนไฟลG XML ได5– ช=วยในกระบวนการข�Mนตอน runtime ท�Mงน.Mจาก annotation บางคDาส�Fงจะสามารถตว
รสอบได5ในช=วง runtime
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() { }
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}
Annotation ท.Fใช5โดยคอมไพเลอรG ภาษาจาวาได5กDาหนด annotation สDาหร�บคอมไพเลอรGไว5สามคDาส�Fงค$อ @Depreacted, @Override และ @Suppresswarnings
@Deprecated เราจะใช5 annotationน.M ในกรณ.ท.Fต5องการระบ6ว=าคDาส�Fงเช=นคลาส เมธอด หร$อค6ณล�กษณะใด เปLนคDาส�Fงท.Fไม=ควรจะใช5แล5ว เพ$Fอให5คอมไพเลอรGส=งคDาส�Fง warning ออกมาในช=วงการคอมไพลG
@Override เราจะใช5 annotationน.Mเพ$FอจะบอกคอมไพเลอรGว=า element น.M override คDาส�Fง element ของ superclass
@SuppressWarnings เราจะใช5 annotationน.Mเพ$FอบอกคอมไพเลอรGไม=ต5องแสดงคDาส�Fง warning ท.Fอาจ ปรากฎขNMนจากการใช5คDาส�Fงท.Fตามมาน.Mในช=วงการคอมไพลGโปรแกรม
สร6ปเน$Mอหาของบทเมธอดท.FกDาหนดขNMนในคลาสใดๆสามารถเร.ยกใช5งานได5สองรKปแบบค$อ การ
เร.ยกใช5งานจากคลาสท.Fต=างก�น และการเร.ยกใช5งานภายในคลาสเด.ยวก�นเมธอดท.FกDาหนดขNMนในคลาสอาจม. argument ท.Fร�บค=าเพ$FอนDาไปใช5ในเมธอด เมธอดใดๆของคลาสสามารถท.Fจะม.ค=าท.Fส=งกล�บมาได5 ท�Mงน.Mการประกาศ
เมธอดจะต5องระบ6ชน�ดข5อมKลของค=าท.Fจะส=งกล�บเมธอดสามารถแบ=งเปLนเมธอดของอPอบเจกตG (หร$อเร.ยกว=าเมธอดแบบ non-
static) และเมธอดของคลาส (หร$อเร.ยกว=าเมธอดแบบ static)เมธอดของคลาสใดท.Fม. modifier เปLนแบบ static จะทDาให5สามารถถKก
เร.ยกใช5งาน โดยใช5ช$Fอของคลาสน�Mนได5เลยเมธอดแบบ overloaded ค$อ ม.เมธอดท.Fม.ช$Fอเด.ยวก�นแต=จะม.จDานวนหร$อชน�ด
ข5อมKลของ argument ท.Fต=างก�น
สร6ปเน$Mอหาของบทโดยท�Fวไป ค6ณล�กษณะของคลาสจะม. modifier เปLนแบบ private ท�Mงน.Mเพ$Fอ
ปoองก�นการเข5าถNงจากคลาสอ$Fนโดยท�Fวไป เมธอดของคลาสจะม. modifier เปLนแบบ public ท�Mงน.Mเพ$Fอให5
เมธอดจากคลาสอ$Fนเร.ยกใช5ได5ช$Fอของเมธอดท.Fเก.Fยวข5องก�บค6ณล�กษณะของคลาส น�ยมใช5 setXxx สDาหร�บ
เมธอดท.Fม.ไว5เพ$FอกDาหนดค=าให5ก�บค6ณล�กษณะ xxx และใช5 getXxx สDาหร�บ เมธอดท.Fจะส=งค=ากล�บเปLนค6ณล�กษณะ xxx
ค.ยGเว�รGด protected จะทDาให5คลาสท.FเปLน subclass สามารถท.Fจะอ5างอ�งถNงค6ณล�กษณะหร$อเมธอดของ superclass ได5
สร6ปเน$Mอหาของบทคลาสท6กคลาสในภาษาจาวาถ5าไม=ได5ส$บทอดจากคลาสใดเลยจะถ$อว=าคลาส
น�Mนส$บทอดจากคลาสท.Fช$Fอ Objectเมธอดแบบ overriden จะเปLนการเข.ยนเมธอดของ superclass ขNMนใหม= super เปLนค.ยGเว�รGดท.Fใช5ในการอ5างอ�งถNง superclassการม.ได5หลายรKปแบบหมายถNง
– การท.Fเราสามารถท.Fจะสร5างหร$ออ5างถNงอPอบเจกตGของคลาสท.Fส$บทอดก�นได5หลายรKปแบบ
– การท.Fเราสามารถท.Fจะอ5างถNงเมธอดช$Fอเด.ยวก�นได5หลายรKปแบบเมธอดแบบ overloaded หมายถNงเมธอดท.Fม.ช$Fอเด.ยวก�นมากกว=าหนNFงเมธอด
โดยม.จDานวนหร$อชน�ดของ argument ท.Fแตกต=างก�น
สร6ปเน$Mอหาของบทเมธอดแบบ overridden หมายถNงการท.F subclass สร5างเมธอดท.Fม.อยK=แล5วใน
superclass ขNMนใหม= โดยใช5ช$Fอ argument และชน�ดข5อมKลของค=าท.Fส=งกล�บของเมธอดเหม$อนเด�ม
ค.ยGเว�รGด instanceof เปLนต�วดDาเน�นการท.Fใช5ก�บอPอบเจกตGและคลาส เพ$Fอตรวจสอบว=าอPอบเจกตGใดๆ เปLน อPอบเจกตGของคลาสท.Fระบ6หร$อไม=
การ casting อPอบเจกตG ทDาให5เราสามารถจะกDาหนดอPอบเจกตGของคลาสท.FเปLน superclass ให5ก�บต�วแปรท.FกDาหนดเปLนคลาสท.FเปLน subclass ได5
Constructor หมายถNง เมธอดท.Fม.ช$Fอเด.ยวก�นก�บช$Fอคลาส แต=จะไม=ม.การส=งค=ากล�บและจะไม=ม.การใส=ค.ยGเว�รGด void โดยคลาสท6กคลาสจะม. default constructor มาให5อยK=แล5ว แต=เราสามารถท.FจะกDาหนด constructor ขNMนใหม=เองได5
สร6ปเน$MอหาของบทConstructor แบบ overloaded หมายถNง constructor ท.Fม.จDานวนหร$อชน�ด
ของ argument ท.Fแตกต=างก�นเมธอดท.Fช$Fอ this() เปLนการเร.ยกใช5 constructor ของคลาสต�วเองConstructor แบบ default ของคลาสท.FเปLน superclass จะถKกเร.ยกใช5โดย
อ�ตโนม�ต�ท6กคร�Mงท.Fม.การสร5าง อPอบเจกตGของคลาสคลาสท.Fช$Fอ Object ม.เมธอดท.FสDาค�ญอยK=สองเมธอดค$อเมธอด toString() และ
เมธอด equals()Auto-boxing / Auto-unboxing ค$อการแปลงค=าระหว=างชน�กข5อมKลพ$Mนฐาน
ก�บคลาสประเภท Wrapper ท.Fสอดคล5องก�นโดยอ�ตโนม�ต�เมธอดแบบ static สามารถถKกเร.ยกใช5จากช$Fอของคลาสได5โดยไม=จDาเปLน
ต5องสร5างอPอบเจกตG
สร6ปเน$Mอหาของบทคลาสแบบ final ค$อคลาสท.Fไม=สามารถส$บทอดได5คลาสภายในหมายถNงคลาสท.FอยK=ภายในคลาส หร$อคลาสท.FอยK=ภายในเมธอดGeneric Type สามารถท.FจะทDาให5เราประกาศคลาสหร$ออ�นเตอรGเฟสใดๆให5ม.
ชน�ดข5อมKลเปLนแบบท�Fวไป (Generic Type) แล5วค=อยระบ6ชน�ดข5อมKลแบบเจาะจงตอนท.Fสร5างอPอบเจกตGได5
เมธอดแบบ Generic ค$ดเมธอดท.Fม. argument ท.FเปLน Generic TypeAnnotation จะให5ข5อมKลเก.Fยวก�บโปรแกรม โดยท.Fจะไม=ม.ผลโดยตรงต=อคDาส�Fง
ใดๆของ code ท.FทDาการบ�นทNก