Αντικειμενοστρεφής Προγραμματισμός

Σχετικά έγγραφα
Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός

5. Ανασκόπηση αντικειμενοστραφούς προγραμματισμού

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός

Κλάσεις και Αντικείμενα

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Διάλεξη 5: Κλάσεις και Αντικείμενα. Διδάσκων: Παναγιώτης Ανδρέου

Οντοκεντρικός Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08

Κλάσεις και Αντικείµενα

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Constructors Υπερφόρτωση Αντικείμενα ως παράμετροι

Πίνακες στη Java. Αντικειμενοστρεφής Προγραμματισμός 4/4/2016. Δρ. Ανδριάνα Πρέντζα Αναπληρώτρια Καθηγήτρια.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 5: Κατασκευαστές (Constructors)

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα

Κατασκευαστές. Μέθοδοι Κατασκευής (Constructors).

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπερφόρτωση Αντικείμενα σαν ορίσματα

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός

Βασικά Στοιχεία της Java

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων Constructors

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Constructors, equals, tostring Αντικείμενα ως παράμετροι

Κλάσεις και αντικείμενα #include <iostream.h<

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Παναγιώτης Σφέτσος

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Αντικείμενα ως ορίσματα

Οντοκεντρικός Προγραμματισμός

Αντικειμενοστραφής Προγραμματισμός

Αντικειµενοστρεφής Προγραµµατισµός

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

2.1. Εντολές Σχόλια Τύποι Δεδομένων

8. Μέθοδοι (Methods)

3 Αλληλεπίδραση Αντικειμένων

Αντικειμενοστραφής Προγραμματισμός

Βασικά Στοιχεία της Java

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Αντικειμενοστρεφής Προγραμματισμός

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

Βασικά της γλώσσας JAVA

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 4/3/2008

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπάρχουσες κλάσεις και αντικείμενα στην Java Strings Wrapper Classes Δομές

