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

Σχετικά έγγραφα
Ανάλυση άσκησης. Employee. SalariedEmployee CommissionEmployee HourlyEmployee. BasePlusCommissionEmployee

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

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

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

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

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

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Παναγιώτης Σφέτσος

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

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

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

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

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

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

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

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

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

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

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

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Η λέξη κλειδί this. Γαβαλάς Δαμιανός

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

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

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

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

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

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

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

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

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

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

Abstract classes, Interfaces ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

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

ΠΟΛΥΜΟΡΦΙΣΜΟΣ. 4.1 Κληρονομικότητα και Αρχή της Υποκατάστασης

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

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

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

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

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

ΑΡΦΕ ΑΝΣΙΚΕΙΜΕΝΟΣΡΕΥΟΤ ΠΡΟΓΡΑΜΜΑΣΙΜΟΤ. Ιωάννης Φατζηλυγερούδης Αναπληρωτής Καθηγητής Τμήμα Μηχ/κών Η/Υ και Πληροφορικής Πανεπιστήμιο Πατρών

Σύνθεση και Κληρονομικότητα

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

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

Wrapper Classes, Abstract Classes and Interfaces

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

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων Constructors

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

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

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

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

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

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

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

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

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

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

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

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

Από τη UML στον Κώδικα. Μέρος Α

Σύνθεση και Κληρονομικότητα

Διαγράμματα Κλάσεων στη Σχεδίαση

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

Σχεδίαση-Ανάπτυξη Εφαρμογών Πληροφορικής - Εβδομάδα 1

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

EPL 603 TOPICS IN SOFTWARE ENGINEERING. Lab 5: Component Adaptation Environment (COPE)

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

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

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

3 Αλληλεπίδραση Αντικειμένων

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

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

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

(Απλή) Κληρονομικότητα

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

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

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

8. Μέθοδοι (Methods)

5. Ανασκόπηση αντικειμενοστραφούς προγραμματισμού

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

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

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

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

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

Transcript:

Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων Αντικειμενοστρεφής Προγραμματισμός 9/5/2016 Δρ. Ανδριάνα Πρέντζα Αναπληρώτρια Καθηγήτρια aprentza@unipi.gr

Κληρονομικότητα

Τροποποιητικά πρόσβασης κλάσεων Java Η Java έχει 4 τροποποιητικά πρόσβασης (visibility modifiers) που καθορίζουν τα επίπεδα προστατευμένης πρόσβασης σε αντικείμενα της κλάσης Public οποιοσδήποτε έχει πρόσβαση στα μέλη της κλάσης Προσπελάσιμα από όλες τις κλάσεις όλων των πακέτων Private κρύβει εντελώς τα μέλη από άλλες κλάσεις και υποκλάσεις Προσπελάσιμα μόνο από την ίδια την κλάση Protected κρύβει τα μέλη της κλάσης από κλάσεις που βρίσκονται έξω από το πακέτο της κλάσης Προσπελάσιμα από την ίδια την κλάση και όποια υποκλάση ή όποια κλάση βρίσκεται στο ίδιο πακέτο με τη συγκεκριμένη κλάση Package (Default) τα μέλη είναι προσπελάσιμα από την ίδια την κλάση και οποιαδήποτε άλλη κλάση στο ίδιο πακέτο Για να έχουμε package scope, ένα μέλος δηλώνεται χωρίς κάποιο από τα keywords private, protected ή public

Visibility Modifiers: Example

Java Visibility Modifiers and Access Privileges

Members Visibility Modifiers A class member that is declared as public can be accessed from any class that can access the class of the member We expose methods that are part of the interface of the class by declaring them as public A class member that is declared as private, can be accessed only by code that is within the class of this member We hide the internal implementation of the class by declaring its data variables and auxiliary methods as private Data hiding is essential for encapsulation Members that are declared without a visibility modifier are said to have default visibility Note: If a class has a package scope then even if its members are public there visibility is only at the same package

Visibility Modifiers: Example

Visibility Modifiers: Example

Visibility Modifiers: Example

Κληρονομικότητα Κληρονομικότητα Επαναχρησιμοποίηση λογισμικού Δημιουργίας μια νέας κλάσης από υπάρχουσα Απορροφά τα δεδομένα και τη συμπεριφορά της υπάρχουσας κλάσης Την εμπλουτίζει με νέες δυνατότητες Η υποκλάση επεκτείνει την υπερκλάση (Subclass extends superclass) Υποκλάση (Subclass) Πιο εξειδικευμένη ομάδα αντικειμένων Συμπεριφορές κληρονομούνται από την υπερκλάση (superclass) ενδέχεται να χρειάζεται προσαρμογή (customization) Επιπρόσθετες συμπεριφορές

...Εισαγωγή Ιεραρχία κλάσεων Άμεση υπερκλάση (Direct superclass) Κληρονομείται σαφώς (ιεραρχία ενός επιπέδου) Έμμεση υπερκλάση (Indirect superclass) Κληρονομείται από δύο ή περισσότερα επίπεδα Απλή κληρονομικότητα (Single inheritance) Κληρονομεί από ΜΙΑ υπερκλάση Πολλαπλή κληρονομικότητα (Multiple inheritance) Κληρονομεί από πολλές υπερκλάσεις Η Java δεν υποστηρίζει πολλαπλή κληρονομικότητα που λαμβάνει χώρα όταν μία κλάση απορρέει από περισσότερες από μία άμεσες υπερκλάσεις (σε αντίθεση με τη C++)

Κληρονομικότητα από μία μόνο κλάση

Κληρονομικότητα από μία μόνο κλάση

Κληρονομικότητα από μία μόνο κλάση Τι συμβαίνει αν οι κλάσεις Thief και Elf υλοποιούν και οι δύο public void sneakup() Αν έχουν υλοποιηθεί διαφορετικά, ποια μέθοδο sneakup() θα καλέσει η κλάση Bad Elf? Java doesn t know!!!

Υπερκλάσεις και υποκλάσεις Υπερκλάσεις και υποκλάσεις Το αντικείμενο μιας κλάσης «είναι-ένα» ( is-a ) αντικείμενο μιας άλλης κλάσης Παράδειγμα: Το τετράγωνο «είναι ένα» τετράπλευρο Η κλάση Rectangle κληρονομεί από την κλάση Quadrilateral Quadrilateral: είναι υπερκλάση Rectangle: είναι υποκλάση Η υπερκλάση τυπικά αναπαριστά ένα μεγαλύτερο σύνολο αντικειμένων από τις υποκλάσεις Παράδειγμα: υπερκλάση: Vehicle (όχημα) Cars, trucks, boats, bicycles, υποκλάση: Car Μικρότερη, πιο εξειδικευμένο υποσύνολο από vehicles

Παραδείγματα κληρονομικότητας Υπερκλάση Υποκλάσεις Student Shape Loan Employee GraduateStudent, UndergraduateStudent Circle, Triangle, Rectangle CarLoan, HomeImprovementLoan, MortgageLoan Faculty, Staff BankAccount CheckingAccount, SavingsAccount

...Υπερκλάσεις και υποκλάσεις Ιεραρχία κληρονομικότητας Σχέσεις ιεραρχίας: δενδροειδής δομή ιεραρχίας Κάθε κλάση γίνεται Υπερκλάση Παρέχει μέλη σε άλλες κλάσεις Ή Υποκλάση Κληρονομεί μέλη από άλλες κλάσεις

...Υπερκλάσεις και υποκλάσεις 1. Άμεση υπερκλάση των Employee, Student και Alumnus 2. Έμμεση υπερκλάση όλων των άλλων κλάσεων Ένας Employee είναι ένα CommunityMember Ένας Teacher είναι ένα μέλος Faculty

