User Tools

Site Tools


java:class

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
java:class [2016/01/22 13:24] gthanosjava:class [2022/02/22 15:38] (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** μπροστά από τα πεδία και τις μεθόδους, τον οποίο θα εξετάσουμε στην συνέχεια. +=== Ο κατασκευαστής της κλάσης ===
- +
-===== Ο κατασκευαστής της κλάσης =====+
  
 Εκτός από τις παραπάνω μεθόδους η κλάση διαθέτει μία "ειδική" μέθοδο που έχει το όνομα της κλάσης και δεν διαθέτει επιστρεφόμενο τύπο, όπως παρακάτω: Εκτός από τις παραπάνω μεθόδους η κλάση διαθέτει μία "ειδική" μέθοδο που έχει το όνομα της κλάσης και δεν διαθέτει επιστρεφόμενο τύπο, όπως παρακάτω:
  
 <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/01/22 13:24 by gthanos