Προγραμματισμός ΙΙ: Εισαγωγή στα Αντικείμενα

Προγραμματισμός ΙΙ
Αντικειμενοστραφής Προγραμματισμός
Αντικειμενοστραφής Προγραμματισμός
- Είναι τύπος προγραμματισμού βασισμένος σε αντικείμενα (objects) που μοντελοποιούν
τα δεδομένα με βάση την εσωτερική τους κατάσταση (state, μεταβλητές, υπόσταση) και με βάση τη συμπεριφορά
τους (behavior, μέθοδοι).
public class LightBulb {
private static int numOfObjects = 0;
private boolean light;
public LightBulb(boolean light) {
this.light = light;
numOfObjects+=1;
}
public boolean isLit() {
return light;
}
public void switchLight() {
light = !light;
}
public static int getNumOfObjects() {
return numOfObjects;
}
}
Αντικειμενοστραφής Προγραμματισμός (2)
- Ένα αντικείμενο αποτελείται από κανένα ή περισσότερα πεδία/ιδιότητες που καθορίζουν την
κατάστασή του και από καμία ή περισσότερες μεθόδους που καθορίζουν τη συμπεριφορά
του.
- Κάθε αντικείμενο είναι ένα στιγμιότυπο μιας κλάσης που καθορίζει και τον τύπο του.
- Κάθε κλάση είναι ένα προσχέδιο (blueprint) ή πρότυπο (prototype) για τη
δημιουργία αντικειμένων.
- Ένα αντικειμενοστραφές πρόγραμμα αποτελεί μια συλλογή από αντικείμενα που
αλληλεπιδρούν μεταξύ τους.
Κατασκευαστής
Ο κατασκευαστής (constructor) είναι μια ειδική μέθοδος η οποία:
- Έχει πάντα το ίδιο όνομα με την κλάση που βρίσκεται
- Στη σύνταξή του δε δηλώνεται κάποιος τύπος επιστροφής (ούτε void).
- Μπορεί να δεχθεί ορίσματα.
- Καλείται μέσω του τελεστή new, που είναι υπεύθυνος για τη δημιουργία κάποιου
αντικειμένου και, επίσης, μπορεί να προσδιορίσει κάποια πεδία του (αντικειμένου).
- Ο κατασκευαστής είτε θα ορίστει από τον προγραμματιστή είτε θα χρησιμοποίηθει
ένας εγγενής κατασκευαστής (default constructor) που δεν αρχικοποιεί κανένα πεδίο.
Σε κάθε περίπτωση η κάθε κλάση έχει (τουλάχιστον ένα) κατασκευαστή.
Δέσμευση Μνήμης για Αντικειμένα
- Η 'new' πέρα από το ότι καλεί τον κατασκευαστή μιας κλάσης φροντίζει επίσης τη
δέσμευση αναγκαίας μνήμης για το αντικείμενο που θα δημιουργηθεί.
Παράδειγμα:
LightBulb lightBulb = new LightBulb(false);
- Η μεταβλητή του object (η lightBulb στο παράδειγμα μας) δεν περιέχει την πληροφορία της κατάστασης του
αλλά έναν αριθμό (σε δεκαεξαδικό σύστημα) που είναι η διεύθυνση στη μνήμη που βρίσκεται το object.
(Δοκιμάστε να κάνετε print ένα object).
Στατικά και μη στατικά πεδία και μεθόδους.
- Ένα στατικό πεδίο σε μια κλάση είναι ένα κοινό πεδίο με συγκεκριμένη κατάσταση
για όλα τα αντικείμενα που έχουν τύπο αυτή την κλάση. Με άλλα λόγια τα
αντικείμενα μιας κλάσης μοιράζονται ένα αντίγραφο αυτού του πεδίου.
- Μια στατική μέθοδος μπορεί να κληθεί χωρίς να δημιουργηθεί κάποιο
αντικείμενο απαραίτητα. Μια τέτοια μέθοδος έχει πρόσβαση μόνο σε στατικά πεδία
- Ένα μη στατικό πεδίο είναι ένα πεδίο όπου κάθε ξεχωριστό αντικείμενο έχει το
δικό του αντίγραφο. Συνεπώς μια μεταβολή της κατάστασης του από ένα αντικείμενο
δε θα επηρρεάσει το αντίστοιχο πεδίο σε κάποιο άλλο αντικείμενο (της ίδιας κλάσης).
- Οι μη στατικές μέθοδοι μπορούν να κληθούν μόνο από στιγμιότυπα μιας κλάσης
και έχουν πρόσβαση και σε στατικά και σε μη στατικά πεδία.
Προσδιοριστές Πρόσβασης
O προσδιοριστής 'final'
- Μεταβλητές που χρησιμοποιούν προθεματικά το 'final' στον ορισμό τους, παίρνουν μία τιμή,
η οποία δεν μπορεί να αλλάξει (γίνεται σταθερά).
- Μέθοδοι που χρησιμοποιούν προθεματικά το 'final' στον ορισμό τους δεν μπορούν
να γίνουν override από παραγόμενες κλάσεις (σε επόμενο μάθημα).
- Κλάσεις που χρησιμοποιούν προθεματικά το 'final' στον ορισμό τους δεν μπορούν
να επεκταθούν απο άλλες κλάσεις.
Παράδειγμα(1)
public class Test {
public static void main(String[] args) {
LightBulb objLightBulb1 = new LightBulb(true);
LightBulb objLightBulb2 = new LightBulb(true);
objLightBulb1.setState();
System.out.println(objLightBulb1);
System.out.println(objLightBulb2);
}
}
Παράδειγμα(2)
public class Test {
public static void main(String[] args) {
LightBulb objLightBulb1 = new LightBulb(true);
LightBulb objLightBulb2 = objLightBulb1;
objLightBulb1.switchLight();
System.out.println(objLightBulb1);
System.out.println(objLightBulb2);
}
}
Παράδειγμα(3)
public class Test {
public static void main(String[] args) {
LightBulb objLightBulb1 = new LightBulb(true);
LightBulb objLightBulb2 = new LightBulb(false);
System.out.println(LightBulb.getNumOfObjects());
System.out.println(objLightBulb1.getNumOfObjects());
System.out.println(objLightBulb1.isLit());
// System.out.println(LightBulb.isLit());
// System.out.println(lightBulb.light);
}
}
Άσκηση
- Τι θα εκτυπωθεί στα δύο προηγούμενα κομμάτια κώδικα; Μπορείτε να αιτιολογήσετε
το αποτέλεσμα; Μπορούμε να χρησιμοποιήσουμε τον κώδικα που βρίσκεται στα σχόλια;
Καταστροφή Αντικειμένων
- Συχνά κατά τη διάρκεια εκτέλεσης ενός προγράμματος, δημιουργούνται αντικείμενα
που χρησιμοποιούνται για να εκπληρώσουν ένα σκοπό και μόλις αυτός εκπληρωθεί χάνουν
τη χρησιμότητά τους και δεν ξαναχρησιμοποιούνται. Προκειμένου να απελευθερωθούν
πόροι από τη μνήμη, στη java, υπάρχει ο μηχανισμός συλλογής σκουπιδιών (garbage
collection) ο οποίος εντοπίζει τα αντικείμενα που δε θα χρησιμοποιηθούν στο μέλλον
και τα σβήνει. Ο μηχανισμός αυτός είναι ο μοναδικός τρόπος για να γίνει κάτι
τέτοιο. Με άλλα λόγια ένας χρήστης στη java δεν μπορεί ο ίδιος να σβήσει
κάποιο αντικείμενο.

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.