Σύνοψη κληρονομικότητας class A extends B {} == η A είναι υποκλάση της B Η A έχει όλα τα πεδία και μεθόδους που έχει η κλάση B Η κλάση A μπορεί να προσθέσει τα δικά του πεδία και μεθόδους Η κλάση A μπορεί να έχει μόνο ένα γονιό Η κλάση A μπορεί να αντικαταστήσει μία γονική μέθοδο με το να την ξανα-υλοποιήσει Αν η κλάση A δεν υλοποιεί κάτι, τότε η Java ψάχνει τους προγόνους

...Υπερκλάσεις και υποκλάσεις Ένα Triangle είναι ένα TwoDimensionalShape και επίσης, είναι ένα Shape

Προστατευμένα (Protected) μέλη protected πρόσβαση Ενδιάμεσο επίπεδο προστασίας, μεταξύ public και private Τα protected μέλη είναι προσβάσιμα από 1. Μέλη της υπερκλάσης 2. Μέλη της υποκλάσης 3. Μέλη κλάσεων στο ίδιο package (friend στη C++) Πρόσβαση της υποκλάσης σε μέλος της υπερκλάσης Με τη λέξη κλειδί super και το dot (.)

Παρατήρηση Οι μέθοδοι μιας υποκλάσης δεν μπορούν να προσπελάσουν απευθείας τα private μέλη της υπερκλάσης τους. Μια υποκλάση μπορεί να αλλάξει την κατάσταση των private μεταβλητών στιγμιοτύπου της υπερκλάσης μόνο μέσω των μηprivate μεθόδων που παρέχονται στην υπερκλάση και κληρονομούνται από την υποκλάση

Σχέση μεταξύ Υπερκλάσεων και Υποκλάσεων Παράδειγμα (τύποι εργαζόμενων σε μια εφαρμογή μισθοδοσίας): ιεραρχία κληρονομικότητας CommissionEmployee/BasePlusCommissionEmployee CommissionEmployee Όνομα (firstname) Επίθετο (lastname) Αριθμός κοινωνικής ασφάλισης (socialsecuritynumber) Ποσοστό προμήθειας (commisionrate) Μικτές (συνολικές) πωλήσεις (grosssales) BasePlusCommissionEmployee Όνομα Επίθετο Αριθμός κοινωνικής ασφάλισης Ποσοστό προμήθειας Μικτές (συνολικές) πωλήσεις Βασικός μισθός (basicsalary)

Δημιουργία και χρήση της κλάσης CommissionEmployee Η κλάση CommissionEmployee Επεκτείνει (Extends) την κλάση Object Λέξη-κλειδί extends Κάθε κλάση στη Java επεκτείνει (extends) μια υπάρχουσα κλάση Εκτός από την Object Κάθε κλάση κληρονομεί τις μεθόδους της Object Μια νέα κλάση εμμέσως επεκτείνει την κλάση Object Αν δεν επεκτείνει μια άλλη κλάση Ο μεταγλωττιστής της Java θέτει ως υπερκλάση μιας κλάσης την Object, όταν η δήλωση της κλάσης δεν επεκτείνει σαφώς κάποια άλλη υπερκλάση

1 // Fig. 9.4: CommissionEmployee.java 2 //...Δημιουργία CommissionEmployee και χρήση class represents της κλάσης a commission employee. 3 CommissionEmployee 4 public class CommissionEmployee extends Object 5 { 6 private String firstname; 7 private String lastname; 8 private String socialsecuritynumber; 9 private double grosssales; // gross weekly sales 10 private double commissionrate; // commission percentage 11 12 // five-argument constructor 13 public CommissionEmployee( String first, String last, String ssn, 14 double sales, double rate ) 15 { 16 // implicit call to Object constructor occurs here 17 firstname = first; 18 lastname = last; 19 socialsecuritynumber = ssn; 20 setgrosssales(sales); // validate and store gross sales 21 setcommissionrate(rate); // validate and store commission rate 22 } // end five-argument CommissionEmployee constructor 23 24 // set first name 25 public void setfirstname( String first ) 26 { 27 firstname = first; 28 } // end method setfirstname 29 Δήλωση private μεταβλητών στιγμιοτύπου Η κλάση CommissionEmployee επεκτείνει (extends) την κλάση Object Έμμεση κλήση του κατασκευαστή της Object Αρχικοποίηση μεταβλητών στιγμιοτύπου Κλήση μεθόδων setgrosssales και setcommissionrate για επικύρωση δεδομένων Στη πραγματικότητα είναι πλεονασμός να δηλωθεί αυτή η σχέση κληρονομικότητας

30 // return first name 31 public String getfirstname() 32 { 33 return firstname; 34 } // end method getfirstname 35 36 // set last name 37 public void setlastname(string last) 38 { 39 lastname = last; 40 } // end method setlastname 41 42 // return last name 43 public String getlastname() 44 { 45 return lastname; 46 } // end method getlastname 47 48 // set social security number 49 public void setsocialsecuritynumber(string ssn) 50 { 51 socialsecuritynumber = ssn; // should validate 52 } // end method setsocialsecuritynumber 53 54 // return social security number 55 public String getsocialsecuritynumber() 56 { 57 return socialsecuritynumber; 58 } // end method getsocialsecuritynumber 59

60 // set gross sales amount 61 public void setgrosssales(double sales) 62 { 63 grosssales = (sales < 0.0)? 0.0 : sales; 64 } // end method setgrosssales 65 66 // return gross sales amount 67 public double getgrosssales() 68 { 69 return grosssales; 70 } // end method getgrosssales 71 72 // set commission rate 73 public void setcommissionrate(double rate) 74 { 75 commissionrate = (rate > 0.0 && rate < 1.0)? rate : 0.0; 76 } // end method setcommissionrate 77 78 // return commission rate 79 public double getcommissionrate() 80 { 81 return commissionrate; 82 } // end method getcommissionrate 83 84 // calculate earnings Υπολογισμός μισθού 85 public double earnings() 86 { 87 return commissionrate * grosssales; 88 } // end method earnings 89

90 // return String representation of CommissionEmployee object 91 public String tostring() 92 { 93 return String.format( "%s: %s %s\n%s: %s\n%s: %.2f\n%s: %.2f", 94 "commission employee", firstname, lastname, 95 "social security number", socialsecuritynumber, 96 "gross sales", grosssales, 97 "commission rate", commissionrate ); 98 } // end method tostring 99 } // end class CommissionEmployee Παράκαμψη (Override) της μεθόδου tostring της κλάσης Object Η μέθοδος tostring της κλάσης Object επιστρέφει ένα String το οποίο περιλαμβάνει το όνομα της κλάσης του αντικειμένου. Εδώ όμως ορίζεται εκ νέου η μέθοδος, και αποτελεί «προσαρμοσμένη» έκδοση της αρχικής. Χρησιμοποιεί τη String μέθοδο format για να επιστρέψει ένα String το οποίο περιέχει πληροφορίες για το Commission Employee. Για να παρακάμψει κάποιος μία μέθοδο υπερκλάσης, πρέπει η υποκλάση να έχει μία μέθοδο που έχει ακριβώς την ίδια υπογραφή (όνομα μεθόδου, αριθμός παραμέτρων, τύποι παραμέτρων και σειρά τύπων παραμέτρων) Η μέθοδος tostring της κλάσης Object δεν έχει παραμέτρους, επομένως ούτε η μέθοδος tostring της CommissionEmployee έχει.

