User Tools

Site Tools


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
Next revision Both sides next revision
java:class_methods [2017/02/16 10:01]
gthanos [Μέθοδοι της Κλάσης]
java:class_methods [2022/02/22 10:49]
gthanos [Υπερφόρτωση (overloading) των μεθόδων μίας κλάσης]
Line 11: Line 11:
   - Μία σειρά από <color gray>Exceptions</color> (θα συζητηθούν αργότερα).   - Μία σειρά από <color gray>Exceptions</color> (θα συζητηθούν αργότερα).
   - Το κυρίως σώμα της μεθόδου, το οποίο περιέχεται μέσα σε αγκύλες **{}**.   - Το κυρίως σώμα της μεθόδου, το οποίο περιέχεται μέσα σε αγκύλες **{}**.
- 
  
 ===== Κανόνες ονοματολογίας ===== ===== Κανόνες ονοματολογίας =====
Line 23: Line 22:
     - setLatitude     - setLatitude
     - isEmpty     - isEmpty
-  - H λίστα των παραμέτρων μέσα σε παρένθεση, χωρισμένες με κόμμα. Κάθε παράμετρος εκτός από το όνομά της οφείλει να διαθέτει και τον τύπο της, π.χ. ''int speed'' ή ''double latitude''. Εάν δεν υπάρχουν παράμετροι το περιεχόμενο των παρενθέσεων είναι κενό. 
-  - Μία σειρά από Exceptions (θα συζητηθούν αργότερα). 
-  - Το κυρίως σώμα της μεθόδου, το οποίο περιέχεται μέσα σε αγκύλες. 
  
-Παρακάτω δίνονται τυπικά παραδείγματα μεθόδων:+===== Παραδείγματα μεθόδων ===== 
 + 
 +Με βάση παράδειγμα της προηγούμενης ενότητας για την κλάση **Rectangle** που αναπαριστά ένα ορθογώνιο παραλληλόγραμμο.
  
 <code java> <code java>
-  public void setWidth(int newWidth ) {+class Rectangle { 
 +     
 +  // the Rectangle class has 3 fields 
 +  int width; 
 +  int height; 
 +  Point origin; 
 +     
 +  // the Rectangle class has one constructor 
 +  public Rectangle(int initWidth, int initHeight, Point initOrigin) { 
 +    width = initWidth; 
 +    height = initHeight; 
 +    origin = initOrigin; 
 +  } 
 + 
 +  void setWidth(int newWidth ) {
     width = newWidth;     width = newWidth;
-  } 
-   
-  public int getWidth() { 
-    return width; 
   }   }
          
-  public void setHeight(int newHeight ) {+  void setHeight(int newHeight ) {
     height = newHeight;     height = newHeight;
-  } 
-   
-  public int getHeight() { 
-    return height; 
   }   }
          
-  public void setColor(int[] newColor) { +  Point getOrigin() { 
-    color = newColor;+    return origin;
   }   }
      
-  public int[] getColor() { +  void setOrigin(int newX, int newY) { 
-    return color+    origin.setX(newX); 
-  }+    origin.setY(newY)
 +  } 
      
-  public void setPoint(Point newOrigin) {+  void setOrigin(Point newOrigin) {
     origin = newOrigin;     origin = newOrigin;
   }   }
      
-  public Point getPoint() { +} 
-    return origin; +
-  }+
 </code> </code>
 +
 +<WRAP important 80% center round>
 +Βασικό χαρακτηριστικό του Αντικειμενοστραφούς Προγραμματισμού είναι ότι οι μέθοδοι της κλάσης έχουν απευθείας πρόσβαση στα πεδία της κλάσης. Στο παραπάνω παράδειγμα, οι μέθοδοι **setWidth** και **getWidth** έχουν απευθείας πρόσβαση στο πεδίο **width** της κλάσης και οι μέθοδοι **setHeight** και **getHeight** έχουν απευθείας πρόσβασης στο πεδιό **height** της κλάσης. Επίσης, η μέθοδος **resize** έχει πρόσβαση στα πεδία **width** και **height**.
 +</WRAP>
  
 ===== Υπερφόρτωση (overloading) των μεθόδων μίας κλάσης ===== ===== Υπερφόρτωση (overloading) των μεθόδων μίας κλάσης =====
  
