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
Last revision Both sides next revision
java:class [2017/02/16 09:18]
gthanos
java:class [2020/02/20 14:23]
gthanos
Line 1: Line 1:
-====== Η Κλάση ====== 
- 
-Στην προηγούμενη ενότητα είδαμε την σχέση μεταξύ κλάσης και αντικειμένων. Εδώ θα δούμε πως ορίζουμε μία κλάση και θα ορίσουμε την πρώτη μας κλάση. Στην πιο απλή περίπτωση κάθε κλάση περιέχει τα εξής: 
- 
-  - **δεδομένα ή πεδία (fields)** 
-  - **κατασκευαστές (constructors)** 
-  - **μεθόδους (methods)** 
- 
-Για τις ανάγκες του παρόντος κεφαλαίου θα ορίσουμε την κλάση **Rectangle** που απεικονίζει ένα ορθογώνιο παραλληλόγραμμο. Παρακάτω ορίζουμε την κλάση αυτή με χρήση δύο παραμέτρων,​ το πλάτος και το ύψος του ορθογωνίου. 
- 
-<code java Rectangle.java>​ 
- 
-public class Rectangle { 
-    ​ 
-  // the Rectangle class has 2 fields 
-  public int width; 
-  public int height; 
-    ​ 
-  // the Rectangle class has one constructor 
-  public Rectangle(int initWidth, int initHeight) { 
-    width = initWidth; 
-    height = initHeight; 
-  } 
- 
-  public void setWidth(int newWidth ) { 
-    width = newWidth; 
-  } 
-    ​ 
-  public void setHeight(int newHeight ) { 
-    height = newHeight; 
-  } 
-  ​ 
-  public int getWidth() { 
-    return width; 
-  } 
-    ​ 
-  public int getHeight() { 
-    return height; 
-  } 
-  ​ 
-  public int area() { 
-    return width * height; 
-  } 
- 
-} 
-</​code>​ 
- 
-Παρατηρήστε ότι η παραπάνω κλάση αποτελείται από τα πεδία: ​ 
-  * την μεταβλητή **width** που συμβολίζει το πλάτος του παραλληλογράμμου. 
-  * την μεταβλητή **height** που συμβολίζει το ύψος του παραλληλογράμμου. 
- 
-και τις παρακάτω μεθόδους:​ 
-<code java> 
-  public void setWidth(int newWidth ); 
-  public void setHeight(int newHeight ); 
-  public int getWidth(); 
-  public int getHeight();​ 
-  public int area(); 
-</​code>​ 
- 
-Προς το παρόν αγνοήστε τον προσδιοριστή **public** μπροστά από τα πεδία και τις μεθόδους,​ τον οποίο θα εξετάσουμε στην συνέχεια. 
- 
 ===== Ο κατασκευαστής της κλάσης ===== ===== Ο κατασκευαστής της κλάσης =====
  
Line 69: Line 7:
 </​code>​ </​code>​
  
-Η "​ειδική"​ αυτή μέθοδος αποτελεί τον κατασκευαστή της κλάσης. Ο κατασκευαστής της κλάσης έχει τις εξής ​ αρμοδιότητες:​+Η "​ειδική"​ αυτή μέθοδος αποτελεί τον κατασκευαστή της κλάσης. Ο κατασκευαστής της κλάσης έχει τις εξής ​δύο ​αρμοδιότητες:​
   - Δεσμεύει την απαραίτητη μνήμη για την αποθήκευση του αντικειμένου που δημιουργείται.   - Δεσμεύει την απαραίτητη μνήμη για την αποθήκευση του αντικειμένου που δημιουργείται.
   - Αρχικοποιεί τα δεδομένα ενός αντικειμένου,​ εφόσον διαθέτει τυπικές παραμέτρους και σώμα (σώμα μιας μεθόδου εννοούμε το τμήμα του κώδικα μέσα στις αγκύλες **{}** ).   - Αρχικοποιεί τα δεδομένα ενός αντικειμένου,​ εφόσον διαθέτει τυπικές παραμέτρους και σώμα (σώμα μιας μεθόδου εννοούμε το τμήμα του κώδικα μέσα στις αγκύλες **{}** ).
Line 75: Line 13:
  
 <WRAP tip 80% center round> <WRAP tip 80% center round>
-Η κάθε κλήση του κατασκευαστή της κλάσης δημιουργεί και επιστρέφει ένα αντικείμενο ​σε κάθε κλήση του.+Κάθε κλήση του κατασκευαστή της κλάσης δημιουργεί και επιστρέφει ένα ​νέο ​αντικείμενο.
  
-Κάθε κλάση έχει τουλάχιστον ένα κατασκευαστή (**//​μπορεί να έχει και περισσότερους//​**).__Εάν δεν έχει οριστεί κατασκευαστής σε μία κλάση __o compiler ορίζει ένα κατασκευαστή χωρίς τυπικές παραμέτρους και χωρίς εντολές μέσα στο κυρίως σώμα. Ο κατασκευαστής αυτός ονομάζεται **βασικός κατασκευαστής της κλάσης** (default constructor) Για την παραπάνω κλάση Rectangle ο βασικός κατασκευαστής ​θα ήταν εξής:+Κάθε κλάση έχει τουλάχιστον ένα κατασκευαστή (**//​μπορεί να έχει και περισσότερους//​**). __Εάν δεν έχει οριστεί κατασκευαστής σε μία κλάση __o compiler ​της java ορίζει ​αυτόματα ​ένα κατασκευαστή χωρίς τυπικές παραμέτρους και χωρίς εντολές μέσα στο κυρίως σώμα. Ο κατασκευαστής αυτός ονομάζεται **προκαθορισμένος ή βασικός κατασκευαστής** της κλάσης (default constructor). Ο βασικός κατασκευαστής αρχικοποιεί όλα τα πεδία των αντικειμένων σε **0** (για πεδία βασικού τύπου) ή σε **nulll** (για πεδία αναφορικού τύπου). 
 + 
 +Για την παραπάνω κλάση Rectangle ο βασικός κατασκευαστής ​είναι ισοδύναμος με τον να γράψετε τον παρακάτω κώδικα:
  
 <code java> <code java>
Line 85: Line 25:
 </​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:​break_loop_statements |  |Προηγούμενο:​ [[:​java:​break_loop_statements | 
 Εντολές τερματισμού και ελέγχου της ανακύκλωσης]] | [[:toc | Περιεχόμενα]] | Επόμενο:​ [[:​java:​class_fields | Τα πεδία (δεδομένα) της κλάσης]]| Εντολές τερματισμού και ελέγχου της ανακύκλωσης]] | [[:toc | Περιεχόμενα]] | Επόμενο:​ [[:​java:​class_fields | Τα πεδία (δεδομένα) της κλάσης]]|
  
java/class.txt · Last modified: 2020/02/20 14:24 by gthanos