ΕΠΛ233 Επαναχρησιμοποίηση Κλάσεων

Σχετικά έγγραφα
Κληρονομικότητα. Επαναχρησιμοποίηση Κλάσεων. Σύνθεση (παράδειγμα) Σύνθεση. χειριστήρια άλλων κλάσεων.

Διδάσκων: Παναγιώτης Ανδρέου

Παράδειγμα Σύνθεσης: Class Name

ΕΠΛ233 Βιβλιοθήκες και Προσδιοριστές Πρόσβασης στην JAVA

Κλάσεις και Αντικείµενα

Αντικειµενοστρεφής Προγραµµατισµός


Διάλεξη 16-17: Πολυμορφισμός (Polymorphism) Διδάσκων: Παναγιώτης Ανδρέου

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #12

ΕΠΛ233 ΠΛΗΡΟΦΟΡΙΑ ΤΥΠΟΥ. Type Information. Μ. Δικαιάκος

2.1 Αντικειµενοστρεφής προγραµµατισµός

Κληρονομικότητα. Παύλος Εφραιμίδης pefraimi <at> ee.duth.gr. Java Κληρονομικότητα 1

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

Αντικειμενοστρεφής Προγραμματισμός

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

class object Database Database Item Item [sub-typing and polymorphism] MusicCD Video MusicCD Video

Υπερφόρτωση (Overloading) Υπέρβαση (Overriding) - Upcasting Downcasting Final classes, methods

Αντικειμενοστρέφεια. Henri Matisse, Harmony in Red, Κωστής Σαγώνας Νίκος Παπασπύρου

Οντοκεντρικός Προγραμματισμός ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

Διδάσκων: Παναγιώτης Ανδρέου

Παύλος Εφραιµίδης. Java. Κληρονοµικότητα

Αντικειμενοστρεφής Προγραμματισμός

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Εργαστήριο 02: Προγραμματισμός με Γενικούς Τύπους (JAVA Generics) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι

Κληρονομικότητα. Κληρονομικότητα (inheritance) είναι ο τρόπος µε τον οποίο μία τάξη μπορεί να κληρονομήσει ιδιότητες και συμπεριφορά από άλλες τάξεις.

Ειδικά Θέματα Προγραμματισμού

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors

ΕΠΛ233 ΔΙΑΠΡΟΣΩΠΕΙΕΣ

Αντικειμενοστρεφής Προγραμματισμός

Οντοκεντρικός Προγραμματισμός

Κλάσεις. Τροποποιητές, ιασυνδέσεις, Πακέτα. Τροποποιητές ελέγχου προσπέλασης µεταβλητών και µεθόδων

Μέθοδοι. Μέθοδοι ηµιουργοί, Υπερφόρτωση και Υπέρβαση Μεθόδων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

Οντοκεντρικός Προγραμματισμός ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

ΕΠΛ233 ΠΟΛΥΜΟΡΦΙΣΜΟΣ

Διάλεξη 5: Κλάσεις και Αντικείμενα. Διδάσκων: Παναγιώτης Ανδρέου

Αλεξάνδπειο ΤΕΙ Θεζζαλονίκηρ Τμήμα Μηχανικών Πληποθοπικήρ

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #13

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 9: Κληρονομικότητα (Inheritance)

