Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων Αντικειμενοστρεφής Προγραμματισμός 18/4/216 Δρ. Ανδριάνα Πρέντζα Αναπληρώτρια Καθηγήτρια aprentza@unipi.gr
Τύποι της Java Primitives vs References Οι πρωταρχικοί (primitive) τύποι είναι οι βασικοί τύποι της java int, long, double, boolean, char, short, bte, float Οι πραγματικές τους τιμές αποθηκεύονται στη μεταβλητή Οι τύποι αναφοράς είναι τα αντικείμενα (objects) Εξ ορισμού τιμή null Χρησιμοποιούνται για την επίκληση των μεθόδων ενός αντικειμένου 25 Pearson Education, Inc. All rights reserved.
Πώς η java αποθηκεύει πρωταρχικούς τύπους? Οι μεταβλητές είναι σαν κούπες σταθερού μεγέθους Οι πρωταρχικοί τύποι είναι αρκετά μικροί για να χωράνε σε μία κούπα
Πώς η java αποθηκεύει αντικείμενα? Τα αντικείμενα είναι πολύ μεγάλα για να χωρέσουν σε μία μεταβλητή/κούπα Αποθηκεύονται αλλού Η μεταβλητή αποθηκεύει έναν αριθμό που εντοπίζει το αντικείμενο
Πώς η java αποθηκεύει αντικείμενα? Τα αντικείμενα είναι πολύ μεγάλα για να χωρέσουν σε μία μεταβλητή/κούπα Αποθηκεύονται αλλού Η μεταβλητή αποθηκεύει έναν αριθμό που εντοπίζει το αντικείμενο
Αναφορές Η τοποθεσία του αντικειμένου ονομάζεται αναφορά (reference) == συγκρίνει αναφορές Bab shiloh1 = new Bab( shiloh ); Bab shiloh2 = new Bab( shiloh ); Είναι shiloh1 == shiloh2?
Αναφορές Η τοποθεσία του αντικειμένου ονομάζεται αναφορά (reference) == συγκρίνει αναφορές Bab shiloh1 = new Bab( shiloh ); Bab shiloh2 = new Bab( shiloh ); Είναι shiloh1 == shiloh2?
Αναφορές Bab shiloh1 = new Bab( shiloh ); Bab shiloh2 = new Bab( shiloh );
Αναφορές Bab mbab = new Bab( dav, true); mbab.name = david ;
Αναφορές Bab mbab = new Bab( dave, true); mbab.name = david ;
Αναφορές Χρησιμοποιώντας = ενημερώνεται η αναφορά bab1 = bab2;
Αναφορές Χρησιμοποιώντας = ενημερώνεται η αναφορά bab1 = bab2;
ΚΑΤΑΝΟΜΗ Σ ΓΙΑ ΒΑΣΙΚΟΥΣ ΤΥΠΟΥΣ ΔΕΔΟΜΕΝΩΝ (PRIMITIVE TYPES, π.χ. int, float, double κ.λ.π.)
Τιμές και Αναφορές Οι διαφορές μεταξύ πρωταρχικών τύπων και αντικειμένων Οι πρωταρχικοί τύποι κρατάνε τιμές Οι τύποι αντικειμένων κρατάνε αναφορές
ΕΚΤΕΛΕΣΗ ΜΕΜΟΝΩΜΕΝΩΝ ΕΝΤΟΛΩΝ ΠΡΟΓΡΑΜΜΑΤΟΣ double = 1.; double = ; = 4.; Μεταβλητή τύπου double στην οποία καταχωρείται η τιμή 1. Κατανομή μνήμης, δηλ. διατίθεται χώρος μέσα στη μνήμη για να αποθηκευθούν οι μεταβλητές 1. 1. 4. Μεταβλητή τύπου double στην οποία καταχωρείται η τιμή της μεταβλητής Αλλαγή της τιμής της μεταβλητής. Η παλιά τιμή (το 1.) χάνεται
double = 1.; ΕΚΤΕΛΕΣΗ ΜΕΜΟΝΩΜΕΝΩΝ ΕΝΤΟΛΩΝ ΠΡΟΓΡΑΜΜΑΤΟΣ double = ; = 4.; Μεταβλητή τύπου double στην οποία καταχωρείται η τιμή 1. ΘΕΣΕΙΣ Σ 1. 4. 1. Κατανομή μνήμης, δηλ. διατίθεται χώρος μέσα στην μνήμη για να αποθηκευθούν οι μεταβλητές 1. 1. 4. Κατάσταση στη μνήμη (2 θέσεις μνήμης έχουν καταληφθεί) Μεταβλητή τύπου double στην οποία καταχωρείται η τιμή της μεταβλητής Αλλαγή της τιμής της μεταβλητής. Η παλιά τιμή (το 1.) χάνεται
ΔΗΜΙΟΥΡΓΙΑ ΑΝΤΙΚΕΙΜΕΝΩΝ ΚΑΤΑΝΟΜΗ Σ «ΣΥΝΔΕΣΗ ΑΠΟΣΥΝΔΕΣΗ» ΤΥΠΩΝ ΑΝΑΦΟΡΩΝ ΣΕ/ΑΠΟ ΑΝΤΙΚΕΙΜΕΝΑ ΚΑΤΑΣΤΡΟΦΗ ΑΝΤΙΚΕΙΜΕΝΩΝ
class Point { a public int ; public int ; 1η ενέργεια Κατανομή μνήμης για τα attributes του αντικειμένου Μεταβλητή αναφοράς (reference tpe) που θα αναφέρεται σε αντικείμενο της κλάσης Point ΕΚΤΕΛΕΣΗ ΜΕΜΟΝΩΜΕΝΩΝ ΕΝΤΟΛΩΝ ΠΡΟΓΡΑΜΜΑΤΟΣ Point a; a = new Point(); Εντολή με new = ΔΗΜΙΟΥΡΓΙΑ ΑΝΤΙΚΕΙΜΕΝΟΥ 2η ενέργεια Αναζήτηση κατάλληλου constructor στη δήλωση της κλάσης κλήση του default constructor (αφού δεν έχει δηλωθεί κάποιος) Αντικείμενο της κλάσης Point στο οποίο αναφέρεται η μεταβλητή αναφοράς (reference tpe) a 3η ενέργεια Αρχικοποίηση των μεταβλητών με τις b default τιμές για ακεραίους (μηδέν)
class Point { public int ; public int ; ΕΚΤΕΛΕΣΗ ΜΕΜΟΝΩΜΕΝΩΝ ΕΝΤΟΛΩΝ ΠΡΟΓΡΑΜΜΑΤΟΣ Point a; a = new Point(); Point b = a; Ισοδύναμες με : Point a= new Point(); Πώς αναφερόμαστε στα και ; a b Μέσω της μεταβλητής αναφοράς a π.χ. a., a. Δύο μεταβλητές αναφοράς στο ίδιο αντικείμενο (b.=a. και b.=a.)
class Point { public int ; public int ; ΕΚΤΕΛΕΣΗ ΜΕΜΟΝΩΜΕΝΩΝ ΕΝΤΟΛΩΝ ΠΡΟΓΡΑΜΜΑΤΟΣ Point a; new Point(); a = new Point(); Point b = a; a b Δημιουργία νέου αντικειμένου στη μνήμη χωρίς καμία μεταβλητή να αναφέρεται σε αυτό (αδύνατον να το χειριστούμε, απροσπέλαστο)
class Point { public int ; public int ; ΕΚΤΕΛΕΣΗ ΜΕΜΟΝΩΜΕΝΩΝ ΕΝΤΟΛΩΝ ΠΡΟΓΡΑΜΜΑΤΟΣ Point a; new Point(); a = new Point(); a = new Point(); Point b = a; a b Δημιουργία νέου αντικειμένου στη μνήμη στο οποίο αναφέρεται η μεταβλητή a. Τώρα στο 1 ο αντικείμενο αναφέρεται μόνο η μεταβλητή b (a. b. κι a. b.)
class Point { public int ; public int ; ΕΚΤΕΛΕΣΗ ΜΕΜΟΝΩΜΕΝΩΝ ΕΝΤΟΛΩΝ ΠΡΟΓΡΑΜΜΑΤΟΣ Point a; new Point(); a = new Point(); a = new Point(); Point b = a; a Τελική κατάσταση στη μνήμη (3 αντικείμενα τύπου Point και 2 μεταβλητές αναφοράς τύπου Point) b a b ΘΕΣΕΙΣ Σ
class Point { public int ; public int ; ΕΚΤΕΛΕΣΗ ΜΕΜΟΝΩΜΕΝΩΝ ΕΝΤΟΛΩΝ ΠΡΟΓΡΑΜΜΑΤΟΣ Point a; new Point(); a = new Point(); a = new Point(); Point b = a; a b ΘΕΣΕΙΣ Σ Το αντικείμενο στη μνήμη που δεν έχει καμία μεταβλητή να αναφέρεται σε αυτό, θα καταστραφεί (garbage collection) και θα αποδεσμευτεί ο χώρος μνήμης που καταλαμβάνει. Το garbage collection συμβαίνει αυτόματα και κατά περιόδους.
class Point { public int ; public int ; a b ΕΚΤΕΛΕΣΗ ΜΕΜΟΝΩΜΕΝΩΝ ΕΝΤΟΛΩΝ ΠΡΟΓΡΑΜΜΑΤΟΣ ΘΕΣΕΙΣ Σ Point a; a = new Point(); Point b = a; new Point(); a = new Point(); a = null; Καταργείται η σύνδεση της μεταβλητής αναφοράς a με το αντικείμενο που συνδεόταν. Η μεταβλητή τώρα δεν δείχνει κανένα αντικείμενο. Στη συνέχεια μπορεί να συνδεθεί με άλλο αντικείμενο που θα δημιουργηθεί
class Point { public int ; public int ; a b ΕΚΤΕΛΕΣΗ ΜΕΜΟΝΩΜΕΝΩΝ ΕΝΤΟΛΩΝ ΠΡΟΓΡΑΜΜΑΤΟΣ ΘΕΣΕΙΣ Σ Point a; a = new Point(); Point b = a; new Point(); a = new Point(); a = null; Καταργείται η σύνδεση της μεταβλητής αναφοράς a με το αντικείμενο που συνδεόταν. Η μεταβλητή τώρα δεν δείχνει κανένα αντικείμενο. Στη συνέχεια μπορεί να συνδεθεί με άλλο αντικείμενο που θα δημιουργηθεί garbage collection
class Point { public int ; public int ; ΕΚΤΕΛΕΣΗ ΜΕΜΟΝΩΜΕΝΩΝ ΕΝΤΟΛΩΝ ΠΡΟΓΡΑΜΜΑΤΟΣ Point a; new Point(); a = new Point(); a = new Point(); Point b = a; a = null; a b c ΘΕΣΕΙΣ Σ 3 Βασικός τύπος δεδομένου όχι reference (μεταβλητή αναφοράς) int c =3; c =b.;
class Point { public int ; public int ; ΕΚΤΕΛΕΣΗ ΜΕΜΟΝΩΜΕΝΩΝ ΕΝΤΟΛΩΝ ΠΡΟΓΡΑΜΜΑΤΟΣ Point a; new Point(); a = new Point(); a = new Point(); Point b = a; a = null; int c =3; a b c ΘΕΣΕΙΣ Σ 3 c =b.;...συνεχεια ΤΗΣ ΕΚΤΕΛΕΣΗΣ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ ΤΕΛΟΣ ΕΚΤΕΛΕΣΗΣ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ Καταστροφή αντικειμένων Αποδέσμευση χώρου μνήμης
class Point { public int ; public int ; Point a; a = new Point(); Poin t b = a; new Point(); a = new Point(); a = null; double c =3.; ΤΕΛΟΣ ΕΚΤΕΛΕΣΗΣ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ c =b.;..
ΚΛΗΣΗ ΤΗΣ ΜΕΘΟΔΟΥ ΤΟΥ ΚΑΤΑΣΚΕΥΑΣΤΗ, ΟΤΑΝ ΥΠΑΡΧΕΙ ΔΗΛΩΜΕΝΟΣ ΚΑΤΑΣΚΕΥΑΣΤΗΣ ΣΤΗΝ ΚΛΑΣΗ
public class Circle { private double,,r; ΚΩΔΙΚΑΣ ΚΛΑΣΗΣ public Circle (double 1, double 1, double r1) { = 1 ; = 1 ; r = r1 ; // methods public double area() { public double circumference() { public String tostring() { ΠΡΟΓΡΑΜΜΑ ΧΡΗΣΗΣ ΤΗΣ ΚΛΑΣΗΣ class usecircle { public static void main(string [] args[]) { Circle c1 = new Circle(1.,1.,5.); c1 1. 1. 5. 1. 1. r 5. ΜΕΤΑΦΟΡΑ ΡΟΗΣ ΠΕΡΑΣΜΑ ΤΙΜΩΝ ΣΤΙΣ ΠΑΡΑΜΕΤΡΟΥΣ ΕΠΙΣΤΡΟΦΗ ΡΟΗΣ ΠΡΟΓΡΑΜΜΑΤΟΣ c1 r ΕΚΤΕΛΕΣΗ ΕΝΤΟΛΗΣ ΔΗΜΙΟΥΡΓΙΑΣ ΑΝΤΙΚΕΙΜΕΝΟΥ ΘΕΣΕΙΣ Σ 1. 1. 5. Π Ρ Ο Γ Ρ / Τ Ο Σ
ΘΕΜΑΤΑ ΚΑΤΑΝΟΜΗΣ Σ ΚΑΙ ΚΑΤΑΣΤΡΟΦΗΣ ΑΝΤΙΚΕΙΜΕΝΩΝ (GARBAGE COLLECTION) ΣΕ COMPOSED ΚΛΑΣΕΙΣ δηλ. κλάσεις που διαθέτουν ιδιοχαρακτηριστικά του τύπου κάποιας άλλης κλάσης (δηλ. ο τύπος τους δεν είναι κάποιος από τους βασικούς τύπους δεδομένων (primitive tpes, π.χ. int, float, double κ.λ.π.) ούτε String)
class Point { public int ; public int ; class Ccle { private int radius; private Point center; public Ccle(Point p, int r) { center = p; radius = r; ΕΚΤΕΛΕΣΗ ΜΕΜΟΝΩΜΕΝΩΝ ΕΝΤΟΛΩΝ ΠΡΟΓΡΑΜΜΑΤΟΣ Point a = new Point(); Ccle c = new Ccle(a,4); c center radius a 4 Αντικείμενο της κλάσης Point στο οποίο αναφέρεται η μεταβλητή αναφοράς a και η μεταβλητή αναφοράς center του αντικειμένου Ccle Αντικείμενο της κλάσης Ccle στο οποίο αναφέρεται η μεταβλητή αναφοράς c
class Point { public int ; public int ; Καταργείται η σύνδεση της reference a με το αντικείμενο Point. class Ccle { private int radius; private Point center; public Ccle(Point p, int r) { center = p; radius = r; a ΘΕΣΕΙΣ Σ ΕΚΤΕΛΕΣΗ ΜΕΜΟΝΩΜΕΝΩΝ ΕΝΤΟΛΩΝ ΠΡΟΓΡΑΜΜΑΤΟΣ Point a = new Point(); Ccle c = new Ccle(a,4); a = null; c center Αντικείμενο της κλάσης Point. Αναφέρεται σε αυτό η reference a και η reference center του αντικειμένου Ccle radius 4 Αντικείμενο της κλάσης Ccle. Αναφέρεται σε αυτό η reference c
class Point { public int ; public int ; class Ccle { private int radius; private Point center; public Ccle(Point p, int r) { center = p; radius = r; ΕΚΤΕΛΕΣΗ ΜΕΜΟΝΩΜΕΝΩΝ ΕΝΤΟΛΩΝ ΠΡΟΓΡΑΜΜΑΤΟΣ Point a = new Point(); Ccle c = new Ccle(a,4); a = null; a ΘΕΣΕΙΣ Σ c center Αντικείμενο της κλάσης Point. Αναφέρεται σε αυτό η reference a και η reference center του αντικειμένου Ccle radius 4 Αντικείμενο της κλάσης Ccle. Αναφέρεται σε αυτό η reference c
class Point { public int ; public int ; Κανένα αντικείμενο δεν καταστρέφεται γιατί έχουν references που συνδέονται με αυτά Αντικείμενο της κλάσης Point. Αναφέρεται σε αυτό η reference a και η reference center του αντικειμένου Ccle class Ccle { private int radius; private Point center; public Ccle(Point p, int r) { center = p; radius = r; a c center radius ΘΕΣΕΙΣ Σ 4 ΕΚΤΕΛΕΣΗ ΜΕΜΟΝΩΜΕΝΩΝ ΕΝΤΟΛΩΝ ΠΡΟΓΡΑΜΜΑΤΟΣ Point a = new Point(); Ccle c = new Ccle(a,4); a = null; c = null; Καταργείται η σύνδεση της reference c με το αντικείμενο Ccle. Αντικείμενο της κλάσης Ccle. Αναφέρεται σε αυτό η reference c
class Point { public int ; public int ; class Ccle { private int radius; private Point center; public Ccle(Point p, int r) { center = p; radius = r; ΕΚΤΕΛΕΣΗ ΜΕΜΟΝΩΜΕΝΩΝ ΕΝΤΟΛΩΝ ΠΡΟΓΡΑΜΜΑΤΟΣ Point a = new Point(); Ccle c = new Ccle(a,4); a = null; c = null; a ΘΕΣΕΙΣ Σ c center Αντικείμενο της κλάσης Point. Αναφέρεται σε αυτό η reference a και η reference center του αντικειμένου Ccle radius 4 Αντικείμενο της κλάσης Ccle. Αναφέρεται σε αυτό η reference c
class Point { public int ; public int ; Και τα 2 αντικείμενα θα καταστραφούν γιατί με τη reference center δεν συνδέεται πλέον καμία reference, άρα είναι απροσπέλαστη Αντικείμενο της κλάσης Point. Αναφέρεται σε αυτό η reference a και η reference center του αντικειμένου Ccle class Ccle { private int radius; private Point center; public Ccle(Point p, int r) { center = p; radius = r; a c center radius ΘΕΣΕΙΣ Σ 4 ΕΚΤΕΛΕΣΗ ΜΕΜΟΝΩΜΕΝΩΝ ΕΝΤΟΛΩΝ ΠΡΟΓΡΑΜΜΑΤΟΣ Point a = new Point(); Ccle c = new Ccle(a,4); a = null; c = null; Άρα ο σύνδεσμος της με το αντικείμενο Point είναι άχρηστος Αντικείμενο της κλάσης Ccle. Αναφέρεται σε αυτό η reference c
class Point { public int ; public int ; Καταστροφή αντικειμένων, αποδέσμευση χώρου μνήμης class Ccle { private int radius; private Point center; public Ccle(Point p, int r) { center = p; radius = r; a c ΘΕΣΕΙΣ Σ ΕΚΤΕΛΕΣΗ ΜΕΜΟΝΩΜΕΝΩΝ ΕΝΤΟΛΩΝ ΠΡΟΓΡΑΜΜΑΤΟΣ Point a = new Point(); Ccle c = new Ccle(a,4); a = null; c = null;...συνεχεια ΤΗΣ ΕΚΤΕΛΕΣΗΣ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ ΤΕΛΟΣ ΕΚΤΕΛΕΣΗΣ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ
class Point { public int ; public int ; class Ccle { private int radius; private Point center; public Ccle(Point p, int r) { center = p; radius = r; ΕΚΤΕΛΕΣΗ ΜΕΜΟΝΩΜΕΝΩΝ ΕΝΤΟΛΩΝ ΠΡΟΓΡΑΜΜΑΤΟΣ Point a = new Point(); Ccle c = new Ccle(a,4); a = null; c = null; ΤΕΛΟΣ ΕΚΤΕΛΕΣΗΣ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ
Equalit vs Identit
Πηγές/Acknowledgements http://java.sun.com/j2se H. M. Deitel, P. J. Deitel, Java Προγραμματισμός, Μ. Γκιούρδας D. Barnes, M. Kolling, Αντικειμενοστρεφής Προγραμματισμός σε Java, Κλειδάριθμος Βασίλης Χριστοφίδης, Αντικειμενοστρεφής Προγραμματισμός, Πανεπιστήμιο Κρήτης Κ. Τσαγκάρης, Εισαγωγή στις εφαρμογές της Java, Πανεπιστήμιο Πειραιώς Σ. Γεωργαντάκη, Μία τεχνολογικά υποστηριζόμενη διδακτική προσέγγιση για τον αντικειμενοστρεφή προγραμματισμό, Πανεπιστήμιο Πειραιώς Jones, Evan, Adam Marcus, and Eugene Wu. 6.92 Introduction to Programming in Java,Januar IAP 21. (Massachusetts Institute of Technolog: MIT OpenCourseWare), http://ocw.mit.edu (Accessed 1 Mar, 213). License: Creative Commons BY-NC-SA