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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Μαθήματα από τα εργαστήρια

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

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

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

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

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

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

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

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

4. Εισαγωγή στη Java

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

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

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

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

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

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

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

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

Διδάσκων: Παναγιώτης Ανδρέου

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Αριθμητικοί υπολογισμοί χρησιμοποιούνται σε όλα σχεδόν τα προγράμματα

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

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

Τύποι δεδομένων, τελεστές, μεταβλητές

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

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

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

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

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

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

Δομημένος Προγραμματισμός (ΤΛ1006)

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

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

Διάλεξη 20: Αναδρομή (Recursion) Διδάσκων: Παναγιώτης Ανδρέου

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων Tοπικές μεταβλητές To αντικείμενο this Accessor, Mutator μέθοδοι

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

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

Transcript:

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

Δημιουργία αντικειμένων μιας κλάσης Η σύνταξη για τη δημιουργία ενός νέου αντικειμένου είναι η εξής: new <όνομα-κλάσης> (λίστα-παραμέτρων) Η εντολή έχει ως αποτέλεσμα: τη δημιουργία ενός νέου αντικειμένου της κλάσης που καθορίζεται στην εντολή την εκτέλεση του κατασκευαστή της συγκεκριμένης κλάσης Ξυνόγαλος Στέλιος, Αντικειμενοστραφής Σχεδίαση & Προγραμματισμός, Τμήμα Διοίκησης Τεχνολογίας

Δημιουργία αντικειμένων μιας κλάσης Αν ο κατασκευαστής της κλάσης έχει παραμέτρους τότε στην εντολή new πρέπει να δοθούν οι πραγματικές παράμετροι. Για παράδειγμα, από τον ορισμό του κατασκευαστή της κλάσης Circle προκύπτει ότι αυτός δέχεται μια ακέραια τιμή ως παράμετρο: public Circle(int radius) τυπική παράμετρος Επομένως, στην εντολή new του κατασκευαστή της κλάσης Circle πρέπει να παρέχουμε μια πραγματική παράμετρο τύπου int: πραγματική παράμετρος new Circle(5); Ξυνόγαλος Στέλιος, Αντικειμενοστραφής Σχεδίαση & Προγραμματισμός, Τμήμα Διοίκησης Τεχνολογίας

Γιατί απαιτείται η δημιουργία αντικειμένων μιας κλάσης??? Για παράδειγμα για μια δοσμένη κλάση Cat με ιδιότητα age ΔΕΝ μπορούμε να πούμε: Cat.age = 5; ΑΛΛΑ πρέπει να πούμε: Cat Frisky = new Cat(); // δημιουργία αντικειμένου Cat στο οποίο αναφέρεται Frisky.age = 5; Γιατί??? // η μεταβλητή αναφοράς Frisky τύπου Cat Για να καταλάβουμε το γιατί ας δούμε τα παρακάτω:

Γιατί απαιτείται η δημιουργία αντικειμένων μιας κλάσης??? Αν σκεφτούμε τον τύπο των ακεραίων σαν μια κλάση, ΔΕΝ μπορούμε να πούμε: int = 5; ΑΛΛΑ λέμε: int x; x = 5; Πρώτα δηλώνουμε μια μεταβλητή τύπου int και μετά τη χειριζόμαστε Δηλαδή το ίδιο κάνουμε και για τους βασικούς (primitive) τύπους δεδομένων. Δηλώνουμε μεταβλητές του συγκεκριμένου τύπου (τόσες όσες απαιτεί το πρόβλημά μας). Αντίστοιχα, στις κλάσεις δημιουργούμε αντικείμενά τους (με τη χρήση του operator new) και αυτά χειριζόμαστε.