public void printstatement() { System.out.println("Employee: " + name + " with salary: " + salary);

Αντικειµενοστραφής Προγραµµατισµός

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Κλάσεις. Κατηγορίες Αντικειµένων. Κλάσεις. Φυσικά Αντικείµενα. Χώρος = Οµάδα Φυσικών Αντικειµένων. Πρόγραµµα = Οµάδα

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

HelloWorld. Παύλος Εφραιμίδης. Java Το πρόγραμμα HelloWorld 1

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

Πακέτα (Packages) Φωλιασμένες ή Εσωτερικές Κλάσεις (Inner Classes) Παναγιώτης Σφέτσος, PhD

Εισαγωγή στον Προγ/μό Η/Υ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Προγράμματα με δομή Κληρονομικότητας

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Κληρονομικότητα. Περίγραμμα. Σύνθεση. Επαναχρησιμοποίηση Κλάσεων. Περίγραμμα. Σύνθεση (παράδειγμα) Code re-use through composition and inheritance

ΑΠΛΗ ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κληρονομικότητα

Διασυνδέσεις / Διεπαφές. Παναγιώτης Σφέτσος, PhD

ΕΠΛ233 Βασικά στοιχεία προγραµµατισµού στη JAVA

Βασικά της γλώσσας JAVA

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Περισσότερα για τις Κλάσεις, τα Αντικείμενα και τις Μεθόδους

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

Αρχές Τεχνολογίας Λογισμικού Εργαστήριο

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Αντικείμενα ως ορίσματα

Διδάσκων: Παναγιώτης Ανδρέου

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές

Κατασκευαστές. Μέθοδοι Κατασκευής (Constructors).

9:00-10:00 π.μ. (60 λεπτά) Παρασκευή, 14 Οκτωβρίου, 2016

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

Αντικείμενα στη Java. Παύλος Εφραιμίδης. Java Αντικείμενα στη Java 1

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Wrapper Classes, Abstract Classes and Interfaces

Βασικά Στοιχεία της Java

Αντικείμενα (Objects) στην Java. Αντικείμενα στη Java. Δημιουργία Αντικειμένων. Δηλώσεις Μεταβλητών (2) Ο τελεστής new (1)

Ανάλυση Πληροφοριακών Συστημάτων. Εαρινό Εξάμηνο Lec08 09/04/2019 Διδάσκων: Γεώργιος Χρ. Μακρής

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

(Διαφάνειες Νίκου Βιδάκη)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κληρονομικότητα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός μνήμης Αντικείμενα παράμετροι String Interning

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κληρονομικότητα

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 8 : ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ & ΠΟΛΥΜΟΡΦΙΣΜΟΣ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπάρχουσες κλάσεις και αντικείμενα στην Java Strings Wrapper Classes Δομές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Constructors Υπερφόρτωση Αντικείμενα ως παράμετροι

Πρόγραµµα 9.1 Πέρασµα δεδοµένων στην µνήµη

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Αντικειμενοστρεφής Προγραμματισμός

! Ο καλός προγραμματισμός επιβάλλει την αποδοτική χρήση. ! Είναι σημαντικό να καταλαβαίνουμε τις διαδικασίες

ΑΤΕΙ Θεσσαλονίκης Τμήμα Πληροφορικής

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Constructors, equals, tostring Αντικείμενα ως παράμετροι

Transcript:

Επαναχρησιμοποίηση Κλάσεων

2 Επαναχρησιμοποίηση Κλάσεων Σύνθεση (composition): σε μια κλάση εντάσσουμε ως στοιχεία χειριστήρια άλλων κλάσεων. Κληρονοµικότητα (inheritance): επεκτείνουμε υπάρχουσες κλάσεις, είτε προσθέτοντάς τους καινούρια στοιχεία, είτε αλλάζοντας την λειτουργικότητα μεθόδων τους.

3 Σύνθεση class WaterSource { private String s; WaterSource() { System.out.println("WaterSource()"); s = new String("Constructed"); public String tostring() { return s;

3 Σύνθεση class WaterSource { private String s; WaterSource() { System.out.println("WaterSource()"); s = new String("Constructed"); public String tostring() { return s; Η χρήση του tostring(): όταν θέλουµε να µπορεί να γίνει µετατροπή ενός αντικειµένου µιας κλάσης σε συµβολοσειρά, δεν έχουµε παρά να ορίσουµε στην κλάση µια µέθοδο µε όνοµα tostring().

4 Σύνθεση (συνέχεια) public class SprinklerSystem { private String valve1, valve2; WaterSource source; float f; void print() { System.out.println("valve1 =" + valve1); System.out.println("valve2 =" + valve2); System.out.println("f = " +f); System.out.println("source =" + source); public static void main (String[] args) { SprinklerSystem x = new SprinklerSystem(); x.print();

5 Κληρονομικότητα (inheritance) Εξυπακούεται ότι όλες οι κλάσεις της Java κληρονομούν από μια γενική κλάση-κληροδότη, την Object. Υπάρχει επίσης η δυνατότητα να ορίζουμε κλάσεις ως κληρονόμους άλλων κλάσεων, πιο εξειδικευμένων από την Object. Η κληρονομικότητα μιας κλάσης από κάποια κλάσηκληροδότη καθορίζεται με χρήση της λέξης-κλειδί extends. Π.χ.: public class Detergent extends Cleanser Στην περίπτωση αυτή η νέα κλάση (Detergent) αυτομάτως «κληρονομεί» όλα τα δηµόσια και τα φιλικά στοιχεία (πεδία δεδομένων και μέθοδοι ) της βάσης της (Cleanser).

6 Ορολογία Κληρονομικότητας Ορολογία: Base class: βάση, κληροδότης, ή superclass, υπερκλάση. Κλάση-κληρονόμος Απεικόνιση:

Παράδειγμα Κληρονομικότητας class Cleanser { private String s = "Cleanser"; public void append(string a) { s += a; public void dilute() { append("dilute()"); public void apply() { append(" apply()"); public void scrub() { append(" scrub()"); public void print() { System.out.println(s); public static void main (String[] args) { Cleanser x = new Cleanser(); x.dilute(); x.apply(); x.scrub(); x.print(); Μ. Δικαιάκος 7

Παράδειγμα Κληρονομικότητας (συνέχεια) public class Detergent extends Cleanser{ Μ. Δικαιάκος public void scrub() { append(" Detergent.scrub()"); super.scrub();//call base-class // Add methods to the interface: public void foam() { append(" foam()"); public static void main(string[] args) { Detergent x = new Detergent(); x.dilute(); x.apply(); x.scrub(); x.foam(); x.print(); Cleanser.main(args); 8

9 Παράδειγμα Κληρονομικότητας (συνέχεια)

9 Παράδειγμα Κληρονομικότητας (συνέχεια) Η κλάση Cleanser έχει ορισμένες μεθόδους στην διαπροσωπεία της (interface): append(), dilute(), apply(), scrub(), print().

9 Παράδειγμα Κληρονομικότητας (συνέχεια) Η κλάση Cleanser έχει ορισμένες μεθόδους στην διαπροσωπεία της (interface): append(), dilute(), apply(), scrub(), print(). Η Detergent, επειδή προκύπτει από την Cleanser (μέσω κληρονομικότητας), υιοθετεί αυτόματα όλες αυτές τις μεθόδους στην διαπροσωπεία της : η κληρονομικότητα συνεπάγεται την επαναχρησιμοποίηση της διαπροσωπείας.

9 Παράδειγμα Κληρονομικότητας (συνέχεια) Η κλάση Cleanser έχει ορισμένες μεθόδους στην διαπροσωπεία της (interface): append(), dilute(), apply(), scrub(), print(). Η Detergent, επειδή προκύπτει από την Cleanser (μέσω κληρονομικότητας), υιοθετεί αυτόματα όλες αυτές τις μεθόδους στην διαπροσωπεία της : η κληρονομικότητα συνεπάγεται την επαναχρησιμοποίηση της διαπροσωπείας. Η κλάση-κληρονόμος μπορεί να τροποποιήσει την λειτουργικότητα μιας μεθόδου της κλάσης-κληροδότη, καλώντας ταυτόχρονα την αναλλοίωτη μέθοδο της κλάσης κληροδότη (με χρήση της λέξης-κλειδί super, η οποία παραπέμπει στην υπερκλάση-κληροδότη).

Παράδειγμα Κληρονομικότητας (συνέχεια) Μ. Δικαιάκος Η κλάση Cleanser έχει ορισμένες μεθόδους στην διαπροσωπεία της (interface): append(), dilute(), apply(), scrub(), print(). Η Detergent, επειδή προκύπτει από την Cleanser (μέσω κληρονομικότητας), υιοθετεί αυτόματα όλες αυτές τις μεθόδους στην διαπροσωπεία της : η κληρονομικότητα συνεπάγεται την επαναχρησιμοποίηση της διαπροσωπείας. Η κλάση-κληρονόμος μπορεί να τροποποιήσει την λειτουργικότητα μιας μεθόδου της κλάσης-κληροδότη, καλώντας ταυτόχρονα την αναλλοίωτη μέθοδο της κλάσης κληροδότη (με χρήση της λέξης-κλειδί super, η οποία παραπέμπει στην υπερκλάση-κληροδότη). Επιπλέον, η κλάση-κληρονόμος μπορεί να επεκτείνει την διαπροσωπεία της κλάσης-κληροδότη με πρόσθεση νέων μεθόδων. 9

10 Αρχικοποιήσεις και Κληρονομικότητα

Αρχικοποιήσεις και Κληρονομικότητα Η κλάση-κληρονόμου έχει το ίδιο σύστημα διαπροσωπείας (interface) με την υπερκλάση της, επεκτεινόμενο ίσως με κάποιες καινούριες μεθόδους και πιθανώς με τροποποιημένες κάποιες από τις άλλες κληρονομημένες μεθόδους. Μ. Δικαιάκος 10

10 Αρχικοποιήσεις και Κληρονομικότητα Η κλάση-κληρονόμου έχει το ίδιο σύστημα διαπροσωπείας (interface) με την υπερκλάση της, επεκτεινόμενο ίσως με κάποιες καινούριες μεθόδους και πιθανώς με τροποποιημένες κάποιες από τις άλλες κληρονομημένες μεθόδους. Τι περιέχει το αντικείμενο που δημιουργείται σύμφωνα με μια κλάση-κληρονόμο;

10 Αρχικοποιήσεις και Κληρονομικότητα Η κλάση-κληρονόμου έχει το ίδιο σύστημα διαπροσωπείας (interface) με την υπερκλάση της, επεκτεινόμενο ίσως με κάποιες καινούριες μεθόδους και πιθανώς με τροποποιημένες κάποιες από τις άλλες κληρονομημένες μεθόδους. Τι περιέχει το αντικείμενο που δημιουργείται σύμφωνα με μια κλάση-κληρονόμο; Ένα υποαντικείμενο (subobject) της κλάσης-κληροδότη.

10 Αρχικοποιήσεις και Κληρονομικότητα Η κλάση-κληρονόμου έχει το ίδιο σύστημα διαπροσωπείας (interface) με την υπερκλάση της, επεκτεινόμενο ίσως με κάποιες καινούριες μεθόδους και πιθανώς με τροποποιημένες κάποιες από τις άλλες κληρονομημένες μεθόδους. Τι περιέχει το αντικείμενο που δημιουργείται σύμφωνα με μια κλάση-κληρονόμο; Ένα υποαντικείμενο (subobject) της κλάσης-κληροδότη. Το υποαντικείμενο αυτό είναι το ίδιο σαν να είχε δημιουργηθεί ανεξάρτητα από την κλάση-κληροδότη και όχι εμμέσως από την κλάση-κληρονόμο.

10 Αρχικοποιήσεις και Κληρονομικότητα Η κλάση-κληρονόμου έχει το ίδιο σύστημα διαπροσωπείας (interface) με την υπερκλάση της, επεκτεινόμενο ίσως με κάποιες καινούριες μεθόδους και πιθανώς με τροποποιημένες κάποιες από τις άλλες κληρονομημένες μεθόδους. Τι περιέχει το αντικείμενο που δημιουργείται σύμφωνα με μια κλάση-κληρονόμο; Ένα υποαντικείμενο (subobject) της κλάσης-κληροδότη. Το υποαντικείμενο αυτό είναι το ίδιο σαν να είχε δημιουργηθεί ανεξάρτητα από την κλάση-κληροδότη και όχι εμμέσως από την κλάση-κληρονόμο. Ωστόσο το υποαντικείμενο αυτό είναι περιτυλιγμένο (wrapped) στο αντικείμενο της κλάσης-κληρονόμου.

10 Αρχικοποιήσεις και Κληρονομικότητα Η κλάση-κληρονόμου έχει το ίδιο σύστημα διαπροσωπείας (interface) με την υπερκλάση της, επεκτεινόμενο ίσως με κάποιες καινούριες μεθόδους και πιθανώς με τροποποιημένες κάποιες από τις άλλες κληρονομημένες μεθόδους. Τι περιέχει το αντικείμενο που δημιουργείται σύμφωνα με μια κλάση-κληρονόμο; Ένα υποαντικείμενο (subobject) της κλάσης-κληροδότη. Το υποαντικείμενο αυτό είναι το ίδιο σαν να είχε δημιουργηθεί ανεξάρτητα από την κλάση-κληροδότη και όχι εμμέσως από την κλάση-κληρονόμο. Ωστόσο το υποαντικείμενο αυτό είναι περιτυλιγμένο (wrapped) στο αντικείμενο της κλάσης-κληρονόμου. Χρειάζεται προσοχή στην αρχικοποίηση του υποαντικειμένου.

11 Αρχικοποιήσεις και Κληρονομικότητα

11 Αρχικοποιήσεις και Κληρονομικότητα Η κατάλληλη αρχικοποίηση του υποαντικειμένου, που αντιστοιχεί στην κλάση-κληροδότη, εξασφαλίζεται με την κατάλληλη κλήση του κατασκευαστή (constructor) της κλάσης-κληροδότη.

11 Αρχικοποιήσεις και Κληρονομικότητα Η κατάλληλη αρχικοποίηση του υποαντικειμένου, που αντιστοιχεί στην κλάση-κληροδότη, εξασφαλίζεται με την κατάλληλη κλήση του κατασκευαστή (constructor) της κλάσης-κληροδότη. Η κλήση προς τον κατασκευαστή γίνεται υπόρητα από την Java, η οποία εισάγει αυτοµάτως στο σώμα του κατασκευαστή τής κλάσης-κληρονόμου μια κλήση προς τον κατασκευαστή εκείνο τού κληροδότη, ο οποίος δεν επιδέχεται παραμέτρων.

11 Αρχικοποιήσεις και Κληρονομικότητα Η κατάλληλη αρχικοποίηση του υποαντικειμένου, που αντιστοιχεί στην κλάση-κληροδότη, εξασφαλίζεται με την κατάλληλη κλήση του κατασκευαστή (constructor) της κλάσης-κληροδότη. Η κλήση προς τον κατασκευαστή γίνεται υπόρητα από την Java, η οποία εισάγει αυτοµάτως στο σώμα του κατασκευαστή τής κλάσης-κληρονόμου μια κλήση προς τον κατασκευαστή εκείνο τού κληροδότη, ο οποίος δεν επιδέχεται παραμέτρων. Η κλήση των κατασκευαστών σε μια σειρά κληρονομικότητας ξεκινάει από τον πιο απόμακρο κληροδότη, προχωρώντας προς τον τελευταίο κληρονόμο αφού:

Μ. Δικαιάκος Αρχικοποιήσεις και Κληρονομικότητα Η κατάλληλη αρχικοποίηση του υποαντικειμένου, που αντιστοιχεί στην κλάση-κληροδότη, εξασφαλίζεται με την κατάλληλη κλήση του κατασκευαστή (constructor) της κλάσης-κληροδότη. Η κλήση προς τον κατασκευαστή γίνεται υπόρητα από την Java, η οποία εισάγει αυτοµάτως στο σώμα του κατασκευαστή τής κλάσης-κληρονόμου μια κλήση προς τον κατασκευαστή εκείνο τού κληροδότη, ο οποίος δεν επιδέχεται παραμέτρων. Η κλήση των κατασκευαστών σε μια σειρά κληρονομικότητας ξεκινάει από τον πιο απόμακρο κληροδότη, προχωρώντας προς τον τελευταίο κληρονόμο αφού: Tο αντικείμενο μιας κλάσης-κληροδότη πρέπει να έχει αρχικοποιηθεί πριν να μπορέσουν οι κατασκευαστές των κλάσεων-κληρονόμων να το χρησιμοποιήσουν. 11

12 Παράδειγμα class Art { Art() { System.out.println( Art"); class Drawing extends Art { Drawing() { System.out.println( Draw"); public class Cartoon extends Drawing { Cartoon() { System.out.println( Cartoon"); public static void main(string[] args) { Cartoon x = new Cartoon();

12 Παράδειγμα class Art { Art() { System.out.println( Art"); class Drawing extends Art { Drawing() { System.out.println( Draw"); public class Cartoon extends Drawing { Cartoon() { System.out.println( Cartoon"); public static void main(string[] args) { Cartoon x = new Cartoon(); class Art { Art() { System.out.println( Art"); class Drawing extends Art { Drawing() { super(); System.out.println( Draw"); public class Cartoon extends Drawing { Cartoon() { super(); System.out.println( Cartoon"); public static void main(string[] args) { Cartoon x = new Cartoon();

Κληρονομικότητα και Κατασκευαστές Μ. Δικαιάκος Στο προηγούμενο παράδειγμα και για όλες τις κλάσεις στην σειρά κληρονομικότητας που εξετάσαμε, έχουμε προκαθορισμένους (default) κατασκευαστές χωρίς παραμέτρους. Επομένως, η προκαθορισμένη συμπεριφορά της JAVA να εισαγάγει υπόρρητα κλήσεις προς τους κατασκευαστές των κληροδοτών, χωρίς πέρασμα παραμέτρων, δεν δημιουργεί πρόβλημα. Σε διαφορετική περίπτωση (υπερφόρτωση κατασκευαστών, απουσία προκαθορισμένου κατασκευαστή), ο προγραμματιστής πρέπει να καθορίσει ρητά την κλήση προς τον κατασκευαστή της κλάσης-κληροδότη, περνώντας και τις κατάλληλες παραμέτρους. Η κλήση ενός κατασκευαστή της υπερκλάσης γίνεται με χρήση της μεθόδου super(). 13

14 Κατασκευαστές με παραμέτρους class Game { Game(int i) { System.out.println("Game constr"); class BoardGame extends Game { BoardGame(int i) { super(i); System.out.println("BoardGame const"); public class Chess extends BoardGame { Chess() { super(11); System.out.println("Chess constr"); public static void main(string[] args) { Chess x = new Chess();

14 Κατασκευαστές με παραμέτρους class Game { Game(int i) { System.out.println("Game constr"); class BoardGame extends Game { BoardGame(int i) { super(i); System.out.println("BoardGame const"); public class Chess extends BoardGame { Chess() { super(11); System.out.println("Chess constr"); if not used, compiler looks for super() public static void main(string[] args) { Chess x = new Chess();

15 Σύνθεση και Κληρονομικότητα public class PlaceSetting extends Custom { Spoon sp; Fork frk; Knife kn; DinnerPlate pl; PlaceSetting(int i) { super(i + 1); sp = new Spoon(i + 2); frk = new Fork(i + 3); kn = new Knife(i + 4); pl=new DinnerPlate(i + 5); public static void main (String[] args) { PlaceSetting x=new PlaceSetting(9); Ο μεταφραστής μας εξαναγκάζει να αρχικοποιήσουμε τους κληροδότες, αλλά εμείς πρέπει να φροντίσουμε για την αρχικοποίηση των αντικειμένων-στοιχείων.

16 Quiz class Instrument { Instrument() { Instrument(int i) { public class Wind extends Instrument { Wind() { Wind(int i) { // super(); this(); public static void main(string args[]) { Wind flute = new Wind(8); Ποιός κατασκευαστής της Instrument θα κληθεί ; Πόσες φορές ;

16 Quiz class Instrument { Instrument() { Άλλη εντολή πριν την Instrument(int i) { this() δεν επιτρέπεται public class Wind extends Instrument { Wind() { Wind(int i) { // super(); this(); public static void main(string args[]) { Wind flute = new Wind(8); Ποιός κατασκευαστής της Instrument θα κληθεί ; Πόσες φορές ;

16 Quiz class Instrument { Instrument() { Instrument(int i) { public class Wind extends Instrument { Wind() { Wind(int i) { // super(); this(); public static void main(string args[]) { Wind flute = new Wind(8); Ποιός κατασκευαστής της Instrument θα κληθεί ; Πόσες φορές ; Άλλη εντολή πριν την this() δεν επιτρέπεται Μέσω της this(), καλείται o κατασκευαστής Wind(), ο οποίος µε τη σειρά του καλεί τον Instrument()

Απόκρυψη Ονομάτων Μ. Δικαιάκος class Homer { char doh(char c) { System.out.println("doh(char)"); return 'd'; float doh(float f) { System.out.println("doh(float)"); return 1.0f; class Milhouse { class Bart extends Homer { void doh(milhouse m) { class Hide { public static void main(string[] args){ Bart b = new Bart(); b.doh(1); // doh(float) used b.doh('x'); b.doh(1.0f); b.doh(new Milhouse()); Η υπερφόρτωση λειτουργεί ανεξαρτήτως κληρονοµικότητας. 17

18 Σύνθεση και Κληρονομικότητα Σύνθεση : Η σύνθεση χρησιμοποιείται γενικότερα όταν χρειαζόμαστε τα χαρακτηριστικά μιας υπάρχουσας κλάσης και όχι την διαπροσωπεία της. Αντιστοιχεί σε has-a σχέσεις ανάμεσα στις κλάσεις. Κληρονοµικότητα : Χρησιμοποιείται όταν θέλουμε να φτιάξουμε μια ειδική περίπτωση κάποιας κλάσης. Αν μια κλάση Β κληρονομεί από μια κλάση Α, η σχέση τους συνοψίζεται ως εξής : Η νέα κλάση Β είναι ένας τύπος της υπάρχουσας κλάσης Α. Αντιστοιχεί σε is-a σχέσεις ανάμεσα στις κλάσεις.

19 Η χρήση του protected import java.util.*; class Villain { private int i; public Villain(int ii) { i = ii; protected int read() { return i; protected void set(int ii) { i = ii; public int value(int m) { return m*i; public class Orc extends Villain { private int j; public Orc(int jj) { super(jj); j = jj; public void change(int x) { set(x); Η χρήση του protected σημαίνει ότι το αντίστοιχο στοιχείο μπορεί να χρησιμοποιηθεί μέσα στην βιβλιοθήκη στην οποία ανήκει, αλλά και στις κλάσεις που κληρονομούν από την κλάση του στοιχείου, όχι όμως σε άλλες άσχετες κλάσεις.

20 Αναβάθμιση κ. κληρονομικότητα import java.util.*; class Instrument { public void play() { static void tune(instrument i) { //... i.play(); class Wind extends Instrument { public static void main(string[] args){ Wind flute = new Wind(); Instrument.tune(flute); Upcasting

21 Αναβάθμιση και κληρονομικότητα Η κληρονομικότητα συνεπάγεται ότι οποιοδήποτε μήνυμα στέλνεται σε μια κλάση-κληροδότη, μπορεί να σταλεί και στις κλάσεις-κληρονόμους της. Αυτό σημαίνει ότι όλες οι μέθοδοι που ανήκουν σε μια κλάση-κληροδότη και για τις οποίες δίνονται δικαιώματα πρόσβασης σε άλλες κλάσεις, ενυπάρχουν και στις κλάσεις-κληρονόμους της. (Δεν συμβαίνει απαραίτητα και το ανάποδο). Επομένως, οι μέθοδοι play και tune του παραδείγματός μας «υπάρχουν» και στα αντικείμενα τύπου Wind.

22 Αναβάθμιση Παρατηρείστε ότι η tune καλείται από την Wind.main με παράμετρο τύπου Wind χωρίς να παραπονεθεί ο μεταφραστής της Java. class Wind extends Instrument { Wind flute = new Wind(); Instrument.tune(flute); Τι είναι το upcasting; Η αναβάθμιση ενός χειριστήριου τύπου Wind σε χειριστήριο τύπου Instrument. Η μετατροπή γίνεται αυτόματα.

23 Αναβάθμιση Λόγω της κληρονομικότητας, ένα αντικείμενο τύπου Wind είναι επίσης αντικείμενο τύπου Instrument. Στη διαπροσωπεία (interface) του Wind υπάρχουν όλες οι μέθοδοι της διαπροσωπείας του Instrument.

24 Quiz package epl233; import java.util.*; class Instrument { private static int k = 8; void play() { System.out.println( play instrument ); static void tune(instrument i) { System.out.println( Private k: + k); i.play(); class Wind extends Instrument { public static void main(string[] args) { Wind flute = new Wind(); flute.k = 9; flute.tune(flute); Mήνυµα σφάλµατος αφού δεν έχουµε πρόσβαση στην k

25 Η χρήση του final Η λέξη final έχει διάφορες χρήσεις στην Java, αναλόγως των συμφραζομένων και αφορά σε: Δεδομένα. Μεθόδους Κλάσεις Γενικά σηματοδοτεί κάτι το οποίο δεν μπορεί νʼ αλλάξει. Δεδοµένα final: Με την final μπορούμε να ορίζουμε σταθερές στην μεταφράση (compile-time constants), οι οποίες ανήκουν σε αρχέγονους τύπους. Μπορούμε επίσης να ορίζουμε σταθερές στην εκτέλεση (run-time constants), οι οποίες αρχικοποιούνται κάποια στιγμή στον χρόνο εκτέλεσης και δεν αλλάζουν έκτοτε. Στην περίπτωση χειριστηρίων που καθορίζονται ως final, τα ίδια τα χειριστήρια γίνονται «σταθερές», όχι όμως και τα περιεχόμενα των αντικειμένων στα οποία παραπέμπουν. Πεδία που ορίζονται σαν final και static αντιστοιχούν σε μια μοναδική θέση μνήμης, τα περιεχόμενα της οποία δεν μπορούν να αλλαχθούν.

26 Παράδειγμα class Value { int i = 1; public class FinalData { final int i1 = 9; static final int VAL_TWO = 99; public static final int VAL_THREE=39; final int i4 =(int)(math.random()*20); Compile-time constants static final int i5 = (int) (Math.random()*20); Value v1 = new Value(); final Value v2 = new Value(); static final Value v3 = new Value(); // Arrays: final int[] a = { 1, 2, 3, 4, 5, 6 ; Typical public constant Run-time constants

27 Τελικές Παράμετροι class Gizmo { public void spin() { public class FinalArguments { void with(final Gizmo g) { g = new Gizmo(); g.spin(); void without(gizmo g) { g = new Gizmo(); g.spin(); void f(final int i) { i++; int g(final int i) { return i + 1; public static void main(string[] args) { FinalArguments bf = new FinalArguments(); bf.without(null); bf.with(null); Προκύπτει σφάλµα: παράµετροι οι οποίες είναι final δεν µπορούν να αλλαχθούν.

Κενές Τελικές (Blank finals) H Java επιτρέπει τον ορισμό πεδίων σαν final, χωρίς να γίνεται αρχικοποίηση τους στο σημείο του ορισμού. Στην περίπτωση αυτή τα πεδία-σταθερές πρέπει να αρχικοποιηθούν μέσα στον κατασκευαστή της αντίστοιχης κλάσης διαφορετικά ο μεταφραστής διαμαρτύρεται. Έτσι, μας δίνεται η δυνατότητα να έχουμε διαφορετικές σταθερές μέσα σε διαφορετικά αντικείμενα της ίδιας κλάσης. Μ. Δικαιάκος 28

29 Τελικές Μέθοδοι Υπάρχουν δύο λόγοι για τους οποίους δηλώνουμε μια μέθοδο σαν final: Για να αποτρέψουμε την αναίρεση (overwritting) της μεθόδου μέσα από κάποια κλάση που την κληρονομεί, και να διατηρήσουμε έτσι το νόημά της. Για λόγους απόδοσης: ο κώδικας μεθόδων final μπορεί να «ενσωματώνεται» (inline) από τον μεταφραστή στο κάθε σημείο κλήσης της μεθόδου. Κάθε ιδιωτική μέθοδος σε μια κλάση είναι υπορρήτως τελική αφού δεν επιτρέπεται πρόσβαση προς αυτήν από κάποιον κληρονόμο.

30 Ιδιωτικές και Τελικές Μέθοδοι public class Test { final void foo(int i) { public class Test { private void foo(int i) { public class Test1 extends Test { void foo(int j) { void foo(char c) { Προκύπτει σφάλµα στην µετάφραση (που και γιατί); public class Test1 extends Test { void foo(int j) { void foo(char c) { Δεν προκύπτει σφάλµα στην µετάφραση.

31 Τελικές Κλάσεις Η δήλωση μιας κλάσης Foo ως final, υποδηλώνει ότι η κλάση αυτή δεν μπορεί να κληροδοτηθεί σε άλλες κλάσεις. Κατ ʼ αυτόν τον τρόπο, δηλαδή, αποτρέπουμε την κληρονομικότητα από την Foo.

32 Αρχικοποίηση και Κληρονομικότητα class Insect { int i = 9; int j; Insect() { prt("i = " + i + ", j = " + j); j=39; static int x1 = prt("static Insect.x1 initialized"); static int prt(string s) { System.out.println(s); return 47; public class Beetle extends Insect { int k = prt("beetle.k initialized"); Beetle() { prt("k = " + k); prt("j = " + j); static int x2 =prt("static Beetle.x2 initialized"); public static void main(string[] args){ prt("beetle constructor"); Beetle b = new Beetle();

33 Έξοδος Παραδείγματος static Insect.x initialized Static Beetle.x2 initialized Beetle constructor i = 9, j = 0 Beetle.k initialized k = 47 i = 39 Βήματα στην εκτέλεση του jaba Beetle: Φόρτωση της κλάσης Beetle Αναζήτηση και Φόρτωση της ιεραρχίας των κληροδοτών της Beetle (δηλαδή της Insect). Στατική αρχικοποίηση της Insect και μετά της Beetle. Δημιουργία αντικειμένων και αρχικοποίηση πεδίων τους (σε null). Κλήση κατασκευαστών Αρχικοποίηση instance variables Εκτέλεση εντολών κατασκευαστή