Συνηθισμένο προγραμματιστικό σφάλμα Είναι συντακτικό σφάλμα η παράκαμψη μιας μεθόδου με ένα πιο περιοριστικό τροποποιητικό πρόσβασης μια public μέθοδος της υπερκλάσης δεν μπορεί να καταστεί protected ή private μέθοδος στην υποκλάση Μια μέθοδος protected της υπερκλάσης δεν μπορεί να γίνει private μέθοδος στην υποκλάση Κάτι τέτοιο θα χαλούσε τη σχέση είναι-ένα στην οποία απαιτείται όλα τα αντικείμενα της υποκλάσης να μπορούν να αποκριθούν στις κλήσεις μεθόδου που γίνονται στις public μεθόδους που δηλώθηκαν στην υπερκλάση Όταν μια μέθοδος ορίζεται ως public σε μια υπερκλάση, η μέθοδος παραμένει public για όλες τις άμεσες και έμμεσες υποκλάσεις αυτής της κλάσης

1 // Fig. 9.5: CommissionEmployeeTest.java Δημιουργία αντικειμένου 2 // Testing class CommissionEmployee. CommissionEmployee 3 4 public class CommissionEmployeeTest 5 { 6 public static void main( String args[] ) 7 { 8 // instantiate CommissionEmployee object 9 CommissionEmployee employee = new CommissionEmployee( 10 "Sue", "Jones", "222-22-2222", 10000,.06 ); 11 12 // get commission employee data 13 System.out.println( 14 "Employee information obtained by get methods: \n" ); 15 System.out.printf( "%s %s\n", "First name is", 16 employee.getfirstname() ); 17 System.out.printf( "%s %s\n", "Last name is", 18 employee.getlastname() ); 19 System.out.printf( "%s %s\n", "Social security number is", 20 employee.getsocialsecuritynumber() ); 21 System.out.printf( "%s %.2f\n", "Gross sales is", 22 employee.getgrosssales() ); 23 System.out.printf( "%s %.2f\n", "Commission rate is", 24 employee.getcommissionrate() ); 25 26 employee.setgrosssales(500); // set gross sales 27 employee.setcommissionrate(.1); // set commission rate 28 Χρήση μεθόδων get της CommissionEmployee για ανάκτηση των μεταβλητών στιγμιοτύπου του αντικειμένου Χρήση μεθόδων set της CommissionEmployee για αλλαγή των μεταβλητών στιγμιοτύπου του αντικειμένου

29 System.out.printf( "\n%s:\n\n%s\n", 30 "Updated employee information obtained by tostring", employee) 31 } // end main 32 } // end class CommissionEmployeeTest Employee information obtained by get methods: First name is Sue Last name is Jones Social security number is 222-22-2222 Gross sales is 10000.00 Commission rate is 0.06 Updated employee information obtained by tostring: commission employee: Sue Jones social security number: 222-22-2222 gross sales: 500.00 commission rate: 0.10 Έμμεση κλήση της μεθόδου tostring του αντικειμένου

Δημιουργία της κλάσης BasePlusCommissionEmployee χωρίς χρήση κληρονομικότητας Η κλάση BasePlusCommissionEmployee Εμμέσως επεκτείνει την Object Μεγάλο μέρος του κώδικα είναι ίδιο με αυτόν της CommissionEmployee οι private μεταβλητές στιγμιοτύπου οι public μέθοδοι Ο κατασκευαστής Η κλάση BasePlusCommissionEmployee αναπαριστά έναν υπάλληλο που επιπλέον του commission έχει και βασικό μισθό Προσθήκες Η private μεταβλητή στιγμιοτύπου basesalary Οι μέθοδοι setbasesalary και getbasesalary

1 // Fig. 9.6: BasePlusCommissionEmployee.java 2 // BasePlusCommissionEmployee class represents an employee that receives 3 // a base salary in addition to commission. 4 5 public class BasePlusCommissionEmployee 6 { 7 private String firstname; 8 private String lastname; 9 private String socialsecuritynumber; 10 private double grosssales; // gross weekly sales 11 private double commissionrate; // commission percentage 12 private double basesalary; // base salary per week 13 14 // six-argument constructor 15 public BasePlusCommissionEmployee( String first, String last, 16 String ssn, double sales, double rate, double salary ) 17 { 18 // implicit call to Object constructor occurs here 19 firstname = first; 20 lastname = last; 21 socialsecuritynumber = ssn; Προσθήκη της μεταβλητής στιγμιοτύπου basesalary Χρήση της μεθόδου setbasesalary για 22 setgrosssales(sales); // validate and store gross sales επικύρωση 23 setcommissionrate(rate); // validate and store commission rate 24 setbasesalary(salary); // validate and store base salary 25 } // end six-argument BasePlusCommissionEmployee constructor 26

27 // set first name 28 public void setfirstname(string first) 29 { 30 firstname = first; 31 } // end method setfirstname 32 33 // return first name 34 public String getfirstname() 35 { 36 return firstname; 37 } // end method getfirstname 38 39 // set last name 40 public void setlastname(string last) 41 { 42 lastname = last; 43 } // end method setlastname 44 45 // return last name 46 public String getlastname() 47 { 48 return lastname; 49 } // end method getlastname 50 51 // set social security number 52 public void setsocialsecuritynumber(string ssn) 53 { 54 socialsecuritynumber = ssn; // should validate 55 } // end method setsocialsecuritynumber 56

57 // return social security number 58 public String getsocialsecuritynumber() 59 { 60 return socialsecuritynumber; 61 } // end method getsocialsecuritynumber 62 63 // set gross sales amount 64 public void setgrosssales(double sales) 65 { 66 grosssales = (sales < 0.0)? 0.0 : sales; 67 } // end method setgrosssales 68 69 // return gross sales amount 70 public double getgrosssales() 71 { 72 return grosssales; 73 } // end method getgrosssales 74 75 // set commission rate 76 public void setcommissionrate(double rate) 77 { 78 commissionrate = (rate > 0.0 && rate < 1.0)? rate : 0.0; 79 } // end method setcommissionrate 80 81 // return commission rate 82 public double getcommissionrate() 83 { 84 return commissionrate; 85 } // end method getcommissionrate 86

87 // set base salary 88 public void setbasesalary(double salary) 89 { 90 basesalary = (salary < 0.0)? 0.0 : salary; 91 } // end method setbasesalary 92 93 // return base salary 94 public double getbasesalary() 95 { 96 return basesalary; 97 } // end method getbasesalary 98 99 // calculate earnings 100 public double earnings() 101 { 102 return basesalary + (commissionrate * grosssales); 103 } // end method earnings 104 105 // return String representation of BasePlusCommissionEmployee 106 public String tostring() 107 { 108 return String.format( 109 "%s: %s %s\n%s: %s\n%s: %.2f\n%s: %.2f\n%s: %.2f", 110 "base-salaried commission employee", firstname, lastname, 111 "social security number", socialsecuritynumber, 112 "gross sales", grosssales, "commission rate", commissionrate, 113 "base salary", basesalary); 114 } // end method tostring 115 } // end class BasePlusCommissionEmployee Η μέθοδος setbasesalary validates επικυρώνει και θέτει τιμή για τη μεταβλητή basesalary Η μέθοδος getbasesalary επιστρέφει την τιμή της μεταβλητής basesalary Ενημέρωση της μεθόδου earnings για τον υπολογισμό των αποδοχών ενός εργαζομένου με βασικό μισθό Ενημέρωση της μεθόδου tostring για εμφάνιση και του βασικού μισθού

