Αντικειμενοστραφής Προγραμματισμός ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Ενότητα 5: Αντικείμενα και Κλάσεις Δρ. Χαράλαμπος Ζ. Πατρικάκης Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε Κάντε κλικ για να ξεκινήσετε
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3
Ευχαριστίες Στην ανάπτυξη του υλικού βοήθησαν οι φοιτητές Λάζαρος Τουμανίδης, Λίλιαν Γούσιου και ο βοηθός εργαστηρίου Κόγιας Δημήτριος. 4
Βιβλιογραφία Harvey Deitel,Paul Deitel, «Java Προγραμματισμός, 8η έκδοση», Γκιούρδας, 2010. Γιώργος Λιακέας, «Εισαγωγή στη Java», Κλειδάριθμος, 2009. Χρήστος Κυτάγιας, Κώστας Δ. Κυτάγιας, Γιώργος Πρεζεράκος, Δημήτρης Κυτάγιας, «Αντικειμενοστραφής Προγραμματισμός με Java», Σύγχρονη Εκδοτική, 2013. Wanda Dann, Stephen Cooper, and Randy Pausch, «Learning to program with Alice» 3rd edition, Pearson Education, 2012. Michael Kölling, «Introduction to Programming with Greenfoot». «Object-Oriented Programming in Java with Games and Simulations», Pearson Education, August 2009. Οι σημειώσεις είναι βασισμένες και σε υλικό του καθηγητή του ΤΕΙ Πειραιά Γ. Πρεζεράκου. 5
Περιεχόμενα 5.1 Καθοριστικά Πρόσβασης 5.2 Παραδείγματα Μεθόδων 5.3 Αντικειμενοστραφής Προγραμματισμός 5.3.1 Καθορίζοντας μια Κλάση 5.3.2 Εμβέλεια της Κλάσης 5.3.3 Βασικοί Τύποι vs Αναφορές 5.3.4 Στατικός Τύπος (Static) και Μέθοδοι 6
Προσδοκώμενα Αποτελέσματα Στην ενότητα αυτή θα μάθετε για: Τα καθοριστικά πρόσβασης ενοτήτων, ιδιοτήτων και μεθόδων (public, private), Την έννοια του Αντικειμενοστραφούς Προγραμματισμού με τη σύνταξη μιας Κλάσης ενός Αντικειμένου, Για Δημιουργούς Κλάσεων και Για Αναφορές Αντικειμένων. 7
5.1 Καθοριστικά Πρόσβασης 8
Καθοριστικά πρόσβασης H Java ορίζει καθοριστικά πρόσβασης για: Κλάσεις Ιδιότητες Μεθόδους Τα καθοριστικά πρόσβασης αποτελούν σημαντικό τμήμα στη σχεδίαση μιας εφαρμογής Καθορίζουν την πρόσβαση που έχει η μια κλάση στην άλλη 9
Καθοριστικά πρόσβασης - public Κλάση Προσβάσιμη από οποιαδήποτε κλάση Πρέπει να βρίσκεται σε αρχείο της μορφής <class name>.java Ιδιότητα Προσβάσιμη από οποιαδήποτε κλάση Μέθοδος Προσβάσιμη από οποιαδήποτε κλάση 10
Καθοριστικά πρόσβασης - private Κλάση Δεν γίνεται να είναι private (γιατί;) Ιδιότητα Προσβάσιμη μόνο από την κλάση της Μέθοδος Προσβάσιμη μόνο από την κλάση της 11
Καθοριστικά πρόσβασης - final Κλάση Δεν μπορεί να κληρονομηθεί Ιδιότητα Δε μπορεί να αλλάξει (σταθερά) Μέθοδος Δεν μπορεί να υπερκαλυφθεί 12
Καθοριστικά πρόσβασης - protected Ιδιότητα Προσβάσιμη μόνο από μέλη της ίδιας κλάσης και μέλη των υποκλάσεων της Μέθοδος Προσβάσιμη μόνο από μέλη της ίδιας κλάσης και μέλη των υποκλάσεων της 13
Παράδειγμα public class bank_balance { public String owner; private int balance; public class bank_balance { public String owner; public int balance; public bank_balance( String name, int dollars ) { owner = name; if (dollars >= 0) balance = dollars; else dollars =0; public bank_balance( String name, int dollars ) { owner = name; if (dollars >= 0) balance = dollars; else dollars =0; public int getbalance() { return balance; public void setbalance(int dollars) { if (dollars >= 0) balance = dollars; else dollars = 0; 14
5.2 Παραδείγματα Μεθόδων 15
Παράδειγμα public static int getminindex ( int[] values ) { int minvalue = Integer.MAX_VALUE; int minindex = -1; for( int i=0; i<values.length; i++) if ( values[i] < minvalue ) { minvalue = values[i]; minindex = i; return minindex; Πρόγραμμα εύρεσης θέσης i στον πίνακα με το μικρότερο στοιχείο. 16
Παράδειγμα public static int getsecondminindex ( int[] values ) { int secondidx = -1; int minidx= getminindex ( values ) ; for( int i=0 ; i<values.length ; i++ ) { if ( i == minidx ) continue; if ( secondidx == -1 values[i] < values[secondidx] ) secondidx = i ; return secondidx ; Τί συμβαίνει αν values = {0? values = {0, 0? values = {0,1? 17
Περίπτωση 1 Πίνακας Θέσεων (Index) vs Πίνακας Τιμών (Value) int[] values = {99, 100,101; System.out.println(values[0] ); // 99 Τιμές Θέσεις 18
Περίπτωση 2 Αγκύλες { μετά από if/else, for/while for (int i= 0; i< 5; i++) System.out.println( Hi ); System.out.println( Bye ); Τι εκτυπώνει; 19
Περίπτωση 3 Αρχικοποίηση Μεταβλητών: Εύρεση Ελάχιστου Όρου int getminvalue(int[] vals) { int min = 0; for (int i = 0; i < vals.length; i++) { if (vals[i] < min) { min = vals[i] Τι συμβαίνει αν vals = {1,2,3; Θέτουμε min = Integer.MAX_VALUE ή vals[0] Θα υπάρξει πρόβλημα;;; 20
Περίπτωση 4 Αρχικοποίηση Μεταβλητών: Εύρεση Δεύτερου Ελάχιστου Όρου secondminindex int minidx = getmin(vals) int secondidx = 0; for (int i = 0; i < vals.length; i++) { if (i == minidx) continue; if (vals[i] < vals[secondidx]) secondidx = i; Τι συμβαίνει αν vals={0, 1, 2 ; Δείτε τις λύσεις 21
Περίπτωση 5 Ορισμός μιας μεθόδου μέσα σε άλλη μέθοδο. public static void main(string[] arguments) { public static void foobar () { 22
Μέθοδοι Εντοπισμού Σφαλμάτων 1 Χρησιμοποιείστε System.out.println μέσα στον κώδικά σας για να δείτε τι κάνει. for ( int i=0; i< vals.length; i++) { if ( vals[i] < minval) { System.out.println( cur min: + minval); System.out.println( new min: + vals[i]); minval = vals[i]; 23
Μέθοδοι Εντοπισμού Σφαλμάτων 2 Μορφοποιούμε τον κώδικα μας με χρήση του Ctrl-Shift-f! for (int i = 0; i < vals.length; i++) { if (vals[i] < vals[minidx]) { minidx=i; return minidx; Υπάρχει σφάλμα;; Διαβάζεται δύσκολα για να είμαστε σίγουροι. 24
5.3 Αντικειμενοστραφής Προγραμματισμός 25
Αντικειμενοστραφής Προγραμματισμός Αντιπροσωπεύει τον πραγματικό κόσμο Μωρό 26
Αντικειμενοστραφής Προγραμματισμός Αντιπροσωπεύει τον πραγματικό κόσμο Μωρό Όνομα Φύλο Βάρος Decibels Δόντια 27
Αντικειμενοστραφής Προγραμματισμός Ομαδοποίηση αντικειμένων: Βασικοί τύποι μεταβλητών (int, double, char, etc..) Αντικείμενα (Strings, etc.. ) Όνομα: Φύλο: Βάρος: Decibels: Δόντια: Μωρό String onoma boolean einaiagori double varos double decibels int numdontia 28
Γιατί Χρησιμοποιούμε Κλάσεις; Γιατί όχι μόνο βασικούς τύπους μεταβλητών; // όνομα πρώτου αντικειμένου (Alex) String onomaalex; double varosalex; // όνομα δεύτερου αντικειμένου (David) String onomadavid; double varosdavid; 29
Γιατί Χρησιμοποιούμε Κλάσεις; Γιατί να μην χρησιμοποιούμε μόνο βασικούς τύπους μεταβλητών; // όνομα πρώτου αντικειμένου (Alex) String onomaalex; double varosalex; // όνομα δεύτερου αντικειμένου (David) String onomadavid; double varosdavid; // όνομα τρίτου αντικειμένου (David) String onomadavid2; double varosdavid2; 500 Μωρά; ΠΟΛΥ ΔΥΣΧΡΗΣΤΟ! David2? Άβολο!!! 30
Γιατί Χρησιμοποιούμε Κλάσεις; Όνομα Βάρος Φύλο Μωρό1 31
Γιατί Χρησιμοποιούμε Κλάσεις; Όνομα Βάρος Φύλο Μωρό1 Όνομα Βάρος Φύλο Μωρό2 Όνομα Βάρος Φύλο Μωρό3 Όνομα Βάρος Φύλο Μωρό4 496 ακόμα Μωρά 32
Γιατί Χρησιμοποιούμε Κλάσεις; Όνομα Βάρος Φύλο Μωρό1 Όνομα Βάρος Φύλο Μωρό2 Όνομα Βάρος Φύλο Μωρό3 Όνομα Βάρος Φύλο Μωρό4 496 ακόμα μωρά Βρεφοκομείο 33
Γιατί Χρησιμοποιούμε Κλάσεις; Νοσοκόμα1 Νοσ/μα2 Νοσ/μα3 Νοσ/μα4 Περισσότερες νοσοκόμες Μωρό1 Μωρό2 Μωρό3 Μωρό4 496 ακόμα μωρά Βρεφοκομείο 34
Γιατί Χρησιμοποιούμε Κλάσεις; Νοσοκόμα1 Μωρό1 [ ] [ ] Βρεφοκομείο 35
Γιατί Χρησιμοποιούμε Κλάσεις; Νοσοκόμα1 [ ] Μωρό1 [ ] Εντατική Μονάδα Θεραπείας Βρεφοκομείο Νοσοκομείο 36
5.3.1 Καθορίζοντας μια κλάση 37
Κλάση public class Baby{ String name; boolean isaboy; double weight; double decibels; int numberofteeth = 0; Ορισμός Κλάσης void newtooth() { numberofteeth += 1; System.out.println( Mama + my teeths hurt! ) ; 38
Κλάση Baby mybaby = new Baby(); Στιγμιότυπο Κλάσης 39
Ας ορίσουμε την κλάση Baby public class Baby { 40
Ας ορίσουμε την κλάση Baby public class Baby { 41
Σημείωση Τα ονόματα μιας κλάσης χρησιμοποιούν κεφαλαία γράμματα για κάθε καινούργια λέξη μέσα στο όνομα. 1 Κλάση πρέπει να γραφτεί σε 1 Αρχείο το οποίο θα έχει το ίδιο όνομα με την κλάση. Η κλάση μπορεί να τρέξει αν περιέχει μία μέθοδο main. 42
Πεδία Κλάσης Baby public class Baby { TYPE var_name; TYPE var_name = some_value; 43
Πεδία Κλάσης Baby public class Baby { String name; double weight= 5.0; boolean isaboy; int numberofteeth = 0; 44
Υπάρχουν Αδέλφια?? public class Baby { String onoma; double varos = 5.0; boolean einaiagori; int numpoops = 0; Baby [ ] brother; 45
Δημιουργία Στιγμιότυπου της Κλάσης Baby Baby ourbaby = new Baby(); Αλλά το όνομα; Το φύλο; 46
Δημιουργοί (Constructors) public class CLASSNAME { CLASSNAME ( ) { CLASSNAME ( [ ARGUMENTS ] ) { CLASSNAME obj1 = new CLASSNAME ( ) ; CLASSNAME obj2 = new CLASSNAME ( [ ARGUMENTS ] ); 47
Δημιουργοί (Constructors) Όνομα δημιουργού == όνομα της κλάσης. Καμία επιστρέψιμη τιμή ποτέ δεν επιστρέφουν τίποτα. Αρχικοποιούν (συνήθως) τα πεδία της κλάσης. Όλες οι κλάσεις χρειάζονται τουλάχιστον έναν δημιουργό. - Αν δεν γράψετε έναν, χρησιμοποιείται το προκαθορισμένο: CLASSNAME ( ) { 48
Κλάση Baby - Δημιουργοί public class Baby { string name; boolean isaboy; Baby ( String myname, boolean agori) { onoma = myname ; einaiagori = agori; 49
Κλάση Baby - Μέθοδοι public class Baby { String name = Slim Shady ;... void sayhi ( ) { System.out.println( Hi, my name is + name); 50
Κλάση Baby - Μέθοδοι public class Baby { String weight = 5.0; void eat ( double foodweight ) { if ( foodweight >= 0 && foodweight < weight ) { weight = weight + foodweight ; 51
Κλάση Baby public class Baby { String name; double weight= 5.0 ; boolean isaboy ; int numberofteeth = 0; Baby[ ] brother ; void sayhi() { void food(double foodweight) { 52
5.3.2 Εμβέλεια Κλάσης 53
Ανασκόπηση της Εμβέλειας public static ScopeReview { void scopemethod ( int var1 ) { String var2 ; if ( var1 >0 ) { var2 = above 0 ; else { var2 = less than or equal to 0 ; System.out.println ( var2 ) ; 54
Ανασκόπηση της Εμβέλειας public static ScopeReview { private int var3 ; void scopemethod ( int var1 ) { var3 = var1 ; String var2 ; if ( var1 >0 ) { var2 = above 0 ; else { var2 = less than or equal to 0 ; System.out.println ( var2 ) ; 55
Ανασκόπηση της Εμβέλειας public static ScopeReview { private int var3 ; void scopemethod ( int var1 ) { var3 = var1 ; String var2 ; if ( var1 >0 ) { var2 = above 0 ; else { var2 = less than or equal to 0 ; System.out.println ( var2 ) ; 56
Εμβέλεια Ακριβώς όπως οι μέθοδοι έτσι και οι μεταβλητές είναι προσβάσιμες μέσα στις αγκύλες { που ορίζονται. - Από τα προηγούμενα μαθήματα: εμβέλεια μεθόδου void method ( int arg1 ) { int arg2 = arg1 + 1 ; -Σε αυτό το μάθημα: εμβέλεια κλάσης class Examplevariable { int membervariable; void setvariable ( int newval ) { membervariable += newval ; 57
Η Λέξη-Κλειδί this Διευκρινίζει την εμβέλεια Σημαίνει το αντικείμενο μου Χρήση: class Example { int membervariable ; void setvariable ( int newval ) { this.membervariable += newval ; 58
Μόνο οι Μεταβλητές servings της Μεθόδου έχουν Ανανεωμένες Τιμές public class Baby { int servings ; void feed ( int servings ) { servings = servings + servings ; void dontia( ) { System.out.println ( All better! ) ; servings = 0 ; 59
Μόνο οι Μεταβλητές servings της Μεθόδου έχουν Ανανεωμένες Τιμές public class Baby { int servings ; void feed ( int servings ) { this.servings = this.servings + servings ; void teeth( ) { System.out.println ( All better! ) ; servings = 0 ; 60
Κλάσεις και Αντικείμενα // Ορισμός κλάσης public class Baby { // Αντικείμενα κλάσης Baby shiloh = new Baby ( Shiloh Jolie-Pitt, true ) ; Baby knox = new Baby ( Knox Jolie-Pitt, true ) ; 61
Πρόσβαση σε Πεδία Αντικειμένων των Κλάσεων Αποκτούμε πρόσβαση στο πεδίο ενός αντικειμένου ως εξής: Object.FIELDNAME Baby shiloh = new Baby ( Shiloh Jolie-Pitt, true ); System.out.println ( shiloh.name ) ; System.out.println ( shiloh.numdontia ) ; 62
Καλούμενη Μέθοδος Object. METHODNAME ( [ ARGUMENTS ] ) Baby shiloh = new Baby ( Shiloh Jolie-Pitt, true ); shiloh.sayhi ( ) ; // Hi, my name is Shiloh.eat (1) ; 63
5.3.3 Βασικοί Τύποι vs Αναφορές 64
Βασικοί Τύποι vs Αναφορές Οι βασικοί τύποι της Java είναι, όπως έχουμε πει: - int, long, double, boolean, char, short, byte, float. - Οι πραγματικές τιμές είναι αποθηκευμένες στις μεταβλητές. Οι τύποι αναφοράς είναι πίνακες και αντικείμενα String, int [ ], Baby, 65
Πως η Java Αποθηκεύει τους Βασικούς Τύπους; Οι μεταβλητές είναι σαν φλιτζάνια σταθερού μεγέθους. Οι βασικοί τύποι είναι αρκετά μικροί ώστε να χωράνε στο φλιτζάνι. 66
Πως η Java Αποθηκεύει Αντικείμενα Τα αντικείμενα είναι υπερβολικά μεγάλα για να χωρέσουν σε μία μεταβλητή. Αποθηκεύονται κάπου αλλού στη μνήμη. Οι μεταβλητές αποθηκεύουν έναν αριθμό που προσδιορίζει τη θέση του αντικειμένου. 67
Πως η Java Αποθηκεύει Αντικείμενα Τα αντικείμενα είναι υπερβολικά μεγάλα για να χωρέσουν σε μία μεταβλητή Αποθηκεύονται κάπου αλλού. Οι μεταβλητές αποθηκεύουν έναν αριθμό που προσδιορίζει τη θέση του αντικειμένου. 68
Αναφορές Η τοποθεσία του αντικειμένου ονομάζεται αναφορά. Το διπλό ίσον ( == ) συγκρίνει τις αναφορές Baby shiloh1 = new Baby ( shiloh ) ; Baby shiloh2 = new Baby ( shiloh ) ; Ερώτηση: Ισχύει shiloh1 == shiloh2 ; ΟΧΙ! 69
Αναφορές Baby shiloh1 = new Baby ( shiloh ) ; Baby shiloh2 = new Baby ( shiloh ) ; 70
Αναφορές Baby mybaby = new Baby( davy, true); mybaby.name = david ; 71
Αναφορές Baby mybaby = new Baby( davy, true); mybaby.name = david ; 72
Αναφορές Χρησιμοποιείστε ίσον ( = ) για την ενημέρωση των αναφορών baby1 = baby2 73
Αναφορές Χρησιμοποιείστε ίσον ( = ) για την ενημέρωση των αναφορών baby1 = baby2 74
Αναφορές Χρησιμοποιήστε [ ] ή ακολουθεί την αναφορά στο αντικείμενο. ίσως τροποποιεί το αντικείμενο, αλλά ποτέ την αναφορά. Φανταστείτε ότι: ακολουθείτε οδηγίες για να βρείτε ένα σπίτι. μετακινείτε ένα έπιπλο τριγύρω. Είναι ανάλογο με το να: ακολουθείτε την αναφορά σε ένα αντικείμενο. αλλάζετε τα πεδία σε ένα αντικείμενο. 75
Μέθοδοι και Αναφορές void dosomething ( int x, int[ ] ys, Baby b ) { x = 99 ; ys [0] = 99 ; b.name = 99 ;... int i = 0 ; int [ ] j = {0 ; Baby k = new Baby ( 50, true ) ; dosomething (i, j, k) ; i=? j=? k=? 76
5.3.4 Στατικός Τύπος (Static) και Μέθοδοι 77
Στατικός Τύπος (Static) Αναφέρεται σε πεδία και σε μεθόδους. Στοχεύει στο πεδίο ή τη μέθοδο: - είναι προσδιορισμένο για τη δήλωση της κλάσης, - δεν είναι κατάλληλο για κάθε περιστατικό. 78
Στατικός Τύπος (Static) public class Baby { static int numbabiesmade = 0 ; Baby.numBabiesMade = 100 ; Baby b1 = new Baby ( ) ; Baby b2 = new Baby ( ) ; Baby.numBabiesMade = 2; Τι είναι: b1.numbabiesmade? b2.numbabiesmade? 79
Static - Παράδειγμα Μετρήστε τον αριθμό των μωρών που γεννηθήκανε. public class Baby { int numbabiesmade = 0 ; Baby ( ) { numbabiesmade += 1 ; 80
Static - Πεδίο Μετρήστε τον αριθμό των μωρών που γεννηθήκανε. public class Baby { Static int numbabiesmade = 0 ; Baby ( ) { numbabiesmade += 1 ; 81
Static - Μέθοδος public class Baby { static void cry ( Baby thebaby ) { System.out.println ( thebaby.name + is crying ) ; public class Baby { void cry ( ) { System.out.println (name + is crying ) ; Ή 82
Static - Σημειώσεις Μη-στατικές μέθοδοι μπορούν να αναφερθούν σε στατικές μεθόδους, αλλά όχι το αντίστροφο. - Γιατί; public class Baby { String name = DMX ; static void whoami ( ) { System.out.println(name) ; 83
Main Γιατί είναι η μέθοδος main τύπου static? public static void main(string[] arguments) { 84
Σε αυτή την ενότητα μιλήσαμε για: 5.1 Καθοριστικά Πρόσβασης 5.2 Παραδείγματα Μεθόδων 5.3 Αντικειμενοστραφής Προγραμματισμός 5.3.1 Καθορίζοντας μια Κλάση 5.3.2 Εμβέλεια της Κλάσης 5.3.3 Βασικοί Τύποι vs Αναφορές 5.3.4 Στατικός Τύπος (Static) και Μέθοδοι 86
Αντικειμενοστραφής Προγραμματισμός ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Ενότητα 5: Αντικείμενα και Κλάσεις Δρ. Χαράλαμπος Ζ. Πατρικάκης Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε