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

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "2 Αντικειµενοστρεφής προγραµµατισµός"

Transcript

1 11/3/2006 Ι. Γαβιώτης - Τεχνολογίες & Μεθοδολογίες Προγραµµατισµού II Σελίδα 19 2 Αντικειµενοστρεφής προγραµµατισµός 2.1 Τα δεδοµένα στο επίκεντρο Στον δοµηµένο προγραµµατισµό, η προσοχή µας εστιάζεται στην επεξεργασία (processing), δηλαδή στις ενέργειες που πρέπει να εκτελεστούν τα δεδοµένα έρχονται στο προσκήνιο αργότερα, όταν είναι προφανές τι λειτουργίες πρέπει να εκτελεστούν πάνω τους. Αυτό είναι καλό, γιατί µπορούµε να επιλέξουµε δοµές δεδοµένων που να αποδίδουν βέλτιστα για το σύνολο των απαιτούµενων λειτουργιών. Ωστόσο, εάν αργότερα χρειαστεί να τροποποιήσουµε το πρόγραµµα και να προσθέσουµε µια νέα λειτουργία στα δεδοµένα, η δόµηση του προγράµµατος χρειάζεται εκτεταµένες αλλαγές. Κατά την αντικειµενοστρεφή (object-oriented, Ο-Ο) προσέγγιση, το σύστηµα αποτελείται από αλληλεπιδρώντα αντικεί- µενα. Κάθε αντικείµενο έχει ιδιότητες ή χαρακτηριστικά που οι τιµές τους αναπαριστάνουν την τρέχουσα κατάστασή του. Επίσης απαντά σε ένα σύνολο ενεργειών που ορίζουν τη συµπεριφορά του. Πιο συγκεκριµένα, το αντικείµενο περιλαµβάνει: (α) δεδοµένα που αναπαριστάνουν τις ιδιότητές του, και (β) λειτουργίες που υλοποιούν τις πράξεις που µπορούν να εφαρµοστούν πάνω του. Το πρόγραµµα δηµιουργεί αντικεί- µενα και καλεί µεθόδους τους για να τα διαχειριστεί. Ας συγκρίνουµε τις δύο προσεγγίσεις µε ένα παράδειγµα. Θέλουµε να φτιάξουµε ένα πρόγραµµα που λειτουργεί πάνω σε διάφορα γεωµετρικά σχήµατα, πχ ευθύγραµµα τµήµατα, κύκλους, παραλληλόγραµµα, κλπ. Θέλουµε τα προβάλουµε, να υπολογίζουµε το εµβαδόν τους, να τα µετακινούµε, να βρίσκουµε αν τέµνονται, κά. Κατά το δοµηµένο προγραµµατισµό, το πρόγραµµα οργανώνεται µε βάση τις λειτουργίες. Για παράδειγµα, θα έ- χουµε µια µέθοδο που θα σχεδιάζει το σχήµα που της δίνεται ως παράµετρος: public double epifaneia(sxhma s) { switch (s.type) { case KYKLOS: return Math.PI * s.aktina * s.aktina; case PARALLHLOGRAMMO: /* αντίστοιχος κώδικας */... //end switch //end epifaneia Κατά τον αντικειµενοστρεφή προγραµµατισµό, το πρόγραµµα οργανώνεται µε βάση τα σχήµατα. Για κάθε σχήµα ορίζονται τα χαρακτηριστικά του και υλοποιούνται στην κλάση του οι λειτουργίες στις οποίες ανταποκρίνεται. Έτσι µπορούµε να προσθέσουµε σχήµατα στη συλλογή µας χωρίς να αλλάζουµε τον υφιστάµενο κώδικα των σχηµάτων που έχουµε ήδη φτιάξει. Κύριοι στόχοι του αντικειµενοστρεφούς προγραµµατισµού είναι η επαναχρησιµοποίηση κώδικα (software reuse) και η ακρίβεια της µοντελοποίησης του συστήµατος που προσοµοιώνουµε µε το πρόγραµµα. Χαρακτηριστικά αντικειµενοστρεφών συστηµάτων ανάπτυξης λογισµικού: Αρθρωσιµότητα (modularity): διαίρεση σε µικρότερα κοµµάτια, βλέπε και δοµηµένος προγραµµατισµός Αφαίρεση (abstraction): επικεντρώνει την προσοχή στις κύριες ή σχετικές ιδιότητες του αντικειµένου και αγνοεί τις δευτερεύουσες ή επουσιώδεις. Ενθυλάκωση (encapsulation): προσφέρει προστασία ιδιωτικών δεδοµένων και δίνει τη δυνατότητα να αλλάξει η εσωτερική αναπαράσταση των αντικειµένων, χωρίς αυτό να γίνεται αντιληπτό στα σηµεία κλήσης των µεθόδων. Ιεραρχία και κληρονοµικότητα (inheritance): εξειδίκευση κλάσεων µέσω επέκτασης της συµπεριφοράς άλλων κλάσεων Γλώσσες που υποστηρίζουν αντικειµενοστρεφή προγραµµατισµό είναι οι Smalltalk, Java, C++. Ειδικά οι δύο πρώτες είναι πλήρως αντικειµενοστρεφείς: όλα τα δεδοµένα (µπορούν να) είναι αντικείµενα και τα προγράµµατα είναι κλάσεις. Επίσης υποστηρίζουν τα παραπάνω τέσσερα χαρακτηριστικά. Καταρχήν είναι εφικτό να αναπτύξει κάποιος ένα αντικειµενοστρεφές πρόγραµµα, χωρίς να χρησιµοποιήσει µια αµιγώς αντικειµενοστρεφή Εικόνα 25 Πρόγονοι της Java γλώσσα, όπως αυτές που αναφέρονται παραπάνω 1. Άλλες γλώσσες έχουν επεκταθεί µε αντικειµενοστρεφή χαρακτηριστικά, όπως η Visual Basic. Στη δεκαετία του 70 είχαµε ένα παρόµοιο φαινόµενο όταν οι πρώτες διαδικαστικές γλώσσες, όπως η Basic και η Fortran επεκτείνονταν µε µηχανισµούς κλήσης υπορουτινών και περάσµατος παραµέτρων για να υποστηρίξουν τις αρχές του δοµηµένου προγραµµατισµού. 1 Και το αντίστροφο ισχύει, και µάλιστα συµβαίνει συχνά: µπορεί κάποιος να χρησιµοποιεί µια αντικειµενοστρεφή γλώσσα προγραµµατισµού κι όµως να αναπτύσσει µη αντικειµενοστρεφή προγράµµατα.

2 Σελίδα 20 Ι. Γαβιώτης - Τεχνολογίες & Μεθοδολογίες Προγραµµατισµού II 11/3/2006 Ο Alan Kay συνοψίζει πέντε χαρακτηριστικά της Smalltalk, της πρώτης αντικειµενοστρεφούς γλώσσας προγραµµατισµού που ισχύουν σε µεγάλο βαθµό και για τη Java: Τα πάντα είναι αντικείµενα. 2 Το πρόγραµµα είναι µια οµάδα αντικειµένων που λένε το ένα στο άλλο τι να κάνει στέλνοντας µηνύµατα. Τα µηνύ- µατα δηλαδή είναι το ανάλογο των υπορουτινών στις διαδικαστικές γλώσσες προγραµµατισµού. Κάθε αντικείµενο έχει τη µνήµη του και αποτελείται από άλλα αντικείµενα. Κάθε αντικείµενο έχει έναν τύπο. Ακολουθώντας την ορολογία, κάθε αντικείµενο είναι στιγµιότυπο µιας κλάσης. Όλα τα αντικείµενα του ίδιου τύπου µπορούν να λάβουν τα ίδια µηνύµατα. 2.2 Η έννοια της αφαίρεσης Όλες οι γλώσσες προγραµµατισµού είναι εργαλεία για τον ορισµό αφαιρέσεων 3 (abstractions). Αν και οι γλώσσες είναι υπολογιστικά ισοδύναµες, δηλαδή όλες µπορούν να λύσουν το ίδιο σύνολο προβληµάτων, η πολυπλοκότητα των προβληµάτων που µπορεί να λύσει ένας προγραµµατιστής, εξαρτάται από το είδος και την ποιότητα της αφαίρεσης που υποστηρίζει η γλώσσα. Όσο πιο υψηλού επιπέδου είναι µια γλώσσα, τόσο πιο µεγάλη αφαιρετική ικανότητα προσφέρει. Υπάρχουν γλώσσες που προσφέρουν συγκεκριµένες αφαιρέσεις και µπορούν να χρησιµοποιηθούν για να εκφράσουν λύσεις προβληµάτων που σχετίζονται µε αυτές τις αφαιρέσεις. Για παράδειγµα, η Lisp είναι καλό εργαλείο για προβλήµατα που αντιµετωπίζονται µε λίστες και η Prolog για προβλήµατα που λύνονται µε εξαντλητική διερεύνηση του χώρου λύσεων µετά την εφαρµογή περιορισµών (constraints). Αντίθετα, η assembly που είναι πολύ χαµηλού επιπέδου, προσφέρει στον προγραµµατιστή µόνον τη δυνατότητα να χρησιµοποιεί µνηµονικά ονόµατα για τις εντολές του µικροεπεξεργαστή και τις θέσεις µνήµης του προγράµµατος. Κατά τα άλλα ο προγραµµατιστής εκφράζει τη λύση του προβλήµατος χρησιµοποιώντας τις εντολές της γλώσσας µηχανής του υπολογιστή στόχος. Με την αντικειµενοστρεφή προσέγγιση, τα προβλήµατα επιλύονται δηµιουργώντας αφαιρέσεις («µοντέλα») των αντικειµένων που εµπλέκονται στο πρόβληµα. Έτσι όταν κάποιος διαβάζει το πρόγραµµα, βλέπει αντικείµενα και λειτουργίες που έχουν ανάλογα στον χώρο του προβλήµατος (problem space) και όχι στον χώρο της γλώσσας προγραµµατισµού ή του υπολογιστή. Παράδειγµα: Ας πούµε ότι σχεδιάζουµε ένα πρόγραµµα που ελέγχει το φωτισµό ενός καταστήµατος. Ο φωτισµός γίνεται µε λάµπες. Το αντικεί- µενο «λάµπα» (Light) έχει µια κατάσταση (state) και λειτουργίες για ά- ναµµα, σβήσιµο. Επίσης, έχει δυνατότητα για µείωση / αύξηση φωτισµού. Η εσωτερική αναπαράσταση της κατάστασης της λάµπας µπορεί να είναι ένας αριθµός που υποδηλώνει πόσο αναµµένη ή σβηστή είναι. είτε στην ενότητα 2.14 Υλοποίηση κλάσης λάµπα σε Java για µια υλοποίηση. Σηµειώστε ότι η αναπαράσταση µπορεί να αλλάξει, πχ αντί για Εικόνα 26 Το αντικείµενο λάµπα πραγµατικός αριθµός που παίρνει τιµές µεταξύ 0 και 1, µπορούµε να χρησιµοποιήσουµε έναν ακέραιο µε κάποιο εύρος [ 0..n). Παρότι η υ- λοποίηση των υπορουτινών που υλοποιούν τη «συµπεριφορά» της λάµπας, δηλαδή οι εντολές στις οποίες ανταποκρίνεται θα αλλάξει, κάποιος που χρησιµοποιεί αντικείµενα της κλάσης, δεν θα αντιληφθεί την αλλαγή. Αυτό επιτυγχάνεται µε την ενθυλάκωση. Αφού φτιάξουµε την κλάση Lampa που αντιστοιχεί στο «πρότυπο» ή την προδιαγραφή, το επόµενο βήµα είναι να παράγουµε ένα ή περισσότερα «στιγµιότυπα» (instances) αντικειµένων, που αντιστοιχούν σε συγκεκριµένες λά- µπες του καταστήµατος. Πρέπει σε αυτό το σηµείο να κατανοείτε τη διαφορά ανάµεσα σε µια κλάση (ορίζει τις ιδιότητες και τις λειτουργίες κάθε αντικειµένου της κλάσης) και στα αντικείµενα που έχουν κατασκευαστεί µε βάση την κλάση. Ας υποθέσουµε ότι µερικές λάµπες µπορούν µόνο να ανάβουν και να σβήνουν κι όχι να αυξοµειώνουν τη ένταση του φωτισµού, ενώ σε κάποιες άλλες µπορούµε να αλλάξουµε το χρώµα. Τότε µπορούµε να ορίσουµε άλλες κατηγορίες ή κλάσεις που είναι κατά βάση λάµπες, αλλά τροποποιούν / επεκτείνουν τη συµπεριφορά της «βασικής» λάµπας. Αν οι λάµπες έχουν διάφορα χρώµατα, τότε πρέπει να συµπεριλάβουµε στις ιδιότητές τους το χρώµα. Στην περίπτωση που το χρώµα τους είναι σταθερό, θα επιτρέπουµε να ορίζεται µόνο κατά την κατασκευή της κάθε λάµπας και δεν θα υπάρχει δυνατότητα αλλαγής του αργότερα. Αντίθετα, αν η λάµπα µπορεί να αλλάζει χρωµατισµούς, τότε θα πρέπει να παράσχουµε επιπρόσθετα µια λειτουργία που θα θέτει το τρέχον χρώµα της λάµπας στο αντίστοιχο αντικείµενο. Τα βήµατα που ακολουθούµε για να σχεδιάσουµε τα αντικείµενα είναι ως εξής. (1) Ξεκινούµε επιλέγοντας τις οντότητες του προβλήµατος που θα απεικονιστούν ως αντικείµενα. (2) Ορίζουµε µοντέλα αυτών των οντοτήτων όπου περιλαµβάνονται οι ιδιότητες και οι λειτουργίες τους. Προσπαθούµε να κάνουµε αυτά τα µοντέλα να προσοµοιάζουν όσο το 2 Βέβαια στη Java, σχεδόν όλα είναι αντικείµενα. Για λόγους επιδόσεων, οι βασικοί τύποι δεδοµένων (αριθµοί, χαρακτήρες) δεν είναι αντικείµενα, εκτός αν ο προγραµµατιστής χρησιµοποιήσει τις κλάσεις περιτυλίγµατος (wrapper classes) Integer, Long, κτλ. 3 Μια οπτική γωνία που µπορεί κάποιος να δει τα προγράµµατα είναι ως κατασκευές που εκτελούνται πάνω σε γενικής χρήσης υπολογιστικές µηχανές και διαµορφώνουν (εξειδικεύουν) τη συµπεριφορά τους, ώστε να λύνουν κάποιο πρόβληµα. Το πρόγραµµα «σκεπάζει» τις λεπτοµέρειες της εσωτερικής του λειτουργίας, καθώς και της συσκευής πάνω στην οποία εκτελείται και την «µεταµφιέζει» σε µια συσκευή που λύνει το πρόβληµα, δηλαδή αποδέχεται εισόδους κατά τις προδιαγραφές και παράγει τις νόµιµες εξόδους.

3 11/3/2006 Ι. Γαβιώτης - Τεχνολογίες & Μεθοδολογίες Προγραµµατισµού II Σελίδα 21 δυνατόν πιστότερα τις οντότητες του προβλήµατος. (3) Κατασκευάζουµε στιγµιότυπα των µοντέλων και εφαρµόζουµε λειτουργίες επί αυτών. Ακόµη κι αν κάποιος προγραµµατίζει ακολουθώντας πιστά το µοντέλο του αντικειµενοστρεφούς προγραµµατισµού, όταν υλοποιεί την εσωτερική οργάνωση των αντικειµένων θα χρησιµοποιήσει τεχνικές δοµηµένου προγραµµατισµού, πχ την οργάνωση του κώδικα σε µπλοκ εντολών, την κλήση σε υπορουτίνες, κλπ. Άρα τελικά οι δύο τεχνικές δεν είναι ξένες ή εχθρικές αντίθετα, συνδυάζονται αρµονικά όποτε χρειάζεται. 2.3 Μειονεκτήµατα του Ο-Ο προγραµµατισµού Ασαφείς έννοιες και δυσνόητοι όροι. Επίσης, χρησιµοποιούνται διαφορετικοί όροι από τους συνηθισµένους των διαδικαστικών γλωσσών προγραµµατισµού. ιαφορετική θεώρηση. Αρκετοί έχουν συνηθίσει την προσέγγιση του δο- µηµένου προγραµµατισµού και βρίσκουν πολύ διαφορετική την αντικει- µενοστρεφή προσέγγιση. Έλλειψη επιδόσεων. Ε- κτός από τη διερµηνεία στην ιδεατή µηχανή, υ- Εικόνα 27 Έννοιες αντικειµενοστρεφούς και δοµηµένου προγραµµατισµού πάρχουν εγγενείς αιτίες που προκαλούν αργά προγράµµατα: η δυναµική σύνδεση των µηνυµάτων µε τις µεθόδους, η δυναµική εκχώρηση µνήµης, κά. 2.4 Αντικείµενο = δεδοµένα + συµπεριφορά σε ενθυλάκωση Η κλάση (class) είναι ένα περίγραµµα ή ένα προσχέδιο για το πώς θα λειτουργεί και τι πληροφορίες ή ιδιότητες θα περιλαµβάνει ένα αντικείµενο. Αυτό το «καλούπι» χρησιµοποιείται για να παράγει αντικείµενα (objects). Το κάθε αντικείµενο έχει µια µοναδική ταυτότητα για να ξεχωρίζει από τα «αδέλφια» του. Στην απλούστερη περίπτωση, µια κλάση µπορεί να ορίζει µόνον ιδιότητες και καθόλου συµπεριφορά για τα αντικείµενα που παράγει, δηλαδή να έχει µόνο µεταβλητές στιγµιότυπου. Τότε η κλάση λειτουργεί όπως οι τύποι δεδοµένων ο- ριζόµενοι από το χρήστη (user-defined data types) στις κλασικές γλώσσες προγραµµατισµού. Το σύνολο των ιδιοτήτων ενός αντικει- µένου, που είναι δηλωµένα στην ενότητα «µεταβλητές στιγµιότυπου» στην Εικόνα 28, αποτελούν την κατάστασή του. Ένα κλάσµα έχει ιδιότητες τον α- ριθµητή και τον παρονοµαστή του δείτε την κλάση Klasma στην ενότητα 2.15 Κλασµατικοί αριθµοί για µια υλοποίηση.. Παρατηρήστε ότι οι µεταβλητές στιγµιότυπου δηλώνονται σε επίπεδο κλάσης κι όχι µέσα σε κάποια µέθοδο. Αυτό το συναντούµε για πρώτη φορά µέχρι τώρα όλες οι µεταβλητές δηλώνονταν στο εσωτερικό µιας µεθόδου, πχ της main. Παρότι οι µεταβλητές στιγµιότυπου αρχικοποιούνται κατά τη δήλωσή τους σε προκαθορισµένη τιµή (µηδέν οι αριθµητικές, ψευδές οι λογικές), είναι ορθή Απόκρυψη πληροφορίας (information hiding) επιτυγχάνουµε περιορίζοντας την εµβέλεια των ιδιοτήτων στο εσωτερικό της κλάσης. Η δηµόσια διεπαφή (public interface) της κλάσης αποτελείται από ενέργειες στις οποίες µπορεί να ανταποκριθεί το αντικείµενο. Παράδειγµα: στο ραδιοκασετόφωνο αυτοκινήτου, η διεπαφή του αποτελείται από χειριστήρια και υποδοχές για κεpublic class SomeClass { // το όνοµα της κλάσης // µεταβλητές στιγµιότυπου /* εδώ δηλώνονται οι µεταβλητές που αντιστοιχούν στις ιδιότητες κάθε αντικειµένου */ // κατασκευαστές /* εδώ ορίζονται µία ή περισσότερες δηµόσιες συναρτήσεις µε τις οποίες κατασκευάζονται νέα αντικείµενα κυρίως αρχικοποιούν τις ιδιότητες */ // µέθοδοι ανάγνωσης get και εγγραφής set /* εδώ ορίζονται δηµόσιες συναρτήσεις getsomeproperty και setsomeproperty που επιτρέπουν την πρόσβαση και την αλλαγή στις τιµές ιδιοτήτων του αντικει- µένου */ /* εδώ ορίζονται άλλες δηµόσιες µέθοδοι που ορίζουν τη συµπεριφορά των αντικειµένων της κλάσης */ /* εδώ ορίζονται βοηθητικές µέθοδοι ιδιωτικής εµβέλειας που χρησιµοποιούνται από τις δηµόσιες µεθόδους */ //end class Εικόνα 28 Ένας σκελετός για τον ορισµό µιας κλάσης Java προγραµµατιστική τεχνική να τις αρχικοποιεί ο προγραµµατιστής πριν διαβάσει την τιµή τους. Κατ αντιδιαστολή οι τοπικές µεταβλητές απαιτούν αρχικοποίηση από τον προγραµµατιστή πριν να διαβαστεί η τιµή τους δεν αρχικοποιούνται αυτόµατα από το σύστηµα.

4 Σελίδα 22 Ι. Γαβιώτης - Τεχνολογίες & Μεθοδολογίες Προγραµµατισµού II 11/3/2006 ραία, ηχεία, κτλ που γνωρίζεις τι κάνουν ή πώς συνδέονται, χωρίς να ξέρεις πώς λειτουργούν. Μπορούµε να δηλώσουµε κάποιες ιδιότητες ως ιδιωτικές και κάποιες άλλες ως δηµόσιες και το ίδιο ισχύει και για τις µεθόδους. Μια αρχή που ακολουθούν οι στρατιωτικοί είναι ότι η διάχυση της πληροφορίας πρέπει να γίνεται on-a-need-toknow-basis αυτό σηµαίνει ότι καθένας πρέπει να γνωρίζει µόνον ότι είναι απαραίτητο για να εκτελέσει σωστά την αποστολή του. Η αρχή αυτή εφαρµόζεται στον προγραµµατισµό µε τον περιορισµό της εµβέλειας όσο το δυνατόν περισσότερων ονοµάτων µέσα στην κλάση. Όταν ένα όνοµα (µεταβλητής ή µεθόδου) δηλώνεται private, η εµβέλειά του περιορίζεται στο εσωτερικό της κλάσης. Αντίθετα όταν δηλώνεται public, είναι ορατό και προσπελάσιµο από παντού. Όταν εισάγουµε την κληρονοµικότητα, θα δούµε ότι η Java υποστηρίζει ακόµα µια δήλωση εµβέλειας, την protected. Αν περιορίσουµε την εµβέλεια των µεταβλητών στιγµιότυπου δηλώνοντάς τις ως private, είναι απαραίτητο να χρησιµοποιήσουµε ειδικές µεθόδους ανάγνωσης και εγγραφής µέσω των οποίων θα προσπελαύνονται. 2.5 Κατασκευαστές και καταστροφείς αντικειµένων Είναι οι ειδικές εκείνες µέθοδοι που αναλαµβάνουν τη δηµιουργία νέων αντικειµένων και την καταστροφή των υπαρχόντων. Οι κατασκευαστές (constructors) στην Java πρέπει να έχουν ίδιο όνοµα µε την κλάση της οποίας αντικείµενα κατασκευάζουν και δεν επιστρέφουν τιµή. Ακόµη κι αν δεν γράψουµε κώδικα για κανένα κατασκευαστή, η Java από µόνη της φτιάχνει έναν «αόρατο» κατασκευαστή δίχως παραµέτρους που αρχικοποιεί τις µεταβλητές στιγµιότυπου στις εξ ορισµού τιµές τους. Πριν να κατασκευάσουµε ένα αντικείµενο πρέπει να δηλώσουµε µια µεταβλητή που θα «δείχνει» αυτό το αντικείµενο και µέσω της οποίας θα προσπελαύνονται οι ιδιότητες και οι µέθοδοί του. Για παράδειγµα, η εντολή Light lampasaloniou = new Light(0); δηλώνει τη µεταβλητή lampasaloniou να µπορεί να δεχθεί ως τιµή αντικείµενα τύπου Light και έπειτα κατασκευάζει ένα τέτοιο αντικείµενο µε τη δεσµευµένη λέξη new και κλήση του κατασκευαστή Light(0). Σηµειώνεται ότι το πρώτο Light είναι δήλωση της κλάσης, ενώ το Light(0) είναι κλήση µιας µεθόδου του κατασκευαστή. Τιµή της µεταβλητής lampasaloniou είναι ένα προσδιοριστικό του συγκεκριµένου αντικειµένου. Τυπώνοντάς την βγαίνει κάτι σαν Light@2a9835. Βέβαια δεν έχει νόηµα να τυπώσουµε την τιµή µιας µεταβλητής αντικειµένου - απλώς µέσω αυτής καλούνται οι µέθοδοι του αντικειµένου στο οποίο «στοχεύει» και ανακαλούνται οι δηµόσιες ιδιότητές του. Για να γίνει πλήρως κατανοητή η διάκριση ανάµεσα σε ένα αντικείµενο και σε µια µεταβλητή που δείχνει προς αυτό, δείτε το διπλανό κώδικα. Οι δύο µεταβλητές lamp και samelamp αναφέρονται στο ίδιο αντικείµενο γι αυτό λέγονται ψευδώνυµα (aliases). Οι καταστροφείς (destructors) αντικειµένων, εάν υπάρχουν, πρέπει να έχουν το όνοµα µεθόδου finalize. Η βασικότερη λειτουργία τους είναι η απόδοση πίσω στο σύστηµα των πόρων που απελευθερώνονται από την διαγραφή του αντικειµένου και η συντήρηση διαφόρων δοµών δεδοµένων ή µετρητών στιγµιότυπων, πχ µπορεί ο προγραµµατιστής να διατηρεί το πλήθος των αντικειµένων µιας κλάσης. είτε το παράδειγµα 2.15 Κλασµατικοί αριθµοί. ιαχείριση µνήµης Στο διπλανό παράδειγµα, το αντικείµενο Light που δηµιουργείται στη γραµµή Γ και προσπελαύνεται µέσω της µεταβλητής h, προκαλεί αδυναµία προσπέλασης του πρώτου αντικειµένου που είχε κατασκευαστεί στη γραµµή Α. Έτσι το αντικείµενο αυτό καταλαµβάνει πόρους (µνήµη), αλλά είναι αδύνατο να χρησιµοποιηθεί πλέον στο πρόγραµµα, αφού δεν υπάρχει κάποια µεταβλητή που να οδηγεί σε αυτό. Συλλογή απορριµµάτων (garbage collection) είναι ο µηχανισµός αυτόµατης αποδέσµευσης της µνήµης, όταν πια δεν χρησιµοποιείται το αντικείµενο που την καταλαµβάνει. Υλοποιείται από µια νηµατική διεργασία (thread process) που τρέχει στο παρασκήνιο (background) µε χαµηλή προτεραιότητα. Εάν θελήσουµε να επιβάλλουµε εκτέλεση της συλλογής απορριµµάτων σε συγκεκριµένη στιγµή, η εντολή είναι System.gc(). Συλλογή απορριµµάτων έχει υλοποιηθεί από παλιά (πχ στις γλώσσες Lisp, Smalltalk), αλλά σε σύγχρονες γλώσσες τη διαχείριση µνήµης την αναλαµβάνει ο ίδιος ο προγραµµατιστής, γιατί καταναλώνει πολύ χρόνο όταν γίνεται αυτόµατα. Η Java υποστηρίζει συλλογή απορριµµάτων, αλλά αρκετοί µεταγλωττιστές έχουν προβλήµατα στην υ- λοποίηση. ιαρροή µνήµης (memory leak) έχουµε όταν δεν απελευθερώνονται τµήµατα µνήµης που δεν είναι πλέον προσπελάσιµα από κανέναν. Μπορεί να οδηγήσει σε µείωση της διαθέσιµης µνήµης ή και εξάντλησή της. 2.6 Μέθοδοι ανάγνωσης και εγγραφής Light lamp, samelamp; //δηλώνει δύο µεταβλητές lamp = new Light(0); //φτιάχνει ένα αντικείµενο //και θέτει τη µεταβλητή lamp να δείχνει σε αυτό samelamp = lamp; //δεν δηµιουργείται άλλο αντικείµενο Εικόνα 29 Ψευδώνυµα Light h; Light k; h = new Light(0); //Α k = new Light(0); //Β /*... */ h = new Light(1); //Γ k = null; Εικόνα 30 Μη προσπελάσιµο αντικείµενο

5 11/3/2006 Ι. Γαβιώτης - Τεχνολογίες & Μεθοδολογίες Προγραµµατισµού II Σελίδα 23 Οι µέθοδοι ανάγνωσης (reader ή getter ή accessor) είναι δηµόσιες µέθοδοι που συνήθως το όνοµά τους αρχίζει από get, δεν παίρνουν κάποια παράµετρο ως είσοδο και µόνον επιστρέφουν µια τιµή. Καθιστούν δυνατή την ανάγνωση της τιµής των µεταβλητών στιγµιότυπου (instance variables) που για λόγους απόκρυψης πληροφορίας (information hiding) είναι συνήθως ορισµένες ως ιδιωτικές µέσα στην κλάση. Οι µέθοδοι εγγραφής (writer ή setter ή mutator) είναι δηµόσιες µέθοδοι που συνήθως το όνοµά τους αρχίζει από set, παίρνουν παραµέτρους τις τιµές που ε- πιθυµούµε να θέσουµε σε µεταβλητές στιγµιότυπου και δεν επιστρέφουν τίποτε 4. Χρησιµοποιούνται για να αλλάξουν την τιµή των ιδιωτικών µεταβλητών µιας κλάσης, καθώς η απευθείας ανάθεση σε αυτές µιας τιµής δεν είναι δυνατή, όταν γίνεται έξω από την κλάση. Στις µεθόδους εγγραφής συχνά συµπεριλαµβάνεται κώδικας που ελέγχει ότι οι τιµές που δίνονται στις ιδιότητες του αντικειµένου αντιστοιχούν σε µια «νόµιµη» ή συνεπή κατάσταση για το αντικείµενο. Για παράδειγµα στην Εικόνα 31, το κλάσµα αποκλείεται να αποκτήσει µηδενικό παρονοµαστή. Απαγορεύοντας απευθείας προσπέλαση στις µεταβλητές στιγµιότυπου µε τη δήλωσή τους ως private, επιβάλλουµε ότι ο µόνος τρόπος ορισµού / αλλαγής τους είναι µέσω των κατασκευαστών και των µεθόδων εγγραφής στις οποίες υπάρχουν έλεγχοι ότι τα στιγµιότυπα της κλάσης µας δεν τίθενται σε «παράνοµη» κατάσταση. Αυτό µας γλιτώνει από πρόσθετους ελέγχους αργότερα στη ζωή του στιγµιότυπου, πχ δεν χρειάζεται να ελέγξουµε για διαίρεση δια 0, όταν υπολογίζουµε την τιµή του κλάσµατος public float computeratio() { return (float) arithmitis / paronomastis; Τυπικά, σε µια κλάση που ορίζει έναν τύπο αντικειµένων, θα συναντήσουµε (α) µεταβλητές στιγµιότυπου που αναπαριστούν τις ιδιότητες, (β) κατασκευαστές, (γ) µεθόδους ανάγνωσης / εγγραφής, (δ) µεθόδους που υλοποιούν τη συ- µπεριφορά του αντικειµένου. Επίσης, συνηθίζεται να υπάρχει µια µέθοδος tostring (δείτε Εικόνα 31) που επιστρέφει κάποιας µορφής µετατροπή του αντικειµένου σε συµβολοσειρά, ώστε να µπορεί να εκτυπωθεί. Για παράδειγµα, Klasma x = new Klasma(3, 2); System.out.println(x.toString()); //τυπώνει 3.0/2.0, όπως αναµενόταν System.out.println(x); //πάλι τυπώνει 3.0/2.0 αφού καλεί εµµέσως την tostring() Παράδειγµα: ζητείται η κατασκευή ενός ηλεκτρονικού καταστήµατος µέσω του οποίου οι πελάτες επιλέγουν προϊόντα από έναν κατάλογο, υποβάλουν τις παραγγελίες τους και τις εξοφλούν µε πιστωτική κάρτα. Κατασκευάζουµε κλάσεις για τα προϊόντα, τους πελάτες και τις παραγγελίες. Η κλάση για το προϊόν µπορεί να ενσωµατώνει χαρακτηριστικά όπως κωδικός, περιγραφή, τιµή, διαθέσιµη ποσότητα και µεθόδους δηµιουργίας, ενηµέρωσης, κλπ. 2.7 Ροή εκτέλεσης //µεταβλητές στιγµιοτύπου private int arithmitis; //αριθµητής private int paronomastis; //παρονοµαστής //τυπική µέθοδος ανάγνωσης public int getarithmitis () { return this.arithmitis; //τυπική µέθοδος εγγραφής public void setfraction(int arithmitis, int paronomastis) { this.arithmitis = arithmitis; this.paronomastis = ((paronomastis==0)?1: paronomastis); //τυπική µέθοδος εκτύπωσης public String tostring() { return arithmitis + / + paronomastis; Εικόνα 31 είγµατα µεθόδων get, set, tostring Κατά το αντικειµενοστρεφές µοντέλο, αντί κλήσεων υπορουτινών, η εκτέλεση του προγράµµατος εκτυλίσσεται µε α- νταλλαγή µηνυµάτων (messages) µεταξύ αντικειµένων. Η σύνταξη των κλήσεων είναι ως εξής: παραλήπτης.µέθοδος() ή αντικείµενο.ρήµα(), πχ παράθυρο.κλείσε() ή λάµπασαλονιού.άναψε(). Οι παρενθέσεις χρειάζονται για να διαφοροποιείται η ανταλλαγή µηνυµάτων από την αναφορά σε ιδιότητες αντικειµένων και περικλείουν τη λίστα των πραγµατικών παραµέτρων (actual parameters). Τα µηνύµατα τα συλλαµβάνει το αντικείµενο - παραλήπτης και εκτελεί την οµώνυµη µέθοδο. Ο παραλήπτης του µηνύµατος δεν καθορίζεται κατά τη µεταγλώττιση, γιατί κατά τη µεταγλώττιση ο παραλήπτης δεν υφίσταται ως αντικείµενο και επειδή η µέθοδος µπορεί να είναι υπερφορτωµένη, άρα ο µεταγλωττιστής δεν γνωρίζει ποια από τις εκδοχές της να αντιστοιχίσει στην κλήση. Μόνο κατά την εκτέλεση (runtime) συσχετίζεται η αποστολή του µηνύµατος µε τον παραλήπτη. Αυτό λέγεται δυναµική ή καθυστερηµένη σύνδεση (dynamic / late binding). Μπορούµε να αναφερόµαστε στις ιδιότητες του αντικειµένου µε τη σύνταξη object.property πχ παράθυροπρόσοψης.ύψος, ή λάµπασαλονιού.χρώµα υπό την προϋπόθεση ότι έχουν δηµόσια εµβέλεια. Ο κύκλος λειτουργίας ενός αντικειµενοστρεφούς συστήµατος περιλαµβάνει τα βήµατα: (α) εκκίνηση εφαρµογής, (β) δηµιουργία αντικειµένων, (γ) παραµονή σε αναµονή γεγονότος, (δ) αναγνώριση γεγονότος, (ε) αναζήτηση αντικειµένου παραλήπτη, (στ) εκτέλεση χειριστή γεγονότος, (ζ) περαιτέρω γεγονότα ή αναµονή. 4 Μερικές φορές είναι χρήσιµο να επιστρέφουν µια τιµή που υποδηλώνει ότι η εγγραφή της τιµής έγινε κανονικά στην ιδιότητα του αντικειµένου.

6 Σελίδα 24 Ι. Γαβιώτης - Τεχνολογίες & Μεθοδολογίες Προγραµµατισµού II 11/3/ Υπερφόρτωση / Πολυµορφισµός Στην ίδια κλάση µπορούµε να ορίσουµε µεθόδους µε το ίδιο όνοµα, αρκεί να διαφέρουν στις παραµέτρους τους κατά το πλήθος, τον τύπο ή απλώς τη σειρά. Τότε το όνοµα της µεθόδου είναι υπερφορτωµένο (overloaded method). Κατά την κλήση του ονόµατος, το περιβάλλον εκτέλεσης θα εκτελέσει την µέθοδο της οποίας η λίστα των τυπικών παραµέτρων ταιριάζει µε τις πραγµατικές παραµέτρους. Συνήθως υπερφορτωµένες µέθοδοι είναι οι κατασκευαστές, δηλαδή οι µέθοδοι µε τις οποίες αρχικοποιείται η κατάσταση των νεοδηµιουργηθέντων αντικειµένων. Οι υπερφορτωµένες µέθοδοι συνήθως εκτελούν παρόµοιες λειτουργίες. Προκύπτει ότι το όνοµα µιας µεθόδου δεν είναι αρκετό για τον πλήρη προσδιορισµό της χρειάζεται και η λίστα των παραµέτρων της µε τους τύπους τους. Όλα αυτά ονοµάζονται υπογραφή (signature) της υπερφορτωµένης µεθόδου. Το σώµα της µεθόδου που έχει κληθεί καθορίζεται από το αντικείµενο παραλήπτη κατά τη διάρκεια της εκτέλεσης κι όχι κατά τη µετάφραση (καθυστερηµένη σύνδεση, late binding). Το χαρακτηριστικό αυτό βελτιώνει την προσαρµοστικότητα και αυξάνει την επαναχρησιµοποίηση, αλλά είναι πηγή σφαλµάτων και καθυστέρησης στην εκτέλεση. Η λειτουργία που επιτελεί ένας πολυµορφικός τελεστής εξαρτάται από το αντικείµενο στο οποίο εφαρµόζεται. Σε αντίθεση µε τη C++, η Java δεν επιτρέπει στον προγραµµατιστή να υπερφορτώσει τελεστές, παρότι ορισµένοι τελεστές της είναι υπερφορτωµένοι από τη γλώσσα, όπως το Κλήση µεθόδων Για την κλήση µιας µεθόδου, η συνήθης σύνταξη είναι αντικείµενο.µέθοδος( λίσταπραγµατικώνπαραµέτρων ) που εφαρµόζει τη συγκεκριµένη µέθοδο πάνω σε ένα αντικείµενο, πχ textarea.settext("abc"). Η σύνταξη αυτή ισχύει για τις µεθόδους στιγµιότυπων. Ωστόσο, σε µερικές περιπτώσεις συναντούµε τη σύνταξη Κλάση.µέθοδος( λίσταπραγµατικώνπαραµέτρων ) που εφαρµόζει τη µέθοδο στην κλάση, πχ Integer.parseInt(sBuffer), ή Math.sqrt(16). Σε αυτή την περίπτωση, κατά τον ορισµό της στην κλάση, η µέθοδος έχει οριστεί ως static. Στατικές µέθοδοι µπορούν να κληθούν ακόµη κι αν δεν έχουν δηµιουργηθεί στιγµιότυπα της κλάσης. Για να χρησιµοποιήσουµε µια µέθοδο πχ από µια βιβλιοθήκη, δεν αρκεί να γνωρίζουµε το όνοµά της - πρέπει να γνωρίζουµε την «υπογραφή» της, δηλαδή την επικεφαλίδα του ορισµού της: αν είναι στατική ή όχι, τι τύπο δεδοµένων επιστρέφει, το πλήθος και τον τύπο των παραµέτρων της. Πχ η µέθοδος στιγµιότυπου που µετατρέπει µια συµβολοσειρά σε κεφαλαία συντάσσεται sname.touppercase() και όχι String.toUpperCase(sName). Τα διαγράµµατα κλάσεων (class diagrams) είναι µια εποπτική απεικόνιση των ιδιοτήτων και των µεθόδων µιας κλάσης. Για κάθε κλάση αναγράφονται διαδοχικά: (α) όνοµα, (β) ιδιότητες και (γ) µέθοδοι. Η εµβέλεια του κάθε ονόµατος υποδηλώνεται µε + όταν είναι δηµόσια (public) και µε όταν είναι ιδιωτική (private). Στην Εικόνα 32 φαίνεται το διάγραµµα της κλάσης Klasma - ο κώδικάς της βρίσκεται στην ενότητα Οι παράµετροι πάντοτε εγκλείονται σε παρενθέσεις και διαχωρίζονται µε κόµµα. Οι παράµετροι στην κλήση µιας µεθόδου ονοµάζονται πραγµατικές παράµετροι (actual parameters). Οι παράµετροι στην επικεφαλίδα του ορισµού της µεθόδου ονο- µάζονται τυπικές παράµετροι (formal parameters). Κατά την κλήση µιας µεθόδου αντιστοιχίζονται οι πραγµατικές µε τις τυπικές παραµέτρους, άρα το πλήθος τους πρέπει να είναι ί- διο η Java δεν υποστηρίζει άµεσα προαιρετικές (optional) παραµέτρους, όπως πχ η Visual Basic. Μπορούµε ωστόσο να επιτύχουµε το ίδιο αποτέλεσµα υπερφορτώνοντας τη µέθοδο, δηλ. ορίζοντάς την πολλές φορές µε το ίδιο όνοµα µε διαφορετικό α- ριθµό παραµέτρων. Τα ονόµατα που δηλώνονται σε επίπεδο κλάσης χρησιµοποιώντας Εικόνα 32 ιάγραµµα κλάσης τη δεσµευµένη λέξη static δεν αναπαράγονται κάθε φορά που δηµιουργείται ένα αντικείµενο της κλάσης και προσπελαύνονται µε αναφορά στο όνοµα της κλάσης όχι το όνοµα ε- νός συγκεκριµένου στιγµιότυπου της κλάσης. Συνήθως δηλώνονται σταθερές κλάσης, πχ public class Euro { public static final CONVERSION_RATE = ; στην οποία αναφερόµαστε µε Euro.CONVERSION_RATE. Τα υπάρχοντα πακέτα της Java ορίζουν αρκετές στατικές σταθερές, όπως Math.PI. Σε µερικές περιπτώσεις χρειάζεται να δηµιουργήσουµε ένα και µοναδικό στιγµιότυπο µιας κλάσης. Μπορεί να αναρω-

7 11/3/2006 Ι. Γαβιώτης - Τεχνολογίες & Μεθοδολογίες Προγραµµατισµού II Σελίδα 25 τηθείτε αν αξίζει να κατασκευάσουµε ένα αντικείµενο και µεθόδους στιγµιότυπου γι αυτό, ή είναι καλύτερο να χρησιµοποιήσουµε στατικές µεταβλητές και µεθόδους. Η επικρατέστερη άποψη είναι να αποφεύγονται οι στατικές µέθοδοι, διότι: Παραβιάζουν το αντικειµενοστρεφές µοντέλο σχεδίασης. Στο µέλλον µπορεί να απαιτηθεί η δηµιουργία και άλλων στιγµιότυπων. Το όνοµα µιας µεταβλητής βασικού τύπου (πχ int, double) λειτουργεί σαν µια ετικέτα για µια περιοχή µνήµης όπου αποθηκεύεται η τιµή της µεταβλητής. Αντίθετα, το όνοµα µιας µεταβλητής αντικειµένου (πχ String) είναι µια ετικέτα για µια περιοχή µνήµης που βρίσκεται η διεύθυνση του στιγµιότυπου Πέρασµα παραµέτρων Στη Java τo πέρασµα παραµέτρων (parameter passing) γίνεται µε τιµή (call by value). Ωστόσο, ο µηχανισµός λειτουργεί διαφορετικά, ανάλογα µε το αν η παράµετρος είναι µια απλή µεταβλητή κάποιου από public static void main(string args[]){ public class ParameterPassing { τους βασικούς τύπους δεδοµένων, ή αν είναι double a = 9.5; //βασικός τύπος δεδοµένων αντικείµενο. int b[] = {4, 2, 7; //πίνακας Για τους βασικούς τύπους δεδοµένων System.out.println(a + " " + b[0]); //9.5 4 (int, float, double, κλπ), οι πραγµατικές και οι τυπικές παράµετροι είναι διαφο- pass2(a, b); //πραγµατικές παράµετροι είναι τα a, b ρετικές µεταβλητές και δεν µοιράζονται System.out.println(a + " " + b[0]); //9.5-4 τον ίδιο χώρο µνήµης. Κατά την κλήση της µεθόδου, εκχωρείται µνήµη για τις τυπικές παραµέτρους, η τιµή των πραγµατικών // τυπικές παράµετροι είναι τα x,y ανατίθεται στην αντίστοιχη τυπική παρά- private static void pass2(double x, int[] y) { µετρο. Κατά συνέπεια, ό,τι αλλαγές κι αν x = -x; γίνουν στις τιµές των τυπικών παραµέτρων στο εσωτερικό της µεθόδου δεν α- System.out.println(x + " " + y[0]); // y[0] = -y[0]; ντανακλώνται στις πραγµατικές παραµέτρους. Κατά την επιστροφή από την µέ- θοδο, ο χώρος των τυπικών παραµέτρων επιστρέφεται στον διαθέσιµο χώρο του Εικόνα 33 Πέρασµα απλής µεταβλητής και αντικειµένου συστήµατος. Εξηγήστε γιατί η µέθοδος swap στην Εικόνα 34 αποτυγχάνει να αντιµεταθέσει τις τιµές των πραγµατικών παρα- µέτρων. Όταν η παράµετρος είναι αντικείµενο (πχ πίνακας, συµβολοσειρά, ή άλλο αντικείµενο κλάσης που έχει ορίσει ο χρήστης) µεταβιβάζεται η αναφορά του. Πάλι δηµιουργείται αντίγραφο της αναφοράς, αλλά όχι αντίγραφο του αντικειµένου προς το οποίο δείχνει η αναφορά. Έτσι ε- ξοικονοµείται µνήµη και χρόνος, καθώς δεν γίνεται εκχώρηση / αποδέσµευση µνήµης, ούτε και αντιγραφή τι- µών για ολόκληρο το αντικείµενο. Εικόνα 34 Πέρασµα µε τιµή Για λόγους απλότητας και περιορισµού των παρενεργειών, η Java υποστηρίζει αποκλειστικά πέρασµα παραµέτρων µε τιµή 5. Άρα ο καλών µπορεί να τροφοδοτεί την καλούµενη µέθοδο µε τιµές που η µέθοδος θα χρησιµοποιεί στο εσωτερικό της για να διαµορφώνει τη συµπεριφορά της. Πώς όµως επιστρέφει µια µέθοδος τα αποτελέσµατα που υπολόγισε πίσω σε αυτόν που την κάλεσε, ειδικά όταν αυτά τα αποτελέσµατα είναι βασικού τύπου δεδοµένων; Αν απαιτείται να επιστραφεί ένα µόνο αποτέλεσµα, τα πράγµατα είναι εύκολα: δηλώνουµε στην επικεφαλίδα τον τύπο του αποτελέσµατος που θέλουµε να επιστραφεί και επιστρέφουµε την τιµή του µε µια εντολή return. Αν χρειάζεται να επιστρέψουµε πολλά αποτελέσµατα, και µε δεδοµένο ότι δεν υποστηρίζεται επιστροφή αποτελεσµάτων µέσω των παραµέτρων, το µόνο που µπορούµε να κάνουµε είναι να δηλώσουµε δηµόσιες µεταβλητές, οπότε επιτρέπεται η πρόσβαση και η αλλαγή τους από την µέθοδο (και από οπουδήποτε αλλού). Αυτό είναι µια αναγκαία, αλλά άσχηµη και επικίνδυνη πρακτική διότι δεν είναι εύκολα ορατές οι παρενέργειες που προκαλεί η µέθοδος στο περιβάλλον της. Μια εναλλακτική λύση είναι να «πακετάρουµε» τις τιµές που θέλουµε να επιστρέψουµε σε κάποιο αντικείµενο Σύνθεση... int a = 1, c = 3; swap (a, c); //κλήση... // παραµένουν a = 1 και c = 3 public static void swap(int x, int y) { int temp = x; x = y; y = temp; Σύνθεση (composition) είναι ένας µηχανισµός µοντελοποίησης όπου ορίζουµε µια κλάση µε συστατικά που είναι ορισµένα από άλλες κλάσεις. Για παράδειγµα, ένας Φοιτητής ορίζεται να έχει όνοµα που είναι ένα αντικείµενο String και ηµεροµηνίαεγγραφής που είναι µια Date, δηλαδή αντικείµενο µιας άλλης κλάσης (από τη βιβλιοθήκη java.util.date). 5 Σε άλλες γλώσσες προγραµµατισµού, ο προγραµµατιστής δηλώνει τον τρόπο περάσµατος παραµέτρων στη λίστα των παραµέτρων που βρίσκεται στην επικεφαλίδα της υπορουτίνας, πχ στη Visual Basic δηλώνει ByVal ή ByRef.

8 Σελίδα 26 Ι. Γαβιώτης - Τεχνολογίες & Μεθοδολογίες Προγραµµατισµού II 11/3/2006 Μέχρι τώρα έχουµε δει αναδροµικές µεθόδους, δηλαδή µεθόδους που καλούν τον εαυτό τους υπό προϋποθέσεις (αν δεν υπάρχει κάποια προϋπόθεση, τότε η αναδροµικές κλήσεις θα συνεχιζόταν µέχρι να εξαντληθούν οι διαθέσιµη µνήµη του υπολογιστή). Ωστόσο, µπορούµε να ορίσουµε και αναδροµικές κλάσεις. είτε ένα παράδειγµα στην Εικόνα 35, όπου για κάθε άτοµο ορίζουµε διάφορες ιδιότητες, µεταξύ των οποίων και η µητέρα και ο πατέρας του, που είναι αντικείµενα άτοµο. Η δυνατότητα αναδροµικής σύνθεσης στις κλάσεις είναι πολύ χρήσιµη για να ορίζουµε «αλυσίδες» κόµβων που περιέχουν πληροφορία. Στην απλούστερη περίπτωση, κάθε κόµβος της αλυσίδας περιέχει κάποια πληροφορία και ένα σύνδεσµο προς τον επό- µενο κόµβο στην αλυσίδα. Περισσότερα γι αυτή την τεχνική στο µάθηµα επιλογής «Αλγόριθµοι & οµές εδοµένων» Κληρονοµικότητα class Person { String name; Person mother; Person father; Εικόνα 35 Αναδροµικές κλάσεις Κληρονοµικότητα (inheritance) είναι ένας µηχανισµός επαναχρησιµοποίησης που επιτρέπει σε νεότερες κλάσεις να επεκτείνουν υπάρχουσες κλάσεις, όσον αφορά τα δεδοµένα τους, όσο και τη συµπεριφορά τους. Η κληρονοµικότητα µπορεί να συνεχίζεται σε αρκετές γενιές. Οι κλάσεις απόγονοι (υποκλάσεις ή παράγωγες κλάσεις, subclasses ή derived classes) επιτρέπεται όχι µόνο να επεκτείνουν, αλλά και να τροποποιούν την υπάρχουσα συµπεριφορά των προγόνων τους (υπέρ-κλάσεις, super classes). Παράδειγµα: Τόσο οι προπτυχιακοί όσο και οι µεταπτυχιακοί φοιτητές µοιράζονται ορισµένες κοινές ιδιότητες, πχ ηµεροµηνία εγγραφής και λειτουργίες, πχ δηλώνουν µαθήµατα που πρέπει να περάσουν. Οι µεταπτυχιακοί ωστόσο έχουν την επιπρόσθετη βαθµό πτυχίου. Ορίζουµε µια κλάση «Φοιτητές» που έχει τις κοινές ιδιότητες, όπως ο- νοµατεπώνυµο, ηµεροµηνία εγγραφής, και µεθόδους δήλωσημαθήµατος, κλπ. Ορίζουµε τις κλάσεις «ΜεταπτυχιακόςΦοιτητής» και «ΠροπτυχιακόςΦοιτητής» να κληρονοµούν την κλάση «Φοιτητής» και να προσθέτουν τις ιδιότητες και τις µεθόδους που τους προσιδιάζουν και δεν είναι κοινές. Επίσης, µπορούν να επαναορίζουν την µέθοδο δήλωσημαθήµατος, υπερκαλύπτοντας τον ορισµό που έχει στην υπέρ-κλάση, καθώς οι µεταπτυχιακοί έχουν διαφορετική διαδικασία επιλογής µαθηµάτων από τους προπτυχιακούς. Απλή κληρονοµικότητα έχουµε όταν η υποκλάση βασίζεται Φοιτητής µόνον σε µια άλλη υπέρ-κλάση. Τέτοιου τύπου κληρονοµικότητα υποστηρίζει η Java µέσω της δεσµευµένης λέξης extends που συντάσσεται στην επικεφαλίδα της υποκλάσης και δηλώνει ΠροπτυχιακόςΦοιτητής ΜεταπτυχιακόςΦοιτητής το όνοµα της προγονικής κλάσης. Η απλή κληρονοµικότητα α- πεικονίζεται γραφικά ως ένα ανεστραµµένο δέντρο που στο πάνω µέρος του βρίσκεται η υπέρ-κλάση η οποία συνδέεται µε Υποψήφιος ιδάκτορας γραµµές µε τις υποκλάσεις της (δείτε Εικόνα 36). Μια υποκλάση µπορεί να (επανα)ορίζει µε διαφορετικό τύπο µια µεταβλητή στιγµιότυπου που είναι ήδη ορισµένη στην Εικόνα 36 Απεικόνιση κληρονοµικότητας υπέρ-κλάση της. Επίσης µια υποκλάση µπορεί να (επανα)ορίζει µια µέθοδο που είναι ήδη ορισµένη µε την ίδια ακριβώς υπογραφή στην υπέρ-κλάση της. Υποστήριξη κληρονοµικότητας από τη Java Για να αναφερθούµε στην προγονική κλάση όταν βρισκόµαστε στο σώµα της υποκλάσης, χρησιµοποιούµε τη λέξη super 6. Έχουµε δει τα προσδιοριστικά εµβέλειας public και private που επιτρέπουν / απαγορεύουν πρόσβαση έξω από την κλάση αντίστοιχα. Ενδιάµεσα, ένα όνοµα (µεταβλητή ή µέθοδος) δηλωµένο ως protected, είναι ορατό στις υποκλάσεις που κληρονοµούν την τρέχουσα κλάση και στις κλάσεις του ίδιου πακέτου στο οποίο είναι ορισµένο. Οι κατασκευαστές της υπέρ-κλάσης δεν κληρονοµούνται από τις υποκλάσεις της. Στη Java όλες οι κλάσεις κληρονοµούν άµεσα ή έµµεσα από την υπέρ-κλάση Object. Έτσι όταν θέλουµε να αναφερθούµε σε αντικείµενο του οποίου την κλάση δεν γνωρίζουµε δηλώνουµε την αναφορά του ως Object. είτε την ενότητα 2.16 Πολύφωτο για ένα παράδειγµα. Για να προσδιορίσουµε την κλάση ενός αντικείµενου που έχει χαρακτηριστεί ως Object, χρησιµοποιούµε τον τελεστή instanceof. Με το προσδιοριστικό final στην επικεφαλίδα µιας κλάσης απαγορεύουµε τη δηµιουργία υποκλάσεων που να κληρονοµούν από αυτή την κλάση. Έτσι δεν υπάρχει περίπτωση κάποιος να ορίσει κλάση που να κληρονοµεί την final και να αλλάζει την υλοποίηση κάποιων µεθόδων της ή να αποκτήσει προσπέλαση στα protected δεδοµένα / µεθόδους της (που µπορεί να τα έχει κληρονοµήσει από κάποια υπέρ-κλάση της). Ως final µπορεί να προσδιοριστεί και µια µέθοδος οπότε δεν µπορεί να οριστεί σε κάποια υποκλάση. Αν µια κλάση δηλωθεί ως public, τότε µπορεί να χρησιµοποιηθεί από οποιαδήποτε άλλη κλάση ακόµη και αν δεν ανήκουν στο ίδιο πακέτο (package). Υπενθυµίζεται ο κανόνας ότι µια public κλάση πρέπει να αποθηκεύεται σε οµώνυµο αρχείο µε την κατάληξη.java 7. Αν µια κλάση δεν είναι public, ονοµάζεται «φιλική» (friendly) και τότε µπορεί να χρησιµοποιηθεί µόνον από κάποια κλάση του ίδιου πακέτου. 6 Παράβαλε µε τη δεσµευµένη λέξη this µε την οποία αναφερόµαστε στο τρέχον αντικείµενο από το εσωτερικό της κλάσης του. 7 Στο ίδιο αρχείο µπορούν να συνυπάρχουν και άλλες κλάσεις αλλά αυτές δεν µπορούν να είναι public.

9 11/3/2006 Ι. Γαβιώτης - Τεχνολογίες & Μεθοδολογίες Προγραµµατισµού II Σελίδα 27 Με το προσδιοριστικό abstract στην επικεφαλίδα µιας κλάσης απαγορεύουµε τη δηµιουργία στιγµιότυπων της κλάσης. Και τότε τι την θέλουµε την κλάση, αφού δεν µπορούµε να κατασκευάσουµε αντικείµενά της; Οι abstract κλάσεις περιέχουν κάποιες κανονικές µεθόδους που περιλαµβάνουν κώδικα υλοποίησης και κάποιες abstract µεθόδους, που έχουν επικεφαλίδα, αλλά δεν περιέχουν κώδικα υλοποίησης. Υποκλάσεις που επεκτείνουν την abstract κλάση µπορούν να συµπληρώσουν την υλοποίηση των abstract µεθόδων της και βέβαια είναι δυνατόν να κατασκευαστούν στιγµιότυπα αυτών των υποκλάσεων. Γενικά χρησιµοποιούµε µια abstract κλάση για να οµαδοποιήσουµε κάποιες κοινές µεθόδους των υποκλάσεών της, οπότε αποφεύγουµε να επαναλαµβάνουµε τον κώδικα των κοινών µεθόδων σε καθεµιά υποκλάση. Κουίζ: γιατί είναι αντίφαση µια abstract µέθοδος να είναι και final; Γιατί µια κλάση δεν µπορεί να είναι abstract και static; Παράδειγµα: Ορίζουµε µια abstract υπέρ-κλάση Sxhma, αφού δεν έχει νόηµα να κατασκευάσουµε στιγµιότυπά της, επειδή είναι πολύ γενική και αφηρηµένη. Η Sxhma έχει την ιδιότητα Xroma, άρα οποιαδήποτε υποκλάση της, πχ Trigono, Kyklos, θα την κληρονοµεί και έτσι γλιτώνουµε από το να την ορίζουµε και να την ελέγχουµε σε κάθε υποκλάση. Στη Sxhma ορίζουµε και την abstract µέθοδο ypologiseemvadon(), που δεν έχει σώµα Trigono Polygono Sxhma Tetragono Kyklos Εικόνα 37 Γεωµετρικά σχήµατα µόνον επικεφαλίδα. Αυτό µας βολεύει γιατί δεν υπάρχει τρόπος (µαθηµατικός τύπος) που να υπολογίζει το εµβαδόν κάθε σχήµατος, όµως έχουµε καταφέρει να δεσµεύσουµε όλες τις υποκλάσεις να την υλοποιήσουν µε ακριβώς αυτό το όνοµα και υπογραφή (εννοείται ότι το σώµα θα διαφέρει για κάθε υποκλάση). Η κληρονοµικότητα είναι ένας µηχανισµός µοντελοποίησης, δηλαδή επιτρέπει να κατασκευάσουµε προγράµµατα που θα απεικονίζουν κατά το δυνατόν πιστά τις οντότητες του πραγµατικού κόσµου των οποίων τη λειτουργία προσο- µοιώνουν. Όταν προγραµµατίζουµε µε αντικειµενοστρεφή τρόπο και θέλουµε να επεκτείνουµε τις ιδιότητες ενός αντικειµένου µπορούµε είτε να προσθέσουµε νέες µεταβλητές στιγµιότυπου, ή να επεκτείνουµε την κλάση του αντικειµένου ορίζοντας µια υποκλάση της µε τις πρόσθετες ιδιότητες. Για να επιλέξουµε µπορούµε να σκεφτούµε ως εξής: Όταν η σχέση είναι κλάσης υποκλάσης, τη διατυπώνεις µε τη φράση "... είναι-ένα... " (is-a relation). Για παράδειγµα, ο άνθρωπος είναι ένα θηλαστικό, ή το αυτοκίνητο είναι ένα τετράτροχο που µε τη σειρά του είναι ένα όχηµα. ιαφορετικά, η φράση "... έχει-ένα... " (has-a ή part-whole relation) υποδηλώνει ότι θα πρέπει να προσθέσουµε µεταβλητές στιγµιότυπου (δες ενότητα 2.11). Για παράδειγµα, ο άνθρωπος έχει χέρια και πόδια, ή το αυτοκίνητο έχει κυβισµό, χρώµα, κλπ. Ας δούµε ένα απλό παράδειγµα. Θέλουµε να διαχειριστούµε διάφορες λειτουργίες ενός νοσοκοµείου και αρκετές από αυτές αφορούν γιατρούς και ασθενείς. Θα µπορούσαµε να υλοποιήσουµε δύο ανεξάρτητες κλάσεις µε τις απαιτούµενες ιδιότητες και µεθόδους, ωστόσο παρατηρούµε ότι γιατροί και ασθενείς µοιράζονται κοινά χαρακτηριστικά που τα υλοποιούµε δύο φορές. Για να το αποφύγουµε αυτό, φτιάχνουµε µια κλάση που υλοποιεί ό,τι αφορά ένα άτοµο, είτε είναι γιατρός, είτε ασθενής. Έπειτα φτιάχνουµε ξεχωριστές υποκλάσεις για γιατρούς και ασθενείς που κληρονοµούν τα κοινά χαρακτηριστικά των ατόµων και υλοποιούν τα ιδιαίτερα χαρακτηριστικά που τους αφορούν. Στην ενότητα 2.16 Εικόνα 38 ιάγραµµα κλάσεων UML που απεικονίζει την κληρονοµικότητα κλάσεων Γιατροί και ασθενείς (κληρονοµικότητα) υπάρχει µια υλοποίηση του παραδείγµατος. Στην Εικόνα 38 φαίνονται οι τρεις κλάσεις µε τις ιδιότητες και τις µεθόδους τους και η σχέση κληρονοµικότητας α- πεικονίζεται µε τα βέλη. Το διάγραµµα απεικονίζει τις κλάσεις ως κουτιά τα οποία συνδέονται µε βέλη που δείχνουν τη σχέση κληρονοµικότητας. Η εµβέλεια υποδηλώνεται µε # όταν είναι protected, µε + όταν είναι public και µε

10 Σελίδα 28 Ι. Γαβιώτης - Τεχνολογίες & Μεθοδολογίες Προγραµµατισµού II 11/3/2006 όταν είναι private. Όταν ένα πρόγραµµα αποτελείται από πολλές κλάσεις που θέλουµε να τις οµαδοποιήσουµε για να µπορούν να α- νταλλάσσουν µηνύµατα, τις εντάσσουµε στο ίδιο πακέτο µε την εντολή package όνοµαπακέτου. Τα µεταγλωττισµένα αρχεία.class τοποθετούνται σε ένα φάκελο στο σηµείο που δείχνει η µεταβλητή συστήµατος CLASSPATH. Για να χρησιµοποιήσουµε κώδικα του πακέτου Χ από κάποια κλάση άλλου πακέτου Υ, δηλώνουµε στην αρχή της κλάσης import X.ΌνοµαΚλάσης ή γενικά import X.*; Όταν κατασκευάζουµε ένα µεγάλο πρόγραµµα, είναι πιθανόν να πρέπει να µοντελοποιήσουµε αρκετές οντότητες που θα συνδέονται µεταξύ τους µε σχέσεις κληρονοµικότητας. Γι αυτή την περίπτωση υπάρχουν εργαλεία που επιτρέπουν στον προγραµµατιστή να σχεδιάζει τις κλάσεις και τη σχέση τους σε µορφή διαγράµµατος κλάσης UML (Universal Modeling Language), όπως φαίνεται και στο σχήµα και έπειτα παράγουν αυτόµατα τον σκελετό των κλάσεων σε κάποια γλώσσα προγραµµατισµού. Ένα τέτοιο εργαλείο που παράγει κώδικα Java είναι το Poseidon for UML µια ελεύθερη έκδοσή του µπορείτε να βρείτε στο (community edition for Windows, έκδοση 3.0.1, ~24Mb). Ο προγραµµατιστής έπειτα αρκεί να «γεµίσει» τα σώµατα των µεθόδων µε κώδικα. Τόσο το σχήµα στην Εικόνα 38, όσο και ο σκελετός του προγράµµατος της ενότητας 2.16 Γιατροί και ασθενείς (κληρονοµικότητα) προήλθαν από το εργαλείο Poseidon. Ένα αντίστοιχο εργαλείο είναι και το Rational Rose της ΙΒΜ. Η κληρονοµικότητα πέρα από την αναλογία της µε αντικείµενα και καταστάσεις του πραγµατικού κόσµου, µας χρησι- µεύει για: να αποφεύγουµε τη συγγραφή του ίδιου κώδικα, αφού ο κοινό κώδικας συγκεντρώνεται στην υπέρ-κλάση και οι υποκλάσεις τον κληρονοµούν από εκείνη, και να ορίζουµε ένα κοινό «πρωτόκολλο» σε ένα σύνολο κλάσεων, όταν θέλουµε όλες οι υποκλάσεις να «απαντούν» µε ένα κοινό τρόπο για (κάποιες από) τις λειτουργίες τους. Εικόνα 39 ιάγραµµα κλάσεων UML για φοιτητές Στην Εικόνα 39 βλέπουµε άλλο ένα παράδειγµα κληρονοµικότητας. Η κλάση Φοιτητής είναι δηλωµένη abstract, άρα δεν επιτρέπεται να κατασκευαστούν στιγµιότυπά της. Η χρησιµότητά της είναι ότι κληρονοµείται από τις παράγωγες κλάσεις Προπτυχιακός και Μεταπτυχιακός. Επιπλέον, ένας Υποψήφιος ιδάκτορας είναιένας Μεταπτυχιακός. Στο διάγραµµα πρόκειται να προστεθούν όλες οι µέθοδοι στις οποίες «απαντούν» οι κλάσεις. Πολλαπλή κληρονοµικότητα έχουµε όταν µια κλάση κληρονοµεί ή επεκτείνει πολλές. Η πολλαπλή κληρονοµικότητα παρέχει µεγαλύτερες δυνατότητες µοντελοποίησης, αλλά είναι πιο δύσχρηστη και «επικίνδυνη». Η γλώσσα C++ υποστηρίζει άµεσα πολλαπλή κληρονοµικότητα. Στη Java η πολλαπλή κληρονοµικότητα υλοποιείται έµµεσα ορίζοντας ότι µια κλάση υλοποιεί µία ή περισσότερες διεπαφές (interface 8 ). 8 εν έχει καµία σχέση µε τη γραφική διεπαφή χρήστη (graphical user interface).

11 11/3/2006 Ι. Γαβιώτης - Τεχνολογίες & Μεθοδολογίες Προγραµµατισµού II Σελίδα 29 Μια διεπαφή στη Java είναι ο σκελετός µιας κλάσης που εισάγεται µε τη δεσµευµένη λέξη interface, αντί της class, και περιλαµβάνει δηλώσεις σταθερών ή επικεφαλίδες µεθόδων χωρίς το σώµα τους, δηλαδή την υλοποίησή τους. Μια κλάση που υλοποιεί τη διεπαφή έχει στην επικεφαλίδα της τη δεσµευµένη λέξη implements και περιλαµβάνει τις επικεφαλίδες των µεθόδων µαζί µε τον κώδικα που υ- λοποιεί τη λειτουργικότητά τους. Ουσιαστικά µια διεπαφή «δεσµεύει» ο- νόµατα για τις µεθόδους και τους τύπους των παραµέτρων τους, έτσι ώ- στε κάθε κλάση που επεκτείνει τη διεπαφή να υποχρεώνεται να ακολουθήσει τις προδιαγραφές αυτές. Ενώ µια κλάση µπορεί να επεκτείνει (extends) µόνον µία άλλη υπέρ-κλάση (απλή κληρονοµικότητα), είναι δυνατόν να υλοποιεί (implements) περισσότερες από µία διεπαφές (πολλαπλή κληρονοµικότητα). Το συντακτικό για τον ορισµό µιας κλάσης της Java φαίνεται στην Εικόνα 40. Τα προσδιοριστικά καθορίζουν αν η κλάση είναι public, final ή abstract. Προσέξτε το σταυρό στην ενότητα implements που δηλώνει ένα ή περισσότερα ονό- µατα διεπαφής. Μια συνηθισµένη χρήση των διεπαφών είναι να ορίζουν σταθερές, όπως φαίνεται στην Εικόνα 41. Μια άλλη κλάση για να χρησιµοποιήσει τις σταθερές απλώς χρειάζεται να δηλώσει στην επικεφαλίδα ότι υλοποιεί (implements) τις διεπαφές Ασκήσεις Α25. Φτιάξτε κλάση που διαχειρίζεται σηµεία στο επίπεδο, δηλαδή σηµεία που έχουν µια τετµηµένη x και µια τεταγµένη y. Φτιάξτε µέθοδο distance που να υπολογίζει την απόσταση δύο σηµείων. Φτιάξτε άλλη µέθοδο a.isfurther(b) που βρίσκει αν το a απέχει από την αρχή των αξόνων περισσότερο από το b (Υπόδειξη: µπορεί να χρησι- µοποιεί την προηγούµενη). Τέλος, µια µέθοδο που θα ελέγχει αν τρία σηµεία είναι στην ίδια ευθεία. Φτιάξτε µια άλλη κλάση που ορίζει διανύσµατα ως διατεταγµένα ζεύγη σηµείων. Μια µέθοδος των διανυσµάτων να υπολογίζει το µήκος τους. Κατασκευάστε µερικά διανύσµατα και βρείτε το πιο µεγάλο. Επεκτείνετε την κλάση, έτσι ώστε τα σηµεία να είναι στον τρισδιάστατο χώρο. [προσδιοριστικάκλάσης] class όνοµακλάσης [extends όνοµαυπερκλάσης] [implements όνοµα ιεπαφής + ] { σώµακλάσης Εικόνα 40 Η σύνταξη µιας επικεφαλίδας κλάσης public interface MyConstants { // Μεγέθη για πουκάµισα byte SIZE_SMALL = 0; // όλες οι δηλώσεις σε byte SIZE_MEDIUM = 1; // interface είναι εξ byte SIZE_LARGE = 2; // ορισµού byte SIZE_X_LARGE = 3; // public και final byte SIZE_XX_LARGE = 4; // Τύποι πουκάµισων byte MONOXROMO = 0; // σταθερά byte EMPRIME = 1; byte RIGE = 2; public class Poykamisa implements MyConstants { byte megethos = SIZE_MEDIUM; // ιδιότητες byte typos = MONOXROMO; public Poykamisa(byte megethos, byte typos) { if ((megethos >= SIZE_SMALL) && (megethos <= SIZE_XX_LARGE)) this.megethos = megethos; Εικόνα 41 Ορισµός και χρήση διεπαφής Α26. Φτιάξτε κλάση που περιέχει το ονοµατεπώνυµο ενός φοιτητή, το εξάµηνο στο οποίο βρίσκεται και τους βαθµούς πέντε µαθηµάτων του. Όλες οι ιδιότητες της κλάσης θα είναι ιδιωτικές. Φτιάξτε µεθόδους ανάγνωσης και εγγραφής για όλες τις ιδιότητες. Ειδικά για τους βαθµούς, θα υλοποιήσετε µέθοδο float getbathmos(int armath) και void set- Bathmos(int armath, float fbathmos). Τέλος, κατασκευάστε µερικούς φοιτητές και χρησιµοποιήστε όλες τις µεθόδους τουλάχιστον µία φορά. Με βάση τους φοιτητές που έχετε κατασκευάσει υπολογίστε το µέσο όρο τους σε όλα τα µαθήµατα στα οποία έ- χουν πάρει βαθµό. Υπόδειξη: εάν ένας µαθητής δεν έχει πάρει βαθµό σε κάποιο από τα πέντε µαθήµατα, βάλτε του µια «αδύνατη» τιµή, πχ (-1). Υλοποιήστε κλάση για τους µεταπτυχιακούς φοιτητές που κληρονοµεί από την αρχική κλάση. Α27. Φτιάξτε κλάσεις για δισδιάστατα γεωµετρικά αντικείµενα µε µεθόδους που υπολογίζουν την περίµετρο και το εµβαδόν τους. Για παράδειγµα, (α) τρίγωνο µε πλευρές α, β, γ, (β) κύκλο ακτίνας ρ, (γ) παραλληλόγραµµο πλευρών α, β, (δ) τραπέζιο µε παράλληλες πλευρές α, β και ύψος υ. Έπειτα φτιάξτε πρόγραµµα που θα δηµιουργεί αντικείµενα συγκεκριµένου τύπου και ιδιοτήτων και θα τυπώνει πληροφορίες γι αυτά. Επεκτείνετε το πρόγραµµα προσθέτοντας κι άλλες κλάσεις για τα γεωµετρικά αντικείµενα (ε) έλλειψη και (στ) τοµέα κύκλου. Τροποποιήστε τον κατασκευαστή του τριγώνου έτσι ώστε να ελέγχει ότι κάθε πλευρά του είναι µικρότερη από το άθροισµα των άλλων δύο και µεγαλύτερη από τη διαφορά τους (αλλιώς τι σόι τρίγωνο είναι αυτό). Επεκτείνετε την κλάση του τριγώνου µε δυαδικές µεθόδους einaiorthogonio, einaiskalino, einaiisoskeles, einaiisoplevro. Α28. Φτιάξτε κλάσεις για στερεά αντικείµενα (α) παραλληλεπίπεδο (µε πρόσθετο κατασκευαστή για κύβο), (β) σφαίρα, (γ) κώνος, (δ) κύλινδρος. Για κάθε στερεό θα συµπεριλάβετε στην κλάση του µεθόδους που υπολογίζουν τον όγκο και την επιφάνειά του. Μια άλλη κλάση θα δίνει επιλογή στο χρήστη για το αντικείµενο που θέλει να κατασκευάσει και στο τέλος

12 Σελίδα 30 Ι. Γαβιώτης - Τεχνολογίες & Μεθοδολογίες Προγραµµατισµού II 11/3/2006 θα τυπώνει το συνολικό όγκο των αντικειµένων που κατασκευάστηκαν. Επεκτείνετε το πρόγραµµα προσθέτοντας κλάσεις για το στερεό αντικείµενο (ε) πυραµίδα. Επίσης, το πρόγραµµα θα πρέπει να σταµατάει όταν η συνολική επιφάνεια των στερεών που κατασκευάστηκαν υπερβεί τις 10 τετραγωνικές µονάδες. Α29. Φτιάξτε κλάση για το αντικείµενο ώρα χρησιµοποιώντας ιδιωτικά δεδοµένα. Υλοποιήστε τις συνηθισµένες µεθόδους (κατασκευαστές, getter, setter). Επίσης, φτιάξτε µέθοδο tostring που θα επιστρέφει την ώρα ως 23:26:43 ή 11:26:43µµ ανάλογα µε διακόπτη (παράµετρο). Επίσης, υλοποιήστε µέθοδο που βρίσκει τη διαφορά ανάµεσα σε δύο ώ- ρες. Επεκτείνετε το πρόγραµµα έτσι ώστε να διαβάζει τις ώρες προσέλευσης και αποχώρησης ενός εργαζοµένου και όταν τερµατίζει να τυπώνει τη συνολική διάρκεια που εργάστηκε, και πόσες φορές προσήλθε στην εργασία του. [Υπάρχει πιθανότητα ο εργαζόµενος να ξεκινήσει να δουλεύει στις 23:00:00 και να βγει στις 07:00:00.] Α30. Φτιάξτε κλάση για ηµεροµηνίες χρησιµοποιώντας ιδιωτικά δεδοµένα. Οι ιδιότητες θα πρέπει να ελέγχονται για εγκυρότητα. Υλοποιήστε µεθόδους για εκτύπωση και µέθοδο που επιστρέφει τη διαφορά σε ηµέρες ανάµεσα σε δύο ηµεροµηνίες (θα πρέπει, βέβαια να λαβαίνετε υπόψη πόσες ηµέρες έχει ο κάθε µήνας. Με δεδοµένο ότι πχ η 3 η Απριλίου 2003 είναι Πέµπτη, θα φτιάξετε µέθοδο που θα υπολογίζει την ηµέρα της εβδοµάδας για την ηµεροµηνία. Θα χρειαστεί να φτιάξετε ιδιωτικές µεθόδους που θα εντοπίζουν δίσεκτα έτη και πόσες ηµέρες µεσολαβούν από την αρχή του έτους ως µια ηµεροµηνία και από µια ηµεροµηνία ως το τέλος του έτους. Μετρήστε πώς κατανέµονται οι Πρωτοχρονιές τον εικοστό πρώτο αιώνα (πόσες είναι ευτέρες, πόσες Τρίτες, κοκ). Αν κάποιος γεννήθηκε την 21 η Οκτωβρίου 1999, ποια ηµεροµηνία θα έχει ζήσει ηµέρες; Α31. Ένα κατάστηµα εµπορεύεται πουκάµισα διαφόρων τύπων, συγκεκριµένων χρωµάτων, µεγεθών και τιµών αγοράς και πώλησης. Φτιάξτε κλάση που να αποθηκεύει τα χαρακτηριστικά και να υλοποιεί τις βασικές λειτουργίες πάνω στα πουκάµισα. Έπειτα φτιάξτε πρόγραµµα που θα παραλαµβάνει πουκάµισα στο κατάστηµα (ισοδυναµεί µε δηµιουργία α- ντικειµένου) και θα πουλάει µερικά από αυτά (ισοδυναµεί µε καταστροφή αντικειµένου). Με την παραλαβή θα αυξάνεται το χρέος προς τον προµηθευτή και µε την πώληση θα αυξάνεται ο τζίρος. Τροποποιήστε το παραπάνω πρόγραµµα µε δεδοµένο ότι το κατάστηµα πουλάει τα πουκάµισα µε ποσοστό κέρδους 17%. Επίσης, υποθέστε ότι ο επιχειρηµατίας έχει διαθέσιµο κεφάλαιο για να αγοράζει στοκ. Κάντε το πρόγραµµα να τερµατίζει όταν το κατάστηµα πουλήσει τόσα πουκάµισα ώστε το κέρδος να υπερβεί τα 200. Α32. Όπως θα διαπιστώσατε στην άσκηση Α17, αν προσπαθήσετε να υπολογίσετε το ν παραγοντικό χρησι- µοποιώντας ακεραίους int, θα φτάσετε ως ν=16. Με µεγάλους ακεραίους long, ως ν=39. Για µεγαλύτερα ν, χρησιµοποιήστε την κλάση περιτυλίγ- µατος BigInteger. Τέτοιοι ακέραιοι είναι αντικείµενα κι όχι απλές µεταβλητές. Φτιάξτε πρόγραµµα που να υπολογίζει το ν παραγοντικό όλων των αριθµών µέχρι το Α33. Φτιάξτε πρόγραµµα που να περιλαµβάνει µεθόδους που συγκρίνουν Εικόνα 42 Χρήση κλάσης περιτυλίγµατος αντικείµενα της κλάσης Κλάσµα. Υ- πενθυµίζεται ότι το κλάσµα έχει δύο ιδιότητες και ότι ο παρονοµαστής του αποκλείεται να γίνει 0. Εκτός από τους βασικούς τελεστές +, -, *, /, θα υλοποιήσετε τους σχεσιακούς τελεστές µε τις µεθόδους isequal, isgreater και µετά θα χρησιµοποιήσετε αυτές τις δύο για να υλοποιήσετε τις isdifferent, isgreaterthanorequal, islessthanorequal, islessthan. Στη main θα πρέπει να καλέσετε τουλάχιστον µία φορά όλες τις µεθόδους που φτιάξατε. Αριθµητική κλασµατικών αριθµών. υλοποιήστε απλοποίηση, σχεσιακούς τελεστές σύγκρισης. Για µια (µερική) υλοποίηση δείτε την ενότητα 2.15 Κλασµατικοί αριθµοί. Φτιάξτε αριθµοµηχανή που λειτουργεί επί κλασµάτων. Το πρόγραµµα θα διαχειρίζεται έναν αριθµό πχ 5 κλασµάτων. Κατά τη βούληση του χρήστη θα µπορεί να θέτει (αλλάζει) τους όρους τους, να εκτελεί τις βασικές αριθµητικές και λογικές πράξεις, να τα τυπώνει και ό,τι άλλο εσείς κρίνετε χρήσιµο για µια αριθµοµηχανή. Α34. Φτιάξτε κλάση ΤραπεζικόςΛογαριασµός και υλοποιήστε τις απαραίτητες µεθόδους που θα τον πιστώνουν και θα τον χρεώνουν παίρνοντας όλες τις απαραίτητες προφυλάξεις. Φτιάξτε τρεις λογαριασµούς και έναν απλό διερµηνευτή που θα δέχεται εντολές για ανάληψη / κατάθεση σε αυτούς. Α35. Φτιάξτε κλάση ΑΤΜ (Αυτόµατη Ταµειολογιστική Μηχανή) µε την οποία κάνουν τραπεζικές κινήσεις οι συναλλασσό- µενοι. Για την εκτέλεση των κινήσεων χρησιµοποιήστε τις µεθόδους της κλάσης ΤραπεζικόςΛογαριασµός. ηµιουργήστε δύο ΑΤΜ. Α36. Άλγεβρα συνόλων. Υλοποιήστε κατασκευαστές συνόλων και τις βασικές λειτουργίες: ανήκει, υποσύνολο, τοµή, ένωpublic static BigInteger factorial(long n) { BigInteger product = new BigInteger("1"); BigInteger increment = new BigInteger("1"); for (long i = 1L; i <= n; i++) { product = product.multiply(increment); increment = increment.add(biginteger.one); return product; public static void main(string[] args) { BigInteger t = new BigInteger("0"); for(long i = 1L; i <= 1000L; i++) { t = factorial(i); System.out.println("fac(" + i + ")=" + t.tostring());

13 11/3/2006 Ι. Γαβιώτης - Τεχνολογίες & Μεθοδολογίες Προγραµµατισµού II Σελίδα 31 ση, διαφορά. Αριθµοµηχανή συνόλων. Φτιάξτε πρόγραµµα που θα διαχειρίζεται σύνολα: θα επιτρέπει την προσθήκη / διαγραφή στοιχείων, την εκτέλεση πράξεων επί αυτών και την εκτύπωση αποτελεσµάτων. Α37. Φτιάξτε κλάσεις που να αντικατοπτρίζουν το παρακάτω σενάριο: Ένα όχηµα έχει έναν κινητήρα και µπορεί να είναι αυτοκίνητο ή µοτοσικλέτα. Ο κινητήρας καίει κανονική ή αµόλυβδη βενζίνη και συγκεκριµένο κυβισµό και ιπποδύναµη. Τα αυτοκίνητα έχουν τέσσερις τροχούς, ενώ οι µοτοσικλέτες δύο. Για κάθε τροχό γνωρίζουµε τη διάµετρο και την πίεση στην οποία είναι φουσκωµένος. Οι λειτουργίες που µπορεί να εκτελέσουµε στο όχηµα είναι: άναµµα / σβήσιµο της µηχανής, αλλαγή τροχού, έλεγχος και φούσκωµα τροχού. Α38. Ένας κερµατοδέκτης δέχεται κέρµατα 1 και 2 ευρώ, καθώς επίσης και 50, 20, 10, 5, 2, 1 λεπτών. Φτιάξτε µεθόδους που εισάγουν κέρµατα στον κερµατοδέκτη, τυπώνουν το ποσό που έχει µέσα. Επίσης, φτιάξτε µέθοδο που επιστρέφει συγκεκριµένο ποσόν µε τον ελάχιστο αριθµό κερµάτων. Εάν αυτό δεν γίνεται (εξαιτίας έλλειψης συγκεκριµένων κερµάτων), προσπαθεί να επιστρέψει το ποσόν µε τα κέρµατα που είναι διαθέσιµα στις θήκες του, αλλά πάλι φροντίζει να δώσει ελάχιστα κέρµατα και ζητάει συγγνώµη που έδωσε πολλά «ψιλά». Αν δεν µπορεί να επιστρέψει το συγκεκριµένο ποσό, ζητάει συγγνώµη και δηλώνει αδυναµία. Α39. Σχεδιάστε κλάση «Εργαζόµενος» που περιέχει ατοµικά στοιχεία και δύο υποκλάσεις (derived) «Ωροµίσθιος» και «Μισθωτός» που προσθέτουν τα µισθολογικά στοιχεία του εργαζοµένου. 2 2 x + y Α40. Αριθµητική µιγαδικών αριθµών. Εκτός από τις τέσσερις βασικές αλγεβρικές πράξεις, υλοποιήστε µέτρο. Για µια υλοποίηση που περιλαµβάνει και διεπαφή ρυθµού χαρακτήρων, δείτε την ενότητα 2.17 Μιγαδικοί και διερµηνευτής. Α41. Η κλάση Nomisma αναπαριστά τιµές νοµισµάτων, όπως το ευρώ και το δολάριο. Για κάθε νόµισµα θα υπάρχει (α) το διεθνές τριψήφιο σύµβολό του, πχ EUR ή USD, (β) το πρόσηµό του, + ή -, (γ) η ακέραια τιµή του, πχ 3 ή 142, και (δ) τα εκατοστά του 9, πχ 33 ή 99. Φτιάξτε κατασκευαστή Nomisma("EUR", '+', 3, 33) ή Nomisma("USD", '-', 142, 99) που να δηµιουργεί «νόµιµα» νοµίσµατα, εκτυπωτικό tostring που τυπώνει EUR+3.33 ή USD και δύο µεθόδους που να προσθέτουν και να αφαιρούν νοµίσµατα. Επίσης φτιάξτε ένα κατασκευαστή ακόµη που θα "αναγνωρίζει" τιµές νοµισµάτων όπως στα παραπάνω παραδείγµατα. Φτιάξτε πρόγραµµα που θα υπολογίζει την συνολική αξία σε ευρώ των νοµισµατικών τιµών που έχουν δηµιουργηθεί. Επιτρέπουµε νοµίσµατα σε EUR, USD, GBP. Για τα δύο τελευταία τηρούµε την ισοτιµία τους µε το ευρώ. Μετά από πολύµηνη χρήση, διαπιστώνετε ότι στα αντικείµενα της κλάσης Nomisma εκτελούνται πολύ συχνά οι µέθοδοι της πρόσθεσης και της αφαίρεσης, οπότε για λόγους επιδόσεων σκεφτόσαστε να αλλάξετε την αναπαράσταση του αριθµητικού µέρους και του πρόσηµου. Αντί για ένα χαρακτήρα, έναν ακέραιο και ένα µικρό ακέραιο (byte) θα χρησιµοποιήσετε έναν µεγάλο (προσηµασµένο) ακέραιο long. Έτσι ο 1.33 αποθηκεύεται ως 133 και ο ως Αλλάξτε την υλοποίηση της κλάσης, χωρίς ωστόσο να πειράξετε στο παραµικρό τις δηµόσιες µεθόδους, έτσι ώστε να υπάρχει συµβατότητα µε τα προγράµµατα που ήδη χρησιµοποιούν την κλάση Nomisma Υλοποίηση κλάσης λάµπα σε Java package lampa; public class Light { // instance variable /* value ranges from * 0 means the light is off, 1 means the light is fully on * some value in between means light operates in reduced capacity */ private float lightstatus; // constructors public Light() { lightstatus = (float) 0; System.out.println("A new light was created turned off."); public Light(float initialstatus) { lightstatus = minimum(maximum(initialstatus, (float) 0), (float) 1); System.out.println("A new light was created with initial status " + lightstatus + "."); // public methods public void on() { // turns the light on to full brightness lightstatus = (float) 1; System.out.println("The light was turned on."); 9 ιερευνήστε γιατί δεν είναι καλή ιδέα να αναπαραστήσουµε την τιµή του νοµίσµατος, πχ 3.33 µε έναν float ή ακόµα και µε double πραγµατικό αριθµό; Σε µερικές γλώσσες, όπως στην «αρχαία» γλώσσα προγραµµατισµού Cobol υπήρχε η αναπαράσταση αριθµών BCD (Binary coded Decimal) βρείτε πώς λειτουργεί και γιατί χρησιµοποιείται παρόλο που είναι «σπάταλη».

14 Σελίδα 32 Ι. Γαβιώτης - Τεχνολογίες & Μεθοδολογίες Προγραµµατισµού II 11/3/2006 public void off() { // turns the light off to complete darkness lightstatus = (float) 0; System.out.println("The light was turned off."); public void brighten() { // turns the light a little brighter lightstatus = minimum(1, (lightstatus + (float) 0.1)); System.out.println("The light became brighter."); public void dim() { // turns the light a little dimmer lightstatus = maximum(0, (lightstatus - (float) 0.1)); System.out.println("The light became dimmer."); // private methods private float minimum(float x, float y) { //returns the lesser of two floating numbers return (x < y)?x:y; private float maximum(float x, float y) { //returns the bigger of two floating numbers return (x > y)?x:y; //end class 2.15 Κλασµατικοί αριθµοί και συλλογή απορριµάτων package klasma; public class Klasma { //µεταβλητή κλάσης private static int count = 0; //µετράει πόσα κλάσµατα υπάρχουν //µεταβλητές στιγµιοτύπων private int arithmitis; // ο αριθµητής του κλάσµατος private int paronomastis; // ο παρονοµαστής του κλάσµατος //κατασκευαστές & καταστροφέας public Klasma() { // ο πιο απλός κατασκευαστής arithmitis = 0; paronomastis = 1; count ++; System.out.println("Πλήθος " + count); public Klasma(int arithmitis, int paronomastis) { this.arithmitis = arithmitis; // το this χρειαζεται για να ξερει σε οτι... this.paronomastis = ((paronomastis==0)?1:paronomastis); // αναφεροµαστε... count ++; // στην ιδιότητα και όχι στην παράµετρο System.out.println("Πλήθος " + count); public Klasma(int timh) { this(timh, 1); //χρησιµοποιεί τον προηγούµενο κατασκευαστή public void finalize() { // να και ο καταστροφέας count --; System.out.println("Πλήθος " + count); //µέθοδοι ανάκλησης (get) και τοποθέτησης (set) public int getarithmitis() { return(arithmitis); public int getparonomastis() { return(paronomastis);

15 11/3/2006 Ι. Γαβιώτης - Τεχνολογίες & Μεθοδολογίες Προγραµµατισµού II Σελίδα 33 public void setarithmitis(int arithmitis) { this.arithmitis=arithmitis; public void setparonomastis(int paronomastis) { if (paronomastis!= 0) this.paronomastis=paronomastis; // αν πας να βάλεις παρονοµαστή το 0, αφήνει τον παλιό παρονοµαστή //άλλες µέθοδοι public float compute() { // το cast µε το float είναι απαραίτητο, γιατί... return ((float) arithmitis) / paronomastis; // αλλιώς κάνει ακέραια διαίρεση public String tostring() { return arithmitis + "/" + paronomastis; public void antistrefo() { // αντιστρέφει τυς όρους του κλάσµατος if (arithmitis!= 0) { int temp = paronomastis; paronomastis = arithmitis; arithmitis = temp; // αν ο αριθµητής είναι 0, το κλάσµα παραµένει ως έχει public void aplopoio() { // απλοποιεί το κλάσµα int mkdklasmatos = mkd(arithmitis, paronomastis); arithmitis = arithmitis / mkdklasmatos; paronomastis = paronomastis / mkdklasmatos; //ιδιωτικές µέθοδοι private static int mkd (int m, int n) { while (n!=0 && m!=0) if (m > n) m -=n; else n -=m; return Math.max(m, n); //end class package klasma; public class KlasmaAlgebra { //όλες οι µέθοδοι επιστρέφουν νέο κλάσµα που έχει το αποτέλεσµα public static Klasma antistrefo(klasma k ) { // δεν πειράζει το αρχικό κλάσµα - δηµιουργεί άλλο που ειναι αντεστραµµένο return new Klasma(k.getParonomastis(), k.getarithmitis()); public static Klasma prostheto(klasma k1, Klasma k2) { Klasma apot = new Klasma(); //προσωρινή µεταβλητή αντικειµένου apot.setparonomastis(k1.getparonomastis() * k2.getparonomastis()); apot.setarithmitis(k1.getarithmitis() * k2.getparonomastis() + k2.getarithmitis() * k1.getparonomastis() ); return apot; public static Klasma afairo(klasma k1, Klasma k2) { Klasma apot = new Klasma(k1.getArithmitis() * k2.getparonomastis() - k2.getarithmitis() * k1.getparonomastis(), k1.getparonomastis() * k2.getparonomastis() ); return apot; public static Klasma pollaplasiazo(klasma k1, Klasma k2) { return new Klasma(k1.getArithmitis() * k2.getarithmitis(), k1.getparonomastis() * k2.getparonomastis() ); public static Klasma diairo(klasma k1, Klasma k2) { if (k2.getarithmitis() == 0) return new Klasma(); else return new Klasma(k1.getArithmitis() * k2.getparonomastis(), k1.getparonomastis() * k2.getarithmitis() ); //end class

16 Σελίδα 34 Ι. Γαβιώτης - Τεχνολογίες & Μεθοδολογίες Προγραµµατισµού II 11/3/2006 package klasma; public class KlasmaDemo { public static void main(string[] args) { Klasma r = new Klasma(5, 7); System.out.println("Arithmitis=" + r.getarithmitis()+ " Paronomastis=" + r.getparonomastis() + " Timh=" + r.compute() ); r.setarithmitis(3); r.setparonomastis(4); System.out.println("To idio klasma meta apo allagh synteleston " + r.tostring()); printlines(2); Klasma s = new Klasma(1, 2); System.out.println("Ena allo klasma " + s); // δεν χρειάζεται να βάλω.tostring() System.out.println("To antistrofo toy einai " + KlasmaAlgebra.antistrefo(s)); // η παραπάνω εντολή έφτιαξε ένα (ανώνυµο) κλάσµα που δεν είναι προσπελάσιµο System.gc(); // τώρα καταστρέφεται αυτό το κλάσµα printlines(2); Klasma t = KlasmaAlgebra.prostheto(r, s); System.out.println("Prosthesi " + r + " syn " + s + " kanei " + t); t.aplopoio(); System.out.println(" me aplopoiisi " + t); printlines(2); System.out.println("Afairesi " + r + " meion " + s + " kanei " + KlasmaAlgebra.afairo(r, s)); System.exit(0); //end main private static void printlines(int n){ for (int i=1; i<=n; i++) System.out.println(); //end class 2.16 Πολύφωτο Παραλλαγή της λάµπας όπως έχει υλοποιηθεί στην ενότητα Η δεύτερη κλάση κατασκευάζει και διαχειρίζεται πίνακα από αντικείµενα µέσω ενός απλού διερµηνευτή διαταγών. package polifoto; public class Lampa { private final boolean ANAMMENH = true; //σταθερες της κλασης private final boolean SBHSMENH = false; private boolean katastasi; //ιδιοτητα των αντικειµενων Λαµπα public Lampa() { //κατασκευαστης: φτιαχνει µια νεα σβηστη λαµπα katastasi = SBHSMENH; System.out.println("Κατασκευάστηκε µια νέα λάµπα"); public boolean getkatastasi() { return katastasi; //επιστρεφει κατασταση λαµπας γιατι ειναι ιδιωτικη public void anapse() { //αναβει τη λαµπα katastasi = ANAMMENH; System.out.println("Αναψε µια λάµπα"); public void sbhse() { //σβηνει τη λαµπα katastasi = SBHSMENH; System.out.println("Εσβησε µια λάµπα"); package polifoto; import javax.swing.*;

17 11/3/2006 Ι. Γαβιώτης - Τεχνολογίες & Μεθοδολογίες Προγραµµατισµού II Σελίδα 35 public class Polifoto { public static void main(string[] args) { Object[] fotistiko; //το φωτιστικο ειναι ενας πινακας µε στοιχεια αντικειµενα String slampes = JOptionPane.showInputDialog("Πόσες λάµπες έχει το φωτιστικό;"); int ilampes = Integer.parseInt(sLampes); fotistiko = new Object[iLampes]; //κατασκευαζεται πινακας µε µεγεθος που του δωσαµε for(int i = 0; i < ilampes; i++) //εδω γεµιζει ο πινακας µε στοιχεια fotistiko[i] = new Lampa(); //καθε στοιχειο ειναι µια νεα λαµπα String sepilampa; int iepilampa; //επιλογη λαµπας String sepileit; char cepileit; //επιλογη λειτουργιας Lampa epilampa; //επιλεγµενη λαµπα πανω στην οποια θα γινει η λειτουργια while (true) { sepilampa = JOptionPane.showInputDialog("Επιλογή λάµπας 0 έως " + (ilampes - 1) + ". Αλλος αριθµός τερµατίζει το πρόγραµµα."); iepilampa = Integer.parseInt(sEpiLampa); if ((iepilampa < 0) (iepilampa>=ilampes)) break; epilampa = (Lampa) fotistiko[iepilampa]; sepileit = JOptionPane.showInputDialog( "Επιλογή λειτουργίας α=αναψε, σ=σβησε, κ=κατασταση"); cepileit = sepileit.charat(0); switch (cepileit) { case 'α': epilampa.anapse(); break; case 'σ': epilampa.sbhse(); break; case 'κ': JOptionPane.showMessageDialog(null,"Η λάµπα " + iepilampa + " είναι " + (epilampa.getkatastasi()?"αναµµένη":"σβηστή")); break; //end switch //end while for (int i = 0; i < fotistiko.length; i++) //τυπωνει την κατασταση ολων των λαµπων System.out.println("Η λαµπα " + i + " είναι " + (((Lampa) fotistiko[i]).getkatastasi()?"αναµµένη":"σβηστή")); System.exit(0); //end main //end class 2.17 Μιγαδικοί και διερµηνευτής package migadikoi; public class Migadikos { //ιδιότητες µιγαδικού public double pragmat; //πραγµατικό µέρος public double fantast; //φανταστικό µέρος //κατασκευαστές public Migadikos (){ //κατασκευάζει 0+0i public Migadikos (double pra, double fan){ pragmat = pra; fantast = fan; public void setmigadikos(double pra, double fan) { pragmat = pra; fantast = fan; public String tostring() { return pragmat + (fantast >= 0? "+" : "") + fantast + "i";

18 Σελίδα 36 Ι. Γαβιώτης - Τεχνολογίες & Μεθοδολογίες Προγραµµατισµού II 11/3/2006 public double metro() { return Math.sqrt(pragmat * pragmat + fantast * fantast); public Migadikos syzyghs() { return new Migadikos(pragmat, - fantast); public void add(migadikos x, Migadikos y) { pragmat = x.pragmat + y.pragmat; fantast = x.fantast + y.fantast; public void subtract(migadikos x, Migadikos y) { pragmat = x.pragmat - y.pragmat; fantast = x.fantast - y.fantast; public void multiply(migadikos x, Migadikos y) { pragmat = x.pragmat * y.pragmat - x.fantast * y.fantast; fantast = x.pragmat * y.fantast + x.fantast * y.pragmat; public void divide(migadikos x, Migadikos y) { double temp = y.metro(); temp = temp * temp; Migadikos w = new Migadikos(); w.multiply(x, y.syzyghs()); pragmat = w.pragmat / temp; fantast = w.fantast / temp; //end class package migadikoi; import java.io.*; public class MigadikoiDemo { public static void main(string[] args) throws IOException { /* ιερµηνευτής διαταγών που διαβάζονται από την είσοδο και έχουν τη µορφή χαρακτήρων.*/ Migadikos x = new Migadikos(); Migadikos y = new Migadikos(); Migadikos z = new Migadikos(); BufferedReader stdin = new BufferedReader (new InputStreamReader(System.in)); char cin; //χαρακτήρας διαταγής ενέργειας double pra; double fan; do{ //επαναλάµβανε cin = readchar(stdin); switch (cin){ case 'X': pra = readnumber("πραγµατικό µέρος ", stdin); fan = readnumber("φανταστικό µέρος ", stdin); x.setmigadikos(pra, fan); break; case 'Y': pra = readnumber("πραγµατικό µέρος ", stdin); fan = readnumber("φανταστικό µέρος ", stdin); y.setmigadikos(pra, fan); break; case 'Z': System.out.println("X = " + x.tostring() + "\n" + "Y = " + y.tostring() + "\n" + "Z = " + z.tostring()); break; case '+': z.add(x,y); z.tostring(); break; case '-': z.subtract(x, y); z.tostring(); break; case '*': z.multiply(x, y); z.tostring(); break; case '/': z.divide(x,y); z.tostring(); break; case 'T': break; //Πιάσε το για να µην το θεωρήσει άγνωστη πράξη

19 11/3/2006 Ι. Γαβιώτης - Τεχνολογίες & Μεθοδολογίες Προγραµµατισµού II Σελίδα 37 default : System.out.println(printOdhgies()); //end switch while (cin!='t'); //end do - µέχρι System.out.println("Το πρόγραµµα τερµατίστηκε."); System.exit(0); //end main private static char readchar (BufferedReader stdin) throws IOException { /* ιαβάζει µια συµβολοσειρά από την είσοδο και επιστρέφει τον πρώτο της χαρακτήρα στα κεφαλαία. Αν η συµβολοσειρά είναι κενή, επιστρέφει #. */ System.out.print("Ενέργεια >"); System.out.flush(); String strin = stdin.readline().touppercase(); if (strin.equals("")) return '#'; else return Character.toUpperCase(strIn.charAt(0)); //end readchar private static double readnumber(string meros, BufferedReader stdin) throws IOException { System.out.print("Αριθµός (" + meros + ") >"); System.out.flush(); return Double.parseDouble(stdIn.readLine()); private static String printodhgies() { return "Πρέπει να εισάγεις ένα από τα:\n" + " X δίνει τιµή στον πρώτο µιγαδικό\n" + " Y δίνει τιµή στο δεύτερο µιγαδικό\n" + " Ζ τυπώνει τιµές των Χ, Υ και του αποτελέσµατος της πράξης που προηγήθηκε\n" + " +,-,*,/ εκτελεί την αντίστοιχη πράξη\n" + " Τ τερµατίζει το πρόγραµµα."; //end printodhgies //end class MigadikoiDemo 2.18 Γιατροί και ασθενείς (κληρονοµικότητα) public class Person { protected String onoma; //ορατά εδώ και στις υποκλάσεις της Person protected String hmgen; // ηµεροµηνια γέννησης public Person(String onoma, String hmgen) { //κατασκευαστής this.onoma = onoma; this.hmgen = hmgen; public String getonoma() { return this.onoma; //µόνον για ανάγνωση public String gethmgen() { return this.hmgen; // δεν υπάρχουν set - οι ιδιότητες του ασθενούς απαγορεύεται να αλλάξουν public String tostring() { return "Ον/νυµο: " + this.onoma + "\n" + // το this δεν είναι απαραίτητο "Ηµ.γένν: " + this.hmgen; // απλώς τονίζει ότι πρόκειται // για µεταβλητές στιγµιότυπου public class Giatros extends Person { protected String eidikotita; public Giatros(String onoma, String hmgen, String eidikotita) { super(onoma, hmgen); // καλεί τον κατασκευαστή της υπερκλάσης this.eidikotita = eidikotita; public String geteidikotita() { return eidikotita; public String tostring() { return "ΓΙΑΤΡΟΣ" + "\n" + super.tostring() + "\n" + "Ειδικότ: " + this.eidikotita;

20 Σελίδα 38 Ι. Γαβιώτης - Τεχνολογίες & Μεθοδολογίες Προγραµµατισµού II 11/3/2006 public class Asthenis extends Person { protected String tameio; protected String klinikh = ""; // συµπληρώνεται κατά την εισαγωγή protected boolean efyge = false; // γίνεται true όταν γίνει εξαγωγή public Asthenis(String onoma, String hmgen, String tameio) { super(onoma, hmgen); this.tameio = tameio; public String gettameio() { return this.tameio; public void settameio() { this.tameio = tameio; public String getklinikh() { return this.klinikh; public void eisagogiasthenoys(string klinikh) { if (this.efyge) System.out.println(" εν µπορει να γίνει εισαγωγή αφού ο ασθενής έχει φύγει"); else if (!this.klinikh.equals("")) System.out.println("Εχει εισαχθεί στην " + this.klinikh); else this.klinikh = klinikh; public void exagogiasthenoys() { if (this.klinikh.equals("")) System.out.println(" εν έχει εισαχθεί ακόµη"); else this.efyge = true; public String tostring() { return "ΑΣΘΕΝΗΣ" + "\n" + super.tostring() + "\n" + "Ταµείο: " + this.tameio + "\n" + "Κλινική: " + this.klinikh + "\n" + (this.efyge? "Έφυγε" : "Νοσηλεύεται"); public class AtomoDemo { public static void main(string[] args) { Person pers = new Person("Γιάννης Ιωάννου", "12/03/1970"); System.out.println(pers.toString()); Giatros giat = new Giatros("Πέτρος Βασιλείου", "18/02/1960", "Παιδίατρος"); System.out.println(giat.toString()); Asthenis ast = new Asthenis("Νικος Νικολάου", "03/06/1980", "ΙΚΑ"); ast.eisagogiasthenoys("ορθοπεδική"); System.out.println(ast); ast.exagogiasthenoys(); System.out.println(ast);

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

Κλάσεις και Αντικείµενα Κλάσεις και Αντικείµενα Γρηγόρης Τσουµάκας Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης Κλάσεις και Αντικείµενα 2 Τα αντικείµενα σε µια αντικειµενοστρεφή γλώσσα προγραµµατισµού, µοντελοποιούν

Διαβάστε περισσότερα

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

2.1 Αντικειµενοστρεφής προγραµµατισµός 2.1 Αντικειµενοστρεφής προγραµµατισµός Στον αντικειµενοστρεφή προγραµµατισµό (object oriented programming, OOP) ένα πρόγραµµα υπολογιστή είναι ένα σύνολο αλληλεπιδρώντων αντικειµένων. Μπορεί να ειπωθεί

Διαβάστε περισσότερα

public void printstatement() { System.out.println("Employee: " + name + " with salary: " + salary);

public void printstatement() { System.out.println(Employee:  + name +  with salary:  + salary); Κληρονομικότητα Η κληρονομικότητα (inheritance) αποτελεί έναν από τους χαρακτηριστικότερους μηχανισμούς των αντικειμενοστρεφών γλωσσών προγραμματισμού. Επιτρέπει την δημιουργία μιας νέας κλάσης απορροφώντας

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

Κλάσεις. Κατηγορίες Αντικειµένων. Κλάσεις. Φυσικά Αντικείµενα. Χώρος = Οµάδα Φυσικών Αντικειµένων. Πρόγραµµα = Οµάδα

Κλάσεις. Κατηγορίες Αντικειµένων. Κλάσεις. Φυσικά Αντικείµενα. Χώρος = Οµάδα Φυσικών Αντικειµένων. Πρόγραµµα = Οµάδα Αντικειµενοστραφής Προγραµµατισµός Αντικείµενα Ιεραρχία κλάσεων. Ιδιότητες Συµπεριφορά Ιδιότητες (Μεταβλητές) Συµπεριφορά (Μέθοδοι) Κληρονοµικότητα Μέθοδοι επικάλυψης Η χρήση του this και του super Αντικειµενοστραφής

Διαβάστε περισσότερα

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

3 Αλληλεπίδραση Αντικειμένων Αφαίρεση και Αρθρωσιμότητα 3 Αλληλεπίδραση Αντικειμένων Πώς συνεργάζονται τα αντικείμενα που δημιουργούμε Αφαίρεση (abstraction) είναι η δυνατότητα να αγνοούμε τις λεπτομέρειες και να εστιάζουμε την προσοχή

Διαβάστε περισσότερα

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

Αντικειµενοστρεφής Προγραµµατισµός 16 η διάλεξη Π. Σταθοπούλου pstath@ece.upatras.gr ή pstath@upatras.gr Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7 Φροντιστήριο : ευτέρα 11πµ-12πµ ΗΛ4 Προηγούµενη ιάλεξη

Διαβάστε περισσότερα

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Κλάσεις.

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Κλάσεις. 1 Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) ηµήτριος Κατσαρός, Ph.D. Χειµώνας 2005 ιάλεξη 5η Ιστοσελίδα του µαθήµατος 2 http://skyblue.csd.auth.gr/~dimitris/courses/cpp_fall05.htm Θα

Διαβάστε περισσότερα

Κεφάλαιο 10 ο Υποπρογράµµατα

Κεφάλαιο 10 ο Υποπρογράµµατα Κεφάλαιο 10 ο Υποπρογράµµατα Ανάπτυξη Εφαρµογών σε Προγραµµατιστικό Περιβάλλον Η αντιµετώπιση των σύνθετων προβληµάτων και η ανάπτυξη των αντίστοιχων προγραµµάτων µπορεί να γίνει µε την ιεραρχική σχεδίαση,

Διαβάστε περισσότερα

Βασικά της γλώσσας JAVA

Βασικά της γλώσσας JAVA 17 η διάλεξη Π. Σταθοπούλου pstath@ece.upatras.gr ή pstath@upatras.gr Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7 Φροντιστήριο : ευτέρα 11πµ-12πµ ΗΛ4 Προηγούµενη ιάλεξη

Διαβάστε περισσότερα

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

ΠΟΛΥΜΟΡΦΙΣΜΟΣ. 4.1 Κληρονομικότητα και Αρχή της Υποκατάστασης ΠΟΛΥΜΟΡΦΙΣΜΟΣ Λόγω της θεμελιώδους σημασίας της έννοιας του πολυμορφισμού (polymorphism) στην αντικειμενοστρεφή σχεδίαση, κρίνεται σκόπιμο στο σημείο αυτό του βιβλίου να αναλυθεί εκτενέστερα. Ο πολυμορφισμός

Διαβάστε περισσότερα

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

Αντικειµενοστραφής Προγραµµατισµός Κλάσεις Αντικειµενοστραφής Προγραµµατισµός Κλάσεις Αντικείµενα Ιεραρχία κλάσεων Κλάσεις. Ιδιότητες Συµπεριφορά Ιδιότητες (Μεταβλητές) Συµπεριφορά (Μέθοδοι) Κληρονοµικότητα Μέθοδοι επικάλυψης Η χρήση του

Διαβάστε περισσότερα

Wrapper Classes, Abstract Classes and Interfaces

Wrapper Classes, Abstract Classes and Interfaces Wrapper Classes, Abstract Classes and Interfaces Εβδοµάδα 3: Κλάσεις συσκευαστές, αφηρηµένες κλάσεις και διαπροσωπείες Αντικείµενα και µη-αντικείµενα Η Java παρέχει τύπους αντικειµένων και απλούς τύπους

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java Εξάμηνο Μάθημα Τίτλος 2017 2018 Εαρινό Αντικειμενοστραφής Προγραμματισμός Ι Ύλη εργαστηρίου, Ασκήσεις Java Ημερομηνία Εργαστήριο 5 ο Α. Ύλη εργαστηρίου 5.1 Έννοιες αντικειμενοστραφούς προγραμματισμού,

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι 1 ΕΙΣΑΓΩΓΗ Η γλώσσα προγραµµατισµού Java είναι ισχυρά τυποποιηµένη (strongly typed), που σηµαίνει ότι κάθε µεταβλητή και κάθε έκφραση έχει κάποιο τύπο, ο οποίος πρέπει να είναι γνωστός κατά το χρόνο της

Διαβάστε περισσότερα

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

Αντικειμενοστρεφής Προγραμματισμός Αντικειμενοστρεφής Προγραμματισμός Διδάσκουσα: Αναπλ. Καθηγήτρια Ανδριάνα Πρέντζα aprentza@unipi.gr Εργαστηριακός Συνεργάτης: Δρ. Βασιλική Κούφη vassok@unipi.gr Εργαστήριο 2 Βασικοί Τύποι Μεταβλητών Java

Διαβάστε περισσότερα

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) ηµήτριος Κατσαρός, Ph.D. Χειµώνας 2005 ιάλεξη 5η Ιστοσελίδα του µαθήµατος http://skyblue.csd.auth.gr/~dimitris/courses/cpp_fall05.htm Θα τοποθετούνται

Διαβάστε περισσότερα

Κλάσεις. Τροποποιητές, ιασυνδέσεις, Πακέτα. Τροποποιητές ελέγχου προσπέλασης µεταβλητών και µεθόδων

Κλάσεις. Τροποποιητές, ιασυνδέσεις, Πακέτα. Τροποποιητές ελέγχου προσπέλασης µεταβλητών και µεθόδων Κλάσεις Τροποποιητές, ιασυνδέσεις, Πακέτα Τροποποιητές ελέγχου προσπέλασης µεταβλητών και µεθόδων Υπάρχουν 4τροποποιητές: default, public, private, protected. Default: εν προηγείται τροποποιητής του ονόµατος

Διαβάστε περισσότερα

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

Διαγράμματα Κλάσεων στη Σχεδίαση Διαγράμματα Κλάσεων στη Σχεδίαση περιεχόμενα παρουσίασης Αφηρημένες κλάσεις Ιδιότητες Λειτουργίες Απλοί τύποι Συσχετίσεις Εξάρτηση Διεπαφές αφηρημένες κλάσεις Οι αφηρημένες κλάσεις δεν μπορούν να δημιουργήσουν

Διαβάστε περισσότερα

Αρχές Τεχνολογίας Λογισμικού Εργαστήριο

Αρχές Τεχνολογίας Λογισμικού Εργαστήριο Αρχές Τεχνολογίας Λογισμικού Εργαστήριο Κωδικός Μαθήματος: TP323 Ώρες Εργαστηρίου: 2/εβδομάδα (Διαφάνειες Νίκου Βιδάκη) 1 JAVA Inheritance Εβδομάδα Νο. 3 2 Προηγούμενο μάθημα (1/2) Τι είναι αντικείμενο?

Διαβάστε περισσότερα

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΑΝΑΠΤΥΞΗ ΚΑΙ ΣΧΕΔΙΑΣΗ ΛΟΓΙΣΜΙΚΟΥ Η γλώσσα προγραμματισμού C ΕΡΓΑΣΤΗΡΙΟ 2: Εκφράσεις, πίνακες και βρόχοι 14 Απριλίου 2016 Το σημερινό εργαστήριο

Διαβάστε περισσότερα

ΚΕΦΑΛΑΙΟ 7 ο. Έτσι ο προγραµµατισµός µε τη ΓΛΩΣΣΑ εστιάζεται στην ανάπτυξη του αλγορίθµου και τη µετατροπή του σε σωστό πρόγραµµα.

ΚΕΦΑΛΑΙΟ 7 ο. Έτσι ο προγραµµατισµός µε τη ΓΛΩΣΣΑ εστιάζεται στην ανάπτυξη του αλγορίθµου και τη µετατροπή του σε σωστό πρόγραµµα. ΚΕΦΑΛΑΙΟ 7 ο 1. Επιλογή της κατάλληλης γλώσσας προγραµµατισµού Εκατοντάδες γλώσσες προγραµµατισµού χρησιµοποιούνται όπως αναφέρθηκε σήµερα για την επίλυση των προβληµάτων µε τον υπολογιστή, τη δηµιουργία

Διαβάστε περισσότερα

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6 Ανασκόπηση Μια εφαρµογή Java είναι ένα σύνολο από συνεργαζόµενες κλάσεις Εβδοµάδα 2: Αντικείµενα, Κλάσεις και Μέθοδοι Εισαγωγή στον Προγραµµατισµό,,, Slide 1 Εισαγωγή στον Προγραµµατισµό,,, Slide 2 Ανασκόπηση:

Διαβάστε περισσότερα

ΑΕΠΠ Ερωτήσεις θεωρίας

ΑΕΠΠ Ερωτήσεις θεωρίας ΑΕΠΠ Ερωτήσεις θεωρίας Κεφάλαιο 1 1. Τα δεδομένα μπορούν να παρέχουν πληροφορίες όταν υποβάλλονται σε 2. Το πρόβλημα μεγιστοποίησης των κερδών μιας επιχείρησης είναι πρόβλημα 3. Για την επίλυση ενός προβλήματος

Διαβάστε περισσότερα

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι Εισαγωγή Στον Προγραµµατισµό «C» Πίνακες Πανεπιστήµιο Πελοποννήσου Τµήµα Πληροφορικής & Τηλεπικοινωνιών Νικόλαος Δ. Τσελίκας Νικόλαος Προγραµµατισµός Δ. Τσελίκας Ι Πίνακες στη C Ένας πίνακας στη C είναι

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

ΑΠΛΗ ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ

ΑΠΛΗ ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ Μηχανισµός υλοποίησης των σχέσεων γενίκευσης/εξειδίκευσης µεταξύ κλάσεων Η σχέση εξειδίκευσης «υποκλάση-της» (subclass-of)είναι γνωστή σαν σχέση «είναι ένα» (isa) ή «είναι ένα είδος» (ako:

Διαβάστε περισσότερα

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1 Κλάσεις στη Java Παύλος Εφραιμίδης Java Κλάσεις στη Java 1 Κλάσεις στην Java Θα δούμε τη διαδικασία δημιουργίας μιας κλάσης Θα υλοποιήσουμε μια κλάση για τη Δομή Δεδομένων Stack Java Κλάσεις στη Java 2

Διαβάστε περισσότερα

Κεφάλαιο 7 : Είδη, Τεχνικές, και Περιβάλλοντα Προγραµµατισµού

Κεφάλαιο 7 : Είδη, Τεχνικές, και Περιβάλλοντα Προγραµµατισµού ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ Κεφάλαιο 7 : Είδη, Τεχνικές, και Περιβάλλοντα Προγραµµατισµού ( Απαντήσεις & Λύσεις Βιβλίου) 1. Σκοποί κεφαλαίου Κύκλος ανάπτυξης προγράµµατος Κατηγορίες γλωσσών προγραµµατισµού

Διαβάστε περισσότερα

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack Κλάσεις στην Java Κλάσεις στη Java Παύλος Εφραιμίδης Θα δούμε τη διαδικασία δημιουργίας μιας κλάσης Θα υλοποιήσουμε μια κλάση για τη Δομή Δεδομένων Stack Java Κλάσεις στη Java 1 Java Κλάσεις στη Java 2

Διαβάστε περισσότερα

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

Κλάσεις και αντικείμενα #include <iostream.h< Κλάσεις και αντικείμενα #include class Person private: char name[30]; int age; public: void readdata() cout > name; cout > age; void

Διαβάστε περισσότερα

a = 10; a = k; int a,b,c; a = b = c = 10;

a = 10; a = k; int a,b,c; a = b = c = 10; C: Από τη Θεωρία στην Εφαρµογή Κεφάλαιο 4 ο Τελεστές Γ. Σ. Τσελίκης Ν. Δ. Τσελίκας Ο τελεστής εκχώρησης = Ο τελεστής = χρησιµοποιείται για την απόδοση τιµής (ή αλλιώς ανάθεση τιµής) σε µία µεταβλητή Π.χ.

Διαβάστε περισσότερα

class object Database Database Item Item [sub-typing and polymorphism] MusicCD Video MusicCD Video

class object Database Database Item Item [sub-typing and polymorphism] MusicCD Video MusicCD Video ιάγραµµα κλάσεων [Class diagram] Εβδοµάδα 2: Υπο-τύποι και πολυµορφισµός [sub-typing and polymorphism] Database Music Σχεδίαση-Ανάπτυξη Εφαρµογών Πληροφορικής Αντώνιος Συµβώνης, ΕΜΠ, Slide 1 Σχεδίαση-Ανάπτυξη

Διαβάστε περισσότερα

Πρόγραµµα 9.1 Πέρασµα δεδοµένων στην µνήµη

Πρόγραµµα 9.1 Πέρασµα δεδοµένων στην µνήµη 9.1 Γενικά Οι εφαρµογές που δηµιουργούνται από ένα προγραµµατιστή µπορούν ανά πασά στιγµή να καταρρεύσουν από κάποιο λάθος κατά την λειτουργία τους. Αυτές οι καταστάσεις συµβαίνουν από αµέλεια του προγραµµατιστή

Διαβάστε περισσότερα

Η στοίβα (stack) H στοίβα είναι ένας αποθηκευτικός χώρος οργανωµένος κατά τέτοιο τρόπο ώστε να υποστηρίζει δύο βασικές λειτουργίες:

Η στοίβα (stack) H στοίβα είναι ένας αποθηκευτικός χώρος οργανωµένος κατά τέτοιο τρόπο ώστε να υποστηρίζει δύο βασικές λειτουργίες: Άσκηση 5Α_5 26/3/2003 11.5. Άσκηση 5A - [αναγνώριση αντικειµένων-διάγραµµα κλάσεων] [Σε αντικατάσταση της άσκησης 5 του κεφαλαίου 11] 11.5.1. Περιγραφή Η άσκηση αυτή είναι η πρώτη από µία σειρά ασκήσεων

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

Ελληνικό Ανοικτό Πανεπιστήµιο. Βασικές έννοιες αντικειµενοστρεφούς τεχνολογίας. ρ. Πάνος Φιτσιλής

Ελληνικό Ανοικτό Πανεπιστήµιο. Βασικές έννοιες αντικειµενοστρεφούς τεχνολογίας. ρ. Πάνος Φιτσιλής 1 Ελληνικό Ανοικτό Πανεπιστήµιο Βασικές έννοιες αντικειµενοστρεφούς τεχνολογίας ρ. Πάνος Φιτσιλής Περιεχόµενα Βασικές έννοιες αντικειµενοστεφούς τρόπου ανάπτυξης Τι είναι κλάση Τι είναι αντικείµενο 2 Βασικές

Διαβάστε περισσότερα

(Διαφάνειες Νίκου Βιδάκη)

(Διαφάνειες Νίκου Βιδάκη) (Διαφάνειες Νίκου Βιδάκη) JAVA Inheritance Εβδομάδα Νο. 3 2 Προηγούμενο μάθημα (1/2) Τι είναι αντικείμενο? Ανάλυση αντικειμένων Πραγματικά αντικείμενα Καταστάσεις Συμπεριφορές Αντικείμενα στον προγραμματισμό

Διαβάστε περισσότερα

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΙΜΕΛΕΙΑ: ΜΑΡΙΑ Σ. ΖΙΩΓΑ ΚΑΘΗΓΗΤΡΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΘΕΩΡΙΑ 10 ΟΥ ΚΕΦΑΛΑΙΟΥ ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ 1. Πως ορίζεται ο τμηματικός προγραμματισμός; Τμηματικός προγραμματισμός

Διαβάστε περισσότερα

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

Αντικειμενοστραφής Προγραμματισμός Κλάσεις Αντικειμενοστραφής Προγραμματισμός Κλάσεις-Αντικείμενα Ένα παράδειγμα Συναρτήσεις κατασκευής (Constructors) Συνάρτηση καταστροφής (Destructor) Συναρτήσεις πρόσβασης (Access Functions) Συνάρτηση

Διαβάστε περισσότερα

J-GANNO. Σύντοµη αναφορά στους κύριους στόχους σχεδίασης και τα βασικά χαρακτηριστικά του πακέτου (προέκδοση 0.9Β, Φεβ.1998) Χάρης Γεωργίου

J-GANNO. Σύντοµη αναφορά στους κύριους στόχους σχεδίασης και τα βασικά χαρακτηριστικά του πακέτου (προέκδοση 0.9Β, Φεβ.1998) Χάρης Γεωργίου J-GANNO ΓΕΝΙΚΕΥΜΕΝΟ ΠΑΚΕΤΟ ΥΛΟΠΟΙΗΣΗΣ ΤΕΧΝΗΤΩΝ ΝΕΥΡΩΝΙΚΩΝ ΙΚΤΥΩΝ ΣΤΗ ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ JAVA Σύντοµη αναφορά στους κύριους στόχους σχεδίασης και τα βασικά χαρακτηριστικά του πακέτου (προέκδοση 0.9Β,

Διαβάστε περισσότερα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Constructors Μαθήματα από το lab Ένα πρόγραμμα αποτελείται από διάφορες κλάσεις και αντικείμενα αυτών των κλάσεων. Μία από τις κλάσεις

Διαβάστε περισσότερα

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

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2 Ανασκόπηση Μια εφαρμογή Java είναι ένα σύνολο από συνεργαζόμενες κλάσεις Διάλεξη #2: Αντικείμενα, Κλάσεις και Μέθοδοι Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό,, Slide 1 Εισαγωγή στον Αντικειμενοστρεφή

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Η/Υ (ΤΛ2007 ) Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε.Ι. Κρήτης Προγραμματισμός Η/Υ (ΤΛ2007 ) Δρ. Μηχ. Νικόλαος Πετράκης (npet@chania.teicrete.gr) Ιστοσελίδα Μαθήματος: https://eclass.chania.teicrete.gr/ Εξάμηνο: Εαρινό 2015-16

Διαβάστε περισσότερα

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα ΝΗΜΑΤΑ ΣΤΗ JAVA (1) Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα πρόγραµµα. Αιτία Η δυνατότητα αποµόνωσης (ή αυτονόµησης) κάποιων

Διαβάστε περισσότερα

Λογισµικό (Software SW) Γλώσσες

Λογισµικό (Software SW) Γλώσσες Λογισµικό (Software SW) Γλώσσες Προγραµµατισµού Οι γενιές των γλωσσών προγραµµατισµού Προβλήµατα που επιλύονται σε ένα περιβάλλον στο οποίο ο άνθρωπος πρέπει να προσαρµόζεται στα χαρακτηριστικά της µηχανής

Διαβάστε περισσότερα

Προγραµµατισµός Η/Υ. Μέρος2

Προγραµµατισµός Η/Υ. Μέρος2 Προγραµµατισµός Η/Υ Μέρος2 Περιεχόμενα Επανάληψη Βασικών Σύμβολων Διαγραμμάτων Ροής Αλγόριθμος Ψευδοκώδικας Παραδείγματα Αλγορίθμων Γλώσσες προγραμματισμού 2 Επανάληψη Βασικών Σύμβολων Διαγραμμάτων Ροής

Διαβάστε περισσότερα

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

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η μέθοδος main(), εμφάνιση μηνυμάτων, Java προγράμματα που εκτελούν αριθμητικές πράξεις Γαβαλάς Δαμιανός

Διαβάστε περισσότερα

Μέθοδοι. Μέθοδοι ηµιουργοί, Υπερφόρτωση και Υπέρβαση Μεθόδων

Μέθοδοι. Μέθοδοι ηµιουργοί, Υπερφόρτωση και Υπέρβαση Μεθόδων Μέθοδοι Μέθοδοι ηµιουργοί, Υπερφόρτωση και Υπέρβαση Μεθόδων Μέθοδοι Οιµέθοδοικαθορίζουντηνσυµπεριφοράενόςαντικειµένου. Τα βασικά µέρη από τα οποία αποτελείται µία µέθοδος είναι τα εξής: Το όνοµα της µεθόδου

Διαβάστε περισσότερα

Κεφάλαιο 5ο: Εντολές Επανάληψης

Κεφάλαιο 5ο: Εντολές Επανάληψης Χρήστος Τσαγγάρης ΕΕ ΙΠ Τµήµατος Μαθηµατικών, Πανεπιστηµίου Αιγαίου Κεφάλαιο 5ο: Εντολές Επανάληψης Η διαδικασία της επανάληψης είναι ιδιαίτερη συχνή, αφού πλήθος προβληµάτων µπορούν να επιλυθούν µε κατάλληλες

Διαβάστε περισσότερα

ΚΕΦΑΛΑΙΟ 10 ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

ΚΕΦΑΛΑΙΟ 10 ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ ΚΕΦΑΛΑΙΟ 10 Όπως είδαμε και σε προηγούμενο κεφάλαιο μια από τις βασικότερες τεχνικές στον Δομημένο Προγραμματισμό είναι ο Τμηματικός Προγραμματισμός. Τμηματικός προγραμματισμός ονομάζεται η τεχνική σχεδίασης

Διαβάστε περισσότερα

Α. Ερωτήσεις Ανάπτυξης

Α. Ερωτήσεις Ανάπτυξης οµηµένος Προγραµµατισµός-Κεφάλαιο 7 Σελίδα 1 α ό 10 ΕΝΟΤΗΤΑ ΙΙΙ (ΠΡΟΓΡΑΜΜΑΤΑ) ΚΕΦΑΛΑΙΟ 7: Είδη, Τεχνικές και Περιβάλλοντα Προγραµµατισµού Α. Ερωτήσεις Ανάπτυξης 1. Τι ονοµάζουµε γλώσσα προγραµµατισµού;

Διαβάστε περισσότερα

ΚΕΦΑΛΑΙΟ 7 ΕΙ Η, ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΚΕΦΑΛΑΙΟ 7 ΕΙ Η, ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΚΕΦΑΛΑΙΟ 7 ΕΙ Η, ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ 7.1. Ανάπτυξη Προγράµµατος Τι είναι το Πρόγραµµα; Το Πρόγραµµα: Είναι ένα σύνολο εντολών για την εκτέλεση ορισµένων λειτουργιών από τον υπολογιστή.

Διαβάστε περισσότερα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Αναφορές Μαθήματα από το lab Υπενθύμιση: Η άσκηση ζητούσε να υλοποιήσετε μία κλάση vector που να διαχειρίζεται διανύσματα οποιουδήποτε

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

Διάλεξη 16-17: Πολυμορφισμός (Polymorphism) Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 16-17: Πολυμορφισμός (Polymorphism) Διδάσκων: Παναγιώτης Ανδρέου Διάλεξη 16-17: Πολυμορφισμός (Polymorphism) Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: -Υπερφόρτωση (Overloading), Μεθόδων (Method Overloading), Τελεστών (Operator Overloading (C++, C#))

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι new Όπως είδαμε για να δημιουργήσουμε ένα αντικείμενο χρειάζεται να καλέσουμε τη new. Για τον πίνακα είπαμε ότι

Διαβάστε περισσότερα

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

2.1. Εντολές. 2.2. Σχόλια. 2.3. Τύποι Δεδομένων 2 Βασικές Εντολές 2.1. Εντολές Οι στην Java ακολουθούν το πρότυπο της γλώσσας C. Έτσι, κάθε εντολή που γράφουμε στη Java θα πρέπει να τελειώνει με το ερωτηματικό (;). Όπως και η C έτσι και η Java επιτρέπει

Διαβάστε περισσότερα

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

Αντικειμενοστρεφής Προγραμματισμός Αντικειμενοστρεφής Προγραμματισμός Διδάσκουσα: Αναπλ. Καθηγήτρια Ανδριάνα Πρέντζα aprentza@unipi.gr Εργαστηριακός Συνεργάτης: Δρ. Βασιλική Κούφη vassok@unipi.gr Περιεχόμενα Java Classes Java Objects Java

Διαβάστε περισσότερα

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

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #12 Διάγραμμα κλάσεων [Class diagram] Διάλεξη #12: Υπο-τύποι και πολυμορφισμός [sub-typing and polymorphism] Database Music Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό,, Slide 1 Εισαγωγή στον Αντικειμενοστρεφή

Διαβάστε περισσότερα

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C# Εισαγωγή σε αντικειμενοστραφή concepts Και λίγη C# Κλάσεις Κλάση: τύπος δεδομένων που αποτελεί συλλογή πεδίων, ορισμών συναρτήσεων/μεθόδων και ορισμών άλλων τύπων δεδομένων. Αντίστοιχο σκεπτικό με struct

Διαβάστε περισσότερα

scanf() scanf() stdin scanf() printf() int float double %lf float

scanf() scanf() stdin scanf() printf() int float double %lf float Εισαγωγή Στον Προγραµµατισµό «C» Είσοδος Δεδοµένων Πανεπιστήµιο Πελοποννήσου Τµήµα Πληροφορικής & Τηλεπικοινωνιών Νικόλαος Δ. Τσελίκας Νικόλαος Προγραµµατισµός Δ. Τσελίκας Ι Η συνάρτηση scanf() Η συνάρτηση

Διαβάστε περισσότερα

Σύνθεση και Κληρονομικότητα

Σύνθεση και Κληρονομικότητα Σύνθεση και Κληρονομικότητα Σύνθεση (composition) Κληρονομικότητα (inheritance) Υπερφόρτωση κληρονομημένων μελών Εικονικές συναρτήσεις και Πολυμορφισμός Αφηρημένες (abstract) βασικές κλάσεις 1 Σύνθεση

Διαβάστε περισσότερα

Δομημένος Προγραμματισμός

Δομημένος Προγραμματισμός ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Δομημένος Προγραμματισμός Ενότητα: Συναρτήσεις θεωρία Δ. Ε. Μετάφας Τμ. Ηλεκτρονικών Μηχ. Τ.Ε. Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

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

Εισαγωγή στον Προγ/μό Η/Υ Εισαγωγή στον Προγ/μό Η/Υ Ενότητα 7 2ο μέρος: Επιπλέον έννοιες σχετικά με αντικείμενα Διδάσκων: Μιχάλης Τίτσιας Περιεχόμενα Τι μπορεί να περιέχει μια τάξη Μέθοδοι τάξης και σταθερές τάξης Πολυμορφισμός

Διαβάστε περισσότερα

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο C: Από τη Θεωρία στην Εφαρµογή Κεφάλαιο 2 ο Τύποι Δεδοµένων Δήλωση Μεταβλητών Έξοδος Δεδοµένων Γ. Σ. Τσελίκης Ν. Δ. Τσελίκας Μνήµη και Μεταβλητές Σχέση Μνήµης Υπολογιστή και Μεταβλητών Η µνήµη (RAM) ενός

Διαβάστε περισσότερα

Προγραµµατιστικές τεχνικές

Προγραµµατιστικές τεχνικές Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Αγρονόµων Τοπογράφων Μηχανικών Προγραµµατιστικές τεχνικές Βασίλειος Βεσκούκης ρ. Ηλεκτρολόγος Μηχανικός & Μηχανικός Υπολογιστών ΕΜΠ v.vescoukis@cs.ntua.gr Ρωµύλος Κορακίτης

Διαβάστε περισσότερα

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL 8.1. Εισαγωγή ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PACAL Πως προέκυψε η γλώσσα προγραμματισμού Pascal και ποια είναι τα γενικά της χαρακτηριστικά; Σχεδιάστηκε από τον Ελβετό επιστήμονα της Πληροφορικής Nicklaus Wirth to

Διαβάστε περισσότερα

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

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #13 Wrapper Classes, Abstract Classes and Interfaces Διάλεξη #13: Μεταβλητές/μέθοδοι κλάσης, αφηρημένες κλάσεις και διαπροσωπείες Μεταβλητές /πεδία κλάσης [class variables] Τα αντικείμενα ανήκουν σε κλάσεις

Διαβάστε περισσότερα

Εργαστήριο 02: Προγραμματισμός με Γενικούς Τύπους (JAVA Generics) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι

Εργαστήριο 02: Προγραμματισμός με Γενικούς Τύπους (JAVA Generics) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι Εργαστήριο 02: Προγραμματισμός με Γενικούς Τύπους (JAVA Generics) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 1 Generic Types Τα Generics έχουν προστεθεί στη JAVA από το 2004 ως μέρος του J2SE 5.0 Με τη χρήση

Διαβάστε περισσότερα

ΑΡΦΕ ΑΝΣΙΚΕΙΜΕΝΟΣΡΕΥΟΤ ΠΡΟΓΡΑΜΜΑΣΙΜΟΤ. Ιωάννης Φατζηλυγερούδης Αναπληρωτής Καθηγητής Τμήμα Μηχ/κών Η/Υ και Πληροφορικής Πανεπιστήμιο Πατρών

ΑΡΦΕ ΑΝΣΙΚΕΙΜΕΝΟΣΡΕΥΟΤ ΠΡΟΓΡΑΜΜΑΣΙΜΟΤ. Ιωάννης Φατζηλυγερούδης Αναπληρωτής Καθηγητής Τμήμα Μηχ/κών Η/Υ και Πληροφορικής Πανεπιστήμιο Πατρών ΑΡΦΕ ΑΝΣΙΚΕΙΜΕΝΟΣΡΕΥΟΤ ΠΡΟΓΡΑΜΜΑΣΙΜΟΤ Ιωάννης Φατζηλυγερούδης Αναπληρωτής Καθηγητής Τμήμα Μηχ/κών Η/Υ και Πληροφορικής Πανεπιστήμιο Πατρών ΜΟΡΥΕ ΠΡΟΓΡΑΜΜΑΣΙΜΟΤ Διαδικασιακός ή Διαδικαστικός (Procedural)

Διαβάστε περισσότερα

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) 1 Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) ηµήτριος Κατσαρός, Ph.D. Χειµώνας 2005 ιάλεξη 4η 2 Ιστοσελίδα του µαθήµατος http://skyblue.csd.auth.gr/~dimitris/courses/cpp_fall05.htm Θα

Διαβάστε περισσότερα

for for for for( . */

for for for for( . */ Εισαγωγή Στον Προγραµµατισµό «C» Βρόχοι Επανάληψης Πανεπιστήµιο Πελοποννήσου Τµήµα Πληροφορικής & Τηλεπικοινωνιών Νικόλαος Δ. Τσελίκας Νικόλαος Προγραµµατισµός Δ. Τσελίκας Ι Ο βρόχος for Η εντολή for χρησιµοποιείται

Διαβάστε περισσότερα

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Στοιχειώδεις Δοµές Δεδοµένων Δοµικά Στοιχεία και Πίνακες Κεφάλαιο 3 (3.1 και 3.2) Ε. Μαρκάκης Επικ. Καθηγητής

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Στοιχειώδεις Δοµές Δεδοµένων Δοµικά Στοιχεία και Πίνακες Κεφάλαιο 3 (3.1 και 3.2) Ε. Μαρκάκης Επικ. Καθηγητής ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Στοιχειώδεις Δοµές Δεδοµένων Δοµικά Στοιχεία και Πίνακες Κεφάλαιο 3 (3.1 και 3.2) Ε. Μαρκάκης Επικ. Καθηγητής Περίληψη Δοµικά στοιχεία Πίνακες Το κόσκινο του Ερατοσθένη Αντιγραφή πινάκων

Διαβάστε περισσότερα

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος 2011-2012. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος 2011-2012. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Δυναμική Διαχείριση Μνήμης Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2011-2012 Ανάγκη για Δυναμική Μνήμη Στατική Μνήμη Μέχρι τώρα χρησιμοποιούσαμε

Διαβάστε περισσότερα

ΥΠΟΛΟΓΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ ΓΙΑ ΣΥΣΤΗΜΑΤΑ ΜΕΤΑΔΟΣΗΣ ΠΛΗΡΟΦΟΡΙΑΣ

ΥΠΟΛΟΓΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ ΓΙΑ ΣΥΣΤΗΜΑΤΑ ΜΕΤΑΔΟΣΗΣ ΠΛΗΡΟΦΟΡΙΑΣ ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΥΠΟΛΟΓΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ ΓΙΑ ΣΥΣΤΗΜΑΤΑ ΜΕΤΑΔΟΣΗΣ ΠΛΗΡΟΦΟΡΙΑΣ Αντικειμενοστραφής προγραμματισμός Web Sites:

Διαβάστε περισσότερα

Δομές Ακολουθίας- Επιλογής - Επανάληψης. Δομημένος Προγραμματισμός

Δομές Ακολουθίας- Επιλογής - Επανάληψης. Δομημένος Προγραμματισμός Δομές Ακολουθίας- Επιλογής - Επανάληψης Δομημένος Προγραμματισμός 1 Βασικές Έννοιες αλγορίθμων Σταθερές Μεταβλητές Εκφράσεις Πράξεις Εντολές 2 Βασικές Έννοιες Αλγορίθμων Σταθερά: Μια ποσότητα που έχει

Διαβάστε περισσότερα

Πληροφοριακά Συστήματα Διοίκησης Ενότητα 1: Βασικές Αρχές Αντικειμενοστραφούς Σχεδίασης Συστημάτων και Εφαρμογών (1ο Μέρος)

Πληροφοριακά Συστήματα Διοίκησης Ενότητα 1: Βασικές Αρχές Αντικειμενοστραφούς Σχεδίασης Συστημάτων και Εφαρμογών (1ο Μέρος) Πληροφοριακά Συστήματα Διοίκησης Ενότητα 1: Βασικές Αρχές Αντικειμενοστραφούς Σχεδίασης Συστημάτων και Εφαρμογών (1ο Μέρος) Γρηγόριος Μπεληγιάννης Σχολή Οργάνωσης και Διοίκησης Επιχειρήσεων Τμήμα Διοίκησης

Διαβάστε περισσότερα

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ. Κάθε υποπρόγραμμα έχει μόνο μία είσοδο και μία έξοδο. Κάθε υποπρόγραμμα πρέπει να είναι ανεξάρτητο από τα άλλα.

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ. Κάθε υποπρόγραμμα έχει μόνο μία είσοδο και μία έξοδο. Κάθε υποπρόγραμμα πρέπει να είναι ανεξάρτητο από τα άλλα. ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ Τμηματικός προγραμματισμός ονομάζεται η τεχνική σχεδίασης και ανάπτυξης των προγραμμάτων ως ένα σύνολο από απλούστερα τμήματα προγραμμάτων. Όταν ένα τμήμα προγράμματος επιτελεί ένα αυτόνομο

Διαβάστε περισσότερα

Περιεχόµενα. Ανασκόπηση - Ορισµοί. Ο κύκλος ανάπτυξης προγράµµατος. Γλώσσες Προγραµµατισµού Ασκήσεις

Περιεχόµενα. Ανασκόπηση - Ορισµοί. Ο κύκλος ανάπτυξης προγράµµατος. Γλώσσες Προγραµµατισµού Ασκήσεις Προγραµµατισµός Η/Υ Ανασκόπηση - Ορισµοί Περιεχόµενα Ο κύκλος ανάπτυξης προγράµµατος Περιγραφή προβλήµατος Ανάλυση προβλήµατος Λογικό ιάγραµµα Ψευδοκώδικας Κωδικοποίηση Συντήρηση Γλώσσες Προγραµµατισµού

Διαβάστε περισσότερα

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal 1 ο Μέρος σηµειώσεων (Ενότητες 8.1 & 8.2 σχολικού βιβλίου)

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal 1 ο Μέρος σηµειώσεων (Ενότητες 8.1 & 8.2 σχολικού βιβλίου) ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal 1 ο Μέρος σηµειώσεων (Ενότητες 8.1 & 8.2 σχολικού βιβλίου) 1. Εισαγωγή Χαρακτηριστικά της γλώσσας Τύποι δεδοµένων Γλώσσα προγραµµατισµού

Διαβάστε περισσότερα

Δομημένος Προγραμματισμός (ΤΛ1006)

Δομημένος Προγραμματισμός (ΤΛ1006) Τεχνολογικό Εκπαιδευτικό Ίδρυμα Κρήτης Σχολή Εφαρμοσμένων Επιστημών Τμήμα Ηλεκτρονικών Μηχανικών Τομέας Αυτοματισμού και Πληροφορικής Δομημένος Προγραμματισμός (ΤΛ1006) Δρ. Μηχ. Νικόλαος Πετράκης, Καθηγητής

Διαβάστε περισσότερα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Constructors, equals, tostring Constructors (Δημιουργοί) O Constructor είναι μια «μέθοδος» η οποία καλείται όταν δημιουργούμε το αντικείμενο

Διαβάστε περισσότερα

Προβλήματα, αλγόριθμοι, ψευδοκώδικας

Προβλήματα, αλγόριθμοι, ψευδοκώδικας Προβλήματα, αλγόριθμοι, ψευδοκώδικας October 11, 2011 Στο μάθημα Αλγοριθμική και Δομές Δεδομένων θα ασχοληθούμε με ένα μέρος της διαδικασίας επίλυσης υπολογιστικών προβλημάτων. Συγκεκριμένα θα δούμε τι

Διαβάστε περισσότερα

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Περισσότερα για τις Κλάσεις, τα Αντικείμενα και τις Μεθόδους

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Περισσότερα για τις Κλάσεις, τα Αντικείμενα και τις Μεθόδους ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός Παναγιώτης Σφέτσος sfetsos@it.teithe.gr Περισσότερα για τις Κλάσεις, τα Αντικείμενα και τις Μεθόδους Σύνοψη των βασικών λειτουργιών

Διαβάστε περισσότερα

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

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Συναρτήσεις Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Συναρτήσεις Ως τώρα γράφαμε όλα τα προγράμματα μας μέσα στην main..1

Διαβάστε περισσότερα

Παύλος Εφραιµίδης. Java. Κληρονοµικότητα

Παύλος Εφραιµίδης. Java. Κληρονοµικότητα κληρονοµικότητα Παύλος Εφραιµίδης 1 ιεραρχίες κλάσεων Στην (και γενικότερα στον αντικειµενοστρεφή προγραµµατισµό) µπορεί από µία κλάση να δηµιουργηθεί µια νέα κλάση απόγονος που κληρονοµεί όλα τα χαρακτηριστικά

Διαβάστε περισσότερα

2.2.3 Η εντολή Εκτύπωσε

2.2.3 Η εντολή Εκτύπωσε 2.2.3 Η εντολή Εκτύπωσε Η εντολή Εκτύπωσε χρησιµοποιείται προκειµένου να εµφανίσουµε κάτι στην οθόνη του υπολογιστή. Για τον λόγο αυτό ονοµάζεται και εντολή εξόδου. Ισοδύναµα µπορεί να χρησιµοποιηθεί και

Διαβάστε περισσότερα

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7 Π. Σταθοπούλου pstath@ece.upatras.gr ή pstath@upatras.gr Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7 Φροντιστήριο : ευτέρα 11πµ-12πµ ΗΛ4 Προηγούµενη ιάλεξη Προτάσεις,

Διαβάστε περισσότερα

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

Ανάλυση Πληροφοριακών Συστημάτων. Εαρινό Εξάμηνο Lec08 09/04/2019 Διδάσκων: Γεώργιος Χρ. Μακρής Ανάλυση Πληροφοριακών Συστημάτων Εαρινό Εξάμηνο 2018-2019 Lec08 09/04/2019 Διδάσκων: Γεώργιος Χρ. Μακρής Διαγράμματα Κλάσεων Τα βασικά στοιχεία Διαλέξεις παρουσιάσεις Το υλικό του μαθήματος στηρίζεται

Διαβάστε περισσότερα

επιµέλεια Θοδωρής Πιερράτος

επιµέλεια Θοδωρής Πιερράτος Βασικές έννοιες προγραµµατισµού Η ύλη που αναπτύσσεται σε αυτό το κεφάλαιο είναι συναφής µε την ύλη που αναπτύσσεται στο 2 ο κεφάλαιο. Όπου υπάρχουν διαφορές αναφέρονται ρητά. Προσέξτε ιδιαίτερα, πάντως,

Διαβάστε περισσότερα

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

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07 ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07 Αριθμητική στο δυαδικό σύστημα (γενικά) Συμπληρωματικά για δυαδικό σύστημα Η πρόσθεση στηρίζεται στους κανόνες: 0 + 0 = 0, 0 + 1 = 1, 1

Διαβάστε περισσότερα

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

FORTRAN και Αντικειμενοστραφής Προγραμματισμός FORTRAN και Αντικειμενοστραφής Προγραμματισμός Παραδόσεις Μαθήματος 2016 Δρ Γ Παπαλάμπρου Επίκουρος Καθηγητής ΕΜΠ georgepapalambrou@lmentuagr Εργαστήριο Ναυτικής Μηχανολογίας (Κτίριο Λ) Σχολή Ναυπηγών

Διαβάστε περισσότερα

Κληρονομικότητα. Παύλος Εφραιμίδης pefraimi <at> ee.duth.gr. Java Κληρονομικότητα 1

Κληρονομικότητα. Παύλος Εφραιμίδης pefraimi <at> ee.duth.gr. Java Κληρονομικότητα 1 Κληρονομικότητα Παύλος Εφραιμίδης pefraimi ee.duth.gr Java Κληρονομικότητα 1 Ιεραρχίες Κλάσεων Στην Java (και γενικότερα στον αντικειμενοστραφή προγραμματισμό) μπορεί από μία να κλάση να δημιουργηθεί

Διαβάστε περισσότερα

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

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Πίνακες Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Πίνακες Πολλές φορές θέλουμε να κρατήσουμε στην μνήμη πολλά αντικείμενα

Διαβάστε περισσότερα