Κλάσεις και Αντικείµενα Γρηγόρης Τσουµάκας Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης
Κλάσεις και Αντικείµενα 2 Τα αντικείµενα σε µια αντικειµενοστρεφή γλώσσα προγραµµατισµού, µοντελοποιούν αντικείµενα από το πεδίο ορισµού του προβλήµατος Τα αντικείµενα δηµιουργούνται από κλάσεις, οι οποίες περιγράφουν το είδος των αντικειµένων Τα αντικείµενα καλούνται και στιγµιότυπα µιας κλάσης Οι κλάσεις ορίζουν νέους τύπους δεδοµένων, ενώ τα αντικείµενα είναι µεταβλητές αυτών των τύπων Ένα µεγάλο πρόγραµµα, αποτελείται από πολλά αντικείµενα πολλών κλάσεων, τα οποία αλληλεπιδρούν
Ορισµός Κλάσης στη Java 3 Πεδία Αποθηκεύουν δεδοµένα που θα χρησιµοποιηθούν από τα αντικείµενα Κατασκευαστές Χρησιµεύουν στη σωστή διαµόρφωση ενός αντικειµένου όταν αυτό δηµιουργείται για πρώτη φορά Μέθοδοι public class ΌνοµαΚλάσης { Πεδία (Fields) Κατασκευαστές (Constructors) Μέθοδοι (Methods) } Υλοποιούν τη συµπεριφορά των αντικειµένων
Πεδία 4 Χώροι µνήµης για την αποθήκευση των δεδοµένων κάθε αντικειµένου Καλούνται και µεταβλητές στιγµιοτύπου Το σύνολο των τιµών όλων των πεδίων ενός αντικειµένου καλείται και κατάσταση του αντικειµένου Μπροστά από τον τύπο δεδοµένων τους βάζουµε πάντα τη λέξη κλειδί private (περισσότερα στη συνέχεια) Θυµηθείτε την αρχή της ενθυλάκωσης
Κατασκευαστές και Μέθοδοι 5 Αποτελούνται από την επικεφαλίδα και το σώµα Στην επικεφαλίδα περιλαµβάνονται προαιρετικά παράµετροι, µέσω των οποίων οι κατασκευαστές και οι µέθοδοι λαµβάνουν τιµές Η µεταβλητή στην οποία αποθηκεύεται η τιµή που λαµβάνεται καλείται τυπική παράµετρος ενώ η ίδια τιµή καλείται πραγµατική παράµετρος Το όνοµα των µεθόδων ή κατασκευαστών µαζί µε τις παραµέτρους (αριθµός, τύποι, σειρά) συνιστούν την υπογραφή τους Το σώµα αποτελείται από ένα ζεύγος αγκίστρων { και } µε δηλώσεις και εντολές, το οποίο καλείται γενικότερα µπλοκ
Τοπικές Μεταβλητές 6 Μπορούν να δηλώνονται σε οποιοδήποτε σηµείο µιας µεθόδου ή ενός κατασκευαστή Χρήσιµες για προσωρινή αποθήκευση δεδοµένων ηλώνονται όπως και τα πεδία, χωρίς όµως τη λέξη κλειδί private από µπροστά int counter; boolean israining; Υποχρεωτική η ανάθεση τιµής πριν τη χρήση τους int x, y; // compiler error x = y + 1;
Υπερφόρτωση Ονόµατος 7 Υπερφόρτωση ονόµατος Μια τοπική µεταβλητή καθώς και µια τυπική παράµετρος επιτρέπεται να έχουν το ίδιο όνοµα µε ένα πεδίο Ο κανόνας του πλησιέστερου ορισµού Όταν χρησιµοποιούµε το όνοµα αυτό µέσα σε µια µέθοδο, τότε αναφερόµαστε στην τοπική µεταβλητή ή στην τυπική παράµετρο, και όχι στο πεδίο Αυτό συµβαίνει επειδή ο ορισµός τους είναι πιο κοντά στο σηµείο που χρησιµοποιείται το όνοµα Για τις τοπικές µεταβλητές λέµε ότι "κρύβουν" το πεδίο Πρόσβαση αποκτάµε µε τη λέξη κλειδί this this.name = name;
Κατασκευαστές 8 Η διαδικασία της σωστής αρχικής διαµόρφωσης των αντικείµενων καλείται και αρχικοποίηση Οι κατασκευαστές πρέπει να έχουν το ίδιο όνοµα µε την κλάση στην οποία ορίζονται Εκτελούνται κατά τη δηµιουργία ενός αντικειµένου Θέτουν αρχικές τιµές στα πεδία: σταθερές ή τιµές που µεταβιβάζονται στο αντικείµενο µέσω παραµέτρων από κάποιο σηµείο κώδικα που βρίσκεται έξω από το αντικείµενο Όλα τα πεδία αρχικοποιούνται αυτόµατα σε προκαθορισµένες τιµές, καλύτερα όµως αυτό να γίνεται ρητά σε κατασκευαστές
Μέθοδοι (1/2) 9 Κλήση µεθόδων Οι µέθοδοι µπορούν να κληθούν από άλλες µεθόδους (ή και από τον εαυτό τους) του ίδιου (εσωτερική κλήση) ή άλλου (εξωτερική κλήση) αντικειµένου Επιστροφή τιµής Μια µέθοδος προαιρετικά µπορεί να επιστρέψει µια τιµή µε την εντολή return Η εντολή return µπορεί να χρησιµοποιηθεί και χωρίς επιστρεφόµενη τιµή σε µεθόδους που δεν επιστρέφουν τιµή (void), οπότε και τερµατίζεται η εκτέλεση της µεθόδου
Μέθοδοι (2/2) 10 Μέθοδοι προσπέλασης (accessors) Επιστρέφουν πληροφορίες για την κατάσταση ενός αντικειµένου Κάνουν χρήση της εντολής return Μέθοδοι µετάλλαξης (mutators) Αλλάζουν την κατάσταση ενός αντικειµένου Συνήθως είναι τύπου void
Παραδείγµατα Μεθόδων 11 public static void main(string[] args) { } System.out.println("Καληµέρα!"); static double multiply(double x, double y) { } return x*y; public void printmessage() { } System.out.println("Καληµέρα!");
Υπερφόρτωση Μεθόδων/Κατασκ. 12 Τι είναι; Η ύπαρξη παραπάνω της µίας µεθόδων ή κατασκευαστών µε το ίδιο όνοµα (εξυπακούεται στους κατασκευαστές) αλλά διαφορετική υπογραφή Εξυπηρετεί την αρχή του πολυµορφισµού Παραδείγµατα System.out.println(3); System.out.println("Καληµέρα!"); public int add(int x, int y) { return x+y; } public double add(double x, double y) { return x+y; }
Πρόγραµµα Java 13 Τι είναι ένα πρόγραµµα Java Ένα σύνολο πολλών αντικειµένων της ίδιας και διαφορετικής κλάσης που αλληλεπιδρούν µεταξύ τους Θα πρέπει να υπάρχει µια εκτελέσιµη κλάση ηλαδή µια κλάση που να περιέχει µια µέθοδο µε την παρακάτω επικεφαλίδα public static void main(string[] args) Από αυτήν τη µέθοδο ξεκινάει η εκτέλεση του προγράµµατος Συνήθως εκεί δηµιουργείται το πρώτο αντικείµενο, από το οποίο ξεκινάει η δηµιουργία άλλων και η αλληλεπίδραση µαζί τους, τα οποία µε τη σειρά τους δηµιουργούν και αλληλεπιδρούν µε άλλα, κ.ο.κ.
Αντικείµενα 14 ηµιουργία αντικειµένων Επιτυγχάνεται µέσω του τελεστή new ηµιουργεί ένα νέο αντικείµενο µιας κλάσης Εκτελεί τον κατασκευαστή της κλάσης Π.χ. Student student = new Student("greg", 123); Εξωτερική κλήση µεθόδων Με χρήση του τελεστή. Π.χ. student.getaem();
Είδη Μεταβλητών 15 Μεταβλητές αντικειµένων Αποθήκευση της κατάστασης του αντικειµένου ιαφορετική τιµή για κάθε αντικείµενο Παράµετροι µεθόδων & κατασκευαστών Μεταβίβαση δεδοµένων σε µεθόδους & κατασκευαστές Τοπικές µεταβλητές µεθόδων & κατασκευαστών Αποθήκευση προσωρινής κατάστασης Μεταβλητές κλάσεων (στατικά πεδία) Ένα πεδίο κλάσης που δηλώνεται µε τη λέξη static Ένας χώρος στη µνήµη για όλα τα αντικείµενα
Εµβέλεια Μεταβλητής 16 Εµβέλεια µεταβλητής Καθορίζει το τµήµα το πηγαίου κώδικα από όπου µπορεί να προσπελαστεί η µεταβλητή Εµβέλεια ανά είδος µεταβλητής Η εµβέλεια ενός (private) πεδίου είναι ολόκληρος ο ορισµός της κλάσης στην οποία ανήκει Η εµβέλεια µιας παραµέτρου είναι το σώµα της µεθόδου ή του κατασκευαστή που ανήκει Η εµβέλεια µιας τοπικής µεταβλητής είναι από το σηµείο δήλωσης της µέχρι τη λήξη του block δήλωσης της ιαφορά µε C++ για block µέσα σε block: απαγορεύεται σε ένα block η δήλωση µεταβλητής µε ίδιο όνοµα µε µεταβλητή ενός προγόνου block
ιάρκεια Ζωής Μεταβλητής 17 ιάρκεια ζωής Περιγράφει για πόσο η µεταβλητή εξακολουθεί να υπάρχει ιάρκεια ζωής ανά είδος µεταβλητής Η διάρκεια ζωής ενός (private) πεδίου είναι ίδια µε τη διάρκεια ζωής του αντικειµένου στο οποίο ανήκει Η διάρκεια ζωής µιας παραµέτρου και µιας τοπικής µεταβλητής είναι ίδια µε τη διάρκεια της κλήσης της µεθόδου ή του κατασκευαστή που ανήκουν
Σταθερές Μεταβλητές 18 O ορισµός µιας µεταβλητής µπορεί να συνοδεύεται από την λέξη κλειδί final final int Χ=3; Αυτό σηµαίνει ότι Αν ανατεθεί τιµή στη µεταβλητή, αυτή η τιµή δεν µπορεί να αλλάξει Παράδειγµα final int Χ = 3; Χ = 5; // σφάλµα final int Υ; Υ = 5; Υ = 3; // σφάλµα
Πακέτο (Package) 19 Τι είναι Χώρος ονοµάτων (namespace) στον οποίο ανήκει µια συγκεκριµένη κλάση ήλωση πακέτου package <όνοµα> στην κορυφή του αρχείου Στο σύστηµα αρχείων αντιστοιχεί σε έναν φάκελο Ιεραρχία φακέλων αντιστοιχεί σε όνοµα πακέτου που προκύπτει µε διαχωρισµό των φακέλων µε "." package project.tools.printer Χρήση κλάσεων από πακέτα import java.io.* // δεν περιλαµβάνει κλάσεις υποπακέτων import java.io.file;
Χρησιµότητα Πακέτων 20 Οργάνωση κλάσεων που σχετίζονται µεταξύ τους Για απλά προγράµµατα θα µπορούσε να παραληφθεί Για πιο σύνθετα αρχίζει και γίνεται απαραίτητο Απόδοση ονόµατος σε ένα σύνολο κλάσεων ιαφορετικό µεταξύ τους, µε το Java API, µε κλάσεις άλλων προγραµµατιστών Όνοµα του project για "εσωτερικά" προγράµµατα Χρήση του domain name για ευρείας κατανάλωσης Π.χ. gr.auth.csd.project Έλεγχος πρόσβασης σε κλάση Πρόσβαση µόνο µέσα από το πακέτο εκτός και αν δηλωθεί public
Παράδειγµα 1α 21 package pkg1; class DefaultClass {} -------------------------------------------- package pkg1; public class PublicClass {} -------------------------------------------- package pkg1; public class ClassUsingDefault { public static void main(string[] args) { DefaultClass x = new DefaultClass(); } }
Παράδειγµα 1β 22 package pkg2; import pkg1.*; public class ClassUsingDefault { public static void main(string[] args) { DefaultClass x = new DefaultClass(); } } -------------------------------------------- package pkg2; import pkg1.*; public class ClassUsingPublic { public static void main(string[] args) { PublicClass x = new PublicClass(); } } ΣΦΑΛΜΑ
Έλεγχος Πρόσβασης σε Μέλη 23 public Προσβάσιµο από οποιοδήποτε κώδικα private Προσβάσιµο µόνο από µέλη της ίδιας τάξης protected Προσβάσιµο από κώδικα του πακέτου και από κάθε υποκλάση ακόµα και αν αυτή ανήκει σε άλλο πακέτο Default (χωρίς τιµή) Προσβάσιµο µόνο µέσα στο πακέτο της τάξης του