1 // Fig. 9.7: BasePlusCommissionEmployeeTest.java 2 // Testing class BasePlusCommissionEmployee. 3 4 public class BasePlusCommissionEmployeeTest 5 { 6 public static void main( String args[] ) 7 { 8 // instantiate BasePlusCommissionEmployee object 9 BasePlusCommissionEmployee employee = 10 new BasePlusCommissionEmployee( 11 "Bob", "Lewis", "333-33-3333", 5000,.04, 300 ); 12 13 // get base-salaried commission employee data 14 System.out.println( 15 "Employee information obtained by get methods: \n" ); 16 System.out.printf( "%s %s\n", "First name is", 17 employee.getfirstname() ); 18 System.out.printf( "%s %s\n", "Last name is", 19 employee.getlastname() ); 20 System.out.printf( "%s %s\n", "Social security number is", 21 employee.getsocialsecuritynumber() ); 22 System.out.printf( "%s %.2f\n", "Gross sales is", 23 employee.getgrosssales() ); 24 System.out.printf( "%s %.2f\n", "Commission rate is", 25 employee.getcommissionrate() ); 26 System.out.printf( "%s %.2f\n", "Base salary is", 27 employee.getbasesalary() ); 28 Δημιουργία αντικειμένου BasePlusCommissionEmployee Χρήση μεθόδων get της BasePlusCommission Employee s για ανάκτηση των μεταβλητών στιγμιοτύπου του αντικειμένου

29 employee.setbasesalary(1000); // set base salary 30 31 System.out.printf("\n%s:\n\n%s\n", 32 "Updated employee information obtained by tostring", 33 employee.tostring() ); 34 } // end main 35 } // end class BasePlusCommissionEmployeeTest Employee information obtained by get methods: First name is Bob Last name is Lewis Social security number is 333-33-3333 Gross sales is 5000.00 Commission rate is 0.04 Base salary is 300.00 Updated employee information obtained by tostring: base-salaried commission employee: Bob Lewis social security number: 333-33-3333 gross sales: 5000.00 commission rate: 0.04 base salary: 1000.00 Σαφής κλήση της μεθόδου tostring Χρήση των μεθόδων της BasePlusCommissionE mployee s setbasesalary για προσδιορισμό του βασικού μισθού

Διαφορές??? Τι διαφορές παρατηρείται μεταξύ των δύο κλάσεων? CommissionEmployee BasePlusCommissionEmployee

Παρατηρήσεις Η αντιγραφή και επικόλληση κώδικα από μια κλάση σε μια άλλη μπορεί να διασπείρει σφάλματα σε πολλαπλά αρχεία κώδικα. Για να αποφύγουμε την αναπαραγωγή κώδικα (και τα πιθανά σφάλματα), χρησιμοποιούμε την ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ Με την κληρονομικότητα, οι κοινές μεταβλητές στιγμιότυπου και μέθοδοι όλων των κλάσεων στην ιεραρχία δηλώνονται σε μια υπερκλάση Όταν απαιτούνται αλλαγές για αυτά τα κοινά χαρακτηριστικά, χρειάζεται να κάνουμε αλλαγές μόνο στην υπερκλάση οι υποκλάσεις κληρονομούν τις αλλαγές Χωρίς την κληρονομικότητα, οι αλλαγές θα έπρεπε να γίνουν σε όλα τα αρχεία πηγαίου κώδικα που περιέχουν αντίγραφο του κώδικα αυτού

Δημιουργία μιας ιεραρχίας κληρονομικότητας CommissionEmployee BasePlusCommissionEmployee Η κλάση BasePlusCommissionEmployee2 Επεκτείνει την κλάση CommissionEmployee «είναι ένα» CommissionEmployee Έχει μεταβλητή στιγμιοτύπου τη basesalary Κληρονομεί τα public και protected μέλη Ο κατασκευαστής δεν κληρονομείται

1 // Fig. 9.8: BasePlusCommissionEmployee2.java 2 // BasePlusCommissionEmployee2 inherits from class CommissionEmployee 3 4 public class BasePlusCommissionEmployee2 extends CommissionEmployee 5 { 6 private double basesalary; // base salary per week Η κλάση 7 BasePluCommissionEm 8 // six-argument constructor ployee2 είναι μια 9 public BasePlusCommissionEmployee2(String first, υποκλάση String της last, 10 String ssn, double sales, double rate, double CommissionEmployee salary ) 11 { 12 // explicit call to superclass CommissionEmployee constructor 13 super( first, last, ssn, sales, rate ); 14 15 setbasesalary( salary ); // validate and store base salary 16 } // end six-argument BasePlusCommissionEmployee2 constructor 17 18 // set base salary 19 public void setbasesalary(double salary) 20 { 21 basesalary = (salary < 0.0)? 0.0 : salary; 22 } // end method setbasesalary Καλούμε τον κατασκευαστή της 23 υπερκλάσης χρησιμοποιώντας τη σύνταξη κλήσης κατασκευαστή υπερκλάσης

24 // return base salary 25 public double getbasesalary() 26 { 27 return basesalary; 28 } // end method getbasesalary Ο Compiler παράγει σφάλματα επειδή οι μεταβλητές στιγμιοτύπου commissionrate και grosssales της υπερκλάσης είναι private...δημιουργία μιας ιεραρχίας κληρονομικότητας CommissionEmployee BasePlusCommissionEmployee 29 30 // calculate earnings 31 public double earnings() 32 { 33 // not allowed: commissionrate and grosssales private in superclass 34 return basesalary + (commissionrate * grosssales); 35 } // end method earnings 36 37 // return String representation of BasePlusCommissionEmployee2 38 public String tostring() 39 { 40 // not allowed: attempts to access private superclass members 41 return String.format( 42 "%s: %s %s\n%s: %s\n%s: %.2f\n%s: %.2f\n%s: %.2f", 43 "base-salaried commission employee", firstname, lastname, 44 "social security number", socialsecuritynumber, 45 "gross sales", grosssales, "commission rate", commissionrate, 46 "base salary", basesalary); 47 } // end method tostring 48 } // end class BasePlusCommissionEmployee2 Ο Compiler παράγει σφάλματα επειδή οι μεταβλητές στιγμιοτύπου firstname, lastname, socialsecuritynumber, grosssales και commissionrate της υπερκλάσης είναι private

BasePlusCommissionEmployee2.java:34: commissionrate has private access in CommissionEmployee return basesalary + ( commissionrate * grosssales ); ^ BasePlusCommissionEmployee2.java:34: grosssales has private access in CommissionEmployee return basesalary + ( commissionrate * grosssales ); ^ BasePlusCommissionEmployee2.java:43: firstname has private access in CommissionEmployee "base-salaried commission employee", firstname, lastname, ^ BasePlusCommissionEmployee2.java:43: lastname has private access in CommissionEmployee "base-salaried commission employee", firstname, lastname, ^ BasePlusCommissionEmployee2.java:44: socialsecuritynumber has private access in CommissionEmployee "social security number", socialsecuritynumber, ^ BasePlusCommissionEmployee2.java:45: grosssales has private access in CommissionEmployee "gross sales", grosssales, "commission rate", commissionrate, ^ BasePlusCommissionEmployee2.java:45: commissionrate has private access in CommissionEmployee "gross sales", grosssales, "commission rate", commissionrate, ^ 7 errors

Ιεραρχία κληρονομικότητας CommissionEmployee BasePlusCommissionEmployee με χρήση protected μεταβλητών στιγμιοτύπου Χρήση προστατευόμενων (protected) μεταβλητών στιγμιοτύπου Επιτρέπει στην κλάση BasePlusCommissionEmployee να αποκτήσει άμεση πρόσβαση στις μεταβλητές στιγμιοτύπου της υπερκλάσης Τα protected μέλη της υπερκλάσης κληρονομούνται από όλες τις υποκλάσεις αυτής της υπερκλάσης

