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 [2016/01/22 13:24]
gthanos
java:class [2020/02/20 14:24] (current)
gthanos
Line 7: Line 7:
   - **μεθόδους (methods)**   - **μεθόδους (methods)**
  
-Για τις ανάγκες του παρόντος κεφαλαίου θα ορίσουμε την κλάση **Rectangle** που απεικονίζει ένα ορθογώνιο παραλληλόγραμμο. Παρακάτω ορίζουμε την κλάση αυτή.+Για τις ανάγκες του παρόντος κεφαλαίου θα ορίσουμε την κλάση **Rectangle** που απεικονίζει ένα ορθογώνιο παραλληλόγραμμο. Παρακάτω ορίζουμε την κλάση αυτή ​με χρήση δύο παραμέτρων,​ το πλάτος και το ύψος του ορθογωνίου.
  
 <code java Rectangle.java>​ <code java Rectangle.java>​
  
-public ​class Rectangle {+class Rectangle {
     ​     ​
-  ​// the Rectangle class has 3 fields +  int width; 
-  public ​int width; +  int height; 
-  ​public ​int height; +  
-  ​public int[] color;// (an array of 3 elements  +  public Rectangle(int ​initWidth, int initHeight) { 
-                     //to store information in RGB format) +    width = initWidth
-     +    height = initHeight;
-  // the Rectangle class has one constructor +
-  public Rectangle(int ​setWidth, int setHeight, int[] setColor) { +
-    width = setWidth+
-    height = setHeight;​ +
-    color = setColor;+
   }   }
-    ​ + 
-  ​// the Rectangel class has 4 methods +  void setWidth(int newWidth ) {
-  public ​void setWidth(int newWidth ) {+
     width = newWidth;     width = newWidth;
   }   }
     ​     ​
-  ​public ​void setHeight(int newHeight ) {+  void setHeight(int newHeight ) {
     height = newHeight;     height = newHeight;
 +  }
 +  ​
 +  int getWidth() {
 +    return width;
   }   }
     ​     ​
-  ​public void setColor(int[] setColor) { +  int getHeight() { 
-    ​color = setColor;+    ​return height;
   }   }
   ​   ​
-  ​public String toString() { +  ​int area() { 
-    return ​"​Width:​ "+width+", Height: "+height+", RGB: (0x"​+Integer.toHexString(color[0]) +    return width height; 
-    +", 0x"​+Integer.toHexString(color[1])+",​ 0x"​+Integer.toHexString(color[0])+"​)"​+  }
-  ​}     +
-+
  
 +}
 </​code>​ </​code>​
  
-Παρατηρήστε ότι η παραπάνω κλάση αποτελείται από πεδία: ​+Παρατηρήστε ότι η παραπάνω κλάση αποτελείται από ​τα πεδία: ​
   * την μεταβλητή **width** που συμβολίζει το πλάτος του παραλληλογράμμου.   * την μεταβλητή **width** που συμβολίζει το πλάτος του παραλληλογράμμου.
   * την μεταβλητή **height** που συμβολίζει το ύψος του παραλληλογράμμου.   * την μεταβλητή **height** που συμβολίζει το ύψος του παραλληλογράμμου.
-  * την μεταβλητή **color** που είναι πίνακας τριών θέσεων και συμβολίζει το χρώμα του παραλληλογράμμου σε μορφή [[wp>​RGB_color_model|RGB]]. 
  
 και τις παρακάτω μεθόδους:​ και τις παρακάτω μεθόδους:​
 <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 68: Line 62:
  
 <code java> <code java>
-public Rectangle(int setWidth, int setHeight, int[] setColor);+public Rectangle(int setWidth, int setHeight);
 </​code>​ </​code>​
  
Line 77: Line 71:
  
 <WRAP tip 80% center round> <WRAP tip 80% center round>
-Η κάθε κλήση του κατασκευαστή της κλάσης δημιουργεί και επιστρέφει ένα αντικείμενο ​σε κάθε κλήση του.+Κάθε κλήση του κατασκευαστή της κλάσης δημιουργεί και επιστρέφει ένα ​νέο ​αντικείμενο.
  
-Κάθε κλάση έχει τουλάχιστον ένα κατασκευαστή (**//​μπορεί να έχει και περισσότερους//​**).__Εάν δεν έχει οριστεί κατασκευαστής σε μία κλάση __o compiler ορίζει ένα κατασκευαστή χωρίς τυπικές παραμέτρους και χωρίς εντολές μέσα στο κυρίως σώμα. Ο κατασκευαστής αυτός ονομάζεται **βασικός κατασκευαστής της κλάσης** (default constructor) Για την παραπάνω κλάση ​Bicycle ​ο βασικός κατασκευαστής ​θα ήταν εξής:+Κάθε κλάση έχει τουλάχιστον ένα κατασκευαστή (**//​μπορεί να έχει και περισσότερους//​**). __Εάν δεν έχει οριστεί κατασκευαστής σε μία κλάση __o compiler ​της java ορίζει ​αυτόματα ​ένα κατασκευαστή χωρίς τυπικές παραμέτρους και χωρίς εντολές μέσα στο κυρίως σώμα. Ο κατασκευαστής αυτός ονομάζεται **προκαθορισμένος ή βασικός κατασκευαστής** της κλάσης (default constructor). Ο βασικός κατασκευαστής αρχικοποιεί όλα τα πεδία των αντικειμένων σε **0** (για πεδία βασικού τύπου) ή σε **nulll** (για πεδία αναφορικού τύπου). 
 + 
 +Για την παραπάνω κλάση ​Rectangle ​ο βασικός κατασκευαστής ​είναι ισοδύναμος με τον να γράψετε τον παρακάτω κώδικα:
  
 <code java> <code java>
Line 87: Line 83:
 </​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.1453469068.txt.gz · Last modified: 2016/02/26 11:15 (external edit)