Σημείωση... Για να είμαστε ακόμα πιο ακριβείς στις κλάσεις γίνονται δυο ενέργειες: Δηλώνεται μια μεταβλητή (μεταβλητή αναφοράς ή τύπος αναφοράς (reference type)) που έχει ως τύπο τον τύπο της κλάσης και δημιουργείται (με τη χρήση του operator new) αντικείμενο της κλάσης που το «όνομά του» (μπορούμε να πούμε) είναι το όνομα της μεταβλητής που δηλώθηκε. Χρησιμοποιώντας το όνομα αυτής της μεταβλητής χειριζόμαστε το αντικείμενο. Οι δυο αυτές ενέργειες μπορούν να γίνουν με έναν από τους δύο παρακάτω ισοδύναμους τρόπους: Α) Cat Frisky; // μεταβλητή με όνομα Frisky τύπου Cat Frisky = new Cat(); // δημιουργία αντικειμένου τύπου Cat με «όνομα» Frisky Β) Cat Frisky = new Cat(); // δήλωση μεταβλητής Frisky τύπου Cat και // δημιουργία αντικειμένου στο οποίο αναφέρεται Δηλαδή δεν αρκεί όπως στους βασικούς τύπους δεδομένων μόνο η δήλωση, χρειάζεται επιπλέον και η δημιουργία!

Σημείωση... Το παρακάτω δεν θα λειτουργήσει Cat Frisky; Frisky.age = 3; Επίσης χωρίς τη δημιουργία αντικειμένων πώς θα χειριζόμασταν την περίπτωση προβλημάτων στα οποία απαιτούνται περισσότερα από ένα αντικείμενα της κλάσης Cat? Σε αντιστοιχία στους ακεραίους λέμε int x; int y; x=4; y=7;

Σύγκριση κατασκευαστή με άλλες μεθόδους Σύγκριση ως προς: Constructor Method Μέθοδος Την κλήση Έμμεσα (με τη χρήση του τελεστή new) Άμεσα Τον τύπο που επιστρέφει Κανέναν (ούτε void) πάντα (τουλάχιστον void) Το όνομα Ίδιο με το όνομα της κλάσης Επιλογή του χρήστη

Κλήσεις μεθόδων Εσωτερικές κλήσεις μεθόδων Οι μέθοδοι καλούν άλλες μεθόδους της ίδιας κλάσης ως τμήμα της υλοποίησής τους updatedisplay();... private void updatedisplay() Εσωτερική κλήση μεθόδου όνομαμεθόδου (λίστα παραμέτρων) Εξωτερικές κλήσεις μεθόδων Οι μέθοδοι καλούν μεθόδους άλλων αντικειμένων χρησιμοποιώντας την ονομαζόμενη σημειογραφία τελείας minutes.increment(); Εξωτερική κλήση μεθόδου αντικείμενο.όνομαμεθόδου (λίστα παραμέτρων)

Δήλωση κλάσης με μέθοδο και δημιουργία αντικειμένου κλάσης Η δήλωση κάθε κλάσης που ξεκινά με τη λέξη-κλειδί public πρέπει να αποθηκεύεται σε ένα αρχείο που έχει το ίδιο όνομα με το όνομα της κλάσης και καταλήγει με την επέκταση αρχείου.java 2005 Pearson Education, Inc. All rights reserved.

Στοιχεία ορισμού κλάσης

Contract και Implementation μιας κλάσης Contract κλάσης: σύνολο μεθόδων και των συσχετιζόμενων semantics Implementation κλάσης: υλοποίηση των μεθόδων της κλάσης

Η κλάση GradeBook Η λέξη-κλειδί public είναι ένα τροποποιητικό πρόσβασης (access modifier) Οι δηλώσεις κλάσης περιλαμβάνουν : Το τροποποιητικό πρόσβασης Τη λέξη-κλειδί class Ζεύγος αριστερής και δεξιάς αγκύλων Δηλώσεις μεθόδων Η λέξη-κλειδί public υποδεικνύει ότι η μέθοδος είναι διαθέσιμη στο κοινό Μπορεί να κληθεί εκτός του σώματος δήλωσης της κλάσης, από μεθόδους άλλων κλάσεων Η λέξη-κλειδί void υποδεικνύει τη μη ύπαρξη τύπου επιστροφής Το τροποποιητικό πρόσβασης, ο τύπος επιστροφής, το όνομα της μεθόδου και οι παρενθέσεις αποτελούν την επικεφαλίδα της μεθόδου 2005 Pearson Education, Inc. All rights reserved.

ΠΡΟΣΟΧΗ Η δήλωση περισσοτέρων της μίας public κλάσης στο ίδιο αρχείο είναι σφάλμα μετάφρασης!!! 2005 Pearson Education, Inc. All rights reserved.

