java:class_methods

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_methods [2015/09/18 11:38]
gthanos [Υπερφόρτωση (overloading) των μεθόδων μίας κλάσης]
java:class_methods [2019/02/22 08:23] (current)
gthanos [Υπερφόρτωση (overloading) των μεθόδων μίας κλάσης]
Line 1: Line 1:
 ====== Μέθοδοι της Κλάσης ====== ====== Μέθοδοι της Κλάσης ======
  
-Προηγουμένως συναντήσαμε ​ορισμούς μεθόδων. Γενικά,​ κατά τον ορισμό μίας ​μεθόδου έχουμε τα εξής:+Ο ορισμός οποιασδήποτε ​μεθόδου ​στη Java περιέχει τα εξής ​πεδία
  
-  - Προσδιοριστές τύπου, όπως **public****private**, **protected** (θα τον συναντήσουμε ​στην συνέχεια)+<color red><​πρ. πρόσβασης></​color>​ <color green><​επισττύπος></​color>​ <color magenta><​όνομα></​color>​ (<color orange><​λίστα ​περαμέτρων></​color>​) <color gray>​Exceptions</​color> ​**{**.....**}** 
-  - Τον τύπο της επιστρεφόμενης τιμής ή void εάν η μέθοδος δεν επιστρέφει κάτι. + 
-  - Το όνομα της μεθόδου. Ισχύει και εδώ ο "​κανόνας"​ ότι τα ονομάτα ξεκινούν με μικρό γράμμα και εάν πρόκειται για ονόματα με περισσότερες από μία λέξεις αυτές χωρίζονται με κεφαλαία γράμματα. Η πρώτη λέξη κάθε μεθόδου ​θα πρέπει να είναι ρήμα. Μερικά παραδείγματα μπορείτε να δείτε παρακάτω:​+  - <color red>Προσδιοριστές πρόσβασης</​color>,​ όπως //public// ή //private//
 +  - <color green>Τον τύπο της επιστρεφόμενης τιμής</​color> ​ή void εάν η μέθοδος δεν επιστρέφει κάτι. 
 +  - <color magenta>Το όνομα της μεθόδου</​color>​ 
 +  - <color orange>H λίστα των παραμέτρων</​color>​ μέσα σε παρένθεση,​ χωρισμένες με κόμμα. Κάθε παράμετρος εκτός από το όνομά της οφείλει να διαθέτει και τον τύπο της, π.χ. int speed ή double latitude. Εάν δεν υπάρχουν παράμετροι το περιεχόμενο των παρενθέσεων είναι κενό. 
 +  - Μία σειρά από <color gray>​Exceptions</​color>​ (θα συζητηθούν αργότερα). 
 +  - Το κυρίως σώμα της μεθόδου,​ το οποίο περιέχεται μέσα σε αγκύλες **{}**. 
 + 
 +===== Κανόνες ονοματολογίας ===== 
 + 
 +Ισχύει και εδώ ο "​κανόνας"​ ότι τα ονόματα ξεκινούν με μικρό γράμμα και εάν πρόκειται για ονόματα με περισσότερες από μία λέξεις αυτές χωρίζονται με κεφαλαία γράμματα. Η πρώτη λέξη κάθε μεθόδου ​συνιστάται να είναι ρήμα. Μερικά παραδείγματα μπορείτε να δείτε παρακάτω:​
     - run     - run
     - runFast     - runFast
Line 13: Line 22:
     - setLatitude     - setLatitude
     - isEmpty     - isEmpty
-  - H λίστα των παραμέτρων μέσα σε παρένθεση,​ χωρισμένες με κόμμα. Κάθε παράμετρος εκτός από τον τύπο της οφείλει να διαθέτει και τον προσδιοριστή τύπου της, π.χ. ''​int speed''​ ή ''​double latitude''​. Εάν δεν υπάρχουν παράμετροι το περιεχόμενο των παρανθέσεων είναι κενό. 
-  - Μία σειρά από Exceptions (θα συζητηθούν αργότερα). 
-  - Το κυρίως σώμα της μεθόδου,​ το οποίο περιέχεται μέσα σε αγκύλες. 
  
-Παρακάτω ​δίνεται τυπικά παραδείγματα ​μεθόδων+===== Παραδείγματα μεθόδων ===== 
 + 
 +Δείτε το παρακάτω παράδειγμα ​από ​την κλάση **Rectangle** που ​αναπαριστά το ορθογώνιο παραλληλόγραμμο.
  
 <code java> <code java>
