java - mahidol universitymucc.mahidol.ac.th/~scphc/classes/java/wk8_class.pdf · 2009-12-26 ·...
TRANSCRIPT
1
JAVA ProgrammingWeek 8
คลาส (class)*
อาจารยพลัลภ ฮวบสมบรูณภาควชิาคณติศาสตรและสถิติ
คณะวทิยาศาสตร มหาวทิยาลยัมหิดล(*ดัดแปลงจาก slide ของผูแตงหนังสือ “เขียนโปรแกรม Java เบื้องตน”)
2
หัวขอ
ประวตัิศาสตรโดยยอของการเขียนโปรแกรม
คลาสและวัตถุ
ขอความและเมธอด
คําประกอบ
3
ประวตัิศาสตรโดยยอของการเขียนโปรแกรม
4
ภาษาแอสเซมบลี
ภาษาเครื่อง เลขฐานสอง เชน 0101ซีพียูรูจัก
ภาษาแอสเซมบลี แอสเซมเบลอร (assembler)
5
โฟลวชารต
6
การโปรแกรมเชิงโครงสราง โครงสรางการทาํงานของโปรแกรมควรมอียางจํากัด
แตในขณะเดียวกันก็ตองเพียงพอที่จะใชแกปญหาตางๆได โครงสรางที่จําเปนตอการเขียนโปรแกรมมีอยู 3 แบบ
การทาํงานเรียงลาํดับ การทาํงานตามเงื่อนไข การทาํซ้ํา
7
การทํางานเรียงลําดับ
8
การทํางานตามเงื่อนไข
9
การทําซ้าํ
10
ซับรูทีนและฟงกชัน
จัดระเบียบคําสั่งในโปรแกรม
แบงโปรแกรมออกเปนสวนยอยๆ
ทําความเขาใจไดงาย
11
จุดออนของภาษาโปรแกรมเชิงโครงสราง
โปรแกรมประกอบดวยคาํสั่งและขอมูลการจัดระเบียบคําสั่ง
เพียงอยางเดียวนั้นจงึไมสมบรูณ แยกสวนที่เปนขอมลูออกจากคําสั่ง ดวยเหตนุีฟ้งกชันที่จัดการกับขอมลูจึงอาจจะถูกวางไวอยางกระจัดกระจาย สรางความลําบากในการตดิตามสืบหาวาขอมลูนี้ถูก
เปลี่ยนแปลงโดยฟงกชันใด
12
คลาสและวัตถุ
13
การโปรแกรมเชิงวัตถ ุการหอหุม (encapsulation)
รวมขอมูลกับคําสั่งที่เกี่ยวของกับขอมูลนั้นเขาดวยกัน ซอนวิธีการทํางาน (information hiding)
ซอนวิธีการทํางานของวัตถุ ทําใหเกิดความยืดหยุน ผูสรางวัตถุสามารถเปลีย่นแปลงวิธีการทํางานของวัตถุไดโดยไมกระทบตอผูใชวัตถุ
การมองที่เปนธรรมชาติ เห็นภาพแลวแยกเปนวัตถุโดยอัตโนมัติ
ในขณะเดียวกันก็นึกถึงประโยชนของวัตถุไดทนัที
14
วัตถุ (object)
โปรแกรมพจนานุกรมฉบับราชบัณฑิตยสถาน พ.ศ. ๒๕๒๕ นิยามคําวา “วัตถุ” วาหมายถึงสิ่งของ และนิยามคําวา “สิ่งของ” วาหมายถึงวัตถุตางๆ
ในโปรแกรมจะจําลองลักษณะและความสามารถของวัตถุตางๆ ที่อยูในโลกจริง
สิ่งไมมีชีวิต เชน รูปสี่เหลี่ยม โทรทัศน หรือบานสิ่งมีชีวิต เชน พนักงาน นก หรือตนไมสิ่งที่เปนนามธรรม เชน แนวความคิด หลักการ หรือวิธีการ
15
คลาส (class)สิ่งที่เราใชอธิบายลักษณะและความสามารถของวัตถุ คลาสอาจจะเปรียบไดกับพิมพเขียวหรือแบบแปลนของวัตถุ วัตถุก็เปนที่สรางขึ้นมาจากแบบแปลนนั้น
16
แบบแปลนและวัตถทุี่สรางจากแบบ
17
การกําหนดสาระสําคัญ (abstraction)เลือกจาํลองลักษณะที่สําคัญ
จําลองเฉพาะความสามารถของวัตถุที่เราสนใจหรือเกี่ยวของกับ
ปญหาที่เราตองการจะแกไข
เชน ถาเราตองการคํานวณหาน้ําหนักเฉลี่ยของแมว เราก็อาจจะใหแมวจําลองมี "น้ําหนัก" เปนลักษณะที่สําคัญ
ไมจําลองลักษณะทั้งหมดของวัตถุ การจําลองแมวจะไมจําลองหนวดทุกเสนของแมว
18
คลาสในภาษาจาวา
คลาสหรือแบบแปลนของวัตถุ จะถูกเขียนอยูในไฟลที่มีนามสกุล java
เชน คลาสสี่เหลี่ยมอาจจะถูกเขียนอยูในไฟลชื่อ Rectangle.java
19
สวนประกอบของคลาส
20
การสรางวัตถุ รูปแบบ
คลาส เรฟเฟอรเรนซ = new คลาส();ตัวอยาง
สี่เหลี่ยม ก = new สี่เหลี่ยม();สี่เหลี่ยม ข = new สี่เหลี่ยม();
21
ขอความและเมธอด
22
ขอความและเมธอด สั่งใหวัตถุทํางานโดยการสงขอความ (message) หรือคําสั่งไปหาวัตถุ เมื่อวัตถุไดรับขอความแลว วัตถุนั้นก็จะทํางานตามวิธีการหรือคําสั่งตางๆที่เขียนไวใน
เมธอด (method)
23
สวนประกอบของคลาส เมธอด เปนสิ่งที่ใชอธิบายการทํางานของวัตถุในคลาส แอททริบิวท เปนสิ่งที่ใชบอกถึงลกัษณะตางๆของวัตถุในคลาส
24
ตัวอยางเมธอด
คลาส เมธอด
นก กิน(), บิน(), รองเพลง()
โทรทัศน เปด(), ปด(), เปลี่ยนชอง(), ปรับเสียง()
สี่เหลี่ยม คํานวณพื้นที่()
25
ตัวอยางแอททริบิวท
คลาส แอททริบิวท
นก สี, เพศ, น้ําหนัก
โทรทัศน ยี่หอ, รุน, หมายเลข, ขนาดจอภาพ
สี่เหลี่ยม ความกวาง, ความสูง
26
เมธอด
วิธีการทํางานเมื่อไดรับขอความ
ชื่อของเมธอดควรเปนคํากริยา
27
การเรียกเมธอด (การสงขอความ)
รูปแบบ
เรฟเฟอรเรนซ.เมธอด();ตัวอยาง
สี่เหลี่ยม ส = new สี่เหลี่ยม();System.out.println( ส.คํานวณพื้นที่() );
28
การประกาศเมธอด
class สี่เหลี่ยม {double คํานวณพื้นที่() {
// คํานวณหาพื้นที่ของสี่เหลี่ยม …
}}
29
เมธอดที่คืนคาเปนชนิดขอมูลพื้นฐาน
class สี่เหลี่ยม {double คํานวณพื้นที่() {
// คํานวณหาพื้นที่ของสี่เหลี่ยม …// สงคืนคาพื้นที่ใหกับผูเรียกreturn พื้นที่ของสี่เหลี่ยม;
}}
30
เมธอดที่คืนคาเปนเรฟเฟอรเรนซ
class สี่เหลี่ยม {String ขอขอมูล() {
…return สตริงที่แสดงขอมูลสี่เหลี่ยม;
}}
31
เมธอดที่ไมคืนคา
class สี่เหลี่ยม {void เพิ่มขนาดสองเทา() {
…return;
}}
32
แอททริบิวท
ขอมูลที่ใชอธิบายความแตกตางของวัตถุ เชน วัตถุแมว มีชื่อ สี พนัธุ น้ําหนัก แตกตางกัน
ตัวแปรวัตถุ (instance variable)
class สี่เหลี่ยม {double ความกวาง;double ความสูง;
}
33
การใชงานแอททรบิิวท รูปแบบ
เรฟเฟอรเรนซ.แอททริบิวท
ตัวอยาง
สี่เหลี่ยม ส = new สี่เหลี่ยม();ส.ความกวาง = 10;ส.ความสูง = 5;
34
คอนสตรัคเตอร (constructor)
เมธอดที่มีชื่อเหมือนกับคลาส ใชกําหนดคาเริ่มตนใหกับแอททริบิวต ถูกเรียกใชเมือ่เราสรางวัตถุดวยคําสั่ง new
35
การประกาศคอนสตรัคเตอร class สี่เหลี่ยม {
สี่เหลี่ยม(double ก, double ส) {
ความกวาง = ก;ความสูง = ส;
}
double ความกวาง;double ความสูง;
}
36
การเรียกคอนสตรัคเตอร
สี่เหลี่ยม ก = new สี่เหลี่ยม(10, 5);
สี่เหลี่ยม ข = new สี่เหลี่ยม(20, 4);
System.out.println(ก.กวาง);
System.out.println(ข.กวาง);
37
การโอเวอรโหลดเมธอด class สี่เหลี่ยม {{
สี่เหลี่ยม() { ... }
สี่เหลี่ยม(double ก, double ส) { ... }}
38
การโอเวอรโหลดเมธอด
class สี่เหลี่ยม {{
double getArea() { ... }
int getArea(int n) { ... }
}
39
แปลงไทยจาวาเปนจาวา
40
ประกาศคลาส
class สี่เหลี่ยม {
}
class Rectangle {
}
41
เพิ่มเมธอด
class สี่เหลี่ยม {double คํานวณพื้นที่() {
.... }
}
class Rectangle {double getArea() {
.... }
}
42
เพิ่มแอททริบิวท
class สี่เหลี่ยม {double คํานวณพื้นที่() {
.... }double ความกวาง;double ความสูง;
}
class Rectangle {
double getArea() {
.... }double width;double height;
}
43
เขียนวิธีการทํางานของเมธอด คํานวณพื้นที(่)
class สี่เหลี่ยม {double คํานวณพื้นที่() {
return ความกวาง * ความสูง;}double ความกวาง;double ความสูง;
}
class Rectangle {double getArea() {
return width * height;}double width;double height;
}
44
เขียนคอนสตรัคเตอร
class สี่เหลี่ยม {สี่เหลี่ยม(double ก, double ส){
ความกวาง = ก;ความสูง = ส;
}...
}
class Rectangle {
Rectangle(double w,double h) {width = w;height = h;
}
...}
45
ทดสอบคลาส Rectangle
class TestRectangle {public static void main(String[] args) {
Rectangle r = new Rectangle(2, 3);
System.out.println(r.getArea());
Rectangle p = new Rectangle(5, 7);System.out.println(p.getArea());
}}
46
คอมไพลและรัน
47
เมธอด toString()พิมพขอมูลเกี่ยวกับวัตถุ
class Rectangle {public String toString() {
String result = "Width = " + width;
result += " Height = " + height;return result;
}...
}
48
การเรียกเมธอด toString()
System.out.println( rect.toString() );
System.out.println( rect );
49
เมธอด equals()
เปรียบเทียบแอททริบิวท
ไมใชเครื่องหมาย == เพื่อเปรียบเทียบวัตถุ
class Rectangle {public boolean equals(Rectangle other) {
return (width == other.width) && (height == other.height);}...
}
50
คําประกอบ (modifiers)
51
คําประกอบการเขาใช ประกอบกับการประกาศแอททริบิวตหรือเมธอด private
วัตถุตางคลาสไมสามารถเขาใชได
การปกปองขอมูลทําได
มักจะใหแอททริบิวทมีการเขาใชแบบ private
publicอนุญาตใหคลาสอื่นใชได
มักจะใหเมธอดมีการเขาใชแบบ public
52
คําประกอบการเขาใช
class Rectangle {public double getArea() {
return width * height;}private double width;private double height;
}
53
ทดลองเขาใชแอททริบิวทที่ถกูปกปอง
public class TestPrivate { public static void main( String[] args) {
Rectangle rect = new Rectangle();rect.width = 10;
}}
54
ทดลองเขาใชแอททริบิวทที่ถกูปกปอง
55
ทําไมเราควรกําหนดการปกปองแอททรบิิวท
ความเปนสวนตัวสามารถปองกันวัตถุอื่นๆเขามาทําลายคุณสมบัติ
บางอยาง เชนเลขบัญชีธนาคารติดลบแทนที่จะเปนเลขศูนยหรือเลขบวก ความกวางและความสูงของสี่เหลี่ยมนอยกวาหรือเทากับศนูย
ทําใหเราสามารถเปลี่ยนแปลงชนิดของตัวแปรเหลานั้นได โดยไมกระทบกระเทือนคลาสอื่นที่ใชคลาสของเรา
56
การซอนวิธีการทํางาน สามารถเปลี่ยนแปลงวิธีการทํางานของวัตถุไดโดยไมกระทบตอผูใช
วัตถุ เกิดความยืดหยุน เชน ถาเปรียบวัตถุเหมือนกับรถ และผูใชวัตถุคือคนขับรถ บริษัทผูผลิตรถสามารถเปลี่ยนเครื่องยนตรุนใหม เปลี่ยนระบบเบรค ฯลฯ โดยที่คนขับยังสามารถขับรถไดเหมือนเดิม
57
สี่เหลี่ยมที่ผิดปรกติ
Rectangle rect = new Rectangle(-10, 10);
IllegalArgumentException
58
การแจงวามีความผิดปกติ
class Rectangle {
public Rectangle(double w, double h) {
if (w <= 0 || h <= 0)
throw new IllegalArgumentException();
width = w;
height = h;
}...
}
59
การแจงวามีความผิดปกติ
60
การเขาใชแบบอื่นๆ protected
เกี่ยวของกับการสืบทอด
กลาวถงึในบทที่ 11การเขาใชแบบแพ็คเกจ (package)
แพ็คเกจเปนที่เก็บรวมรวมคลาสที่เกี่ยวของกัน แพ็คเกจเปรียบไดกบัโฟลเดอร
การเขาใชแบบแพ็คเกจไมตองใชคําประกอบใดๆ
61
สแตติกเมธอด (static method)
เมธอดของคลาส
รูปแบบการประกาศ
public static ชนิดขอมลูทีส่งกลับ เมธอด(พารามิเตอร) { … }
รูปแบบการเรียกใช คลาส.สแตติกเมธอด(พารามิเตอร)
ตัวอยางการเรียกใช
int m = Math.round(12.5);
int n = String.valueOf(1234);
62
ตัวแปรของคลาส รูปแบบ
private static ชนิดขอมูล ตัวแปร;ตัวอยาง
private static int count;
63
คาคงที่ของคลาส รูปแบบ
public static final ชนิดขอมูล ตัวแปร=คา;ตัวอยาง
public static final int TOTAL_SIDES = 4;
64
สรปุ
65
สรุป
การโปรแกรมเชิงโครงสรางทําใหคําสั่งในโปรแกรมเปนระเบียบ ตรวจสอบลําดับการทํางานไดงาย
การโปรแกรมเชิงวัตถุรวมขอมูลกับคําสั่งใหอยูในที่เดียวกัน เรียกวา encapsulation
การโปรแกรมเชิงวัตถุเปนธรรมชาติสําหรับมนุษย เพราะเรามองสิ่งตางๆเปนวัตถุ และทราบวาวัตถุตางๆสามารถใชทําอะไรได
66
สรุป
ชนิดของวัตถุเรียกวา คลาสวัตถุในโปรแกรมคือสิ่งที่จําลองการทํางานของวัตถุในโลกจริง
การเลือกจําลองเฉพาะความสามารถและลักษณะที่สําคัญ เรียกวา abstractionเรฟเฟอรเรนซ คือตัวแปรที่ใชสําหรับอางถึงวัตถุการประกาศเรฟเฟอรเรนซไมไดสรางวัตถุ การสรางวัตถุทําโดยการใชคําสั่ง new
วัตถุถูกเรียกใชงานผานทางเรฟเฟอรเรนซ
67
สรุป
ความสามารถของวัตถุถกูเขยีนไวใน เมธอด แบบ public
ผูใชสามารถใชงานวัตถุโดยไมทราบวาวัตถุนั้นมีการทํางานอยางไร ถาโปรแกรมถูกเขียนโดยใชหลักการ information hiding
ลักษณะของวัตถุจะเก็บไวใน แอททริบวิทหรือตัวแปรวัตถุแอททริบิวทมักจะมีการเขาใชแบบ private เพื่อปองกันไมใหคลาสอื่นเขามาแกไขเปลี่ยนแปลง
68
สรุป
คลาสอื่นไมสามารถการเขาใชเมธอดหรือแอททริบิวตที่เปน private
เมธอดในคลาสนั้นสามารถเปลี่ยนแปลงแอททริบิวตที่เปน private ไดทุกคลาสสามารถเขาใชเมธอดหรือแอททริบิวทที่เปน public
สแตติกเมธอด คือเมธอดของคลาสตัวแปรของคลาสกําหนดไดโดยใชคําประกอบ static
คาคงที่ของคลาสกําหนดไดโดยใชคําประกอบ static final
69
ใหนักศึกษาเขียนโปรแกรมโดยใชภาษาจาวา สรางคลาส BankAccount ซึ่งมีเมธอดดังตอไปนี้
เมธอดสําหรับสรางAccount ใหมทีม่ยีอดเงนิเปนศูนย
เมธอดสําหรับสรางAccount ใหมทีม่ยีอดเงนิตามที่ผูใชโปรแกรมกําหนด
เมธอดสําหรับการฝากเงิน
เมธอดสําหรับการถอนเงิน
เมธอดสําหรับการแสดงยอดเงนิ
จากนั้นเขียนโปรแกรมชื่อ MyAccount.java เรียกใชคลาสขางตน โดยกําหนดเงินฝากเริ่มตน 1000 บาท จากนั้นถอนเงิน 150 บาท และแสดงยอดเงนิที่เหลอื
สงโปรแกรม (source code) มาที่ [email protected]
Exercise