1 // Fig. 3.1: GradeBook.java 2 // Class declaration with one method. 3 4 public Η κλάση class GradeBook GradeBook 5 { 6 // display a welcome message to the GradeBook user 7 public void displaymessage() 8 { 9 System.out.println( "Welcome to the Grade Book!" ); 10 } // end method displaymessage 11 12 } // end class GradeBook Δήλωση κλάσης με μία μέθοδο 2005 Pearson Education, Inc. All rights reserved.

Η κλάση GradeBookTest Η Java είναι επεκτάσιμη Οι προγραμματιστές μπορούν να δημιουργήσουν καινούριες κλάσεις Έκφραση δημιουργίας στιγμιοτύπου κλάσης (αντικειμένου) Λέξη-κλειδί new Έπειτα το όνομα της κλάσης προς δημιουργία και παρενθέσεις Κλήση μιας μεθόδου Όνομα αντικειμένου, έπειτα ο διαχωριστής τελεία (.) Ακολουθεί το όνομα της μεθόδου και παρενθέσεις Η κλάση GradeBookTest χρησιμοποιείται για να δείξει την κλάση GradeBook 2005 Pearson Education, Inc. All rights reserved.

1 // Fig. 3.2: GradeBookTest.java 2 // Create a GradeBook object and call its displaymessage method. 3 Η κλάση 4 public class GradeBookTest 5 { 6 // main method begins program execution 7 public static void main( String args[] ) 8 { 9 // create a GradeBook object and assign it to mygradebook 10 GradeBook mygradebook = new GradeBook(); 11 12 // call mygradebook's displaymessage method 13 mygradebook.displaymessage(); 14 } // end main 15 16 } // end class GradeBookTest Welcome to the Grade Book! Αυτές οι δύο εντολές δημιουργούν ένα αντικείμενο και ενεργοποιούν μία μέθοδο Δημιουργίας αντικειμένου της GradeBook Κλήση μεθόδου displaymessage χρησιμοποιώντας το αντικείμενο GradeBook 2005 Pearson Education, Inc. All rights reserved.

Μετάφραση πολλαπλών κλάσεων Τοποθετούμε στη σειρά κάθε αρχείο.java ξεχωριστά, διαχωρίζοντάς τα με κενό (space) ή Δηλ. javac GradeBook.java GradeBookTest.java Για να μεταγλωττίζουμε όλα τα αρχεία.java στο φάκελο που βρισκόμαστε Εκτελούμε javac *.java 2005 Pearson Education, Inc. All rights reserved.

Δήλωση μιας μεθόδου με μία παράμετρο Τροποποίηση του προηγούμενου προγράμματος Η μέθοδος displaymessage παίρνει ένα όρισμα Χρήση μεθόδων της Scanner Η nextline διαβάζει τη επόμενη γραμμή από την είσοδο Η next διαβάζει τη επόμενη λέξη από την είσοδο 2005 Pearson Education, Inc. All rights reserved.

1 // Fig. 3.4: GradeBook.java 2 // Class declaration with a method that has a parameter. 3 4 public class GradeBook 5 { 6 // display a welcome message to the GradeBook user 7 public void displaymessage(string coursename) 8 { 9 System.out.printf("Welcome to the grade book for\n%s!\n", 10 coursename); 11 } // end method displaymessage 12 13 } // end class GradeBook Κλήση της printf μεθόδου με το όρισμα coursename 2005 Pearson Education, Inc. All rights reserved.

1 // Fig. 3.5: GradeBookTest.java 2 // Create GradeBook object and pass a String to 3 // its displaymessage method. 4 import java.util.scanner; // program uses Scanner 5 6 public class GradeBookTest Κλήση μεθόδων 7 { 8 // main method begins program execution 9 public static void main( String args[] ) 10 { 11 // create Scanner to obtain input from command window 12 Scanner input = new Scanner( System.in ); 13 14 // create a GradeBook object and assign it to mygradebook 15 GradeBook mygradebook = new GradeBook(); 16 17 // prompt for and input course name 18 System.out.println( "Please enter the course name:" ); 19 String nameofcourse = input.nextline(); // read a line of text 20 System.out.println(); // outputs a blank line 21 22 // call mygradebook's displaymessage method 23 // and pass nameofcourse as an argument 24 mygradebook.displaymessage(nameofcourse); 25 } // end main 26 27 } // end class GradeBookTest Κλήση μεθόδου nextline για διάβασμα μιας γραμμής από την είσοδο Κλήση displaymessage με ένα όρισμα 2005 Pearson Education, Inc. All rights reserved.

