java:class

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
java:class [2015/07/07 18:16]
gthanos [Ο κατασκευαστής της κλάσης]
java:class [2020/02/20 14:24] (current)
gthanos
Line 7: Line 7:
   - **μεθόδους (methods)**   - **μεθόδους (methods)**
  
-Σε προηγούμενα παραδείγματα χρησιμοποιήσαμε την κλάση ​του ποδηλάτου ''​Bicycle''​. Παρακάτω ορίζουμε την κλάση αυτή.+Για τις ανάγκες του ​παρόντος κεφαλαίου θα ορίσουμε την κλάση ​**Rectangle** που απεικονίζει ένα ορθογώνιο παραλληλόγραμμο. Παρακάτω ορίζουμε την κλάση αυτή ​με χρήση δύο παραμέτρων,​ το πλάτος και το ύψος του ορθογωνίου. 
 + 
 +<code java Rectangle.java> 
 + 
 +class Rectangle { 
 +     
 +  int width; 
 +  int height; 
 +  
 +  public Rectangle(int initWidth, int initHeight) { 
 +    width = initWidth;​ 
 +    height = initHeight;​ 
 +  } 
 + 
 +  void setWidth(int newWidth ) { 
 +    width = newWidth; 
 +  } 
 +     
 +  void setHeight(int newHeight ) { 
 +    height = newHeight;​ 
 +  } 
 +   
 +  int getWidth() { 
 +    return width; 
 +  } 
 +     
 +  int getHeight() { 
 +    return height; 
 +  } 
 +   
 +  int area() { 
 +    return width * height; 
 +  }
  
-<code java Bicycle.java>​ 
-public class Bicycle { 
-        ​ 
-    // the Bicycle class has 
-    // three fields 
-    public int cadence; 
-    public int gear; 
-    public int speed; 
-        ​ 
-    // the Bicycle class has 
-    // one constructor 
-    public Bicycle(int startCadence,​ int startSpeed, int startGear) { 
-        gear = startGear; 
-        cadence = startCadence;​ 
-        speed = startSpeed; 
-    } 
-        ​ 
-    // the Bicycle class has 
-    // four methods 
-    public void setCadence(int newValue) { 
-        cadence = newValue; 
-    } 
-        ​ 
-    public void setGear(int newValue) { 
-        gear = newValue; 
-    } 
-        ​ 
-    public void applyBrake(int decrement) { 
-        speed -= decrement; 
-    } 
-        ​ 
-    public void speedUp(int increment) { 
-        speed += increment; 
-    } 
-        ​ 
 } }
 </​code>​ </​code>​
  
-Παρατηρήστε ότι η παραπάνω κλάση αποτελείται από ​δεδομένα (τις μεταβλητές ''​cadence'',​ ''​gear'',​ ''​speed''​) ​και τις παρακάτω μεθόδους.+Παρατηρήστε ότι η παραπάνω κλάση αποτελείται από ​τα πεδία:  
 +  * την μεταβλητή **width** που συμβολίζει το πλάτος του παραλληλογράμμου. 
 +  * την ​μεταβλητή **height** που συμβολίζει το ύψος του παραλληλογράμμου. 
 + 
 +και τις παρακάτω μεθόδους:
 <code java> <code java>
-public ​void setCadence(int newValue); +  ​void setWidth(int newWidth ​); 
-public ​void setGear(int newValue); +  void setHeight(int newHeight ​); 
-public void setGear(int newValue); +  int getWidth(); 
-public void applyBrake(int decrement); +  int getHeight(); 
-public void speedUp(int increment);+  int area();
 </​code>​ </​code>​
- 
-Προς το παρόν αγνοήστε τον προσδιοριστεί **public**, το οποίο θα εξετάσουμε στην συνέχεια. 
  
 ===== Ο κατασκευαστής της κλάσης ===== ===== Ο κατασκευαστής της κλάσης =====
Line 63: Line 62:
  
 <code java> <code java>
-public ​Bicycle(int startCadence, int startSpeed, int startGear);+public ​Rectangle(int setWidth, int setHeight);
 </​code>​ </​code>​
  
