Ειδικά Θέµατα Μουσικού Προγραµµατισµού

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

Download "Ειδικά Θέµατα Μουσικού Προγραµµατισµού"

Transcript

1 Τµήµα Μουσικής Τεχνολογίας & Ακουστικής Παράρτηµα Ρεθύµνου Τ.Ε.Ι. Κρήτης Σηµειώσεις Μαθήµατος Ειδικά Θέµατα Μουσικού Προγραµµατισµού Χρυσούλα Αλεξανδράκη - Ρέθυµνο 2009

2 Πρόλογος Οι σηµειώσεις αυτές αποτελούν εκπαιδευτικό βοήθηµα του µαθήµατος «Ειδικά Θέµατα Μουσικού Προγραµµατισµού» (ΕΤΜΠ) του Προγράµµατος Σπουδών του Τµήµατος Μουσικής Τεχνολογίας & Ακουστικής (ΜΤΑ) του Παραρτήµατος Ρεθύµνου του Τ.Ε.Ι. Κρήτης. Το µάθηµα ΕΤΜΠ διδάσκεται κατά το τελευταίο εξάµηνο σπουδών και ανήκει στην οµάδα των µαθηµάτων που χαρακτηρίζονται ως «Επιλογής Υποχρεωτικά» (ΕΥ). Κατά συνέπεια, το αντικείµενο αυτού του µαθήµατος δεν θεωρείται υποχρεωτική γνώση για τους αποφοίτους του τµήµατος ΜΤΑ, αλλά χαρακτηρίζεται ως προαιρετική γνώση και απευθύνεται σε φοιτητές που ενδιαφέρονται να αποκτήσουν εξειδικευµένη γνώση στην περιοχή του προγραµµατισµού σηµάτων ήχου (Audio Programming) και του µουσικού προγραµµατισµού (Music Programming). Στα πλαίσια της διδασκαλίας προγραµµατισµού σηµάτων ήχου και µουσικής, γίνεται υλοποίηση ενδεικτικών προγραµµάτων κατά τη διάρκεια του εξαµήνου µε τη γλώσσα προγραµµατισµού Java. Η επιλογή της Java στη διδασκαλία του συγκεκριµένου µαθήµατος οφείλεται στο γεγονός ότι η γλώσσα αυτή είναι ευρέως διαδεδοµένη στις σύγχρονες τεχνολογίες, είναι διαλειτουργική και φορητή σε ποικίλες συσκευές και λειτουργικά συστήµατα, είναι ευκολότερα προσεγγίσιµη από τον αρχάριο προγραµµατιστή σε σχέση µε άλλες γλώσσες προγραµµατισµού, ενώ επιπρόσθετα παρέχει σύγχρονα προγραµµατιστικά εργαλεία τα οποία ανταποκρίνονται στις υψηλές απαιτήσεις σε ταχύτητα επεξεργασίας και χρονισµό που έχει το λογισµικό αναπαραγωγής, λήψης και η επεξεργασίας ηχητικών σηµάτων. Ως παράδειγµα τέτοιου εργαλείου στα πλαίσια του µαθήµατος ΕΤΜΠ, διδάσκεται η προγραµµατιστική βιβλιοθήκη JSyn API. Ως προαπαιτούµενη γνώση για το µάθηµα ΕΤΜΠ θεωρούνται οι βασικές αρχές διαδικαστικού προγραµµατισµού (procedural programming) καθώς και κάποιες βασικές γνώσεις της σύνταξης εντολών στη γλώσσα προγραµµατισµού C. Τελικός στόχος του µαθήµατος ΕΤΜΠ είναι να προετοιµάσει και να δώσει τα απαραίτητα εφόδια στους φοιτητές του τµήµατος ΜΤΑ που ενδιαφέρονται να ασχοληθούν επαγγελµατικά µε την ανάπτυξη λογισµικού το οποίο περιλαµβάνει ήχο και µουσική. Τµήµα Μουσικής Τεχνολογίας & Ακουστικής Τ.Ε.Ι. Κρήτης 2

3 Πίνακας Περιεχοµένων 1 Εισαγωγή Ανάπτυξη λογισµικού Γλώσσες προγραµµατισµού ιαδικασιοστρεφής και αντικειµενοστραφής προγραµµατισµός Γλώσσες υψηλού επιπέδου και γλώσσες χαµηλού επιπέδου Μεταγλωττιζόµενες και διερµηνευόµενες γλώσσες Η γλώσσα Java Γιατί η Java είναι ανεξάρτητη πλατφόρµας Εφαρµογές της Java Υλοποίηση αυτόνοµου προγράµµατος στη Java Συγγραφή πηγαίου κώδικα (coding) Μεταγλώττιση (compiling) Εκτέλεση (running) Εκσφαλµάττωση (debugging) Εξέταση του πηγαίου κώδικα Το εξωτερικό µπλοκ Η εντολή της εκτύπωσης Το όρισµα της συνάρτησης main Προσθήκη σχολίων Άσκηση Το eclipse IDE Η γραφική διεπαφή χρήστη Οι έννοιες project και workspace Αντικειµενοστραφής προγραµµατισµός στη java Τύποι Μεταβλητών Αντικείµενα και κλάσεις οµή µιας κλάσης Μεταβλητές ήλωση µεταβλητών και αρχικές τιµές Εµβέλεια µεταβλητών (variable scope) Στατικές µεταβλητές και µεταβλητές στιγµιότυπου Σταθερές Μέθοδοι Τµήµα Μουσικής Τεχνολογίας & Ακουστικής Τ.Ε.Ι. Κρήτης 3

4 Υλοποίηση και κλίση µεθόδων Στατικές Μέθοδοι Η κλάση Math Υπερφόρτωση µεθόδου Μέθοδοι κατασκευαστές (constructor methods) Κύκλος ζωής αντικειµένων Μεταβλητές τύπου αναφοράς Αποκοµιδή απορριµµάτων Άσκηση Επαναχρησιµοποίηση κλάσεων Σύνθεση κλάσεων (η σχέση has-a) Κληρονοµικότητα κλάσεων (σχέση is-a) Αρχικοποίηση της βασικής κλάσης και των παραγώγων της Τροποποίηση τύπου (Casting) Τροποποίηση τύπου σε αρχέτυπα Τροποποίηση τύπου σε αντικείµενα Υπερκάλυψη Μεθόδου Αφηρηµένες Κλάσεις (Abstract Classes) Πολυµορφισµός Η κλάση Object Η µέθοδος equals Πακέτα Το πακέτο java.lang Τύποι πρόσβασης Άσκηση Applets Υλοποίηση ενός applet Εκτέλεση ενός applet Με τον appletviewer Με web browser Κύκλος ζωής ενός applet Προσθήκη γραφικών στοιχείων Κουµπιά ελέγχου H κλάση java.awt.canvas και η µέθοδος paint() Άσκηση Γεγονότα (events) Interfaces Πάτηµα κουµπιών ελέγχου... 72

5 7.3 Χειρισµός γεγονότων ποντικιού (mouse events) Μεθοδολογία προγραµµατισµού γεγονότων Άσκηση Η βιβλιοθήκη JSyn Βιβλιογραφία Αναφορές Παράρτηµα Α: Κανονισµός µαθήµατος ΕΤΜΠ Παράρτηµα Β: Εγκατάσταση Περιβάλλοντος για την ανάπτυξη εφαρµογών Παράρτηµα Γ: Αρχές καλής πρακτικής στη συγγραφή κώδικα ή πώς να κάνετε τον κώδικά σας ευανάγνωστο Παράρτηµα : Προγραµµατιστικές βιβλιοθήκες για των προγραµµατισµό ήχου και µουσικής µε τη γλώσσα JAVA... 84

6 1 Εισαγωγή 1.1 Ανάπτυξη λογισµικού Ο όρος «ανάπτυξη λογισµικού» (software development) αναφέρεται στην όλη διαδικασία µετατροπής ενός υπολογιστικού προβλήµατος σε εφαρµογή εκτελούµενη από υπολογιστή. Συνολικά η ανάπτυξη λογισµικού αποτελείται από πέντε φάσεις: Ανάλυση (Analysis): Κατά τη φάση αυτή αναλύεται το πρόβληµα και οι λειτουργίες που πρέπει να ακολουθηθούν για την επίλυσή του. Σχεδιασµός (Design): Κατά το σχεδιασµό καθορίζεται η δοµή του προγράµµατος καθώς και οι λειτουργίες που αυτό θα επιτελεί. Αναζητούνται οι υποµονάδες του συστήµατος (modules), ο ρόλος τους στο συνολικό πρόγραµµα καθώς και ο τρόπος µε τον οποίο επικοινωνούν µεταξύ τους. Υλοποίηση (Implementation): Κατά τη φάση αυτή επιλέγεται η γλώσσα προγραµµατισµού και τα προγραµµατιστικά εργαλεία που θα χρησιµοποιηθούν και γίνεται η κατασκευή του τελικού προγράµµατος. Έλεγχος (Testing): Ελέγχεται το πρόγραµµα που έχει προκύψει από τη φάση της υλοποίησης για πιθανά σφάλµατα και δυσλειτουργίες. Συντήρηση (Maintenance): Η συντήρηση γίνεται αφότου αναπτυχθεί και ενώ γίνεται χρήση του τελικού προϊόντος. Η συντήρηση αυτή αφορά σε ενηµέρωση δεδοµένων, αναβαθµίσεις του προγράµµατος κ.α. Εικόνα 1-1: Τα στάδια του κύκλου ζωής λογισµικού. Η Εικόνα 1-1 αναπαριστά τον κύκλο ζωής λογισµικού. Τα βέλη δείχνουν την αλληλεπίδραση των διαδοχικών φάσεων, δηλαδή ότι το τέλος µίας φάσης οδηγεί στην επόµενη αλλά µπορεί να οδηγήσει και στην προηγούµενη. Όταν το τέλος µιας φάσης οδηγεί στην προηγούµενη, αυτό σηµαίνει ότι κάποια στοιχεία χρειάζεται να επανακαθοριστούν. 1.2 Γλώσσες προγραµµατισµού Μία γλώσσα προγραµµατισµού είναι µία τεχνητή γλώσσα η οποία χρησιµοποιείται για τη συγγραφή προγραµµάτων που ελέγχουν τη συµπεριφορά ενός µηχανήµατος και ειδικότερα ενός ηλεκτρονικού υπολογιστή. Τα προγράµµατα αυτά επί της ουσίας υλοποιούν, δηλαδή καταγράφουν σε συγκεκριµένη γλώσσα κατανοητή από ΗΥ, 6

7 αλγόριθµους. Σε γενικές γραµµές ένας αλγόριθµος (algorithm) µπορεί να θεωρηθεί ότι είναι το σύνολο των λογικών διαδικασιών που πρέπει να ακολουθηθούν προκειµένου να επιλυθεί ένα πρόβληµα. Οι γλώσσες προγραµµατισµού ορίζονται µέσα από συντακτικούς (syntactic) και σηµασιολογικούς (semantic) κανόνες οι οποίοι ορίζουν τη σύνταξη των εντολών και το νόηµά τους αντίστοιχα ιαδικασιοστρεφής και αντικειµενοστραφής προγραµµατισµός Ο όρος προγραµµατιστικό παράδειγµα (programming paradigm) αναφέρεται στο νοητικό πρότυπο (ή νοητικό µοντέλο) το οποίο ακολουθείται για την υλοποίηση ενός αλγορίθµου. Ενδεικτικά αναφέρονται τα προγραµµατιστικά παραδείγµατα διαδικασιοστρεφούς προγραµµατισµού (procedural programming), λογικού προγραµµατισµού (logic programming), αντικειµενοστρεφούς προγραµµατισµού (object-oriented programming) και γεγονοστραφούς προγραµµατισµού (eventoriented programming). Θα πρέπει να σηµειωθεί ότι µέχρι τη δεκαετία του 90 το επικρατέστερο προγραµµατιστικό παράδειγµα ήταν ο διαδικασιοστρεφής προγραµµατισµός. Ο διαδικαστικός προγραµµατισµός βασίζεται σε κλίσεις διαδικασιών (procedure calls). Οι διαδικασίες εναλλακτικά ονοµάζονται ρουτίνες, υπορουτίνες ή συναρτήσεις και περιέχουν µία σειρά υπολογιστικών βηµάτων (εντολών) τα οποία εκτελούνται µε τη σειρά όταν καλείται η δεδοµένη διαδικασία. Οποιαδήποτε διαδικασία µπορεί να καλεστεί σε οποιαδήποτε στιγµή κατά τη διάρκεια εκτέλεσης ενός προγράµµατος είτε µέσα από άλλες ρουτίνες είτε ακόµα και µέσα από την ίδια τη ρουτίνα. Χαρακτηριστικό παράδειγµα διαδικασιοστρεφούς προγραµµατισµού είναι η γλώσσα προγραµµατισµού C. Στις µέρες µας, το επικρατέστερο προγραµµατιστικό παράδειγµα είναι η αντικειµενοστραφείς γλώσσες προγραµµατισµού. Στις αντικειµενοστραφείς γλώσσες προγραµµατισµού συγκαταλέγονται η Java, η C++, η Smalltalk, η Python κ.λ.π. Ο αντικειµενοστραφείς προγραµµατισµός (Object- Oriented Programming OOP) βασίζεται στην έννοια του αντικειµένου. Κατά τη διάρκεια εκτέλεσης ενός προγράµµατος κατασκευάζονται αντικείµενα τα οποία αλληλεπιδρούν µεταξύ τους. Κατά το σχεδιασµό του προγράµµατος ακολουθούνται ποικίλες τεχνικές προγραµµατισµού, στις οποίες περιλαµβάνονται η ενθυλάκωση (encapsulation), η τµηµατοποίηση (modularity), o πολυµορφισµός (polymorphism) και η κληρονοµικότητα (inheritance) Γλώσσες υψηλού επιπέδου και γλώσσες χαµηλού επιπέδου Όπως έχει ήδη αναφερθεί, ο προγραµµατισµός έχει σα στόχο τον έλεγχο κάποιου ηλεκτρονικού υπολογιστή. Ο έλεγχος αυτός µπορεί να επιτελεστεί σε διάφορα επίπεδα, όπως φαίνεται στην Εικόνα 1-2. Τα επίπεδα αυτά αναφέρονται στην αµεσότητα της επικοινωνίας µε το υλικό (hardware) του ΗΥ. 1 Οι όροι αυτοί αναπτύσσονται στα κεφάλαια που ακολουθούν. 7

8 Εικόνα 1-2: Τα επίπεδα ελέγχου ΗΥ. Ο στόχος εποµένως είναι ο έλεγχος του hardware προκειµένου να επιτελεστούν κάποιες διαδικασίες. H επικοινωνία µε το hardware µπορεί να επιτελείται είτε απευθείας, είτε από κάποιο επίπεδο αφαίρεσης (abstraction layer). Ειδικότερα: Φυσικό Επίπεδο: το φυσικό επίπεδο αναφέρεται στο ίδιο το υλικό του ΗΥ δηλαδή στο κυκλώµατα που απαρτίζουν την κεντρική µονάδα επεξεργασίας (CPU) καθώς και όλες τις περιφερειακές συσκευές (π.χ. RAM, σκληρός δίσκος, κάρτα γραφικών, κάρτα ήχου, κ.λ.π.). Ο έλεγχος του υπολογιστή στο επίπεδο αυτό επιτυγχάνεται µέσω των κατάλληλων συνδέσεων. Γλώσσα Μηχανής: Γλώσσα µηχανής ονοµάζουµε µια γλώσσα προγραµµατισµού που περιλαµβάνει εντολές γραµµένες σε µορφή ακολουθιών bits άµεσα εκτελέσιµες από τη CPU. Ονοµάζεται γλώσσα µηχανής επειδή µέσω αυτής, και καµίας άλλης, επιτυγχάνεται «επικοινωνία» µε το hardware του ΗΥ. Προγράµµατα που γράφονται σε άλλες γλώσσες προγραµµατισµού, για να γίνουν εκτελέσιµα πρέπει να «µεταφραστούν» από έναν συµβολοµεταφραστή (assembler) σε γλώσσα µηχανής. Η γλώσσα µηχανής αποτελείται από συµβολοσειρές από 0 και 1, δηλαδή από µια ακολουθία από 0 και 1, όπως για παράδειγµα Κάτι τέτοιο αποτελεί ένα διαφορετικό σύστηµα αρίθµησης. Θα µπορούσε κανείς να πει ότι όπως οι άνθρωποι «χρησιµοποιούν» το δεκαδικό σύστηµα αρίθµησης, έτσι οι υπολογιστές χρησιµοποιούν το δυαδικό. Οι υπολογιστές, εποµένως, είναι προγραµµατισµένοι να «καταλαβαίνουν» αριθµούς σε δυαδικό σύστηµα. Ένας µνηµονικός τρόπος της γλώσσας αυτής είναι η έκφραση των αριθµών αυτών σε δεκαεξαδικό σύστηµα. Γλώσσα Χαµηλού επιπέδου: Στο επίπεδο αυτό ο προγραµµατιστής δεν απαιτείται να γράφει απευθείας δυαδικό ή δεκαεξαδικό κώδικα αλλά χρησιµοποιεί κάποιες εντολές οι οποίες έχουν ένα προς ένα αντιστοιχία µε εντολές του δυαδικού κώδικα. Παρόλαυτα, και σε αυτό το επίπεδο ο προγραµµατιστής απαιτείται να έχει πλήρη γνώση της αρχιτεκτονικής του ΗΥ. Στο επίπεδο αυτό, η επικοινωνία µε το hardware επιτελείται µέσω της γλώσσας µηχανής, αφού η γλώσσα χαµηλού επιπέδου θα πρέπει πριν την εκτέλεση του προγράµµατος να µεταφραστεί από τον assembler σε γλώσσα µηχανής. Παράδειγµα γλώσσας χαµηλού επιπέδου είναι η Assembly που έχετε διδαχθεί σε άλλα µαθήµατα. Γλώσσες υψηλού επιπέδου: Οι γλώσσες σε αυτό το επίπεδο χρησιµοποιούν µεγάλο βαθµό αφαίρεσης για τις λεπτοµέρειες της αρχιτεκτονικής του ΗΥ. Ο 8

9 προγραµµατισµός µε γλώσσες υψηλού επιπέδου δεν απαιτεί ειδικές γνώσεις για το hardware του ΗΥ ενώ συχνά χρησιµοποιεί στη σύνταξη εντολών στοιχεία από φυσικές γλώσσες (π.χ. Print, for, while κ.λ.π.). Παράδειγµα τέτοιων γλωσσών είναι η Java, η C/C++, η BASIC, η Pascal, κ.λ.π.) Για την εκτέλεση εφαρµογών που είναι υλοποιηµένα σε κάποια γλώσσα προγραµµατισµού υψηλού επιπέδου είναι απαραίτητη η µετατροπή των εντολών είτε σε εντολές κάποιας γλώσσας χαµηλού επιπέδου είτε απευθείας σε γλώσσα µηχανής. Εφαρµογές: Οτιδήποτε εκτελείται πάνω από το επίπεδο γλωσσών προγραµµατισµού υψηλού επιπέδου είναι εφαρµογή. Έτσι, ακόµα κι αν χρησιµοποιείται κάποιο εργαλείο για τον προγραµµατισµό διαδικασιών και αλγορίθµων αυτό δεν είναι γλώσσα προγραµµατισµού αλλά κάποια εφαρµογή/ κάποιο πρόγραµµα. Έτσι π.χ., προγράµµατα όπως η CSound, MaxMSP, SuperCollider, κ.λ.π., τα οποία επιτρέπουν τον προσδιορισµό και την εκτέλεση διαδικασιών, δεν είναι γλώσσες προγραµµατισµού αλλά προγραµµατιστικά περιβάλλοντα. Σε γενικές γραµµές, το κριτήριο διαχωρισµού µιας γλώσσας προγραµµατισµού από µία εφαρµογή ή ένα προγραµµατιστικό περιβάλλον είναι η ευρύτητα των διαδικασιών που µπορούν να οριστούν και να εκτελεστούν µέσω αυτής της γλώσσας ή της εφαρµογής. Έτσι για παράδειγµα η CSound αναφέρεται σε προγραµµατισµό διαδικασιών που αφορούν ήχο, ενώ η C που είναι γλώσσα προγραµµατισµού αφορά γενικότερα έλεγχο του ΗΥ για διαφορετικούς σκοπούς. Συχνά οι γλώσσες που χρησιµοποιούνται για προγραµµατισµό στο επίπεδο των εφαρµογών αναφέρονται ως γλώσσες προγραµµατισµού πολύ-υψηλού επιπέδου (very-high level programming languages). Η επιλογή της γλώσσας προγραµµατισµού και κατά συνέπεια του επιπέδου στο οποίο θα υλοποιηθεί ένα πρόγραµµα εξαρτάται από πολλούς παράγοντες. Το βασικό πλεονέκτηµα των γλωσσών προγραµµατισµού στα χαµηλότερα επίπεδα είναι ότι βελτιστοποιείται ο χρόνος εκτέλεσης του προγράµµατος. ηλαδή όσο πιο κοντά στο hardware γίνεται ο προγραµµατισµός τόσο γρηγορότερα εκτελείται το πρόγραµµα. Από την άλλη, ο προγραµµατισµός σε γλώσσες υψηλού επιπέδου έχει δύο πλεονεκτήµατα: είναι απλούστερος κι ευκολότερα προσεγγίσιµος από τον προγραµµατιστή διότι είναι πιο κοντά στην ανθρώπινη σκέψη και πιο µακριά από τον τρόπο λειτουργίας του hardware, ενώ το δεύτερο πλεονέκτηµα αφορά στη φορητότητα των προγραµµάτων που αναπτύσσονται σε γλώσσες υψηλού επιπέδου. Κώδικας ο οποίος γράφεται στο χαµηλό επίπεδο και αναφέρεται σε λεπτοµέρειες της αρχιτεκτονικής του ΗΥ δεν µπορεί να είναι φορητός σε ΗΥ µε άλλη αρχιτεκτονική. Αντίθετα στον προγραµµατισµό υψηλού επιπέδου, προκειµένου να εκτελεστεί ένα πρόγραµµα θα πρέπει να «µεταφραστεί» σε γλώσσα χαµηλότερου επιπέδου. Έτσι το ίδιο πρόγραµµα µπορεί να µεταφερθεί σε ηλεκτρονικούς υπολογιστές µε διαφορετική αρχιτεκτονική εφόσον υπάρχουν µεταφραστές εξειδικευµένοι για αυτές τις αρχιτεκτονικές Μεταγλωττιζόµενες και διερµηνευόµενες γλώσσες Ως προς τον τρόπο εκτέλεσης των προγραµµάτων, οι γλώσσες προγραµµατισµού υψηλού επιπέδου διακρίνονται σε δύο κατηγορίες τις διερµηνευόµενες, τις µεταγλωττιζόµενες ή µεταφραζόµενες. Οι όροι αυτοί είναι σε πλήρη αντιστοιχία µε της έννοιες της διερµηνείας και της µετάφρασης στη φυσική γλώσσα. ιερµηνευόµενες (interpreted) είναι οι γλώσσες προγραµµατισµού στις οποίες ο πηγαίος κώδικας εκτελείται απευθείας, γραµµή προς γραµµή. Η µετατροπή αυτή γίνεται από εξειδικευµένο πρόγραµµα που ονοµάζεται διερµηνευτής (interpreter), ο οποίος κατά τη διάρκεια εκτέλεσης του 9

10 προγράµµατος, µεταφράζει την κάθε εντολή σε µία ακολουθία εντολών στη γλώσσα µηχανής οι οποίες εκτελούνται σειριακά σε κάθε βήµα. Χαρακτηριστικό παράδειγµα διερµηνευόµενης γλώσσας είναι η γλώσσα BASIC. Άλλες διερµηνευόµενες γλώσσες είναι η Tcl, η Perl, η PHP, η Javascript. Μεταγλωττιζόµενες (compiled) είναι οι γλώσσες προγραµµατισµού στις οποίες ο πηγαίος κώδικας µετατρέπεται σε εκτελέσιµη µορφή πριν την εκτέλεση του προγράµµατος. Η µετατροπή αυτή γίνεται από ένα εξειδικευµένο πρόγραµµα που ονοµάζεται µεταγλωττιστής (compiler). Ανάλογα µε τη µορφή στην οποία καταλήγει το πρόγραµµα έπειτα από τη µεταγλώττιση, διακρίνουµε δύο τύπους µεταγλώττισης: µεταγλώττιση σε ενδιάµεση µορφή (δηλαδή σε κάποια γλώσσα χαµηλού επιπέδου) και µεταγλώττιση απευθείας σε γλώσσα µηχανής (αµιγώς µεταγλωττιζόµενη γλώσσα προγραµµατισµού). Στην περίπτωση που από τη µεταγλώττιση προκύπτει κάποια ενδιάµεση µορφή, η µορφή αυτή ονοµάζεται bytecode και εκτελείται από µία εικονική µηχανή (virtual machine). Η εικονική µηχανή αναλαµβάνει την µετατροπή του bytecode σε γλώσσα µηχανής κατά τη στιγµή της εκτέλεσης του προγράµµατος, σειριακά. Εποµένως η ενδιάµεση αυτή µορφή bytecode εκτελείται ως διερµηνευόµενη γλώσσα και το virtual machine είναι επί της ουσίας ένας interpreter. Παράδειγµα αµιγώς µεταγλωττιζόµενων γλωσσών προγραµµατισµού είναι οι γλώσσες C/C++, ενώ η Java αποτελεί παράδειγµα γλώσσας κατά την οποία η µεταγλώττιση παράγει ενδιάµεση µορφή (bytecode), η οποία στη συνέχεια εκτελείται από το Java Virtual Machine. 1.3 Η γλώσσα Java Η Java κυκλοφόρησε επίσηµα για πρώτη φορά το 1995 από την εταιρία Sun Microsystems η οποία τη διαθέτει ως ελεύθερο και ανοικτού κώδικα λογισµικό. Το σύνθηµα της κυκλοφορίας της ήταν Write Once Run Anywhere (WORA), και ήταν από τις πρώτες γλώσσες προγραµµατισµού µε δυνατότητα εκτέλεσης του ίδιου προγράµµατος σε διαφορετικές πλατφόρµες υλικού και λογισµικού (cross-platform). Εν συνεχεία περί το , η εταιρία Sun Microsystems εξαγοράστηκε από την Oracle η οποία και συνεχίζει να αναπτύσσει νέες εκδόσεις της γλώσσας. Η τρέχουσα έκδοση είναι η Java SE 7, ενώ προγραµµατίζεται η κυκλοφορία της επόµενης έκδοσης εντός του Ο δικτυακός τόπος της Oracle παρέχει αναλυτική τεκµηρίωση της τεχνολογίας Java, καθώς και µαθήµατα σε έγγραφη html µορφή (tutorials), παραδείγµατα εφαρµογών ανεπτυγµένων σε Java (demos), λίστες ηλεκτρονικού ταχυδροµείου για υποστήριξη (forums), κ.λ.π. Εικόνα 1-3: Το λογότυπο και η µασκότ (duke) της java. 10

11 Η Java πολύ σύντοµα, έγινε η πιο δηµοφιλής γλώσσα για την ανάπτυξη εφαρµογών λογισµικού λόγω της απλότητάς της και λόγω της φορητότητας των προγραµµάτων που αναπτύσσονται σε αυτή. Πιο συγκεκριµένα η Java, σε σύγκριση µε άλλες γλώσσες προγραµµατισµού αντίστοιχου εύρους και επιπέδου είναι απλούστερη στην εκµάθηση καθώς δεν απαιτείται προγραµµατισµός µε δείκτες (pointers), παρέχει µηχανισµό αυτόµατης συλλογής απορριµµάτων (garbage collection) και περιλαµβάνει µηχανισµό χειρισµού εξαιρέσεων (exception handling), που διευκολύνει την πρόβλεψη και το χειρισµό σφαλµάτων κατά τη διάρκεια εκτέλεσης ενός προγράµµατος. H Java είναι κάτι περισσότερο από µια απλή γλώσσα προγραµµατισµού είναι µία τεχνολογική πλατφόρµα αποτελούµενη από δύο συστατικά: Το περιβάλλον ανάπτυξης, το οποίο ονοµάζεται Java Development Kit (JDK) Το περιβάλλον εκτέλεσης, το οποίο ονοµάζεται Java Runtime Environment (JRE) Το JDK είναι ένα σύνολο από προγραµµατιστικές βιβλιοθήκες, οι οποίες ονοµάζονται Application Programming Interfaces (ή APIs) και οι οποίες παρέχουν όλα εκείνα τα στοιχεία της γλώσσας που µπορεί να χρησιµοποιήσει ο προγραµµατιστής για να κατασκευάζει εφαρµογές που αξιοποιούν γραφικά, ήχο, µαθηµατικούς υπολογισµούς επικοινωνία µέσα από δίκτυα κ.λ.π. Το JRE είναι το περιβάλλον µέσα από το οποίο εκτελούνται οι εφαρµογές που έχουν αναπτυχθεί µε το JDK Γιατί η Java είναι ανεξάρτητη πλατφόρµας Όπως έχει ήδη αναφερθεί, το βασικό πλεονέκτηµα της Java είναι η φορητότητα των εφαρµογών που αναπτύσσονται µε αυτήν. Αυτό σηµαίνει ότι ένα πρόγραµµα υλοποιηµένο σε Java, µπορεί να εκτελείται σε διαφορετικές αρχιτεκτονικές υπολογιστών κι εποµένως είναι µεταφερτό σε διάφορα λειτουργικά συστήµατα υπολογιστών (π.χ. Windows, MAC OS, UNIX, LINUX, κ.λ.π.) καθώς και σε διάφορες συσκευές (PC, PDA, κινητά τηλέφωνα, ψηφιακές τηλεοράσεις, κ.ο.κ.). Εικόνα 1-4: Μεταγλώττιση και διερµηνεία ενός προγράµµατος στη Java. Ένα εύλογο ερώτηµα είναι το πώς επιτυγχάνεται αυτή η φορητότητας. Ο λόγος που επιτρέπει στα προγράµµατα που είναι υλοποιηµένα σε Java να εκτελούνται σε διαφορετικές αρχιτεκτονικές υπολογιστών είναι ότι η Java ανήκει στην κατηγορία γλωσσών που είναι µεταγλωττιζόµενες και µάλιστα που η µεταγλώττιση δεν παράγει απευθείας γλώσσα µηχανής αλλά µία ενδιάµεση µορφή bytecode. Όπως φαίνεται 11

