This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
|
java:inheritance [2016/02/15 04:44] gthanos |
java:inheritance [2021/03/09 07:55] gthanos |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Κληρονομικότητα ====== | ====== Κληρονομικότητα ====== | ||
| - | Βασικό χαρακτηριστικό του αντικειμενοστραφούς προγραμματισμού είναι η δυνατότητα να παράγουμε νέες κλάσεις με βάση υφιστάμενες κλάσεις, εξειδικεύοντας και επεκτείνοντας τα χαρακτηριστικά τους. Η διαδικασία επέκτασης των υφιστάμενων κλάσεων σε νέες ειδικότερες κλάσεις ονομάζεται κληρονομικότητα. | + | Βασικό χαρακτηριστικό του αντικειμενοστραφούς προγραμματισμού είναι η δυνατότητα να παράγουμε νέες κλάσεις με βάση υφιστάμενες, |
| Κάθε κλάση που κληρονομεί από μία άλλη κλάση ονομάζεται υποκλάση (// | Κάθε κλάση που κληρονομεί από μία άλλη κλάση ονομάζεται υποκλάση (// | ||
| - | {{ :java:super_sub_class.jpg | }} | + | {{ :java:inheritance-1.png | }} |
| - | Όπως φαίνεται και στο παραπάνω σχήμα μία κλάση (// | + | Όπως φαίνεται και στο παραπάνω σχήμα μία κλάση (// |
| - | <code java Bicycle.java> | + | <code java BasicRectangle.java> |
| - | public | + | class BasicRectangle |
| - | + | ||
| - | private int cadence; | + | |
| - | private int gear; | + | |
| - | private int speed; | + | |
| - | + | ||
| - | public Bicycle(int startCadence, | + | |
| - | gear = startGear; | + | |
| - | cadence = startCadence; | + | |
| - | speed = startSpeed; | + | |
| - | } | + | |
| | | ||
| - | public | + | |
| - | | + | int height; |
| - | } | + | |
| + | public BasicRectangle(int initWidth, int initHeight) { | ||
| + | width = initWidth; | ||
| + | | ||
| + | } | ||
| + | |||
| + | void setWidth(int newWidth ) { | ||
| + | width = newWidth; | ||
| + | | ||
| | | ||
| - | public | + | void setHeight(int newHeight ) { |
| - | return | + | height = newHeight; |
| - | } | + | } |
| + | |||
| + | | ||
| + | return | ||
| + | } | ||
| | | ||
| - | public | + | |
| - | return | + | return |
| - | } | + | } |
| + | |||
| + | int area() { | ||
| + | | ||
| + | | ||
| - | 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; | ||
| - | } | ||
| - | | ||
| } | } | ||
| </ | </ | ||
| - | <code java MountainBike.java> | + | <code java Point.java> |
| - | public | + | class Point { |
| - | + | int x; // x coordinate | |
| - | | + | int y; // y coordinate |
| + | |||
| + | public Point(int xPos, int yPos) { | ||
| + | | ||
| + | y = yPos; | ||
| + | } | ||
| + | |||
| + | | ||
| + | return x; | ||
| + | } | ||
| + | |||
| + | void setX(int xPos) { | ||
| + | x = xPos; | ||
| + | } | ||
| + | |||
| + | int getY() { | ||
| + | return y; | ||
| + | } | ||
| + | |||
| + | void setY(int yPos) { | ||
| + | y = yPos; | ||
| + | } | ||
| + | |||
| + | public String toString() { | ||
| + | return " | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| - | // the MountainBike subclass has | + | <code java Rectangle.java> |
| - | // one constructor | + | class Rectangle extends BasicRectangle{ |
| - | public MountainBike(int startHeight, | + | |
| - | int startSpeed, int startGear) | + | |
| - | super(startCadence, | + | |
| - | seatHeight = startHeight; | + | |
| - | } | + | |
| - | + | ||
| - | // the MountainBike subclass has | + | |
| - | // one method | + | |
| - | public void setHeight(int newValue) { | + | |
| - | seatHeight = newValue; | + | |
| - | } | + | |
| | | ||
| - | | + | Point origin; |
| - | return | + | |
| - | } | + | |
| + | super(initWidth, initHeight); | ||
| + | origin = initOrigin; | ||
| + | } | ||
| + | |||
| + | public Rectangle(int initWidth, int initHeight, int originX, int originY) { | ||
| + | | ||
| + | origin = new Point(originX, | ||
| + | } | ||
| + | |||
| + | void setOrigin(Point newOrigin) { | ||
| + | origin = newOrigin; | ||
| + | } | ||
| + | |||
| + | Point getOrigin() { | ||
| + | | ||
| + | } | ||
| + | |||
| + | // Move rectangle origin by dx,dy | ||
| + | void moveOrigin(int dx, int dy) { | ||
| + | | ||
| + | origin.setY( origin.getY() + dy ); | ||
| + | | ||
| } | } | ||
| </ | </ | ||
| + | <WRAP tip 80% center round> | ||
| + | |||
| + | === Παρατηρήσεις === | ||
| + | |||
| + | * Η κλάση // | ||
| + | * Βασικό χαρακτηριστικό της κληρονομικότητας είναι ότι η κληρονομούμενη κλάση έχει όλα τα χαρακτηριστικά της γονικής κλάσης. Υπό αυτή την έννοια, | ||
| + | * Παρατηρήστε τη δεσμευμένη λέξη //super// ως πρώτη εντολή του κάθε κατασκευαστή. Μέσω της κλήσης //super// καλείται ο κατασκευαστής της γονικής κλάσης. | ||
| + | </ | ||
| ===== Προσβασιμότητα των κληρονομούμενων πεδίων ===== | ===== Προσβασιμότητα των κληρονομούμενων πεδίων ===== | ||
| Line 92: | Line 128: | ||
| * Να χρησιμοποιήσουμε τα πεδία της γονικής κλάσης στα οποία έχουμε πρόσβαση (public, protected, package-private στο ίδιο package). | * Να χρησιμοποιήσουμε τα πεδία της γονικής κλάσης στα οποία έχουμε πρόσβαση (public, protected, package-private στο ίδιο package). | ||
| * Να ορίσουμε νέα πεδία. | * Να ορίσουμε νέα πεδία. | ||
| - | * Να ορίσουμε νέα πεδία που να έχουν ίδιο όνομα με πεδία της γονικής κλάσης. Σε αυτή την περίπτωση " | ||
| * Να χρησιμοποιήσουμε τις μεθόδους της γονικής κλάσης στις οποίες έχουμε πρόσβαση (public, protected, package-private στο ίδιο package). | * Να χρησιμοποιήσουμε τις μεθόδους της γονικής κλάσης στις οποίες έχουμε πρόσβαση (public, protected, package-private στο ίδιο package). | ||
| * Μπορούμε να γράψουμε νέες στατικές ή μη στατικές μεθόδους για τη υποκλάση. | * Μπορούμε να γράψουμε νέες στατικές ή μη στατικές μεθόδους για τη υποκλάση. | ||
| Line 99: | Line 134: | ||
| * Μπορούμε να γράψουμε κατασκευαστές της υποκλάσης που χρησιμοποιούν κατασκευαστές της γονικής κλάσης. | * Μπορούμε να γράψουμε κατασκευαστές της υποκλάσης που χρησιμοποιούν κατασκευαστές της γονικής κλάσης. | ||
| - | |Προηγούμενο: | + | ===== ΔΕΝ συνιστάται να κάνουμε σε μία υποκλάση... ===== |
| + | * Να ορίσουμε νέα πεδία που να έχουν ίδιο όνομα με πεδία της γονικής κλάσης. Σε αυτή την περίπτωση " | ||
| + | |||
| + | |Προηγούμενο: | ||