Please enter the course name: CS101 Introduction to Java Programming Welcome to the grade book for CS101 Introduction to Java Programming! 2005 Pearson Education, Inc. All rights reserved.

ΠΡΟΣΟΧΗ Σφάλμα μεταγλώττισης όταν κατά την κλήση μεθόδων 1. ο αριθμός ορισμάτων στην κλήση μιας μεθόδου δεν συνάδει με τον αριθμό παραμέτρων στη δήλωση της μεθόδου 2. οι τύποι των ορισμάτων στην κλήση μια μεθόδου δεν συνάδουν με τους τύπους των αντίστοιχων παραμέτρων στη δήλωση της μεθόδου 2005 Pearson Education, Inc. All rights reserved.

2005 Pearson Education, Inc. All rights reserved. Παρατηρήσεις To java.lang εισάγεται δυναμικά σε κάθε πρόγραμμα Το «προεπιλεγμένο πακέτο» (Default package) Οι κλάσεις που μεταγλωττίζονται στον ίδιο φάκελο στο δίσκο (π.χ. GradeBook και GradeBookTest) ανήκουν σε ένα λεγόμενο προεπιλεγμένο πακέτο Οι κλάσεις του ίδιου πακέτου εισάγονται εν δυνάμει στον πηγαίο κώδικα όλων των άλλων αρχείων στο φάκελο Επομένως, μια δήλωση import δεν απαιτείται όταν μια κλάση σε ένα πακέτο χρησιμοποιεί μια άλλη στο ίδιο το πακέτο αυτό (όπως π.χ. η GradeBook χρησιμοποιεί τη GradeBookTest) Τα πακέτα είναι αχρείαστα εφόσον χρησιμοποιούνται τα πλήρως προσδιορισμένα ονόματα (fully-qualified names) των κλάσεων Δηλ. Αν γράφαμε java.util.scanner δεν χρειαζόταν η δήλωση import και η γραμμή 12 παραπάνω θα γινόταν java.util.scanner input = new java.util.scanner( System.in );

Μεταβλητές στιγμιότυπου/πεδία, Μέθοδοι set και get Οι μεταβλητές που δηλώνονται στο σώμα μιας μεθόδου Ονομάζονται τοπικές μεταβλητές Χρησιμοποιούνται μόνο εντός αυτής της μεθόδου Οι μεταβλητές που δηλώνονται στη δήλωση μιας κλάσης Λέγονται πεδία ή μεταβλητές στιγμιοτύπου Κάθε αντικείμενο της κλάσης έχει διαφορετικό στιγμιότυπο της μεταβλητής 2005 Pearson Education, Inc. All rights reserved.

1 // Fig. 3.7: GradeBook.java 2 // GradeBook class that contains a coursename instance variable 3 // and methods to set and get its value. 4 Μεταβλητές στιγμιότυπου, Πεδίο/Μεταβλητή στιγμιοτύπου 5 public class GradeBook coursename 6 { 7 private String coursename; // course name for this GradeBook 8 Μέθοδοι set και get 9 // method to set the course name 10 public void setcoursename( String name ) 11 { 12 coursename = name; // store the course name 13 } // end method setcoursename 14 15 // method to retrieve the course name 16 public String getcoursename() 17 { 18 return coursename; 19 } // end method getcoursename 20 21 // display a welcome message to the GradeBook user 22 public void displaymessage() 23 { 24 // this statement calls getcoursename to get the 25 // name of the course this GradeBook represents 26 System.out.printf( "Welcome to the grade book for\n%s!\n", 27 getcoursename() ); Κλήση μεθόδου get 28 } // end method displaymessage 29 30 } // end class GradeBook Μέθοδος set για την coursename Μέθοδος get για την coursename 2005 Pearson Education, Inc. All rights reserved.