1 // Fig. 9.9: CommissionEmployee2.java 2 // CommissionEmployee2 class represents a commission employee. 3 4 public class CommissionEmployee2 5 { 6 protected String firstname; 7 protected String lastname; 8 protected String socialsecuritynumber; 9 protected double grosssales; // gross weekly sales 10 protected double commissionrate; // commission percentage 11 12 // five-argument constructor Δήλωση protected μεταβλητών στιγμιοτύπου 13 public CommissionEmployee2(String first, String last, String ssn, 14 double sales, double rate) 15 { 16 // implicit call to Object constructor occurs here 17 firstname = first; 18 lastname = last; 19 socialsecuritynumber = ssn; 20 setgrosssales(sales); // validate and store gross sales 21 setcommissionrate(rate); // validate and store commission rate 22 } // end five-argument CommissionEmployee2 constructor 23 24 // set first name 25 public void setfirstname(string first) 26 { 27 firstname = first; 28 } // end method setfirstname 29

30 // return first name 31 public String getfirstname() 32 { 33 return firstname; 34 } // end method getfirstname 35 36 // set last name 37 public void setlastname(string last) 38 { 39 lastname = last; 40 } // end method setlastname 41 42 // return last name 43 public String getlastname() 44 { 45 return lastname; 46 } // end method getlastname 47 48 // set social security number 49 public void setsocialsecuritynumber(string ssn) 50 { 51 socialsecuritynumber = ssn; // should validate 52 } // end method setsocialsecuritynumber 53 54 // return social security number 55 public String getsocialsecuritynumber() 56 { 57 return socialsecuritynumber; 58 } // end method getsocialsecuritynumber 59

60 // set gross sales amount 61 public void setgrosssales(double sales) 62 { 63 grosssales = (sales < 0.0)? 0.0 : sales; 64 } // end method setgrosssales 65 66 // return gross sales amount 67 public double getgrosssales() 68 { 69 return grosssales; 70 } // end method getgrosssales 71 72 // set commission rate 73 public void setcommissionrate(double rate) 74 { 75 commissionrate = (rate > 0.0 && rate < 1.0)? rate : 0.0; 76 } // end method setcommissionrate 77 78 // return commission rate 79 public double getcommissionrate() 80 { 81 return commissionrate; 82 } // end method getcommissionrate 83 84 // calculate earnings 85 public double earnings() 86 { 87 return commissionrate * grosssales; 88 } // end method earnings 89

90 // return String representation of CommissionEmployee2 object 91 public String tostring() 92 { 93 return String.format("%s: %s %s\n%s: %s\n%s: %.2f\n%s: %.2f", 94 "commission employee", firstname, lastname, 95 "social security number", socialsecuritynumber, 96 "gross sales", grosssales, 97 "commission rate", commissionrate); 98 } // end method tostring 99 } // end class CommissionEmployee2

1 // Fig. 9.10: BasePlusCommissionEmployee3.java 2 // BasePlusCommissionEmployee3 inherits from CommissionEmployee2 and has 3 // access to CommissionEmployee2's protected members. 4 5 public class BasePlusCommissionEmployee3 extends CommissionEmployee2 6 { Πρέπει να κληθεί ο 7 private double basesalary; // base salary per week κατασκευαστής της 8 υπερκλάσης 9 // six-argument constructor 10 public BasePlusCommissionEmployee3(String first, String last, 11 String ssn, double sales, double rate, double salary) 12 { 13 super(first, last, ssn, sales, rate); 14 setbasesalary(salary); // validate and store base salary 15 } // end six-argument BasePlusCommissionEmployee3 constructor 16 17 // set base salary 18 public void setbasesalary(double salary) 19 { 20 basesalary = (salary < 0.0)? 0.0 : salary; 21 } // end method setbasesalary 22 23 // return base salary 24 public double getbasesalary() 25 { 26 return basesalary; 27 } // end method getbasesalary 28

29 // calculate earnings 30 public double earnings() 31 { 32 return basesalary + (commissionrate * grosssales); 33 } // end method earnings 34 35 // return String representation of BasePlusCommissionEmployee3 36 public String tostring() 37 { 38 return String.format( 39 "%s: %s %s\n%s: %s\n%s: %.2f\n%s: %.2f\n%s: %.2f", 40 "base-salaried commission employee", firstname, lastname, Απευθείας πρόσβαση στις protected μεταβλητές στιγμιοτύπου της υπερκλάσης 41 "social security number", socialsecuritynumber, 42 "gross sales", grosssales, "commission rate", commissionrate, 43 "base salary", basesalary); 44 } // end method tostring 45 } // end class BasePlusCommissionEmployee3

1 // Fig. 9.11: BasePlusCommissionEmployeeTest3.java 2 // Testing class BasePlusCommissionEmployee3. 3 4 public class BasePlusCommissionEmployeeTest3 5 { 6 public static void main( String args[] ) 7 { 8 // instantiate BasePlusCommissionEmployee3 object 9 BasePlusCommissionEmployee3 employee = 10 new BasePlusCommissionEmployee3( 11 "Bob", "Lewis", "333-33-3333", 5000,.04, 300 ); 12 13 // get base-salaried commission employee data 14 System.out.println( 15 "Employee information obtained by get methods: \n" ); 16 System.out.printf( "%s %s\n", "First name is", 17 employee.getfirstname() ); 18 System.out.printf( "%s %s\n", "Last name is", 19 employee.getlastname() ); 20 System.out.printf( "%s %s\n", "Social security number is", 21 employee.getsocialsecuritynumber() ); 22 System.out.printf( "%s %.2f\n", "Gross sales is", 23 employee.getgrosssales() ); 24 System.out.printf( "%s %.2f\n", "Commission rate is", 25 employee.getcommissionrate() ); 26 System.out.printf( "%s %.2f\n", "Base salary is", 27 employee.getbasesalary() ); 28

29 employee.setbasesalary(1000); // set base salary 30 31 System.out.printf( "\n%s:\n\n%s\n", 32 "Updated employee information obtained by tostring", 33 employee.tostring() ); 34 } // end main 35 } // end class BasePlusCommissionEmployeeTest3 Employee information obtained by get methods: First name is Bob Last name is Lewis Social security number is 333-33-3333 Gross sales is 5000.00 Commission rate is 0.04 Base salary is 300.00 Updated employee information obtained by tostring: base-salaried commission employee: Bob Lewis social security number: 333-33-3333 gross sales: 5000.00 commission rate: 0.04 base salary: 1000.00

...Ιεραρχία κληρονομικότητας ComissionEmployee BasePlusCommissionEmployee με χρήση protected μεταβλητών στιγμιοτύπου Χρήση protected μεταβλητών στιγμιότυπων Πλεονεκτήματα Οι υποκλάσεις μπορούν να τροποποιήσουν τις τιμές απευθείας Ελαφρά αύξηση στην απόδοση Αποφυγή πολλαπλών set/get μεθόδων Μειονεκτήματα Δεν υπάρχει έλεγχος επικύρωσης Η υποκλάση μπορεί να αναθέσει «κακή» τιμή Εξάρτηση από την υλοποίηση Οι μέθοδοι της υποκλάσης εξαρτώνται περισσότερο από την υλοποίηση της υπερκλάσης Αλλαγές στην υλοποίηση της υπερκλάσης μπορεί να οδηγήσουν σε τροποποιήσεις των υποκλάσεων Η έννοια του «Εύθραυστου (ασταθούς) λογισμικού»

Παρατηρήσεις Χρησιμοποιούμε το τροποποιητικό πρόσβασης protected όταν μια υπερκλάση πρέπει να παρέχει μια μέθοδο μόνο στις υποκλάσεις της και στις κλάσεις του ίδιου πακέτου, αλλά όχι σε άλλους πελάτες Δηλώνοντας τις μεταβλητές στιγμιότυπου ως private (αντί για protected) επιτρέπει στην υλοποίηση της υπερκλάσης αυτών των μεταβλητών να αλλάζει χωρίς να επηρεάζει τις υλοποιήσεις των υποκλάσεων