Line 69: Line 68:
   - Δεσμεύει την απαραίτητη μνήμη για την αποθήκευση του αντικειμένου που δημιουργείται.   - Δεσμεύει την απαραίτητη μνήμη για την αποθήκευση του αντικειμένου που δημιουργείται.
   - Αρχικοποιεί τα δεδομένα ενός αντικειμένου,​ εφόσον διαθέτει τυπικές παραμέτρους και σώμα (σώμα μιας μεθόδου εννοούμε το τμήμα του κώδικα μέσα στις αγκύλες **{}** ).   - Αρχικοποιεί τα δεδομένα ενός αντικειμένου,​ εφόσον διαθέτει τυπικές παραμέτρους και σώμα (σώμα μιας μεθόδου εννοούμε το τμήμα του κώδικα μέσα στις αγκύλες **{}** ).
-  - Επιστρέφει ένα δείκτη στην αρχή της περιοχής που έχει δημιουργηθεί το νέο αντικείμενο της κλάσης. Υπό αυτή την έννοια,​ η μεταβλητή του κάθε αντικειμένου είναι ένας δείκτης (αναφορά) που δείχνει στο νέο αντικείμενο ​και όχι το αντικείμενο καθ'​ αυτό.+  - Επιστρέφει ένα δείκτη στην αρχή της περιοχής που έχει δημιουργηθεί το νέο αντικείμενο της κλάσης. Υπό αυτή την έννοια,​ η μεταβλητή του κάθε αντικειμένου είναι ένας δείκτης (αναφορά) που δείχνει στο νέο αντικείμενο.
  
 <WRAP tip 80% center round> <WRAP tip 80% center round>
 +Κάθε κλήση του κατασκευαστή της κλάσης δημιουργεί και επιστρέφει ένα νέο αντικείμενο.
  
