«ΕΙΔΙΚΑ ΘΕΜΑΣΑ ΣΟΝ ΠΡΟΓΡΑΜΜΑΣΙΜΟ ΤΠΟΛΟΓΙΣΩΝ» ΚΕΦΑΛΑΙΟ 3: ΑΝΤΙΚΕΙΜΕΝΑ ΚΑΙ ΜΕΘΟΔΟΙ 1
2 3.1 Συμβολοςειρζσ
Ένασ πολύ χρόςιμοσ τύποσ εύναι η κλάςη String, του πακϋτου java.lang, η οπούα χρηςιμεύει ςτην αναπαρϊςταςη ς υ μ β ο λ ο ς ε ι ρ ώ ν (αλφαριθμητικϊ). 3
Οι ςυμβολοςειρϋσ εύναι μύα ςειρϊ (ακολουθύα) από ςύμβολα, που μπορεύ να εύναι γρϊμματα, αριθμού ό οποιοδόποτε ϊλλο ςύμβολο του κώδικα UNICODE. Η κλϊςη String επύςησ, περικλεύει και όλη τη βαςικό λειτουργικότητα των ςυμβολοςειρών. Μια ςταθερϊ τύπου ςυμβολοςειρϊ περικλεύεται ανϊμεςα ςε διπλϊ ειςαγωγικϊ. 4
Ζνα String εύναι ϋνα αντικεύμενο όπωσ όλα τα αντικεύμενα, πρϋπει να δηλωθεύ και να δημιουργηθεύ με την εντολό new String s1 = new String(); Εναλλακτικϊ μπορούμε να δημιουργόςουμε ϋνα String, αποδύδοντασ του ωσ τιμό μύα ςταθερϊ ςυμβολοςειρϊ, String s2= "George"; 5
Ο τελεςτήσ + όταν εφαρμόζεται ςε ςυμβολοςειρϋσ τισ ενώνει ςε μύα πρόταςη. Π.χ.: I like Java + + Programming I like Java Programming 6
Ο τελεςτήσ + Αν γρϊψουμε: System.out.println ("Το άθροιςμα είναι " + 15+ 25); Στην οθόνη εμφανύζεται το μόνυμα: Το ϊθροιςμα εύναι 1525. όταν του τελεςτό + προηγεύται κϊποιο string, μετατρϋπει ότι βρύςκει δεξιϊ του επύςησ ςε string, ανεξϊρτητα αν εύναι αριθμόσ 7 Έτςι ςτο παρϊδειγμα μασ εμφανύζονται απλϊ οι δύο αριθμού χωρύσ να υπολογύζεται το ϊθροιςμα τουσ.
Ο τελεςτήσ + Αν θϋλουμε να γύνει πρώτα η πρϊξη τησ πρόςθεςησ των δύο αριθμών και να εμφανιςτεύ ςτην οθόνη το ϊθροιςμϊ τουσ, πρϋπει η πρϊξη τησ πρόςθεςησ των δύο αριθμών να μπει ςε παρϋνθεςη ώςτε να προηγηθεύ τησ ςυνϋνωςησ με το string. System.out.println ("Το άθροιςμα είναι " + (15 + 25)); 8
Ο τελεςτήσ + System.out.println (15+25+ ευρώ ); αυτό που θα εμφανιςτεύ ςτην οθόνη θα εύναι: 40 ευρώ. 9
Μζθοδοι Η κλϊςη String εφοδιϊζει τα αντικεύμενα τησ με διϊφορεσ χρόςιμεσ μεθόδουσ: charat(index) η οπούα επιςτρϋφει τον χαρακτόρα ςτην θϋςη index length η οπούα επιςτρϋφει το μόκοσ τησ λϋξησ, equals(string) η οπούα ςυγκρύνει δύο ςυμβολοςειρϋσ αν ϋχουν το ύδιο περιεχόμενο. Να ςημειώςουμε ότι η αρύθμηςη των χαρακτόρων ςε ϋνα αντικεύμενο τύπου String ξεκινϊει από το 0 και όχι από το 1. 10
Μζθοδοι - Παραδείγματα String s1 = "Write Once, "; Δεςμεύει μνήμη για το αντικείμενο s1 και τησ αποδίδει περιεχόμενο το Write Once String s2 = "Run Anywhere."; Δεςμεύει μνήμη για το αντικείμενο s2 και τησ αποδίδει περιεχόμενο το Run Anywhere. 11 String s3 = s1 + s2; Δεςμεύει μνήμη για το αντικείμενο s3 και τησ αποδίδει περιεχόμενο το "Write Once, Run Anywhere."
Μζθοδοι - Παραδείγματα System.out.println( s3.charat(0)); Εμφανίζει το γράμμα W System.out.println( s3.length() ); Εμφανίζει τον αριθμό 25 που είναι το μήκοσ τησ ςυμβολοςειράσ s3 System.out.println("Σύγκριςη: " + s1.equals(s2) ); Εμφανύζει το κεύμενο: Σύγκριςη: false, αφού τα δύο string s1 και s2 δεν ϋχουν το ύδιο περιεχόμενο. 12
Σελεςτή ιςότητασ == Δε ςυγκρύνουμε δύο ςυμβολοςειρϋσ με τον τελεςτό ιςότητασ ==, ακόμη και αν ϋχουν το ύδιο περιεχόμενο θα παύρνουμε πϊντα ςαν αποτϋλεςμα false. Επειδό τα δύο string εύναι αντικεύμενα ο τελεςτόσ == δε θα ςυγκρύνει το περιεχόμενο τουσ, αλλϊ τη διεύθυνςη τουσ ςτη μνόμη. 13
14 3.2 Δημιουργία Αντικειμζνων
Ο τελεςτήσ new Frog kermit = new Frog(); Fly myga=new Fly(); δημιουργεί ένα αντικείμενο τησ κλάςησ, το οποίο και αποτελεί μοναδικό ςτιγμιότυπο τησ και επιςτρέφει επίςησ ένα δείκτη αναφοράσ (reference) ςε αυτό. δεςμεύει επίςησ την απαιτούμενη μνήμη για το αντικείμενο που δημιουργείται. 15 Οι μεταβλητέσ kermit και myga είναι οι δείκτεσ αναφοράσ αντίςτοιχα ςτα αντικείμενα που δημιουργήςαμε προηγουμένωσ. Χρηςιμοποιώντασ αυτό το δείκτη αναφοράσ μπορούμε να προςπελάςουμε το αντικείμενο.
3.3 Κλήςη μεθόδων των αντικειμζνων 16
Μζθοδοι ορίζουν τη ςυμπεριφορά των αντικειμένων δηλαδό τισ λειτουργύεσ που μπορεύ να εκτελϋςει ϋνα αντικεύμενο. Μια μέθοδοσ είναι ένα μπλοκ κώδικα που έχει ένα όνομα και μπορούμε να την καλέςουμε από οπουδήποτε μέςα από το πρόγραμμα μασ (εύναι το ιςοδύναμο των ςυναρτόςεων και των υποπρογραμμϊτων ςτον αντικειμενοςτρεφό προγραμματιςμό). 17
Η ςφνταξη μιασ μεθόδου περιλαμβάνει τα εξήσ ςτοιχεία: Τον προςδιοριςτή πρόςβαςησ. Μπορεί να είναι public, private ή protected Τον τύπο τησ πληροφορίασ που επιςτρέφουν. η μϋθοδοσ int getspeed() επιςτρϋφει ϋναν ακϋραιο αριθμό η μϋθοδοσ boolean isatedge() επιςτρϋφει true ό false Αν η μϋθοδοσ δεν επιςτρϋφει κϊποια τιμό τότε χρηςιμοποιούμε τη λϋξη void void print() 18
Η ςφνταξη μιασ μεθόδου περιλαμβάνει τα εξήσ ςτοιχεία: 19 Το όνομα τησ μεθόδου. Καλό είναι για όνομα να χρηςιμοποιούμε μια λέξη που να υποδηλώνει το τι κάνει η ςυγκεκριμένη μέθοδοσ. Τη λίςτα παραμέτρων. γράφονται μέςα ςτισ παρενθέςεισ, μετά το όνομα τησ μεθόδου. Οι μέθοδοι μπορεί να περιέχουν καμία ή και περιςςότερεσ από μια παραμέτρουσ. Οι παράμετροι ορίζονται με τον τύπο δεδομένων μπροςτά και το όνομα να ακολουθεί και χωρίζονται μεταξύ τουσ με κόμμα. Αν δεν έχουμε παραμέτρουσ χρηςιμοποιούμε απλά 2 κενέσ παρενθέςεισ. Το ςώμα τησ μεθόδου ςε αγκύλεσ με τον κώδικα και τισ τοπικέσ μεταβλητέσ.
Η ςφνταξη μιασ μεθόδου περιλαμβάνει τα εξήσ ςτοιχεία: 20
Μζθοδοσ main ειδικό μϋθοδοσ τησ Java εύναι επιφορτιςμϋνη με το να ξεκινϊει την εκτϋλεςη του προγρϊμματοσ. για να γύνει ϋνα πρόγραμμα εκτελϋςιμο, πρϋπει οπωςδήποτε ςε κϊποιο από τα αρχεύα πηγαύου κώδικα, από τα οπούα αποτελεύται, να υπϊρχει τουλϊχιςτον μύα μϋθοδοσ main. Η ςύνταξη τησ μεθόδου εύναι: p u b l i c s t a t i c v o i d m a i n ( S t r i n g [ ] a r g s ) { } 21 Όταν ο διερμηνϋασ τησ Java εκτελεύ ϋνα πρόγραμμα ξεκινϊ από την κλόςη τησ μεθόδου main. Η main κατόπιν καλεύ όλεσ τισ υπόλοιπεσ μεθόδουσ για να εκτελεςτεύ το πρόγραμμα.
22 3.4 Κλήςη Στατικών Μεθόδων
τη Java υπάρχουν δφο τφποι μεθόδων: αυτέσ που ανήκουν ςτο αντικείμενο, ονομάζονται μέθοδοι ςτιγμιοτύπου και καθορίζουν τη ςυμπεριφορά του αντικειμένου αυτέσ που ανήκουν ςτην κλάςη, ονομάζονται μέθοδοι κλάςησ και δεν αναφέρονται ςε ςυγκεκριμένο αντικείμενο. 23
Οι μζθοδοι του αντικειμζνου (μζθοδοι ςτιγμιότυπου) μπορούν να κληθούν μόνο μϋςω κϊποιου αντικειμϋνου. Η κλόςη μιασ μεθόδου ςτιγμιοτύπου ςυντϊςςεται με το όνομα του αντικειμϋνου ακολουθούμενο από την τελεύα και το όνομα τησ μεθόδου, δηλαδό: Όνομα αντικειμένου. Όνομα μεθόδου (παράμετροι); 24
Mζθοδοσ κλάςησ Πολλϋσ φορϋσ, θϋλουμε να ςχεδιϊςουμε ϋνα ςύνολο μεθόδων οι οπούεσ δεν εύναι ςυνδεδεμϋνεσ με κϊποιο αντικεύμενο τησ κλϊςησ, αλλϊ υλοποιούν λειτουργύεσ χρόςιμεσ για την ύδια την κλϊςη. Σε αυτό την περύπτωςη ορύζουμε μια μϋθοδο ωσ μϋθοδο κλϊςησ (class method), χρηςιμοποιώντασ ςτην αρχό τησ δόλωςησ τησ, τη λϋξη κλειδύ static. Οι μϋθοδοι κλϊςησ εύναι γνωςτϋσ και ωσ ςτατικέσ μέθοδοι. 25 Μπορούμε λοιπόν, να καλϋςουμε και να χρηςιμοποιόςουμε ςτατικϋσ μεθόδουσ μιασ κλϊςησ, χωρύσ να χρειϊζεται να δημιουργηθεύ πρώτα κϊποιο αντικεύμενο αυτόσ τησ κλϊςησ.
Mζθοδοσ κλάςησ-παράδειγμα Έςτω ότι ορύζουμε τη ςτατικό μϋθοδο: static int numberoffrogs( ) Η κλόςη τησ μεθόδου μπορεύ να γύνει, εύτε από την κλϊςη, εύτε από κϊποιο αντικεύμενό τησ κλϊςησ, όπωσ φαύνεται παρακϊτω: frogs = Frog.numberOfFrogs() ό frogs = kermit.numberoffrogs() 26 όπου το kermit εύναι ϋνα αντικεύμενο τησ κλϊςησ Frog.
Μζθοδοσ κλάςησ-παράδειγμα Όλεσ οι μϋθοδοι τησ κλϊςησ Math, η οπούα βρύςκεται ςτο πακϋτο java.lang, εύναι ςτατικϋσ. Η κλόςη τουσ γύνεται ωσ εξόσ: int x = Math.max (a, b) ; int y=math.abs(a); int z=math.min(a,b); 27
3.5 Δημιουργία των δικών μασ μεθόδων 28
Κατϊ τη διϊρκεια ανϊπτυξησ μιασ εφαρμογόσ, οριςμϋνα τμόματα κώδικα (μϋθοδοι) χρειϊζεται να επαναλαμβϊνονται πολλϋσ φορϋσ. Έχουμε τη δυνατότητα να δώςουμε ϋνα όνομα ςε αυτϊ τα τμόματα κώδικα και να τα καλούμε με αυτό, όποτε τα χρειαζόμαςτε. Πρόκειται δηλαδό για μεθόδουσ που τισ δημιουργούμε εμεύσ για να κϊνουν μια ςυγκεκριμϋνη δουλειϊ και αποτελούν μϋρη μιασ κλϊςησ. 29
30 Παράδειγμα
Στη Java τα ονόματα των μεθόδων ξεκινούν με μικρϊ γρϊμματα και δεν περιϋχουν κενϊ. Αν το όνομα περιϋχει πολλϋσ λϋξεισ τότε χρηςιμοποιούμε κεφαλαύο γρϊμμα κϊθε φορϊ που αρχύζει μια νϋα λϋξη π.χ. turnatedge. 31
3.6 Αναφορζσ και Πζραςμα Παραμζτρων 32
Παραμέτρουσ: Τισ μεταβλητϋσ, που χρηςιμοποιούνται ςτον οριςμό τησ μεθόδου. Ορίςματα: τισ τιμϋσ που παύρνουν οι παρϊμετροι κατϊ την κλόςη τησ μεθόδου. 33 η μεταβλητό degrees εύναι η παρϊμετροσ το i εύναι το όριςμα τησ μεθόδου turnatedge.
Η μεταβύβαςη παραμϋτρων ςτη Java εύναι κατά τιμή (pass-by-value) δηλαδό δημιουργούνται αντίγραφα των οριςμάτων, οπότε οποιαδόποτε αλλαγό ςτισ παραμϋτρουσ εντόσ τησ μεθόδου δεν ϋχει καμύα επύδραςη ςτα ορύςματαμεταβλητϋσ που ϋχουν οριςτεύ εκτόσ τησ μεθόδου. 34
35 Στην περύπτωςη όμωσ που η παρϊμετροσ μασ δεν αναφϋρεται ςε βαςικό τύπο δεδομϋνων (int, float, double, κλπ) αλλϊ ςε αντικεύμενο κϊποιασ κλϊςησ, δεν δημιουργεύται αντύγραφο του αντικειμϋνου. όταν αναφερόμαςτε ςε ϋνα αντικεύμενο ςύνθετου τύπου η μεταβλητό δεν περιϋχει το ύδιο το αντικεύμενο αλλϊ μια διεύθυνςη ςτην περιοχό τησ μνόμησ όπου εύναι αποθηκευμϋνο το αντικεύμενο. Η διεύθυνςη αυτό λϋγεται αναφορά (reference) και αποτελεύ ουςιαςτικϊ ϋναν δεύκτη ςτην περιοχό τησ μνόμησ που βρύςκεται το αντικεύμενο. Κατϊ το πϋραςμα παραμϋτρων δημιουργεύται αντύγραφο τησ αναφορϊσ και όχι του ύδιου του αντικειμϋνου, οπότε μϋςω τησ αναφορϊσ μπορούμε να τροποποιόςουμε το αντικεύμενο.
36 3.7 Τφποι Επιςτροφήσ
Οι ςυναρτόςεισ ςε πολλϋσ γλώςςεσ προγραμματιςμού, όπωσ ςτην Pascal και την Python επιςτρϋφουν ϋνα αποτϋλεςμα με το όνομϊ τουσ. Το ύδιο ςυμβαύνει και με τισ μεθόδουσ τησ java. Ωςτόςο, υπϊρχουν μϋθοδοι οι οπούοι δεν επιςτρϋφουν κϊποια τιμό, αλλϊ υλοποιούν κϊποια ενϋργεια όπωσ για παρϊδειγμα την μετακύνηςη ενόσ αντικειμϋνου. Αυτϋσ οι μϋθοδοι που δεν επιςτρϋφουν τύποτα δηλώνονται με τον τύπο επιςτροφόσ void, 37
38 3.8. Μζθοδοι και Κληρονομικότητα
Δήλωςη κλάςησ public class «όνομα κλάςησ» extends «όνομα υπερκλάςησ» { Πεδία Καταςκευαςτέσ Μέθοδοι } Τισ λϋξεισ public class θα τισ γρϊφουμε πϊντα ςε κϊθε κλϊςη που δημιουργούμε. Η λϋξη public ονομϊζεται προςδιοριςτήσ πρόςβαςησ. Ακολουθεύ το όνομα τησ κλϊςησ που το ορύζουμε εμεύσ. Κατόπιν μπαύνει η λϋξη extends και το όνομα τησ υπερκλϊςησ, που μασ πληροφορεύ ότι η κλϊςη που δημιουργούμε εύναι υποκλϊςη τησ υπερκλϊςησ που δηλώνουμε μετϊ τη λϋξη extends. Τϋλοσ ακολουθεύ το ζευγϊρι των αγκύλων { και } που ορύζουν το ςώμα τησ κλϊςησ και εκεύ μϋςα δηλώνονται οι μϋθοδοι. 39
40 3.9 Καθοδήγηςη από γεγονότα
Όλεσ οι ςύγχρονεσ εφαρμογϋσ απαιτούν την εύςοδο κϊποιων δεδομϋνων από τον χρόςτη ό τον ϋλεγχο από τον χρόςτη κατϊ την εκτϋλεςη τουσ. Αυτό γύνεται κυρύωσ μϋςω του πληκτρολογύου και του ποντικιού. Ειδικϊ, τα παιχνύδια που ο βαθμόσ αλληλεπύδραςησ με τον χρόςτη εύναι πολύ υψηλόσ, ο χειριςμόσ των μϋςων ειςόδου εύναι κομβικόσ ςημαςύασ. Αυτό γύνεται μϋςα από τον χειριςμό γεγονότων που προκαλούνται όπωσ το πϊτημα ενόσ πλόκτρου ό η κύνηςη του ποντικιού πϊνω από ϋνα αντικεύμενο. 41
Μζθοδοι για τον χειριςμό των γεγονότων public static String getkey() Επιςτρϋφει το όνομα του πλόκτρου που πατόθηκε τελευταύα. Αν δεν ϋχει πατηθεύ κϊποιο πλόκτρο, από την τελευταύα φορϊ που κλόθηκε, η getkey επιςτρϋφει null. public static boolean iskeydown(string keyname) Ελϋγχει αν ϋχει πατηθεύ το πλόκτρο με όνομα keyname και επιςτρϋφει αντύςτοιχα true ό false. 42
Μζθοδοι για τον χειριςμό των γεγονότων (Βιβλιοθήκη του Greenfoot) public static boolean mouseclicked(object obj) Ελϋγχει αν ϋχει γύνει κλικ με το ποντύκι ςτο αντικεύμενο obj και επιςτρϋφει αντύςτοιχα true ό false. Αν αντύ για obj δώςουμε την τιμό null τότε επιςτρϋφεται true, αν ϋχει γύνει κλικ οπουδόποτε. public static MouseInfo getmouseinfo() Επιςτρϋφει ϋνα αντικεύμενο MouseInfo το οποίο περιέχει πληροφορίεσ για την κατάςταςη του ποντικιού. Με την κλήςη των μεθόδων getx(), gety() ξέρουμε τισ ςυντεταγμένεσ του ςημείου όπου έγινε το κλικ ενώ, η getactor() μασ επιςτρέφει το αντικείμενο πάνω ςτο οποίο έγινε το κλικ. 43
44 3.10 Πίνακεσ
Ένασ πύνακασ εύναι ϋνα αντικεύμενο, που ϋχει την ικανότητα και την ιδιότητα να μπορεύ να δϋχεται και να αποθηκεύει, ς ε ς υ ν ε χό μ ε ν ε σ θ έ ς ε ι σ ςτη μνόμη, ϋναν προκαθοριςμϋνο αριθμό ςτοιχεύων, με την προώπόθεςη ότι όλα ανόκουν ςτον ύδιο τύπο δεδομϋνων. Δηλαδό τα ςτοιχεύα που θα αποθηκευτούν θα εύναι όλα ακϋραιοι αριθμού, ό όλα δεκαδικού, ό όλα χαρακτόρεσ, ό όλα αναφορϊ ςε κϊποια αντικεύμενα τησ ύδιασ κλϊςησ κτλ. 45
Το μϋγεθοσ του πύνακα καθορύζεται την ύδια χρονικό ςτιγμό τησ δημιουργύασ του και δεν επιτρέπεται καμία αλλαγή ςτο μϋγεθοσ του μετϊ τον αρχικό οριςμό του. Το όνομα ενόσ πύνακα πϊντα ςυνοδεύεται από τα ςύμβολα [ και ] για να ξεχωρύζει από τον οριςμό οποιαςδόποτε ϊλλησ μεταβλητόσ. 46
Ορύζεται: int a[ ] = { 0, 10, 20, 30, 40, 50, 60, 70, 80, 90 }; ό int a[ ] = new int[10]; for ( int i = 0; i < 10; i++) { a[ i ] = 10 * i; } 47
Για να θϋςουμε μια νϋα τιμό ςτο ςτοιχεύο ςτη θϋςη 2 του πύνακα, δηλαδό ςτο 3ο ςτοιχεύο του πύνακα την τιμό 23 δύνουμε την εντολό: a[ 2 ] = 23; Αν πϊλι θϋλουμε να αυξόςουμε την τιμό του ςτοιχεύου a[2] κατϊ 1 δύνουμε την εντολό a[ 2 ]++; a[ 2 ] a[ 2 ] + 1 48 Μπορούμε να διαχειριζόμαςτε κάθε ςτοιχείο ενόσ πίνακα όπωσ και μια μεταβλητή.
Προςοχή!!! 49 Όπωσ φαύνεται και από το ςχόμα, η πρώτη θϋςη ενόσ πύνακα εύναι η θϋςη 0. Αυτό ςημαύνει ότι όταν ορύζουμε ϋναν πύνακα 10 ςτοιχεύων, αυτϊ βρύςκονται ςτισ θϋςεισ από 0 ϋωσ 9. Άρα το 4ο ςτοιχεύο βρύςκεται ςτη θϋςη 3 του πύνακα και το 10ο ςτη θϋςη 9. Γενικά το n-οςτό ςτοιχείο βρίςκεται ςτη θέςη n-1 του πίνακα, δηλαδή είναι το a[n-1].
50 Στη Java μπορούμε να ορύςουμε πολυδιϊςτατουσ πύνακεσ int matrix[ ][ ] = new int[10][10];
51 Μια ςημαντικό διαφορϊ των πινϊκων ςτη java ςε ςχϋςη με ϊλλεσ γλώςςεσ προγραμματιςμού, εύναι ότι ςτη Java κϊθε πύνακασ ϋχει ϋνα πεδύο με όνομα length το οπούο περιϋχει το μϋγεθοσ του πύνακα.
ϊθροιςμα όλων των ςτοιχεύων του πύνακα int S = 0; for ( int i = 0; i < a.length; i++) { } S = S + a[ i ]; 52