Αποφυγή σφαλμάτων Όταν είναι δυνατό, μην περιλαμβάνετε protected μεταβλητές στιγμιότυπου σε μια υπερκλάση Αντ αυτού, χρησιμοποιείστε μη-private μεθόδους για την πρόσβαση σε private μεταβλητές στιγμιότυπου

Ιεραρχία κληρονομικότητας CommissionEmployee BasePlusCommissionEmployee με χρήση private μεταβλητών στιγμιοτύπου Επανεξέταση ιεραρχίας Χρήση της καλύτερης πρακτικής τεχνολογίας λογισμικού Δηλώνουμε μεταβλητές στιγμιότυπου ως private Παρέχουμε public μεθόδους get και set Χρησιμοποιούμε μέθοδο get για να ανακτήσουμε τις τιμές από μεταβλητές στιγμιότυπου

1 // Fig. 9.12: CommissionEmployee3.java 2 // CommissionEmployee3 class represents a commission employee. 3 4 public class CommissionEmployee3 5 { 6 private String firstname; 7 private String lastname; 8 private String socialsecuritynumber; 9 private double grosssales; // gross weekly sales Δήλωση private μεταβλητών στιγμιοτύπου 10 private double commissionrate; // commission percentage 11 12 // five-argument constructor 13 public CommissionEmployee3(String first, String last, String ssn, 14 double sales, double rate) 15 { 16 // implicit call to Object constructor occurs here 17 firstname = first; 18 lastname = last; 19 socialsecuritynumber = ssn; 20 setgrosssales(sales); // validate and store gross sales 21 setcommissionrate(rate); // validate and store commission rate 22 } // end five-argument CommissionEmployee3 constructor 23 24 // set first name 25 public void setfirstname(string first) 26 { 27 firstname = first; 28 } // end method setfirstname 29

30 // return first name 31 public String getfirstname() 32 { 33 return firstname; 34 } // end method getfirstname 35 36 // set last name 37 public void setlastname(string last) 38 { 39 lastname = last; 40 } // end method setlastname 41 42 // return last name 43 public String getlastname() 44 { 45 return lastname; 46 } // end method getlastname 47 48 // set social security number 49 public void setsocialsecuritynumber(string ssn) 50 { 51 socialsecuritynumber = ssn; // should validate 52 } // end method setsocialsecuritynumber 53 54 // return social security number 55 public String getsocialsecuritynumber() 56 { 57 return socialsecuritynumber; 58 } // end method getsocialsecuritynumber 59

60 // set gross sales amount 61 public void setgrosssales(double sales) 62 { 63 grosssales = (sales < 0.0)? 0.0 : sales; 64 } // end method setgrosssales 65 66 // return gross sales amount 67 public double getgrosssales() 68 { 69 return grosssales; 70 } // end method getgrosssales 71 72 // set commission rate 73 public void setcommissionrate(double rate) 74 { 75 commissionrate = (rate > 0.0 && rate < 1.0)? rate : 0.0; 76 } // end method setcommissionrate 77 78 // return commission rate 79 public double getcommissionrate() 80 { 81 return commissionrate; 82 } // end method getcommissionrate 83

84 // calculate earnings 85 public double earnings() 86 { 87 return getcommissionrate() * getgrosssales(); 88 } // end method earnings 89 Χρήση μεθόδων get για ανάκτηση των τιμών των μεταβλητών στιγμιοτύπου 90 // return String representation of CommissionEmployee3 object 91 public String tostring() 92 { 93 return String.format( "%s: %s %s\n%s: %s\n%s: %.2f\n%s: %.2f", 94 "commission employee", getfirstname(), getlastname(), 95 "social security number", getsocialsecuritynumber(), 96 "gross sales", getgrosssales(), 97 "commission rate", getcommissionrate() ); 98 } // end method tostring 99 } // end class CommissionEmployee3

1 // Fig. 9.13: BasePlusCommissionEmployee4.java 2 // BasePlusCommissionEmployee4 class inherits from CommissionEmployee3 and 3 // accesses CommissionEmployee3's private data via CommissionEmployee3's Κληρονομεί από την CommissionEmployee3 4 // public methods. 5 6 public class BasePlusCommissionEmployee4 extends CommissionEmployee3 7 { 8 private double basesalary; // base salary per week 9 10 // six-argument constructor 11 public BasePlusCommissionEmployee4(String first, String last, 12 String ssn, double sales, double rate, double salary) 13 { 14 super(first, last, ssn, sales, rate); 15 setbasesalary(salary); // validate and store base salary 16 } // end six-argument BasePlusCommissionEmployee4 constructor 17 18 // set base salary 19 public void setbasesalary(double salary) 20 { 21 basesalary = (salary < 0.0)? 0.0 : salary; 22 } // end method setbasesalary 23

24 // return base salary 25 public double getbasesalary() 26 { 27 return basesalary; 28 } // end method getbasesalary 29 30 // calculate earnings 31 public double earnings() 32 { Κλήση της overriden μεθόδου earnings της υπερκλάσης από την υποκλάση Χρήση των μεθόδων get για 33 return getbasesalary() + super.earnings(); την ανάκτηση των τιμών των 34 } // end method earnings μεταβλητών στιγμιοτύπου 35 36 // return String representation of BasePlusCommissionEmployee4 37 public String tostring() 38 { 39 return String.format("%s %s\n%s: %.2f", "base-salaried", 40 super.tostring(), "base salary", getbasesalary()); 41 } // end method tostring 42 } // end class BasePlusCommissionEmployee4 Καλείται η overridden μέθοδος tostring της υπερκλάσης από την υπορκλάση

Συνηθισμένο προγραμματιστικό σφάλμα Όταν η μέθοδος μιας υπερκλάσης παρακάμπτεται (overridden) σε μια υποκλάση, η έκδοση της υποκλάσης συχνά καλεί την έκδοση της υπερκλάσης «για να κάνει ένα μέρος της δουλειάς» Εάν δεν χρησιμοποιηθεί πριν από το όνομα της μεθόδου της υπερκλάσης η λέξη-κλειδί super και μετά η τελεία (.) όταν αναφερόμαστε στη μέθοδο της υπερκλάσης, τότε η μέθοδος της υποκλάσης καλεί τον εαυτό της, κι έτσι δημιουργείται σφάλμα «ατέρμονης επανάληψης επιστροφής» (infinite recursion)

1 // Fig. 9.14: BasePlusCommissionEmployeeTest4.java 2 // Testing class BasePlusCommissionEmployee4. 3 4 public class BasePlusCommissionEmployeeTest4 Δημιουργία αντικειμένου 5 { BasePlusCommissionEmployee4 6 public static void main( String args[] ) 7 { 8 // instantiate BasePlusCommissionEmployee4 object 9 BasePlusCommissionEmployee4 employee = 10 new BasePlusCommissionEmployee4( 11 "Bob", "Lewis", "333-33-3333", 5000,.04, 300 ); 12 13 // get base-salaried commission employee data 14 System.out.println( 15 "Employee information obtained by get methods: \n" ); 16 System.out.printf( "%s %s\n", "First name is", 17 employee.getfirstname() ); 18 System.out.printf( "%s %s\n", "Last name is", 19 employee.getlastname() ); 20 Χρήση των System.out.printf( "%s %s\n", "Social security number is", 21 employee.getsocialsecuritynumber() ); 22 System.out.printf( "%s %.2f\n", "Gross sales is", 23 employee.getgrosssales() ); 24 System.out.printf( "%s %.2f\n", "Commission rate is", 25 employee.getcommissionrate() ); 26 System.out.printf( "%s %.2f\n", "Base salary is", 27 employee.getbasesalary() ); 28 κληρονομημένων μεθόδων get για πρόσβαση σε κληρονομημένες private μεταβλητές στιγμιοτύπου Χρήση της μεθόδου get της BasePlusCommissionEmployee4 για πρόσβαση στην private μεταβλητή στιγμιοτύπου