-</WRAP>+Κάθε κλάση έχει τουλάχιστον ένα κατασκευαστή (**//​μπορεί να έχει και περισσότερους//​**). __Εάν δεν έχει οριστεί κατασκευαστής σε μία κλάση __o compiler της java ορίζει αυτόματα ένα κατασκευαστή χωρίς τυπικές παραμέτρους και χωρίς εντολές μέσα στο κυρίως σώμα. Ο κατασκευαστής αυτός ονομάζεται **προκαθορισμένος ή βασικός κατασκευαστής** της κλάσης (default constructor). Ο βασικός κατασκευαστής αρχικοποιεί όλα τα πεδία των αντικειμένων σε **0** (για πεδία βασικού τύπου) ή σε **nulll** (για πεδία αναφορικού τύπου).
  
-<WRAP tip 80% center round> +Για την παραπάνω ​κλάση ​Rectangle ​ο βασικός κατασκευαστής είναι ισοδύναμος με τον να γράψετε τον παρακάτω κώδικα:
-Η κάθε κλήση του κατασκευαστή της ​κλάσης δημιουργεί και επιστρέφει ένα αντικείμενο σε κάθε κλήση του. +
-Κάθε κλάση έχει τουλάχιστον ένα ​κατασκευαστή ​(**//​μπορεί να έχει και περισσότερους//​**).__Εάν ​δεν έχει οριστεί κατασκευαστής σε μία κλάση__ o compiler ​ορίζει ένα κατασκευαστή χωρίς τυπικές παραμέτρους και χωρίς εντολές μέσα στο κυρίως σώμα. Για την παραπάνω κλάση Bicycle ο default ​κατασκευαστής θα ήταν o εξής:+
  
 <code java> <code java>
-public ​Bicycle() {+public ​Rectangle() {
 } }
 </​code>​ </​code>​
 </​WRAP>​ </​WRAP>​
  
-====== Κληρονομικότητα Κλάσης ====== +ροηγούμενο: [[:​oop:​introduction |  
- +Εισαγωγή στον ​Αντικειμενοστραφή ​Προγραμματισμό ​]] | [[:toc | Περιεχόμενα]] | Επόμενο: [[:java:class_fields | Τα πεδία ​(δεδομένα) της κλάσης]]|
-Η κλάση ''​MountainBike'', ​η οποία ορίζεται ως υποκλάση της ''​Bicycle''​ θα μπορούσε να οριστεί ως εξής. +
- +
-<code java MountainBike.java>​ +
-public class MountainBike extends Bicycle { +
-         +
-    // the MountainBike subclass has +
-    // one field +
-    public int seatHeight;​ +
- +
-    // the MountainBike subclass has +
-    // one constructor +
-    public MountainBike(int startHeight,​ int startCadence,​ +
-                        int startSpeed, int startGear) { +
-        super(startCadence,​ startSpeed, startGear);​ +
-        seatHeight = startHeight;​ +
-    }    +
-         +
-    // the MountainBike subclass has +
-    // one method +
-    public void setHeight(int newValue) { +
-        seatHeight = newValue; +
-    }    +
- +
-+
-</​code>​ +
- +
-Η σχέση ​μεταξύ των κλάσεων ''​Bike''​ και ''​MountainBike''​ δίνεται μέσα από το keyword <color #​B1B100/#​FBFAF9>​extends</​color>​. +
- +
-<code java> +
-public class MountainBike extends Bicycle {  +
-  ....  +
-+
-</​code>​ +
- +
-H κλάση ''​MountainBike''​ κληρονομεί όλα τα πεδία και τις μεθόδους της κλάσης ''​Bicycle''​ και προσθέτει το πεδίο ''​seartHeight''​ και την μέθοδο <code java>​public void setHeight(int newValue)</​code> ​για τον ορισμό της τιμή του. Όταν μία κλάση κληρονομεί τα πεδία και τις μεθόδους της μητρικής κλάσης σημαίνει ότι μπορεί να τα χρησιμοποιήσει ​ως δικά της πεδία. Για να γίνει πιο αντιληπτό το παραπάνω,​ η κλάση ''​MountainBike''​ ισοδυναμεί με το παρακάτω. +
- +
-<code java> +
-public class MountainBike { +
-         +
-    // the Bicycle class has +
-    // three fields +
-    public int cadence; +
-    public int gear; +
-    public int speed; +
-    // the MountainBike subclass has +
-    // one field +
-    public int seatHeight;​ +
-         +
-    // the MountainBike class has one constructor +
-    public MountainBike (int startHeight,​ int startCadence,​ int startSpeed, int startGear) { +
-        seatHeight = startHeight;​ +
-        gear = startGear;​ +
-        cadence = startCadence;​ +
-        speed = startSpeed;​ +
-    } +
-         +
-    // the Bicycle class has +
-    // four methods +
-    public void setCadence(int newValue) { +
-        cadence = newValue; +
-    } +
-         +
-    public void setGear(int newValue) { +
-        gear = newValue; +
-    } +
-         +
-    public void applyBrake(int decrement) { +
-        speed -= decrement;​ +
-    } +
-         +
-    public void speedUp(int increment) { +
-        speed += increment;​ +
-    } +
-     +
-    // the MountainBike subclass has +
-    // one method +
-    public void setHeight(int newValue) { +
-        seatHeight = newValue; +
-    }    +
-+
-</​code>​ +
- +
-Συγκρίνοντας τους δύο παραπάνω ορισμούς της ​κλάσης ''​MountainBike''​ παρατηρούμε πόσο πιο κομψός ​είναι ο αρχικός ορισμός που χρησιμοποιεί ​την ιδιότητα της κληρονομικότητας. Επίσης,​ ο ορισμός αυτός μας δίνει την δυνατότητα να επαναχρησιμοποιήσουμε κώδικα που ήδη ​φτιάξαμε,​ αντί να επαναορίσουμε την κλάση εξ'​αρχής. Επεκτείνοντας τον παραπάνω συλλογισμό θα μπορούσαμε να φτιάξουμε την κλάση ''​BicycleWithGears'' ​από την κλάση ''​Bicycle''​ και στην συνέχεια να φτιάξουμε την κλάση ''​MountainBikeWithGears''​ από την κλάση ''​BicycleWithGears''​ δηλ. +
- +
-<​code>​ +
-   ​Bicycle -> BicycleWithGears -> MountainBikeWithGears  +
-</​code>​ +
- +
-Εάν ο παραπάνω συλλογισμός έχει ακόμη μεγαλύτερο βάθος, ο ορισμός και η συντήρηση κλάσεων χωρίς την χρήση της ιδιότητας της κληρονομικότητας γίνεται πολύ πολύπλοκη. +
- +
-==== Ο κατασκευαστής της υποκλάσης ==== +
- +
-Επανερχόμενοι στο αρχικό παράδειγμα,​ παρατηρήστε των κατασκευαστή της κλάσης ''​MountainBike''​.  +
- +
-<​code ​java+
-    // the MountainBike subclass has +
-    // one constructor +
-    public MountainBike(int startHeight,​ int startCadence,​ +
-                        int startSpeed, int startGear) { +
-        super(startCadence,​ startSpeed, startGear);​ +
-        seatHeight = startHeight;​ +
-    } +
-</​code>​ +
- +
-Μέσω της κλήσης ''​super(startCadence,​ startSpeed, startGear);''​ καλείται ο κατασκευαστής της γονικής κλάσης (**SuperClass**) ''​Bicycle''​. Ο κατασκευαστής αυτός χρησιμοποιείται για να αρχικοποιήσει τις μεταβλητές που ορίζονται στην γονική κλάση. Η κλήση του κατασκευαστή της γονικής κλάσης είναι υποχρεωτική,​ με την έννοια ότι κατά την αρχικοποίηση του αντικειμένου θα πρέπει να αρχικοποιηθούν τα τμήματα του αντικειμένου που ανήκουν στην γονική κλάση. Έτσι ο compiler έχει τις εξής επιλογές: +
-  - Να κληθεί ο κατασκευαστής της γονικής κλάσης ​από τον προγραμματιστή,​ όπως κάνουμε στο παραπάνω παράδειγμα. +
-  - Να μην κληθεί κάποιος κατασκευαστής από τον προγραμματιστής. Σε αυτή την περίπτωση ο compiler αναζητά τον default κατασκευαστή της γονικής κλάσης, ​δηλαδή τον κατασκευαστή που ​δεν έχει ​ορίσματα. Αυτός μπορεί να υπάρχεί είτε γιατί έχει οριστεί ​ένας τέτοιος κατασκευαστής από τον προγραμματιστή,​ είτε διότι δεν έχει οριστεί κανένας κατασκευαστής για τη γονική κλάση, οπότε ο compiler αυτόματα φτιάχνει τον default κατασκευαστή. +
- +
-<WRAP tip> +
-Αν δεν κληθεί κανένας κατασκευαστής από τον προγραμματιστή και ο compiler δεν βρει τον default κατασκευαστή της γονικής κλάσης τότε θα εμφανίσει ένα μήνυμα λάθους της μορφής.  +
-<​code>​ +
-error: no suitable constructor found for Bicycle (no arguments) +
-</​code>​ +
- +
-Συνηπώς,​ η αρχικοποίηση ​του αντικειμένου αποτελεί ευθύνη του προγραμματιστή ο οποίος θα πρέπει να φροντίσει είτε να καλέσει τον κατασκευαστή της γονικής κλάσης ή να βεβαιώσει ότι θα υπάρχει ο default κατασκευαστής. +
-</​WRAP>​ +
- +
-Τέλος, μία δήλωση της παρακάτω μορφής +
-<code java> +
-    // the MountainBike subclass has +
-    // one constructor +
-    public MountainBike(int startHeight,​ int startCadence,​ +
-                        int startSpeed, int startGear) { +
-        gear = startGear;​ +
-        cadence = startCadence;​ +
-        speed = startSpeed;​ +
-        seatHeight = startHeight;​ +
-    } +
-</​code>​ +
-δηλαδή η αντικατάσταση του κώδικα που περιέχει ο κατασκευαστής της γονικής κλάσης μέσα στον κατασκευαστή της υποκλάσης **__δεν αναιρεί__** την ανάγκη να εκτελεστεί πρώτα ο default κατασκευαστής της γονικής κλάσης.+
  
-|Προηγούμενο:​ [[:​java:​install| Εγκατάσταση Java]] | Επόμενο:​ [[:​java:​class_fields | Τα πεδία (δεδομενα) της κλάσης]]| 
  
java/class.1436292969.txt.gz · Last modified: 2016/02/26 11:15 (external edit)