12 στην Εικόνα 1-4, ο µεταγλωττιστής (compiler) της Java µετατρέπει τον πηγαίο κώδικα (source code) σε bytecode. O πηγαίος κώδικας αποτελείται από ένα σύνολο αρχείων τα οποία περιέχουν Java εντολές και το όνοµά τους έχει την κατάληξη.java. Ο compiler µε βάση τα αρχεία αυτά παράγει ένα σύνολο αρχείων τα οποία περιέχουν εντολές σε bytecode και έχουν το ίδιο όνοµα µε τα αρχεία του πηγαίου κώδικα και κατάληξη.class. Τη στιγµή της εκτέλεσης του προγράµµατος, οι εντολές σε bytecode εκτελούνται µια-προς-µια σειριακά από το εικονική µηχανή της Java, η οποία ονοµάζεται Java Virtual Machine (JVM) ή Java Runtime Environment (JRE). To JRE εποµένως λειτουργεί ως interpreter, δηλαδή ο bytecode µετατρέπεται σε γλώσσα µηχανής κατά το χρόνο εκτέλεσης του προγράµµατος, όπως συµβαίνει µε τις διερµηνευόµενες γλώσσες προγραµµατισµού. Εικόνα 1-5: Τµήµα κώδικα Java και του παραγόµενου bytecode. Παράδειγµα εντολών bytecode παρατίθεται στην Εικόνα 1-5. Θα πρέπει να σηµειωθεί ότι τόσο ο πηγαίος κώδικας, όσο και ο µεταγλωττιστής και ο bytecode ενός συγκεκριµένου προγράµµατος είναι κοινά για όλες τις αρχιτεκτονικές υπολογιστών, αυτό το οποίο διαφέρει είναι το JVM. Εποµένως, ένα πρόγραµµα υλοποιηµένο για παράδειγµα σε Windows, αφότου µεταγλωττιστεί, µπορεί να τρέξει σε οποιαδήποτε συσκευή για την οποία διατίθεται JVM (π.χ. κινητό τηλέφωνο), µεταφέροντας σε αυτήν το bytecode Εφαρµογές της Java Το γεγονός ότι η Java είναι ανεξάρτητη πλατφόρµας της επιτρέπει να καλύπτει µεγάλο φάσµα εφαρµογών, οι οποίες εκτελούνται είτε σε συγκεκριµένη συσκευή είτε και κατανεµηµένα σε πολλαπλές συσκευές που συνδέονται µεταξύ τους µε κάποιας µορφής δικτύωση. Τέτοια δικτύωση µπορεί να είναι είτε ένα τοπικό δίκτυο υπολογιστών (Local Area Network LAN), ένα ευρύ δίκτυο υπολογιστών (Wide Area Network - WAN) όπως το Internet, µία δικτύωση συσκευών µέσω Bluetooth ή WiFi, ένα δίκτυο κινητής τηλεφωνίας GPRS, ένα δίκτυο ψηφιακής τηλεόρασης DVB κ.ο.κ. Παραδείγµατα εφαρµογών που αναπτύσσονται ευρέως σε Java είναι: 12

13 Αυτόνοµα προγράµµατα σε υπολογιστή µε ή χωρίς γραφική διεπαφή χρήστη (Graphical User Interface GUI) Αλληλεπιδραστικά προγράµµατα ενσωµατωµένα σε ιστοσελίδες. Τα προγράµµατα αυτά όπως θα δούµε στη συνέχεια ονοµάζονται applets. Πολυµεσικές εφαρµογές για φορητές συσκευές (π.χ. παιχνίδια, ηµερολόγια, κ.λ.π.) Αλληλεπιδραστικές εφαρµογές για την ψηφιακή τηλεόραση Επιχειρηµατικές εφαρµογές που απαιτούν πρόσβαση σε βάσεις δεδοµένων (π.χ. ηλεκτρονικό εµπόριο) κ.ο.κ. 13

14 2 Υλοποίηση αυτόνοµου προγράµµατος στη Java Ο όρος αυτόνοµα προγράµµατα ή αυτόνοµες εφαρµογές αναφέρεται σε προγράµµατα τα οποία εκτελούνται αυτόνοµα στο λειτουργικό σύστηµα από το JVM. Όπως θα δούµε στη συνέχεια η Java παρέχει τη δυνατότητα υλοποίησης εφαρµογών οι οποίες φιλοξενούνται από άλλες εφαρµογές. Τέτοιο παράδειγµα είναι τα applets τα οποία είναι προγράµµατα υλοποιηµένα σε Java που εκτελούνται µέσα από έναν Internet Browser κι εποµένως µπορούν να ενσωµατώνονται σε ιστοσελίδες. Τα αυτόνοµα προγράµµατα µπορούν είτε να είναι καθαρά υπολογιστικά προγράµµατα, δηλαδή να εκτελούν διαδικασίες είτε να παρέχουν ένα γραφικό περιβάλλον γραφικής αναπαράστασης της πληροφορίας. Εικόνα 2-1: Καθαρά υπολογιστικό πρόγραµµα Εικόνα 2-2: Πρόγραµµα που περιλαµβάνει γραφικό περιβάλλον. Το στάδιο της υλοποίησης, που όπως φαίνεται στην Εικόνα 1-1, είναι το τρίτο στάδιο της ανάπτυξης µιας εφαρµογής λογισµικού, αποτελείται από τέσσερα υποστάδια: α) τη συγγραφή πηγαίου κώδικα, β) τη µεταγλώττιση, γ) την εκτέλεση και την δ) 14

