Περιεχόμενα. Πρόλογος 11



Σχετικά έγγραφα
public void printstatement() { System.out.println("Employee: " + name + " with salary: " + salary);

3 Αλληλεπίδραση Αντικειμένων

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

Διαγράμματα Κλάσεων στη Σχεδίαση

Περιεχόμενα. Πρόλογος... 21

Διαγράμματα Αλληλεπίδρασης. Διαγράμματα Ακολουθίας Διαγράμματα Συνεργασίας

Γενικά (για τις γραπτές εξετάσεις)

Κλάσεις και Αντικείµενα

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Αντικειµενοστραφής Προγραµµατισµός

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

ΠΟΛΥΜΟΡΦΙΣΜΟΣ. 4.1 Κληρονομικότητα και Αρχή της Υποκατάστασης

Διαγράμματα UML στην Ανάλυση. Μέρος Γ Διαγράμματα Επικοινωνίας Διαγράμματα Ακολουθίας Διαγράμματα Μηχανής Καταστάσεων

Θεωρητικές Ασκήσεις. ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ. 1 ο Μέρος

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #4 ο : Αποσφαλμάτωση (debugging), μετατροπές

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα

Περιεχόμενα. Πρόλογος 15

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #4 ο : Αποσφαλμάτωση (debugging), μετατροπές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Πληροφορική 2. Αλγόριθμοι

Οντοκεντρικός Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 8 Ο. Ταξινόμηση και Αναζήτηση Συναρτήσεις χειρισμού οθόνης ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Προγραμματισμός 2 Σημειώσεις εργαστηρίου

Περιεχόμενα. Πρόλογος 15

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

Τύποι δεδομένων, τελεστές, μεταβλητές

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 22/11/07

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

Περιεχόμενα ΜΕΡΟΣ ΠΡΩΤΟ. Πρόλογος... 13

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Εργαστήριο Τεχνολογίας Λογισμικού και Ανάλυσης Συστημάτων

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 4 : CLASSES

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Σύντομη εισαγωγή στην Java

Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα;

Αντικειμενοστρεφής Προγραμματισμός

Εισαγωγή στον Προγ/μό Η/Υ

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

Εισαγωγή στον Προγραμματισμό

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

4 ο Εργαστήριο Τυχαίοι Αριθμοί, Μεταβλητές Συστήματος

FORTRAN και Αντικειμενοστραφής Προγραμματισμός

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Αντικείμενα ως ορίσματα

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2

Mεταβλητές (variables) και Σταθερές (constants)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων

Κατασκευαστές. Μέθοδοι Κατασκευής (Constructors).

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

Δοµές Δεδοµένων. 6η Διάλεξη Αναδροµικές Εξισώσεις και Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

Ερωτήσεις πολλαπλής επιλογής - Κεφάλαιο 2. Α1. Ο αλγόριθμος είναι απαραίτητος μόνο για την επίλυση προβλημάτων πληροφορικής

Αντικειµενοστρεφής Προγραµµατισµός

Διάγραμμα Κλάσεων. Class Diagram

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #2

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Μαθήματα από τα εργαστήρια

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός μνήμης Αντικείμενα παράμετροι String Interning

10. Με πόσους και ποιους τρόπους μπορεί να αναπαρασταθεί ένα πρόβλημα; 11. Περιγράψτε τα τρία στάδια αντιμετώπισης ενός προβλήματος.

HelloWorld. Παύλος Εφραιμίδης. Java Το πρόγραμμα HelloWorld 1

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

Περιεχόμενα. Πρόλογος... 17

Γ ΓΥΜΝΑΣΙΟΥ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕ ΤΗ ΓΛΩΣΣΑ MicroWorlds Pro

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 4/3/2008

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Η κατασκευή αντικειμένων της κλάσης Student μπορεί να πραγματοποιηθεί είτε στη main είτε σε οποιαδήποτε μέθοδο κλάσης:

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων Constructors

Καλές επιτυχίες παιδιά στα υπόλοιπα μαθήματά σας και καλές γιορτές!!!!

ΕΞΕΤΑΣΤΕΑ ΥΛΗ (SYLLABUS) ADVANCED αντικειμενοστραφής προγραμματισμός ΕΚΔΟΣΗ 1.0. Σόλωνος 108,Τηλ Φαξ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

ΕΝΟΤΗΤΑ 4 Λήψη Αποφάσεων και Συναρτήσεις Ελέγχου

Περιεχόμενα. Περιεχόμενα

Γιάννης Σαμωνάκης. 1 ο ΣΧΟΛΕΙΟ ΚΩΔΙΚΑ «Βασικά Θέματα Προγραμματισμού στην Ανάπτυξη Δυναμικών Διαδικτυακών Εφαρμογών» (Part 4 - PHP)

Πίνακας περιεχομένων. Κεφάλαιο 1 Λειτουργίες βάσης δεδομένων Κεφάλαιο 2 Συγκεντρωτικοί πίνακες Πρόλογος... 11

Αντικειμενοστρέφεια. Henri Matisse, Harmony in Red, Κωστής Σαγώνας Νίκος Παπασπύρου

Αντικείµενα. ηµιουργία και χρησιµοποίηση αντικειµένων. ηµιουργία αντικειµένων

Ασκήσεις σε Επαναληπτικούς Βρόχους και Συναρτήσεις. Επανάληψη για την ενδιάμεση εξέταση. (Διάλεξη 13)

B. Ενσωμάτωση Ιθαγενών Μεθόδων

Ανάλυση Πληροφοριακών Συστημάτων. Εαρινό Εξάμηνο Lec08 09/04/2019 Διδάσκων: Γεώργιος Χρ. Μακρής

Κλάσεις και αντικείμενα #include <iostream.h<

Αναδρομή Ανάλυση Αλγορίθμων

Εισαγωγή στον Προγραμματισμό

Transcript:

Περιεχόμενα Πρόλογος 11 1 Εισαγωγή 19 1.1 Πριν από την ανάγνωση αυτού του βιβλίου 20 1.2 Μια θεώρηση του υπολογιστή 22 1.3 Εφαρμογές και μικροεφαρμογές Java 24 1.4 JavaScript και JSP 26 1.5 Η δομή του παρόντος βιβλίου 27 1.6 Ένα μικρό δείγμα προγράμματος 30 1.7 Παραδείγματα με μικροεφαρμογές 37 1.8 Νέες έννοιες σε αυτό το κεφάλαιο 40 1.9 Προβλήματα ανακεφαλαίωσης 42 1.10 Προβλήματα προγραμματισμού 43 2 Μεταβλητές, τύποι δεδομένων, και παραστάσεις 44 2.1 Παράδειγμα 45 2.2 Δεδομένα και μεταβλητές 45 2.3 Αλγόριθμοι, σφάλματα προγραμματισμού, και δεδομένα ελέγχου 50 2.4 Εντολές, μπλοκ κώδικα, και ονόματα 53 2.5 Μεταβλητές και σταθερές 55 2.6 Τύποι δεδομένων 58 2.7 Αναθέσεις και αριθμητικές παραστάσεις 65 2.8 Μετατροπή τύπων 69 2.9 Υπολογισμοί για τις εργασίες ανακαίνισης 72 2.10 Νέες έννοιες σε αυτό το κεφάλαιο 73 2.11 Προβλήματα ανακεφαλαίωσης 76 2.12 Προβλήματα προγραμματισμού 77 3 Χρήση έτοιμων κλάσεων 78 3.1 Τα αντικείμενα ως μοντέλα της πραγματικότητας 79 3.2 Χρήση έτοιμων κλάσεων 83 3.3 Η κλάση Random 89 3.4 Η κλάση String 93 3.5 Οργάνωση κλάσεων σε πακέτα 100 3.6 Μέθοδοι κλάσης και σταθερές κλάσης στη βιβλιοθήκη Java 102 3.7 Ανάγνωση δεδομένων από το χρήστη 103 3.8 Νέες έννοιες σε αυτό το κεφάλαιο 108

6 Περιεχόμενα 3.9 Προβλήματα ανακεφαλαίωσης 110 3.10 Προβλήματα προγραμματισμού 111 4 Κατασκευή των δικών σας κλάσεων 112 4.1 Δημιουργία κλάσεων 113 4.2 Προγραμματισμός κλάσης 116 4.3 Τροποποιητές πρόσβασης ιδιωτικοί και δημόσιοι 124 4.4 Περιεχόμενα μιας κλάσης 125 4.5 Άλλη μια κλάση και μερικοί νέοι τελεστές 135 4.6 Εισαγωγή στις μικροεφαρμογές 140 4.7 Εισαγωγή στα γραφικά 146 4.8 Νέες έννοιες σε αυτό το κεφάλαιο 154 4.9 Προβλήματα ανακεφαλαίωσης 157 4.10 Προβλήματα προγραμματισμού 158 5 Η επιλογή ως δομή ελέγχου 159 5.1 Μια απλή αριθμομηχανή 160 5.2 Η επιλογή είναι μια δομή ελέγχου 162 5.3 Μπλοκ κώδικα μέσα σε μεθόδους 168 5.4 Η εντολή if 170 5.5 Ένθετες if και εντολές πολλαπλής επιλογής 174 5.6 Λογικές παραστάσεις 182 5.7 Η εντολή πολλαπλής επιλογής switch 188 5.8 Σύγκριση υπολογιζόμενων δεκαδικών αριθμών 191 5.9 Ο τελεστής συνθήκης? 192 5.10 Νέες έννοιες σε αυτό το κεφάλαιο 192 5.11 Προβλήματα ανακεφαλαίωσης 194 5.12 Προβλήματα προγραμματισμού 194 6 Οι βρόχοι ως δομές ελέγχου 196 6.1 Βρόχοι ελεγχόμενοι από μετρητές 197 6.2 Βρόχος με γενική συνθήκη 200 6.3 Ένα παράδειγμα με γραφικά 203 6.4 Η εντολή for 206 6.5 Ένθετες δομές ελέγχου 208 6.6 Η εντολή do-while 209 6.7 Επιλογή της σωστής εντολής βρόχου 212 6.8 Έλεγχος των δεδομένων εισόδου 213 6.9 Νέες έννοιες σε αυτό το κεφάλαιο 216 6.10 Προβλήματα ανακεφαλαίωσης 217 6.11 Προβλήματα προγραμματισμού 217 7 Συνεργασία μεταξύ αντικειμένων 219 7.1 Παραδείγματα συνεργασίας μεταξύ αντικειμένων 220 7.2 Ένα πρόγραμμα οδηγούμενο από μενού 229 7.3 Πολλές αναφορές στο ίδιο αντικείμενο 236 7.4 Σύνοψη: Mεταβίβαση ορισμάτων 241 7.5 Νέες έννοιες σε αυτό το κεφάλαιο 244 7.6 Προβλήματα ανακεφαλαίωσης 245 7.7 Προβλήματα προγραμματισμού 245

Περιεχόμενα 7 8 Βιβλιοθήκες Java και χειρισμός εξαιρέσεων 247 8.1 Η ηλεκτρονική τεκμηρίωση της διασύνδεσης ρογραμματισμού εφαρμογών (API) 248 8.2 Δημιουργία των δικών σας βιβλιοθηκών 252 8.3 Τοπική προσαρμογή 255 8.4 Ήχοι και εικόνες 259 8.5 Εισαγωγή στο χειρισμό των εξαιρέσεων 262 8.6 Λεπτομέρειες για το χειρισμό των εξαιρέσεων 269 8.7 Νέες έννοιες σε αυτό το κεφάλαιο 280 8.8 Προβλήματα ανακεφαλαίωσης 281 8.9 Προβλήματα προγραμματισμού 281 9 Πίνακες στοιχειωδών τύπων δεδομένων 283 9.1 Τι είναι ένας πίνακας; 284 9.2 Αντιγραφή πινάκων 289 9.3 Η κλάση Month για τα δεδομένα της βροχόπτωσης 292 9.4 Ταξινόμηση 296 9.5 Αναζήτηση 300 9.6 Η κλάση java.util.arrays 302 9.7 Διδιάστατοι πίνακες 304 9.8 Περισσότερες από δύο διαστάσεις 312 9.9 Πίνακες πολλών διαστάσεων και αντικειμενοστρεφής προγραμματισμός 313 9.10 Νέες έννοιες σε αυτό το κεφάλαιο 314 9.11 Προβλήματα ανακεφαλαίωσης 315 9.12 Προβλήματα προγραμματισμού 315 10 Πίνακες τύπων αναφοράς και λίστες πίνακα 317 10.1 Ένας πίνακας τύπου αναφοράς 318 10.2 Λίστες πίνακα 322 10.3 Κλάσεις περιτύλιξης Integer, Double, κ.ο.κ. 325 10.4 Οι μέθοδοι equals() και tostring() 329 10.5 Συσχετίσεις 330 10.6 Ένα μεγαλύτερο παράδειγμα 333 10.7 Οι διασυνδέσεις Comparable και Comparator 344 10.8 Ταξινόμηση πινάκων και λιστών πίνακα 347 10.9 Νέες έννοιες σε αυτό το κεφάλαιο 354 10.10 Προβλήματα ανακεφαλαίωσης 354 10.11 Προβλήματα προγραμματισμού 355 11 Χρήση αρχείων και ρευμάτων δεδομένων 357 11.1 Αρχεία και ρεύματα δεδομένων 358 11.2 Ένα παράδειγμα αρχείου δεδομένων 359 11.3 Ανάγνωση κειμένου από ένα αρχείο 362 11.4 Εγγραφή κειμένου σε αρχείο 366 11.5 Αρχεία δεδομένων: σύνοψη και περιγραφές κλάσεων 367 11.6 Ανάγνωση αριθμών από ένα αρχείο δεδομένων 372 11.7 Επικοινωνία με την κονσόλα 375 11.8 Δυαδική μεταφορά δεδομένων 376 11.9 Τυχαία προσπέλαση των περιεχομένων ενός αρχείου 378 11.10 Σειριοποίηση 383 11.11 Νέες έννοιες σε αυτό το κεφάλαιο 390 11.12 Προβλήματα ανακεφαλαίωσης 390

8 Περιεχόμενα 11.13 Προβλήματα προγραμματισμού 391 12 Κληρονομικότητα και πολυμορφισμός 394 12.1 Γενίκευση και ειδίκευση 395 12.2 Κληρονομικότητα 397 12.3 Η κλάση Material με τις υποκλάσεις της 400 12.4 Χειρισμός των στιγμιοτύπων των υποκλάσεων ως συνόλου 406 12.5 Η περίπτωση της ανακαίνισης με πολλές επιφάνειες και πολλά υλικά 410 12.6 Και αν δεν υπήρχε ο πολυμορφισμός; 414 12.7 Ο τροποποιητής πρόσβασης Protected 417 12.8 Δύο επίπεδα κληρονομικότητας 421 12.9 Κανόνες και σύνταξη 426 12.10 Διασύνδεση 430 12.11 Νέες έννοιες σε αυτό το κεφάλαιο 435 12.12 Προβλήματα ανακεφαλαίωσης 436 12.13 Προβλήματα προγραμματισμού 437 13 Προγραμματισμός διασυνδέσεων γραφικών με το χρήστη και συμβάντα 442 13.1 Στοιχεία GUI 443 13.2 Το πάτημα ενός κουμπιού 447 13.3 Εσωτερικές κλάσεις 455 13.4 Διαχείριση της διάταξης 463 13.5 Νέες έννοιες σε αυτό το κεφάλαιο 475 13.6 Προβλήματα ανακεφαλαίωσης 477 13.7 Προβλήματα προγραμματισμού 477 14 Κείμενο, επιλογές, και παράθυρα 479 14.1 Στοιχεία κειμένου και ακροατές εστίασης 480 14.2 Παροχή στο χρήστη της δυνατότητας εκλογής μεταξύ πολλών επιλογών 489 14.3 Επιλογές με πλαίσια ελέγχου 491 14.4 Επιλογές με ραδιοπλήκτρα 494 14.5 Επιλογές με λίστες 497 14.6 Παράθυρα 506 14.7 Δημιουργία παραθύρου 508 14.8 Οι διαφορές μεταξύ εφαρμογών και μικροεφαρμογών 514 14.9 Άλλοι τρόποι προγραμματισμού ακροατών 516 14.10 Νέες έννοιες σε αυτό το κεφάλαιο 518 14.11 Προβλήματα ανακεφαλαίωσης 519 14.12 Προβλήματα προγραμματισμού 520 15 Δημιουργία διασύνδεσης χρήστη 522 15.1 Μενού 523 15.2 Γραμμές εργαλείων 527 15.3 Παράθυρα διαλόγου 531 15.4 Ο διαχείριση διάταξης GridBagLayout 547 15.5 Ο πίνακας στοιχείων GUI (η κλάση JTable) 553 15.6 Η διασύνδεση χρήστη μέσω γραφικών για το έργο της ανακαίνισης 556 15.7 Νέες έννοιες σε αυτό το κεφάλαιο 567 15.8 Προβλήματα ανακεφαλαίωσης 568 15.9 Προβλήματα προγραμματισμού 569

Περιεχόμενα 9 16 Νήματα 571 16.1 Νήματα σε διεργασίες 572 16.2 Κατανομή του χρόνου μεταξύ των νημάτων 574 16.3 Παραδείγματα νημάτων σε χρήση 576 16.4 Καταστάσεις νημάτων 581 16.5 Επικοινωνία μεταξύ νημάτων 582 16.6 Κλείστρα και συγχρονισμός 584 16.7 Περισσότερος έλεγχος: wait(), notify(), και notifyall() 589 16.8 Έρευνα στα νήματα με τον αποσφαλματωτή JDB 594 16.9 Νέες έννοιες σε αυτό το κεφάλαιο 596 16.10 Προβλήματα ανακεφαλαίωσης 597 16.11 Προβλήματα προγραμματισμού 597 17 Δομές δεδομένων και αλγόριθμοι 599 17.1 Γράφοι 600 17.2 Λίστες 602 17.3 Η λύση: Collection, List, και LinkedList 611 17.4 Ουρές και στοίβες 616 17.5 Αναδρομή 618 17.6 Δένδρα 620 17.7 Δένδρα στην API 629 17.8 Πίνακες κατακερματισμού 633 17.9 Νέες έννοιες σε αυτό το κεφάλαιο 638 17.10 Προβλήματα ανακεφαλαίωσης 639 17.11 Προβλήματα προγραμματισμού 640 18 Περισσότερα για τις μικροεφαρμογές 641 18.1 Τι κάνουν οι μικροεφαρμογές στον Ιστό 641 18.2 Ασφάλεια 643 18.3 Προγραμματισμός μικροεφαρμογής 646 18.4 Ασφάλεια στην πράξη 651 18.5 Επικοινωνία μεταξύ μικροεφαρμογής και φυλλομετρητή 654 18.6 Νέες έννοιες σε αυτό το κεφάλαιο 657 18.7 Προβλήματα ανακεφαλαίωσης 658 18.8 Προβλήματα προγραμματισμού 658 19 Κατανεμημένα συστήματα με προγραμματισμό υποδοχών και RMI 660 19.1 Υποδοχές 661 19.2 Αντικείμενα που συνεργάζονται μέσω δικτύου 668 19.3 Πώς διαδραματίζεται η επικοινωνία μεταξύ των αντικειμένων; 677 19.4 RMI και μικροεφαρμογές 683 19.5 Διάγραμμα ανάπτυξης 684 19.6 Ένα κατανεμημένο σύστημα με επανάκληση 687 19.7 Νέες έννοιες σε αυτό το κεφάλαιο 699 19.8 Προβλήματα ανακεφαλαίωσης 700 19.9 Προβλήματα προγραμματισμού 701 20 Προγραμματισμός με βάσεις δεδομένων 704 20.1 Προγράμματα οδήγησης βάσεων δεδομένων 705 20.2 Εγκατάσταση επαφής με μια βάση δεδομένων 707

10 Περιεχόμενα 20.3 Ένα μεγαλύτερο παράδειγμα 714 20.4 Μια εφαρμογή βάσης δεδομένων 721 20.5 Αρχιτεκτονική τριών στρώσεων 727 20.6 Συναλλαγές και μεταγλωττισμένες εντολές SQL 729 20.7 Νέες έννοιες σε αυτό το κεφάλαιο 733 20.8 Προβλήματα ανακεφαλαίωσης 734 20.9 Προβλήματα προγραμματισμού 734 21 Προγραμματισμός για τον Ιστό με σελίδες JavaServer 737 21.1 Διάφοροι τρόποι προγραμματισμού για τον Ιστό 738 21.2 Εγκατάσταση λογισμικού 739 21.3 Μικροϋπηρεσίες 741 21.4 Σελίδες JavaServer (JSP) 746 21.5 Τι αποτελεί τον κώδικα της JSP; 748 21.6 Εισαγωγή δεδομένων από το χρήστη 753 21.7 Επικύρωση από την πλευρά του πελάτη με JavaScript 762 21.8 Βάσεις δεδομένων 764 21.9 Αποθήκευση πληροφοριών κατάστασης 773 21.10 Νέες έννοιες σε αυτό το κεφάλαιο 790 21.11 Προβλήματα ανακεφαλαίωσης 791 21.12 Προβλήματα προγραμματισμού 792 Παραρτήματα A Χρήση του Java SDK και του WinEdit 794 Α.1 SDK 795 Α.2 Εκτέλεση μικροεφαρμογών 799 Α.3 WinEdit 800 B Δεσμευμένες λέξεις 802 Γ Συστήματα αρίθμησης 803 Δ Το σύνολο χαρακτήρων Unicode 806 E HTML και μικροεφαρμογές 808 Ε.1 HTML 808 Ε.2 Συμπερίληψη μικροεφαρμογών 810 Στ Εξαιρέσεις στο πρότυπο του κώδικα 813 Z Αναφορές 815 Ευρετήριο 817

7 Συνεργασία μεταξύ αντικειμένων Τι θα μάθετε σε αυτό το κεφάλαιο Αφού διαβάσετε αυτό το κεφάλαιο, θα πρέπει να κατανοείτε: Τι περιλαμβάνεται στην έννοια της συνεργασίας μεταξύ αντικειμένων Τις ομοιότητες και τις διαφορές κατά τη μεταβίβαση ορισμάτων ενός πρωταρχικού (στοιχειώδους) τύπου δεδομένων και ενός τύπου αναφοράς Αφού διαβάσετε αυτό το κεφάλαιο, θα πρέπει να μπορείτε: Να προγραμματίζετε τη συνεργασία μεταξύ αντικειμένων Να σχεδιάζετε το διάγραμμα ακολουθίας που παρουσιάζει τη συνεργασία μεταξύ των αντικειμένων Για να ολοκληρωθούν οι διάφορες εργασίες, συχνά πρέπει να συνεργαστούν πολλά αντικείμενα. Μερικά παραδείγματα από την καθημερινότητα: Ο καθηγητής στέλνει στο φοιτητή το μήνυμα "Ολοκλήρωσε αυτή την εργασία". Για να ολοκληρώσει την εργασία, ο φοιτητής ζητάει βοήθεια από άλλους φοιτητές και ερευνά στο Διαδίκτυο ή σε βιβλία. Η Elisabeth ανοίγει το CD player. Για να "παίξει" μουσική, το μηχάνημα πρέπει να συνεργαστεί με το CD. Στα προγράμματα καταφέρνουμε ένα αντικείμενο να συνεργαστεί με ένα άλλο αντικείμενο στέλνοντάς του μηνύματα. Ο σχετικός προγραμματισμός γίνεται με την κλήση μεθόδων για λογαριασμό του αντικειμένου προς το οποίο πρόκειται να στείλουμε το μήνυμα. Συνεπώς, ένα αντικείμενο μπορεί να συνεργαστεί με κάποιο άλλο αντικείμενο εφόσον μπορεί να του

220 7 Συνεργασία μεταξύ αντικειμένων στέλνει μηνύματα. Παράδειγμα: Μπορούμε να στείλουμε στο αντικείμενο mycdplayer το μήνυμα "Παίξε αυτό το CD!" με τον εξής τρόπο: mycdplayer.play("four Seasons"); Με τη σειρά του, το αντικείμενο mycdplayer μπορεί τώρα να συνεργαστεί με τις (ή να στείλει μηνύματα στις) δικές του μεταβλητές στιγμιοτύπου (τα εξαρτήματα από τα οποία αποτελείται ένα CD Player) και το αντικείμενο "FourSeasons" που έχει παραλάβει μέσω της λίστας παραμέτρων. Σε αυτό το κεφάλαιο θα δουλέψουμε και πάλι στο παράδειγμα της ανακαίνισης. Θα προγραμματίσουμε μερικές από τις κλάσεις του και θα δημιουργήσουμε ένα απλό πρόγραμμαπελάτη με μενού, το οποίο θα μπορεί να χρησιμοποιηθεί για να βρεθούν τα απαιτούμενα υ- λικά και το κόστος για την ταπετσαρία, το βάψιμο, και τα πατώματα. Η συνεργασία μεταξύ αντικειμένων μάς αναγκάζει να έχουμε αναφορές προς το ίδιο α- ντικείμενο από διάφορα σημεία του προγράμματος. Θα εξετάσουμε τις συνέπειες αυτής της αναγκαιότητας. 7.1 Παραδείγματα συνεργασίας μεταξύ αντικειμένων Θα εργαστούμε με το έργο της ανακαίνισης και θα δημιουργήσουμε ένα απλό πρόγραμμαπελάτη, το οποίο θα μπορεί να χρησιμοποιηθεί για τον υπολογισμό των απαιτούμενων υλικών και του κόστους. Θα διαπιστώσουμε πώς πρέπει να συνεργαστούν τα αντικείμενα των υλικών με τα αντικείμενα των επιφανειών για να λύσουν αυτό το πρόβλημα. Στην παρούσα περίπτωση, στιγμιότυπα των κλάσεων Flooring (παρκέ), Paint (βάψιμο), και Wallpaper (ταπετσαρία) θα πρέπει να συνεργαστούν με ένα στιγμιότυπο της κλάσης Surface. Στην Ενότητα 2.9 καταλήξαμε ήδη στους περισσότερους μαθηματικούς τύπους. Το διάγραμμα κλάσεων παρουσιάζεται στην Εικόνα 4.1. Η Λίστα προγράμματος 7.1 παρουσιάζει τις κλάσεις Flooring και Wallpaper. Προγραμματίσαμε την κλάση Surface στο Κεφάλαιο 4. Η κλάση Paint αποτελεί τη λύση σε ένα από τα προβλήματα αυτής της ενότητας. Λίστα προγράμματος 7.1 /* * Flooring.java E.L. 2001-05-17 * */ class Flooring { private static final double limit = 0.02; // όριο για ένα πλάτος ακόμη private String name; // για λόγους προσδιορισμού private double price; // τιμή ανά μέτρο private double widthofflooring; // πλάτος δαπέδου σε μέτρα public Flooring(String initname, double initprice, double initwidth) { name = initname;

7.1 Παραδείγματα συνεργασίας μεταξύ αντικειμένων 221 price = initprice; widthofflooring = initwidth; public String getname() { return name; public double getpriceperm() { return price; public double getwidth() { return widthofflooring; /* * Εδώ θα υπολογίσουμε την απαραίτητη ποσότητα για την κάλυψη μιας επιφάνειας. * Το παρκέ τοποθετείται πάντα εγκάρσια ως προς το μήκος της επιφάνειας. * Αν θέλετε να βρείτε την ποσότητα στην άλλη διάσταση, πρέπει να εναλλάξετε * το μήκος και το πλάτος στα ορίσματα της επιφάνειας (Surface). */ public double getnoofmeters(surface asurface) { double lengthsurface = asurface.getlength(); double widthsurface = asurface.getwidth(); int noofwidths = (int)(lengthsurface / widthofflooring); double rest = lengthsurface % widthofflooring; if (rest >= limit) noofwidths++; return noofwidths * widthsurface; public double gettotalprice(surface asurface) { return getnoofmeters(asurface) * price; /* * Wallpaper.java E.L. 2001-05-17 */ class Wallpaper { private static final double limit = 0.02; // όριο για ένα πλάτος ακόμη private String name; // για λόγους προσδιορισμού private double price; // τιμή ανά ρολό private double lengthperroll; // μήκος ανά ρολό σε μέτρα private double widthperroll; // πλάτος ανά ρολό σε μέτρα

222 7 Συνεργασία μεταξύ αντικειμένων public Wallpaper(String initname, double initprice, double initlengthperroll, double initwidthperroll) { name = initname; price = initprice; lengthperroll = initlengthperroll; widthperroll = initwidthperroll; public String getname() { return name; public double getpriceperroll() { return price; public double getlengthperroll() { return lengthperroll; public double getwidthperroll() { return widthperroll; /* * Η μέθοδος αυτή υπολογίζει τον αριθμό των ρολών που απαιτούνται * για την κάλυψη μιας επιφάνειας. */ public int getnoofrolls(surface asurface) { double lengthsurface = asurface.getlength(); double heightsurface = asurface.getwidth(); /* υπολογισμός του αριθμού των υψών */ int noofheights = (int) (lengthsurface / widthperroll); double remnant = lengthsurface % widthperroll; if (remnant >= limit) noofheights++; /* υπολογισμός του αριθμού των ρολών */ int noofrolls; int noofheightsperroll = (int) (lengthperroll / heightsurface); if (noofheightsperroll > 0) { noofrolls = noofheights / noofheightsperroll; remnant = noofheights % noofheightsperroll; if (remnant >= limit) noofrolls++; else { // το ρολό είναι κοντύτερο από ένα ύψος (σπάνιο!) double totalnoofmeters = noofheights * heightsurface; noofrolls = (int) (totalnoofmeters / lengthperroll); if (totalnoofmeters % lengthperroll >= limit) noofrolls++;

7.1 Παραδείγματα συνεργασίας μεταξύ αντικειμένων 223 return noofrolls; public double gettotalprice(surface asurface) { return getnoofrolls(asurface) * price; Δημιουργούμε ένα μικρό πρόγραμμα-πελάτη: class FlooringClient { public static void main(string[] args) { Surface thesurface = new Surface("Margaret's Floor", 5, 6); Flooring theflooring = new Flooring("Fitted carpet", 24.50, 5); double noofmeters = theflooring.getnoofmeters(thesurface); double price = theflooring.gettotalprice(thesurface); System.out.println("You need " + noofmeters + " meters, price $" + price); Εδώ δημιουργούμε ένα αντικείμενο Surface και ένα αντικείμενο Flooring και στέλνουμε δύο μηνύματα στο αντικείμενο Flooring. Πρώτα του ζητούμε να βρει πόσα μέτρα χρειάζονται και, μετά, ποιο θα είναι το κόστος τους. Η έξοδος από το πρόγραμμα θα μοιάζει ως εξής: You need 6.0 meters, price $147.0 Παράδειγμα 1: η μέθοδος getnoofmeters() Ας εξετάσουμε πιο προσεκτικά τη μέθοδο getnoofmeters(). Το αντικείμενο που ονομάζεται theflooring θα εκτιμήσει πόσα μέτρα απαιτούνται για την κάλυψη μιας συγκεκριμένης επιφάνειας. Για να βρει αυτό το ζητούμενο, τα δύο αντικείμενα πρέπει να συνεργαστούν. Επομένως, μαζί με το μήνυμα getnoofmeters() στέλνουμε και μια αναφορά προς την επιφάνεια που πρόκειται να στρωθεί. Οι αναφορές ως ορίσματα Στέλνουμε ένα μήνυμα σε κάποιο αντικείμενο Α με την κλήση μιας μεθόδου. Για να μπορέσει το αντικείμενο Α να συνεργαστεί με το αντικείμενο Β προκειμένου να ολοκληρώσουν μια εργασία, συχνά πρέπει να υπάρχει ως όρισμα της μεθόδου μια αναφορά στο αντικείμενο Β. Με αυτόν τον τρόπο, το αντικείμενο Α θα μπορεί να στέλνει μηνύματα στο αντικείμενο Β. Στο παράδειγμα, το Α είναι ίσο με το theflooring και το Β είναι ίσο με το thesurface.

224 7 Συνεργασία μεταξύ αντικειμένων Επικεφαλίδα της μεθόδου: public double getnoofmeters(surface asurface) Κλήση: double noofmeters = theflooring.getnoofmeters(thesurface); Μελετήστε στο πρόγραμμα τον κώδικα της μεθόδου getnoofmeters(). Για να πάρει το μήκος και το πλάτος, στέλνει μηνύματα στο αντικείμενο Surface: double lengthsurface = asurface.getlength(); double heightsurface = asurface.getwidth(); Ένα διάγραμμα ακολουθίας (sequence diagram) παρουσιάζει τον τρόπο που στέλνονται τα μηνύματα από αντικείμενο σε αντικείμενο (Εικόνα 7.1). 1 Το κείμενο με πλάγια γραφή επεξηγεί τη χρήση των συμβόλων στο διάγραμμα και δεν αποτελεί στοιχείο της UML. Εδώ παρακολουθούμε τα αντικείμενα σε συνάρτηση με το χρόνο (στον κατακόρυφο άξονα). Μπορούμε να διαπιστώσουμε από την εικόνα της εξής ανταλλαγή μηνυμάτων: 1. Ο πελάτης δημιουργεί ένα αντικείμενο με όνομα theflooring. 2. Ο πελάτης δημιουργεί ένα αντικείμενο με όνομα thesurface. 3. Ο πελάτης στέλνει στο αντικείμενο theflooring το μήνυμα getnoofmeter(). Μαζί στέλνει και το thesurface ως όρισμα. 4. Το theflooring στέλνει στο thesurface το μήνυμα getlength(). 5. Το thesurface επιστρέφει μια απόκριση στο theflooring. 6. Το theflooring στέλνει στο thesurace το μήνυμα getwidth(). 7. Το thesurface επιστρέφει μια απόκριση στο theflooring. 8. Το theflooring επιστρέφει μια απόκριση στον πελάτη. Οι διακεκομμένες κατακόρυφες γραμμές υποδηλώνουν τη διάρκεια ζωής των αντικειμένων. Τα στενά κατακόρυφα ορθογώνια που επικαλύπτουν μερικώς τις γραμμές ζωής υποδηλώνουν τις περιόδους ζωής κατά τις οποίες ένα αντικείμενο είναι ενεργό. Ένα διάγραμμα ακολουθίας χρησιμοποιείται συνήθως για να δείξει πώς συνεργάζονται τα αντικείμενα για να εκτελέσουν κάποιο συγκεκριμένο έργο. Το αντικείμενο με το όνομα theflooring μπορεί να είναι ενεργό και σε άλλες περιόδους της ζωής του, όταν υπάρχουν άλλες εργασίες που πρέπει να εκτελέσει. τέτοιες περίοδοι, πάντως, δεν απεικονίζονται στο διάγραμμα της Εικόνας 7.1. 1 Η UML διαθέτει, επίσης, και τα ονομαζόμενα διαγράμματα συνεργασίας (collaboration diagrams). Τα διαγράμματα ακολουθίας και τα διαγράμματα συνεργασίας παρουσιάζουν παρόμοιες πληροφορίες, αλλά τις α- πεικονίζουν με διαφορετικό τρόπο. Για το βιβλίο αυτό, θεωρήσαμε καταλληλότερα τα διαγράμματα ακολουθίας.

7.1 Παραδείγματα συνεργασίας μεταξύ αντικειμένων 225 Εικόνα 7.1 Διάγραμμα ακολουθίας (UML) Παρατηρήστε τη διαφορά μεταξύ διαγράμματος δραστηριότητας (Κεφάλαιο 5) και διαγράμματος ακολουθίας. Και οι δύο τύποι διαγραμμάτων παρουσιάζουν πράγματα που συμβαίνουν σε συνάρτηση με το χρόνο. Τα διαγράμματα δραστηριότητας δείχνουν τι συμβαίνει σε ένα αντικείμενο σε επίπεδο λεπτομερειών 2 στο διάστημα της ζωής του που απεικονίζεται με το στενό κατακόρυφο ορθογώνιο στο διάγραμμα ακολουθίας. Για παράδειγμα, το διάγραμμα δραστηριότητας για τη μέθοδο getnoofmeters() στην κλάση Flooring παρουσιάζει τι γίνεται με το αντικείμενο που ονομάζεται theflooring όσο είναι ενεργό (δηλαδή, μέσα στο κατακόρυφο ορθογώνιο στο κέντρο της Εικόνας 7.1). Παράδειγμα 2: η μέθοδος gettotalprice() Από το προηγούμενο πρόγραμμα-πελάτη παίρνουμε την επόμενη εντολή: double price = theflooring.gettotalprice(thesurface); Η μέθοδος gettotalprice() θα έχει την εξής μορφή: 2 Τα διαγράμματα δραστηριότητας, από την άλλη, χρησιμοποιούνται συχνά για να δείξουν τη ροή του ελέγχου σε ανώτερο επίπεδο.

226 7 Συνεργασία μεταξύ αντικειμένων public double gettotalprice(surface asurface) { return getnoofmeters(asurface) * price; Θα βρούμε πόσο κοστίζει να καλύψουμε την επιφάνεια με το υπόψη παρκέ. Για το σκοπό αυτόν, πρέπει πρώτα να διαπιστώσουμε πόσα μέτρα χρειάζονται και μετά να τα πολλαπλασιάσουμε με την τιμή. Βέβαια, η κλάση Flooring διαθέτει ήδη μια μέθοδο που βρίσκει τον αριθμό των μέτρων. γι' αυτό, θα χρησιμοποιήσουμε τη μέθοδο αυτή. Το αντικείμενο στέλνει το μήνυμα getnoofmeters() στον εαυτό του. Παράδειγμα 3: συνεργασία δύο αντικειμένων της ίδιας κλάσης Ένα αντικείμενο μπορεί να συνεργαστεί με ένα άλλο αντικείμενο της ίδιας κλάσης προκειμένου να ολοκληρώσουν κάποια εργασία. Ας επεκτείνουμε την κλάση Surface με μια μέθοδο που συγκρίνει το εμβαδόν της επιφάνειας αυτής με το εμβαδόν μιας άλλης. Στις μεθόδους σύγκρισης συνηθίζεται να επιστρέφουν την τιμή 0 αν τα αντικείμενα είναι ίδια, μια αρνητική τιμή αν είναι μικρότερο το πρώτο αντικείμενο, και μια θετική τιμή αν το πρώτο αντικείμενο είναι μεγαλύτερο. Μπορούμε να χρησιμοποιήσουμε τη μέθοδο compareareas() με τον επόμενο τρόπο: Surface surface1 = new Surface("A", 5, 4); Surface surface2 = new Surface("B", 4, 4); int result = surface1.compareareas(surface2); if (result < 0) System.out.println(surface1.getName() + " is the smaller one."); else if (result > 0) System.out.println(surface2.getName() + " is the smaller one."); else System.out.println("The surfaces have the same area."); Βλέπουμε ότι στέλνουμε ένα μήνυμα προς το αντικείμενο surface1. Το όρισμα για τη μέθοδο σύγκρισης είναι το surface2. Πώς θα πρέπει να προγραμματίσουμε αυτή τη μέθοδο; Είναι φανερό ότι, για να πάρουμε μια απάντηση, το surface1 πρέπει να συνεργαστεί με το surface2. Πρώτα πρέπει να υπολογίσει το δικό του εμβαδόν, μετά να υπολογίσει το εμβαδόν του surface2, και μετά να τα συγκρίνει (Εικόνα 7.2). Παρατηρήστε με ποιο τρόπο σχεδιάζουμε ένα αντικείμενο που στέλνει ένα μήνυμα στον εαυτό του. Ο κώδικας του προγράμματος θα μοιάζει με τον εξής: public int compareareas(surface theothersurface) { final double precision = 0.00001; double area1 = getarea(); double area2 = theothersurface.getarea(); if (Math.abs(area2 - area1) < precision) return 0; else if (area1 < area2) return -1; else return 1;

7.1 Παραδείγματα συνεργασίας μεταξύ αντικειμένων 227 Καθώς συγκρίνουμε αποτελέσματα υπολογισμών με δεκαδικούς αριθμούς, α πρέπει να θυμόμαστε ότι οι υπολογισμοί αυτοί δεν είναι απολύτως ακριβείς. Γι' αυτό, ορίζουμε ότι οι ε- πιφάνειες έχουν ίσο εμβαδόν εφόσον η διαφορά τους είναι μικρότερη από τη σταθερά precision ("ακρίβεια"). Εικόνα 7.2 Ένα στιγμιότυπο της κλάσης Surface στέλνει ένα μήνυμα στον εαυτό του και σε ένα άλλο στιγμιότυπο της ίδιας κλάσης, ώστε να ολοκληρώσει μια εργασία (UML). Παρατηρήστε ότι, όταν καλούμε τη μέθοδο, η παράμετρος theothersurface ("η άλλη επιφάνεια") τίθεται ίση με το όρισμα surface2. Όταν αναφερόμαστε στο αντικείμενο theothersurface μέσα στη μέθοδο, εννοούμε το αντικείμενο πελάτη που ονομάζεται surface2. Οι μεταβλητές στιγμιοτύπου length και width είναι ιδιωτικές. Η πρόσβαση σε ιδιωτικά μέλη περιορίζεται μέσα στην κλάση και όχι μέσα στο ίδιο το αντικείμενο όπου βρισκόμαστε. Με άλλα λόγια, αντί να καλέσουμε τη μέθοδο getarea(), μπορούμε να υπολογίσουμε το εμβαδόν τού theothersurface μέσα στη μέθοδο compareareas() με τον εξής τρόπο: double area2 = theothersurface.length * theothersurface.width; Κάθε στιγμιότυπο μιας κλάσης έχει πρόσβαση στα ιδιωτικά μέλη των άλλων στιγμιοτύπων της ίδιας κλάσης.

228 7 Συνεργασία μεταξύ αντικειμένων Προβλήματα 1. Η Λίστα προγράμματος 7.1 παρουσιάζει την υλοποίηση της κλάσης Wallpaper. Υποθέστε ότι εκτελούνται οι εξής γραμμές του κώδικα: Surface thesurface = new Surface("Margaret's wall", 5, 2.5); Wallpaper thewallpaper = new Wallpaper("Brocade wallpaper", 8.50, 12, 0.6); int noofrolls = thewallpaper.getnoofrolls(thesurface); (α) Σχεδιάστε ένα διάγραμμα ακολουθίας που να δείχνει τι γίνεται εδώ. (β) Σχεδιάστε ένα διάγραμμα δραστηριότητας που να δείχνει τι συμβαίνει όταν το αντικείμενο με το όνομα thewallpaper εκτελεί τη δραστηριότητα getnoofrolls(). 2. Προγραμματίστε την κλάση Paint σύμφωνα με τις προδιαγραφές του διαγράμματος κλάσης στην Εικόνα 4.1. Στρογγυλοποιήστε την ποσότητα του απαραίτητου χρώματος στο επόμενο μισό λίτρο. 3. Έστω η κλάση Person: class Person { private String name; private int yearofbirth; public Person(String initname, int inityearofbirth) { name = initname; yearofbirth = inityearofbirth; public String getname() { return name; public int getyearofbirth() { return yearofbirth; Σε ένα πρόγραμμα-πελάτη δημιουργούνται δύο στιγμιότυπα αυτής της κλάσης: Person p1 = new Person("Peter", 1980); Person p2 = new Person("Jane", 1984); Θα συνθέσετε μια σειρά από μεθόδους στιγμιοτύπου στην κλάση Person. Για κάθε μέθοδο, πρέπει να δώσετε ένα παράδειγμα χρήσης της, με αποστολή μηνυμάτων στο p1 στο πρόγραμμα-πελάτη. Δημιουργήστε μεθόδους που: (α) θα διαπιστώνουν αν το πρόσωπο έχει ίδια ηλικία με κάποιο άλλο πρόσωπο και ο τύπος που θα επιστρέφουν θα είναι boolean

7.2 Ένα πρόγραμμα οδηγούμενο από μενού 229 (β) θα συγκρίνουν την ηλικία ενός προσώπου με την ηλικία ενός άλλου και ο τύπος που θα επιστρέφουν θα είναι int (για μικρότερη από, ίση με, μεγαλύτερη από) (γ) θα διαπιστώνουν αν ένα πρόσωπο είναι περισσότερο από x έτη πιο ηλικιωμένο από κάποιο άλλο πρόσωπο και ο τύπος που θα επιστρέφουν θα είναι boolean. 7.2 Ένα πρόγραμμα οδηγούμενο από μενού Θα γράψουμε τώρα ένα πρόγραμμα, το οποίο θα χρησιμοποιούμε για να πάρουμε μια εκτίμηση των απαιτούμενων υλικών και του κόστους για την ανακαίνιση μιας επιφάνειας (τοίχου ή πατώματος). Το πρόγραμμα θα εκτελείται σε βρόχο και θα δίνει τη δυνατότητα να γίνουν πολλοί υπολογισμοί διαδοχικά. Δείτε το διάγραμμα δραστηριότητας στην Εικόνα 7.3, που παρουσιάζει τις δραστηριότητες του πελάτη. Ο πελάτης αρχίζει με την εκτύπωση μερικών γραμμών με οδηγίες χρήσης, ώστε να παίρνει ο χρήστης μια ιδέα για το τι μπορεί να κάνει το πρόγραμμα και για το τι θα πρέπει να κάνει αυτός ως χρήστης. Εικόνα 7.3 Η δραστηριότητα σε ένα αντικείμενο πελάτη το οποίο υπολογίζει τα απαιτούμενα υλικά για μια ανακαίνιση (UML). Θα δημιουργήσουμε το μενού χρησιμοποιώντας τη μέθοδο showoptiondialog() της κλάσης JOptionPane (Εικόνα 7.4). Βέβαια, για να δημιουργήσουμε το πρόγραμμα θα χρειαστούμε τις κλάσεις Surface, Flooring, Paint, και Wallpaper. Εξετάσαμε τις κλάσεις αυτές σε προηγούμενες ενότητες αυτού του κεφαλαίου.

230 7 Συνεργασία μεταξύ αντικειμένων Εικόνα 7.4 Ο χρήστης μπορεί να επιλέξει το υλικό ανακαίνισης. Η επικοινωνία με το χρήστη είναι πιο πολύπλοκη από όσο στα προγράμματα που καλύψαμε μέχρι εδώ. Χρειαζόμαστε ένα αντικείμενο που θα έχει την αρμοδιότητα εκτέλεσης των εργασιών του διαγράμματος δραστηριότητας. Ας ονομάσουμε ProjectChap7 την κλάση στην οποία θα ανήκει αυτό το αντικείμενο. Παρατηρήστε αυτή την κλάση στα αριστερά της Εικόνα 7.5. Με αυτό το διάγραμμα κλάσης θα εισαγάγουμε και μερικά νέα στοιχεία συμβολισμού: Εικόνα 7.5 Κλάσεις αρμόδιες για την επικοινωνία με το χρήστη (UML). Μέχρι τώρα, το πλήθος των τιμών που μπορούσε να έχει η ιδιότητα κάποιου συγκεκριμένου αντικειμένου ήταν 1. Ο αριθμός των εναλλακτικών επιλογών σε ένα μενού, όμως, είναι συνήθως περισσότερες από μία. Για να το υποδείξουμε αυτό χρησιμοποιούμε τη συντομογραφία [1..*] ή, γενικότερα, [m.. n]. Ο πρώτος αριθμός δείχνει το κάτω όριο μιας σειράς τιμών. ο δεύτερος αριθμός δείχνει το άνω όριο. Αστερίσκος αντί για αριθμό (όπως στην Εικόνα 7.5) δηλώνει ότι δεν υπάρχει άνω όριο για το πλήθος των τιμών. Στη συγκεκριμένη περίπτωση εκτιμήσαμε ότι είναι σωστό να συμπεριλάβουμε λίστες παραμέτρων για τις λειτουργίες. Η έκταση στην οποία θα το κάνουμε αυτό εξαρτάται από το πόσο μακριά θα φτάσουμε κατά τη διαδικασία ανάπτυξης. Ο τύπος δεδομένων και το όνομα των παραμέτρων υποδεικνύονται για τις παραμέτρους με τον ίδιο τρόπο που ισχύει για τις ιδιότητες. Εδώ υποδείξαμε τον επιστρεφόμενο τύπο για λειτουργίες που επιστρέφουν τιμές. Η λειτουργία doachoice() επιστρέφει έναν ακέραιο. Το διατυπώνουμε αυτό χρησιμοποιώντας μετά από τη λειτουργία μια άνω και κάτω τελεία και τον τύπο δεδομένων. Για να εκτελεστεί μια λειτουργία που συνδέεται με μια επιλογή μενού, πρέπει να εισαχθούν δεδομένα σχετικά με επιφάνειες και υλικά. Θα πρέπει να δημιουργηθούν νέα αντικεί-

7.2 Ένα πρόγραμμα οδηγούμενο από μενού 231 μενα και να εκτελεστούν νέοι υπολογισμοί. Θα δούμε, για παράδειγμα, τι πρέπει να συμβαίνει όταν το πρόγραμμα εκτελεστεί με σκοπό την εκτίμηση της απαραίτητης ποσότητας χρώματος: 1. Είσοδος δεδομένων σχετικών με την επιφάνεια που θα χρωματιστεί (όνομα, μήκος, πλάτος). 2. Δημιουργία ενός στιγμιοτύπου της κλάσης Surface. 3. Είσοδος δεδομένων σχετικών με το χρώμα που θα χρησιμοποιηθεί (όνομα, τιμή, αριθμός επαναλήψεων "χέρια", αριθμός τετραγωνικών μέτρων ανά λίτρο). 4. Δημιουργία ενός στιγμιοτύπου της κλάσης Paint. 5. Ερώτηση του αντικειμένου χρώματος πόσο χρώμα χρειάζεται για την κάλυψη της δεδομένης επιφάνειας και πόσο θα κοστίσει. 6. Εξαγωγή των απαντήσεων. Όλα αυτά μπορούμε είτε να τα τοποθετήσουμε στην κλάση ProjectChap7, είτε να συνθέσουμε μια νέα κλάση που θα είναι αρμόδια για το τμήμα αυτών των εργασιών που μπορεί να είναι χρήσιμο για άλλες καταστάσεις. Επιλέξαμε να έχουμε ξεχωριστά τα σημεία 1 και 2, και ξεχωριστά τα σημεία 3 και 4. Συνθέτουμε μια νέα κλάση με μεθόδους για την είσοδο πληροφοριών και τη δημιουργία στιγμιοτύπων (συγκεκριμενοποίηση instantiation) αντικειμένων. Δείτε την κλάση ReaderRenovationCase στα δεξιά της Εικόνας 7.5. Κάνουμε διάκριση μεταξύ εργασιών που συνδέονται άμεσα με το συγκεκριμένο πρόγραμμα-πελάτη που γράφουμε τώρα (την κλάση ProjectChap7) και εργασιών γενικότερης φύσης (την κλάση ReaderRenovationCase). Ορίζουμε ένα στιγμιότυπο της κλάσης ReaderRenovationClass ως ιδιότητα ενός στιγμιοτύπου της κλάσης ProjectChap7. Έτσι επιτρέπουμε τη συνεργασία μεταξύ αυτών των αντικειμένων. Το πρόγραμμα-πελάτη βρίσκεται στο ίδιο αρχείο με την κλάση ProjectChap7 (δείτε τη Λίστα προγράμματος 7.2). Παρατηρήστε ότι έχουμε ονομάσει τους ακέραιους που αντιπροσωπεύουν τις επιλογές μενού. Αυτό κάνει πιο ευανάγνωστο τον κώδικα του προγράμματος και έχει, επιπλέον, ένα σημαντικό πλεονέκτημα: μια από αυτές τις σταθερές (η exit) χρησιμοποιείται στη main() για τον τερματισμό του βρόχου. Έτσι μπορούμε να προσθέσουμε διάφορες επιλογές μενού στην κλάση ProjectChap7 και ταυτόχρονα να διατηρούμε την επιλογή exit στο τέλος του μενού. Ακόμη και αν η exit αλλάξει τιμή και γίνει, π.χ., 4, αυτό δεν σημαίνει απολύτως τίποτε για τη main(). Η τιμή μιας σταθεράς αλλάζει σε ένα μόνο σημείο. Η κλάση ProjectChap7 περιέχει τρεις μεθόδους: Τη μέθοδο showinstructions(), που παρουσιάζει σε ένα πλαίσιο μηνύματος οδηγίες για το χρήστη. Κάθε πρόγραμμα με εύλογες διαστάσεις πρέπει να περιλαμβάνει και ορισμένες οδηγίες για το χρήστη.