Πρόσβαση public και private Λέξη-κλειδί private Χρησιμοποιείται για τις περισσότερες μεταβλητές στιγμιοτύπου/πεδία Οι μεταβλητές και οι μέθοδοι private είναι προσβάσιμες μόνο σε μεθόδους της κλάσης στην οποία δηλώνονται Θυμηθείτε τον όρο Απόκρυψη Πληροφορίας ή Δεδομένων 2005 Pearson Education, Inc. All rights reserved.

Public vs. Private Αναπαράσταση δεδομένων Αν η αναπαράσταση δεδομένων είναι public: - Ο κώδικας μπορεί να δημιουργήσει μη κατάλληλες τιμές - Υπάρχων κώδικας μπορεί να μην είναι έγκυρος λόγω αλλαγής αναπαράστασης - Απώλεια απόκρυψης πληροφορίας (Loss of encapsulation) Αν η αναπαράσταση δεδομένων είναι private: + Ο κώδικας ΔΕΝ μπορεί να δημιουργήσει μη κατάλληλες τιμές + Υπάρχων κώδικας ΔΕΝ μπορεί να μην είναι έγκυρος λόγω αλλαγής αναπαράστασης + Ενίσχυση απόκρυψης πληροφορίας (Boosting encapsulation)

Παρατηρήσεις Βάζετε πάντα πριν από κάθε δήλωση πεδίου (ιδιότητας) και μεθόδου ένα τροποποιητικό πρόσβασης Ο γενικός κανόνας λέει ότι οι μεταβλητές στιγμιοτύπου/πεδία δηλώνονται ως private και οι οι μέθοδοι δηλώνονται ως public Ωστόσο, όπως θα δούμε, είναι απαραίτητο να δηλώνουμε συγκεκριμένες μεθόδους ως private, αν πρόκειται να προσπελαστούν μόνο από άλλες μεθόδους της ίδιας κλάσης 2005 Pearson Education, Inc. All rights reserved.

Παρατηρήσεις Μπορούμε να δηλώσουμε τα πεδία (ιδιότητες) μιας κλάσης οπουδήποτε εντός της κλάσης (όχι βέβαια εντός μιας δήλωσης μεθόδου), αλλά Προτιμούμε να γράφουμε τα πεδία (ιδιότητες) μια κλάσης πρώτα Τοποθετούμε μια κενή γραμμή μεταξύ των δηλώσεων των μεθόδων για καλύτερη αναγνωσιμότητα 2005 Pearson Education, Inc. All rights reserved.

2005 Pearson Education, Inc. All rights reserved.... Μέθοδοι set και get Οι μεταβλητές στιγμιοτύπου/πεδία private Δεν μπορούν να προσπελαστούν απευθείας από τους πελάτες του αντικειμένου Πελάτης (client) είναι κάθε κλάση που καλεί τις μεθόδους του αντικειμένου Στο παράδειγμά μας η GradeBookTest είναι πελάτης που δημιουργεί και διαχειρίζεται ένα αντικείμενο GradeBook Χρήση μεθόδων set για τροποποίηση της τιμής των private μεταβλητών στιγμιοτύπου/πεδίων Χρήση μεθόδων get για να πάρουν τις τιμές των private μεταβλητών στιγμιοτύπου/πεδίων Τα ονόματα αυτών των μεθόδων για λήψη/εκχώρηση τιμών δεν είναι απαραίτητο να αρχίζουν με get ή set, αντιστοίχως, ωστόσο η τακτική αυτή ΣΥΝΙΣΤΑΤΑΙ ΘΕΡΜΑ στη JAVA!!!

Σημειώσεις για τις μεθόδους Set και Get Μέθοδοι Set Γνωστές και ως μέθοδοι-διαφοροποιητές (mutator methods) Αναθέτουν τιμές στις μεταβλητές στιγμιοτύπου Θα έπρεπε να επικυρώνουν νέες τιμές για τις μεταβλητές στιγμιοτύπου Π.χ. Μπορούν να επιστρέφουν μια τιμή για να υποδείξουν μη έγκυρα δεδομένα Μέθοδοι Get Γνωστές και ως μέθοδοι-πρόσβασης (accessor methods) ή μέθοδοι ερωτημάτων (query methods) Αποκτούν τις τιμές των μεταβλητών στιγμιοτύπου Μπορούν να ελέγχουν τη μορφή των δεδομένων που επιστρέφονται 2005 Pearson Education, Inc. All rights reserved.

