Οντοκεντρικόσ Προγραμματιςμόσ Ενότθτα 2: Η ΓΛΩΣΣΑ JAVA Κληρονομικότητα Ιωάννησ Χατζηλυγεροφδησ Πολυτεχνικι Σχολι Τμιμα Μθχανικϊν Η/Υ & Πλθροφορικισ
ΚΛΗΡΟΝΟΜΙΚΟΣΗΣΑ
ΚΛΗΡΟΝΟΜΙΚΟΣΗΣΑ Μθχανιςμόσ υλοποίθςθσ των ςχζςεων γενίκευςθσ/εξειδίκευςθσ μεταξφ κλάςεων Η ςχζςθ εξειδίκευςθσ «υποκλάςθ-τθσ» (subclass-of) είναι γνωςτι ςαν ςχζςθ «είναι ζνα» (isa) ι «είναι ζνα είδοσ» (ako: a kind of) Σχετίηεται με τθ ςχεδίαςθ του προγράμματοσ Πλεονζκτθμα: αφξθςθ επαναχρθςιμοποίθςθσ 3/26
ΑΠΛΗ ΚΛΗΡΟΝΟΜΙΚΟΣΗΣΑ Μια κλάςθ είναι υποκλάςη μιασ μόνο κλάςθσ Η κλάςθ (υποκλάςθ) κλθρονομεί μεταβλθτζσ και μεκόδουσ από τθν (άμεςθ) υπερκλάςη τθσ και τισ (ζμμεςεσ) υπερκλάςεισ αυτισ Η ιεραρχία/δζντρο κλάςεων ονομάηεται και ιεραρχία/ δζντρο κλθρονομικότθτασ. Η ρίηα του δζντρου ονομάηεται βαςικθ κλάςη (base class) Σ ζνα πρόγραμμα ςυνικωσ ζχουμε περιςςότερεσ από μια βαςικζσ κλάςεισ, επομζνωσ και δζντρα κλθρονομικότθτασ Όλεσ οι βαςικζσ κλάςεισ είναι υποκλάςεισ τθσ κλάςθσ Object 4/26
ΠΑΡΑΔΕΙΓΜΑ Object Shape Βαςικι κλάςθ Rectangle Ellipse Triangle Object Circle Shape Rectangle Ellipse Triangle Circle 5/26
ΠΡΟΘΗΚΗ ΝΕΑ ΚΛΑΗ: ΥΧΡΙ ΑΝΑΔΟΜΗΗ ΙΕΡΑΡΥΙΑ A Α,Κ +B,C +D +K +E +F Προςκικθ μιασ κλάςθσ με χαρακτθριςτικά Α, Κ 6/26
ΠΡΟΘΗΚΗ ΝΕΑ ΚΛΑΗ: ΜΕ ΑΝΑΔΟΜΗΗ ΙΕΡΑΡΥΙΑ (1) A Α, Β, Κ +B,C +D +Β,Κ +E +F Πολλαπλι αναπαράςταςθ τθσ ίδιασ πλθροφορίασ Προςκικθ μιασ κλάςθσ με χαρακτθριςτικά Α, Β, Κ 7/26
ΠΡΟΘΗΚΗ ΝΕΑ ΚΛΑΗ: ΜΕ ΑΝΑΔΟΜΗΗ ΙΕΡΑΡΥΙΑ (2) A Α, Β, Κ +B,C +D A +E +F +B +D Απαιτείται αναδόμθςθ τθσ ιεραρχίασ +E +C +K +F Η κλάςθ αυτι λόγω κλθρονομικότθτασ ζχει ωσ χαρακτθριςτικά Α, Β, Κ 8/26
ΔΗΛΧΕΙ ΥΕΕΧΝ ΙΕΡΑΡΥΙΑ <προζδ. κλάζης> class <όνομα κλαζης> [extends <όνομα κλάζης>] { <δηλώζεις μεηαβληηών> <δηλώζεις δημιοσργών> <δηλώζεις μεθόδων> } υπερκλάςθ 9/26
ΠΑΡΑΔΕΙΓΜΑ public class Circle { protected double x, y, r ; public Circle (double x, double y, double r) {this.x=x; this.y=y; this.r = r ;} public double area ( ) {return 3.1416*r*r ;} } public class GraphicCircle extends Circle{ Color outline, fill ; public void draw ( ) { } } 10/26
ΠΟΛΤΜΟΡΦΙΜΟ Το γεγονόσ ότι ο αποςτολζασ ενόσ μθνφματοσ δεν χρειάηεται να γνωρίηει τθν κλάςθ του παραλιπτθ (ςτιγμιοτφπου) Το γεγονόσ ότι μια λειτουργία μπορεί να υλοποιθκεί με το ίδιο όνομα αλλά με διαφορετικό περιεχόμενο (τρόπο λειτουργίασ) ςε διαφορετικζσ κλάςεισ. 11/26
ΤΠΕΡΦΟΡΣΧΗ-ΤΠΕΡΚΑΛΤΦΗ ΜΕΘΟΔΧΝ Είναι δυνατι θ φπαρξθ μεκόδων με το ίδιο όνομα, αλλά διαφορετικά ορίςματα (είτε ωσ προσ τον τφπο είτε ωσ προσ τον αρικμό) ςτθν ίδια ι διαφορετικι κλάςθ (υπερφόρτωςη μειόδων-method overloading). Κάκε μζκοδοσ (μεταβλθτι) χαμθλότερα ςτθν ιεραρχία υπερκαλφπτει (επιςκιάηει) κάκε ίδια μζκοδο (μεταβλθτι) που βρίςκεται υψθλότερα ςτθν ιεραρχία (method overriding/variable shadowing). 12/26
ΑΦΗΡΗΜΕΝΕ Ή ΑΦΑΙΡΕΣΙΚΕ ΚΛΑΕΙ Κλάςεισ που χρειάηονται ςτο ςχεδιαςμό (κυρίωσ ςτα ανϊτερα επίπεδα ιεραρχίασ), αλλά δεν αναφζρονται ςε πραγματικά ςτιγμιότυπα/οντότθτεσ Μια αφαιρετικι κλάςθ περιζχει τουλάχιςτον μια αφαιρετικι μζκοδο (δθλ. μζκοδο χωρίσ ςϊμα) Η απόγονοσ μιασ αφαιρετικισ κλάςθσ δεν είναι αφαιρετικι αν ορίηει τα ςϊματα όλων των αφαιρετικϊν μεκόδων τθσ προγόνου τθσ 13/26
ΠΑΡΑΔΕΙΓΜΑ abstract class Shape {} class Rectangle extends Shape {} class Ellipse extends Shape {} class Triangle extends Shape {} class Circle extends Ellipse {} abstract class Shape { public abstract double area(); public abstract double circumference(); } 14/26
ΠΟΛΛΑΠΛΗ ΚΛΗΡΟΝΟΜΙΚΟΣΗΣΑ Μια κλάςθ είναι υποκλάςθ περιςςότερων τθσ μιασ κλάςθσ Μια κλάςθ (υποκλάςθ) κλθρονομεί μεταβλθτζσ και μεκόδουσ ταυτόχρονα από όλεσ τισ υπερκλάςεισ τθσ (άμεςεσ και ζμμεςεσ) Η Java δεν υποςτθρίηει πολλαπλι κλθρονομικότθτα με άμεςο τρόπο (μόνο ζμμεςα, μζςω των διεπαφϊν) 15/26
ΚΛΗΡΟΝΟΜΙΚΟΣΗΣΑ ΚΑΙ ΔΗΜΙΟΤΡΓΟΙ public class GraphicCircle extends Circle{ Color outline, fill ; public GraphicCircle (double x, double y, double r, Color outline, Color fill) { this.x = x; this.y=y; this.r=r; this.outline=outline; this.fill=fill; } public class GraphicCircle extends Circle{ Color outline, fill ; public GraphicCircle (double x, double y, double r, Color outline, Color fill) { super(x, y, r); this.outline=outline; this.fill=fill; } 16/26
ΛΕΞΗ-ΚΛΕΙΔΙ SUPER (1) Σε κάκε δθμιουργό ειςάγεται από το ςφςτθμα ςαν πρϊτθ πρόταςθ ςτο ςϊμα του θ πρόταςθ super();, εφ όςον δεν υπάρχει άλλθ πρόταςθ super. Η πρόταςθ super(); καλεί τον εξ οριςμοφ δθμιουργό τθσ (άμεςθσ) υπερκλάςθσ τθσ κλάςθσ του δθμιουργοφ και μετά εκτελείται το (υπόλοιπο) ςϊμα του δθμιουργοφ. Η κλιςθ του εξ οριςμοφ δθμιουργοφ δεν ζχει κανζνα ουςιαςτικό αποτζλεςμα και δεν μασ απαςχολεί, εκτόσ αν ζχουμε ορίςει εμείσ δθμιουργό χωρίσ ορίςματα ςτθν υπερκλάςθ, οπότε καλείται αυτόσ. 17/26
ΠΑΡΑΔΕΙΓΜΑ class Parent{ public Parent () { System.out.println ("Hello Parent");}} class Child extends Parent { String message = "No Child"; public Child (String message) { this.message = message; System.out.println (message);}} Τι αποτζλεςμα κα ζχει θ Child c = new Child("First Child"); 1. Εκτφπωςθ: Hello Parent (λόγω ζμμεςου super();) 2. Ανάκεςθ: First Child ςτθν message του c (λόγω ) 3. Εκτφπωςθ: First Child (λόγω ) 18/26
ΛΕΞΗ-ΚΛΕΙΔΙ SUPER (2) Η χριςθ τθσ super δεν αφορά μόνο τουσ δθμιουργοφσ, αλλά και τισ μεκόδουσ Μζςω τθσ super μποροφμε να καλζςουμε απ ευκείασ μια μζκοδο τθσ υπερκλάςθσ μιασ κλάςθσ: super.<όνομα-μεθόδοσ>(<παράμετροι>); Επίςθσ, μποροφμε να καλζςουμε απ ευκείασ μια μεταβλθτι τθσ υπερκλάςθσ: super.<όνομα-μεταβλητής>; Η δυνατότθτα αυτι μπορεί να χρθςιμοποιθκεί για να καλζςουμε επικαλυπτόμενεσ μεκόδουσ ι μεταβλθτζσ. 19/26
ΠΑΡΑΔΕΙΓΜΑ class A{ public int x=1; public int f1( ) {return x;}} class B extends A { επικάλυψθ τθσ public int x; public int f1( ){ x=2*super.x; return (super.f1( )+x);}} επικάλυψθ τθσ τθσ Α (χριςθ επικαλυπτόμενθσ μεκόδου ςτο ςϊμα τθσ επικαλφπτουςασ) 20/26
Χρθματοδότθςθ Το παρόν εκπαιδευτικό υλικό ζχει αναπτυχκεί ςτo πλαίςιo του εκπαιδευτικοφ ζργου του διδάςκοντα. Το ζργο «Ανοικτά Ακαδημαϊκά Μαιθματα ςτο Πανεπιςτθμιο Αιηνών» ζχει χρθματοδοτιςει μόνο τθν αναδιαμόρφωςθ του εκπαιδευτικοφ υλικοφ. Το ζργο υλοποιείται ςτο πλαίςιο του Επιχειρθςιακοφ Προγράμματοσ «Εκπαίδευςθ και Δια Βίου Μάκθςθ» και ςυγχρθματοδοτείται από τθν Ευρωπαϊκι Ζνωςθ (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εκνικοφσ πόρουσ. 21/26
Σθμείωμα Ιςτορικοφ Εκδόςεων Ζργου Το παρόν ζργο αποτελεί τθν ζκδοςθ 1.0. 22/26
Σθμείωμα Αναφοράσ Copyright: Πανεπιςτιμιον Πατρϊν, Ιωάννθσ Χατηθλυγεροφδθσ, 2015. «Οντοκεντρικόσ Προγραμματιςμόσ». Ζκδοςθ: 1.0. Πάτρα 2015. Διακζςιμο από τθ δικτυακι διεφκυνςθ: https://eclass.upatras.gr/courses/ceid1105/ 23/26
Σθμείωμα Αδειοδότθςθσ Το παρόν υλικό διατίκεται με τουσ όρουσ τθσ άδειασ χριςθσ Creative Commons Αναφορά, Μθ Εμπορικι Χριςθ Παρόμοια Διανομι 4.0 *1+ ι μεταγενζςτερθ, Διεκνισ Ζκδοςθ. Εξαιροφνται τα αυτοτελι ζργα τρίτων π.χ. φωτογραφίεσ, διαγράμματα κ.λ.π., τα οποία εμπεριζχονται ςε αυτό και τα οποία αναφζρονται μαηί με τουσ όρουσ χριςθσ τουσ ςτο «Σθμείωμα Χριςθσ Ζργων Τρίτων». [1] http://creativecommons.org/licenses/by-nc-sa/4.0/ Ωσ Μη Εμπορικθ ορίηεται θ χριςθ: που δεν περιλαμβάνει άμεςο ι ζμμεςο οικονομικό όφελοσ από τθν χριςθ του ζργου, για το διανομζα του ζργου και αδειοδόχο που δεν περιλαμβάνει οικονομικι ςυναλλαγι ωσ προχπόκεςθ για τθ χριςθ ι πρόςβαςθ ςτο ζργο που δεν προςπορίηει ςτο διανομζα του ζργου και αδειοδόχο ζμμεςο οικονομικό όφελοσ (π.χ. διαφθμίςεισ) από τθν προβολι του ζργου ςε διαδικτυακό τόπο Ο δικαιοφχοσ μπορεί να παρζχει ςτον αδειοδόχο ξεχωριςτι άδεια να χρθςιμοποιεί το ζργο για εμπορικι χριςθ, εφόςον αυτό του ηθτθκεί.
Διατιρθςθ Σθμειωμάτων Οποιαδιποτε αναπαραγωγι ι διαςκευι του υλικοφ κα πρζπει να ςυμπεριλαμβάνει: το Σθμείωμα Αναφοράσ το Σθμείωμα Αδειοδότθςθσ τθ διλωςθ Διατιρθςθσ Σθμειωμάτων το Σθμείωμα Χριςθσ Ζργων Τρίτων (εφόςον υπάρχει) μαηί με τουσ ςυνοδευόμενουσ υπερςυνδζςμουσ. 25/26
Σθμείωμα Χριςθσ Ζργων Τρίτων 26/26