User Tools

Site Tools


java:inheritance

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:inheritance [2020/02/24 04:15]
gthanos [Κληρονομικότητα]
java:inheritance [2021/04/02 14:19]
gthanos
Line 5: Line 5:
 Κάθε κλάση που κληρονομεί από μία άλλη κλάση ονομάζεται υποκλάση (//subclass//) της γονικής κλάσης από την οποία κληρονομεί. Αντίστοιχα, η γονική κλάση ονομάζεται υπερκλάση (//superclass//) της κληρονομούμενης κλάσης. Κάθε κλάση που κληρονομεί από μία άλλη κλάση ονομάζεται υποκλάση (//subclass//) της γονικής κλάσης από την οποία κληρονομεί. Αντίστοιχα, η γονική κλάση ονομάζεται υπερκλάση (//superclass//) της κληρονομούμενης κλάσης.
  
-{{  :java:super_sub_class.jpg  | }}+{{  :java:inheritance-1.png  | }}
  
-Όπως φαίνεται και στο παραπάνω σχήμα μία κλάση (//subclass//) μπορεί να κληρονομεί __**ΜΟΝΟ ΜΙΑ**__ άλλη κλάση. Αντίστροφα μία κλάση (//superclass//) μπορεί να κληρονομείται από πολλές διαφορετικές κλάσεις. Παρακάτω δίνουμε ένα παράδειγμα κληρονομικότητας από το site της [[https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html|Oracle]], όπου η κλάση ''MountainBike'' αποτελεί εξειδίκευση της κλάσης ''Bicycle''.+Όπως φαίνεται και στο παραπάνω σχήμα μία κλάση (//subclass//) μπορεί να κληρονομεί __**ΜΟΝΟ ΜΙΑ**__ άλλη κλάση. Αντίστροφα μία κλάση (//superclass//) μπορεί να κληρονομείται από πολλές διαφορετικές κλάσεις. Παρακάτω δίνουμε ένα παράδειγμα κληρονομικότητας ως συνέχεια των προηγούμενων ενοτήτων. Ορίζουμε την κλάση ''BasicRectangle'' η οποία αποτελεί το απλό ορθογώνιο παραλληλόγραμμο που γνωρίσαμε στην αρχή και την κλάση ''Rectangle'' που αποτελεί εξειδίκευση της κλάσης ''BasicRectangle'' ορίζοντας επιπλέον το πεδίο ''origin''.
  
-<code java Bicycle.java> +<code java BasicRectangle.java> 
-public class Bicycle { +public class BasicRectangle {
-         +
-    private int cadence; +
-    private int gear; +
-    private int speed; +
-        +
-    public Bicycle(int startCadence, int startSpeed, int startGear) { +
-        gear = startGear; +
-        cadence = startCadence; +
-        speed = startSpeed; +
-    }+
          
-    public int getCadence() { +  int width; 
-          return cadence+  int height; 
-    }+  
 +  public BasicRectangle(int initWidth, int initHeight) { 
 +    width = initWidth
 +    height = initHeight; 
 +  } 
 + 
 +  public void setWidth(int newWidth ) { 
 +    width = newWidth; 
 +  }
          
-    public int getGear() { +  public void setHeight(int newHeight ) { 
-          return gear+    height = newHeight; 
-    }+  } 
 +   
 +  public int getWidth() { 
 +    return width
 +  }
          
-    public int getSpeed() { +  public int getHeight() { 
-          return speed+    return height; 
-    }+  } 
 +   
 +  int area() { 
 +    return width * height; 
 +  } 
 +   
 +  public String toString() { 
 +    return "width: "+width+", height: "+height; 
 +  } 
 +
 +</code>
  
-    public void setCadence(int newValue) { +<code java Point.java> 
-        cadence newValue+class Point { 
-    } +  int x;   // x coordinate 
-         +  int y;   // y coordinate 
-    public void setGear(int newValue) { +   
-        gear newValue+  public Point(int xPos, int yPos) { 
-    +    xPos
-         +    y = yPos; 
-    public void applyBrake(int decrement) { +  
-        speed -decrement+   
-    +  int getX() { 
-         +    return x; 
-    public void speedUp(int increment) { +  } 
-        speed += increment+   
-    } +  void setX(int xPos) { 
-        +    xPos
 +  
 +   
 +  int getY() { 
 +    return y; 
 +  } 
 +   
 +  void setY(int yPos) { 
 +    yPos
 +  
 +   
 +  public String toString() { 
 +    return "("+x+","+y+")"
 +  }
 } }
 </code> </code>
  
-<code java MountainBike.java> +<code java Rectangle.java> 
-public class MountainBike extends Bicycle { +public class Rectangle extends BasicRectangle {
- +
-    private 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; +
-    }+
          
-    public int getSeatHeight() { +  Point origin; 
-        return seatHeight+     
-    }+  public Rectangle(int initWidth, int initHeight, Point initOrigin) { 
 +    super(initWidth, initHeight); 
 +    origin = initOrigin; 
 +  } 
 +   
 +  public Rectangle(int initWidth, int initHeight, int originX, int originY) { 
 +    super(initWidth, initHeight); 
 +    origin = new Point(originX,originY); 
 +  } 
 +     
 +  public void setOrigin(Point newOrigin) { 
 +    origin = newOrigin; 
 +  } 
 +   
 +  public Point getOrigin() { 
 +    return origin; 
 +  } 
 +    
 +  // Move rectangle origin by dx,dy 
 +  public void moveOrigin(int dx, int dy) { 
 +    origin.setX( origin.getX() + dx ); 
 +    origin.setY( origin.getY() + dy ); 
 +  } 
 +   
 +  public String toString() { 
 +    String str = origin.toString() + " "; 
 +    str = str + super.toString(); 
 +    return str; 
 +  }
 } }
 </code> </code>
  
 <WRAP tip 80% center round> <WRAP tip 80% center round>
 +
 === Παρατηρήσεις === === Παρατηρήσεις ===
  
-  * Η κλάση Bicycle έχει τα τρία πεδία cadencegear και speed ενώ η κλάση MountainBike διαθέτει τα πεδία αυτά και επιπλέον το πεδίο seatHeight. +  * Η κλάση //BasicRectangle// έχει τα πεδία //width, height//, ενώ η κλάση //Rectangle// διαθέτει τα πεδία αυτά και επιπλέον το πεδίο //origin//
-  * Επειδή τα παραπάνω τρία πεδία είναι private η ανάγνωση/εγγραφή σε αυτά γίνεται μέσω των αντίστοιχων public μεθόδων getCadence, getGear, getSpeed, setCadence, setGear, applyBreak, speedUp+  * Βασικό χαρακτηριστικό της κληρονομικότητας είναι ότι η κληρονομούμενη κλάση έχει όλα τα  χαρακτηριστικά της γονικής κλάσης. Υπό αυτή την έννοια, τα αντικείμενα της κλάσης //Rectangle// είναι και του τύπου //BasicRectangle//
-  * Βασικό χαρακτηριστικό της κληρονομικότητας είναι ότι η κληρονομούμενη κλάση έχει όλα τα public χαρακτηριστικά της γονικής κλάσης. Mε άλλα λόγια η κλάση MountainBike είναι και Bicycle.+  * Παρατηρήστε τη δεσμευμένη λέξη //super// ως πρώτη εντολή του κάθε κατασκευαστή. Μέσω της κλήσης //super// καλείται ο κατασκευαστής της γονικής κλάσης.
 </WRAP> </WRAP>
 ===== Προσβασιμότητα των κληρονομούμενων πεδίων ===== ===== Προσβασιμότητα των κληρονομούμενων πεδίων =====
java/inheritance.txt · Last modified: 2022/03/11 05:21 by gthanos