29 employee.setbasesalary( 1000 ); // set base salary 30 Χρήση της μεθόδου set της 31 System.out.printf( "\n%s:\n\n%s\n", BasePlusCommissionE 32 "Updated employee information obtained by tostring", mployee4 για 33 employee.tostring() ); τροποποίηση της private 34 } // end main μεταβλητής στγμιοτύπου 35 } // end class BasePlusCommissionEmployeeTest4 basesalary. Employee information obtained by get methods: First name is Bob Last name is Lewis Social security number is 333-33-3333 Gross sales is 5000.00 Commission rate is 0.04 Base salary is 300.00 Updated employee information obtained by tostring: base-salaried commission employee: Bob Lewis social security number: 333-33-3333 gross sales: 5000.00 commission rate: 0.04 base salary: 1000.00

Κατασκευαστές σε υποκλάσεις Δημιουργία στιγμιότυπου αντικειμένου υποκλάσης Αλυσίδα κλήσης κατασκευαστών Ο κατασκευαστής της υποκλάσης καλεί τον κατασκευαστή της υπερκλάσης Έμμεσα (καλώντας την προεπιλεγμένη ή τον χωρίς ορίσματα κατασκευαστή της υπερκλάσης) Άμεσα (μέσω της super) Βάση της ιεραρχίας κληρονομικότητας Ο τελευταίος κατασκευαστής που καλείται σε αυτή την αλυσίδα, είναι ο κατασκευαστής της Object Το σώμα του αρχικού κατασκευαστή υποκλάσης τελειώνει την εκτέλεσή του τελευταίο Παράδειγμα : ιεραρχία CommissionEmployee3- BasePlusCommissionEmployee4 Ο κατασκευαστής της CommissionEmployee3 καλείται προτελευταίος (τελευταίος είναι αυτός της Object) Το σώμα του κατασκευαστή της CommissionEmployee3 CommissionEmployee3 σταματά την εκτέλεσή του δεύτερο (πρώτο είναι αυτό της Object)

...Κατασκευαστές σε 1 // Fig. 9.15: CommissionEmployee4.java 2 // CommissionEmployee4 class represents a commission employee. 3 υποκλάσεις 4 public class CommissionEmployee4 5 { 6 private String firstname; 7 private String lastname; 8 private String socialsecuritynumber; 9 private double grosssales; // gross weekly sales 10 private double commissionrate; // commission percentage 11 12 // five-argument constructor 13 public CommissionEmployee4(String first, String last, String ssn, 14 double sales, double rate) 15 { 16 // implicit call to Object constructor occurs here 17 firstname = first; 18 lastname = last; 19 socialsecuritynumber = ssn; 20 setgrosssales(sales); // validate and store gross sales 21 setcommissionrate(rate); // validate and store commission rate 22 23 System.out.printf( 24 "\ncommissionemployee4 constructor:\n%s\n", this ); 25 } // end five-argument CommissionEmployee4 constructor 26 Ο κατασκευαστής παράγει ένα μήνυμα ώστε να ελέγξουμε τη σειρά κλήσης των μεθόδων

...Κατασκευαστές σε 27 // set first name 28 public void setfirstname(string first) 29 { υποκλάσεις 30 firstname = first; 31 } // end method setfirstname 32 33 // return first name 34 public String getfirstname() 35 { 36 return firstname; 37 } // end method getfirstname 38 39 // set last name 40 public void setlastname(string last) 41 { 42 lastname = last; 43 } // end method setlastname 44 45 // return last name 46 public String getlastname() 47 { 48 return lastname; 49 } // end method getlastname 50 51 // set social security number 52 public void setsocialsecuritynumber(string ssn) 53 { 54 socialsecuritynumber = ssn; // should validate 55 } // end method setsocialsecuritynumber 56

...Κατασκευαστές σε 57 // return social security number 58 public String getsocialsecuritynumber() 59 υποκλάσεις { 60 return socialsecuritynumber; 61 } // end method getsocialsecuritynumber 62 63 // set gross sales amount 64 public void setgrosssales(double sales) 65 { 66 grosssales = (sales < 0.0)? 0.0 : sales; 67 } // end method setgrosssales 68 69 // return gross sales amount 70 public double getgrosssales() 71 { 72 return grosssales; 73 } // end method getgrosssales 74 75 // set commission rate 76 public void setcommissionrate(double rate) 77 { 78 commissionrate = (rate > 0.0 && rate < 1.0)? rate : 0.0; 79 } // end method setcommissionrate 80

...Κατασκευαστές σε 81 // return commission rate 82 public double getcommissionrate() 83 υποκλάσεις { 84 return commissionrate; 85 } // end method getcommissionrate 86 87 // calculate earnings 88 public double earnings() 89 { 90 return getcommissionrate() * getgrosssales(); 91 } // end method earnings 92 93 // return String representation of CommissionEmployee4 object 94 public String tostring() 95 { 96 return String.format("%s: %s %s\n%s: %s\n%s: %.2f\n%s: %.2f", 97 "commission employee", getfirstname(), getlastname(), 98 "social security number", getsocialsecuritynumber(), 99 "gross sales", getgrosssales(), 100 "commission rate", getcommissionrate()); 101 } // end method tostring 102 } // end class CommissionEmployee4

...Κατασκευαστές σε 1 // Fig. 9.16: BasePlusCommissionEmployee5.java 2 // BasePlusCommissionEmployee5 class declaration. 3 υποκλάσεις 4 public class BasePlusCommissionEmployee5 extends CommissionEmployee4 5 { 6 private double basesalary; // base salary per week 7 8 // six-argument constructor 9 public BasePlusCommissionEmployee5(String first, String last, 10 String ssn, double sales, double rate, double salary) 11 { 12 super(first, last, ssn, sales, rate); 13 setbasesalary( salary ); // validate and store base salary 14 15 System.out.printf( 16 "\nbasepluscommissionemployee5 constructor:\n%s\n", this ); 17 } // end six-argument BasePlusCommissionEmployee5 constructor 18 19 // set base salary 20 public void setbasesalary(double salary) 21 { 22 basesalary = (salary < 0.0)? 0.0 : salary; 23 } // end method setbasesalary 24 Ο κατασκευαστής παράγει ένα μήνυμα ώστε να ελέγξουμε τη σειρά κλήσης των μεθόδων κατασκευαστή

...Κατασκευαστές σε 25 // return base salary 26 public double getbasesalary() 27 { υποκλάσεις 28 return basesalary; 29 } // end method getbasesalary 30 31 // calculate earnings 32 public double earnings() 33 { 34 return getbasesalary() + super.earnings(); 35 } // end method earnings 36 37 // return String representation of BasePlusCommissionEmployee5 38 public String tostring() 39 { 40 return String.format( "%s %s\n%s: %.2f", "base-salaried", 41 super.tostring(), "base salary", getbasesalary() ); 42 } // end method tostring 43 } // end class BasePlusCommissionEmployee5

