«ΕΙΔΙΚΑ ΘΕΜΑΣΑ ΣΟΝ ΠΡΟΓΡΑΜΜΑΣΙΜΟ ΤΠΟΛΟΓΙΣΩΝ» Κεφάλαιο 4: Αντικειμενοςτρεφήσ Προγραμματιςμόσ 1
4.1. Οριςμόσ φνθετων τφπων κλάςεων 2
Με εξαίρεςη τουσ βαςικούσ τύπουσ τησ Java (int, float, boolean, κλπ) τα πάντα είναι αντικείμενα κάποιασ κλάςησ. Η κλάςη είναι ουςιαςτικά ένασ ςύνθετοσ τύποσ δεδομένων εφοδιαςμένοσ με τισ λειτουργίεσ χειριςμού των δεδομένων. 3
Εκτόσ από τισ κλάςεισ που έρχονται με τη γλώςςα μπορούμε και εμείσ να ορίςουμε τισ δικέσ μασ κλάςεισ και να δημιουργήςουμε τα δικά μασ αντικείμενα Οι κλάςεισ μπορούν να θεωρηθούν ςαν καλούπια τα οποία δίνουν ζωή ςε όμοια αντικείμενα τα οποία είναι το ένα αντίγραφο του άλλου. Τα αντικείμενα αυτά τα λέμε πολλέσ φορέσ και ςτιγμιότυπα τησ κλάςησ η κλάςη είναι απλά μια αφαιρετική αναπαράςταςη των αντικειμένων 4 τα αντικείμενα είναι αυτά που έχουν υπόςταςη και υλοποιούν την αναπαράςταςη αυτή.
ΠΑΡΑΔΕΙΓΜΑ: Δίνουμε τον οριςμό ενόσ ςφνθετου τφπου δεδομζνων / κλάςησ Person για την αποθήκευςη των ςτοιχείων όλου το ζμψυχου δυναμικοφ ενόσ ςχολείου (μαθητζσ, καθηγητζσ, διοικητικό προςωπικό). Όλοι έχουν ςτη βάςη δεδομένων του ςχολείου: όνομα, επώνυμο και έναν μοναδικό αριθμό μητρώου (id). public class Person { public String firstname; public String lastname; public int id; } Κάθε κλάςη πρέπει να ορίζεται ςε ξεχωριςτό αρχείο με το ίδιο όνομα και κατάληξη.java, π.χ. Person.java. 5
6 4.2. Καταςκευαςτζσ και καταςτροφείσ
Κάθε κλάςη πρέπει να έχει: τουλάχιςτον μία μέθοδο η οποία εκτελείται όταν δημιουργείται ένα αντικείμενο τησ (ςτιγμιότυπό τησ). Αυτέσ οι μέθοδοι λέγονται καταςκευαςτέσ τησ κλάςησ. 7
Ο καταςκευαςτήσ έχει την ευθύνη δυο λειτουργιών: 1) να δεςμεύςει την απαραίτητη μνήμη για το αντικείμενο που δημιουργείται 2) να αρχικοποιήςει όλεσ τισ μεταβλητέσ ή τα αντικείμενα που είναι ενςωματωμένα. 8
Η δήλωςη του καταςκευαςτή μοιάζει αρκετά με τη δήλωςη τησ μεθόδου, αλλά έχει κάποιεσ διαφορέσ: Δεν έχει ποτέ τύπο επιςτροφήσ (π.χ. int, boolean, κ.α) ούτε όμωσ ςυντάςςεται με τη λέξη κλειδί void μετά τη λέξη public. Το όνομα του είναι πάντα το ίδιο με το όνομα τησ κλάςησ Ο καταςκευαςτήσ που δεν παίρνει κανένα όριςμα λέγεται προκαθοριςμένοσ καταςκευαςτήσ τησ κλάςησ και δημιουργείται αυτόματα αν εμείσ δεν ορίςουμε κανέναν καταςκευαςτή. 9
ΠΑΡΑΔΕΙΓΜΑ: Διάφορα είδη κατασκευαστών για την κλάση Person: public Person() { firstname = Γιάννησ ; lastname = Αγιάννησ ; id = 0; } Τα δεδομένα firstname, lastname, id λέγονται πεδία τησ κλάςησ Person. Κάθε αντικείμενο τησ κλάςησ Person εμπεριέχει τα τρία αυτά πεδία. 10
Person alan, alonzo; Η παραπάνω εντολή: δεν δημιουργεί κανένα αντικείμενο Δημιουργεί μόνο δυο θέςεισ ςτη μνήμη ςτην οποία θα καταχωρηθούν οι διευθύνςεισ ςτη μνήμη των αντικειμένων alan και alonzo όταν αυτά δημιουργηθούν. Στην Java αυτά ονομάζονται αναφορέσ ςτα αντικείμενα. 11
Για να δημιουργήςουμε τα αντικείμενα πρέπει να καλέςουμε τον καταςκευαςτή τησ κλάςησ χρηςιμοποιώντασ τη λέξη new. Η δήλωςη αρχίζει με τη λέξη new που ακολουθείται από τον καταςκευαςτή του αντικειμένου. alan = new Person(); alonzo = new Person(); 12
Αν θέλουμε να αλλάξουμε τα δεδομένα χρηςιμοποιούμε τον τελεςτή τελεία. για πρόςβαςη ςτα δεδομένα: alan.firstname = Alan ; alan.lastname = Turing ; alan.id = 1; 13
Μποροφμε να ορίςουμε ζναν άλλο καταςκευαςτή ο οποίοσ να δζχεται ςαν ορίςματα τισ τιμζσ των πεδίων: public Person(String firstname, String lastname, int id) { } this.firstname = firstname; this.lastname = lastname; this.id = id; Η δεςμευμένη λέξη this είναι μια αναφορά ςτο αντικείμενο που δημιουργείται. Για να δημιουργήςουμε τώρα το ίδιο ακριβώσ αντικείμενο με προηγουμένωσ δίνουμε την παρακάτω εντολή: Person alan = new Person( Alan, Turing, 1); 14
Σε οριςμένεσ γλώςςεσ προγραμματιςμού όπωσ η C++ και η Object PASCAL υπάρχουν οι καταςτροφείσ οι οποίοι: απελευθερώνουν μνήμη αν έχει δεςμευτεί, κλείνουν αρχεία που έχουν ανοίξει και γενικότερα αποδεςμεύουν ομαλά τουσ υπολογιςτικούσ πόρουσ που χρηςιμοποιεί το αντικείμενο αφού δεν χρειάζονται πλέον. 15
Στην Java δεν υπάρχουν καταςτροφείσ η ευθύνη τησ αποδέςμευςησ δεν βαρύνει τον προγραμματιςτή αλλά τη γλώςςα Το έργο αυτό το έχει αναλάβει ο ςυλλέκτησ απορριμμάτων ο οποίοσ: ελέγχει τη μνήμη για αντικείμενα που δεν χρηςιμοποιούνται πλέον και πρέπει να καταςτραφούν. είναι μέροσ τησ εικονικήσ μηχανήσ (Virtual Machine) τησ Java η οποία μόλισ διαπιςτώςει ότι ο ςωρόσ (heap) τησ μνήμησ κοντεύει να γεμίςει ενεργοποιεί το ςυλλέκτη απορριμμάτων. 16
Ωςτόςο υπάρχουν περιπτώςεισ που θα θέλαμε πριν αποδεςμευτεί ένα αντικείμενο να κάνουμε κάποιεσ ςημαντικέσ ενέργειεσ, όπωσ να κλείςουμε ομαλά κάποια αρχεία. Για αυτόν τον ςκοπό υπάρχει ςτην Java η μέθοδοσ finalize() η οποία υπάρχει ςε κάθε κλάςη και την οποία μπορούμε να υλοποιήςουμε μόνο αν το θεωρούμε απολύτωσ απαραίτητο. Η finalize καλείται από τον ςυλλέκτη απορριμμάτων λίγο πριν την καταςτροφή του αντικειμένου. 17