Παρατήρηση (σχετική με τεχνολογία λογισμικού) Όταν είναι αναγκαίο, παρέχετε public μεθόδους για για την αλλαγή και ανάκτηση των τιμών των private μεταβλητών στιγμιοτύπου. Αυτή η αρχιτεκτονική βοηθά στην απόκρυψη της υλοποίησης της κλάσης από τους πελάτες της, κι αυτό βελτιώνει τη δυνατότητα τροποποίησης του προγράμματος Οι σχεδιαστές κλάσεων δεν χρειάζεται να παρέχουν μεθόδους set και get για κάθε private πεδίο. Αυτές οι δυνατότητες θα έπρεπε να παρέχονται μόνο όταν έχει νόημα 2005 Pearson Education, Inc. All rights reserved.

Παρατήρηση (σχετική με τεχνολογία λογισμικού) Οι μέθοδοι που τροποποιούν τις τιμές των private μεταβλητών θα πρέπει να επαληθεύουν ότι οι προοριζόμενες ως νέες τιμές είναι κατάλληλες. Αν δεν είναι, οι μέθοδοι set θα πρέπει να θέτουν τις private μεταβλητές σε μια κατάλληλη, σταθερή κατάσταση με έγκυρα δεδομένα, εντός προκαθορισμένων περιοχών 2005 Pearson Education, Inc. All rights reserved.

1 // Fig. 3.8: GradeBookTest.java 2 // Create and manipulate a GradeBook object. 3 import java.util.scanner; // program uses Scanner 4 5 public class GradeBookTest 6 { 7 // main method begins program execution 8 public static void main( String args[] ) 9 { 10 // create Scanner to obtain input from command window 11 Scanner input = new Scanner( System.in ); 12 13 // create a GradeBook object and assign it to mygradebook 14 GradeBook mygradebook = new GradeBook(); 15 16 // display initial value of coursename 17 System.out.printf( "Initial course name is: %s\n\n", 18 mygradebook.getcoursename() ); 19 Κλήση της μεθόδου get για την coursename 2005 Pearson Education, Inc. All rights reserved.

20 // prompt for and read course name 21 System.out.println( "Please enter the course name:" ); 22 String thename = input.nextline(); // read a line of text 23 mygradebook.setcoursename( thename ); // set the course name 24 System.out.println(); // outputs a blank line 25 26 // display welcome message after specifying course name 27 mygradebook.displaymessage(); 28 } // end main 29 30 } // end class GradeBookTest Κλήση της μεθόδου set για την coursename Κλήση της displaymessage Initial course name is: null Please enter the course name: CS101 Introduction to Java Programming Welcome to the grade book for CS101 Introduction to Java Programming! 2005 Pearson Education, Inc. All rights reserved.

1 // Fig. 6.11: Scope.java 2 // Scope class demonstrates field and local variable scopes. 3 4 public class Scope 5 { 6 // field that is accessible to all methods of this class 7 private int x = 1; 8 9 // method begin creates and initializes local variable x 10 // and calls methods uselocalvariable and usefield 11 public void begin() 12 { 13 int x = 5; // method's local variable x shadows field x 14 15 System.out.printf( "local x in method begin is %d\n", x ); 16 Εμβέλεια δηλώσεων!!!! 17 uselocalvariable(); // uselocalvariable has local x 18 usefield(); // usefield uses class Scope's field x 19 uselocalvariable(); // uselocalvariable reinitializes local x 20 usefield(); // class Scope's field x retains its value 21 2005 Pearson Education, Inc. All rights reserved.