...Κατασκευαστές σε 1 // Fig. 9.17: ConstructorTest.java 2 // Display order in which superclass and subclass constructors are called. 3 υποκλάσεις 4 public class ConstructorTest Δημιουργία αντικειμένου 5 { CommissionEmployee4 6 public static void main( String args[] ) 7 { 8 CommissionEmployee4 employee1 = new CommissionEmployee4( 9 "Bob", "Lewis", "333-33-3333", 5000,.04 ); 10 11 System.out.println(); 12 BasePlusCommissionEmployee5 employee2 = 13 new BasePlusCommissionEmployee5( 14 "Lisa", "Jones", "555-55-5555", 2000,.06, 800 ); 15 16 System.out.println(); 17 BasePlusCommissionEmployee5 employee3 = 18 new BasePlusCommissionEmployee5( 19 "Mark", "Sands", "888-88-8888", 8000,.15, 2000 ); 20 } // end main 21 } // end class ConstructorTest Δημιουργία 2 αντικειμένων BasePlusCommissionEmployee5 για επίδειξη της σειράς κλήσης των κατασκευαστών της υπερκλάσης και της υποκλάσης

...Κατασκευαστές σε CommissionEmployee4 constructor: commission employee: Bob Lewis social security number: 333-33-3333 gross sales: 5000.00 commission rate: 0.04 υποκλάσεις CommissionEmployee4 constructor: base-salaried commission employee: Lisa Jones social security number: 555-55-5555 gross sales: 2000.00 commission rate: 0.06 base salary: 0.00 BasePlusCommissionEmployee5 constructor: base-salaried commission employee: Lisa Jones social security number: 555-55-5555 gross sales: 2000.00 commission rate: 0.06 base salary: 800.00 CommissionEmployee4 constructor: base-salaried commission employee: Mark Sands social security number: 888-88-8888 gross sales: 8000.00 commission rate: 0.15 base salary: 0.00 BasePlusCommissionEmployee5 constructor: base-salaried commission employee: Mark Sands social security number: 888-88-8888 gross sales: 8000.00 commission rate: 0.15 base salary: 2000.00 Το σώμα του κατασκευαστή της υποκλάσης BasePlusCommissionEmployee 5 εκτελείται μετά από τη λήξη της εκτέλεσης του κατασκευαστή της υπερκλάσης CommissionEmployee4

Μέθοδοι επικάλυψης Όταν μια μέθοδος ορίζεται σε μια υποκλάση και στην υπερκλάση, χρησιμοποιείται η μέθοδος της υποκλάσης. Αυτό επιτρέπει σε μια υποκλάση να αλλάζει, να αντικαθιστά ή να καταργεί τελείως μέρος της συμπεριφοράς ή των ιδιοτήτων των υπερκλάσεων της. Η δημιουργία μιας νέας μεθόδου σε μια υποκλάση, έτσι ώστε να αλλάξει η συμπεριφορά που κληρονομήθηκε από μια υπερκλάση ονομάζεται μέθοδος επικάλυψης (Overriding).

Overriding vs. Overloading Διαφορετικά concepts! Overloading: πολλαπλές μέθοδοι στην ίδια κλάση με το ίδιο όνομα αλλά διαφορετικά signatures Overriding: δύο μέθοδοι, η μία σε parent class και η άλλη σε child class που έχουν το ίδιο signature Overloading: επιτρέπει να ορίσουμε μία παρόμοια λειτουργία με διαφορετικούς τρόπους για παρόμοια δεδομένα Overriding : επιτρέπει να ορίσουμε μία παρόμοια λειτουργία με διαφορετικούς τρόπους για διαφορετικά αλλά compatible object types

Η χρήση του this και του super Με τη λέξη this αναφερόμαστε σε μεταβλητές του τρέχοντος αντικειμένου μας. public class ΟνομαΚλασης { private int a; public μεθοδοςα( int a){ this.a = 15;... } }

Η χρήση του this και του super Σε υποκλάσεις η λέξη this χρησιμοποιείται όταν θέλουμε να αναφερθούμε σε μεταβλητές και μεθόδους του τρέχοντος αντικειμένου μας.

Η χρήση του this και του super Η λέξη super χρησιμοποιείται όταν θέλουμε να αναφερθούμε σε μεταβλητές και μεθόδους της αμέσως προηγούμενης υπερκλάσης του αντικειμένου μας.

Η χρήση του this και του super Η λέξη super χρησιμοποιείται στη μέθοδο κατασκευής μιας υποκλάσης. Με αυτόν τον τρόπο συνδέουμε τη μέθοδο κατασκευής μιας υποκλάσης με αυτήν της υπερκλάσης της. Για παράδειγμα ας υποθέσουμε τις ClassA και ClassB. Αν ορίσουμε public class ClassB extends ClassA { } public ClassB(int x, String a){ } super(x,a);.. Η μέθοδος κατασκευής της υποκλάσης ClassB χρησιμοποιεί το super(x,a) για να καλέσει μια ανάλογη μέθοδο κατασκευής από την υπερκλάση της ClassA.

Keywords this και super

Παραδείγματα Ποια είναι η έξοδος του παρακάτω προγράμματος Test? class A { public int x=1; public int y=5; public A() { y=6; } public A(int a) { x=a; } public A(int a, int b) { x=a; y=b; } } class B extends A { public B() {} public B(int a) { super(a); } public B(int a, int b) { super(a,b); } public B(int a, int b, int c) { x=a+b+c; } public B(int a, int b, int c, int d) { super(a,b); y=c+d;} } public class Test { public static void main(string[] args) { B b1 = new B(); System.out.println("b1.x: "+b1.x+" b1.y: "+b1.y);} } 1, 6

Παραδείγματα Ποια είναι η έξοδος του παρακάτω προγράμματος Test? class A { public int x=1; public int y=5; public A() { y=6; } public A(int a) { x=a; } public A(int a, int b) { x=a; y=b; } } class B extends A { public B() {} public B(int a) { super(a); } public B(int a, int b) { super(a,b); } public B(int a, int b, int c) { x=a+b+c; } public B(int a, int b, int c, int d) { super(a,b); y=c+d;} } public class Test { public static void main(string[] args) { B b2 = new B(2); System.out.println("b2.x: "+b2.x+" b2.y: "+b2.y);} } 2, 5

Παραδείγματα Ποια είναι η έξοδος του παρακάτω προγράμματος Test? class A { public int x=1; public int y=5; public A() { y=6; } public A(int a) { x=a; } public A(int a, int b) { x=a; y=b; } } class B extends A { public B() {} public B(int a) { super(a); } public B(int a, int b) { super(a,b); } public B(int a, int b, int c) { x=a+b+c; } public B(int a, int b, int c, int d) { super(a,b); y=c+d;} } public class Test { public static void main(string[] args) { B b3 = new B(3,4); System.out.println("b3.x: "+b3.x+" b3.y: "+b3.y);} } 3, 4

Παραδείγματα Ποια είναι η έξοδος του παρακάτω προγράμματος Test? class A { public int x=1; public int y=5; public A() { y=6; } public A(int a) { x=a; } public A(int a, int b) { x=a; y=b; } } class B extends A { public B() {} public B(int a) { super(a); } public B(int a, int b) { super(a,b); } public B(int a, int b, int c) { x=a+b+c; } public B(int a, int b, int c, int d) { super(a,b); y=c+d;} } public class Test { public static void main(string[] args) { B b4 = new B(1,1,1); System.out.println("b4.x: "+b4.x+" b4.y: "+b4.y);} } 3, 6

Παραδείγματα Ποια είναι η έξοδος του παρακάτω προγράμματος Test? class A { public int x=1; public int y=5; public A() { y=6; } public A(int a) { x=a; } public A(int a, int b) { x=a; y=b; } } class B extends A { public B() {} public B(int a) { super(a); } public B(int a, int b) { super(a,b); } public B(int a, int b, int c) { x=a+b+c; } public B(int a, int b, int c, int d) { super(a,b); y=c+d;} } public class Test { public static void main(string[] args) { B b5 = new B(2,2,2,2); System.out.println("b5.x: "+b5.x+" b5.y: "+b5.y);} } 2, 4