-Βασικό χαρακτηριστικό του Αντικειμενοστραφούς Προγραμματισμού είναι η υπερφόρτωση των μεθόδων (ή συναρτήσεων). Με τον όρο υπερφόρτωση εννοούμε την δυνατότητα που μας δίνει ο Αντικειμενοστραφής Προγραμματισμός να ορίσουμε σε μία κλάση δύο μεθόδους με το ίδιο όνομα __αλλά διαφορετικά ορίσματα__. Τα ορίσματα μπορούν να διαφέρουν +Επιπλέον, βασικό χαρακτηριστικό του Αντικειμενοστραφούς Προγραμματισμού είναι η υπερφόρτωση των μεθόδων. Με τον όρο υπερφόρτωση εννοούμε την δυνατότητα που μας δίνει ο Αντικειμενοστραφής Προγραμματισμός να ορίσουμε σε μία κλάση δύο μεθόδους με το ίδιο όνομα __αλλά διαφορετικά ορίσματα__. Τα ορίσματα μπορούν να διαφέρουν 
   - ως προς τον τύπο τους    - ως προς τον τύπο τους 
   - ως προς τον αριθμό τους και   - ως προς τον αριθμό τους και
Line 74: Line 82:
 </WRAP> </WRAP>
  
-Ας υποθέσουμε ότι έχουμε την κλάση **DrawChars** η οποία αποτελεί μέρος ενός υποθετικού προγράμματος εκτύπωσης χαρακτήρων στην οθόνη του υπολογιστή. Διαθέτουμε την μέθοδο //draw// η οποία διαθέτει διαφορετικές εκδόσεις ανάλογα με τι εκτυπώνεται κάθε φορά. Το ποια έκδοση χρησιμοποιείται σε κάθε κλήση της μεθόδου αποφασίζεται από τον compiler με βάση το είδος και τον αριθμό των ορισμάτων.+Στο προηγούμενο παράδειγμα, έχουμε τις εξής δύο εκδόσεις της μεθόδου **setOrigin**:
  
 <code java> <code java>