15 εκσφαλµάττωση. Οι υποενότητες που ακολουθούν περιγράφουν καθένα από αυτά τα στάδια χωριστά. Προϋπόθεση για να υλοποιήσετε το πρώτο σας Java πρόγραµµα είναι να έχετε εγκαταστήσει επιτυχώς την πλατφόρµα της Java και τα εργαλεία υλοποίησης. Αναλυτικές οδηγίες για την εγκατάσταση της Java µπορείτε να βρείτε στο Παράρτηµα Β. 2.1 Συγγραφή πηγαίου κώδικα (coding) Κατά το στάδιο αυτό ο προγραµµατιστής γράφει τον πηγαίο κώδικα (source code) στη γλώσσα προγραµµατισµού που έχει επιλεγεί, εν προκειµένω στη Java. Για τη συγγραφή του κώδικα µπορεί να χρησιµοποιηθεί ένα οποιοσδήποτε πρόγραµµα συγγραφής κειµένου (π.χ. Notepad, WordPad, JEdit 2, κ.λ.π.). Προσοχή: ο πηγαίος κώδικας είναι απλό κείµενο αποτελούµενο από χαρακτήρες (text) κι εποµένως για τη συγγραφή του δε χρησιµοποιούµε προγράµµατα µορφοποίησης κειµένου όπως το Word, SWriter, κ.λ.π. Στην Εικόνα 2-3 αναπαρίσταται ο πηγαίος κώδικας ενός πολύ απλού αυτόνοµου προγράµµατος στη Java γραµµένο σε notepad. Το πρόγραµµα αυτό απλά τυπώνει στη έξοδο τη φράση Hello World!. Εικόνα 2-3: Ο πηγαίος κώδικας ενός αυτόνοµου προγράµµατος στη java. Παρατηρήστε τα εξής: Ο πηγαίος κώδικας αποτελείται από δύο blocks τα οποία σηµατοδοτούνται από τα σύµβολα { και. Υπάρχει ένα εξωτερικό κι ένα εσωτερικό µπλοκ. Το δεύτερο µπλοκ περιέχεται στο πρώτο. Τα περιεχόµενα κάθε µπλοκ έχουν στοιχηθεί ένα tab πιο µέσα, προκειµένου ο κώδικας να είναι πιο ευανάγνωστος. Το όνοµα του αρχείου (MyProgram.java) είναι κοινό µε το όνοµα που εµφανίζεται στην πρώτη γραµµή του κώδικα αµέσως µετά τη λέξη class. Αυτό είναι απαραίτητο για κάθε αρχείο πηγαίου κώδικα στη Java. Εάν το όνοµα του αρχείου και το όνοµα του εξωτερικού µπλοκ δε συµφωνούν, τότε ο compiler θα πετάξει λάθος κατά τη φάση της µεταγλώττισης. Στη Java, τόσο στο εσωτερικό του πηγαίου κώδικα όσο και στα ονόµατα των αρχείων θα πρέπει να διατηρείται η σειρά των µικρών και κεφαλαίων γραµµάτων. Έτσι, για παράδειγµα ενώ η λέξη System αναφέρεται σε µία

16 συγκεκριµένη οντότητα της Java, οι παραλλαγές της λέξης αυτής system ή system δε σηµαίνουν τίποτα συγκεκριµένο για τη γλώσσα. Ο πηγαίος κώδικας περιέχει µία συνάρτηση µε το όνοµα main( ). Όπως και στη γλώσσα προγραµµατισµού C, έτσι και στη Java, προκειµένου να εκτελεστεί ένα αυτόνοµο πρόγραµµα θα πρέπει να παρέχεται µία µέθοδο main, η οποία σηµατοδοτεί και την εκκίνηση του προγράµµατος. Στην περίπτωση δε που το πρόγραµµα δεν εκτελείται αυτόνοµα, τότε δεν απαιτείται η ύπαρξη της main( ). Σε αντίθεση µε τη C, η συνάρτηση main στη Java έχει τη πάντοτε τη σύνταξη που φαίνεται στην Εικόνα 2-3, δηλαδή public static void main(string[] args) {. Στο εσωτερικό των αγκύλων περιέχονται οι εντολές που εκτελούνται η µία µετά την άλλη κατά την εκτέλεση του προγράµµατος. 2.2 Μεταγλώττιση (compiling) Η µεταγλώττιση του πηγαίου κώδικα µπορεί να γίνει απευθείας σε ένα παράθυρο εντολών των Windows, µε την εντολή: > javac MyProgram.java (*) Εικόνα 2-4: Προσθήκη του φακέλου µε τα εκτελέσιµα αρχεία της Java στις µεταβλητές του περιβάλλοντος των Windows. Σηµειώστε τα εξής: Ο µεταγλωττιστής compiler της Java είναι κι αυτός ένα αυτόνοµο εκτελέσιµο πρόγραµµα, το οποίο βρίσκεται ως αρχείο στη θέση <java_install_dir>/bin/javac.exe όπου <java_install_dir> είναι η θέση στο σκληρό σας δίσκο όπου έχετε εγκαταστήσει τη Java. Στα Windows, η θέση στην οποία συνήθως εγκαθίσταται η java είναι στο φάκελο C:\Program Files\Java\jdk1.6.0_07 Προκειµένου να είναι προσβάσιµος ο Java compiler 16

17 από οποιαδήποτε θέση του συστήµατος αρχείων στο command prompt θα πρέπει να προσθέσετε το φάκελο στον οποίο βρίσκεται ο compiler στις µεταβλητές του περιβάλλοντος των windows. Για να το κάνετε αυτό πρέπει να κάνετε δεξί click στο εικονίδιο My Computer στην επιφάνεια εργασίας και να επιλέξετε από το µενού Properties και στη συνέχεια να κάνετε edit τη µεταβλητή Path, όπως φαίνεται στην Εικόνα 2-4. Για να εκτελέσετε την εντολή (*) θα πρέπει το παράθυρο εντολών των Windows να βρίσκεται στο εσωτερικό του φακέλου στο οποίο βρίσκεται και το αρχείο πηγαίου κώδικα. Εάν το παράθυρο εντολών δεν βρίσκεται στο σωστό φάκελο, µπορείτε να µεταβείτε σε αυτόν χρησιµοποιώντας την εντολή cd που αποτελεί τα αρχικά των λέξεων change directory (βλέπε Εικόνα 2-5). Εικόνα 2-5: Η διαδικασία µεταγλώττισης στο παράθυρο εντολών των windows. Σε περίπτωση που υπάρχουν συντακτικά λάθη στον κώδικά σας ενηµερώσει ο compiler υποδεικνύοντας τη γραµµή του κώδικα στην οποία υπάρχει σφάλµα. Εάν ο κώδικας είναι σωστός τότε θα δηµιουργηθεί ένα αρχείο το οποίο θα έχει το όνοµα MyProgram.class 2.3 Εκτέλεση (running) Προκειµένου να εκτελέσετε το πρώτο σας πρόγραµµα αρκεί να µεταβείτε στο φάκελο όπου βρίσκεται το αρχείο MyProgram.class και να δώσετε την εντολή: > java MyProgram Το αρχείο MyProgram.class περιέχει τον κώδικα bytecode ο οποίος εκτελείται από το JVM µέσω της εντολής java. Παρατηρήστε ότι στην εντολή αυτή δε χρησιµοποιείται η κατάληξη του αρχείου. Το JVM αναζητά από µόνο του τα αρχεία µε κατάληξη.class. Όπως φαίνεται στην Εικόνα 2-6 το πρόγραµµα αυτό στην έξοδο εκτυπώνει τη φράση Hello World!. 17

18 Εικόνα 2-6: Εκτέλεση του πρώτου προγράµµατος στη Java. 2.4 Εκσφαλµάττωση (debugging) Σε πολλές περιπτώσεις, και ιδιαίτερα σε πιο πολύπλοκα προγράµµατα από αυτό που παρουσιάστηκε στην προηγούµενη ενότητα, ο πηγαίος κώδικας µπορεί να περιέχει σφάλµατα. Τα σφάλµατα αυτά δεν µπορούν πάντοτε να εντοπιστούν από τον compiler της java. O compiler µπορεί να εντοπίζει σφάλµατα του κώδικα µόνο όταν αυτά σχετίζονται µε τη σύνταξη η τη δοµή του προγράµµατος. Τα σφάλµατα αυτά ονοµάζονται σφάλµατα χρόνου µεταγλώττισης (compilation errors). Στην περίπτωση που το σφάλµα δεν είναι συντακτικό, αν και δεν εντοπίζεται από τον compiler, µπορεί να έχει ως αποτέλεσµα το πρόγραµµα µας να µην έχει την αναµενόµενη συµπεριφορά. Τα σφάλµατα αυτά ονοµάζονται σφάλµατα χρόνου εκτέλεσης (runtime errors). Στις περιπτώσεις που το πρόγραµµα έχει απρόβλεπτη συµπεριφορά θα πρέπει να γίνει εκσφαλµάτωση. Η διαδικασία της εκσφαλµάτωσης µπορεί να γίνει είτε µε τη βοήθεια κάποιου εξειδικευµένου προγράµµατος (debugger) είτε απευθείας από τον προγραµµατιστή µε διαδοχικές εκτυπώσεις κατά τη διάρκεια της ροής του προγράµµατος οι οποίες άλλοτε έχουν σα στόχο την εκτύπωση της τιµής κάποιων µεταβλητών κι άλλοτε δίνουν πληροφορίες για τη σειρά µε την οποία εκτελούνται οι εντολές που περιλαµβάνονται στον πηγαίο κώδικα. 2.5 Εξέταση του πηγαίου κώδικα Σε αυτήν την ενότητα θα εξετάσουµε λίγο πιο προσεκτικά τα συστατικά του πηγαίου κώδικα του παραπάνω προγράµµατος Το εξωτερικό µπλοκ Όπως έχει ήδη αναφερθεί, το εξωτερικό µπλοκ του κώδικα σηµατοδοτείτε από τη γραµµή public class MyProgram { και τελειώνει στην τελευταία γραµµή, δηλαδή στο κλείσιµο της αγκύλης µε το σύµβολο. Όπως θα δούµε στη συνέχεια, ένα πρόγραµµα υλοποιηµένο σε Java κατά κανόνα αποτελείται από περισσότερα του ενός αρχεία πηγαίου κώδικα. Το καθένα από αυτά τα αρχεία περιβάλλεται από ένα τέτοιο µπλοκ και πάντα η λέξη που ακολουθεί τη λέξη class αποτελεί και το όνοµα του αρχείου µε την ίδια διαδοχή µικρών και κεφαλαίων χαρακτήρων. Φυσικά όλα τα αρχεία πηγαίου κώδικα θα πρέπει να έχουν την κατάληξη.java. Όπως θα δούµε στη συνέχεια, µία κλάση στη Java ορίζει στην ουσία µία τάξη, ένα είδος αντικειµένων. 18

19 2.5.2 Η εντολή της εκτύπωσης Οι εκτυπώσεις στη Java γίνονται στην κονσόλα µέσα από την οποία εκτελείται το πρόγραµµα. Η γραµµή αυτή είναι System.out.println( Hello World! ); Όπως και στη γλώσσα C, έτσι και στη Java, προκειµένου να εκτελεστεί µία εντολή του πηγαίου κώδικα θα πρέπει η γραµµή που περιέχει την εντολή να τερµατιστεί µε ένα ελληνικό ερωτηµατικό, δηλαδή το σύµβολο ;. Οι δύο πρώτες λέξεις (System.out) χρησιµοποιούνται για να αναφερθούν στην έξοδο του συστήµατος, δηλαδή του προγράµµατος, η οποία κατά κανόνα είναι η κονσόλα από την οποία εκτελείται το πρόγραµµα. Η οντότητα System.out παρέχει µεταξύ άλλων τις συναρτήσεις print( ) και println( ) Κάθε µια από αυτές τις εντολές εκτυπώνουν στην έξοδο του συστήµατος οτιδήποτε περιέχεται ανάµεσα στα εισαγωγικά. Η διαφορά ανάµεσα σε αυτές τις δύο συναρτήσεις έγκειται στο γεγονός ότι η δεύτερη εκτυπώνει το περιεχόµενο των εισαγωγικών σε χωριστή γραµµή στην κονσόλα. Γενικά ένα ζεύγος εισαγωγικών αποτελεί µία ακολουθία χαρακτήρων, µία συµβολοσειρά ή ένα String όπως ονοµάζεται στα αγγλικά. Μία συµβολοσειρά µπορεί να αποτελείται από οποιοδήποτε συνδυασµό αλφαριθµητικών χαρακτήρων, δηλαδή από γράµµατα, αριθµούς και σύµβολα. Υπάρχουν όµως και κάποιοι ειδικοί συνδυασµοί χαρακτήρων οι οποίοι ονοµάζονται ακολουθίες διαφυγής (escape sequences) οι οποίοι όταν χρησιµοποιούνται µέσα σε µία συµβολοσειρά ερµηνεύονται µε ειδικό τρόπο. Οι σηµαντικότεροι από αυτούς φαίνονται στον Πίνακας 2-1. Έτσι για παράδειγµα η συµβολοσειρά Hello\b\b World! \n \t\t \ Mia alli frasi\. \n to onoma mou einai: \ chrisoula\ Σε µία εντολή εκτύπωσης θα είχε ως αποτέλεσµα την ακόλουθη εκτύπωση Πίνακας 2-1: Οι ακολουθίες διαφυγής. Escape sequence Ερµηνεία µέσα σε συµβολοσειρά \n Κατέβα στην επόµενη γραµµή (new line) \t Προχώρησε ένα tab \b Σβήσε ένα χαρακτήρα (backspace) \ Εκτύπωσε διπλό εισαγωγικό \ Εκτύπωσε απλό εισαγωγικό 19

20 \\ Εκτύπωσε το χαρακτήρα \ Προκειµένου να ενωθούν δύο συµβολοσειρές σε µία ή προκειµένου να ενωθεί µία συµβολοσειρά µε το αποτέλεσµα µιας εντολής, µπορεί να χρησιµοποιείται το σύµβολο + (string concatenation). Έτσι π.χ. η εντολή System.out.println( To apotelesma tis praksis einai: + (2+3)*5 + \n Sas fainetai sosto? ); Θα εκτυπώσει την έκφραση To apotelemsa tis praksis einai: 25 Sas fainetai sosto? Παρατηρήστε ότι η πράξη (2+3)*5 η οποία δεν περιλαµβάνεται σε εισαγωγικά έχει εκτελεστεί κι έχει αντικατασταθεί µε το αποτέλεσµά της (25) Το όρισµα της συνάρτησης main Όπως φαίνεται στην Εικόνα 2-3, η µέθοδος main στη Java έχει ένα όρισµα (argument), το String[] args Όπως µπορεί κανείς να αντιληφθεί από τη σύνταξη του παραπάνω ορίσµατος το όρισµα αυτό είναι ένας πίνακας, δηλαδή ένα σύνολο από συµβολοσειρές. Το περιεχόµενο αυτού του πίνακα είναι τα ορίσµατα που δίνονται στην εντολή που εκτελεί το ίδιο το πρόγραµµα. ηλαδή, εάν αντί για >java MyProgram Επιχειρήσω να εκτελέσω το πρόγραµµα µε την εντολή >java MyProgram ena dyo tria tessera pente eksi τότε οι λέξεις που ακολουθούν θα αποθηκευτούν στον πίνακα args, του οποίου εποµένως θα έχει έξι στοιχεία, τα οποία θα είναι: args[0] = ena ; args[1] = dyo ; args[2]= tria ; args[3]= tessera ; args[4]= pente ; args[5]= eksi ; Προσθήκη σχολίων Όπως σε όλες τις γλώσσες προγραµµατισµού, έτσι και στη Java είναι απαραίτητη η προσθήκη σχολίων (comments) στο εσωτερικό το πηγαίου κώδικα. Τα σχόλια είναι µέρος του κώδικα το οποίο δε λαµβάνεται υπόψη κατά τη µεταγλώττιση ούτε κατά την εκτέλεση του προγράµµατος. Στόχος τους είναι να επεξηγήσουν τον κώδικα και να βοηθήσουν τον προγραµµατιστή τόσο στην εκσφαλµάτωση όσο και κατά τη συντήρηση του. Ο σχολιασµός του κώδικα αποτελεί καλή πρακτική. ηλαδή, αν και δεν είναι απαραίτητος για να τρέξει το πρόγραµµά σας εντούτοις η χρήση του βοηθάει στην 20

21 ευκολότερη κατανόηση του κώδικά σας τόσο από άλλους προγραµµατιστές όσο και από εσάς τους ίδιους. Στη Java υπάρχουν τρεις τύποι σχολιασµού του πηγαίου κώδικα. Σχολιασµός µιας γραµµής Είναι ο απλούστερος τρόπος σχολιασµού και η έναρξή του σηµατοδοτείται από το σύµβολο //. Μπορεί να χρησιµοποιηθεί σε γραµµές που περιέχουν κώδικα ή σε γραµµές που δεν περιέχουν κώδικα. Οτιδήποτε ακολουθεί το σύµβολο // σε µία γραµµή αποτελεί σχόλιο. Για παράδειγµα: System.out.println( Hello ); Μπλοκ σχολίου //ektyposi Στις περιπτώσεις που ένα σχόλιο µπορεί να απαιτεί περισσότερες από µία γραµµές, αντί να χρησιµοποιείται το σύµβολο // σε κάθε γραµµή µπορεί να χρησιµοποιηθεί το /* στην αρχή του µπλοκ και το */ στο τέλος του µπλοκ. Για παράδειγµα: /* =========== To proto mou programma =========== */ Σχόλιο τεκµηρίωσης Μεταξύ των υπολοίπων εκτελέσιµων που παρέχονται από την πλατφόρµα της Java στη θέση <java_install_dir>/bin είναι και το εκτελέσιµο javadoc το οποίο µπορείτε να χρησιµοποιείτε για να παράγετε τεκµηρίωση των προγραµµάτων σας σε αρχεία html. Ένα µπλοκ σχολίου τεκµηρίωσης περιγράφει συνήθως τί κάνει η κάθε κλάση, η κάθε µεταβλητή και η κάθε συνάρτηση στο πρόγραµµά σας. Η έναρξη σχολίου τεκµηρίωσης σηµατοδοτείται από τα σύµβολα /** (διπλός αστερίσκος) και η λήξη από */ Έτσι για παράδειγµα το πρώτο σας πρόγραµµα σε πιο εξελιγµένη µορφή µε σχόλια τεκµηρίωσης καθώς και µε κάποια επιπλέον λειτουργικότητα θα είναι αυτό που φαίνεται στην Εικόνα 2-7. Εικόνα 2-7: Το πρώτο πρόγραµµα µε σχόλια και ένα βρόγχο διακλάδωσης. 21

22 Εάν σε αυτόν τον πηγαίο κώδικα εκτελέσουµε την εντολή > javadoc MyProgram.java Τότε θα δηµιουργηθεί µία σειρά από html αρχεία που θα περιέχουν τα σχόλια τεκµηρίωσης που έχω βάλει µέσα στον κώδικα. Ένα από αυτά τα αρχεία φαίνεται στην Εικόνα 2-8. Εικόνα 2-8: Αρχείο html αυτόµατης τεκµηρίωσης του πηγαίου κώδικα που δηµιουργείται µε την εντολή javadoc. 2.6 Άσκηση Να υλοποιήσετε ένα αυτόνοµο πρόγραµµα στη Java το οποίο κάθε φορά που εκτελείται να εκτυπώνει τα ορίσµατα της µεθόδου main. Ο πηγαίος κώδικας θα πρέπει να είναι επαρκώς σχολιασµένος. Υπόδειξη: Το πλήθος των ορισµάτων της main ισούται µε το µήκος του πίνακα args, το οποίο δίνεται από τη µεταβλητή args.length 22

23 3 Το eclipse IDE Στις περισσότερες περιπτώσεις, κατά την υλοποίηση ολοκληρωµένων εφαρµογών δε χρησιµοποιείται ένας απλός text editor αλλά κάποιο πρόγραµµα το οποίο να διευκολύνει όλα τα στάδια της υλοποίησης (coding, compiling, running, debugging). Τα προγράµµατα αυτά αναφέρονται µε το γενικό όρο ολοκληρωµένα περιβάλλοντα ανάπτυξης (Integrated Development Environments IDE). Στα πλαίσια του µαθήµατος θα χρησιµοποιήσουµε το eclipse 3 IDE, το οποίο διατίθεται ελεύθερα και είναι ανοιχτού κώδικα. Αξίζει να σηµειωθεί ότι το eclipse είναι το ίδιο ανεπτυγµένο σε Java, ενώ στις µέρες µας αποτελεί ένα από τα πιο δηµοφιλή IDE για την ανάπτυξη λογισµικού, τόσο σε Java όσο και σε C Η γραφική διεπαφή χρήστη Η γραφική διεπαφή χρήστη του eclipse IDE φαίνεται στην Εικόνα 3-1. Εικόνα 3-1: Στιγµιότυπο από το περιβάλλον eclipse

24 3.2 Οι έννοιες project και workspace Για την υλοποίηση προγραµµάτων, το eclipse χρησιµοποιεί τις έννοιες του project και του workspace. Ένα project (έργο) για το eclipse αντιπροσωπεύει όλα εκείνα τα αρχεία που χρησιµοποιούνται για την υλοποίηση και την εκτέλεση του προγράµµατος. Τα αρχεία αυτά συνήθως αποθηκεύονται σε ένα φάκελο του οποίου το όνοµα καθορίζεται από το όνοµα του project. Στη συνήθη περίπτωση ο φάκελος του project περιέχει δύο υποφακέλους, έναν µε το όνοµα bin κι έναν µε το όνοµα src. Ο φάκελος src περιέχει τα αρχεία που χρησιµοποιούνται για τη συγγραφή του κώδικα, δηλαδή τα αρχεία µε κατάληξη.java, ενώ ο φάκελος bin περιέχει τα αρχεία που χρησιµοποιούνται για την εκτέλεση του κώδικα, δηλαδή τα αρχεία µε κατάληξη.class Ένα workspace (χώρος εργασίας) για το eclipse είναι στην πραγµατικότητα ένας φάκελος µέσα στον οποίο αποθηκεύονται τα projects. To όνοµα του workspace δεν είναι συγκεκριµένο και µπορεί να οριστεί από τον προγραµµατιστή. Έτσι, προκειµένου να υλοποιήσετε τα δικά σας προγράµµατα µε το eclipse θα πρέπει αρχικά να δηµιουργήσετε ένα φάκελο το οποίο θα αντιπροσωπεύει το workspace (π.χ. το φάκελο D:\ETMP\alexandraki), να µεταβείτε σε αυτό το workspace επιλέγοντας από το menu του eclipse File > Switch Workspace και στη συνέχεια να κατασκευάσετε τα projects σας επιλέγoντας File > New > Project. 24

25 4 Αντικειµενοστραφής προγραµµατισµός στη java Σε οποιαδήποτε γλώσσα προγραµµατισµού, ένα πρόγραµµα µπορεί να θεωρηθεί ότι απαρτίζεται από δύο πράγµατα: δεδοµένα και εντολές. Τα δεδοµένα αποθηκεύονται σε µεταβλητές ενώ οι εντολές είναι στην ουσία κλήσεις συναρτήσεων. Θα πρέπει εδώ να επισηµάνουµε ότι στη Java αντί του όρου συνάρτηση (function) που χρησιµοποιείται στη C/C++, χρησιµοποιείται ο όρος µέθοδος (method) όταν γίνεται αναφορά σε εντολές. Ο διαχωρισµός ανάµεσα σε δεδοµένα και µεθόδους αντικατοπτρίζει τη διαφορά µεταξύ µνήµης και επεξεργασίας που συναντάµε στο hardware του ηλεκτρονικού υπολογιστή: τα δεδοµένα αποθηκεύονται στη µνήµη και γίνονται αντικείµενο επεξεργασίας µέσω της εκτέλεσης εντολών σε έναν επεξεργαστή. 4.1 Τύποι Μεταβλητών Στις αντικειµενοστραφείς γλώσσες προγραµµατισµού οι τύποι των µεταβλητών διακρίνονται σε δύο κατηγορίες: τους στοιχειώδης ή γενικούς τύπους (primitive types) και τους τύπους αναφοράς (reference types). Οι στοιχειώδης τύποι είναι τύποι µεταβλητών που περιλαµβάνουν µία τιµή υπό µορφή αριθµού ή χαρακτήρα, ενώ αντίθετα οι τύποι αναφοράς είναι τύποι µεταβλητών οι οποίες είναι σύνθετες κι εποµένως απαρτίζονται από ένα σύνολο στοιχειωδών µεταβλητών γενικού τύπου. Οι τύποι αναφοράς είναι τύποι αντικειµένων, όπου κάθε αντικείµενο χαρακτηρίζεται από ένα σύνολο µεταβλητών καθώς και ένα σύνολο µεθόδων. Ένα παράδειγµα τύπου αναφοράς θα µπορούσε να είναι ο τύπος Button ο οποίος είναι τύπος µιας µεταβλητής που περικλείει πολλαπλές ιδιότητες (π.χ. size, color, pressed κ.λ.π.) υπό µορφή αριθµών και χαρακτήρων καθώς και ένα πλήθος µεθόδων (π.χ. press, resize κ.λ.π.) Έτσι π.χ. οι παρακάτω δηλώσεις αφορούν µεταβλητές στοιχειωδών τύπων. int a = 5; float b = 5.3f; double c = 8.2; Ο τύπος µίας µεταβλητής καθορίζεται από τη λέξη που προηγείται στη δήλωσή της (π.χ. int float κ.λ.π.). Μία µεταβλητή ανάλογα µε τον τύπο της καταλαµβάνει διαφορετικό µέγεθος στη µνήµη του ΗΥ. Η java υποστηρίζει τους στοιχειώδης τύπους που αναγράφονται στον Πίνακας 4-1. Πίνακας 4-1: Οι στοιχειώδης τύποι µεταβλητών στη Java. Όνοµα τύπου Μέγεθος Εύρος τιµών Παράδειγµα Αρχική τιµή παρατηρήσεις byte 8 bits από -128 έως και 127 short 16 bits από έως και , , int 32 bits από , 8,

26 έως και long 64 bits από έως και l, 8l, l 0L Η αριθµητική τιµή ενδέχεται να ακολουθείται από το γράµµα l ή L ώστε να διαφοροποιείται από τον τύπο int float 32 bits 4.3f, 68.9f 0.0f Η αριθµητική τιµή ενδέχεται να ακολουθείται από το γράµµα f ή F ώστε να διαφοροποιείται από τον τύπο double double 64 bits 23.5, 23.5d 0.0d Όταν ένας δεκαδικός αριθµός δεν ακολουθείται από το γράµµα f (η F) τότε αυτόµατα θεωρείται double char 16 bits (unsigned) 0 έως a, 5, B boolean Μη προσδιορισµένο true ή false true false Αντίθετα, οι τύποι αναφοράς, δεν έχουν µία µοναδική τιµή τη φορά, αλλά απαρτίζονται από ένα σύνολο µεταβλητών που µπορεί να είναι είτε στοιχειώδης µεταβλητές είτε και άλλοι τύποι αναφοράς. Οι τύποι αυτοί αντιστοιχούν σε αντικείµενα κλάσεων. 4.2 Αντικείµενα και κλάσεις Στη Java οποιαδήποτε οντότητα (είτε µεταβλητή, είτε µέθοδος) και οποιοδήποτε κοµµάτι κώδικα ενθυλακώνεται µέσα σε κάποια κλάση. Η κλάση αποτελεί τον τύπο ενός αντικειµένου. Έτσι π.χ. η δήλωση String s1 = Hello ; ηλώνει µία µεταβλητή µε το όνοµα s1 της οποίας ο τύπος είναι String και η τιµή της Hello. Παρατηρήστε ότι ο τύπος String δεν περιλαµβάνεται στον Πίνακας 4-1, κι εποµένως ανήκει στη δεύτερη κατηγορία τύπων, δηλαδή είναι ένας τύπος αναφοράς. Έτσι, για την παραπάνω δήλωση, µπορούµε να πούµε ότι η s1 είναι ένα αντικείµενο ή ένα στιγµιότυπο της κλάσης String. Ένα αντικείµενο είναι µία αυτόνοµη οντότητα η οποία χαρακτηρίζεται από δύο πράγµατα: τις ιδιότητες του, οι οποίες εκφράζονται ως µεταβλητές (variables), και τη συµπεριφορά του, η οποία εκφράζεται µέσα από µεθόδους (methods) 26

27 Εικόνα 4-1: Σχηµατική αναπαράσταση της εκτέλεσης ενός προγράµµατος στη Java. Κατά κανόνα, µπορούν να δηµιουργηθούν πολλαπλά αντικείµενα της ίδιας κλάσης. Η πρακτική αυτή είναι δανεισµένη από το φυσικό κόσµο όπου µπορώ να έχω πολλαπλά αντικείµενα του ίδιου είδους, τα οποία εντούτοις είναι διαφορετικά. Για παράδειγµα θεωρήστε το γεγονός ότι αν και υπάρχει διακριτό είδος αντικειµένου το οποίο ονοµάζεται π.χ. λάµπα και έχει συγκεκριµένο είδος ιδιοτήτων (π.χ. ισχύς, χρώµα) και συγκεκριµένη συµπεριφορά (π.χ. ανοίγει κλείνει), εντούτοις µπορώ να έχω στην κατοχή µου πολλαπλές λάµπες όπου καθεµία έχει διαφορετική τιµή σε αυτές τις ιδιότητες (π.χ. διαφορετική ισχύ ή/και διαφορετικό χρώµα) και η συµπεριφορά της καθορίζεται µε βάση αυτές τις ιδιότητες. Ένα πρόγραµµα στη Java απαρτίζεται από µία ή περισσότερες αυτόνοµες δοµικές µονάδες οι οποίες αλληλεπιδρούν µεταξύ τους. Οι µονάδες αυτές αποτελούν αντικείµενα των οποίων το είδος ορίζεται σε κάποιες κλάσεις. Τα αντικείµενα αυτά κατά τη διάρκεια εκτέλεσης του προγράµµατος κατασκευάζονται (καταλαµβάνοντας µέρος της µνήµης του ΗΥ), αλληλεπιδρούν µεταξύ τους (είτε κάνοντας κλήσεις το ένα στις µεθόδους του άλλου, είτε κατασκευάζοντας το ένα το άλλο, είτε τροποποιώντας το ένα τις µεταβλητές του άλλου) και τέλος καταστρέφονται (όταν πλέον δε χρησιµοποιούνται) απελευθερώνοντας το κοµµάτι µνήµης που είχαν δεσµεύσει. Σχηµατικά η ροή ενός τέτοιου προγράµµατος µπορεί να αποδοθεί όπως φαίνεται στην Εικόνα 4-1. Όπου τα παραλληλόγραµµα αντιστοιχούν σε αντικείµενα, το χρώµα τους χαρακτηρίζει την κλάση τους δηλαδή το είδος στο οποίο ανήκουν, τα αντικείµενα εµφανίζονται και εξαφανίζονται κατά την εκτέλεση του προγράµµατος, ενώ τα βελάκια που αποδίδουν τη µεταξύ τους αλληλεπίδραση η οποία µεταβάλλεται δυναµικά στο χρόνο οµή µιας κλάσης Κάθε κλάση ορίζεται µέσα από κάποιο αρχείο πηγαίου κώδικα δηλαδή µέσα από ένα αρχείο µε κατάληξη java. Υπενθυµίζεται ότι το πρόγραµµα που έχουµε ήδη υλοποιήσει και το οποίο φαίνεται στην Εικόνα 2-3, περιλαµβάνει ένα εξωτερικό µπλοκ όπου έχουµε χρησιµοποιήσει το χαρακτηρισµό class, κι εποµένως ορίζει µία κλάση. Το όνοµα της κλάσης αυτής είναι MyProgram και κατά συνέπεια µας δίνει τη δυνατότητα να κατασκευάζουµε αντικείµενα αυτού του τύπου. Το ακόλουθο τµήµα κώδικα περιλαµβάνει τον ορισµό µιας κλάσης µε το όνοµα Lamp. Όπως βλέπετε, η κλάση αυτή ξεκινάει µε τη δήλωση των µεταβλητών οι οποίες προσδιορίζουν ιδιότητες (color, power, on) και συνεχίζει µε τον ορισµό των µεθόδων που αντικατοπτρίζουν τη συµπεριφορά των αντικειµένων της κλάσης Lamp και που προφανώς, η συµπεριφορά αυτή εξαρτάται από την τιµή των ιδιοτήτων της 27

28 συγκεκριµένης λάµπας. Οι µεταβλητές αντιπροσωπεύουν ιδιότητες των αντικειµένων µιας κλάσης (οι οποίες ορίζονται στο εσωτερικό µιας κλάσης, στην αρχή του πηγαίου κώδικα) ονοµάζονται µεταβλητές-µέλη (member variables), ενώ οι µέθοδοι που αντιπροσωπεύουν τη συµπεριφορά των αντικειµένων µιας κλάσης (και ορίζονται στο εσωτερικό του πηγαίου κώδικα της κλάσης αυτής) ονοµάζονται µέθοδοι µέλη (member methods). /** * A demonstration class Chrisoula */ public class Lamp { String color = "red"; int power = 60; boolean on = false; /** * Turns on the lamp if not already on */ void turnon() { if(on == true) { System.out.println("Method turnon: Lamp is already On!"); else { on = true; System.out.println("Method turnon: Lamp is now On..."); /** * Turns off the lamp if not already off */ void turnoff() { if(on == false) { System.out.println("Method turnon: Lamp is already Off!"); else { on = false; System.out.println("Method turnon: Lamp is now Off..."); public static void main(string[] args) { //create a new Lamp Lamp l1 = new Lamp(); l1.color = "red"; l1.power = 60; l1.turnon(); l1.turnon(); //create a second Lamp Lamp l2 = new Lamp(); l1.color = "blue"; l1.power = 100; l1.on = true; l2.turnoff(); l2.turnon(); 28

29 Παρατηρήστε ότι η πρόσβαση τόσο στις µεταβλητές µέλη όσο και στις µεθόδους µέλη πραγµατοποιείται από ένα αντικείµενο της κλάσης (π.χ. l1, l2) ακολουθούµενο από µία τελεία. Για παράδειγµα: l1.on = true; l2.turnoff(); Επιπρόσθετα η κλάση Lamp περιέχει µία µέθοδο main η οποία καθορίζει το σηµείο έναρξης του προγράµµατος. Συνηθίζεται, όταν µία κλάση περιέχει µια µέθοδο main, η µέθοδος αυτή να είναι η τελευταία µέθοδος στο σώµα της κλάσης. Αξίζει να σηµειωθεί ότι το πρόγραµµα δεν θα είχε καµία διαφορά εάν η µέθοδος main δεν ορίζονταν στο εσωτερικό αυτής της κλάσης, αλλά κάποιας άλλης. Θα µπορούσε εποµένως στον παραπάνω κώδικα να λείπει η main και να βρίσκεται στο εσωτερικό κάποιας άλλης κλάσης, όπως για παράδειγµα: /** * A dummy class used for creating the main method. Chrisoula */ public class MyMain { public static void main(string[] args) { //create a new Lamp Lamp l1 = new Lamp(); l1.color = "red"; l1.power = 60; l1.turnon(); l1.turnon(); //create a second Lamp Lamp l2 = new Lamp(); l1.color = "blue"; l1.power = 100; l1.on = true; l2.turnoff(); l2.turnon(); Στην περίπτωση αυτή, κατά τη διάρκεια της µεταγλώττισης όταν ο compiler µεταγλωττίσει την κλάση MyMain θα ψάξει να βρει το αρχείο Lamp.java στο οποίο να περιέχεται ο ορισµός της κλάσης Lamp µαζί µε τις µεταβλητές και τις µεθόδους που τη συνοδεύουν. Στον πηγαίο κώδικα, τα ονόµατα των κλάσεων ξεκινούν πάντα µε κεφαλαίο σε αντίθεση µε τα ονόµατα µεταβλητών (είτε αρχέτυπων, είτε αναφοράς) και τα ονόµατα µεθόδων που ξεκινούν µε µικρό γράµµα. Αυτή είναι µία προγραµµατιστική σύµβαση η οποία χρησιµοποιείται για να κάνει τον κώδικα πιο ευανάγνωστο. Έτσι, όποτε βλέπετε κάποιο όνοµα το οποίο ξεκινάει µε κεφαλαίο γράµµα µπορείτε να θεωρείτε ότι είναι όνοµα κλάσης. Προσοχή: Στα αρχεία της Java δε θα δείτε ποτέ εντολές οι οποίες να µην περικλείονται µέσα σε κάποια µέθοδο. Οι µόνες γραµµές κώδικα οι οποίες υπάρχουν εκτός µεθόδων είναι η δήλωση των µεταβλητών. Έτσι για παράδειγµα, ενώ οι δηλώσεις: int i; //dilosi metavlitis i 29

30 int j = 5; //dilosi metavlitis j kai tis timis tis (*) µπορούν να υπάρχουν στην κορυφή του σώµατος µιας κλάσης, δηλώνοντας ότι η µεταβλητή i αποτελεί ιδιότητα των αντικειµένων της κλάσης αυτής, εντούτοις οι γραµµές : int i; //dilosi metavlitis i i = 5; //ekxorisi timis (LATHOS-ayto mporei na ginei mono mesa se methodο) δεν µπορούν να υπάρχουν στην κορυφή µιας κλάσης, καθώς ενώ η πρώτη αποτελεί δήλωση µεταβλητής των αντικειµένων της κλάσης, η δεύτερη γραµµή αποτελεί εντολή εκχώρησης, κι εποµένως µπορεί να γίνει µονό µέσα σε κάποια µέθοδο. Εκτός κι αν η εκχώρηση τιµής γίνει στην ίδια γραµµή µε τη δήλωση, δηλαδή όπως στην (*). Κατά αντιστοιχία, η κλίση των µεθόδων της κλάσης ή και οποιασδήποτε άλλης κλάσης θα πρέπει να γίνει µέσα από το µπλοκ κάποιας µεθόδου κι όχι κατευθείαν στο µπλοκ της κλάσης. ηλαδή π.χ. η µέθοδος turnon() µπορεί να καλεστεί µόνο µέσα από τη µέθοδο turnoff() ή τη main() ή ακόµα και µέσα από τον εαυτό της, κι όχι αυτόνοµα µέσα στο µπλοκ της κλάσης Μεταβλητές ήλωση µεταβλητών και αρχικές τιµές Η σύνταξη δήλωσης µιας µεταβλητής ακολουθεί το εξής πρότυπο: vartype varname; (*) Όπου vartype o τύπος της µεταβλητής, δηλαδή είτε κάποιος από τους τύπους του Πίνακας 4-1, εάν πρόκειται για µεταβλητή στοιχειώδους τύπου, είτε το όνοµα µιας κλάσης εάν πρόκειται για αντικείµενο, δηλαδή για µεταβλητή τύπου αναφοράς. Σε πολλές περιπτώσεις ταυτόχρονα µε τη δήλωση µπορεί να γίνει και η αρχικοποίηση της µεταβλητής ως εξής: vartype varname = initvalue; Όπου initvalue η αρχική τιµή η οποία φυσικά πρέπει να είναι σύµφωνη µε τον τύπο της µεταβλητής. Αναφορικά µε το διαχωρισµό σε αρχέτυπα και τύπους αναφοράς, θα πρέπει να γίνει µνεία στον τρόπο µε τον οποίο τα δύο αυτά είδη µεταβλητών δηλώνονται και αρχικοποιούνται µέσα στον κώδικα. Έτσι: int power; //dilosi metavlitis arxetypou int power = 200; //dilosi kai arxikopoihsh metavlitis arxetypoy Lamp lamp; //dilosi metavlitis anaforas Lamp lp1 = new Lamp(); //dilosi kai arxikopoihsh metavlitis anaforas Παρατηρήστε ότι για την αρχικοποίηση των µεταβλητών τύπου αναφοράς, δηλαδή για την αρχικοποίηση αντικειµένων χρησιµοποιείται ο τροποποιητής 4 new ακολουθούµενος από το όνοµα της κλάσης και ένα ζεύγος παρενθέσεις. Στην πραγµατικότητα η δήλωση new Lamp(); δηµιουργεί ένα νέο αντικείµενο της 4 Στη Java όλες οι λέξεις οι οποίες έχουν ειδικό νόηµα ονοµάζονται τροποποιητές (modifiers). 30

31 κλάσης Lamp επικαλούµενη τη µέθοδο κατασκευαστή. Η αρχικοποίηση αντικειµένων περιγράφεται αναλυτικότερα στην ενότητα Εάν δε δοθεί τιµή αρχική τιµή στη µεταβλητή, τότε η τιµή της είναι αυτή που φαίνεται στην προτελευταία κολόνα του Πίνακας 4-1 (η default τιµή), εάν πρόκειται για στοιχειώδη τύπο ή null εάν πρόκειται για τύπο αναφοράς, δηλαδή για αντικείµενο. Η λέξη null σηµαίνει ότι η µεταβλητή δεν αντιπροσωπεύει κάποιο αντικείµενο και χρησιµοποιείται µόνο για τύπους αναφοράς. Έτσι για παράδειγµα εάν για την κλάση Lamp επιχειρούσαµε σε κάποιο σηµείο, π.χ. στη µέθοδο main να καλέσουµε: Lamp l; l.turnon(); Τότε κατά την εκτέλεση θα προκύψει σφάλµα τύπου NullPointerExceπtion, λόγω του ότι δεν είναι δυνατό να προσπελαστεί µέθοδος ή µεταβλητή ενός αντικειµένου το οποίο δεν υπάρχει. Πράγµατι εφόσον το αντικείµενο l δεν έχει αρχικοποιηθεί, έχει την τιµή null Εµβέλεια µεταβλητών (variable scope) Η εµβέλεια µιας µεταβλητής, αναφέρεται στo εύρος του κώδικα στα οποία η µεταβλητή είναι προσπελάσιµη. Η προσπέλαση σε µία µεταβλητή αναφέρεται σε δύο τύπους πρόσβασης: α) στην ανάγνωση της τιµής της και β) στην εκχώρηση µιας τιµής στη µεταβλητή αυτή. Έτσι π.χ. η ακόλουθη γραµµή κώδικα απαιτείται να µπορεί να διαβάσει την τιµή των µεταβλητών a και b και να µπορεί να εκχωρήσει, δηλαδή να γράψει, να δώσει µια τιµή στη µεταβλητή c. c = a + b; Προς το παρόν θεωρήστε ότι µία µεταβλητή παρέχει πρόσβαση ανάγνωσης και εκχώρησης τιµής στο εσωτερικό του µπλοκ στο οποίο ορίζεται, δηλαδή στο µπλοκ στο οποίο γίνεται η δήλωσή της. Έτσι, οι µεταβλητές οι οποίες δηλώνονται ως µέλη µιας κλάσης (στην κορυφή του αρχείου µιας κλάσης) είναι προσπελάσιµες από όλη την κλάση ακόµα και µέσα από τις µεθόδους της κλάσης αυτής. Οι µεταβλητές αυτές είναι οι µεταβλητές-µέλη των αντικειµένων της κλάσης. Οι µεταβλητές οι οποίες δηλώνονται στο εσωτερικό µια µεθόδου είναι προσπελάσιµες µόνο µέσα από αυτή τη µέθοδο, ενώ οι µεταβλητές που ορίζονται µέσα από κάποιο άλλο µπλοκ (π.χ. στο εσωτερικό µιας if ή ενός βρόγχου διακλάδωσης τύπου for ή while) είναι προσπελάσιµες µόνο σε αυτό το µπλοκ και όχι έξω από αυτό Στατικές µεταβλητές και µεταβλητές στιγµιότυπου Πέραν από τις µεταβλητές οι οποίες µπορούν να πάρουν διαφορετική τιµή για κάθε αντικείµενο µιας κλάσης και οι οποίες ονοµάζονται µεταβλητές στιγµιότυπου (instance variables), υπάρχουν και µεταβλητές οι οποίες έχουν µία τιµή για όλα τα αντικείµενα της κλάσης. Το δεύτερο αυτό είδος µεταβλητών ονοµάζεται µεταβλητές κλάσης (class variables) ή στατικές µεταβλητές (static variables). Θεωρήστε για παράδειγµα την κλάση Lamp, της οποίας ο πηγαίος κώδικας παρατίθεται στην ενότητα Εάν το πρόγραµµα µας χρειάζεται ανά πάσα στιγµή να γνωρίζει πόσα αντικείµενα τύπου Lamp έχουν χρησιµοποιηθεί τότε, θα 31

32 µπορούσαµε να εισάγουµε µία µεταβλητή int nolamps, η οποία ανά πάσα στιγµή θα µας δίνει το πλήθος των αντικειµένων της Lamp. Όπως αντιλαµβάνεστε, η µεταβλητή αυτή δεν σχετίζεται µε το κάθε αντικείµενο της κλάσης ξεχωριστά αλλά µε την ίδια την κλάση Lamp. Κατά συνέπεια, το πλήθος των αντικειµένων της Lamp θα πρέπει να εκφράζεται από µία στατική µεταβλητή. Οι στατικές µεταβλητές στον κώδικα διαχωρίζονται από της µεταβλητές στιγµιότυπου εάν η δήλωσή τους προηγείται από τη λέξη static. ηλαδή, static int nolamps; //the number of Lamps used by the program Παρατηρήστε ότι η τιµή της µεταβλητής αυτής αλλάζει κατά τη διάρκεια του προγράµµατος, καθώς νέα αντικείµενα Lamp δηµιουργούνται και καταστρέφονται, αλλά ότι για όλα τα αντικείµενα τύπου Lamp έχει την ίδια τιµή. Στην περίπτωση που µία µεταβλητή είναι µεταβλητή στιγµιότυπου, η προσπέλαση στη µεταβλητή αυτή πραγµατοποιείται από ένα αντικείµενο ακολουθούµενο από µία τελεία: l1.on = true; Στην περίπτωση που η µεταβλητή αυτή είναι στατική τότε η τιµή της µπορεί να προσπελαστεί είτε από ένα αντικείµενο είτε απευθείας από το όνοµα της κλάσης. Κι εποµένως και οι δύο ακόλουθες δηλώσεις είναι σωστές: l2.nolamps = 3; ή Lamp.noLamps = 3; Κατά συνέπεια, η προσπέλαση µιας στατικής µεταβλητής δεν απαιτεί την προγενέστερη δηµιουργία αντικειµένου της κλάσης. Έτσι, ενώ, Μεταβλητές στιγµιότυπου (instance variables) ονοµάζονται οι µεταβλητές- µέλους µιας κλάσης οι οποίες αναφέρονται σε ιδιότητες των αντικειµένων της κλάσης αυτής. Η προσπέλαση (ανάγνωση και εκχώρηση) των µεταβλητών στιγµιότυπου πραγµατοποιείται µέσα από ένα αντικείµενο της κλάσης. Στατικές µεταβλητές ή µεταβλητές κλάσης (class variables ή static variables) ονοµάζονται οι µεταβλητές οι οποίες έχουν κοινή τιµή για όλα τα στιγµιότυπα της κλάσης. Η προσπέλαση (ανάγνωση και εκχώρηση) των µεταβλητών στιγµιότυπου πραγµατοποιείται είτε µέσα από ένα αντικείµενο της κλάσης είτε απευθείας από το όνοµα της ίδιας της κλάσης Σταθερές Επιπρόσθετα µε τις στατικές µεταβλητές οι οποίες έχουν κοινή τιµή για όλα τα αντικείµενα µιας κλάσης, αλλά όχι απαραίτητα την ίδια τιµή σε όλη τη διάρκεια του προγράµµατος, η Java χρησιµοποιεί και σταθερές. Οι σταθερές είναι µεταβλητές µέλη κλάσεων οι οποίες έχουν µία και µοναδική τιµή σε όλη τη διάρκεια του προγράµµατος. Προκειµένου µία µεταβλητή να δηλωθεί ως σταθερά, στη δήλωσή της οι τροποποιητές static final προηγούνται του τύπου. Για παράδειγµα θεωρήστε µια κλάση WhiteLamp η οποία έχει τέσσερις µεταβλητές µέλους: τις µεταβλητές στιγµιότυπου power και on καθώς, τη στατική µεταβλητή nowhitelamps καθώς και τη σταθερά LAMP_COLOR. public class WhiteLamp { int power = 60; 32

33 boolean on = false; static int nowhitelamps; //the number of WhiteLamps static final String LAMP_COLOR = "white"; Παρατηρήστε ότι τα για τα ονόµατα σταθερών χρησιµοποιούνται κεφαλαία γράµµατα και ότι διαδοχικές λέξεις χωρίζονται µε το σύµβολο της κάτω παύλας _ (underscore) Μέθοδοι Μια µέθοδος (method) στη Java είναι µία συνάρτηση, δηλαδή ένα σύνολο από εντολές οι οποίες µπορούν να κληθούν συνολικά, σαν ένα πακέτο. Προσοχή: Σε αντίθεση µε άλλες γλώσσες προγραµµατισµού όπως η C και η C++, στη Java mία µέθοδος είναι πάντα µέθοδος µέλους, δηλαδή οι µέθοδοι οι οποίοι υλοποιούν τη συµπεριφορά των αντικειµένων µιας κλάσης υφίστανται πάντα στο εσωτερικό των κλάσεων και ποτέ αυτόνοµα Υλοποίηση και κλίση µεθόδων Μπορείτε να σκέφτεστε µία µέθοδο ως µία διαδικασία επεξεργασίας δεδοµένων, δηλαδή ως µία συνάρτηση. Κατά κανόνα, µία µέθοδος δέχεται κάποιες µεταβλητές υπό µορφή ορισµάτων στην είσοδό της, κάνει κάποια επεξεργασία και επιστρέφει κάποιο αποτέλεσµα. Στη γενική περίπτωση, η σύνταξη δήλωσης µιας µεθόδου ακολουθεί το εξής πρότυπο: rettype methodname ( argtype1 argname1, argtype2 argname2,...) { rettype rtn; command1; command2;. return rtn; Όπου rettype είναι ο τύπος της µεταβλητής η οποία επιστρέφεται σαν αποτέλεσµα της κλίσης στη µέθοδο και methodname είναι το όνοµα της µεθόδου. Μία µέθοδος δεν έχει περιορισµό στο πλήθος των ορισµάτων της: υπάρχουν µέθοδοι που δεν έχουν κανένα όρισµα και άλλες που έχουν πολλά ορίσµατα. argtype1, argtype2, είναι οι τύποι των ορισµάτων της µεθόδου, ενώ argname1, argname2, είναι τα ονόµατα των ορισµάτων της µεθόδου. Παρατηρήστε ότι µία µέθοδος αποτελεί ένα µπλοκ κώδικα στο οποίο εµπεριέχονται εντολές (π,χ. command1, κ.λ.π.), δηλώσεις µεταβλητών και εκχώρηση τιµών µεταβλητών κ.α. και ότι πριν το κλείσιµο αυτού του µπλοκ, η µέθοδος θα πρέπει υποχρεωτικά να χρησιµοποιεί τη λέξη κλειδί return επιστρέφοντας µία µεταβλητή της οποίας ο τύπος είναι συµβατός µε τον τύπο που δηλώνεται ως rettype, εκτός κι αν ως rettype έχει δηλωθεί η λέξη void (κενό) η οποία υποδηλώνει ότι η συγκεκριµένη µέθοδος δεν επιστρέφει δεδοµένα. Ας δούµε κάποια παραδείγµατα µεθόδων µέσα από µία κλάση. 33

34 public class TwoNumbers { int firstnumber, secondnumber; int getsum() { int sum = firstnumber + secondnumber; return sum; void changenumbers(int first, int second) { firstnumber = first; secondnumber = second; int getmaximum() { int max; if (firstnumber > secondnumber) { max = firstnumber; else { max = secondnumber; return max; Η κλάση αυτή έχει τη δυνατότητα να ενσωµατώνει δύο ακέραιους αριθµούς σε ένα αντικείµενο και περιέχει τρεις µεθόδους: Η µέθοδος int getsum() προσθέτει τους δύο ακεραίους και επιστρέφει το αποτέλεσµα της πρόσθεσης του οποίου ο τύπος είναι επίσης ακέραιος. Η µέθοδος αυτή δεν παίρνει κανένα όρισµα καθώς δεν απαιτείται επιπλέον πληροφορία, πέρα από τους δύο ακέραιους που αποτελούν µεταβλητές µέλη των αντικειµένων της κλάσης αυτής. Η µέθοδος void changenumbers(int first, int second) η οποία αλλάζει τιµές στις µεταβλητές µέλη των αντικειµένων της κλάσης TwoNumbers. Ο τύπος επιστροφής της µεθόδου αυτής είναι void, το οποίο σηµαίνει κενό. Γενικά οι µέθοδοι µε τύπο επιστροφής void δεν επιστρέφουν δεδοµένα έπειτα από κλίση σε αυτές. Η µέθοδος int getmaximum() η οποία επιστρέφει το µέγιστο από τους δύο αριθµούς. Προσοχή: Οι µεταβλητές int sum και int max οι οποίες ορίζονται µέσα στο σώµα των µεθόδων int getsum() και int getmaximum() αντίστοιχα, έχουν ισχύ µόνο στο σώµα των µεθόδων αυτών. ηλαδή κατά την έξοδο από τις µεθόδους αυτές οι τοπικές (local) µέταβλητές καταστρέφονται αυτόµατα και δεν είναι προσπελάσιµες. Επίσης προσέξτε ότι κατά την έξοδο από τη µέθοδο void changenumbers(int first, int second) οι µεταβλητές µέλη firstnumber και secondnumber, οι οποίες έχουν εµβέλεια σε όλη την κλάση, έχουν αλλάξει τιµή. Ας δούµε τώρα πώς µπορεί κανείς να χρησιµοποιήσει, δηλαδή να καλέσει της µεθόδους αυτές, µέσα από µία µέθοδο main. public class MyMain { 34

35 public static void main(string[] args) { TwoNumbers tn = new TwoNumbers(); tn.changenumbers(5,84); int m = tn.getmaximum(); System.out.println("The maximum number is: " + m); int s = tn.getsum(); System.out.println("The sum of the numbers is: " + s); Στην παραπάνω λίστα κώδικα παρατηρήστε τα εξής: Προκειµένου να γίνει κλίση σε οποιαδήποτε από τις µεθόδους της κλάσης TwoNumbers θα πρέπει προηγουµένως να έχουµε κατασκευάσει ένα αντικείµενο της κλάσης αυτής. Ένα τέτοιο αντικείµενο αντιπροσωπεύεται από τη µεταβλητή tn τύπου TwoNumbers έπειτα από της δήλωση new TwoNumbers() Η κλίση στις µεθόδους της κλάσης TwoNumbers πραγµατοποιείται µέσα από το αντικείµενο tn το οποίο συνδέεται µε το όνοµα της µεθόδου µε τελεία (π.χ. tn.changenumbers (5, 84) ). Κατά την κλίση µίας µεθόδου δεν αναγράφεται ο τύπος των ορισµάτων της µεθόδου αλλά µονάχα η τιµή τους Στατικές Μέθοδοι Σε πλήρη αντιστοιχία µε τις στατικές µεταβλητές-µέλη µιας κλάσης ορίζονται και οι στατικές µέθοδοι µιας κλάσης. Έτσι, για παράδειγµα η παραπάνω κλάση TwoNumbers θα µπορούσε να περιέχει την ακόλουθη στατική µέθοδο: static int getfactorial(int n) { int factorial = 1; for (int i=1; i<= n; i++) { factorial = factorial* i; return factorial; Η µέθοδος αυτή επιστρέφει το παραγοντικό γινόµενο του αριθµού n που της δίνεται ως όρισµα. Παρατηρήστε τα εξής: Η λέξη static προηγείται του τύπου επιστροφής. Η συγκεκριµένη µέθοδος είναι στατική διότι δεν επηρεάζει καµία από τις µεταβλητές µέλη της κλάσης και εποµένως η κλίση στη µέθοδο αυτή έχει την ίδια συµπεριφορά για όλα τα αντικείµενα της κλάσης TwoNumbers, δηλαδή ανεξάρτητα από τις τιµές των µεταβλητών firstnumber και secondnumber. Σε γενικές γραµµές µία µέθοδος µπορεί να είναι στατική µόνο εφόσον δε χρησιµοποιεί µεταβλητές στιγµιότυπου, δηλαδή εφόσον είτε δε 35

36 χρησιµοποιεί µεταβλητές µέλη, ή οι µεταβλητές µέλη που χρησιµοποιεί είναι στατικές µεταβλητές. Η κλίση στη µέθοδο αυτή δεν απαιτεί τη δηµιουργία νέου αντικειµένου της κλάσης TwoNumbers αλλά µπορεί να γίνει απευθείας µε το όνοµα της κλάσης ως εξής: int f; f = TwoNumbers.getFactorial(54); Κατά συνέπεια: Στατικές µέθοδοι (static methods) ονοµάζονται οι µέθοδοι µιας κλάσης οι οποίες έχουν κοινή συµπεριφορά για όλα τα στιγµιότυπα-αντικείµενα της κλάσης. Η κλίση των στατικών µεθόδων µίας κλάσης δεν απαιτεί τη δηµιουργία νέου αντικειµένου, καθώς µπορεί να πραγµατοποιηθεί απευθείας µε το όνοµα της κλάσης Η κλάση Math Στο σηµείο αυτό είναι σκόπιµο να αναφερθούµε σε µία κλάση η οποία θα σας φανεί ιδιαίτερα χρήσιµη για τον υπολογισµό µαθηµατικών συναρτήσεων. Η κλάση αυτή είναι υλοποιηµένη από την ίδια τη γλώσσα, και περιέχει δύο σταθερές (τη σταθερά του Euler και του Ευκλείδη): static final double E; //Euler's constant static final double PI; //Euclidean constant ενώ επίσης περιέχει στον ορισµό της ένα πλήθος από στατικές µεθόδους για τον υπολογισµό εκθετικών, τριγωνοµετρικών και άλλων συναρτήσεων. Έτσι π.χ. εάν µέσα στο πρόγραµµά σας χρειαστεί να γνωρίζετε το υπερβολικό συνηµίτονο του π/4 τότε θα πρέπει να το υπολογίσετε ως εξής: double x = Math.cosh(Math.PI/4); Καθώς οι µαθηµατικές µέθοδοι που παρέχονται από την κλάση Math είναι στατικές, δεν απαιτείται η δηµιουργία νέου αντικειµένου της κλάσης αυτής, δηλαδή η κλίση µπορεί να γίνεται απευθείας µέδω του ονόµατος της κλάσης Υπερφόρτωση µεθόδου Υπερφόρτωση µεθόδου (method overloading) ονοµάζεται το φαινόµενο κατά το οποίο µία κλάση περιέχει δύο µεθόδους µε το ίδιο ακριβώς όνοµα αλλά διαφορετικό πλήθος ή/και διαφορετικό είδος ορισµάτων. Για παράδειγµα, η κλάση που ακολουθεί περιέχει τέσσερις µεθόδους µε το ίδιο όνοµα αλλά µε διαφορετικό πλήθος/τύπο ορισµάτων. public class Averager { /** * Returns the average of two integers a first integer b second integer average */ int averagenumbers (int a, int b){ return (a+b)/2; /** * Returns the average of three integers a first integer b second integer 36

37 c third integer average */ int averagenumbers(int a, int b, int c) { return (a+ b + c)/3; /** * Returns the average of two floating point numbers a first float b second float average */ float averagenumbers(float a, float b) { return (a+b)/2; /** * Returns the average of three floating point numbers a first float b second float c third float average */ float averagenumbers(float a, float b, float c) { return (a+b+c)/3; Προσοχή: εν µπορεί να γίνει υπερφόρτωση µεθόδου µε ίδιο όνοµα µεθόδου, ίδια ορίσµατα και διαφορετικό τύπο επιστροφής. Πράγµατι εάν επιχειρείστε κάτι τέτοιο π.χ. int averagenumbers (int a, int b) και float averagenumbers (int a, int b) τότε η κλίση στη µέθοδο αυτή δεν είναι µονοσήµαντα ορισµένη. ηλαδή, η κλίση aver.averagenumbers(3, 8); µπορεί να αντιστοιχεί είτε στην πρώτη είτε στη δεύτερη µέθοδο. Κάτι τέτοιο θα είχε ως αποτέλεσµα σφάλµα κατά τη µεταγλώττιση του κώδικα σας (compiler error) Μέθοδοι κατασκευαστές (constructor methods) Μέθοδος κατασκευαστής µιας κλάσης ονοµάζεται µία µέθοδος η οποία έχει τη δυνατότητα να δηµιουργεί να κατασκευάζει δηλαδή νέα αντικείµενα της κλάσης αυτής. Σαν παράδειγµα θεωρήστε τον πηγαίο κώδικα της κλάσης που ακολουθεί. Η κλάση Lamp διαθέτει τρεις µεθόδους κατασκευαστές: µία χωρίς ορίσµατα, µία µε ένα όρισµα και µία µε τρία ορίσµατα. Εποµένως έχει υπερφορτωθεί η µέθοδος κατασκευαστή, ένα φαινόµενο που είναι γνωστό ως υπερφόρτωση κατασκευαστή (constructor overloading). Κατά κανόνα µία µέθοδος κατασκευαστής έχει σα στόχο να αρχικοποιήσει τα αντικείµενα µιας κλάσης, δίνοντας αρχικές τιµές στις ιδιότητες (µεταβλητές) των αντικειµένων της. Όσον αφορά τις µεθόδου κατασκευαστές µιας κλάσης θα πρέπει να γνωρίζεται τα εξής: 37

38 Κάθε µέθοδος κατασκευαστής έχει το ίδιο ακριβώς όνοµα µε την κλάση στην οποία ανήκει. Η δήλωση των µεθόδων κατασκευαστών δεν περιλαµβάνει τύπο επιστροφής, καθώς ο τύπος επιστροφής υπονοείται και ταυτίζεται µε την κλάση στην οποία ανήκει. ηλαδή η µέθοδος κατασκευαστής επιστρέφει ένα αντικείµενοστιγµιότυπο της κλάσης αυτής. Η κλίση σε µία µέθοδο κατασκευαστή γίνεται µέσω του τροποποιητή new. Για παράδειγµα Lamp l = new Lamp(); Κάθε κλάση έχει τουλάχιστον µία µέθοδο κατασκευαστή, ακόµα κι αν αυτή δεν περιλαµβάνεται στον ορισµό της. ηλαδή, εάν στον πηγαίο κώδικα της κλάσης δεν περιλαµβάνεται κάποια µέθοδος κατασκευαστής τότε υπονοείται ότι υπάρχει η κενή µέθοδος κατασκευαστής, δηλαδή ένας κατασκευαστής χωρίς ορίσµατα και χωρίς καµία εντολή. ηλαδή, στο παρακάτω παράδειγµα, εάν δεν περιλαµβάνονταν κανένας κατασκευαστής, θα υπήρχε ο κενός κατασκευαστής Lamp() {. Μοναδική εξαίρεση σε αυτόν τον κανόνα αποτελούν οι αφηρηµένες κλάσεις (abstract classes) οι οποίες αναφέρονται σε επόµενο κεφάλαιο. public class Lamp { String color; int power; boolean on; Lamp() { color = "white"; power = 60; on = false; Lamp(String color) { this.color = color; Lamp(String col, int power, boolean on) { color = col; this.power = power; this.on = on; public static void main(string[] args) { //create a new Lamp Lamp l1 = new Lamp(); l1.color = "red"; l1.power = 60; l1.turnon(); //create a second Lamp Lamp l2 = new Lamp("blue", 100, true); l2.turnoff(); Κύκλος ζωής αντικειµένων Τελειώνοντας το κεφάλαιο αυτό θα πρέπει να έχετε εξοικειωθεί µε τις έννοιες κλάση και αντικείµενο και επιπλέον θα πρέπει να σας είναι ξεκάθαρο ότι κατά τη διάρκεια εκτέλεσης ενός java προγράµµατος τα κοµµάτια µνήµης του υπολογιστή που έχουν 38

39 δεσµευτεί εκπροσωπούν αντικείµενα. ηλαδή δεν υφίστανται µεταβλητές ή µέθοδοι αυτόνοµα χωρίς δηλαδή αυτές να έχουν συνδεθεί µε κάποιο αντικείµενο. Για να συνοψίσουµε λοιπόν: Επίσης, Το αντικείµενο (object) είναι η ελάχιστη δοµική µονάδα ενός Java προγράµµατος. Κάθε αντικείµενο καθορίζεται από συγκεκριµένες ιδιότητες (τιµές µεταβλητών) και από συγκεκριµένη συµπεριφορά (µεθόδους). Κατά κανόνα η κλίση των µεθόδων ενός αντικειµένου εξαρτάται άµεσα από τις ιδιότητες του αντικειµένου αυτού. Η κλάση ή τάξη (class) ενός αντικειµένου καθορίζει το είδος του αντικειµένου αυτού, δηλαδή το τι είδους ιδιότητες έχει, και ποιες ενέργειες µπορεί να εκτελεί µε τη συµπεριφορά του. ηλαδή, µια κλάση ορίζει τον τύπο και το όνοµα των µεταβλητών µιας κλάσης, χωρίς απαραίτητα να καθορίζει την τιµή τους. Μία κλάση δε δεσµεύει µνήµη κατά τη διάρκεια εκτέλεσης ενός προγράµµατος κι εποµένως δεν υφίσταται εάν κατά την εκτέλεση δε δηµιουργηθούν αντικείµενα της κλάσης αυτής. Σε χρόνο εκτέλεσης, τα αντικείµενα αποτελούν τις επιµέρους οντότητες του προγράµµατος οι οποίες κατασκευάζονται, αλληλεπιδρούν µεταξύ τους και τέλος καταστρέφονται. Έτσι, µπορούµε να πούµε ότι ο κύκλος ζωής ενός αντικειµένου στη Java αποτελείται από τρία στάδια: α) τη δηµιουργία, β) την εκτέλεση, γ) την καταστροφή Μεταβλητές τύπου αναφοράς Όπως έχει ήδη αναφερθεί (ενότητα 4.1), οι τύποι µεταβλητών διακρίνονται σε δύο είδη: στα αρχέτυπα (primitives) και στους τύπους αναφοράς (reference types). Ο όρος αρχέτυπα αναφέρεται σε τύπους οι οποίοι δεν µπορούν να κατατµηθούν περαιτέρω (π.χ. int, float, bollean, κ.λ.π.), ενώ αντίθετα οι τύποι αναφοράς αναφέρονται σε µεταβλητές οι οποίες χρησιµοποιούνται σαν αναφορές για κάποιο αντικείµενο. Θεωρήστε σαν παράδειγµα την κλάση Lamp του πηγαίου κώδικα που έχει προηγηθεί. Οι µεταβλητές power και on είναι αρχέτυπα ενώ οι µεταβλητές l1, l2 στο εσωτερικό της µεθόδου main είναι µεταβλητές αναφοράς. Οι µεταβλητές l1 και l2 δίνουν πρόσβαση στα αντικείµενα είναι δηλαδή ένας τρόπος να αναφερόµαστε στα δύο αντικείµενα τύπου Lamp που έχουν δηµιουργηθεί εντός της main. Στην πραγµατικότητα τα l1 και l2 αποτελούν δείκτες (pointers). Όπως ενδεχοµένως γνωρίζετε από τη γλώσσα προγραµµατισµού C, οι δείκτες αντιπροσωπεύουν διευθύνσεις στη µνήµη του ΗΥ. Έτσι, τα l1 και l2 δεν εκπροσωπεύουν τα ίδια τα αντικείµενα, αλλά τις διευθύνσεις της µνήµης όπου αυτά βρίσκονται αποθηκεµένα. Εποµένως, µία δήλωση όπως η ακόλουθη: l2 = l1; δεν εξισώνει τα δύο αντικείµενα. ε λέει δηλαδή ότι από δω και µπρος το αντικείµενο l2 θα ισούται µε το αντικείµενο l1, αλλά ότι πλέον ο δείκτης l2 δείχνει τη θέση µνήµης όπου βρίσκεται αποθηκευµένο το αντικείµενο l1, κι εποµένως δεν υπάρχει πλέον αναφορά για το αντικείµενο που προϋπήρχε στη θέση l2. Όπως εξηγείται στην ενότητα που ακολουθεί, όταν όλες οι αναφορές ενός αντικειµένου παύουν να δείχνουν σε αυτό, τότε το αντικείµενο καταστρέφεται αυτόµατα από µια διαδικασία του Java Virtual Machine που ονοµάζεται garbage collector. 39

40 Αποκοµιδή απορριµµάτων Παρατηρήστε ότι παρόλο που τόσο η δηµιουργία ενός αντικείµενου πραγµατοποιείται ρητά από τον κώδικα, µέσω της κλίσης σε κάποια µέθοδο κατασκευαστή µε τον τροποποιητή new, όσο και η αλληλεπίδραση του αντικειµένου αυτού µε άλλα αντικείµενα γίνεται επίσης ρητά µε κλίση στις µεθόδους του ή µε τροποποίηση των ιδιοτήτων του, εντούτοις η καταστροφή των αντικειµένων γίνεται σιωπηλά, χωρίς να χρησιµοποιείται κάποια συγκεκριµένη εντολή. Ο λόγος είναι ότι η Java, σε αντίθεση µε άλλες γλώσσες προγραµµατισµού όπως η C++ παρέχει αυτόµατη αποκοµιδή απορριµµάτων. Αυτόµατη αποκοµιδή απορριµµάτων (automatic garbage collection) είναι το φαινόµενο εκείνο κατά το οποίο τα αντικείµενα που έχουν δηµιουργηθεί κατά την εκτέλεση ενός προγράµµατος καταστρέφονται αυτόµατα από το πρόγραµµα όταν πάψουν να χρησιµοποιούνται, ελευθερώνοντας ταυτόχρονα τη µνήµη που είχαν δεσµεύσει. Η διαδικασία του JVM πραγµατοποιεί αποκοµιδή απορριµµάτων ονοµάζεται garbage collector. Στη Java, Η καταστροφή των αντικειµένων επιτελείται όταν όλες οι αναφορές ενός αντικειµένου πάψουν να δείχνουν σε αυτό. Για παράδειγµα στο ακόλουθο απόσπασµα κώδικα, οποιαδήποτε από τις δύο τελευταίες γραµµές οδηγεί στην καταστροφή του δεύτερου αντικειµένου µε προγενέστερη µεταβλητή αναφοράς l2 καθώς ο αντίστοιχος δείκτης παύει να δείχνει στη θέση µνήµης όπου βρίσκεται αποθηκευµένο το δεύτερο αντικείµενο της κλάσης Lamp. public static void main(string[] args) { //create a new Lamp Lamp l1 = new Lamp(); l1.color = "red"; l1.power = 60; l1.turnon(); //create a second Lamp Lamp l2 = new Lamp("blue", 100, true); l2.turnoff(); l2 = null; //causes Garbage Collector to destroy the second object l2 = l1; //causes Garbage Collector to destroy the second object Εντούτοις, εάν προηγουµένως η διεύθυνση αυτή έχει αποθηκευτεί σε κάποια άλλη µεταβλητή αναφοράς, π.χ. l3 = l2; τότε το δεύτερο αντικείµενο δε θα καταστραφεί. Στις γλώσσες προγραµµατισµού οι οποίες δεν υποστηρίζουν automatic garbage collection, υπάρχει ο κίνδυνος να προκληθεί ένα φαινόµενο που είναι γνωστό ως διαρροή µνήµης (memory leak). Το φαινόµενο αυτό προκαλείται όταν κάποια αντικείµενα δηµιουργούνται χωρίς να καταστρέφονται ρητά από τον πραγραµµατιστή, όταν πάψουν να είναι χρήσιµα. Σαν αποτέλεσµα, η µνήµη που δεσµεύεται στον ΗΥ αυξάνεται διαρκώς; καθώς νέα αντικείµενα δηµιουργούνται κι όταν η χρησιµοποιούµενη µνήµη προσεγγίσει τα όρια της διαθέσιµης µνήµης το πρόγραµµα κολλάει και πλέον πρέπει να τερµατιστεί µη οµαλά (abnormal termination) από εξωτερική διαδικασία. 40

41 4.3 Άσκηση Να κατασκευάσετε ένα αυτόνοµο Java πρόγραµµα το οποίο να κατασκευάζει τρία αντικείµενα µιας κλάσης Cat µέσα από µία µέθοδο main. H κλάση Cat να περιέχει κάποιες ιδιότητες (π.χ. name) και µία µέθοδο void printattributes() η οποία θα εκτυπώνει της ιδιότητες των αντικειµένων της κλάσης Cat. Μέσα από τη main να κατασκευάσετε 3 αντικείµενα τύπου Cat µε διαφορετικές ιδιότητες και να καλέσετε για κάθε ένα τη µέθοδο printattributes(). 41

42 5 Επαναχρησιµοποίηση κλάσεων Ένα από τα πιο συναρπαστικά χαρακτηριστικά της γλώσσας προγραµµατισµού Java είναι η δυνατότητα που δίνει στον προγραµµατιστή να επαναχρησιµοποιεί τον κώδικα που έχει ήδη υλοποιηθεί. Η δυνατότητα επαναχρησιµοποίησης κώδικα (source code reuse) δεν γίνεται µέσω απλής αντιγραφής (copy-paste), αλλά µε τη δηµιουργία νέων κλάσεων οι οποίες δεν υλοποιούνται εκ του µηδενός αλλά χρησιµοποιούν άλλες, ήδη υπάρχουσες κλάσεις. Έτσι, η όλη φιλοσοφία της java έγκειται στο γεγονός ότι οι κλάσεις που υλοποιούνται θα πρέπει να είναι επαναχρησιµοποιήσιµες, κι ότι όταν κάποιος θέλει να φτιάξει ένα πρόγραµµα δε χρειάζεται να «ξανα-ανακαλύψει τον τροχό» αλλά µπορεί να χρησιµοποιήσει τον κώδικα που έχουν ήδη γράψει άλλοι πριν από αυτόν. Με τον τρόπο αυτό οι κλάσεις που παρέχονται από την ίδια τη Java είναι επαναχρησιµοποιήσιµες. ηλαδή, για παράδειγµα, εάν θελήσετε να συµπεριλάβετε στο πρόγραµµα σας το γραφικό αντικείµενο που αναπαριστά ένα κουµπί, µπορείτε να χρησιµοποιήσετε την κλάση Button, που διατίθεται από το JDK της Java και οι οποία ενσωµατώνει σε ένα αντικείµενο τις ιδιότητες και τη συµπεριφορά ενός κουµπιού. Την περιγραφή των κλάσεων που παρέχονται από την ίδια τη γλώσσα και που σας βοηθούν να αναπτύσσετε τα προγράµµατά σας µπορείτε να τη δείτε από την html σελίδα <jdk_dir>/docs/api/index.html Όπου <jdk_dir>, ο φάκελος στον οποίο έχετε εγκαταστήσει το JDK. Στο λειτουργικό των windows o φάκελος αυτός συνήθως είναι ο C:\Program Files\Java\jdk1.6.0_07 Η περιγραφή αυτή διατίθεται και δικτυακά από την ιστοσελίδα της Java: Πέρα από τις κλάσεις αυτές, που ανήκουν στον πυρήνα της Java (core java), µπορεί κάποιος, για πιο εξειδικευµένες χρήσεις να χρησιµοποιεί και κλάσεις από βιβλιοθήκες τρίτων (third-party libraries), όπως λέγονται. Μία τέτοια βιβλιοθήκη θα χρησιµοποιήσουµε κατά τη διάρκεια του εξαµήνου. Η βιβλιοθήκη αυτή λέγεται JSyn, επικεντρώνεται στην υλοποίηση εφαρµογών σύνθεσης ήχου και διατίθεται ελεύθερα από την ιστοσελίδα: Στις επόµενες ενότητες του κεφαλαίου αυτού θα ασχοληθούµε µε τις δύο βασικές τεχνικές επαναχρησιµοποίησης κλάσεων που είναι η σύνθεση (composition) και η κληρονοµικότητα (inheritance). 5.1 Σύνθεση κλάσεων (η σχέση has-a) Η σύνθεση αντικειµένων είναι ένα φαινόµενο που έχουµε ήδη χρησιµοποιήσει στα πλαίσια του προηγούµενου κεφαλαίου. Η σύνθεση αναφέρεται στο γεγονός ότι τα αντικείµενα µιας κλάσης µπορεί να περιλαµβάνουν σα µεταβλητές-µέλη αντικείµενα άλλων κλάσεων. Έτσι στο παράδειγµα της κλάσης Lamp, η µεταβλητή color είναι ένα αντικέιµενο της κλάσης String, η οποία είναι µία κλάση που διατίθεται από τον πυρήνα της Java και αναπαριστά µία ακολουθία χαρακτήρων. Έτσι για την περίπτωση της κλάσης Lamp, µπορούµε να πούµε ότι ένα αντικείµενο της κλάσης 42

43 αυτής έχει-ένα (has-a) αντικείµενο color της κλάσης String. ηλαδή η σύνθεση αντικειµένων δηµιουργεί µία σχέση αντικειµένων γνωστή ως has-a. Ας δούµε ένα άλλο παράδειγµα. Θεωρήστε την κλάση Point η οποία αναπαριστά ένα σηµείο στο καρτεσιανό επίπεδο, µέσω των συντεταγµένων του x και y: public class Point { int x; int y; Point(int x, int y) { this.x = x; this.y = y; Μία κλάση η οποία αναπαριστά µία γραµµή στο καρτεσιανό επίπεδο µπορεί τότε να οριστεί από δύο τέτοια σηµεία, και κατά συνέπεια η κλάση Line περιλαµβάνει (συντίθεται) από δύο αντικείµενα της κλάσης Point: public class Line { Point startpoint; Point endpoint; Line (Point p1, Point p2) { startpoint = p1; endpoint = p2; void drawline() { //some commands to draw the points of the line Κατά συνέπεια: Στον αντικειµενοστραφή προγραµµατισµό, σύνθεση (composition) ονοµάζεται το φαινόµενο κατά το οποίο στον ορισµό µία κλάση περιλαµβάνονται αντικείµενα άλλων κλάσεων, ως µεταβλητές-µέλη της κλάσης αυτής. Η σύνθεση αντικειµένων δηµιουργεί µία σχέση τύπου has-a, καθώς η κυρίως κλάση διαθέτει ένα στιγµιότυπο αντικειµένου άλλης κλάσης. 5.2 Κληρονοµικότητα κλάσεων (σχέση is-a) Στον προγραµµατισµό, η ιδέα του αντικειµένου παρέχει ένα σηµαντικό πλεονέκτηµα. Πέρα από το γεγονός ότι προσεγγίζει καλύτερα τα προβλήµατα στον φυσικό κόσµο, παρέχει επίσης ένα εργαλείο το οποίο επιτρέπει την οµαδοποίηση δεδοµένων και λειτουργιών σε µία οντότητα κι εποµένως επιτρέπει την αναπαράσταση ενός προβλήµατος-µιας ιδέας συνολικά αντί να υποχρεώνει την µεταφορά του προβλήµατος αυτού σε ιδιωµατισµούς που αναφέρονται στο συγκεκριµένο µηχάνηµα. Αυτή η οµαδοποίηση προτυποποιείται µέσα από µία κλάση και πραγµατοποιείται µέσω των αντικειµένων της κλάσης αυτής. 43

44 Εντούτοις, ορισµένες φορές µπορεί να φαίνεται µάταιο να µπει κάποιος στη διαδικασία να δηµιουργήσει µία κλάση κι έπειτα να αναγκαστεί να δηµιουργήσει µία δεύτερη κλάση µε παρόµοια χαρακτηριστικά προκειµένου να οµαδοποιήσει δεδοµένα και λειτουργίες που είναι ελαφρώς τροποποιηµένα. Είναι αντ αυτού προτιµότερο να δηµιουργήσει µία κλάση, να την κλωνοποιήσει και να προσθέσει κάποια χαρακτηριστικά ή/και κάποιες αλλαγές σε σχέση µε το αρχικό πρότυπο. Το φαινόµενο αυτό στον αντικειµενοστραφή προγραµµατισµό ονοµάζεται κληρονοµικότητα (inheritance). Στον αντικειµενοστραφή προγραµµατισµό, κληρονοµικότητα (inheritance) ονοµάζεται το φαινόµενο κατά το οποίο µία κλάση κληρονοµεί ιδιότητες (µεταβλητές) και συµπεριφορά (µεθόδους) από κάποια άλλη κλάση. Η µεν κλάση από την οποία κληροδοτούνται χαρακτηριστικά ονοµάζεται βασική κλάση (base class) ή υπερκλάση (super class) η δε κλάση στην οποία κληρονοµούνται χαρακτηριστικά ονοµάζεται παράγωγη κλάση (derived class) ή υποκλάση (subclass). Ως παράδειγµα θεωρήστε την ακόλουθη ιεραρχία κλάσεων (class hierarchy): Σχήµα 5-1: Παράδειγµα ιεραρχίας κλάσεων. Η κλάση AudioSample έχει κάποιες µεταβλητές και µεθόδους οι οποίες κληροδοτούνται τόσο στις υποκλάσεις πρώτου επιπέδου (δηλ. FileSample, SynthSample) όσο και από τις υποκλάσεις δευτέρου επιπέδου (δηλ. τις υπόλοιπες). Όπου η κλάση FileSample αντιπροσωπεύει ηχητικά δείγµατα τα οποία παρέχονται από το σκληρό δίσκο του υπολογιστή, ενώ η κλάση SynthSample αντιπροσωπεύει ηχητικά δείγµατα/κυµατοµορφές τα οποία συντίθενται αλγοριθµικά κατά τη διάρκεια εκτέλεσης του προγράµµατος. Είναι σηµαντικό να αντιληφθείτε ότι µία ιεραρχία κλάσεων όπως η παραπάνω αποτελεί προγραµµατιστική επιλογή. ηλαδή, εσείς, ως προγραµµατιστές θα πρέπει κατά τη φάση του σχεδιασµού του προγράµµατος που θέλετε να υλοποιήσετε να σκεφτείτε τις πιθανές ιεραρχίες κλάσεων που µπορούν να υλοποιηθούν, και να επιλέξετε την ιεραρχία που προσεγγίζει καλύτερα το πρόβληµά σας. Σε γενικές γραµµές, η ικανότητα σχεδιασµού των προγραµµάτων που υλοποιούνται σε αντικειµενοστραφείς γλώσσες προγραµµατισµού µέσω της επιλογής κατάλληλων κλάσεων και ιεραρχιών κατακτάται µε την εµπειρία. Υποθέστε ότι η κλάση AudioSample έχει ως εξής: public class AudioSample { int samplerate; int bitdepth; int novalues; double[] values; int id; 44

45 boolean playing; AudioSample() { samplerate = 100; bitdepth = 8; novalues =128; values = new double[novalues]; playing = false; void start() { playing = true; play(); void play() { while(playing) { System.out.println("Playing audio sample " + id); void stop() { playing = false; Περιλαµβάνει δηλαδή κάποιες µεταβλητές (συχνότητα δειγµατοληψίας, αριθµός δειγµάτων κ.λ.π.) και κάποιες µεθόδους για την αναπαραγωγή του ηχητικού δείγµατος. Θα πρέπει να γίνει αντιληπτό ότι οποιαδήποτε υποκλάση στης AudioSample θα διαθέτει επίσης τις µεταβλητές samplerate, bitdepth κ.λ.π. καθώς και όλες τις µεθόδους (π.χ. play(), start(), κ.λ.π.) της κλάσης AudioSample. Προκειµένου να δηλώσω ότι µία νέα κλάση είναι υποκλάση της AudioSample θα πρέπει να χρησιµοποιήσω τη λέξη κλειδί extends µετά το όνοµα της κλάσης, όπως φαίνεται στο ακόλουθο παράδειγµα: public class SynthSample extends AudioSample { double amp; double freq; SynthSample() { this.amp = 1.0; this.freq = 10; void generatevalues() { //some commands that generate sample values Η νέα αυτή κλάση SynthSample, όπως έχει υλοποιηθεί κληρονοµεί όλες τις µεταβλητές και όλες τις µεθόδους της κλάσης AudioSample, ενώ διαθέτει δύο επιπλέον µεταβλητές (amp και freq) καθώς και µία επιπλέον µέθοδο, πέραν της µεθόδου κατασκευαστή. 45

46 Επίσης, στη συνέχεια, θεωρήστε ότι η υλοποίηση της κλάσης SineSample, η οποία είναι υποκλάση της SynthSample και κατ επέκταση και της AudioSample έχει ως εξής: public class SineSample extends SynthSample { SineSample() { generatevalues(); void generatevalues() { for(int i=0; i< novalues; i++) { values[i]=amp*math.sin(2*math.pi*(freq*i)/samplerate); Έστω ότι η µέθοδος generatevalues() παράγει τις τιµές από τις οποίες απαρτίζεται το ηχητικό δείγµα τις οποίες και αποθηκεύει στον πίνακα values[]. Παρατηρήστε ότι ο πίνακας αυτός έχει κληρονοµηθεί από την κλάση AudioSample στην οποία και αρχικοποιείται µε µέγεθος novalues. Προσοχή: Το µέγεθος ενός πίνακα πρέπει να αρχικοποιηθεί πριν αρχίσουµε να τον γεµίζουµε µε στοιχεία. Στην προκειµένη περίπτωση η µέθοδος generatevalues() καλείται στη µέθοδο κατασκευαστή της SineSample. Η δε αρχικοποίηση του πίνακα values[] γίνεται στη µέθοδο κατασκευαστή της AudioSample. Αν και δεν καλείται ρητά ο κατασκευαστής της υπερκλάσης, εντούτοις, επειδή ένα αντικείµενο της κλάσης SineSample είναι µία προέκταση της κλάσης AudioSample, για να κατασκευαστεί ένα SineSample πρέπει προηγουµένως να κατασκευαστεί ένα AudioSample, εποµένως ο κατασκευαστής της υπερκλάσης καλείται αυτόµατα κατά την κατασκευή του αντικειµένου της υποκλάσης. Με βάση τα παραπάνω, ένα αντικείµενο της κλάσης SineSample δεν παύει να είναι αντικείµενο της κλάσης SynthSample, το οποίο µε τη σειρά του είναι και αντικείµενο της κλάσης AudioSample. Εξ ου και η ορολογία is-a. Γενικότερα, ένα αντικείµενο µίας κλάσης είναι και αντικείµενο της υπερκλάσης, αν και δεν ισχύει τον αντίθετο. ηλαδή ένα αντικείµενο τύπου AudioSample δεν είναι απαραίτητα αντικείµενο της SineSample, καθώς µπορεί να είναι αντικείµενο οποιασδήποτε άλλης υποκλάσης της AudioSample Αρχικοποίηση της βασικής κλάσης και των παραγώγων της Ένα αντικείµενο µιας υποκλάσης είναι κατά κάποιον τρόπο σα να περιλαµβάνει στο εσωτερικό του ένα υποαντικείµενο της υπερκλάσης. Προφανώς για να κατασκευαστεί ένα αντικείµενο της υποκλάσης θα πρέπει να έχει γίνει σωστή αρχικοποίηση του υποαντικειµένου. Η Java λοιπόν, προκειµένου να δηµιουργήσει ένα αντικείµενο µιας υποκλάσης, καλεί αυτόµατα, από µόνη της, τις µεθόδους κατασκευαστές όλων των υπερκλάσεων της κλάσης αυτής. Το γεγονός αυτό αποδεικνύεται από το ακόλουθο παράδειγµα ιεραρχίας κλάσεων τριών επιπέδων: 46

47 public class Art { Art() { System.out.println("Art constructor"); public class Drawing extends Art { Drawing() { System.out.println("Drawing constructor"); public class Cartoon extends Drawing { public Cartoon() { System.out.println("Cartoon constructor"); public static void main(string[] args) { Cartoon x = new Cartoon(); Εάν εκτελέσετε την κλάση Cartoon στην οποία περιλαµβάνεται η µέθοδος main, θα εκτυπωθούν τα ακόλουθα στην κονσόλα του προγράµµατος: Art constructor Drawing constructor Cartoon constructor ηλαδή κατά τη δηµιουργία του αντικειµένου της κλάσης Cartoon, καλείται πρώτα η µέθοδος κατασκευαστή της κλάσης Art, έπειτα ο κατασκευαστής της Drawing και τέλος ο κατασκευαστής της Cartoon. Το οποίο οδηγεί στο συµπέρασµα ότι για να κατασκευαστεί ένα αντικείµενο θα πρέπει προηγουµένως να κατασκευαστούν αντικείµενα όλων των υπερκλάσεών του. Στο προηγούµενο παράδειγµα, όλες οι κλάσεις υλοποιούν τον default constructor, δηλαδή τη µέθοδο κατασκευαστή που δεν έχει ορίσµατα. Έτσι, είναι εύκολο για το µεταγλωττιστή της Java να καλέσει τους κατασκευαστές των υπερκλάσεων διότι αυτές δεν χρειάζονται δεδοµένα υπό µορφή ορισµάτων. Εάν όµως κάποια από τις υπερκλάσεις απαιτεί ορίσµατα στον κατασκευαστή της, τότε αυτός δεν καλείται αυτόµατα από τον κατασκευαστή της υποκλάσης αλλά ο µεταγλωττιστής σας υποχρεώνει να τον καλέσετε ρητά χρησιµοποιώντας της λέξη κλειδί super και την κατάλληλη λίστα ορισµάτων όπως φαίνεται στο ακόλουθο παράδειγµα: public class Art { Art(int i, String s) { System.out.println("Art constructor"); 47

48 public class Drawing extends Art { Drawing(int i, int j, String s) { super(i, s); System.out.println("Drawing constructor"); public class Cartoon extends Drawing { public Cartoon(int i, int j, String s) { super(i, j, s); System.out.println("Cartoon constructor"); public static void main(string[] args) { Cartoon x = new Cartoon(5, 12, "hello 5 and 12!"); Παρατηρήστε, ότι η κλίση στον κατασκευαστή της υπερκλάσης µε τη λέξη κλειδί super πρέπει να είναι η πρώτη εντολή στον κατασκευαστή της υποκλάσης Τροποποίηση τύπου (Casting) Στα πλαίσια αυτά θα εξετάσουµε ένα άλλο θέµα που ονοµάζεται τροποποίηση τύπου (casting). Υπάρχουν λοιπόν περιπτώσεις κατά τις οποίες απαιτείται η µετατροπή µιας µεταβλητής από έναν τύπο σε κάποιον άλλο. Στη συνέχεια θα εξετάσουµε την τροποποίηση τύπου για µεταβλητές αρχέτυπα και για αντικείµενα Τροποποίηση τύπου σε αρχέτυπα Θεωρήστε το ακόλουθο παράδειγµα. Εάν εκτελέσετε την κλάση αυτή θα διαπιστώσετε ότι η τιµή της µεταβλητής c είναι 0.0 public class AMainClass { public static void main(string[] args) { int a =3; int b = 5; float c = a/b; System.out.println(c); Ο λόγος είναι ότι για τον επεξεργαστή του ΗΥ µία αριθµητική πράξη (π.χ. διαίρεση) είναι διαφορετική διαδικασία όταν επιτελείται ανάµεσα σε δύο ακεραίους, οπότε και δίνει αποτέλεσµα ακέραιο, και διαφορετική όταν επιτελείται ανάµεσα σε δύο δεκαδικούς αριθµούς, οπότε και δίνει δεκαδικό αποτέλεσµα. Εποµένως για να δώσει η παραπάνω διαίρεση δεκαδικό αποτέλεσµα, θα πρέπει τουλάχιστον ένας εκ των δύο 48

49 αριθµών a ή c να είναι δεκαδικός. Έτσι στο παράδειγµα αυτό η γραµµή κώδικα που περιλαµβάνει τη διαίρεση θα πρέπει να αλλάξει σε float c = (float)a/b; ή float c = a/(float)b; ή float c = (float)a/(float)b Γενικότερα, η τροποποίηση τύπου πραγµατοποιείται συντακτικά εάν η µεταβλητή που θέλω να τροποποιήσω προηγηθεί από το όνοµα του νέου τύπου σε παρενθέσεις. Σαν εναλλακτικό παράδειγµα, θεωρήστε τον ακόλουθο κώδικα: int a =3; float d = (float)a; Με τον κώδικα αυτό η µεταβλητή d περιέχει το δεκαδικό αντίστοιχο της µεταβλητής a, δηλαδή στην προκειµένη περίπτωση την τιµή 3.ο Προσοχή: Η τροποποίηση τύπου είναι επιτρεπτή διαδικασία µόνο στις περιπτώσεις που οι δύο τύποι είναι συµβατοί µεταξύ τους. ηλαδή δε µπορώ π.χ. να µετατρέψω µία boolean µεταβλητή σε float ή σε char, και προφανώς ούτε και σε αντικείµενο Τροποποίηση τύπου σε αντικείµενα Στην περίπτωση των αντικειµένων, αντιλαµβάνεστε πως η τροποποίηση τύπου αναφέρεται στην τροποποίηση της κλάσης στην οποία αναφέρεται το αντικείµενο. Η τροποποίηση τύπου στις µεταβλητές αυτές είναι επιτρεπτή µόνο στις περιπτώσεις που οι δύο κλάσεις σχετίζονται µεταξύ τους µε σχέση κληρονοµικότητας, δηλαδή είναι η µία υποκλάση της άλλης. Έτσι στο παράδειγµα της ιεραρχίας του Σχήµα 5-1, η µετατροπή ενός αντικειµένου σε µία υπερκλάση της κλάσης στην οποία αναφέρεται ονοµάζεται τροποποίηση τύπου προς τα πάνω (upcasting), ενώ το αντίστροφο, δηλαδή η τροποποίηση ενός αντικειµένου σε µία υποκλάση της κλάσης στην οποία αναφέρεται ονοµάζεται τροποποίηση τύπου προς τα κάτω (downcasting). Στην ουσία η τροποποίηση προς τα πάνω επιτελείται αυτόµατα από τη Java, καθώς όπως έχει ήδη αναφερθεί ένα αντικείµενο της κλάσης SineSample είναι-ένα αντικείµενο τόσο της κλάσης SynthSample όσο και της κλάσης AudioSample. Οπότε οι δηλώσεις που φαίνονται στο ακόλουθο παράδειγµα είναι απολύτως έγκυρες και δεν απαιτούν ρητή µετατροπή του αντικειµένου sine σε (AudioSample)as ή (SynthSample)ss: public class AMainClass { public static void main(string[] args) { SineSample sine = new SineSample(); AudioSample as = sine; SynthSample ss = sine; ηλαδή, το παράδειγµα αυτό αποδεικνύει ότι το upcasting γίνεται αυτόµατα στη Java. Αυτό δεν ισχύει για το downcasting όπως φαίνεται στο επόµενο παράδειγµα: 49

50 public class AMainClass { public static void main(string[] args) { AudioSample sine = new AudioSample(); SynthSample ss = (SynthSample)sine; Αν και ο µεταγλωττιστής της Java θεωρεί τις παραπάνω δηλώσεις απολύτως έγκυρες, εντούτοις αυτό δεν ισχύει για τον διερµηνευτή. ηλαδή κατά τη µεταγλώττιση δε θα προκύψει σφάλµα, αλλά όταν εκτελέσω τη µέθοδο main, τότε στην κονσόλα εξόδου θα εµφανιστεί το εξής σφάλµα: Exception in thread "main" java.lang.classcastexception: AudioSample cannot be cast to SynthSample at AMainClass.main(AMainClass.java:8) Τα σφάλµατα στη Java ονοµάζονται exceptions, δηλαδή εξαιρέσεις και το συγκεκριµένο σφάλµα ClassCastException, λέει ότι δεν είναι δυνατή η συγκεκριµένη µετατροπή τύπου. Στην πραγµατικότητα το downcasting είναι έγκυρο µόνο στις περιπτώσεις που το αντικείµενο που το υφίσταται είναι πράγµατι αντικείµενο της κλάσης στην οποία µετατρέπεται, όπως φαίνεται στη συνέχεια: public class AMainClass { public static void main(string[] args) { SineSample sine = new SineSample(); AudioSample audio = sine; SynthSample synth = (SynthSample)audio; Ο παραπάνω κώδικας δε θα δηµιουργήσει σφάλµα, ούτε κατά τη µεταγλώττιση, ούτε κατά την εκτέλεση, καθώς το αντικείµενο audio είναι αντικείµενο της κλάσης SineSample κι εποµένως και της SynthSample. Επειδή ακριβώς ο µεταγλωττιστής δεν προκαλεί σφάλµα κατά τo downcasting, δηλαδή δεν µπορεί να γνωρίζει εάν το αντικείµενο που υφίσταται τη µετατροπή είναι πράγµατι αντικείµενο της νέας κλάσης, υπάρχει η λέξη κλειδί instanceof η οποία επιτελεί αυτόν τον έλεγχο. Έτσι, ο παραπάνω κώδικας θα ήταν πιο σωστός ως εξής: public class AMainClass { public static void main(string[] args) { SineSample sine = new SineSample(); AudioSample audio = sine; if(audio instanceof SynthSample) { SynthSample synth = (SynthSample)audio; 50

51 Είναι απολύτως λογικό να αναρωτιέστε ποιος είναι ο λόγος για όλα αυτά. Γιατί δηλαδή να απαιτείται να κάνει κάποιος τροποποίηση του τύπου ενός αντικειµένου. Όλα αυτά τα θέµατα θα γίνουν ξεκάθαρα µόλις αντιληφθείτε τι είναι ο πολυµορφισµός, δηλαδή στην ενότητα Υπερκάλυψη Μεθόδου Σε πολλές περιπτώσεις κατά την υλοποίηση µιας υποκλάσης κρίνεται σκόπιµο κάποια ή κάποιες από τις κληρονοµηµένες µεθόδους να πρέπει να τροποποιηθεί. Ως παράδειγµα θεωρήστε την ιεραρχία των υποκλάσεων της κλάσης AudioSample που είδαµε παραπάνω. Η κλάση SynthSample, περιλαµβάνει µία µέθοδο generatevalues(), η οποία θα πρέπει να υλοποιηθεί διαφορετικά από κάθε υποκλάση της SynthSample. Έτσι, η κλάση SineSample θα την υλοποιήσει γεµίζοντας τον πίνακα values[] µε τιµές που παράγονται από τη συνάρτηση ηµίτονο, η κλάση SquareWave θα γεµίσει τον πίνακα µε τις τιµές που παράγονται από την τετραγωνική συνάρτηση, η Trianglular µε τιµές από την τριγωνική, ενώ η Sawtooth µε τιµές από την πριονωτή. Το φαινόµενο της τροποποίησης µίας κληρονοµηµένης µεθόδου σε µία υποκλάση ονοµάζεται υπερκάλυψη µεθόδου (method override) Αφηρηµένες Κλάσεις (Abstract Classes) Η µέθοδος generatevalues() της κλάσης SynthSample, θα πρέπει όπως αντιλαµβάνεστε να υλοποιείται µε διαφορετικό τρόπο, δηλαδή να υπερκαλύπτεται σε κάθε υποκλάση της SynthSample. Επιπρόσθετα, η κλάση SynthSample δεν µπορεί να υλοποιήσει τη µέθοδο αυτή, καθώς ανάλογα µε την συνάρτησηκυµατοµορφή η µέθοδος αυτή θα πρέπει να έχει άλλη υλοποίηση. Ο λόγος για τον οποίο η µέθοδος αυτή έχει µπει στην υπερκλάση SynthSample είναι διότι αποτελεί κοινή συµπεριφορά για όλες αυτές τις κλάσεις. Με άλλα λόγια, οποιαδήποτε κλάση προεκτείνει τη βασική κλάση SynthSample θα πρέπει να υλοποιήσει τη µέθοδο generatevalues() προκειµένου να γεµίσει τον πίνακα values[] µε τιµές, οι οποίες διαφοροποιούνται ανάλογα µε τη συγκεκριµένη υποκλάση. Αυτό πρακτικά σηµαίνει ότι εάν αργότερα θελήσω να υλοποιήσω άλλη µια υποκλάση της SynthSample για παράδειγµα την NoiseSample, θα πρέπει µε το σχεδιασµό που έχω κάνει στο πρόγραµµά µου να υλοποιήσω τη µέθοδο generatevalues() ώστε να γεµίσω τον πίνακα values[] µε τυχαίες τιµές. Σε περιπτώσεις όπως αυτή, όπου δηλαδή όλες οι υποκλάσεις µίας δεδοµένης κλάσης υποχρεούνται να υλοποιήσουν µία µέθοδο, ενώ ταυτόχρονα η υλοποίηση της µεθόδου αυτής δεν έχει νόηµα στην υπερκλάση, µετατρέπουµε τη µέθοδο της υπερκλάσης σε αφηρηµένη µέθοδο χρησιµοποιώντας τη λέξη κλειδί abstract. ηλαδή, η υλοποίηση της κλάσης SynthSample, είναι σωστότερη ως εξής: public abstract class SynthSample extends AudioSample { double amp; double freq; SynthSample() { freq = 10; amp = 1.0; abstract void generatevalues(); 51

52 Παρατηρήστε τα εξής: Η λέξη abstract προηγείται του τύπου επιστροφής της µεθόδου (ο οποίος στη συγκεκριµένη περίπτωση είναι void). Όταν µία µέθοδος είναι abstract δε θα πρέπει να έχει σώµα υλοποίησης. ηλαδή αντί για ένα block κώδικα το οποίο συµπεριλαµβάνεται σε ένα ζεύγος από αγκύλες { και, η δήλωση της µεθόδου τερµατίζεται µε ελληνικό ερωτηµατικό. Όταν µία κλάση περιέχει έστω και µία αφηρηµένη µέθοδο, τότε η όλη κλάση θεωρείται αφηρηµένη κι εποµένως η λέξη abstract θα πρέπει να προηγείται της λέξης class στον ορισµό της κλάσης. εν µπορείτε να κατασκευάζετε αντικείµενα από µία αφηρηµένη κλάση καλώντας τη µέθοδο κατασκευαστή µε την εντολή new. Κλάσεις οι οποίες είναι αφηρηµένες ενσωµατώνουν ιδιότητες και συµπεριφορά, αλλά καθώς η συµπεριφορά αυτή είναι αφηρηµένη, δεν µπορούν αντικείµενα της κλάσης αυτής να υφίστανται ως αυτόνοµες οντότητες. ηλαδή, στο παραπάνω παράδειγµα, η εντολή SynthSample s = new SynthSample(); είναι λανθασµένη. Εποµένως οι αφηρηµένες κλάσεις υπάρχουν µόνο και µόνο για να προεκτείνονται σε κάτι πιο απτό, λιγότερο αφηρηµένο. Αφηρηµένη (abstract) είναι µία κλάση όταν έστω και µία µέθοδός της είναι αφηρηµένη, δηλαδή δεν έχει σώµα. Οι αφηρηµένες κλάσεις δεν µπορούν να παράγουν αντικείµενα του τύπου τους παρά µονάχα κάποιου τύπου µιας υποκλάσης τους. 5.3 Πολυµορφισµός Είναι λογικό να αναρωτιέστε, γιατί θα πρέπει η κλάση SynthSample να περιέχει τη µέθοδο generatevalues(), µόνο και µόνο για λόγους οµοιογενείας; Θα µπορούσε η µέθοδος αυτή να υπάρχει µόνο στις υποκλάσεις της SynthSample εφόσον µόνο εκεί έχει νόηµα. Η αλήθεια είναι ότι υπάρχει ένας επιπλέον λόγος που η µέθοδος αυτή υπάρχει στην υπερκλάση, πέραν από το γεγονός ότι όλες οι υποκλάσεις πρέπει να την υλοποιούν για να δίνουν δεδοµένα στον πίνακα values[]. Ο λόγος αυτός σχετίζεται µε µία επιπλέον ιδιότητα των αντικειµενοστραφών γλωσσών προγραµµατισµού, η οποία ονοµάζεται πολυµορφισµός. Για την ακρίβεια: Ο πολυµορφισµός (polymorphism) αναφέρεται στη δυνατότητα ενιαίου χειρισµού πολλαπλών αντικειµένων που προέρχονται από διαφορετικές κλάσεις, οι οποίες εντούτοις είναι υποκλάσεις µιας κοινής υπερκλάσης. public class MainClass { public static void main(string[] args) { SynthSample[] synthsamples = { ; new SineSample(), new SquareWave(), new SawTooth() for(int i=0; i<synthsamples.length; i++){ synthsamples[i].generatevalues(); 52

53 Ας εξετάσουµε ένα παράδειγµα. Η παραπάνω κλάση περιλαµβάνει µία main µέθοδο, κατά την οποία δηµιουργείται ένας πίνακας στον οποίο περιλαµβάνονται τρία αντικείµενα διαφορετικών υποκλάσεων της SynthSample. Καθώς και τα τρία αυτά αντικείµενα είναι αντικείµενα υποκλάσεων της SynthSample µπορούν να δηλωθούν ως αντικείµενα της κλάσης αυτής. Έτσι: Κατά συνέπεια µπορούµε να πούµε ότι ο πολυµορφισµός επιτρέπει το διαχωρισµό µεταξύ «τι» και «πώς» ως προς τις λειτουργίες που επιτελεί ένα αντικείµενο. ηλαδή υπάρχουν φορές όπου ενδιαφερόµαστε για το τι µπορεί να κάνει ένα αντικείµενο κι όχι για το πώς ακριβώς το κάνει. Τώρα εάν στη συνέχεια χρειαστεί να γνωρίζω επακριβώς τα χαρακτηριστικά κάθε στοιχείου του πίνακα synthsamples, θα πρέπει να κάνω τροποποίηση τύπου προς τα κάτω. Έτσι, στην διακλάδωση for του προηγούµενο παραδείγµατος, θα µπορούσε µετά την κλίση στην κοινή µέθοδο generatevalues() να γίνεται τροποποίηση τύπου, προκειµένου να καλεστεί µία µέθοδος η οποία δεν υπάρχει στην κοινή υπερκλάση SynthSample κι εποµένως θα πρέπει να γίνει έλεγχος µε την έκφραση instanceof for(int i=0; i<synthsamples.length; i++){ synthsamples[i].generatevalues(); //draw the waveform of the corresponding class if(synthsamples[i] instanceof SineSample) { SineSample sine = (SineSample)synthsamples[i]; sine.drawsinewave(); else if (synthsamples[i] instanceof SquareWave) { SquareWave square = (SquareWave)synthsamples[i]; square.drawsquarewave(); else if(synthsamples[i] instanceof SawTooth) { SawTooth saw = (SawTooth)synthsamples[i]; saw.drawsawtoothwave(); //end of if //end of for 5.4 Η κλάση Object Όλες οι κλάσεις στη Java είναι υποκλάσεις της κλάσης Object,η οποία είναι µία κλάση που παρέχεται από τον πυρήνα της Java. Έτσι, αν και στις κλάσεις που έχουµε υλοποιήσει µέχρι τώρα, δεν αναγράφεται ρητά στον ορισµό τους η δήλωση extends Object, εντούτοις αυτές είναι υποκλάσεις της Object και κατά συνέπεια κληρονοµούν όλα τα χαρακτηριστικά της κλάσης αυτής. Στο Σχήµα 5-2 φαίνεται η περιγραφή των µεθόδων της κλάσης Object που κληρονοµούνται σε όλα τα αντικείµενα όλων των κλάσεων. 53

54 Σχήµα 5-2: Οι µέθοδοι της κλάσης Object. Οι µέθοδοι αυτοί κληρονοµούνται στα αντικείµενα οποιασδήποτε κλάσης Η µέθοδος equals Ένα παράδειγµα µιας µεθόδου η οποία διατίθεται από όλα τα αντικείµενα όλων των κλάσεων είναι η µέθοδος equals(). Η µέθοδος αυτή χρησιµοποιείται για να ελέγξει την ισότητα δύο οποιονδήποτε αντικειµένων. Η µέθοδος αυτή διατίθεται από τα αντικείµενα όλων των κλάσεων καθώς αυτά είναι πάντοτε αντικείµενα υποκλάσεων της κλάσης Object κι εποµένως κληρονοµούν όλες τις µεθόδους τη Object. Όταν θέλουµε να ελέγξουµε την ισότητα δύο αντικειµένων θα πρέπει να χρησιµοποιούµε τη µέθοδο equals() κι όχι τη διπλή ισότητα, η οποία κατά κανόνα χρησιµοποιείται για να ελέγξει την ισότητα δύο αρχέτυπων µεταβλητών, όπως φαίνεται στο ακόλουθο παράδειγµα. 5.5 Πακέτα //check equality for primitive variables if( i == 5) { System.out.println(" 'i' equals '5' "); //check equality for objects if(sample1.equals(sample2)) { System.out.println(" 'sample1' equals 'sampe2' "); Όπως έχει αναφερθεί και σε προηγούµενες παραγράφους, η φιλοσοφία της Java είναι τέτοια ώστε ο κώδικας που υλοποιείται να είναι επαναχρησιµοποιήσιµος και σε πολλές περιπτώσεις υπό µορφή προγραµµατιστικής βιβλιοθήκης. Όπως λοιπόν στις 54

55 βιβλιοθήκες, τα βιβλία οργανώνονται σε οµάδες και σε ράφια, έτσι και οι κλάσεις που υλοποιούνται θα πρέπει να οργανώνονται σε πακέτα. Κάθε πακέτο κλάσεων στην ουσία αντιστοιχεί σε κάποιο φάκελο στο σκληρό δίσκο του υπολογιστή µέσα στον οποίο βρίσκονται τα αρχεία του κώδικα στα οποία αντιστοιχούν οι κλάσεις του πακέτου. Θα έχετε παρατηρήσει ότι στο eclipse κάθε workspace αντιστοιχεί σε ένα φάκελο (π.χ. ws) στο σκληρό δίσκο και κάθε project αντιστοιχεί σε ένα υποφάκελο (π.χ. AudioProject) που έχει το ίδιο όνοµα µε το όνοµα του project. Όπως φαίνεται στο Σχήµα 5-1 µέσα στο φάκελο του project δηµιουργούνται δύο υποφάκελοι: ο src στον οποίο περιέχονται τα αρχεία πηγαίου κώδικα, δηλαδή τα.java αρχεία που αντιστοιχούν στις κλάσεις που δηµιουργείτε και ο φάκελος bin που µέσα περιέχει τα.class αρχεία του bytecode δηλαδή τα αρχεία που προκύπτουν µετά τη µεταγλώττιση. Ο φάκελος µε το όνοµα.metadata είναι φάκελος τον οποίο δε θα χρειαστεί να χρησιµοποιήσετε και περιέχει µέσα αρχεία τα οποία είναι απαραίτητα για το ίδιο το eclipse. Σχήµα 5-3: Οι φάκελοι που δηµιουργούνται για ένα project του eclipse. Εάν τώρα δηµιουργήσουµε µια κλάση (π.χ. την AudioSample ) και τη βάλουµε µέσα σε ένα πακέτο µε το όνοµα audio, τότε θα πρέπει η πρώτη γραµµή στο αρχείο της κλάσης να είναι η δήλωση του πακέτου, δηλαδή: package audio; public class AudioSample { int samplerate; int bitdepth; int novalues; // double[] values; int id; boolean playing; static int noaudiosamples; //k.l.p. Αυτό θα έχει ως συνέπεια τη δηµιουργία ενός φακέλου µε το όνοµα audio µέσα στο φάκελο src όπου µέσα θα περιέχεται το αρχείο AudioSample.java. Έπειτα από µεταγλώττιση της κλάσης αυτής θα δηµιουργηθεί και στο φάκελο bin ένας υποφάκελος µε το όνοµα audio όπου µέσα θα περιέχεται το αρχείο AudioSample.class. Σηµειωτέων ότι για να δηµιουργήσετε ένα νέο πακέτο µε το περιβάλλον του eclipse θα πρέπει να επιλέξετε προηγουµένως από το µενού File> New > Package. Τα αρχεία στο αριστερό παράθυρο του eclipse θα εµφανίζονται όπως στο Σχήµα

56 Σχήµα 5-4: Ιεραρχία πακέτου στο eclipse. Ακόµα και οι κλκάσεις του πυρήνα της java οµαδοποιούνται σε πακέτα. Για να δείτε τη λίστα των πακέτων που περιλαµβάνονται στον πυρήνα της java, αρκεί να περιπλανηθείτε στο αριστερό frame της τεκµηρίωσης javadoc Σχήµα 5-5. Επιλέγοντας ένα οποιοδήποτε πακέτο από το πάνω αριστερά frame εµφανίζονται στο κάτω αριστερά frame οι κλάσεις που περιλαµβάνονται στο πακέτο αυτό. Παρατηρήστε ότι το όνοµα αυτών των πακέτων αποτελείται από δύο ή περισσότερες λέξεις οι οποίες χωρίζονται µε τελεία (. ). Στην πραγµατικότητα τα πακέτα αυτά είναι ενσωµατωµένα το ένα στο άλλο και αντιστοιχούν σε φακέλους στο σκληρό δίσκο οι οποίοι περιέχουν άλλους φακέλους. Σχήµα 5-5: Τα πακέτα των κλάσεων του πυρήνα της java. Για να χρησιµοποιήσετε µία κλάση η οποία περιλαµβάνεται σε ένα πακέτο στο δικό σας κώδικα θα πρέπει στον κώδικά σας να χρησιµοποιήσετε τη δήλωση import. Έτσι για παράδειγµα, εάν θελήσετε στο πρόγραµµα σας να συµπεριλάβετε ένα κουµπί, µπορείτε να χρησιµοποιήσετε την κλάση Button η οποία βρίσκεται στο πακέτο java.awt. Έτσι, µε την τεχνικής της σύνθεσης κλάσεων (has-a), η κλάση AudioSample θα έχει ως εξής: 56

57 package audio; import java.awt.button; public class AudioSample { Button b1 = new Button("Play"); int samplerate; int bitdepth; int novalues; // double[] values; int id; boolean playing; static int noaudiosamples; //k.l.p. Παρατηρήστε τα εξής: Η δήλωση import µπαίνει αµέσως µετά τη δήλωση πακέτου και πριν το µπλοκ της κλάσης. H δήλωση import περιλαµβάνει το συνολικό όνοµα πακέτου ακολουθούµενο µε τελεία από το όνοµα της κλάσης. Για την κλάση αυτό είναι όπως λέµε το fully qualified name Σε περίπτωση που το πρόγραµµα µου χρησιµοποιεί κι άλλες κλάσεις θα πρέπει να βάλω πολλαπλά import. Μία δήλωση import δεν εισάγει στο πρόγραµµα µου µία άλλη κλάση, κι εποµένως δεν το κάνει βαρύτερο όπως θα περίµενε κανείς. Απλά µία δήλωση import λέει στον compiler σε ποιο πακέτο µπορεί να βρει τη συγκεκριµένη κλάση. Εάν το πρόγραµµα µου χρησιµοποιεί πολλαπλές κλάσεις από το συγκεκριµένο πακέτο τότε µπορώ αντί να γράφω import για κάθε µια από αυτές να γράφω µία δήλωση της µορφής import java.awt.*; Είναι πάντως καλύτερη πρακτική να κάνω import τις κλάσεις µου µία-µία, καθώς έτσι µπορώ αµέσως από την αρχή του κώδικα να γνωρίζω ποιές είναι οι εξωτερικές κλάσεις που χρησιµοποιεί το πρόγραµµά µου. Kαθώς τα πακέτα στη java χρησιµοποιούνται για την οργάνωση προγραµµατιστικών βιβλιοθηκών καλό είναι κάθε πακέτο να έχει µοναδικό όνοµα. Έτσι, εάν εσείς υλοποιήσετε ένα πακέτο µε κλάσεις που αφορούν τον χειρισµό ήχου θα πρέπει αυτό να έχει διαφορετικό όνοµα από το πακέτο της java για ήχο. Για το λόγο αυτό, κάθε εταιρία ή οργανισµός που δηµιουργεί προγραµµατιστικές βιβλιοθήκες χρησιµοποιεί ένα όνοµα πακέτου που να τη χαρακτηρίζει και το οποίο συνήθως είναι το ανάστροφο του ονόµατος της ιστοσελίδας της. Έτσι για παράδειγµα οι κλάσεις της βιβλιοθήκης jsyn που θα χρησιµοποιήσουµε στη συνέχεια βρίσκονται σε ένα πακέτο µε το όνοµα com.softsynth.jsyn. Κατ αντιστοιχεία εµείς τις κλάσεις µας καλό θα ήταν να τις βάζουµε σε ένα πακέτο µε το όνοµα gr.teicrete.mta. Για παράδειγµα: Πακέτο για ήχο: gr.teicrete.mta.audio Πακέτο για γραφικά: gr.teicrete.mta.gfx 57

58 Πακέτο για γραφική διεπαφή χρήστη (Graphical User Interface): gr.teicrete.mta.gui κ.ο.κ Το πακέτο java.lang Παρατηρήστε ότι µέχρι τώρα παρόλο που έχουµε ήδη εξετάσει κάποιες από τις κλάσεις του πυρήνα της java (π.χ. String, Math, Object) δε χρειάστηκε να τις κάνουµε import. Ο λόγος είναι ότι υπάρχει ένα µοναδικό πακέτο του οποίο τις κλάσεις δε χρειάζεται να κάνουµε import. Αυτό είναι το πακέτο java.lang και σχετίζεται άµεσα µε την ίδια τη γλώσσα java. 5.6 Τύποι πρόσβασης Στη java, οποιαδήποτε κλάση, αντικείµενο µεταβλητή και µέθοδος έχει κάποιο τύπο πρόσβασης. Η πρόσβαση (access) σε µία προγραµµατιστική οντότητα αφορά το κατά πόσο η οντότητα αυτή διατίθεται για λειτουργίες διαβάσµατος (read access) και γραψίµατος (write access). Θεωρήστε για παράδειγµα µία µεταβλητή (π.χ. i = 5;). Η πρόσβαση διαβάσµατος στη µεταβλητή αυτή µου δίνει τη δυνατότητα να µπορώ να γνωρίζω την τιµή της, ενώ η πρόσβαση γραψίµατος µου δίνει τη δυνατότητα να µπορώ να αλλάξω την τιµή της µεταβλητής αυτής. Η πρόσβαση σε κάποια κλάση ή σε κάποιο µέλος (µεταβλητή ή µέθοδος) της κλάσης προσδιορίζεται από µία λέξη κλειδί η οποία προηγείται της λέξης της δήλωσης της κλάσης, της µεταβλητής ή της µεθόδου. Στη Java υπάρχουν τέσσερις τύποι πρόσβασης: public (δηµόσιος): είναι το είδος της πρόσβασης που κάνει µία κλάση ή ένα µέλος µιας κλάσης προσβάσιµο από οποιοδήποτε σηµείο του κώδικα (από οποιαδήποτε κλάση οποιουδήποτε πακέτου) private (ιδιωτικός): είναι το είδος της πρόσβασης για το οποίο το συγκεκριµένο µέλος είναι προσβάσιµο µόνο στο εσωτερικό της κλάσης στην οποία δηλώνεται protected (προστατευόµενος): είναι το είδος της πρόσβασης για το οποίο το συγκεκριµλενο µέλος είναι προσβάσιµο µόνο από τις κλάσεις του ίδιου πακέτου ή/και υποκλάσεις της κλάσης στην οποία ορίζεται το µέλος αυτό πρόσβαση πακέτου: είναι το είδος της πρόσβασης για το οποίο το συγκεκριµένο µέλος είναι προσβάσιµο µόνο από τις κλάσεις του ίδιου πακέτου. Η πρόσβαση αυτή είναι η πρόσβαση που έχουν τα µέλη εάν δεν προσδιορίσουµε κάποιο άλλο είδος πρόσβασης (δηλ. µε τις λέξεις public, protected, private) Ας δούµε ένα παράδειγµα: package gr.teicrete.mta.audio; public class AudioSample { public int samplerate; public int bitdepth; private int novalues; // protected double[] values; int id; 58

59 boolean playing; static int noaudiosamples; public void play() { System.out.println("playing audio sample " + id); Αυτή η κλάση AudioSample βρίσκεται στο πακέτο gr.teicrete.mta.audio και έστω ότι έχουµε υλοποιήσει επίσης όλες τις κλάσεις της ιεραρχίας του Σχήµα 5-1 µέσα στο ίδιο πακέτο. Έστω τώρα και µία main κλάση, η οποία δε βρίσκεται µέσα σε κάποιο πακέτο, βρίσκεται όπως λέµε στο default package: import gr.teicrete.mta.audio.audiosample; public class MainClass { public static void main(string[] args) { AudioSample as = new AudioSample(); System.out.println("as sampling rate: "+ as.samplerate); System.out.println("as bit depth: " + as.bitdepth); as.play(); Ισχύουν τα εξής: Για να χρησιµοποιήσω την κλάση AudioSample στην κλάση MainClass πρέπει να την κάνω import. Η κλάση MainClass έχει πρόσβαση µόνο στις µεταβλητές samplerate και bitdepth και στη µέθοδο play() Η µεταβλητή novalues ως private είναι προσβάσιµη µόνο από το εσωτερικό της κλάσης AudioSample. ηλαδή δεν µπορεί να προσπελαστεί από καµία άλλη κλάση είτε εντός είτε εκτός πακέτου. Ο πίνακας τιµών values[], ως protected είναι προσπελάσιµος από την ίδια την κλάση AudioSample καθώς και από όλες τις υποκλάσεις της (π.χ. SineSample, FileSample κ.λ.π.) αλλά και από κλάσεις οι οποίες βρίσκονται στο πακέτο gr.teicrete.mta.audio, ακόµα κι αν δεν είναι υποκλάσεις της AudioSample Οι µεταβλητές id, playing και noaudiosamples είναι προσβάσιµες από όλες τις κλάσεις που βρίσκονται στο πακέτο gr.teicrete.mta.audio και µόνο από αυτές. 5.7 Άσκηση Α) Να κατασκευάσετε την ιεραρχία κλάσεων που φαίνεται στο ακόλουθο σχήµα. Η κλάση Instrument να περιέχει τις ακόλουθες ιδιότητες και µεθόδους: void play (String note) 59

60 String ownername; String material; void printattributes() //prints ALL the arguments of the object Κάθε υποκλάση της Instrument να περιέχει τουλάχιστον µία επιπλέον µεταβλητή και να υπερκαλύπτει την printattributes() έτσι ώστε να εκτυπώνεται και η νέα µεταβλητή. Σε µία κλάση η οποία θα περιέχει µία µέθοδο main, να δηµιουργήσετε ένα πίνακα από αντικείµενα υποκλάσεων της κλάσης Instrument. Για καθένα από αυτά να καλείτε τη µέθοδο printattributes() Β) Μεταφέρετε όλες τις κλάσεις της παραπάνω ιεραρχίας σε ένα πακέτο µε το όνοµα gr.teicrete.mta.instruments και διατηρήστε την κλάση που περιέχει τη main µέθοδο εκτός πακέτου. Τι παρατηρείτε; Προσθέστε τόσους τροποποιητές πρόσβασης όσους χρειάζεται το πρόγραµµα σας για να τρέξει. 60

61 6 Applets Τα applets είναι µικρο-εφαρµογές οι οποίες δεν εκτελούνται αυτόνοµα (δηλ. µέσω µιας main), όπως τα προγράµµατα που έχουµε υλοποιήσει µέχρι τώρα, αλλά εκτελούνται µέσα από το περιβάλλον ενός web browser, όπως ο Internet Explorer, o Mozilla Firefox, o Google Chrome, κ.λ.π. Τα applets ως µη-αυτόνοµα προγράµµατα και για λόγους ασφαλείας δεν διαθέτουν κάποιες λειτουργίες οι οποίες διατίθενται από τα αυτόνοµα προγράµµατα. Για παράδειγµα, δεν µπορούν να εγγράφουν αρχεία στο σκληρό σας δίσκο. Όπως αντιλαµβάνεστε εάν κάτι τέτοιο ήταν επιτρεπτό, τότε κάποιος κακόβουλος θα µπορούσε πολύ εύκολα να σας καταστρέψει το σύστηµα αρχείων του υπολογιστή σας. Εντούτοις, τα applets παρέχουν αρκετές λειτουργίες από αυτές που µας ενδιαφέρουν στα πλαίσια του µαθήµατος όπως η δηµιουργία γραφικών, η σύνθεση και αναπαραγωγή ήχου, κ.λ.π. Επίσης ένα σηµαντικό χαρακτηριστικό των applets είναι ότι προσφέρουν διαδραστικότητα, δηλαδή επιτρέπουν στο χρήστη να ελέγχει τις λειτουργίες του applet µέσω του πληκτρολογίου και του ποντικιού του ΗΥ. Το θέµα της διάδρασης θα το εξετάσουµε αναλυτικότερα στο επόµενο κεφάλαιο όπου θα ασχοληθούµε µε γεγονότα (events). 6.1 Υλοποίηση ενός applet Προκειµένου να δηµιουργήσω ένα applet, αρκεί να υλοποιήσω µία υποκλάση της κλάσης java.applet.applet. Έτσι η κλάση FirstApplet που φαίνεται στον ακόλουθο κώδικα, αποτελεί παράδειγµα ενός applet. package gr.teicrete.mta.gui; import java.applet.applet; import java.awt.color; public class FirstApplet extends Applet { public FirstApplet() { System.out.println("creating applet"); this.setbackground(color.orange); Παρατηρήστε τα εξής: η παραπάνω κλάση έχει υλοποιηθεί µέσα στο πακέτο gr.teicrete.mta.gui Η λέξη gui αποτελεί τα γραφικά των λέξεων Graphical User Interface, δηλαδή γραφική διεπαφή χρήστη. Η γραφική διεπαφή χρήστη είναι το γραφικό µέρος του προγράµµατος µέσω του οποίου ένας χρήστης µπορεί να αλληλεπιδρά µε το πρόγραµµα. Φυσικά το όνοµα του πακέτου αυτού είναι προσωπική µου επιλογή. Εσείς θα µπορούσατε να προσδώσετε ένα οποιοδήποτε άλλο όνοµα. Χρειάστηκε να κάνω import την κλάση java.applet.applet, µια και αυτή δε βρίσκεται στο πακέτο java.lang Στο εσωτερικό της µέθοδου κατασκευαστή εκτυπώνεται η φράση creating applet 61

62 Επίσης στη µέθοδο κατασκευαστή καλείται η µέθοδος setbackground(color c). Η µέθοδος αυτή, όπως µπορείτε να δείτε εάν πάτε στη javadoc περιγραφή της κλάσης java.applet.applet, κληρονοµείται στην κλάση FirstApplet από την κλάση java.awt.component, η οποία είναι µία από τις υπερκλάσεις της java.applet.applet κι εποµένως είναι υπερκλάση και της FirstApplet. Το όρισµα της µεθόδου setbackground(color c) είναι ένα αντικείµενο της κλάσης java.awt.color η οποία παρέχεται από το δεύτερο import. Όπως µπορείτε να δείτε αν πάτε στην τεκµηρίωση javadoc της κλάσης αυτής, κάποια βασικά χρώµατα (π.χ. BLUE, RED, GREEN, GRAY, κ.λ.π.) παρέχονται από την κλάση αυτή ως σταθερές τύπου Color. Η δήλωση Color.ORANGE σας παρέχει το αντικείµενο της κλάσης Color που αντιστοιχεί στο πορτοκαλί χρώµα. 6.2 Εκτέλεση ενός applet Όπως έχει ήδη αναφερθεί, το applet δεν είναι αυτόνοµο πρόγραµµα, κι εποµένως δεν µπορεί να εκτελεστεί από µόνο του. Για να εκτελεστεί ένα applet θα πρέπει να φιλοξενηθεί µέσα από µια άλλη εφαρµογή. Οι εφαρµογές στις οποίες µπορεί να φιλοξενηθεί ένα applet είναι δύο ειδών: o appletviewer και οι Internet browsers Με τον appletviewer O appletviewer όπως λέει και το όνοµά του µας επιτρέπει να κάνουµε προεπισκόπηση ενός applet. Γενικότερα τα applets είναι προγράµµατα που προορίζονται να χρησιµοποιηθούν στο εσωτερικό ιστοσελίδων, αλλά παρόλαυτά θα πρέπει κατά την ανάπτυξη ενός applet o προγραµµατιστής να µπορεί να ελέγχει την εκτέλεση του applet χωρίς να χρειάζεται να το βάζει σε ιστοσελίδα. Για το λόγο αυτό, µαζί µε το πακέτο ανάπτυξης JDK της java διατίθεται το εκτελέσιµο αρχείο: <jdk_dir>/bin/appletviewer.exe Σχήµα 6-1: Το applet που παράγεται από την κλάση gr.teicrete.mta.gui.firstapplet 62

63 Για να καλέσετε τον appletviewer µέσα από το περιβάλλον του eclipse, µπορείτε να επιλέξετε στο κουµπί: Run> Run As > Java Applet Ως αποτέλεσµα θα σας ανοίξει το παράθυρο που φαίνεται στο Σχήµα 5-5, δηλαδή ένα παραθυράκι µε πορτοκαλί φόντο. Αυτό ακριβώς είναι το FirstApplet Με web browser Για να δούµε την εκτέλεση του applet µέσα από κάποιον Internet Browser, θα πρέπει να υλοποιήσουµε µία HTML σελίδα στην οποία θα συµπεριλάβουµε το applet. H επεξήγηση του κώδικα HTML σελίδων είναι πέρα από τους στόχους του συγκεκριµένου µαθήµατος. Εντούτοις, για λόγους επίδειξης παρατίθεται εδώ µία ενδεικτική HTML σελίδα που περιλαµβάνει το applet που παρατίθεται στον προηγούµενο κώδικα. Σχήµα 6-2: Ενδεικτική HTML σελίδα για το gr.teicrete.mta.gui.firstapplet Αυτό το HTML αρχείο θα πρέπει να το αποθηκεύσετε σε κάποιο σηµείο του δίσκου από το οποίο να είναι προσβάσιµο το αρχείο gr.teicrete.mta.gui.firstapplet.class. Έτσι, ένα καλό σηµείο για να το αποθηκεύσετε είναι ο φάκελος bin του eclipse project στο οποίο περιλαµβάνεται το συγκεκριµένο applet. Στη συνέχεια ανοίξτε το αρχείο αυτό µέσα από έναν Internet Browser (Σχήµα 6-3). Σχήµα 6-3: H HTML σελίδα µέσα από έναν Internet browser. 63

64 6.3 Κύκλος ζωής ενός applet Ένα applet από τη στιγµή που δηµιουργείται µέχρι τη στιγµή που καταστρέφεται περνάει από τα τέσσερα στάδια του κύκλου ζωής του. Και µάλιστα, ο κύκλος ζωής του applet ελέγχεται από την εφαρµογή από την οποία φιλοξενείται. Υπάρχουν τέσσερις µέθοδοι οι οποίες σε κάθε applet κληρονοµούνται από την κλάση java.applet.applet. Οι µέθοδοι αυτές καλούνται από την εφαρµογή στην οποία φιλοξενείται το applet (Internet Browser ή appletviewer) προκειµένου αυτό να τεθεί σε ένα από τα τέσσερα στάδια του κύκλου ζωής του. Τα τέσσερα στάδια του κύκλου ζωής του applet είναι τα ακόλουθα: 1. Αρχικοποίηση: Στο στάδιο αυτό το applet αρχικοποιεί τις παραµέτρους που χρειάζεται για τη λειτουργία του. Για να τεθεί το applet σε αυτό το στάδιο θα πρέπει να καλεσθεί η µέθοδος public void init() από την εφαρµογή που φιλοξενεί το applet. Τα applets για τα οποία χρειάζεται να συµβεί κάτι κατά το στάδιο της αρχικοποίησης θα πρέπει να υπερκαλύπτουν τη µέθοδο αυτή. Έτσι για παράδειγµα αν σε κάποιο applet συµπεριλαµβάνονται κουµπιά, τότε θα πρέπει να υπερκαλυφθεί η µέθοδος init(), προκειµένου κατά το στάδιο αυτό να αρχικοποιηθούν τα αντικείµενα των κουµπιών και να τοποθετηθούν στο σωστό σηµείο στο παράθυρο του applet. 2. Εκκίνηση: Κατά το στάδιο αυτό, το applet µπαίνει σε λειτουργία, δηλαδή ξεκινάει να εκτελεί αυτό το οποίο είναι προγραµµατισµένο να εκτελέσει. Ένα applet τίθεται στην κατάσταση αυτή όταν καλείται η µέθοδος public void start(). Ta applets για τα οποία θα πρέπει να συµβεί κάτι παράλληλα µε το στάδιο της αρχικοποίησης, π.χ. να αρχίσει ένα animation θα πρέπει να υπερκαλύπτουν τη µέθοδο αυτή προκειµένου να υλοποιηθεί η σχετική λειτουργία. 3. Σταµάτηµα: Ένα applet µπαίνει σε αυτό το στάδιο για να τερµατιστεί η λειτουργία του. Το στάδιο αυτό σηµατοδοτείται από κλήση στη µέθοδο public void stop(). Υπερκάλυψη της µεθόδου αυτής µπορεί να γίνει προκειµένου για παράδειγµα να σταµατήσει ένα animation που έχει ξεκινήσει µε τη µέθοδο start(). Η µέθοδος αυτή καλείται από την εφαρµογή που φιλοξενεί το applet λίγο πριν κλείσει. 4. Καταστροφή: Σηµατοδοτείται από τη µέθοδο public void destroy() προκειµένου να καταστραφεί µνήµη που ενδεχοµένως δεσµεύτηκε κατά την έναρξη του applet. Στο ακόλουθο απόσπασµα κώδικα έχουν υπερκαλυφθεί και οι τέσσερις µέθοδοι που σηµατοδοτούν τον κύκλο ζωής του applet, έτσι ώστε κάθε µέθοδος να εκτυπώνει στην κονσόλα του προγράµµατος ένα σχετικό µήνυµα. package gr.teicrete.mta.gui; import java.applet.applet; import java.awt.color; public class FirstApplet extends Applet { public FirstApplet() { System.out.println("creating applet"); this.setbackground(color.orange); 64

65 public void init() { System.out.println("Initialising Applet..."); public void start() { System.out.println("Starting Applet..."); public void stop() { System.out.println("Stoping Applet..."); public void destroy() { System.out.println("Destroying Applet..."); Κατά την εκτέλεση του παραπάνω applet παρατηρήστε ότι στην κονσόλα του applet εµφανίζονται µε συγκεκριµένη σειρά οι εκτυπώσεις: creating applet Initialising Applet... Starting Applet ηλαδή πρώτα καλείται η µέθοδος κατασκευαστή, έπειτα η µέθοδος init() και στη συνέχεια η µέθοδος start(). Λίγο πριν κλείσετε τον appletviewer ή τον Ιnternet Browser θα παρατηρήσετε ότι θα εµφανιστούν και οι εκτυπώσεις Stoping Applet... Destroying Applet... Το οποίο σηµαίνει ότι καθώς η εφαρµογή που φιλοξενεί το applet παύει να το φιλοξενεί, καλέιται πρώτα η µέθοδος stop() και έπειτα η µέθοδος destroy(). 6.4 Προσθήκη γραφικών στοιχείων Ας προσπαθήσουµε τώρα να προσθέσουµε κάποια γραφικά στο applet. O στόχος είναι να φτιάξουµε ένα applet το οποίο περιλαµβάνει δύο κουµπιά REFRESH και EXIT καθώς κι ένα καµβά στον οποίο θα µπορούµε να ζωγραφίζουµε διάφορα σχέδια χρησιµοποιώντας το ποντίκι του υπολογιστή. Στο επόµενο κεφάλαιο περιγράφεται τρόπος µε τον οποίο µπορούµε να προσδώσουµε αλληλεπιδραστικότητα στα γραφικά αυτά στοιχεία Κουµπιά ελέγχου Το ακόλουθο απόσπασµα κώδικα υλοποιεί ένα applet στο οποίο περιλαµβάνονται δύο κουµπιά. package gr.teicrete.mta.gui; import java.applet.applet; import javax.swing.jbutton; 65

66 public class SecondApplet extends Applet { static final int APP_WIDTH = 800; static final int APP_HEIGHT = 600; JButton refresh = null; JButton exit = null; /** Overriding the init method in order to put the buttons. */ public void init() { resize(app_width, APP_HEIGHT); //resize applet window setlayout(null); //for absolute (x, y) positioning // REFRESH button //create button labeled "REFRESH" refresh = new JButton("REFRESH"); add(refresh); //add button on applet window //set button position and dimensions refresh.setbounds(app_width/2-150, APP_HEIGHT-100, 100, 50); Παρατηρήστε τα εξής: // EXIT button //create button labeled "EXIT" exit = new JButton("EXIT"); add(exit); //add button on applet window //set button position and dimensions exit.setbounds(app_width/2 +50, APP_HEIGHT-100, 100, 50); Η κλάση SecondApplet χρησιµοποιεί τη µέθοδο της σύνθεσης για την αναπαράσταση των δύο κουµπιών, καθώς το applet έχει-δυο κουµπιά. ηλαδή το applet µε το κάθε κουµπί έχει σχέση τύπου has-a. Κατά συνέπεια, δύο αντικείµενα της κλάσης javax.swing.jbutton αποτελούν µεταβλητές µέλη της κλάσης SecondApplet. Σε αυτό το applet έχει υπερκαλυφθεί µόνο η µέθοδος init(), στα πλαίσια της οποίας συµβαίνουν τα εξής. Καλείται η µέθοδος public void resize(int width, int height), η οποία έχει κληρονοµηθεί στην κλάση SecondApplet από την υπερκλάση της java.applet.applet. Η µέθοδος ορίζει τις διαστάσεις πλάτους και ύψους του applet σε pixels. Οι δύο διαστάσεις του applet, APP_WIDTH και APP_HEIGHT έχουν δηλωθεί σε σταθερές, υποδεικνύοντας έτσι µία προγραµµατιστική πρακτική. Πράγµατι, όπως βλέπετε οι σταθερές αυτές έχουν χρησιµοποιηθεί και σε άλλα σηµεία του κώδικα. Εάν αντί των σταθερών στα σηµεία αυτά χρησιµοποιούσαµε απευθείας τα νούµερα (π.χ. 800 και 600), τότε εάν αργότερα αποφασίζαµε ότι θέλουµε να αλλάξουµε τις διαστάσεις αυτές θα έπρεπε να αλλάξουµε όλα αυτά τα νούµερα και µάλιστα µπορεί να µας ξέφευγε και κανένα, το οποίο να ήταν στη συνέχεια δύσκολο να βρεθεί. Ενώ µε τη χρήση των σταθερών APP_WIDTH και APP_HEIGHT, για να αλλάξω τις διαστάσεις του applet αρκεί να αλλάξω τα νούµερα σε ένα µόνο σηµείο. Στη συνέχεια µέσα στη µέθοδο κατασκευαστή καλείται η µέθοδος setlayout(null). Η µέθοδος αυτή ορίζει το διαχειριστή διάταξης (layout manager) γραφικών στοιχείων για το συγκεκριµένο applet. Οι layout managers είναι πέρα από το αντικείµενο του κεφαλαίου αυτού. Προς το παρόν αρκεί να 66

67 γνωρίζετε ότι η κλίση σε αυτή τη µέθοδο µε όρισµα null είναι απαραίτητη προκειµένου να µπορέσετε να τοποθετήσετε τα γραφικά αντικείµενα πάνω στο applet µε συντεταγµένες x, y σε pixels. Τα δύο επόµενα σύνολα εντολών αφορούν στα κουµπιά. Κάθε τέτοιο σύνολο κατασκευάζει το αντίστοιχο κουµπί µε κλίση στη µέθοδο κατασκευαστή του αντικειµένου javax.swing.jbutton, προσθέτει το κουµπί πάνω στο applet µε κλίση στη µέθοδο add() και τέλος καθορίζει τη θέση του κουµπιού πάνω στο applet καθών και τις διαστάσεις του (πλάτος και ύψος) µε τη µέθοδο public void setbounds(int x, int y, int width, int height). Οι µέθοδοι add() και setbounds() κληρονοµούνται όπως µπορείτε α δείτε από την τεκµηρίωση javadoc της κλάσης java.applet.applet από την υπερκλάση του java.awt.component. Για την τοποθέτηση των κουµπιών µε συντεταγµένες x, y, πέραν από την κλίση setlayout(null) είναι απαραίτητη και η κλίση στη µέθοδο setbounds() τις οποίας τα δύο πρώτα ορίσµατα αναφέρονται στη θέση x, y της πάνω αριστερά γωνίας του κουµπιού και τα δύο επόµενα στις διαστάσεις του πλάτος και ύψος. Οι συντεταγµένες x,y αναφέρονται σε σύστηµα αναφοράς µε αρχή την πάνω αριστερά γωνία του παραθύρου του applet, άξονα x που αυξάνει από το σηµείο αυτό και προς τα δεξιά στην οριζόντιο και άξονα y που αυξάνει από το σηµείο αυτό προς τα κάτω στην κατακόρυφο, όπως φαίνεται στο Σχήµα 6-4. Έτσι τα δύο κουµπιά έχουν διαταχθεί 100pixels πριν το κάτω µέρος του applet, ενώ στην οριζόντιο το κουµπί REFRESH βρίσκεται 150 pixels αριστερότερα από το µέσο του παραθύρου και το κουµπί EXIT 50pixels δεξιότερα από το µέσον. Οι διαστάσεις και των δύο κουµπιών είναι 100 x 50 pixels. 67

68 Σχήµα 6-4: Applet µε γραφικά στοιχεία και οι συντεταγµένες τους H κλάση java.awt.canvas και η µέθοδος paint() Σε συνδυασµό µε τα παραπάνω γραφικά αντικείµενα, δηλαδή τα κουµπιά θα προσθέσουµε τώρα ένα γραφικό αντικείµενο στο οποίο µπορούµε να αναπαριστούµε σχέδια και σχήµατα. Το αντικείµενο αυτό παρέχεται από την κλάση java.awt.canvas. Όπως µπορείτε να διαβάσετε στην τεκµηρίωση javadoc, από µόνο του, εάν δηµιουργήσουµε ένα αντικείµενο της κλάσης αυτής θα µας δώσει µία λευκή και άδεια παραλληλόγραµµη επιφάνεια. Προκειµένου να αποτυπώσουµε κάποια γραφικά που εµείς θα επιλέξουµε στην επιφάνεια αυτή θα πρέπει να δηµιουργήσουµε µία υποκλάση της java.awt.canvas και να υπερκαλύψουµε τη µέθοδο public void paint(graphics g) προκειµένου να ορίσουµε τα δικά µας γραφικά. Το παρακάτω απόσπασµα κώδικα παρέχει µία τέτοια υποκλάση: package gr.teicrete.mta.gui; import java.awt.canvas; 68

69 import java.awt.color; import java.awt.font; import java.awt.graphics; public class DrawingCanvas extends Canvas { DrawingCanvas() { setbackground(color.light_gray); public void paint(graphics screen) { //create new Font Object. Family font is "Sans Serif", //style is ITALIC and size is 16pt Font f = new Font(Font.SANS_SERIF, Font.BOLD, 16 ); //set the screen font screen.setfont(f); screen.drawstring("hello World!", 100, 200); //fill a red Oval screen.setcolor(color.red); screen.filloval(350, 200, 300, 100); //draw a blue raised 3D rectangle screen.setcolor(color.blue); screen.draw3drect(300, 100, 100, 200, true); Παρατηρήστε τα εξής: Το φόντο των αντικειµένων της κλάσης ορίζεται στη µέθοδο κατασκευαστή και είναι ανοιχτό γκρι. Η µέθοδος public void paint(graphics screen), η οποία και έχει υπερκαλυφθεί έχει ως όρισµα ένα αντικείµενο της κλάσης java.awt.graphics, το οποίο αντιπροσωπεύει την επιφάνεια ζωγραφίσµατος. Αν δείτε την τεκµηρίωση javadoc για την κλάση αυτή θα παρατηρήσετε ότι σας παρέχει µεθόδους για την αλλαγή χρωµάτων και γραµµατοσειρών καθώς και για την αναπαράσταση γραµµατοσειρών, ελλειπτικών και παραλληλόγραµµων σχηµάτων. Οι µέθοδοι που ξεκινούν µε draw ζωγραφίζουν περιγράµµατα, ενώ οι µέθοδοι που ξεκινούν µε fill ζωγραφίζουν επιφάνειες. Μέσα στη µέθοδο paint, δηµιουργείται µία νέα γραµµατοσειρά (αντικείµενο της κλάσης java.awt.font) η οποία και χρησιµοποιείται για την αναπαράσταση της φράσης Hello World!. Επίσης ζωγραφίζεται µια ελλειπτική επιφάνεια κόκκινου χρώµατος και ένα περίγραµµα χρώµατος µπλε, όπως φαίνεται στο Σχήµα 6-5. Το µπλε παραλληλόγραµµο περίγραµµα επικαλύπτει την κόκκινη ελλειπτική επιφάνεια καθώς η κλίση για το ζωγράφισµα του γίνεται µετά το ζωγράφισµα της ελλειπτικής επιφάνειας. Εάν ζωγραφίζονταν το παραλληλόγραµµο πριν την επιφάνεια τότε µέρος του παραλληλόγραµµου δε θα επικαλύπτονταν από την έλλειψη. Εποµένως τα σχήµατα ζωγραφίζονται µε τη σειρά που γίνονται οι κλίσεις στις αντίστοιχες µεθόδους, από την επιφάνεια του καµβά και προς τα πάνω. 69

70 Ένα επιπλέον σηµείο που κρίνεται σκόπιµο να αναφερθεί εδώ αφορά στο γεγονώς ότι και η ίδια η κλάση java.applet.applet διαθέτει µία µέθοδο public void paint(graphics screen). Είναι λοιπόν λογικό να αναρωτιέται κανείς, γιατί να απαιτείται η χρήση της κλάσης java.awt.canvas και να µην υπερκαλύπτουµε απευθείας τη µέθοδο public void paint(graphics screen)του applet. Η απάντηση είναι ότι η υπερκάλυψη της paint δεν είναι συµβατή µε την προσθήκη γραφικών όπως κουµπιά µέσω της µεθόδου add και setbounds στην ίδια κλάση. Κατά συνέπεια, εάν στην εφαρµογή µας χρειαζόµαστε να έχουµε τόσο στοιχεία ελέγχου (όπως κουµπιά) όσο και ζωγραφιές, τότε θα πρέπει να χρησιµοποιούµε την κλάση Canvas και να υπερκαλύπτουµε τη µέθοδο paint σε µία υποκλάση της. 6.5 Άσκηση Σχήµα 6-5: Χρήση της κλάσης java.awt.canvas. Να φτιάξετε ένα Applet το οποίο σε ένα Canvas να ζωγραφίζει µία κυµατοµορφή θορύβου. Υπόδειξη: Χρησιµοποιείστε τη µέθοδο Math.random() για τη παραγωγή τυχαίων τιµών. 70

71 7 Γεγονότα (events) Στον προγραµµατισµό, ο όρος «γεγονός» (event) αναφέρεται σε µία οποιαδήποτε ενέργεια η οποία επιτελείται από παράγοντες που δε σχετίζονται µε ένα συγκεκριµένο πρόγραµµα αλλά στην οποία το πρόγραµµα οφείλει να ανταποκριθεί. Παράδειγµα τέτοιων γεγονότων µπορεί να είναι ενέργειες του χρήστη µέσω του πληκτρολογίου ή του ποντικιού του υπολογιστή, ή οποιασδήποτε άλλης συσκευής εισόδου (π.χ. Joystick, MIDI keyboard κ.λ.π..) στην οποία το πρόγραµµα οφείλει να ανταποκριθεί. Τα γεγονότα κατά κανόνα αλλάζουν τη ροή του προγράµµατος, ενώ τα προγράµµατα τα οποία υλοποιούν χειρισµό γεγονότων ονοµάζονται αλληλεπιδραστικά (interactive). Στο πακέτο ανάπτυξης της java (δηλ. το JDK) περιλαµβάνεται ένα ολόκληρο πακέτο κλάσεων το οποίο αφορά στο χειρισµό γεγονότων. Το πακέτο αυτό είναι το java.awt.event. Στο Σχήµα 7-1 αναπαρίσταται η τεκµηρίωση javadoc για το πακέτο αυτό. Σχήµα 7-1: Η τεκµηρίωση javadoc του πακέτου java.awt.event για το χειρισµό γεγονότων. Όπως µπορείτε να δείτε το πακέτο αυτό περιέχει δύο ειδών οντότητες: classes και interfaces. 7.1 Interfaces To interface αποτελεί ένα άλλο είδος αφαίρεσης στη Java. Ένα interface, είναι σαν µία κλάση στην οποία όµως καµία από τις µεθόδους δεν είναι υλοποιηµένη. Στο τµήµα κώδικα που ακολουθεί αναπαρίσταται ο πηγαίος κώδικας του interface java.awt.event.actionlistener. Όπως αναφέρεται και στο σχολιασµό του κώδικα αυτού, το interface αυτό αφορά στο χειρισµό γεγονότων τύπου ActionEvents. To ActionEvent είναι µία κλάση του πακέτου java.awt.event και αντιπροσωπεύει γεγονότα όπως είναι για παράδειγµα το πάτηµα ενός κουµπιού, όπως τα γραφικά κουµπιά που είδαµε στο παραπάνω κεφάλαιο. 71

72 package java.awt.event; import java.util.eventlistener; /** * The listener interface for receiving action events. * The class that is interested in processing an action event * implements this interface, and the object created with that * class is registered with a component, using the component's * <code>addactionlistener</code> method. When the action event * occurs, that object's <code>actionperformed</code> method is * invoked. * ActionEvent <a href=" torial: Java 1.1 Event Model</a> * Carl Quinn /13/ */ public interface ActionListener extends EventListener { /** * Invoked when an action occurs. */ public void actionperformed(actionevent e); Παρατηρήστε ότι Το interface ActionListener περιλαµβάνει µία µοναδική µέθοδο. Η µέθοδος αυτή ως δήλωση και όχι ως υλοποίηση. ηλαδή αντί να έχει σώµα (που σηµατοδοτείται από τις αγκύλες { και )περιλαµβάνεται µόνο το πρότυπο της µεθόδου το οποίο και τερµατίζεται από ελληνικό ερωτηµατικό. Στο σώµα του interface αντί για τη λέξη class χρησιµοποιείται η λέξη interface. Όταν ένα πρόγραµµα, όπως π.χ. το applet του Σχήµα 6-5 ενδιαφέρεται να ανταποκριθεί στο πάτηµα ενός κουµπιού, τότε θα πρέπει όπως λέµε να «υλοποιεί» το σχετικό interface, δηλαδή το ActionListener. Ας δούµε πώς γίνεται αυτό. 7.2 Πάτηµα κουµπιών ελέγχου Ας επανέλθουµε λοιπόν στο applet του προηγούµενου κεφαλαίου. Το applet αυτό διαθέτει δύο κουµπιά, δηλαδή δύο αντικείµενα της κλάσης javax.swing.jbutton. Εντούτοις δεν έχουµε µέχρι τώρα ορίσει τι είναι αυτό που θέλουµε να κάνει το πρόγραµµα, όταν πατιέται κάποιο από αυτό το κουµπί. Για να υλοποιήσουµε τη γεγονοστραφή αυτή συµπεριφορά ως προς το πάτηµα των κουµπιών θα πρέπει να «υλοποιήσουµε το interface ActionListener». Η υλοποίηση αυτή αποτυπώνεται στον παρακάτω κώδικα: package gr.teicrete.mta.gui; 72

73 import java.applet.applet; import java.awt.event.actionevent; import java.awt.event.actionlistener; import javax.swing.jbutton; public class SecondApplet extends Applet implements ActionListener { static final int APP_WIDTH = 800; static final int APP_HEIGHT = 600; JButton refresh = null; JButton exit = null; DrawingCanvas canvas = null; /** Overriding the init method in order to put the buttons. */ public void init() { resize(app_width, APP_HEIGHT); //resize applet window setlayout(null); //necessary for absolute (x, y) positioning // REFRESH button //create button labeled "REFRESH" refresh = new JButton("REFRESH"); add(refresh); //add button on applet window //set button position and dimensions refresh.setbounds(app_width/2-150, APP_HEIGHT-100, 100, 50); //associate this ActionListener with button refresh refresh.addactionlistener(this); // EXIT button //create button labeled "EXIT" exit = new JButton("EXIT"); add(exit); //add button on applet window //set button position and dimensions exit.setbounds(app_width/2 +50, APP_HEIGHT-100, 100, 50); //associate this ActionListener with button exit exit.addactionlistener(this); //------Drawing Canvas canvas = new DrawingCanvas(); add(canvas); canvas.setbounds(0, 0, APP_WIDTH, APP_HEIGHT - 150); // ActionListener implementation---- public void actionperformed(actionevent e) { //get the object on which the action was performed Object src = e.getsource(); if(src.equals(exit)) { System.exit(0); else if(src.equals(refresh)) { canvas.repaint(); Παρατηρήσεις: Στη δήλωση του µπλοκ της κλάσης SecondApplet έχει προστεθεί η δήλωση implements ActionListener. Σε γενικές γραµµές όταν σε µία κλάση δηλώνεται implements (δηλ. υλοποιεί) κάποιο interface, τότε η κλάση αυτή 73

74 υποχρεούται να υλοποιήσει (δηλ. να δώσει σώµα) σε όλες τις µεθόδους αυτού του interface. ιαφορετικά προκύπτει σφάλµα κατά τη µεταγλώττιση. Κατά συνέπεια, η κλάση SecondApplet υλοποιεί τη µοναδική µέθοδο του Interface ActionListener δηλαδή τη µέθοδο actionperformed. Εντέλει αυτή είναι η µέθοδος η οποία θα κληθεί από το applet όταν ο χρήστης θα πατήσει κάποιο κουµπί. Μέσα στο σώµα της µεθόδου συµβαίνουν τα εξής: o Αξιοποιείται το όρισµα e το οποίο είναι αντικείµενο της κλάσης java.awt.event.actionperformed. Όταν θα κληθεί η µέθοδος actionperformed το όρισµα αυτό θα µας δώσει περαιτέρω πληροφορίες για την ενέργεια η οποία εκτελέστηκε. o Η µέθοδος e.getsource() επιστρέφει ένα στιγµιότυπο του αντικειµένου το οποίο πατήθηκε. Όπως µπορείτε να δείτε στην τεκµηρίωση javadoc ο τύπος επιστροφής για αυτή τη µέθοδο είναι java.lang.object. Όµως όπως αναφέρεται στην ενότητα 5.4, η κλάση αυτή αποτελεί υπερκλάση οποιασδήποτε κλάσης της java. Κι εποµένως οποιοδήποτε αντικείµενο λόγω πολυµορφισµού (βλέπε ενότητα 5.3) είναι και αντικείµενο της κλάσης Object. Αυτό αποτελεί κλασική πρακτική αφαίρεσης στη java. Όταν δηλαδή θέλουµε σε µία µέθοδο να επιστρέφεται η να εισέρχεται ως όρισµα κάποιο αντικείµενο το οποίο ανά περίσταση µπορεί να είναι στιγµιότυπο διαφορετικών κλάσεων τότε στον αντίστοιχο τύπο δηλώνουµε την κλάση Object. o Εποµένως το αντικείµενο src που επιστρέφεται από την κλίση στη µέθοδο e.getsource() µπορεί να είναι οτιδήποτε. Στη συνέχεια ο κώδικας ελέγχει, εάν το αντικείµενο αυτό ισούται µε το button exit τότε δίνεται η εντολή τερµατισµού του προγράµµατος System.exit(0). Εάν πάλι έχει πατηθεί το κουµπί refresh τότε καλείται η µέθοδος canvas.repaint() του αντικειµένου canvas. Το ερώτηµα που τίθεται τώρα είναι το εξής: αρκούν τα παραπάνω για να καλείται η µέθοδος actionperformed κάθε φορά που πατιέται κάποιο από τα κουµπιά του applet; Η απάντηση είναι πως όχι, διότι αν και έχουµε πει τι πρέπει να συµβαίνει όταν πατιέται κάποιο κουµπί εντούτοις δεν έχουµε συσχετίσει τα υπάρχοντα κουµπιά µε αυτή τη µέθοδο κι εποµένως µε τον συγκεκριµένο χειριστή γεγονότων που υλοποιείται στην κλάση SecondApplet. Ο συσχετισµός αυτός παρέχεται από τις εντολές που έχουµε προσθέσει στη µέθοδο init και είναι οι refresh.addactionlistener(this); και exit.addactionlistener(this); Οι εντολές αυτές συσχετίζουν τα κουµπιά exit και refresh µε το τρέχον αντικείµενο το οποίο είναι ένας ActionListener καθώς υλοποιεί το σχετικό interface. Με άλλα λόγια λένε στο διερµηνευτή της java: όταν πατηθεί το κουµπί exit (ή το κουµπί refresh) κάλεσε τη µέθοδο actionperformed αυτουνού του αντικειµένου. Σηµειώστε ότι η υλοποίηση του interface ActionListener θα µπορούσε να βρίσκεται σε κάποια άλλη κλάση, εκτός του applet, οπότε στην περίπτωση αυτή το όρισµα της addactionlistener θα έπρεπε να αποτελεί στιγµιότυπο της κλάσης αυτής. Η παρουσία των εντολών αυτών είναι απαραίτητη προκειµένου το πρόγραµµα να ανταποκρίνεται στο πάτηµα των κουµπιών. 74

75 7.3 Χειρισµός γεγονότων ποντικιού (mouse events) Αναφορικά µε γεγονότα που σχετίζονται µε το ποντίκι του υπολογιστή το πακέτο java.awt.event παρέχει τις κλάσεις MouseEvent και MouseWheelEvent καθώς και τα interfaces MouseListener, MouseMotionListener και MouseWheelListener. Λεπτοµέρειες για αυτές τις κλάσεις και τα interfaces µπορείτε να βρείτε στην τεκµηρίωση javadoc. Σε συνέχεια του παραδείγµατος µε το προηγούµενο applet, αυτό που θα µπορούσαµε να προγραµµατίσουµε είναι να επιτρέψουµε τη γραφή και τη δηµιουργία σχηµάτων πάνω στο αντικείµενο canvas, µε µετακίνηση του ποντικιού και πατηµένο το αριστερό πλήκτρο. Λόγω των ονοµάτων των παραπάνω interfaces, και µια και µιλάµε για µετακίνηση ποντικιού υποψιαζόµαστε ότι το interface που µας ενδιαφέρει είναι ο χειριστής κίνησης του ποντικιού, δηλαδή ο MouseMotionListener. Πράγµατι, εάν συµβουλευθούµε το javadoc το interface αυτό παρέχει δύο µεθόδους: o void mousedragged(mouseevent e) o void mousemoved(mouseevent e) Η πρώτη αναφέρεται σε κίνηση του ποντικιού ενώ το αριστερό πλήκτρο είναι πατηµένο ενώ η δεύτερη αναφέρεται σε κίνηση του ποντικιού χωρίς πατηµένο πλήκτρο. Εποµένως µας ενδιαφέρει η πρώτη µέθοδος και µάλιστα αυτό που θέλουµε να συµβαίνει όταν σύρεται το ποντίκι είναι να ζωγραφίζεται µία γραµµή ανάµεσα στο τρέχον σηµείο του δείκτη mouse pointer και στο σηµείο που βρίσκονταν ο δείκτης την προηγούµενη στιγµή. Η νέα τροποποιηµένη κλάση gr.teicrete.mta.gui.drawingcanvas που επιτρέπει στο χρήστη να ζωγραφίζει µε το ποντίκι φαίνεται παρακάτω. package gr.teicrete.mta.gui; import java.awt.canvas; import java.awt.color; import java.awt.font; import java.awt.graphics; import java.awt.event.mouseevent; import java.awt.event.mouselistener; import java.awt.event.mousemotionlistener; public class DrawingCanvas extends Canvas implements MouseMotionListener, MouseListener { int previous_x, previous_y; //previous coordinates of mouse pointer int x, y; //current coordinates of mouse pointer DrawingCanvas() { setbackground(color.light_gray); this.addmousemotionlistener(this); this.addmouselistener(this); public void paint(graphics screen) { //create new Font Object. Family font is "Sans Serif", //style is ITALIC and size is 16pt Font f = new Font(Font.SANS_SERIF, Font.BOLD, 16 ); //set the screen font screen.setfont(f); screen.drawstring("hello World!", 100, 200); 75

76 //fill a red Oval screen.setcolor(color.red); screen.filloval(350, 200, 300, 100); //draw a blue raised 3D rectangle screen.setcolor(color.blue); screen.draw3drect(300, 100, 100, 200, true); // MouseMotionListener impl public void mousemoved(mouseevent e) { public void mousedragged(mouseevent e) { x= e.getx(); y = e.gety(); this.getgraphics().drawline(previous_x, previous_y, x, y); previous_x = e.getx(); previous_x = e.getx(); previous_y = e.gety(); // MouseListener impl public void mousepressed(mouseevent e) { previous_x = e.getx(); previous_y = e.gety(); public void mouseclicked(mouseevent e) { public void mousereleased(mouseevent e){ public void mouseexited(mouseevent e) { public void mouseentered(mouseevent e) { Παρατηρήστε τα εξής: Τα αντικείµενα της κλάσης αυτής διαθέτουν τέσσερις µεταβλητές µέλη όπου ανά πάσα στιγµή αποθηκεύονται οι τρέχουσες συντεταγµένες του mouse pointer (x, y) και οι προηγούµενες συντεταγµένες του mouse pointer (previous_x, previous_y). Στο εσωτερικό της µεθόδου mousedragged συµβαίνουν τα ακόλουθα: o Ανανεώνονται οι τρέχουσες συντεταγµένες x, y µέσω των µεθόδων e.getx() και e.gety(), οι οποίες διατίθενται από την κλάση MouseEvent (βλέπε javadoc). Οι συντεταγµένες αυτές παρέχονται αναφορικά µε την πάνω αριστερά γωνία του αντικειµένου canvas και όχι του applet, µια και όπως θα δούµε στη συνέχεια o χειριστής MouseMotionListener συσχετίζεται µε το αντικείµενο canvas. o Αποκτάται το στιγµιότυπο του αντικειµένου Graphics που σχετίζεται µε το αντικείµενο canvas. Η µέθοδος getgraphics() είναι µέθοδος της κλάσης Canvas καθώς κληρονοµείται από την υπερκλάση της 76

77 java.awt.component. Να θυµάστε ότι εποµένως όλα τα γραφικά αντικείµενα διαθέτουν µία τέτοια µέθοδο. o Το αντικείµενο αυτό αξιοποιείται για να κληθεί η µέθοδος drawline(previous_x, previous_y, x, y). o Ανανεώνεται η τιµή των previous_x, previous_y µε τις τρέχουσες συντεταγµένες x, y. Με βάση τα παραπάνω το πρόβληµα που προκύπτει είναι το τι θα συµβεί κατά το πρώτο σύρσιµο του ποντικιού όπου οι µεταβλητές previous_x, previous_y θα έχουν την τιµή µηδέν καθώς δεν έχουν πάρει την τιµή της προηγούµενης θέσης του ποντικιού. Η απάντηση είναι ότι η πρώτη γραµµή θα ενώνει την πάνω αριστερά γωνία του canvas µε το σηµείο στο οποίο άρχισε το σύρσιµο (dragging). Για να το λύσουµε αυτό το πρόβληµα, το οποίο προφανώς δεν είναι επιθυµητή συµπεριφορά του προγράµµατος µας θα πρέπει να βρούµε το πρώτο σηµείο στο οποίο ο χρήστης πατάει το αριστερό κουµπί του ποντικιού πριν αρχίσει το σύρσιµο. Λύση σε αυτό το πρόβληµα δίνει ο χείριστής MouseListener ο οποίος διαθέτει µία µέθοδο mousepressed, µέσω της οποίας παρέχονται οι συντεταγµένες του ποντικιού τη στιγµή που ο χρήστης πατάει το αριστερό πλήκτρο. Επίσης, στη µέθοδο κατασκευαστή παρατηρήστε το συσχετισµό των δύο interfaces µε το αντικείµενο canvas µέσω των εντολών this.addmousemotionlistener(this);και this.addmouselistener(this); Στο Σχήµα 7-2 αναπαρίσταται η λειτουργία του τροποποιηµένου αντικειµένου canvas. Σχήµα 7-2: To τροποποιηµένο applet µε δυνατότητα γραφής στον καµβά. Αναφορικά µε τη χρήση των δύο interfaces παρατηρήστε ότι στο εξωτερικό block της κλάσης δηλώνεται η φράση implements µε τα ονόµατα των δύο interfaces χωρισµένα µε κόµµα. Γενικά στη java αν και µία κλάση µπορεί να επεκτείνει (extends) και εποµένως να είναι υποκλάση µίας µόνο κλάσης, µπορεί εντούτοις µπορεί να υλοποιεί (implements) πολλαπλά interfaces. Αυτή είναι µία από τις διαφορές της Java από τη γλώσσα C++. Στη C++ κάθε κλάση µπορεί να έχει 77

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

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 8 & 9 18/10/07 ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 8 & 9 18/10/07 Αλγόριθμος: Βήμα προς βήμα διαδικασία για την επίλυση κάποιου προβλήματος. Το πλήθος των βημάτων πρέπει να είναι πεπερασμένο. Αλλιώς: Πεπερασμένη

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

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών Εισαγωγή στη γλώσσα προγραμματισμού JAVA Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών Το πρώτο φλιτζάνι Java Λίστα με τα απαραίτητα Το πρώτο μου πρόγραμμα(hello World) Συνεχίζοντας

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

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

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

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

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

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

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

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

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

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

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #1 ο : Εισαγωγή στο Περιβάλλον Ανάπτυξης (IDE)

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #1 ο : Εισαγωγή στο Περιβάλλον Ανάπτυξης (IDE) Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #1 ο : Εισαγωγή στο Περιβάλλον Ανάπτυξης (IDE) NetBeans, Πρώτα παραδείγματα ανάπτυξης Java εφαρμογών Γαβαλάς Δαμιανός dgavalas@aegean.gr Στόχοι

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

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #1 ο : Εισαγωγή στο Περιβάλλον Ανάπτυξης (IDE)

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #1 ο : Εισαγωγή στο Περιβάλλον Ανάπτυξης (IDE) Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #1 ο : Εισαγωγή στο Περιβάλλον Ανάπτυξης (IDE) NetBeans, Πρώτα παραδείγματα ανάπτυξης Java εφαρμογών Στόχοι εργαστηρίου Εξοικείωση με τις βασικές

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

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

Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα; Εισαγωγή Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα; 1. Σελίδα μαθήματος Εγγραφή Ο κάθε φοιτητής πρέπει να κάνει εγγραφή στη σελίδα του μαθήματος στην πλατφόρμα e-class

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

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 1: Εισαγωγικές έννοιες

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 1: Εισαγωγικές έννοιες ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 1: Εισαγωγικές έννοιες Μιχάλης Δρακόπουλος Σχολή Θετικών επιστημών Τμήμα Μαθηματικών ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (Java) Ενότητα 1 Αλγόριθμος: Βήμα προς βήμα διαδικασία για την επίλυση κάποιου

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

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

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Ακαδημαϊκό έτος: 2010-2011 Επιμέλεια Ξενοφών Βασιλάκος Περιεχόμενα Φροντιστηρίου 1. Εισαγωγή 2. Εντολές Εκχώρησης και Τελικές μεταβλητές 3. Μεταγλώττιση και διερμηνεία των

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

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες: Εργαστήριο Java Διδάσκουσα: Πρέντζα Ανδριάνα aprentza@unipi.gr Εργαστηριακοί Συνεργάτες: Γεωργιοπούλου Ρούλα Λύβας Χρήστος roulageorio@ssl-unipi.gr clyvas@unipi.gr Εργαστήρια Δευτέρα 18:00-20:00,Τρίτη

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Εισαγωγή στη Java Η εξέλιξη των γλωσσών προγραμματισμού Η εξέλιξη των γλωσσών προγραμματισμού είναι μια διαδικασία αφαίρεσης Στην αρχή ένα πρόγραμμα ήταν μια

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

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

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

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

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

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

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

Κεφάλαιο 2.3: Προγραμματισμός. Επιστήμη ΗΥ Κεφ. 2.3 Καραμαούνας Πολύκαρπος

Κεφάλαιο 2.3: Προγραμματισμός. Επιστήμη ΗΥ Κεφ. 2.3 Καραμαούνας Πολύκαρπος Κεφάλαιο 2.3: Προγραμματισμός 1 2.3.1 Αναφορά σε γλώσσες προγραμματισμού και «Προγραμματιστικά Υποδείγματα» 2.3.1.1 Πρόγραμμα και Γλώσσες Προγραμματισμού Πρόγραμμα: σύνολο εντολών που χρειάζεται να δοθούν

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

Εισαγωγή στον Προγραμματισμό Μάθημα 4: Αλγόριθμοι και Γλώσσες Προγραμματισμού Δεκέμβριος 2015 Χ. Αλεξανδράκη

Εισαγωγή στον Προγραμματισμό Μάθημα 4: Αλγόριθμοι και Γλώσσες Προγραμματισμού Δεκέμβριος 2015 Χ. Αλεξανδράκη Εισαγωγή στον Προγραμματισμό Μάθημα 4: Αλγόριθμοι και Γλώσσες Προγραμματισμού Δεκέμβριος 2015 Χ. Αλεξανδράκη Αλγόριθμος (τι είναι) Στα μαθηματικά και την επιστήμη ΗΥ Ο αλγόριθμος είναι η λογική διαδικασία

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

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Εργαστήριο 1 Εισαγωγή στη C Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr Διαδικαστικά Ιστοσελίδα μαθήματος: http://eclass.uoa.gr/courses/f30/ Υποχρεωτική παρακολούθηση: Παρασκευή 14:00 16:00 στην

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

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

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

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

Προγραμματισμός Η/Υ. Προτεινόμενα θέματα εξετάσεων Εργαστήριο. Μέρος 1 ό. ΤΕΙ Λάρισας- Σχολή Τεχνολογικών Εφαρμογών Τμήμα Πολιτικών Έργων Υποδομής

Προγραμματισμός Η/Υ. Προτεινόμενα θέματα εξετάσεων Εργαστήριο. Μέρος 1 ό. ΤΕΙ Λάρισας- Σχολή Τεχνολογικών Εφαρμογών Τμήμα Πολιτικών Έργων Υποδομής Προγραμματισμός Η/Υ Προτεινόμενα θέματα εξετάσεων Εργαστήριο Μέρος 1 ό ΤΕΙ Λάρισας- Σχολή Τεχνολογικών Εφαρμογών Τμήμα Πολιτικών Έργων Υποδομής Ιανουάριος 2011 Καλογιάννης Γρηγόριος Επιστημονικός/ Εργαστηριακός

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

ΚΕΦΑΛΑΙΟ 6. Περιβάλλοντα Ανάπτυξης Εφαρμογών. ΚΕΦΑΛΑΙΟ 6 Περιβάλλοντα Ανάπτυξης Εφαρμογών. Α Γενικού Λυκείου

ΚΕΦΑΛΑΙΟ 6. Περιβάλλοντα Ανάπτυξης Εφαρμογών. ΚΕΦΑΛΑΙΟ 6 Περιβάλλοντα Ανάπτυξης Εφαρμογών. Α Γενικού Λυκείου 49 Διδακτικές ενότητες 6.1 Γλώσσες και εργαλεία προγραμματισμού 6.2 Σύγχρονα προγραμματιστικά περιβάλλοντα Διδακτικοί στόχοι Σκοπός του κεφαλαίου είναι οι μαθητές να κατανοήσουν την ανάγκη ύπαρξης τόσο

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

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

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΜΑΡΙΑ Σ. ΖΙΩΓΑ ΚΑΘΗΓΗΤΡΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΙΜΕΛΕΙΑ: ΜΑΡΙΑ Σ. ΖΙΩΓΑ ΚΑΘΗΓΗΤΡΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΘΕΩΡΙΑ 6 ΟΥ ΚΕΦΑΛΑΙΟΥ ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ 6.1 Τι ονοµάζουµε πρόγραµµα υπολογιστή; Ένα πρόγραµµα

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Εισαγωγή στη Java Η εξέλιξη των γλωσσών προγραμματισμού Η εξέλιξη των γλωσσών προγραμματισμού είναι μια διαδικασία αφαίρεσης Στην αρχή ένα πρόγραμμα ήταν μια

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

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

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

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

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

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

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

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 1 ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Μάθημα 1ο Τμήμα Διοίκησης Επιχειρήσεων α εξάμηνο Β. Φερεντίνος Ορισμός Wikipedia.org 2 Δομημένος προγραμματισμός (structured programming) ή διαδικαστικός προγραμματισμός (procedural

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

ΚΕΦΑΛΑΙΟ 1. Εισαγωγή στην Python. 1.1 Εισαγωγή

ΚΕΦΑΛΑΙΟ 1. Εισαγωγή στην Python. 1.1 Εισαγωγή ΚΕΦΑΛΑΙΟ 1 Εισαγωγή στην Python Σύνοψη Σε αυτό το κεφάλαιο κάνουμε μια σύντομη εισαγωγή στην Python και στα εργαλεία λογισμικού που θα χρησιμοποιήσουμε στη συνέχεια του συγγράμματος. Προαπαιτούμενη γνώση

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

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

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

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

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

Δομημένος Προγραμματισμός Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων Δομημένος Προγραμματισμός Ενότητα 1: Εισαγωγή Το περιεχόμενο του μαθήματος διατίθεται με άδεια Creative Commons εκτός και αν αναφέρεται διαφορετικά Το έργο

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

Κεφ. 2 Θέματα Θεωρητικής Επιστήμης Υπολογιστών. Κοντογιάννης Βασίλειος ΠΕ19

Κεφ. 2 Θέματα Θεωρητικής Επιστήμης Υπολογιστών. Κοντογιάννης Βασίλειος ΠΕ19 Κεφ. 2 Θέματα Θεωρητικής Επιστήμης Υπολογιστών Κεφ. 2 Θεωρητική Επιστήμη Υπολογιστών 2.3.1.1 Έννοια προγράμματος Τι είναι πρόγραμμα και τι προγραμματισμός; Πρόγραμμα είναι το σύνολο εντολών που χρειάζεται

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

Το πρόγραμμα 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 υποστηρίζει

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

Γλώσσες υψηλού επιπέδου Περιέχουν περισσότερες εντολές για την εκτέλεση πολύπλοκων εργασιών Τα προγράµµατα µεταφράζονται σε γλώσσα µηχανής είτε από το

Γλώσσες υψηλού επιπέδου Περιέχουν περισσότερες εντολές για την εκτέλεση πολύπλοκων εργασιών Τα προγράµµατα µεταφράζονται σε γλώσσα µηχανής είτε από το Σηµαντικά σηµεία κεφαλαίου Τα τρία στάδια επίλυσης ενός προβλήµατος: Ακριβής προσδιορισµό του προβλήµατος Ανάπτυξη του αντίστοιχου αλγορίθµου. ιατύπωση του αλγορίθµου σε κατανοητή µορφή από τον υπολογιστή.

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

Είναι μια αλληλουχία κατάλληλων οδηγιών(εντολών) που εκτελεί ο υπολογιστής για την επίλυση ενός προβλήματος.

Είναι μια αλληλουχία κατάλληλων οδηγιών(εντολών) που εκτελεί ο υπολογιστής για την επίλυση ενός προβλήματος. Û ØÓÒ ÔÖÓ Ö ÑÑ Ø Ñ ¾ Ç Ö ÐÓ ØÛÒ ÙÔÓÐÓ ØôÒ Ο υπολογιστής είναι εργαλείο επίλυσης προβλημάτων λόγω: ταχύτητας υπολογισμού και μεγέθους μνήμης γενικής χρησιμότητας μέσω της έννοιας του προγραμματισμού. Η

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

Υλοποίηση ενός προγραμματιστικού κελύφους εργασίας

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

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

Διάλεξη 1: Αντικειμενοστρεφής Προγραμματισμός -Εισαγωγή. Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 1: Αντικειμενοστρεφής Προγραμματισμός -Εισαγωγή. Διδάσκων: Παναγιώτης Ανδρέου Διάλεξη 1: Αντικειμενοστρεφής Προγραμματισμός -Εισαγωγή Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Εισαγωγή στις έννοιες: - Γλώσσες Προγραμματισμού - Μεταγλώττιση και Διερμηνεία -Η πλατφόρμα

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

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

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Σύντομη εισαγωγή στην Java Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Σύντομη εισαγωγή στην Java Δρ. Απόστολος Γκάμας Λέκτορας (407/80) gkamas@uop.gr Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου Διαφάνεια 1 Εισαγωγή

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

Εισαγωγή στη JAVA. Εισαγωγή στη Java. Η Java είναι δημιούργημα της SUN MICROSYSTEMS.

Εισαγωγή στη JAVA. Εισαγωγή στη Java. Η Java είναι δημιούργημα της SUN MICROSYSTEMS. Εισαγωγή στη JAVA Σύντομο Ιστορικό Η Java και το διαδίκτυο Το πρώτο απλό πρόγραμμα σε JAVA Μεταβλητές και σταθερές Παραστάσεις και εντολές Οι βασικοί τύποι δεδομένων στη Java Οι βασικοί Τελεστές στη Java

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

Εισαγωγή στον Προγραμματισμό Python Μάθημα 1: Μεταβλητές, τελεστές, είσοδος/έξοδος προγράμματος, συνθήκη ελέγχου if Νοέμβριος 2014 Χ. Αλεξανδράκη, Γ.

Εισαγωγή στον Προγραμματισμό Python Μάθημα 1: Μεταβλητές, τελεστές, είσοδος/έξοδος προγράμματος, συνθήκη ελέγχου if Νοέμβριος 2014 Χ. Αλεξανδράκη, Γ. Εισαγωγή στον Προγραμματισμό Python Μάθημα 1: Μεταβλητές, τελεστές, είσοδος/έξοδος προγράμματος, συνθήκη ελέγχου if Νοέμβριος 2014 Χ. Αλεξανδράκη, Γ. Δημητρακάκης Σύνοψη Μαθήματος Προηγούμενο μάθημα Αλγόριθμοι

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

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

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

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

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

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7 Π. Σταθοπούλου pstath@ece.upatras.gr ή pstath@upatras.gr Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7 Φροντιστήριο : ευτέρα 11πµ-12πµ ΗΛ4 ΠΕΡΙΕΧΟΜΕΝΟ ΤΟΥ ΜΑΘΗΜΑΤΟΣ Αρχές

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

Εργαλεία του JDK. Β.1 Εργαλεία του JDK. Β.2 Μεταγλωττιστής javac. Τα πιο βασικά εργαλεία του JDK είναι τα παρακάτω.

Εργαλεία του JDK. Β.1 Εργαλεία του JDK. Β.2 Μεταγλωττιστής javac. Τα πιο βασικά εργαλεία του JDK είναι τα παρακάτω. Εργαλεία του JDK Β.1 Εργαλεία του JDK Τα πιο βασικά εργαλεία του JDK είναι τα παρακάτω. O µεταγλωττιστής (compiler) της Java javac. O διερµηνευτής (interpreter) της Java java. Το υπεύθυνο εργαλείο για

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

1. Ξεκινώντας. 1.1 Τι είναι η Java. PDF created with FinePrint pdffactory Pro trial version

1. Ξεκινώντας. 1.1 Τι είναι η Java. PDF created with FinePrint pdffactory Pro trial version 1. Ξεκινώντας Τελειώνοντας αυτό το κεφάλαιο θα μπορείτε: Να περιγράψετε τα κύρια χαρακτηριστικά της γλώσσας Java Να περιγράψετε τη Java Virtual Machine Να περιγράψετε πώς λειτουργεί ο μηχανισμός «συλλογής

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

Java sessions. Part 1 - Βασικά έννοιες - μέθοδοι

Java sessions. Part 1 - Βασικά έννοιες - μέθοδοι Java sessions Part 1 - Βασικά έννοιες - μέθοδοι Ενότητα 1 Η γλώσσα Java 1.1 - Ιστορία Ξεκίνησε το 1995 από τον James Gosling, υπάλληλο της Sun Microsystems Αρχικά ονομάστηκε Oak, αργότερα άλλαξε σε Java

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

Μαλούτα Θεανώ Σελίδα 1

Μαλούτα Θεανώ Σελίδα 1 ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΑΡΧΕΣ ΤΗΣ ΕΠΙΣΤΗΜΗΣ ΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ Α. ΕΡΩΤΗΣΕΙΣ ΘΕΩΡΙΑΣ ΦΥΛΛΑΔΙΟ 6 ο ( Ενότητες 2.3 ) 1.Τι είναι πρόγραμμα; 2. Ποια είναι τα πλεονεκτήματα των γλωσσών υψηλού επιπέδου σε σχέση με τις γλώσσες

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

Κεφάλαιο 6 ο. Διαχείριση στοιχείων λογισμικού

Κεφάλαιο 6 ο. Διαχείριση στοιχείων λογισμικού Κεφάλαιο 6 ο Διαχείριση στοιχείων λογισμικού Διδακτικοί στόχοι Να περιγραφούν οι κύριοι τύποι λογισμικού Να εξεταστεί το λογισμικό συστήματος και τα λειτουργικά συστήματα Να αναλυθούν οι πιο σημαντικές

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

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

Επιµέλεια Θοδωρής Πιερράτος Εισαγωγή στον προγραµµατισµό Η έννοια του προγράµµατος Ο προγραµµατισµός ασχολείται µε τη δηµιουργία του προγράµµατος, δηλαδή του συνόλου εντολών που πρέπει να δοθούν στον υπολογιστή ώστε να υλοποιηθεί

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

Σημειώσεις του εργαστηριακού μαθήματος Πληροφορική ΙΙ. Εισαγωγή στην γλώσσα προγραμματισμού

Σημειώσεις του εργαστηριακού μαθήματος Πληροφορική ΙΙ. Εισαγωγή στην γλώσσα προγραμματισμού Σημειώσεις του εργαστηριακού μαθήματος Πληροφορική ΙΙ Εισαγωγή στην γλώσσα προγραμματισμού Ακαδημαϊκό έτος 2016-2017, Εαρινό εξάμηνο Οι σημειώσεις βασίζονται στα συγγράμματα: A byte of Python (ελληνική

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

ΕΡΓΑΣΤΗΡΙΟ 1 ΕΙΣΑΓΩΓΗ ΣΤΗ C. Τµήµα Πληροφορικής και Τηλεπικοινωνιών

ΕΡΓΑΣΤΗΡΙΟ 1 ΕΙΣΑΓΩΓΗ ΣΤΗ C. Τµήµα Πληροφορικής και Τηλεπικοινωνιών ΕΡΓΑΣΤΗΡΙΟ 1 ΕΙΣΑΓΩΓΗ ΣΤΗ C Τµήµα Πληροφορικής και Τηλεπικοινωνιών Περιεχόµενα Εισαγωγή Πρόγραµµα Φάσεις Υλοποίησης µε χρήση του εργαλείου DEV C + + οµή Προγράµµατος Η συνάρτηση main Μεταβλητές Τι είναι

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

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

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

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

Πληροφορική 2. Γλώσσες Προγραμματισμού

Πληροφορική 2. Γλώσσες Προγραμματισμού Πληροφορική 2 Γλώσσες Προγραμματισμού 1 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

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

Σημειώσεις του εργαστηριακού μαθήματος Πληροφορική ΙΙ. Εισαγωγή στην γλώσσα προγραμματισμού

Σημειώσεις του εργαστηριακού μαθήματος Πληροφορική ΙΙ. Εισαγωγή στην γλώσσα προγραμματισμού Σημειώσεις του εργαστηριακού μαθήματος Πληροφορική ΙΙ Εισαγωγή στην γλώσσα προγραμματισμού Ακαδημαϊκό έτος 2016-2017, Εαρινό εξάμηνο Οι σημειώσεις βασίζονται στα συγγράμματα: A byte of Python (ελληνική

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

ΚΕΦΑΛΑΙΟ 6 - ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

ΚΕΦΑΛΑΙΟ 6 - ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΚΕΦΑΛΑΙΟ 6 - ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Προγραµµατισµός Η/Υ Ο προγραµµατισµός είναι η διατύπωση του αλγορίθµου σε µορφή κατανοητή από τον Η/Υ ώστε να τον εκτελέσει («τρέξει» όπως λέµε στην ορολογία της

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

Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον κεφ.6 Εισαγωγή στον Προγραμματισμό

Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον κεφ.6 Εισαγωγή στον Προγραμματισμό Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον κεφ.6 Εισαγωγή στον Προγραμματισμό Μάριος Αραποστάθης Καθηγητής πληροφορικής Βαρβάκειου Λύκειου http://users.sch.gr/mariosarapostathis 6.1 Η έννοια του

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

ΕΠΛ 233: Αντικειμενοστρεφής Προγραμματισμός (Object-oriented programming)

ΕΠΛ 233: Αντικειμενοστρεφής Προγραμματισμός (Object-oriented programming) ΕΠΛ 233: Αντικειμενοστρεφής Προγραμματισμός (Object-oriented programming) Πληροφορίες Μαθήματος Διαλέξεις Δευτέρα, Πέμπτη 10:30-12:00 Κτήριο ΘΕΕ01, Αίθουσα 202 Εργαστήριο Τετάρτη 10:30-12:00, Κτήριο ΘΕΕ01,

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

Βασίλειος Κοντογιάννης ΠΕ19

Βασίλειος Κοντογιάννης ΠΕ19 Ενότητα2 Προγραμματιστικά Περιβάλλοντα Δημιουργία Εφαρμογών 6.1 Γλώσσες και εργαλεία προγραμματισμού Τι είναι οι γλώσσες προγραμματισμού; Είναι οι τεχνητές γλώσσες στις οποίες γράφονται οι εντολές των

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

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

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

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

ΤΕΙ ΙΟΝΙΩΝ ΝΗΣΩΝ ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ - ΕΙΣ

ΤΕΙ ΙΟΝΙΩΝ ΝΗΣΩΝ ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ - ΕΙΣ ΤΕΙ ΙΟΝΙΩΝ ΝΗΣΩΝ ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ - ΕΙΣ. ΚΑΤΕΥΘΥΝΣΗ ΔΙΟΙΚΗΣΗΣ ΤΟΥΡΙΣΤΙΚΩΝ ΕΠΙΧΕΙΡΗΣΕΩΝ ΚΑΙ ΕΠΙΧΕΙΡΗΣΕΩΝ ΦΙΛΟΞΕΝΙΑΣ Πληροφορική I "Προγραμματισμός" B. Φερεντίνος

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

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

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Εισαγωγή Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Βιβλιογραφία "C Προγραμματισμός", Deitel & Deitel, Πέμπτη Έκδοση, Εκδόσεις

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

ΚΕΦΑΛΑΙΟ 2. Τιμές, τύποι, μεταβλητές, λέξεις-κλειδιά, εντολές. 2.1 Εισαγωγή

ΚΕΦΑΛΑΙΟ 2. Τιμές, τύποι, μεταβλητές, λέξεις-κλειδιά, εντολές. 2.1 Εισαγωγή ΚΕΦΑΛΑΙΟ 2 Τιμές, τύποι, μεταβλητές, λέξεις-κλειδιά, εντολές Σύνοψη Το κεφάλαιο αυτό εισάγει τον αναγνώστη σε βασικές έννοιες που είναι χρήσιμες για την απόκτηση μιας πρώτης εμπειρίας με την Python. Προαπαιτούμενη

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

Ανάπτυξη Plugins για το AgentSheets

Ανάπτυξη Plugins για το AgentSheets Ανάπτυξη Plugins για το AgentSheets Thought Amplifier AgentSheets Ανάπτυξη Plugins AgentSheets 2.5 Συγγραφείς Τεκµηρίωσης: Alexander Repenning και Ronald Sudomo Εξελληνισµός Τεκµηρίωσης: Λίνος Βίγκλας,

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

Βρίγκας Μιχαήλ Α.Μ.744 Μπράχος Χ. Ευάγγελος Α.Μ.795

Βρίγκας Μιχαήλ Α.Μ.744 Μπράχος Χ. Ευάγγελος Α.Μ.795 Βρίγκας Μιχαήλ Α.Μ.744 Μπράχος Χ. Ευάγγελος Α.Μ.795 Περιεχόμενα Εισαγωγή Εγκατάσταση Δημιουργία νέου project Java Editor Perspectives Δημιουργία source folders Προσθήκη νέου αρχείου στο project Εισάγωντας

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

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 26/2/2008

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 26/2/2008 ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 26/2/2008 Τμήμα θεωρίας: Κάθε Τρίτη, 11πμ-2μμ, ΑΜΦ22. Διδάσκων: Ντίνος Φερεντίνος email: kpf3@cornell.edu Μάθημα: Θεωρία + προαιρετικό εργαστήριο (5-6 2ωρα εργαστήρια το εξάμηνο,

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

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

Γενικά (για τις γραπτές εξετάσεις) Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Διάλεξη #12 η : Επανάληψη Γαβαλάς Δαμιανός dgavalas@aegean.gr Γενικά (για τις γραπτές εξετάσεις) Δεν υπάρχει αυστηρά ορισμένη «ύλη εξετάσεων» (καθώς δεν έχετε

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

H ΓΛΩΣΣΑ C. Μάθηµα 1: Το Πρώτο µας Πρόγραµµα σε C. ηµήτρης Ψούνης

H ΓΛΩΣΣΑ C. Μάθηµα 1: Το Πρώτο µας Πρόγραµµα σε C. ηµήτρης Ψούνης H ΓΛΩΣΣΑ C Μάθηµα 1: Το Πρώτο µας Πρόγραµµα σε C ηµήτρης Ψούνης 2 Περιεχόµενα Μαθήµατος Α. Θεωρία 1. Κύκλος Ανάπτυξης Προγράµµατος 1. Συγγραφή και Μεταγλώττιση ενός προγράµµατος 2. Εκτέλεση του προγράµµατος

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

Δημιουργία μιας εφαρμογής Java με το NetBeans

Δημιουργία μιας εφαρμογής Java με το NetBeans Δημιουργία μιας εφαρμογής Java με το NetBeans Για να δημιουργήσετε μια εφαρμογή Java πρέπει να ακολουθήσετε τα εξής βήματα : Αρχικά πρέπει να δημιουργηθεί ένα project το οποίο θα περιέχει όλα τα αρχεία

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

Αρχές Προγραμματισμού Υπολογιστών

Αρχές Προγραμματισμού Υπολογιστών Αρχές Προγραμματισμού Υπολογιστών Ανάπτυξη Προγράμματος Β ΕΠΑΛ Τομέας Πληροφορικής Βελώνης Γεώργιος Καθηγητής Πληροφορικής ΠΕ20 Κύκλος ανάπτυξης προγράμματος/λογισμικού Η διαδικασία ανάπτυξης λογισμικού,

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

Προγραμματισμός Ι (HY120)

Προγραμματισμός Ι (HY120) Προγραμματισμός Ι (HY20) # μνήμη & μεταβλητές πρόγραμμα & εκτέλεση Ψηφιακά δεδομένα, μνήμη, μεταβλητές 2 Δυαδικός κόσμος Οι υπολογιστές είναι δυαδικές μηχανές Όλη η πληροφορία (δεδομένα και κώδικας) κωδικοποιείται

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

Δημιουργία προγραμμάτων Java

Δημιουργία προγραμμάτων Java 1ΚΕΦΑΛΑΙΟ Δημιουργία προγραμμάτων Java Σ αυτό το κεφάλαιο, θα μάθετε να κάνετε τα εξής: Ορισμός βασικής ορολογίας προγραμματισμού Σύγκριση διαδικαστικού και αντικειμενοστραφούς προγραμματισμού Περιγραφή

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

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

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

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

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

Mεταβλητές (variables) και Σταθερές (constants) Mεταβλητές (variables) και Σταθερές (constants) Οι μεταβλητές είναι οι θέσεις μνήμης στις οποίες ένα πρόγραμμα τοποθετεί τα δεδομένα του κατά τη διάρκεια της λειτουργίας του. θα μάθουμε: πως δηλώνουμε

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

Λειτουργικά Συστήματα Ι. Καθηγήτρια Παπαδάκη Αναστασία

Λειτουργικά Συστήματα Ι. Καθηγήτρια Παπαδάκη Αναστασία Λειτουργικά Συστήματα Ι Καθηγήτρια Παπαδάκη Αναστασία 2013 1 Ηλεκτρονικός Υπολογιστής αποτελείται: 1. Από Υλικό Hardware (CPUs, RAM, Δίσκοι), & 2. Λογισμικό - Software Και μπορεί να εκτελέσει διάφορες

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

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

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 4 : CLASSES Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 4 : CLASSES Κων. Κόκκινος Αντικειμενοστραφής Προγραμματισμός Η ιδέα του αντικειμενοστραφούς προγραμματισμού Αυτόνομες οντότητες Στιγμιότυπα οντοτήτων Παράδειγμα

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

Η γλώσσα προγραμματισμού C

Η γλώσσα προγραμματισμού C Η γλώσσα προγραμματισμού C Εισαγωγή στη C Λίγα λόγια για την C Γλώσσα προγραμματισμού υψηλού επιπέδου. Σχεδιάστηκε και υλοποιήθηκε από τον Dennis Richie στις αρχές της δεκαετίας του 1970 (Bell Labs). Η

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

ΘΕΜΑΤΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ

ΘΕΜΑΤΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ ΘΕΜΑΤΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ Θεματική Ενότητα 3 Βασικά εργαλεία ενός προγραμματιστή (editor, compiler, linker κτλ). Το διαδικτυακό περιβάλλον που θα χρησιμοποιηθεί Πληροφορική και Υπολογιστική Βιοϊατρική

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

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

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

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

<<ΔΗΜΗΤΡΗΣ ΜΑΝΩΛΗΣ ΦΥΣΙΚΟΣ ΜCs>> 1

<<ΔΗΜΗΤΡΗΣ ΜΑΝΩΛΗΣ ΦΥΣΙΚΟΣ ΜCs>> 1 ΚΕΦΑΛΑΙΟ 7 ο ΠΡΟΓΡΑΜΜΑ : Το πρόγραμμα αποτελείται από μια σειρά οδηγιών, που ονομάζονται εντολές, για την εκτέλεση τέτοιου είδους πράξεων, καθώς επίσης και από ένα σύνολο πρόσθετων οδηγιών ελέγχου, που

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Εισαγωγή στη Java Ιστορία Ο Patrick Naughton απειλεί την Sun ότι θα φύγει. Τον βάζουν σε μία ομάδα αποτελούμενη από τους James Gosling και Mike Sheridan για

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

1 η ΕΝΟΤΗΤΑ ΕΙΣΑΓΩΓΗ (Προγραμματισμός & MATLAB)

1 η ΕΝΟΤΗΤΑ ΕΙΣΑΓΩΓΗ (Προγραμματισμός & MATLAB) ΣΧΟΛΗ ΠΟΛΙΤΙΚΩΝ ΜΗΧΑΝΙΚΩΝ ΕΜΠ ΜΕΘΟΔΟΙ ΕΠΙΛΥΣΗΣ ΜΕ Η/Υ 1 η ΕΝΟΤΗΤΑ ΕΙΣΑΓΩΓΗ (Προγραμματισμός & MATLAB) Ν.Δ. Λαγαρός Μ. Φραγκιαδάκης Α. Στάμος Άδεια Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες

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

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

Εισαγωγή στον προγραμματισμό Ενότητες: Εισαγωγή στον προγραμματισμό Η έννοια του προγράμματος Ιστορική αναδρομή Φυσικές και τεχνητές γλώσσες Τεχνικές σχεδίασης προγραμμάτων Ιεραρχική Σχεδίαση Τμηματικός Προγραμματισμός Δομημένος προγραμματισμός

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

6. Εισαγωγή στον προγραµµατισµό

6. Εισαγωγή στον προγραµµατισµό 6. Εισαγωγή στον προγραµµατισµό 6.1 Η έννοια του προγράµµατος. 6.2 Ιστορική αναδροµή. 6.2.1 Γλώσσες µηχανής. ΗΜ04-Θ1Α 1. Ένα πρόγραµµα σε γλώσσα µηχανής είναι µια ακολουθία δυαδικών ψηφίων. 5. Ένα πρόγραµµα

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

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

HelloWorld. Παύλος Εφραιμίδης. Java Το πρόγραμμα HelloWorld 1 HelloWorld Παύλος Εφραιμίδης Java Το πρόγραμμα HelloWorld 1 Το πρόγραμμα HelloWorld.java Σχόλια στη Java /** * The HelloWorld class */ class HelloWorld { public static void main(string[] args) { System.out.println("Hello

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

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

Περιεχόμενα ΜΕΡΟΣ ΠΡΩΤΟ. Πρόλογος... 13 Περιεχόμενα Πρόλογος... 13 ΜΕΡΟΣ ΠΡΩΤΟ Κεφ. 1 Περί προγραμματισμού και γλωσσών προγραμματισμού Προγράμματα και Λειτουργικά Συστήματα... 17 Γλώσσες προγραμματισμού και εργαλεία ανάπτυξης προγραμμάτων...

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Εισαγωγή στη Java Ιστορία Ο Patrick Naughton απειλεί την Sun ότι θα φύγει. Τον βάζουν σε μία ομάδα αποτελούμενη από τους James Gosling και Mike Sheridan για

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

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

Οντοκεντρικός Προγραμματισμός Οντοκεντρικός Προγραμματισμός Ενότητα 5: H ΓΛΩΣΣΑ C++ Διαφορές Java και C++ ΔΙΔΑΣΚΟΝΤΕΣ: Ιωάννης Χατζηλυγερούδης, Χρήστος Μακρής Πολυτεχνική Σχολή Τμήμα Μηχανικών Η/Υ & Πληροφορικής ΔΙΑΦΟΡΕΣ JAVA C++ Η

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

Συμβολική γλώσσα Εκπαιδευτικού Υπολογιστή - Λογισμικό Υπολογιστών

Συμβολική γλώσσα Εκπαιδευτικού Υπολογιστή - Λογισμικό Υπολογιστών Συμβολική γλώσσα Εκπαιδευτικού Υπολογιστή - Λογισμικό Υπολογιστών Πρόγραμμα σε γλώσσα μηχανής του ΕΚΥ Θέση μνήμης Περιεχόμενα μνήμης Εντολή (assembly) 0 0001 000000000011 lda 3 1 0011 000000000100 ada

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

4. Συντακτικό μιας γλώσσας είναι το σύνολο των κανόνων που ορίζει τις μορφές με τις οποίες μια λέξη είναι αποδεκτή.

4. Συντακτικό μιας γλώσσας είναι το σύνολο των κανόνων που ορίζει τις μορφές με τις οποίες μια λέξη είναι αποδεκτή. ΑΕσΠΠ-Κεφ6. Εισαγωγή στον προγραμματισμό 1 ΣΩΣΤΟ ΛΑΘΟΣ 1. Οι γλώσσες προγραμματισμού αναπτυχθήκαν με σκοπό την επικοινωνία ανθρώπου μηχανής. 2. Αλγόριθμος = Πρόγραμμα + Δομές Δεδομένων 3. Ένα πρόγραμμα

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

Εισαγωγή στην Πληροφορική

Εισαγωγή στην Πληροφορική Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων Εισαγωγή στην Πληροφορική Ενότητα 8: Λειτουργικά Συστήματα Το περιεχόμενο του μαθήματος διατίθεται με άδεια Creative Commons εκτός και αν αναφέρεται διαφορετικά

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

Ε Ι Α Γ Ω Γ Η Σ Ο Ν Π Ρ Ο Γ Ρ Α Μ Μ Α Σ Ι Μ Ο Κ Ε Υ Α Λ Α Ι Ο 6. Σο πρόγραμμα γράφεται σε κάποια γλώσσα προγραμματισμού.

Ε Ι Α Γ Ω Γ Η Σ Ο Ν Π Ρ Ο Γ Ρ Α Μ Μ Α Σ Ι Μ Ο Κ Ε Υ Α Λ Α Ι Ο 6. Σο πρόγραμμα γράφεται σε κάποια γλώσσα προγραμματισμού. Κεφάλαιο 6 6.1 Η έννοια του προγράμματος Η επίλυση ενός προβλήματος με τον υπολογιστή περιλαμβάνει τρία σημαντικά στάδια : Σον ακριβή προσδιορισμό του προβλήματος Σην ανάπτυξη του αντίστοιχου αλγορίθμου

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

Εισαγωγή στο περιβάλλον Code::Blocks

Εισαγωγή στο περιβάλλον Code::Blocks Εισαγωγή στο περιβάλλον Code::Blocks Στο παρόν εγχειρίδιο παρουσιάζεται η διαδικασία ανάπτυξης, μεταγλώττισης και εκτέλεσης ενός προγράμματος C στο περιβάλλον του Code::Blocks. Η διαδικασία αυτή παρουσιάζεται

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

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

ΕΙΔΗ,ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙ- ΣΜΟΥ Κεφάλαιο 7 ΕΙΔΗ,ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙ- ΣΜΟΥ Ερωτήσεις 1. Να αναφέρετε διαφορές μεταξύ γλωσσών μηχανής και γλωσσών χαμηλού επιπέδου. Οι γλώσσες μηχανής κωδικοποιούν τις εντολές τους με ομάδες

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

Εισαγωγή στις Αρχές της Επιστήμης των ΗΥ

Εισαγωγή στις Αρχές της Επιστήμης των ΗΥ Εισαγωγή στις Αρχές της Επιστήμης των ΗΥ 2.3.1.1. Παπαγιάννη Νάσια Ηλεκτρολόγος Μηχανικός και Μηχανικός Υπολογιστών ΕΜΠ 1 περιλαμβάνει: Η έννοια του προγράμματος Επίλυση προβλήματος 1. Ακριβή προσδιορισμό

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

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

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ Κων. Κόκκινος Μεταβλητές-1 Οι μεταβλητές αποτελούν θέσεις μνήμης στις οποίες αποθηκεύονται τιμές αντίστοιχες

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

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

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

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

Ανάπτυξη Εφαρµογών σε Προγραµµατιστικό Περιβάλλον

Ανάπτυξη Εφαρµογών σε Προγραµµατιστικό Περιβάλλον Ανάπτυξη Εφαρµογών σε Προγραµµατιστικό Περιβάλλον Κεφάλαιο 6ο Εισαγωγή στον Προγραµµατισµό Μέρος Πρώτο (6.1, 6.2 και 6.3) Α. Ερωτήσεις Σωστού Λάθους 1. Η γλώσσα µηχανής είναι µία γλώσσα υψηλού επιπέδου.

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

JAVA TUTORIAL ΠΕΡΙΕΧΟΜΕΝΑ. ΚΕΦΑΛΑΙΟ 1. Τί κάνει τη Java να ξεχωρίζει; Εγκαθιστώντας τη Java

JAVA TUTORIAL ΠΕΡΙΕΧΟΜΕΝΑ. ΚΕΦΑΛΑΙΟ 1. Τί κάνει τη Java να ξεχωρίζει; Εγκαθιστώντας τη Java JAVA TUTORIAL Πανεπιστήμιο Μακεδονίας Τμήμα Εφαρμοσμένης Πληροφορικής Εργαστήριο Παράλληλης Κατανεμημένης Επεξεργασίας ΠΕΡΙΕΧΟΜΕΝΑ ΚΕΦΑΛΑΙΟ 1. Τί κάνει τη Java να ξεχωρίζει; Εγκαθιστώντας τη Java ΚΕΦΑΛΑΙΟ

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

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ (Οι ερωτήσεις µε κίτρινη υπογράµµιση είναι εκτός ύλης για φέτος) ΕΙΣΑΓΩΓΗ Q1. Οι Πρωταρχικοί τύποι (primitive types) στη Java 1. Είναι όλοι οι ακέραιοι και όλοι οι πραγµατικοί

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

Εισαγωγή ΕΙΣΑΓΩΓΗ. Γεώργιος Παπαϊωάννου ( )

Εισαγωγή ΕΙΣΑΓΩΓΗ. Γεώργιος Παπαϊωάννου ( ) ΕΙΣΑΓΩΓΗ Γεώργιος Παπαϊωάννου (2013-16) gepap@aueb.gr Περιγραφή: Εισαγωγή στη C++ Ιστορικά στοιχεία για τη C/C++ Ένα βασικό πρόγραμμα Μεταγλώττιση ενός προγράμματος Τελευταία ενημέρωση: Σεπτέμβριος 2016

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

Κεφάλαιο 1 Προγραμματισμός Υπολογιστή. Εφαρμογές Πληροφορικής Κεφ. 7 Καραμαούνας Πολύκαρπος 1

Κεφάλαιο 1 Προγραμματισμός Υπολογιστή. Εφαρμογές Πληροφορικής Κεφ. 7 Καραμαούνας Πολύκαρπος 1 Κεφάλαιο 1 Προγραμματισμός Υπολογιστή Καραμαούνας Πολύκαρπος 1 7.1 Η προγραμματιζόμενη μηχανή Από τις βασικότερες διαφορές ανάμεσα στον υπολογιστή και στις περισσότερες ηλεκτρονικές συσκευές είναι η δυνατότητα

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

Εισαγωγή στην επιστήμη των υπολογιστών

Εισαγωγή στην επιστήμη των υπολογιστών Εισαγωγή στην επιστήμη των υπολογιστών Λογισμικό Υπολογιστών Γλώσσες Προγραμματισμού 1 Εξέλιξη Οι γλώσσες προγραμματισμού είναι σύνολα από προκαθορισμένες λέξεις οι οποίες συνδυάζονται σε προγράμματα σύμφωνα

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

Εισαγωγή στην επιστήμη των υπολογιστών. Λογισμικό Υπολογιστών Κεφάλαιο 9ο Γλώσσες Προγραμματισμού

Εισαγωγή στην επιστήμη των υπολογιστών. Λογισμικό Υπολογιστών Κεφάλαιο 9ο Γλώσσες Προγραμματισμού Εισαγωγή στην επιστήμη των υπολογιστών Λογισμικό Υπολογιστών Κεφάλαιο 9ο Γλώσσες Προγραμματισμού 1 Εξέλιξη Οι γλώσσες προγραμματισμού είναι σύνολα από προκαθορισμένες λέξεις οι οποίες συνδυάζονται σε προγράμματα

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