22 System.out.printf( "\nlocal x in method begin is %d\n", x ); 23 } // end method begin 24 25 // create and initialize local variable x during each call 26 public void uselocalvariable() 27 { 28 int x = 25; // initialized each time uselocalvariable is called 29 30 System.out.printf( 31 "\nlocal x on entering method uselocalvariable is %d\n", x ); 32 ++x; // modifies this method's local variable x 33 System.out.printf( 34 "local x before exiting method uselocalvariable is %d\n", x ); 35 } // end method uselocalvariable 36 37 // modify class Scope's field x during each call 38 public void usefield() 39 { 40 System.out.printf( 41 "\nfield x on entering method usefield is %d\n", x ); 42 x *= 10; // modifies class Scope's field x 43 System.out.printf( 44 "field x before exiting method usefield is %d\n", x ); 45 } // end method usefield 46 } // end class Scope 2005 Pearson Education, Inc. All rights reserved.

1 // Fig. 6.12: ScopeTest.java 2 // Application to test class Scope. 3 4 public class ScopeTest 5 { 6 // application starting point 7 public static void main( String args[] ) 8 { 9 Scope testscope = new Scope(); 10 testscope.begin(); 11 } // end main 12 } // end class ScopeTest 2005 Pearson Education, Inc. All rights reserved.

1 // Fig. 6.12: ScopeTest.java 2 // Application to test class Scope. 3 4 public class ScopeTest 5 { 6 // application starting point 7 public static void main( String args[] ) 8 { 9 Scope testscope = new Scope(); 10 testscope.begin(); 11 } // end main 12 } // end class ScopeTest local x in method begin is 5 local x on entering method uselocalvariable is 25 local x before exiting method uselocalvariable is 26 field x on entering method usefield is 1 field x before exiting method usefield is 10 local x on entering method uselocalvariable is 25 local x before exiting method uselocalvariable is 26 field x on entering method usefield is 10 field x before exiting method usefield is 100 local x in method begin is 5 2005 Pearson Education, Inc. All rights reserved.

Τύποι της 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) == συγκρίνει αναφορές Baby shiloh1 = new Baby( shiloh ); Baby shiloh2 = new Baby( shiloh ); Είναι shiloh1 == shiloh2?

Αναφορές Η τοποθεσία του αντικειμένου ονομάζεται αναφορά (reference) == συγκρίνει αναφορές Baby shiloh1 = new Baby( shiloh ); Baby shiloh2 = new Baby( shiloh ); Είναι shiloh1 == shiloh2?

Αναφορές Baby shiloh1 = new Baby( shiloh ); Baby shiloh2 = new Baby( shiloh );

Αναφορές Baby mybaby = new Baby( davy, true); mybaby.name = david ;

Αναφορές Baby mybaby = new Baby( dave, true); mybaby.name = david ;

Αναφορές Χρησιμοποιώντας = ενημερώνεται η αναφορά baby1 = baby2;

Αναφορές Χρησιμοποιώντας = ενημερώνεται η αναφορά baby1 = baby2;