-public class DrawChars { +  void setOrigin(Point newOrigin) { 
-    ... +    origin = newOrigin; 
-    public void draw(String s) { +  
-        ... +   
-    +  void setOrigin(int newX, int newY) { 
-    public void draw(int i) { +    origin.setX(newX); 
-        ... +    origin.setY(newY); 
-    } +  }
-    public void draw(double f{ +
-        ... +
-    } +
-    public void draw(int i, double f+
-        ... +
-    } +
-}+
 </code> </code>
  
-Στην παραπάνω κλάση αν δεν είχαμε την δυνατότητα **υπερφόρτωσης** των μεθόδων της θα έπρεπε να κάνουμε κάτι σαν το παρακάτω, το οποίο καταλήγει σε αισθητικά άσχημο και λιγότερο συντηρήσιμο κώδικα.+Παρατηρήστε ότι έχουμε δύο μεθόδους με το ίδιο όνομα, οι οποίες διαφοροποιούνται ως προς τον αριθμό και το είδος των ορισμάτων τους. __Ποια έκδοση χρησιμοποιείται σε κάθε κλήση της μεθόδου, αποφασίζεται από τον compiler με βάση το είδος και τον αριθμό των ορισμάτων__.
  
-<code c> +/* 
-public class DrawChars { +Ως επιπλέον παράδειγμαας υποθέσουμε ότι έχουμε την κλάση **SumNumbers** η οποία αποτελεί μέρος ενός υποθετικού προγράμματος άθροισης αριθμώνΔιαθέτουμε τις μέθόδους //sum// οι οποίες προσδιορίζουν διαφορετικές εκδόσεις αθροισμάτων μεταξύ ακεραίων ή αριθμών κινητής υποδιαστολής
-    ... +
-    public void drawString(String s) { +
-        ... +
-    } +
-    public void drawInt(int i) { +
-        ... +
-    } +
-    public void drawDouble(double f) { +
-        ... +
-    } +
-    public void drawIntDouble(int idouble f) { +
-        ..+
-    } +
-+
-</code>+
  
-==== Υπερφόρτωση κατασκευαστών ====+<code java SumNumbers.java> 
 +class SumNumbers {
  
-Ανάλογη με την υπερφόρτωση μεθόδων είναι και η υπερφόρτωση κατασκευαστών. Όπως μπορούμε να έχουμε πολλές μεθόδους με το ίδιο όνομα αλλά διαφορετικά ορίσματα, έτσι μπορούμε να έχουμε και πολλούς κατασκευαστές με διαφορετικά ορίσματα. Δείτε το παράδειγμα που ακολουθεί για την κλάση Rectangle της προηγούμενης ενότητας. Στο παράδειγμα αυτό η κλάση διαθέτει τους παρακάτω δύο κατασκευαστές +  static double sum(double []nums) { 
- +    double sum = 0
-<code java> +    for(double num : nums)  
-public Rectangle(int initWidth, int initHeight, Point initOrigin)+      sum +num
-public Rectangle(int initWidth, int initHeight, int xPos, int yPos); +    return sum;
-</code> +
- +
- +
-<code java Rectangle.java> +
-public class Rectangle +
-     +
-  // the Rectangle class has 3 fields +
-  private int width; +
-  private int height; +
-  private Point origin+
-     +
-  // the Rectangle class has two constructors +
-  public Rectangle(int initWidth, int initHeight, Point initOrigin{ +
-    width initWidth+
-    height = initHeight; +
-    origin = initOrigin;+
   }   }
      
-  public Rectangle(int initWidthint initHeight, int xPos, int yPos) { +  static double sum(double adouble b) { 
-    width = initWidth; +    return a+b;
-    height = initHeight; +
-    origin = new Point(xPos,yPos); +
-  } +
-     +
-  // the Rectangel class has 3 methods +
-  public void setWidth(int newWidth ) { +
-    width = newWidth;+
   }   }
      
-  public int getWidth() { +  static double sum(double a, double b, double c) { 
-    return width; +    return a+b+c;
-  } +
-     +
-  public void setHeight(int newHeight ) { +
-    height = newHeight;+
   }   }
      
-  public int getHeight() { +  // sum double a, count times 
-    return height;+  static double sum(double a, int count) { 
 +    double sum = 0; 
 +    for(int i=0; i<count; i++) 
 +      sum += a; 
 +    return sum;
   }   }
      
-  public void setOrigin(Point newOrigin) { +  public static void main(String [] args) { 
-    origin newOrigin;+    double s1 sum(4.5, 2.3); 
 +    double s2 = sum(4.5, 2.3, 1.1); 
 +    double s3 = sum(4.5, 2); 
 +    System.out.println(s1); 
 +    System.out.println(s2); 
 +    System.out.println(s3);
   }   }
-   
-  public Point getOrigin() { 
-    return origin; 
-  }    
 } }
 </code> </code>
  
 +<WRAP tip 80% center round>
 +Κατευάστε και εκτελέστε την παρακάτω συνάρτηση γράφοντας στο τερματικό σας:
 +<code>
 +javac SumbNumbers.java
 +java SumNumbers
 +</code>
 +Προς το παρόν αγνοήστε τους προσδιοριστές static που μπαίνουν μπροστά από κάθε συνάρτηση.
 +</WRAP>
  
 +*/
  
 |Προηγούμενο: [[:java:class_fields| Τα πεδία της κλάσης ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:class_constructors | Κατασκευαστές της κλάσης ]]| |Προηγούμενο: [[:java:class_fields| Τα πεδία της κλάσης ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:class_constructors | Κατασκευαστές της κλάσης ]]|
  
java/class_methods.txt · Last modified: 2022/02/23 10:00 by gthanos