public void printstatement() { System.out.println("Employee: " + name + " with salary: " + salary);

Διάλεξη 16-17: Πολυμορφισμός (Polymorphism) Διδάσκων: Παναγιώτης Ανδρέου

Δομημένος Προγραμματισμός

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

Wrapper Classes, Abstract Classes and Interfaces

Καλές επιτυχίες παιδιά στα υπόλοιπα μαθήματά σας και καλές γιορτές!!!!

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 9 : ΑΦΗΡΗΜΕΝΕΣ ΚΛΑΣΕΙΣ

Αντικειμενοστρεφής Προγραμματισμός

Μέθοδοι. Μέθοδοι ηµιουργοί, Υπερφόρτωση και Υπέρβαση Μεθόδων

9:00-10:00 π.μ. (60 λεπτά) Παρασκευή, 14 Οκτωβρίου, 2016

Κεφάλαιο 15 Γλώσσα προγραμματισμού Java

7. Δομές Ελέγχου (Control Statements)

Οντοκεντρικός Προγραμματισμός ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

Αντικείµενα. ηµιουργία και χρησιµοποίηση αντικειµένων. ηµιουργία αντικειµένων

Προγραμματισμός Διαδικτύου

2.1 Αντικειµενοστρεφής προγραµµατισµός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

Εισαγωγή στον Προγραμματισμό με C++

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

Transcript:

Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων Αντικειμενοστρεφής Προγραμματισμός 16/4/2018 Δρ. Ανδριάνα Πρέντζα Αναπληρώτρια Καθηγήτρια aprentza@unipi.gr

Τύποι της Java Primitives vs References Οι πρωταρχικοί (primitive) τύποι είναι οι βασικοί τύποι της java int, long, double, boolean, char, short, byte, float Οι πραγματικές τους τιμές αποθηκεύονται στη μεταβλητή Οι τύποι αναφοράς είναι τα αντικείμενα (objects) Εξ ορισμού τιμή null Χρησιμοποιούνται για την επίκληση των μεθόδων ενός αντικειμένου 2005 Pearson Education, Inc. All rights reserved.

Πώς η java αποθηκεύει πρωταρχικούς τύπους? Οι μεταβλητές είναι σαν κούπες σταθερού μεγέθους Οι πρωταρχικοί τύποι είναι αρκετά μικροί για να χωράνε σε μία κούπα

Πώς η java αποθηκεύει αντικείμενα? Τα αντικείμενα είναι πολύ μεγάλα για να χωρέσουν σε μία μεταβλητή/κούπα Αποθηκεύονται αλλού Η μεταβλητή αποθηκεύει έναν αριθμό που εντοπίζει το αντικείμενο

Πώς η java αποθηκεύει αντικείμενα? Τα αντικείμενα είναι πολύ μεγάλα για να χωρέσουν σε μία μεταβλητή/κούπα Αποθηκεύονται αλλού Η μεταβλητή αποθηκεύει έναν αριθμό που εντοπίζει το αντικείμενο

Αναφορές Η τοποθεσία του αντικειμένου ονομάζεται αναφορά (reference) == συγκρίνει αναφορές Dog dog1 = new Dog( charlie ); Dog dog2 = new Dog( charlie ); Είναι dog1 == dog2?

Αναφορές Η τοποθεσία του αντικειμένου ονομάζεται αναφορά (reference) == συγκρίνει αναφορές Dog dog1 = new Dog( charlie ); Dog dog2 = new Dog( charlie ); Είναι dog1 == dog2? No!!!

Αναφορές Dog dog1 = new Dog( charlie ); Dog dog2 = new Dog( charlie ); Name= charlie Name= charlie dog1 dog2

Αναφορές Χρησιμοποιώντας = ενημερώνεται η αναφορά dog1 = dog2; dog1 location dog2 location dog1 dog2 dog1 object dog2 object

Αναφορές Χρησιμοποιώντας = ενημερώνεται η αναφορά dog1 = dog2; dog2 location dog1 dog2 dog1 object dog2 object

Αρχικοποίηση αντικειμένων με Κατασκευαστές Κατασκευαστές (Constructors) Αρχικοποιούν το αντικείμενο μιας κλάσης Η Java απαιτεί έναν constructor για κάθε κλάση Αν δεν παρέχεται κάποιος, η Java θα παράξει έναν προεπιλεγμένο (default) constructor χωρίς ορίσματα Καλείται όταν η λέξη-κλειδί new ακολουθείται από το όνομα της κλάσης και τις παρενθέσεις 2005 Pearson Education, Inc. All rights reserved.

1 // Fig. 3.10: GradeBook.java 2 // GradeBook class with a constructor to initialize the course name. 3 4 public class GradeBook 5 { 6 private String coursename; // course name for this GradeBook 7 8 // constructor initializes coursename with String supplied as argument 9 public GradeBook( String name ) 10 { 11 coursename = name; // initializes coursename 12 } // end constructor 13 14 // method to set the course name 15 public void setcoursename( String name ) 16 { 17 coursename = name; // store the course name 18 } // end method setcoursename 19 20 // method to retrieve the course name 21 public String getcoursename() 22 { 23 return coursename; 24 } // end method getcoursename Ο Constructor εδώ αρχικοποιεί τη μεταβλητή coursename 2005 Pearson Education, Inc. All rights reserved.

25 26 // display a welcome message to the GradeBook user 27 public void displaymessage() 28 { 29 // this statement calls getcoursename to get the 30 // name of the course this GradeBook represents 31 System.out.printf( "Welcome to the grade book for\n%s!\n", 32 getcoursename() ); 33 } // end method displaymessage 34 35 } // end class GradeBook 2005 Pearson Education, Inc. All rights reserved.

1 // Fig. 3.11: GradeBookTest.java 2 // GradeBook constructor used to specify the course name at the 3 // time each GradeBook object is created. 4 5 public class GradeBookTest 6 { 7 // main method begins program execution Κλήση constructor για 8 public static void main( String args[] ) δημιουργία ενός πρώτου 9 { αντικειμένου grade book 10 // create GradeBook object 11 GradeBook gradebook1 = new GradeBook( 12 "CS101 Introduction to Java Programming" ); 13 GradeBook gradebook2 = new GradeBook( Δημιουργία δεύτερου 14 "CS102 Data Structures in Java" ); αντικειμένου grade book 15 16 // display initial value of coursename for each GradeBook 17 System.out.printf( "gradebook1 course name is: %s\n", 18 gradebook1.getcoursename() ); 19 System.out.printf( "gradebook2 course name is: %s\n", 20 gradebook2.getcoursename() ); 21 } // end main 22 23 } // end class GradeBookTest 2005 Pearson Education, Inc. All rights reserved.

gradebook1 course name is: CS101 Introduction to Java Programming gradebook2 course name is: CS102 Data Structures in Java 2005 Pearson Education, Inc. All rights reserved.

Αποφυγή λαθών Εκτός και αν είναι αποδεκτή η προεπιλεγμένη αρχικοποίηση των μεταβλητών στιγμιοτύπου/πεδίων της κλάσης σας, καλύτερα Φτιάξτε έναν constructor για να εξασφαλίσετε ότι οι μεταβλητές στιγμιοτύπου της κλάσης σας αρχικοποιούνται με τον κατάλληλο τρόπο με τιμές οι οποίες έχουν νόημα όταν δημιουργείται ένα νέο αντικείμενο της κλάσης σας 2005 Pearson Education, Inc. All rights reserved.

Περισσότερα για constructors!

Παραδείγματα μεθόδων κατασκευαστών & η κλήση τους Δίνεται η κλάση: public class Circle { private double x,y,r; // center s coordinates and radius // no constructors declared for the class // methods public double area() { // circle s area calculation } public double circumference() { // circle s circumference calculation } public String tostring() {return ( Circle with center + x +, + y + and radius + r);} // other methods }

1. Δημιουργία αντικειμένων της κλάσης με τον default constructor που καλεί η Java αυτόματα όταν κανένας constructor δεν δηλώνεται στην κλάση. Ο by default constructor είναι ένας constructor χωρίς παραμέτρους και η κλήση του έχει σαν αποτέλεσμα να αρχικοποιηθούν τα πεδία / μεταβλητές στιγμιοτύπου (instance variables) στις by default τιμές ανάλογα με τον τύπο τους (π.χ. για ακεραίους στην τιμή 0, για πραγματικούς στην τιμή 0.0 κοκ). class usecircle { public static void main(string [] args[]) { Circle c1 = new Circle(); // δημιουργία αντικειμένου εφόσον δεν // υπάρχει constructor δηλωμένος // στην κλάση, η Java καλεί τον default // constructor System.out.println(c1.toString()); } } Έξοδος του προγράμματος: Circle with center 0.0,0.0 and radius 0.0

2. Δημιουργία αντικειμένων της κλάσης με τον default constructor και αρχικοποίηση των τιμών των πεδίων / instance variables στη δήλωσή τους public class Circle { private double x = 5; private double y = 3; private double r = 7; } class UseCircle { public static void main(string args[]) { Circle c1 = new Circle(); System.out.println(c1.toString());}} Έξοδος του προγράμματος: Circle with center 5.0,3.0 and radius 7.0

3. Δημιουργία αντικειμένων της κλάσης με τη χρήση constructor με παραμέτρους, ο οποίος δεν υπάρχει στη δήλωση της κλάσης class UseCircle { public static void main(string args[]) { } } Circle c1 = new Circle(1.0,1.0,5.0); // κλήση constructor με 3 // double παραμέτρους System.out.println(c1.toString()); Compile error: cannot resolve symbol Constructor Circle(double, double, double) Circle c1 = new Circle(1.0,1.0,5.0); ^

4. Προστίθεται στην κλάση constructor με παραμέτρους για όλες τις instance variables public class Circle { private double x,y,r; // center s coordinates and radius // constructor with parameters for all instance variables public Circle (double x1, double y1, double r1) { x = x1; y = y1; r = r1;} }

Σημείωση: Με τη λέξη this γίνεται αναφορά στο τρέχον αντικείμενο, δηλ. στο αντικείμενο για το οποίο έχει κληθεί η μέθοδος που περιέχει τη λέξη this. Με την έκφραση this.x εννοούμε την ιδιότητα x του αντικειμένου που δημιουργείται από τον κατασκευαστή. Στην συγκεκριμένη περίπτωση είναι αναγκαία η χρήση του this, για να διαχωριστεί η ιδιότητα x από την παράμετρο x του κατασκευαστή, εφόσον χρησιμοποιήθηκε σαν όνομα παραμέτρου ίδιο όνομα με την ιδιότητα. Αν αυτό δεν συνέβαινε η χρήση του this δεν θα ήταν απαραίτητη, αλλά ούτε και λάθος. Έχουμε 3 πεδία και 3 παραμέτρους! Είναι ανεξάρτητες μεταβλητές παρόλο που μοιράζονται τα ίδια ονόματα. Χρησιμοποιούμε το this για να αναφερθούμε στο πεδίο. Αναθέτουμε την τιμή της παραμέτρου στο πεδίο με το ίδιο όνομα. Χωρίς το this θα αναφερόμασταν στο πιο κοντά στην εντολή ορισμένο (παράμετρος) 4. Προστίθεται στην κλάση constructor με παραμέτρους για όλες τις instance variables public class Circle { private double x,y,r; // center s coordinates and radius // constructor with parameters for all instance variables public Circle (double x, double y, double r) { this.x = x ; this.y = y ; this.r = r ;} }

Η λέξη-κλειδί this Το νέο χαρακτηριστικό της Java που χρησιμοποιείται στο παραπάνω τμήμα κώδικα είναι η λέξη-κλειδί this: this.x = x; Η παραπάνω εντολή αναθέτει την τιμή που υπάρχει δεξιά του τελεστή ανάθεσης (x) στη μεταβλητή που βρίσκεται αριστερά (this.x). Στην εντολή αυτή βλέπουμε ότι χρησιμοποιείται το ίδιο όνομα (x) για δύο διαφορετικές οντότητες, κατάσταση γνωστή ως υπερφόρτωση ονομάτων (name overloading). Συγκεκριμένα, μελετώντας το παραπάνω τμήμα κώδικα διαπιστώνουμε ότι η κλάση περιλαμβάνει τα πεδία x, y και r και ο κατασκευαστής έχει τρεις παραμέτρους με τα ίδια ακριβώς ονόματα. Ξυνόγαλος Στέλιος, Αντικειμενοστραφής Σχεδίαση & Προγραμματισμός, Τμήμα Διοίκησης Τεχνολογίας

Η λέξη-κλειδί this Τίθεται λοιπόν το ερώτημα πόσες μεταβλητές υπάρχουν όταν εκτελείται ο κατασκευαστής. Παρόλο που τα 3 πεδία και οι 3 παράμετροι του κατασκευαστή της κλάσης έχουν το ίδιο όνομα, όταν εκτελείται ο κατασκευαστής υπάρχουν 6 μεταβλητές. Το γεγονός δηλαδή ότι ένα πεδίο και μια παράμετρος έχουν το ίδιο όνομα δεν δημιουργεί πρόβλημα στη Java. Το ερώτημα που τίθεται όμως είναι πως θα αναφερθούμε στο πεδίο και την παράμετρο που έχουν το ίδιο όνομα, ή με άλλα λόγια αν χρησιμοποιήσουμε το όνομα μεταβλητής x στον κατασκευαστή ποια μεταβλητή θα χρησιμοποιηθεί η παράμετρος ή το πεδίο; Ξυνόγαλος Στέλιος, Αντικειμενοστραφής Σχεδίαση & Προγραμματισμός, Τμήμα Διοίκησης Τεχνολογίας

Η λέξη-κλειδί this Η Java καθορίζει ότι πάντα χρησιμοποιείται ο ορισμός του πιο «κοντινού» μπλοκ εντολών. Στη συγκεκριμένη περίπτωση, εφόσον η παράμετρος x ορίζεται στον κατασκευαστή και το πεδίο x στην κλάση, η χρήση του ονόματος μεταβλητής x αναφέρεται στην παράμετρο (που ο ορισμός της είναι πιο «κοντά» στην εντολή που χρησιμοποιεί αυτό το όνομα μεταβλητής). Αυτό που χρειαζόμαστε είναι ένας μηχανισμός που θα μας επιτρέψει να προσπελάσουμε το πεδίο x μέσα στον κατασκευαστή. Τη δυνατότητα αυτή μας παρέχει η λέξη-κλειδί this που αναφέρεται στο τρέχον αντικείμενο. Δηλαδή, με την εντολή this.x = x; γίνεται ανάθεση της τιμής της παραμέτρου x στο πεδίο x του τρέχοντος αντικειμένου. Ξυνόγαλος Στέλιος, Αντικειμενοστραφής Σχεδίαση & Προγραμματισμός, Τμήμα Διοίκησης Τεχνολογίας

Δημιουργία αντικειμένων της κλάσης με χρήση αυτού του constructor: class UseCircle { public static void main(string args[]) { Circle c1 = new Circle(1.0,1.0,5.0); System.out.println(c1.toString());}} Έξοδος του προγράμματος: Circle with center 1.0,1.0 and radius 5.0 Δημιουργία αντικειμένων της κλάσης με χρήση του default constructor: class UseCircle { public static void main(string args[]) { Circle c1 = new Circle(); System.out.println(c1.toString()); } } Compile error: cannot resolve symbol Constructor Circle() Circle c1 = new Circle(); ^ Αφού έχει δηλωθεί constructor στην κλάση, δεν γίνεται κλήση του default constructor. Μπορεί να κληθεί μόνο ο δηλωμένος constructor, διαφορετικά προκύπτει λάθος μεταγλώττισης!

Προεπιλεγμένοι (Default) Κατασκευαστές και Κατασκευαστές χωρίς ορίσματα Κάθε κλάση πρέπει να έχει τουλάχιστον έναν κατασκευαστή Αν δεν δηλωθούν κατασκευαστές, ο compiler θα δημιουργήσει ένα προεπιλεγμένο κατασκευαστή Δεν παίρνει ορίσματα και αρχικοποιεί μεταβλητές στιγμιοτύπου στις αρχικές τους τιμές που προσδιορίζονται στη δήλωσή τους ή στις προεπιλεγμένες τιμές τους Οι προεπιλεγμένες τιμές είναι μηδενικές για πρωταρχικούς (primitive) αριθμητικούς τύπους, false για boolean τιμές και null για αναφορές (references) Αν δηλωθούν κατασκευαστές, η προεπιλεγμένη αρχικοποίηση αντικειμένων της κλάσης θα λάβει χώρα από έναν κατασκευαστή χωρίς ορίσματα (αν έχει δηλωθεί κάποιος) 2005 Pearson Education, Inc. All rights reserved.

Συνηθισμένο σφάλμα προγραμματισμού Αν μια κλάση έχει κατασκευαστές, μα κανείς από τους public κατασκευαστές δεν είναι κατασκευαστής χωρίς ορίσματα (no-argument), και ένα πρόγραμμα προσπαθεί να καλέσει έναν no-argument κατασκευαστή για να αρχικοποιήσει ένα αντικείμενο της κλάσης, συμβαίνει compilation error Ένας κατασκευαστής μπορεί να κληθεί χωρίς ορίσματα μόνο όταν η κλάση δεν έχει κάποιον κατασκευαστή (οπότε και καλείται ο προεπιλεγμένος κατασκευαστής) ή όταν η κλάση έχει έναν public κατασκευαστή χωρίς ορίσματα 2005 Pearson Education, Inc. All rights reserved.

5. Προστίθεται στην κλάση 2ος constructor με παράμετρο μόνο για την ακτίνα r και αρχικοποίηση των συντεταγμένων του κέντρου στις τιμές 0.0 public class Circle { private double x,y,r; // center s coordinates and radius // constructor with parameter only for radius public Circle (double r) { this.x = 0.0; this.y = 0.0 ; this.r = r ; } }

Δημιουργία αντικειμένων της κλάσης με χρήση και των δύο constructors που έχουν δηλωθεί: class UseCircle { public static void main(string args[]) { Circle c1 = new Circle(1.0,1.0,5.0); // κλήση constructor με 3 // παραμέτρους Circle c2 = new Circle(5.0); // κλήση constructor με 1 // παράμετρο System.out.println(c1.toString()); System.out.println(c2.toString());}} Έξοδος του προγράμματος: Circle with center 1.0,1.0 and radius 5.0 Circle with center 0.0,0.0 and radius 5.0

6. Δημιουργία αντικειμένων της κλάσης με χρήση ενός constructor με παραμέτρους, ο οποίος δεν έχει δηλωθεί: class UseCircle { public static void main(string args[]) { Circle c1 = new Circle(1.0,1.0); // κλήση constructor με 2 // double παραμέτρους System.out.println(c1.toString()); }} Compile error: cannot resolve symbol Constructor Circle(double, double) Circle c1 = new Circle(1.0,1.0); ^

Υπερφόρτωση πολλοί κατασκευαστές Μια κλάση μπορεί να περιλαμβάνει περισσότερους από ένα κατασκευαστές, ή γενικότερα περισσότερες από μία μεθόδους με το ίδιο όνομα, αρκεί κάθε μία από αυτές να έχει διαφορετική λίστα παραμέτρων. Η δυνατότητα αυτή είναι γνωστή ως υπερφόρτωση (overloading). Ξυνόγαλος Στέλιος, Αντικειμενοστραφής Σχεδίαση & Προγραμματισμός, Τμήμα Διοίκησης Τεχνολογίας

Πηγές/Acknowledgements H. M. Deitel, P. J. Deitel, Java Προγραμματισμός, 6η έκδοση, Μ. Γκιούρδας, 2006 D. Barnes, M. Kolling, Αντικειμενοστρεφής Προγραμματισμός σε Java, Κλειδάριθμος, 2008 Βασίλης Χριστοφίδης, Αντικειμενοστρεφής Προγραμματισμός, Πανεπιστήμιο Κρήτης Κ. Τσαγκάρης, Εισαγωγή στις εφαρμογές της Java, Πανεπιστήμιο Πειραιώς Σ. Γεωργαντάκη, Μία τεχνολογικά υποστηριζόμενη διδακτική προσέγγιση για τον αντικειμενοστρεφή προγραμματισμό, Πανεπιστήμιο Πειραιώς Jones, Evan, Adam Marcus, and Eugene Wu. 6.092 Introduction to Programming in Java,January IAP 2010. (Massachusetts Institute of Technology: MIT OpenCourseWare), http://ocw.mit.edu (Accessed 10 Mar, 2013). License: Creative Commons BY-NC-SA