-    ​public int getCadence() { +public class Rectangle { 
-        ​return cadence+  ​public int width; 
-    }+  public int height; 
 + 
 +  public Rectangle(int initWidth, int initHeight) { 
 +    width = initWidth
 +    ​height = initHeight;​ 
 +  ​}
    
-    ​public void setCadence(int newValue) { +  ​public void setWidth(int newWidth ​) { width newWidth; }  
-        cadence ​newValue; +  public ​void setHeight(int newHeight ​) { height = newHeight; }  
-    ​+  public ​int getWidth() { return width 
-  +  public int getHeight() { return ​height }  
-    ​public int getGear() { +  public void resize(int dw, int dh) {                                                     ​ 
-        return gear; +    width +dwheight += dh;  ​ 
-    ​+  
-  +  public ​int getArea() { return width * height} 
-    ​public ​void setGear(int newValue) { +} 
-        gear = newValue; +
-    ​+
-  +
-    ​public int getSpeed() { +
-        ​return ​speed; +
-    ​+
-  +
-    ​public void applyBrake(int decrement) { +
-        speed -decrement+
-    +
-  +
-    ​public ​void speedUp(int increment) { +
-        speed += increment+
-    }+
 </​code>​ </​code>​
 +
 +<WRAP important 80% center round>
 +Βασικό χαρακτηριστικό του Αντικειμενοστραφούς Προγραμματισμού είναι ότι οι μέθοδοι της κλάσης έχουν απευθείας πρόσβαση στα πεδία της κλάσης. Στο παραπάνω παράδειγμα,​ οι μέθοδοι **setWidth** και **getWidth** έχουν απευθείας πρόσβαση στο πεδίο **width** της κλάσης και οι μέθοδοι **setHeight** και **getHeight** έχουν απευθείας πρόσβασης στο πεδιό **height** της κλάσης. Επίσης,​ η μέθοδος **resize** έχει πρόσβαση στα πεδία **width** και **height**.
 +</​WRAP>​
  
 ===== Υπερφόρτωση (overloading) των μεθόδων μίας κλάσης ===== ===== Υπερφόρτωση (overloading) των μεθόδων μίας κλάσης =====
  
-Βασικό χαρακτηριστικό του Αντικειμενοστραφούς Προγραμματισμού είναι η υπερφόρτωση των μεθόδων ​(ή συναρτήσεων). Με τον όρο υπερφόρτωση εννοούμε την δυνατότητα που μας δίνει ο Αντικειμενοστραφής Προγραμματισμός να ορίσουμε σε μία κλάση δύο μεθόδους με το ίδιο όνομα __αλλά διαφορετικά ορίσματα__. Τα ορίσματα μπορούν να διαφέρουν ​**α)** ​ως προς τον τύπο τους ​και **β)** ​ως προς τον αριθμό τους ​**γ)** ​ως προς την σειρά τους+Επιπλέον,​ βασικό χαρακτηριστικό του Αντικειμενοστραφούς Προγραμματισμού είναι η υπερφόρτωση των μεθόδων. Με τον όρο υπερφόρτωση εννοούμε την δυνατότητα που μας δίνει ο Αντικειμενοστραφής Προγραμματισμός να ορίσουμε σε μία κλάση δύο μεθόδους με το ίδιο όνομα __αλλά διαφορετικά ορίσματα__. Τα ορίσματα μπορούν να διαφέρουν ​ 
 +  - ως προς τον τύπο τους ​ 
 +  - ως προς τον αριθμό τους ​και 
 +  - ως προς την σειρά τους ​
  
-Ας υποθέσουμε ότι έχουμε την κλάση ​DrawChars ​από ένα υποθετικό πρόγραμμα ​εκτύπωσης ​χαρακτήρων στην οθόνη. Διαθέτουμε την μέθοδο ​draw η οποία διαθέτει διαφορετικές εκδόσεις ανάλογα με τι εκτυπώνεται κάθε φορά. Το ποια έκδοση χρησιμοποιείται σε κάθε κλήση της μεθόδου αποφασίζεται από τον compiler με βάση το είδος και τον αριθμό των ορισμάτων.+<WRAP tip 80% center round> 
 +Aν και ο compiler της Java αντιλαμβάνεται την διαφορά,​ δεν αποτελεί ορθή προγραμματιστική πρακτική να έχετε μεθόδους με τον ίδιο αριθμό και τύπο ορισμάτων,​ τα οποία όμως είναι διατεταγμένα με διαφορετική σειρά. 
 +</​WRAP>​ 
 + 
 +Ας υποθέσουμε ότι έχουμε την κλάση ​**SumNumbers** η οποία ​αποτελεί μέρος ενός υποθετικού προγράμματος άθροισης αριθμών. Διαθέτουμε την μέθοδο ​//​sum// ​η οποία διαθέτει διαφορετικές εκδόσεις αθροισμάτων. Το ποια έκδοση χρησιμοποιείται σε κάθε κλήση της μεθόδου αποφασίζεται από τον compiler με βάση το είδος και τον αριθμό των ορισμάτων.
  
 <code java> <code java>
-public class DrawChars ​{ +public class SumNumbers ​{
-    ... +
-    public void draw(String s) { +
-        ... +
-    } +
-    public void draw(int i) { +
-        ... +
-    } +
-    public void draw(double f) { +
-        ... +
-    } +
-    public void draw(int i, double f) { +
-        ... +
-    } +
-+
-</​code>​ +
- +
-Στην παραπάνω κλάση αν δεν είχαμε την δυνατότητα **υπερφόρτωσης** των μεθόδων της θα έπρεπε να κάνουμε κάτι σαν το παρακάτω,​ το οποίο καταλήγει σε αισθητικά άσχημο και λιγότερο συντηρίσιμο κώδικα.+
  
-<code c> +    ​public ​double sum(double []nums) ​
-public ​class DrawChars ​+        ​double sum = 0; 
-    ... +        for(double num : numssum += num; 
-    ​public void drawString(String s{ +        ​return sum;
-        ​...+
     }     }
-    public ​void drawInt(int i) { +    public ​double sum(double a, double b) { 
-        ​...+        ​return a+b;
     }     }
-    public ​void drawDoble(double ​f) { +    public ​double sum(double ​a, double b, double c) { 
-        ​...+        ​return a+b+c;
     }     }
-    public ​void drawIntDouble(int i, double ​f) { +    ​// sum double a, count times 
-        ​...+    ​public ​double sum(double ​a, int count) { 
 +        ​double sum = 0; 
 +        for(int i=0; i<count; i++) 
 +            sum += a; 
 +        return sum;
     }     }
 } }
 </​code>​ </​code>​
  
-<WRAP info> +|Προηγούμενο:​ [[:​java:​class_fields| Τα πεδία της κλάσης ​]] | [[:toc | Περιεχόμενα ​]] | Επόμενο:​ [[:java:class_constructors ​Κατασκευαστές της κλάσης ​]]|
-Ανάλογη με την υπερφόρτωση μεθόδων είναι και η υπερφόρτωση κατασκευαστών. Όπως μπορούμε να έχουμε πολλές μεθόδους με το ίδιο όνομα αλλά διαφορετικά ορίσματα,​ έτσι μπορούμε να έχουμε και πολλούς κατασκευαστές με διαφορετικά ορίσματα. Δείτε το παράδειγμα που ακολουθεί για την κλάση Bicycle της προηγούμενης παραγράφου. +
-</​WRAP>​ +
- +
-<code java Bicycle.java>​ +
- +
-public class Bicycle { +
-         +
-    private int cadence; +
-    private int gear; +
-    private int speed; +
-    public Coordinates coordinates;​ +
-         +
-    public Bicycle(int startCadence,​ int startSpeed, int startGear, double lat, double log) { +
-        coordinates = new Coordinates( lat, log); +
-        gear = startGear;​ +
-        cadence = startCadence;​ +
-        speed = startSpeed;​ +
-    } +
-     +
-    public Bicycle(int startCadence,​ int startSpeed, int startGear) { +
-        coordinates = new Coordinates( 0.0, 0.0); +
-        gear = startGear;​ +
-        cadence = startCadence;​ +
-        speed = startSpeed;​ +
-    } +
-         +
-    public int getCadence() { +
-        return cadence; +
-    } +
-         +
-    public void setCadence(int newValue) { +
-        cadence = newValue; +
-    } +
-         +
-    public int getGear() { +
-        return gear; +
-    } +
-         +
-    public void setGear(int newValue) { +
-        gear = newValue; +
-    } +
-         +
-    public int getSpeed() { +
-        return speed; +
-    } +
-         +
-    public void applyBrake(int decrement) { +
-        speed -= decrement;​ +
-    } +
-         +
-    public void speedUp(int increment) { +
-        speed += increment;​ +
-    } +
-     +
-    public Coordinates get_coordinates() { +
-        return coordinates;​ +
-    } +
-     +
-    public void setCoordinates(double lat, double log) { +
-        coordinates.setLatitude(lat);​ +
-        coordinates.setLongitude(log);​ +
-    } +
-+
-</​code>​ +
- +
- +
- +
-|Προηγούμενο:​ [[:​java:​class_fields| Τα πεδία της κλάσης ]] | Επόμενο:​ [[:java:objects ​Δημιουργώντας Αντικείμενα ​]]|+
  
java/class_methods.1442576319.txt.gz · Last modified: 2016/02/26 11:15 (external edit)