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>
-Η κάθε κλήση του κατασκευαστή της κλάσης δημιουργεί και επιστρέφει ένα αντικείμενο ​σε κάθε κλήση του.+Κάθε κλήση του κατασκευαστή της κλάσης δημιουργεί και επιστρέφει ένα ​νέο ​αντικείμενο.
  
-Κάθε κλάση έχει τουλάχιστον ένα κατασκευαστή (**//​μπορεί να έχει και περισσότερους//​**).__Εάν δεν έχει οριστεί κατασκευαστής σε μία κλάση__ o compiler ορίζει ένα κατασκευαστή χωρίς τυπικές παραμέτρους και χωρίς εντολές μέσα στο κυρίως σώμα. ​Για την παραπάνω κλάση ​Bicycle ο default κατασκευαστής ​θα ήταν ​εξής:+Κάθε κλάση έχει τουλάχιστον ένα κατασκευαστή (**//​μπορεί να έχει και περισσότερους//​**). __Εάν δεν έχει οριστεί κατασκευαστής σε μία κλάση ​__o compiler ​της java ορίζει ​αυτόματα ​ένα κατασκευαστή χωρίς τυπικές παραμέτρους και χωρίς εντολές μέσα στο κυρίως σώμα. ​Ο κατασκευαστής αυτός ονομάζεται **προκαθορισμένος ή βασικός κατασκευαστής** της ​κλάσης (default ​constructor). Ο βασικός ​κατασκευαστής αρχικοποιεί όλα ​τα πεδία των αντικειμένων σε **0** (για πεδία βασικού τύπου) ​ή σε **nulll** (για πεδία αναφορικού τύπου).
  
-<code java> +Για την παραπάνω κλάση ​Rectangle ​ο βασικός κατασκευαστής είναι ισοδύναμος ​με τον να γράψετε τον παρακάτω κώδικα:
-public Bicycle() { +
-+
-</​code>​ +
-</​WRAP>​ +
- +
-====== Κληρονομικότητα Κλάσης ====== +
- +
-Η κλάση ​''​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> <code java>
-public ​class MountainBike extends Bicycle ​ +public ​Rectangle() ​{
-  .... +
 } }
 </​code>​ </​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>​ </​WRAP>​
  
-Τέλος, μία δήλωση της παρακάτω ​μορφής +|Προηγούμενο: [[:​oop:​introduction |  
-<code java> +Εισαγωγή ​στον Αντικειμενοστραφή Προγραμματισμό ]] | [[:toc | Περιεχόμενα]] | Επόμενο: [[:​java:​class_fields | Τα πεδία εδομένατης κλάσης]]|
-    // 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.1436293006.txt.gz · Last modified: 2016/02/26 11:15 (external edit)