Αρχικοποίηση αντικειμένων με Κατασκευαστές Κατασκευαστές (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.

Αριθμοί κινητής υποδιαστολής και ο τύπος double Αριθμοί κινητής υποδιαστολής (floating-point numbers) float Απλής-ακρίβειας 7 σημαντικά ψηφία double Αποθηκεύει αριθμούς με μεγαλύτερο μέτρο και ακρίβεια από ό,τι έχουν οι float Διπλής -ακρίβειας 15 σημαντικά ψηφία 2005 Pearson Education, Inc. All rights reserved.

1 // Fig. 3.13: Account.java 2 // Account class with a constructor to 3 // initialize instance variable balance. 4 5 public class Account 6 { Η μεταβλητή balance είναι double 7 private double balance; // instance variable that stores the balance 8 9 // constructor 10 public Account( double initialbalance ) 11 { 12 // validate that initialbalance is greater than 0.0; 13 // if it is not, balance is initialized to the default value 0.0 14 if ( initialbalance > 0.0 ) 15 balance = initialbalance; 16 } // end Account constructor 17 18 // credit (add) an amount to the account 19 public void credit( double amount ) 20 { 21 balance = balance + amount; // add amount to balance 22 } // end method credit 23 24 // return the account balance 25 public double getbalance() 26 { 27 return balance; // gives the value of balance to the calling method 28 } // end method getbalance 29 30 } // end class Account 2005 Pearson Education, Inc. All rights reserved.

Η κλάση AccountTest που χρησιμοποιεί την κλάση Account Ο προσδιοριστής μορφής %f Χρησιμοποιείται για να εξάγει αριθμούς κινητής υποδιαστολής (floating-point numbers) Τοποθετούμε μια υποδιαστολή και έναν αριθμό μεταξύ του συμβόλου % και του f για να υποδείξουμε την ακρίβεια 2005 Pearson Education, Inc. All rights reserved.

1 // Fig. 3.14: AccountTest.java 2 // Create and manipulate an Account object. 3 import java.util.scanner; 4 5 public class AccountTest 6 { 7 // main method begins execution of Java application 8 public static void main( String args[] ) 9 { 10 Account account1 = new Account( 50.00 ); //create Account object 11 Account account2 = new Account( -7.53 ); //create Account object 12 13 // display initial balance of each object 14 System.out.printf( "account1 balance: $%.2f\n", 15 account1.getbalance() ); 16 System.out.printf( "account2 balance: $%.2f\n\n", 17 account2.getbalance() ); 18 2005 Pearson Education, Inc. All rights reserved.

19 // create Scanner to obtain input from command window 20 Scanner input = new Scanner( System.in ); 21 double depositamount; // deposit amount read from user 22 23 System.out.print("Enter deposit amount for account1:" ); // prompt 24 depositamount = input.nextdouble(); // obtain user input 25 System.out.printf("\nadding %.2f to account1 balance\n\n" 26, depositamount); 27 account1.credit(depositamount); // add to account1 balance 28 29 // display balances 30 System.out.printf( "account1 balance: $%.2f\n", 31 account1.getbalance() ); 32 System.out.printf( "account2 balance: $%.2f\n\n", 33 account2.getbalance() ); 34 Εισάγουμε μια τιμή double Εισάγουμε μια τιμή double 35 System.out.print("Enter deposit amount for account2: "); // prompt 36 depositamount = input.nextdouble(); // obtain user input 37 System.out.printf( "\nadding %.2f to account2 balance\n\n", 38 depositamount ); 39 account2.credit( depositamount ); // add to account2 balance 40 2005 Pearson Education, Inc. All rights reserved.

41 // display balances 42 System.out.printf( "account1 balance: $%.2f\n", 43 account1.getbalance() ); 44 System.out.printf( "account2 balance: $%.2f\n", 45 account2.getbalance() ); 46 } // end main 47 48 } // end class AccountTest Εξάγεται μια τιμή double account1 balance: $50.00 account2 balance: $0.00 Enter deposit amount for account1: 25.53 adding 25.53 to account1 balance account1 balance: $75.53 account2 balance: $0.00 Enter deposit amount for account2: 123.45 adding 123.45 to account2 balance account1 balance: $75.53 account2 balance: $123.45 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;} }

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 γίνεται αναφορά στο τρέχον αντικείμενο, δηλ. στο αντικείμενο για το οποίο έχει κληθεί η μέθοδος που περιέχει τη λέξη this. Με την έκφραση this.x εννοούμε την ιδιότητα x του αντικειμένου που δημιουργείται από τον κατασκευαστή. Στην συγκεκριμένη περίπτωση είναι αναγκαία η χρήση του this, για να διαχωριστεί η ιδιότητα x από την παράμετρο x του κατασκευαστή, εφόσον χρησιμοποιήθηκε σαν όνομα παραμέτρου ίδιο όνομα με την ιδιότητα. Αν αυτό δεν συνέβαινε η χρήση του this δεν θα ήταν απαραίτητη, αλλά ούτε και λάθος. Έχουμε 3 πεδία και 3 παραμέτρους! Είναι ανεξάρτητες μεταβλητές παρόλο που μοιράζονται τα ίδια ονόματα. Χρησιμοποιούμε το this για να αναφερθούμε στο πεδίο. Αναθέτουμε την τιμή της παραμέτρου στο πεδίο με το ίδιο όνομα. Χωρίς το this θα αναφερόμασταν στο πιο κοντά στην εντολή ορισμένο (παράμετρος)

Η λέξη-κλειδί 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 http://java.sun.com/j2se 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