10. Αντικειμενοστραφής Προγραμματισμός (Object Oriented Programming - OOP)

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

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

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

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

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

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

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

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

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

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

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

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

Εργαστήριο Ανάπτυξης Εφαρμογών Βάσεων Δεδομένων. Εξάμηνο 7 ο

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

Ανάλυση άσκησης. Employee. SalariedEmployee CommissionEmployee HourlyEmployee. BasePlusCommissionEmployee

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

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

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

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

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

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

ΕΙΣΑΓΩΓΗ ΣΤΟN ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ - ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 133: ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΕΡΓΑΣΤΗΡΙΟ 3 Javadoc Tutorial

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

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

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

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

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

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

Καλές επιτυχίες παιδιά στα υπόλοιπα μαθήματά σας και καλές γιορτές!!!!

Καλές επιτυχίες παιδιά στα υπόλοιπα μαθήματά σας και καλές γιορτές!!!!

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

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

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

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

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

The Simply Typed Lambda Calculus

17TimeThis.h function returns reference pointer to same object { return *this; }

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

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

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

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

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

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

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

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

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

Δομές Δεδομένων - Εργαστήριο 2. Λίστες

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

7.1 Εισαγωγή 7.2 const Αντικείµενα και const Συναρτήσεις 7.3 Σύνθεση: Αντικείµενα ως µέλη τάξης 7.4 friend Συναρτήσεις και τάξεις 7.

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Μέθοδοι που επιστρέφουν αντικείμενα Deep and Shallow Copies

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

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

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

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

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

Instruction Execution Times

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

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

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

Αντικείµενα. ηµιουργία και χρησιµοποίηση αντικειµένων. ηµιουργία αντικειµένων

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

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

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

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

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

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

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 19/5/2007

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Έλεγχος ισότητας String Interning Αποαναφοροποίηση - dereferencing

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

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

. Μεθοδολογία Προγραμματισμού. Abstract Κλάσεις και Interfaces. Νικόλαος Πεταλίδης. Εισαγωγή Εαρινό Εξάμηνο 2014

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

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

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

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

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

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

SOAP API. Table of Contents

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

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

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 4 : CLASSES

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

(C) 2010 Pearson Education, Inc. All rights reserved.

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Σύντομη εισαγωγή στην Java

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 6/5/2006

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

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

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

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

Transcript:

10. Αντικειμενοστραφής Προγραμματισμός (Object Oriented Programming - OOP) Χειμερινό εξάμηνο 2016 Πέτρος Κωμοδρόμος komodromos@ucy.ac.cy http://www.eng.ucy.ac.cy/petros 1

Θέματα Έλεγχος πρόσβασης στα μέλη μιας τάξης Η χρήση του κλειδιού (keyword) this Συναρτήσεις κατασκευής αντικειμένων (constructors) Μέθοδοι set και get Σύνθεση (composition) Συλλογή απορριμμάτων (garbage collection) Στατικές και μη μετατρεπόμενες μεταβλητές και μέθοδοι (static and final variables and methods) Συμπερίληψη (encapsulation) και απόκρυψη πληροφοριών (data hiding) Αφαιρετικότητα δεδομένων (data abstraction and abstract data types) Έλεγχος πρόσβασης σε πακέτα (package access) 2

Κληρονομικότητα (inheritance) Υπερτάξεις (superclasses) και υποτάξεις (subclasses) Προστατευόμενα (protected) μέλη τάξεων Πλήρως περιορισμένα (private) μέλη τάξεων Επαναχρησιμοποίηση λογισμικού (software resusability) Πρόσβαση μελών υπερτάξεων με το κλειδί (keyword) super Συναρτήσεις κατασκευής αντικειμένων (constructors) υπερτάξεων Αξιοποίηση μεθόδων υπερτάξεων Μέθοδοι της τάξης Object Πολυμορφικότητα (polymorphism) Αόριστες τάξεις και μέθοδοι (abstract classes and methods) Τελικές μέθοδοι και τάξεις (final methods and classes) Δομές διασυνδέσεις (interfaces) 3

1 // Fig. 8.1: Time1.java 2 // Time1 class declaration maintains the time in 24-hour format. 3 4 public class Time1 5 6 private int hour; // 0 23 7 private int minute; // 0-59 8 private int second; // 0-59 9 10 // set a new time value using universal time; ensure that 11 // the data remains consistent by setting invalid values to zero 12 public void settime( int h, int m, int s ) 13 14 hour = ( ( h >= 0 && h < 24 )? h : 0 ); // validate hour 15 minute = ( ( m >= 0 && m < 60 )? m : 0 ); // validate minute 16 second = ( ( s >= 0 && s < 60 )? s : 0 ); // validate second 17 // end method settime 18 Έλεγχος πρόσβασης στα μέλη μιας τάξης (κλάσης) private instance variables Declare public method settime Validate parameter values before setting instance variables 4

19 // convert to String in universal-time format (HH:MM:SS) 20 public String touniversalstring() 21 22 return String.format( "%02d:%02d:%02d", hour, minute, second ); 23 // end method touniversalstring 24 25 // convert to String in standard-time format (H:MM:SS AM or PM) 26 public String tostring() 27 28 return String.format( "%d:%02d:%02d %s", 29 ( ( hour == 0 hour == 12 )? 12 : hour % 12 ), 30 minute, second, ( hour < 12? "AM" : "PM" ) ); 31 // end method tostring 32 // end class Time1 format strings 5

1 // Fig. 8.2: Time1Test.java 2 // Time1 object used in an application. 3 4 public class Time1Test 5 6 public static void main( String args[] ) 7 8 // create and initialize a Time1 object 9 Time1 time = new Time1(); // invokes Time1 constructor 10 11 // output string representations of the time 12 System.out.print( "The initial universal time is: " ); 13 System.out.println( time.touniversalstring() ); 14 System.out.print( "The initial standard time is: " ); 15 System.out.println( time.tostring() ); 16 System.out.println(); // output a blank line 17 Create a Time1 object Call tostring method 6

18 // change time and output updated time 19 time.settime( 13, 27, 6 ); 20 System.out.print( "Universal time after settime is: " ); 21 System.out.println( time.touniversalstring() ); 22 System.out.print( "Standard time after settime is: " ); 23 System.out.println( time.tostring() ); 24 System.out.println(); // output a blank line 25 26 // set time with invalid values; output updated time 27 time.settime( 99, 99, 99 ); 28 System.out.println( "After attempting invalid settings:" ); 29 System.out.print( "Universal time: " ); 30 System.out.println( time.touniversalstring() ); 31 System.out.print( "Standard time: " ); 32 System.out.println( time.tostring() ); 33 // end main 34 // end class Time1Test The initial universal time is: 00:00:00 The initial standard time is: 12:00:00 AM Universal time after settime is: 13:27:06 Standard time after settime is: 1:27:06 PM Call settime method Call settime method with invalid values After attempting invalid settings: Universal time: 00:00:00 Standard time: 12:00:00 AM 7

Παρατηρήσεις Ο χρήστης μίας τάξης πρέπει να γνωρίζει μόνο τα δημόσια (public) μέλη της τάξης και όχι και την εσωτερική δομή και λειτουργία των δεδομένων και μεθόδων, τα οποία πρέπει να έχουν την ευελιξία να τροποποιηθούν Οι τιμές των μεταβλητών μίας τάξης (instance variables) μπορούν να οριστούν είτε όταν ορίζονται οι μεταβλητές είτε σε μία μέθοδο κατασκευής αντικειμένων (constructor method) Αν μια τάξη δεν παρέχει συνάρτηση κατασκευής (constructor) ο μεταγλωττιστής (compiler) παρέχει ένα (προεπιλεγμένο) default constructor Αν μία τάξη δεν παρέχει κάποιους constructors, τότε η χρήση του new καλεί έμμεσα τον default constructor της τάξης για να οριστούν οι αρχικές τιμές του αντικειμένου με τα προεπιλεγόμενα μεγέθη Η μέθοδος format της τάξης String δίνει αντίστοιχες δυνατότητες με την μέθοδο printf επιστρέφοντας ένα κατάλληλα μορφοποιημένο string 8

1 // Fig. 8.3: MemberAccessTest.java 2 // Private members of class Time1 are not accessible. 3 public class MemberAccessTest 4 5 public static void main( String args[] ) 6 7 Time1 time = new Time1(); // create and initialize Time1 object 8 9 time.hour = 7; // error: hour has private access in Time1 10 time.minute = 15; // error: minute has private access in Time1 11 time.second = 30; // error: second has private access in Time1 12 // end main 13 // end class MemberAccessTest Attempting to access private instance variables MemberAccessTest.java:9: hour has private access in Time1 time.hour = 7; // error: hour has private access in Time1 ^ MemberAccessTest.java:10: minute has private access in Time1 time.minute = 15; // error: minute has private access in Time1 ^ MemberAccessTest.java:11: second has private access in Time1 time.second = 30; // error: second has private access in Time1 ^ 3 errors 9

Κωδικοί πρόσβασης (access modifiers) private: πρόσβαση μόνο μέσα από την ίδια την τάξη (data hiding) μέθοδοι set και get protected: πρόσβαση μέσα από την τάξη, οποιαδήποτε υποτάξη (its subclasses), και τάξεις που ορίζονται στο ίδιο πακέτο package: πρόσβαση μέσα από την τάξη και τάξεις που ορίζονται στο ίδιο πακέτο. Αυτό είναι το κατά συνθήκη επίπεδο πρόσβασης (default access level) όταν δεν καθορίζεται κάτι διαφορετικό public: υπάρχει πρόσβαση από οποιαδήποτε τάξη 10

Η χρήση του κλειδιού (keyword) this Το this είναι μία αναφορά (reference) του κάθε αντικειμένου στον εαυτό του Οι μη στατικές (non-static ή non-class) μέθοδοι έμμεσα χρησιμοποιούν το this όταν αναφέρονται σε μεταβλητές και μεθόδους του αντικειμένου. Έτσι το this μπορεί να χρησιμοποιηθεί για την πρόσβαση σε μεταβλητές ενός αντικειμένου που τις κρύβουν τοπικές μεταβλητές με το ίδιο όνομα Η κάθε μέθοδος μίας τάξης έμμεσα χρησιμοποιεί το this για να καθορίσει το συγκεκριμένο αντικείμενο της τάξης στο οποίο ενεργεί Ένα αρχείο.java μπορεί να περιέχει περισσότερες από μία τάξεις Όμως μία τάξη με δημόσια πρόσβαση (public) πρέπει να είναι σε αρχείο με το ίδιο όνομα με αυτή. Έτσι μόνο μία τάξη σε ένα αρχείο μπορεί να είναι δημόσια (public). Η Java εξοικονομεί χώρο διατηρώντας μόνο ένα αντίγραφο της κάθε μεθόδου ανά τάξη, η οποία καλείται από κάθε αντικείμενο της τάξης. Το κάθε αντικείμενο έχει τα δικά του αντίγραφα των μη στατικών μεταβλητών 11

1 // Fig. 8.4: ThisTest.java Outline 2 // this used implicitly and explicitly to refer to members of an object. 3 4 public class ThisTest 5 6 public static void main( String args[] ) 7 8 SimpleTime time = new SimpleTime( 15, 30, 19 ); 9 System.out.println( time.buildstring() ); 10 // end main 11 // end class ThisTest 12 13 // class SimpleTime demonstrates the "this" reference 14 class SimpleTime 15 16 private int hour; // 0-23 17 private int minute; // 0-59 18 private int second; // 0-59 19 20 // if the constructor uses parameter names identical to 21 // instance variable names the "this" reference is 22 // required to distinguish between names 23 public SimpleTime( int hour, int minute, int second ) 24 25 this.hour = hour; // set "this" object's hour 26 this.minute = minute; // set "this" object's minute 27 this.second = second; // set "this" object's second 28 // end SimpleTime constructor Declare instance variables Create new SimpleTime object Method parameters shadow instance variables Using this to access the object s instance variables 12

30 // use explicit and implicit "this" to call touniversalstring 31 public String buildstring() 32 33 return String.format( "%24s: %s\n%24s: %s", 34 "this.touniversalstring()", this.touniversalstring(), 35 "touniversalstring()", touniversalstring() ); 36 // end method buildstring 37 38 // convert to String in universal-time format (HH:MM:SS) 39 public String touniversalstring() 40 41 // "this" is not required here to access instance variables, 42 // because method does not have local variables with same 43 // names as instance variables 44 return String.format( "%02d:%02d:%02d", 45 this.hour, this.minute, this.second ); 46 // end method touniversalstring 47 // end class SimpleTime Using this explicitly and implicitly to call touniversalstring Use of this not necessary here this.touniversalstring(): 15:30:19 touniversalstring(): 15:30:19 13

Μέθοδοι κατασκευής αντικειμένων (constructors) Μπορούν να παρέχονται πολλοί διαφορετικοί ορισμοί μεθόδων κατασκευής (constructors), δηλαδή να υπερφορτωθούν οι μέθοδοι κατασκευής (overloaded constructors), ώστε να μπορούν να αρχικοποιηθούν (initialized) κατάλληλα τα μέλη του αντικειμένου Ο κατάλληλος constructor καλείται βάσει του αριθμού και τύπου των παραμέτρων που χρησιμοποιούνται κατά την κατασκευή του αντικειμένου (όταν χρησιμοποιείται το new) Ένας constructor μπορεί να καλέσει οποιαδήποτε μέθοδο της τάξης. Μια μέθοδος δεν μπορεί άμεσα να καλέσει κάποιο constructor της τάξης Επίσης, η αναφορά this μπορεί να χρησιμοποιηθεί σε κάποιο constructor, ώστε να αξιοποιηθούν εντολές που δίδονται σε άλλο constructor, καλώντας τον, όμως η κλήση πρέπει να είναι η πρώτη εντολή στο σώμα του constructor No argument constructor είναι μέθοδος κατασκευής (constructor) χωρίς παραμέτρους Όταν ένα αντικείμενο έχει μία αναφορά (reference) σε κάποιο άλλο αντικείμενο, τότε έχει πρόσβαση σε οποιαδήποτε μέλος (μεταβλητή ή μέθοδο) του δεύτερου αντικειμένου 14

Default και No-Argument Constructors Η κάθε τάξη πρέπει να έχει τουλάχιστο ένα constructor, και αν κανένας δεν ορίζεται ρητά, τότε ο μεταγλωττιστής δημιουργεί ένα default constructor ο default constructor δεν έχει παραμέτρους και απλά δίνει αρχικές τιμές στις μεταβλητές τις default τιμές, οι οποίες είναι μηδέν αν είναι primitive τύπου, false αν είναι boolean τύπου, και null αν είναι αναφορές (references) σε αντικείμενα ή πίνακες Αν οριστεί έστω και ένας constructor, τότε ο default ορισμός των μεταβλητών ενός αντικειμένου, ο οποίος γίνεται όταν ο constructor κληθεί χωρίς παραμέτρους, γίνεται από τον no-argument constructor, εφόσον αυτός έχει οριστεί Η Java επιτρέπει σε άλλες μεθόδους να έχουν το όνομα της τάξης να έχουν το όνομα της τάξης, πέραν από τους constructors, φτάνει να ορίζεται ο τύπος της επιστρεφόμενης μεταβλητής (return type) 15

Set και Get μέθοδοι Χρήση μεθόδων set και get για την πρόσβαση στις μεταβλητές ενός αντικειμένου μειώνει τις πιθανότητες σφαλμάτων και απλοποιεί πιθανές μελλοντικές αλλαγές Set μέθοδοι Χρησιμοποιούνται για να οριστούν τιμές στις μεταβλητές ενός αντικειμένου (instance variables) Προτιμότερο είναι να ελέγχουν τις νέες τιμές που θα ορίσουν αν είναι επιτρεπτές και μέσα σε λογικά όρια Get μέθοδοι Παρέχουν πρόσβαση στις τιμές των μεταβλητών ενός αντικειμένου Μπορούν να χρησιμοποιηθούν για να μορφοποιηθούν κατάλληλα οι επιστρεφόμενες τιμές Παροχή public μεθόδων, όπως οι μέθοδοι set και get, για να τροποποιήσουμε ή να αποκτήσουμε τις τιμές private μεταβλητών ενός αντικειμένου αποκρύπτει περιττές τεχνικές λεπτομέρειες υλοποίησης της τάξης και επιτρέπει ευκολότερα μελλοντικές αλλαγές 16

1 // Fig. 8.5: Time2.java 2 // Time2 class declaration with overloaded constructors. 3 4 public class Time2 5 6 private int hour; // 0-23 7 private int minute; // 0-59 8 private int second; // 0-59 9 10 // Time2 no-argument constructor: initializes each instance variable 11 // to zero; ensures that Time2 objects start in a consistent state 12 public Time2() 13 14 this( 0, 0, 0 ); // invoke Time2 constructor with three arguments 15 // end Time2 no-argument constructor 16 17 // Time2 constructor: hour supplied, minute and second defaulted to 0 18 public Time2( int h ) 19 20 this( h, 0, 0 ); // invoke Time2 constructor with three arguments 21 // end Time2 one-argument constructor 22 23 // Time2 constructor: hour and minute supplied, second defaulted to 0 24 public Time2( int h, int m ) 25 26 this( h, m, 0 ); // invoke Time2 constructor with three arguments 27 // end Time2 two-argument constructor 28 Invoke three-argument constructor No-argument constructor 17

29 // Time2 constructor: hour, minute and second supplied 30 public Time2( int h, int m, int s ) 31 32 settime( h, m, s ); // invoke settime to validate time 33 // end Time2 three-argument constructor 34 35 // Time2 constructor: another Time2 object supplied 36 public Time2( Time2 time ) 37 38 // invoke Time2 three-argument constructor 39 this( time.gethour(), time.getminute(), time.getsecond() ); 40 // end Time2 constructor with a Time2 object argument 41 42 // Set Methods 43 // set a new time value using universal time; ensure that 44 // the data remains consistent by setting invalid values to zero 45 public void settime( int h, int m, int s ) 46 47 sethour( h ); // set the hour 48 setminute( m ); // set the minute 49 setsecond( s ); // set the second 50 // end method settime Call settime method Constructor takes a reference to another Time2 object as a parameter Could have directly accessed instance variables of object time here 18

52 // validate and set hour 53 public void sethour( int h ) 54 55 hour = ( ( h >= 0 && h < 24 )? h : 0 ); 56 // end method sethour 57 58 // validate and set minute 59 public void setminute( int m ) 60 61 minute = ( ( m >= 0 && m < 60 )? m : 0 ); 62 // end method setminute 63 64 // validate and set second 65 public void setsecond( int s ) 66 67 second = ( ( s >= 0 && s < 60 )? s : 0 ); 68 // end method setsecond 69 70 // Get Methods 71 // get hour value 72 public int gethour() 73 74 return hour; 75 // end method gethour 19

77 // get minute value 78 public int getminute() 79 80 return minute; 81 // end method getminute 82 83 // get second value 84 public int getsecond() 85 86 return second; 87 // end method getsecond 88 89 // convert to String in universal-time format (HH:MM:SS) 90 public String touniversalstring() 91 92 return String.format( 93 "%02d:%02d:%02d", gethour(), getminute(), getsecond() ); 94 // end method touniversalstring 95 96 // convert to String in standard-time format (H:MM:SS AM or PM) 97 public String tostring() 98 99 return String.format( "%d:%02d:%02d %s", 100 ( (gethour() == 0 gethour() == 12)? 12 : gethour() % 12 ), 101 getminute(), getsecond(), ( gethour() < 12? "AM" : "PM" ) ); 102 // end method tostring 103 // end class Time2 20

1 // Fig. 8.6: Time2Test.java 2 // Overloaded constructors used to initialize Time2 objects. 3 4 public class Time2Test 5 6 public static void main( String args[] ) 7 8 Time2 t1 = new Time2(); // 00:00:00 9 Time2 t2 = new Time2( 2 ); // 02:00:00 10 Time2 t3 = new Time2( 21, 34 ); // 21:34:00 11 Time2 t4 = new Time2( 12, 25, 42 ); // 12:25:42 12 Time2 t5 = new Time2( 27, 74, 99 ); // 00:00:00 13 Time2 t6 = new Time2( t4 ); // 12:25:42 14 15 System.out.println( "Constructed with:" ); 16 System.out.println( "t1: all arguments defaulted" ); 17 System.out.printf( " %s\n", t1.touniversalstring() ); 18 System.out.printf( " %s\n", t1.tostring() ); 19 Call overloaded constructors 21

20 System.out.println( 21 "t2: hour specified; minute and second defaulted" ); 22 System.out.printf( " %s\n", t2.touniversalstring() ); 23 System.out.printf( " %s\n", t2.tostring() ); 24 25 System.out.println( 26 "t3: hour and minute specified; second defaulted" ); 27 System.out.printf( " %s\n", t3.touniversalstring() ); 28 System.out.printf( " %s\n", t3.tostring() ); 29 30 System.out.println( "t4: hour, minute and second specified" ); 31 System.out.printf( " %s\n", t4.touniversalstring() ); 32 System.out.printf( " %s\n", t4.tostring() ); 33 34 System.out.println( "t5: all invalid values specified" ); 35 System.out.printf( " %s\n", t5.touniversalstring() ); 36 System.out.printf( " %s\n", t5.tostring() ); 37 22

23

Σύνθεση αντικειμένων (Composition) Μια τάξη μπορεί να οριστεί να έχει σαν μέλη της αναφορές (references) σε αντικείμενα άλλων τάξεων Αυτό αναφέρεται σαν μία σχέση ΕΧΕΙ ΕΝΑ (HAS A relationship) 24

1 // Fig. 8.7: Date.java 2 // Date class declaration. 3 4 public class Date 5 6 private int month; // 1-12 7 private int day; // 1-31 based on month 8 private int year; // any year 9 10 // constructor: call checkmonth to confirm proper value for month; 11 // call checkday to confirm proper value for day 12 public Date( int themonth, int theday, int theyear ) 13 14 month = checkmonth( themonth ); // validate month 15 year = theyear; // could validate year 16 day = checkday( theday ); // validate day 17 18 System.out.printf( 19 "Date object constructor for date %s\n", this ); 20 // end Date constructor 21 25

22 // utility method to confirm proper month value 23 private int checkmonth( int testmonth ) 24 25 if ( testmonth > 0 && testmonth <= 12 ) // validate month 26 return testmonth; 27 else // month is invalid 28 29 System.out.printf( 30 "Invalid month (%d) set to 1.", testmonth ); 31 return 1; // maintain object in consistent state 32 // end else 33 // end method checkmonth 34 35 // utility method to confirm proper day value based on month and year 36 private int checkday( int testday ) 37 38 int dayspermonth[] = 39 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ; 40 Validates month value Validates day value 26

41 // check if day in range for month 42 if ( testday > 0 && testday <= dayspermonth[ month ] ) 43 return testday; 44 45 // check for leap year 46 if ( month == 2 && testday == 29 && ( year % 400 == 0 47 ( year % 4 == 0 && year % 100!= 0 ) ) ) 48 return testday; 49 50 System.out.printf( "Invalid day (%d) set to 1.", testday ); 51 return 1; // maintain object in consistent state 52 // end method checkday 53 54 // return a String of the form month/day/year 55 public String tostring() 56 57 return String.format( "%d/%d/%d", month, day, year ); 58 // end method tostring 59 // end class Date Check if the day is February 29 on a leap year 27

1 // Fig. 8.8: Employee.java 2 // Employee class with references to other objects. 3 4 public class Employee 5 6 private String firstname; 7 private String lastname; 8 private Date birthdate; 9 private Date hiredate; 10 11 // constructor to initialize name, birth date and hire date 12 public Employee( String first, String last, Date dateofbirth, 13 Date dateofhire ) 14 15 firstname = first; 16 lastname = last; 17 birthdate = dateofbirth; 18 hiredate = dateofhire; 19 // end Employee constructor 20 21 // convert Employee to String format 22 public String tostring() 23 24 return String.format( "%s, %s Hired: %s Birthday: %s", 25 lastname, firstname, hiredate, birthdate ); 26 // end method tostring 27 // end class Employee Employee contains references to two Date objects Implicit calls to hiredate and birthdate s tostring methods 28

1 // Fig. 8.9: EmployeeTest.java 2 // Composition demonstration. 3 4 public class EmployeeTest 5 6 public static void main( String args[] ) 7 8 Date birth = new Date( 7, 24, 1949 ); 9 Date hire = new Date( 3, 12, 1988 ); 10 Employee employee = new Employee( "Bob", "Blue", birth, hire ); 11 12 System.out.println( employee ); 13 // end main 14 // end class EmployeeTest Date object constructor for date 7/24/1949 Date object constructor for date 3/12/1988 Blue, Bob Hired: 3/12/1988 Birthday: 7/24/1949 Create an Employee object Display the Employee object 29

Συλλογή απορριμμάτων (garbage collection) και η μέθοδος finalize Garbage collection Η Java Virtual Machine (JVM) σημειώνει υποψήφιο για garbage collection όποιο αντικείμενο για το οποίο δεν υπάρχει καμία αναφορά (reference) σε αυτό O garbage collector της JVM επανακτά για χρήση τη μνήμη την οποία χρησιμοποιούσαν τα αντικείμενα αυτά για να την χρησιμοποιήσει στη δημιουργία άλλων αντικειμένων Μέθοδος finalize Όλες οι τάξεις στη Java έχουν στη μέθοδο finalize την οποία κληρονομούν από την τάξη Object, την οποία όμως σπάνια χρησιμοποιούν Η μέθοδος finalize καλείται από τον garbage collector όταν επανακτά τη μνήμη που κατείχε το αντίστοιχο αντικείμενο Η μέθοδος finalize δεν επιστρέφει τίποτα (δηλαδή έχει return type void) και δεν παίρνει καθόλου παραμέτρους Σπάνια χρησιμοποιείται, γιατί δεν εκτελείται σε συγκεκριμένη χρονική στιγμή 30

Στατικά μέλη τάξεων (static/class members) Στατικές μεταβλητές (static fields or class variables) Χρησιμοποιούνται για δεδομένα και πληροφορίες που αφορούν όλη την τάξη ώστε: o o Όλα τα αντικείμενα να μοιράζονται αυτά τα κοινά δεδομένα και πληροφορίες Να μπορούν να χρησιμοποιηθούν χωρίς την ανάγκη ύπαρξης αντικειμένων της τάξης Η πρόσβαση σε αυτά γίνεται με το όνομα της τάξης ή ενός αντικειμένου της τάξης ακολουθούμενο από ένα dot (.) και το όνομα της στατικής μεταβλητής Πρέπει να δοθούν αρχικές τιμές στον ορισμό τους (declarations), αλλιώς ο μεταγλωττιστής τους δίνει τις προεπιλεγμένες τιμές (default values) Στατικές μέθοδοι (static methods) Δεν έχουν πρόσβαση σε μη στατικά μέλη της τάξης (non-static class members) αφού δεν μπορούν να χρησιμοποιήσουν την αναφορά this 31

1 // Fig. 8.12: Employee.java 2 // Static variable used to maintain a count of the number of 3 // Employee objects in memory. 4 5 public class Employee 6 7 private String firstname; 8 private String lastname; 9 private static int count = 0; // number of objects in memory 10 11 // initialize employee, add 1 to static count and 12 // output String indicating that constructor was called 13 public Employee( String first, String last ) 14 15 firstname = first; 16 lastname = last; 17 18 count++; // increment static count of employees 19 System.out.printf( "Employee constructor: %s %s; count = %d\n", 20 firstname, lastname, count ); 21 // end Employee constructor 22 Declare a static field Increment static field 32

23 // subtract 1 from static count when garbage 24 // collector calls finalize to clean up object; 25 // confirm that finalize was called 26 protected void finalize() 27 28 count--; // decrement static count of employees 29 System.out.printf( "Employee finalizer: %s %s; count = %d\n", 30 firstname, lastname, count ); 31 // end method finalize 32 33 // get first name 34 public String getfirstname() 35 36 return firstname; 37 // end method getfirstname 38 39 // get last name 40 public String getlastname() 41 42 return lastname; 43 // end method getlastname 44 45 // static method to get static count value 46 public static int getcount() 47 48 return count; 49 // end method getcount 50 // end class Employee Declare method finalize Declare static method getcoun to get static field count 33

1 // Fig. 8.13: EmployeeTest.java 2 // Static member demonstration. 3 4 public class EmployeeTest 5 6 public static void main( String args[] ) 7 8 // show that count is 0 before creating Employees 9 System.out.printf( "Employees before instantiation: %d\n", 10 Employee.getCount() ); 11 12 // create two Employees; count should be 2 13 Employee e1 = new Employee( "Susan", "Baker" ); 14 Employee e2 = new Employee( "Bob", "Blue" ); 15 Call static method getcount using class name Employee Create new Employee objects 34

16 // show that count is 2 after creating two Employees 17 System.out.println( "\nemployees after instantiation: " ); 18 System.out.printf( "via e1.getcount(): %d\n", e1.getcount() ); 19 System.out.printf( "via e2.getcount(): %d\n", e2.getcount() ); Call static method getcount outside objects 20 System.out.printf( "via Employee.getCount(): %d\n", 21 Employee.getCount() ); 22 23 // get names of Employees Call static method getcount inside objects 24 System.out.printf( "\nemployee 1: %s %s\nemployee 2: %s %s\n\n", 25 e1.getfirstname(), e1.getlastname(), 26 e2.getfirstname(), e2.getlastname() ); 27 28 // in this example, there is only one reference to each Employee, 29 // so the following two statements cause the JVM to mark each 30 // Employee object for garbage collection 31 e1 = null; 32 e2 = null; 33 Remove references to objects, JVM will mark them for garbage collection Call static method gc of class System to indicate that garbage collection should be attempted 34 System.gc(); // ask for garbage collection to occur now 35 35

36 // show Employee count after calling garbage collector; count 37 // displayed may be 0, 1 or 2 based on whether garbage collector 38 // executes immediately and number of Employee objects collected 39 System.out.printf( "\nemployees after System.gc(): %d\n", 40 Employee.getCount() ); 41 // end main 42 // end class EmployeeTest Call static method getcount Employees before instantiation: 0 Employee constructor: Susan Baker; count = 1 Employee constructor: Bob Blue; count = 2 Employees after instantiation: via e1.getcount(): 2 via e2.getcount(): 2 via Employee.getCount(): 2 Employee 1: Susan Baker Employee 2: Bob Blue Employee finalizer: Bob Blue; count = 1 Employee finalizer: Susan Baker; count = 0 Employees after System.gc(): 0 Η στατική μέθοδος gc of της τάξης System απλά ζητά από τον garbage collector να επανακτήσει τη μνήμη από αντικείμενα που είναι υποψήφια για garbage collection. Όμως, αν και πότε θα συμβεί αυτό δεν είναι γνωστό. 36

Εισαγωγή στατικών μελών (static import) Οι δηλώσεις εισαγωγής (static import declarations) δίνουν τη δυνατότητα αναφοράς, από μία τάξη, σε εισαγόμενα στατικά μέλη μιας άλλης τάξης ως να είχαν οριστεί στην ίδια την τάξη Εισαγωγή συγκεκριμένου στατικού μέλους κάποιας άλλης τάξης import static packagename.classname.staticmembername; Εισαγωγή όλων των στατικών μελών κάποιας άλλης τάξης import static packagename.classname.*; Δεν επιτρέπεται η εισαγωγή στατικών μεθόδων που έχουν την ίδια υπογραφή (signature) ή στατικών μεταβλητών με το ίδιο όνομα με άλλα στατικά μέλη της ίδιας ή μιας άλλης (τα μέλη της οποία εισάγονται στατικά) τάξης 37

1 // Fig. 8.14: StaticImportTest.java 2 // Using static import to import static methods of class Math. 3 import static java.lang.math.*; 4 5 public class StaticImportTest 6 7 public static void main( String args[] ) 8 Use Math s static methods and instance variable without preceding them with Math. 9 System.out.printf( "sqrt( 900.0 ) = %.1f\n", sqrt( 900.0 ) ); 10 System.out.printf( "ceil( -9.8 ) = %.1f\n", ceil( -9.8 ) ); 11 System.out.printf( "log( E ) = %.1f\n", log( E ) ); 12 System.out.printf( "cos( 0.0 ) = %.1f\n", cos( 0.0 ) ); 13 // end main 14 // end class StaticImportTest sqrt( 900.0 ) = 30.0 ceil( -9.8 ) = -9.0 log( E ) = 1.0 cos( 0.0 ) = 1.0 38

Σταθερές (τελικές) μεταβλητές (final instance variables) Δηλώνονται σαν σταθερές μεταβλητές με τη χρήση του keyword final Οι τιμές των σταθερών μεταβλητών, οι οποίες δεν μπορούν να τροποποιηθούν, ορίζονται: είτε κατά τον ορισμό των μεταβλητών (initialized at their declaration) o όταν η τιμή με την οποία ορίζεται μία σταθερή μεταβλητή (final field) γίνεται κατά τον ορισμό της τότε πρέπει να οριστεί και σαν στατική (static) αφού η τιμή της δεν μπορεί να τροποποιηθεί και θα είναι έτσι κοινή για όλα τα αντικείμενα. είτε μέσα στις μεθόδους κατασκευής (constructors) 39

1 // Fig. 8.15: Increment.java 2 // final instance variable in a class. 3 4 public class Increment 5 6 private int total = 0; // total of all increments 7 private final int INCREMENT; // constant variable (uninitialized) 8 9 // constructor initializes final instance variable INCREMENT 10 public Increment( int incrementvalue ) 11 12 INCREMENT = incrementvalue; // initialize constant variable (once) 13 // end Increment constructor 14 15 // add INCREMENT to total 16 public void addincrementtototal() 17 18 total += INCREMENT; 19 // end method addincrementtototal 20 21 // return String representation of an Increment object's data 22 public String tostring() 23 24 return String.format( "total = %d", total ); 25 // end method toincrementstring 26 // end class Increment Initialize final instance variable inside a constructor Declare final instance variable 40

1 // Fig. 8.16: IncrementTest.java 2 // final variable initialized with a constructor argument. 3 4 public class IncrementTest 5 6 public static void main( String args[] ) 7 8 Increment value = new Increment( 5 ); 9 10 System.out.printf( "Before incrementing: %s\n\n", value ); 11 12 for ( int i = 1; i <= 3; i++ ) 13 14 value.addincrementtototal(); 15 System.out.printf( "After increment %d: %s\n", i, value ); 16 // end for 17 // end main 18 // end class IncrementTest Before incrementing: total = 0 Create an Increment object Call method addincrementtototal After increment 1: total = 5 After increment 2: total = 10 After increment 3: total = 15 41

Επαναχρησιμοποίηση λογισμικού (software reusability) Ταχεία ανάπτυξη λογισμικού (rapid application development RAD) Επαναχρησιμοποίηση ελεγμένου για λάθη και απόδοση λογισμικού (software reusability) επιταχύνει σημαντικά την ανάπτυξη ψηλής ποιότητας λογισμικού και μειώνει τις πιθανότητες σφαλμάτων και μειωμένης απόδοσης Java s API Παρέχει ένα ολόκληρο πλαίσιο μέσα από το οποίο οι προγραμματιστές μπορούν να αξιοποιήσουν υπάρχουσες βιβλιοθήκες λογισμικού και να αναπτύξουν ταχέως λογισμικό ψηλής απόδοσης Διαθέσιμα πακέτα και τάξεις Java: o o java.sun.com/j2se/5.0/docs/api/index.html java.sun.com/j2se/5.0/download.html Αποφύγετε την επανεφεύρεση ενός τροχού 42

Αφαιρετικότητα δεδομένων (Data Abstraction) και Συμπερίληψη (Encapsulation) Αφαιρετικότητα δεδομένων (data abstraction) Απόκρυψη πληροφοριών (information hiding) o Μια τάξη πρέπει να αποκρύπτει τεχνικές λεπτομέρειες υλοποίησης των δυνατοτήτων και εργασιών που προσφέρει, ώστε να είναι εύκολα τροποποιήσιμη στο μέλλον χωρίς εξάρτηση από τάξεις που την χρησιμοποιούν Μια αντικειμενοστραφής γλώσσα, όπως η Java, δίνει σημασία στα δεδομένα (data) και τις λειτουργίες που πρέπει να υποστηρίζουν Ένα τύπος δεδομένων (abstract data types - ADTs) καθορίζει: τον τρόπο εκπροσώπησης των δεδομένων (data representation) και τις επιτρεπόμενες ενέργειες οι οποίες μπορεί να εκτελεστούν σε αυτό τον τύπο δεδομένων Με τη Java ένας προγραμματιστής μπορεί να ορίσει νέους τύπους δεδομένων εξασφαλίζοντας ευελιξία επεκτασιμότητας 43

Δημιουργία πακέτων (packages) Για να είναι άμεσα επαναχρησιμοποιήσιμη μία τάξη: Πρέπει να δηλωθεί σαν δημόσια τάξη (public class) Να οριστεί σε ένα πακέτο (package declaration) o o ο ορισμός του πακέτου πρέπει να μπει στην κορυφή του αρχείου με τον κώδικα και να είναι η πρώτη εκτελέσιμη εντολή στο αρχείο καλά είναι να ακολουθείται η άτυπη σύμβαση για την ονομασία πακέτων ξεκινώντας με το internet domain name σε ανάποδη σειρά π.χ.: com.deitel.jhtp6.ch08 το όνομα ενός πακέτου διαχωρίζει τάξεις με το ίδιο όνομα 44

Δημιουργία και χρήση πακέτων (packages) Μεταγλώττιση μίας τάξης ώστε να μπει σε κατάλληλο για το πακέτο δομή αρχείων π.χ.: το πακέτο com.deitel.jhtp6.ch08 πρέπει να μπει στο directory com/ deitel/ jhtp6/ ch08/ χρησιμοποιώντας την επιλογή d δημιουργείται αυτή η δομή o javac command-line option Μία τελεία (.) μετά το d αντιπροσωπεύει το παρόν directory Εισαγωγή τάξεων από ένα πακέτο σε ένα πρόγραμμα Εισαγωγή μίας τάξης π.χ.: import java.util.random; Εισαγωγή όλων των τάξεων από ένα πακέτο π.χ.: import java.util.*; 45

Χρήση πακέτων Ο class loader εντοπίζει τις τάξεις που χρειάζεται ο μεταγλωττιστής ψάχνοντας πρώτα τις standard Java τάξεις που προσφέρονται με το JDK ακολούθως άλλα πιθανά πακέτα και τέλος σύμφωνα με το classpath στα directories ή τα archive files o όπου τα archive files έχουν επέκταση ονόματος.jar ή.zip π.χ. οι standard τάξεις είναι στο αρχείο rt.jar Για να χρησιμοποιηθεί άλλο classpath από το παρόν directory χρησιμοποιείται η επιλογή -classpath με τον javac compiler ή ορίζεται η μεταβλητή περιβάλλοντος environment variable CLASSPATH o χρήση τελείας (.) στο classpath προσθέτει και το παρόν directory Η JVM επίσης πρέπει να εντοπίσει τις τάξεις κατά την εκτέλεση, όπως και ο μεταγλωττιστής με τους ίδιους πιο πάνω τρόπους 46

1 // Fig. 8.18: Time1.java 2 // Time1 class declaration maintains the time in 24-hour format. 3 package com.deitel.jhtp6.ch08; 4 5 public class Time1 6 7 private int hour; // 0-23 8 private int minute; // 0-59 9 private int second; // 0-59 10 11 // set a new time value using universal time; perform 12 // validity checks on the data; set invalid values to zero 13 public void settime( int h, int m, int s ) 14 15 hour = ( ( h >= 0 && h < 24 )? h : 0 ); // validate hour 16 minute = ( ( m >= 0 && m < 60 )? m : 0 ); // validate minute 17 second = ( ( s >= 0 && s < 60 )? s : 0 ); // validate second 18 // end method settime 19 package declaration Time1 is a public class so it can be used by importers of this package 47

20 // convert to String in universal-time format (HH:MM:SS) 21 public String touniversalstring() 22 23 return String.format( "%02d:%02d:%02d", hour, minute, second ); 24 // end method touniversalstring 25 26 // convert to String in standard-time format (H:MM:SS AM or PM) 27 public String tostring() 28 29 return String.format( "%d:%02d:%02d %s", 30 ( ( hour == 0 hour == 12 )? 12 : hour % 12 ), 31 minute, second, ( hour < 12? "AM" : "PM" ) ); 32 // end method tostring 33 // end class Time1 48

1 // Fig. 8.19: Time1PackageTest.java 2 // Time1 object used in an application. 3 import com.deitel.jhtp6.ch08.time1; // import class Time1 4 5 public class Time1PackageTest 6 7 public static void main( String args[] ) 8 9 // create and initialize a Time1 object 10 Time1 time = new Time1(); // calls Time1 constructor 11 12 // output string representations of the time 13 System.out.print( "The initial universal time is: " ); 14 System.out.println( time.touniversalstring() ); 15 System.out.print( "The initial standard time is: " ); 16 System.out.println( time.tostring() ); 17 System.out.println(); // output a blank line 18 Single-type import declaration Refer to the Time1 class by its simple name 49

19 // change time and output updated time 20 time.settime( 13, 27, 6 ); 21 System.out.print( "Universal time after settime is: " ); 22 System.out.println( time.touniversalstring() ); 23 System.out.print( "Standard time after settime is: " ); 24 System.out.println( time.tostring() ); 25 System.out.println(); // output a blank line 26 27 // set time with invalid values; output updated time 28 time.settime( 99, 99, 99 ); 29 System.out.println( "After attempting invalid settings:" ); 30 System.out.print( "Universal time: " ); 31 System.out.println( time.touniversalstring() ); 32 System.out.print( "Standard time: " ); 33 System.out.println( time.tostring() ); 34 // end main 35 // end class Time1PackageTest The initial universal time is: 00:00:00 The initial standard time is: 12:00:00 AM Universal time after settime is: 13:27:06 Standard time after settime is: 1:27:06 PM After attempting invalid settings: Universal time: 00:00:00 Standard time: 12:00:00 AM 50

Πρόσβαση επιπέδου package Μέθοδοι και μεταβλητές που ορίζονται χωρίς κάποια συγκεκριμένη δήλωση όσο αφορά την πρόσβαση (without access modifier) του δίνει αυτόματα package access πρόσβαση Έτσι, αν ένα πρόγραμμα αποτελείται από πολλές τάξεις από το ίδιο πακέτο, υπάρχει πρόσβαση τόσο στις μεθόδους όσο και στις μεταβλητές με package access 51

1 // Fig. 8.20: PackageDataTest.java 2 // Package-access members of a class are accessible by other classes 3 // in the same package. 4 5 public class PackageDataTest 6 7 public static void main( String args[] ) 8 9 PackageData packagedata = new PackageData(); 10 11 // output String representation of packagedata 12 System.out.printf( "After instantiation:\n%s\n", packagedata ); 13 14 // change package access data in packagedata object 15 packagedata.number = 77; 16 packagedata.string = "Goodbye"; 17 18 // output String representation of packagedata 19 System.out.printf( "\nafter changing values:\n%s\n", packagedata ); 20 // end main 21 // end class PackageDataTest 22 Can directly access package-access members 52

23 // class with package access instance variables 24 class PackageData 25 26 int number; // package-access instance variable 27 String string; // package-access instance variable 28 29 // constructor 30 public PackageData() 31 32 number = 0; 33 string = "Hello"; 34 // end PackageData constructor 35 36 // return PackageData object String representation 37 public String tostring() 38 39 return String.format( "number: %d; string: %s", number, string ); 40 // end method tostring 41 // end class PackageData After instantiation: number: 0; string: Hello Package-access instance variables After changing values: number: 77; string: Goodbye 53

Κληρονομικότητα (Inheritance) Με την κληρονομικότητα επιτυγχάνεται επαναχρησιμοποίηση λογισμικού Δημιουργία νέων τάξεων από υπάρχουσες αξιοποιώντας υπάρχουσες μεταβλητές (δεδομένα) και μεθόδους (συμπεριφορά) τροποποιώντας και επεκτείνοντας κάποιες μεθόδους (συμπεριφορά) και εμπλουτίζοντας τις με νέες, πιο εξειδικευμένες, μεταβλητές και μεθόδους Μια υποτάξη (subclass) επεκτείνει (extends) μια υπερτάξη (superclass) Ιεραρχία τάξεων (class hierarchy) Άμεση υπερτάξη (direct superclass) Έμμεση υπερτάξη (indirect superclass) Απλή κληρονομικότητα (single inheritance) Πολλαπλή κληρονομικότητα (multiple inheritance) o o δεν επιτρέπεται στη Java πολλαπλή κληρονομικότητα όμως εναλλακτικά η Java δίνει τη δυνατότητα υλοποίησης πολλαπλών intefaces 54

Υπερτάξεις (superclasses) και υποτάξεις (subclasses) Το αντικείμενο μίας τάξης είναι αντικείμενο μιας άλλης τάξης σχέση ΕΙΝΑΙ ( IS A ) π.χ. μια δοκός (Beam) είναι ένα δομικό στοιχείο (StructuralElement) o Η τάξη Beam κληρονομεί από την τάξη StructuralElement StructuralElement: superclass (υπερτάξη) Beam: subclass (υποτάξη) Η υπερτάξη αντιπροσωπεύει συνήθως μεγαλύτερες ομάδες αντικειμένων από ότι οι υποτάξεις, οι οποίες είναι πιο εξειδικευμένες Μια υπερτάξη προμηθεύει μέλη στις υποτάξεις της Μια υπερτάξη κληρονομεί μέλη από τις υπερτάξεις της Όλες οι τάξεις στην Java έχουν υπερτάξη την Object (java.lang) 55

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

Παράδειγμα: Ιεραρχία κληρονομικότητας της υπερτάξης CommunityMembers 57

Παράδειγμα: Ιεραρχία κληρονομικότητας της υπερτάξης Shapes 58

Μέλη προστατευμένης πρόσβασης (protected members) Έχουν πρόσβαση στα προστατευμένα (protected) μέλη μιας τάξης: Μέλη εκείνης της τάξης (class members) Μέλη οποιαδήποτε υποτάξης της (subclass members) Μέλη τάξεων στο ίδιο πακέτο (class members in the same package) Πρόσβαση από υποτάξη σε μέλη υπερτάξης της: super ακολουθούμενο από τελεία (.) και το όνομα του μέλους Μέθοδοι υποτάξεων δεν έχουν άμεση πρόσβαση σε private μέλη υπερτάξεων, εκτός έμμεσα μέσω non private μεθόδων της υπερτάξης που κληρονομούνται στην υποτάξη Μία μέθοδος υπερτάξης η οποία επαναορίζετε στην υποτάξη (method overridden) δεν μπορεί να οριστεί με αυστηρότερο επίπεδο πρόσβασης από ότι είχε οριστεί στην υπερτάξη Μια μέθοδος που ορίζεται σαν public σε μια υπερτάξη πρέπει να παραμείνει public σε όλες τις άμεσες ή έμμεσες υποτάξεις 59

Κληρονομικότητα στη Java Μια υποτάξη (subclass) κληρονομεί τα χαρακτηριστικά (δεδομένα) και τη συμπεριφορά (μεθόδους) των υπερτάξεων (superclasses) της. Η κληρονομικότητα (inheritance) είναι από τα πιο βασικά στοιχεία του αντικειμενοστραφούς προγραμματισμού (Object Oriented Programming - OOP), επιτρέποντας την επέκταση υπαρχόντων τάξεων. Στην Java μία τάξη επεκτείνει μια άλλη τάξη χρησιμοποιώντας στον ορισμό της το keyword extends ακολουθούμενο από το όνομα της τάξης που επεκτείνει π.χ.: class Pixel extends Point Ένα αντικείμενο μίας υποτάξης μπορεί να χρησιμοποιηθεί σε οποιαδήποτε μέθοδο που αναμένει σαν παράμετρο ένα αντικείμενο κάποιας υπερτάξης της, ενώ το αντίστροφο δεν ισχύει. Αυτή η δυνατότητα είναι που επιτρέπει τον πολυμορφισμό, ένα ακόμη σημαντικό χαρακτηριστικό του αντικειμενοστραφούς προγραμματισμού 60

Ιεραρχία αντικειμένων Όλες οι τάξεις έχουν κάποια άμεση υπερτάξη εκτός από την Object Η κάθε τάξη κληρονομεί τις μεθόδους της τάξης Object Αν μια τάξη δεν επεκτείνει άμεσα κάποια άλλη τάξη τότε είναι υποτάξη της τάξης Object 61

Μέθοδοι κατασκευής αντικειμένων σε υποτάξεις (Constructors in Subclasses) Καθώς δημιουργείται ένα νέο αντικείμενο μιας υποτάξης οι μέθοδοι κατασκευής (constructors) αντικειμένων καλούνται με την εξής σειρά: Η μέθοδος κατασκευής της υποτάξης καλεί άμεσα (με το super) ή έμμεσα τη μέθοδο κατασκευής της υπερτάξης της, κ.ο.κ, μέχρι να κληθεί η μέθοδος κατασκευής της τάξης Object. Έτσι τελευταία καλείται η μέθοδος κατασκευής της τάξης Object Ενώ, τελευταία τελειώνει την εκτέλεση όλων των εντολών της ( επιστρέφει ) η μέθοδος κατασκευής της υποτάξης Ακόμη και όταν ένας constructor δεν ορίσει συγκεκριμένη τιμή σε κάποια μεταβλητή του υπό κατασκευή αντικειμένου, η μεταβλητή παίρνει την προεπιλεγμένη αρχική τιμή (δηλαδή 0 για primitive numeric data types, false για booleans, και null για references). 62

class Point private double x, y; Point() System.out.println(" In default constructor of Point class"); x = y = 100.0; Παράδειγμα: Point.java Point(double x, double y) System.out.println(" In constructor Point(double x, double y)"); this.x = x; this.y = y; public void set(double x, double y) System.out.println(" In set method of Point"); this.x = x; this.y = y; public String tostring() System.out.print(" In tostring method of Point class"); return ("x = " + x + " y = " + y); 63

class Pixel extends Point private int color; Pixel.java Pixel() System.out.println(" In default constructor of Pixel class"); color = 111111111; Pixel(double x, double y, int color) super(x,y); System.out.println(" In Pixel(double x, double y, int color) "); this.color = color; public void set(double x, double y, int color) System.out.println(" In set of Pixel class calling Point's set"); super.set(x,y); this.color = color; public String tostring() System.out.print(" In tostring method of Pixel class"); return ("color = " + color ); 64

class InheritanceEx1 public static void main(string args[]) Pixel p1; p1 = new Pixel(); p1.set(1.11, 0.22, 100111010); System.out.println(); InheritanceEx1.java Point p2 = new Point(200,25.7); Pixel p3 = new Pixel(3.33,9.6,111000111); Point p4 = new Pixel(); System.out.println(); System.out.println("\n p1: " + p1); System.out.println("\n p2: " + p2); System.out.println("\n p3: " + p3); System.out.println("\n p4: " + p4); System.out.println(); 65

> java InheritanceEx1.java 66

Κληρονομικότητα και ανάπτυξη σύγχρονου λογισμικού Κληρονομώντας από υπάρχουσες τάξεις (superclasses) Πρόσθεση επιπρόσθετων μελών Επαναπροσδιορισμός των μελών των υπερτάξεων Καμία αναγκαιότητα άμεσης πρόσβασης σε κώδικα υπερτάξεων o Μπορεί να χρησιμοποιηθεί το αντίστοιχο bytecode 67

Μέθοδοι τάξης Object tostring: επιστρέφει ένα string το οποίο αντιπροσωπεύει το αντικείμενο clone: για αντιγραφή μέλους-προς-μέλος ενός αντικειμένου σε ένα νέο αντικείμενο που επιστρέφεται από τη μέθοδο equals: χρησιμοποιείται για να συγκρίνει δύο αντικείμενα για ισότητα σύμφωνα με συγκεκριμένα κριτήρια ισότητας finalize: χρησιμοποιείται για να αποδεσμεύσει κάποιους πόρους (resources) τα οποία δεσμεύτηκαν για χρήση από το αντικείμενο προτού η μνήμη για το τελευταίο απελευθερωθεί (garbage collected) getclass: επιστρέφει ένα αντικείμενο της τάξης class, το οποίο περιέχει όλες τις πληροφορίες για την τάξη ενός αντικειμένου hashcode: επιστρέφει μια τιμή hashcode για χρήση σε κάποιο hashtable notify, notifyall, wait: χρησιμοποιούνται για multithreading 68

Μέθοδοι της τάξης Object που κληρονομούνται, άμεσα ή έμμεσα, από όλες τις τάξεις Method Description Clone This protected method, which takes no arguments and returns an Object reference, makes a copy of the object on which it is called. When cloning is required for objects of a class, the class should override method clone as a public method and should implement interface Cloneable (package java.lang). The default implementation of this method performs a socalled shallow copy instance variable values in one object are copied into another object of the same type. For reference types, only the references are copied. A typical overridden clone method s implementation would perform a deep copy that creates a new object for each reference type instance variable. There are many subtleties to overriding method clone. You can learn more about cloning in the following article: java.sun.com/developer/jdctechtips/2001/tt0306.html 69

Method Description Equals This method compares two objects for equality and returns true if they are equal and false otherwise. The method takes any Object as an argument. When objects of a particular class must be compared for equality, the class should override method equals to compare the contents of the two objects. The method s implementation should meet the following requirements: It should return false if the argument is null. It should return true if an object is compared to itself, as in object1.equals( object1 ). It should return true only if both object1.equals( object2 ) and object2.equals( object1 ) would return true. For three objects, if object1.equals( object2 ) returns true and object2.equals( object3 ) returns true, then object1.equals( object3 ) should also return true. If equals is called multiple times with the two objects and the objects do not change, the method should consistently return true if the objects are equal and false otherwise. A class that overrides equals should also override hashcode to ensure that equal objects have identical hashcodes. The default equals implementation uses operator == to determine whether two references refer to the same object in memory. Section 29.3.3 demonstrates class String s equals method and differentiates between comparing ΠΠΜ 401: Ανάπτυξη String Λογισμικού objects Εφαρμογών with Μηχανικής == and with equals. 70

Method Description finalize This protected method (introduced in Section 8.10 and Section 8.11) is called by the garbage collector to perform termination housekeeping on an object just before the garbage collector reclaims the object s memory. It is not guaranteed that the garbage collector will reclaim an object, so it cannot be guaranteed that the object s finalize method will execute. The method must specify an empty parameter list and must return void. The default implementation of this method serves as a placeholder that does nothing. getclass Every object in Java knows its own type at execution time. Method getclass (used in Section 10.5 and Section 21.3) returns an object of class Class (package java.lang) that contains information about the object s type, such as its class name (returned by Class method getname). You can learn more about class Class in the online API documentation at java.sun.com/j2se/5.0/docs/api/java/lang/class.html. 71

Method hashcode notify, notifyall, wait tostring Description A hashtable is a data structure (discussed in Section 19.10) that relates one object, called the key, to another object, called the value. When initially inserting a value into a hashtable, the key s hashcode method is called. The hashcode value returned is used by the hashtable to determine the location at which to insert the corresponding value. The key s hashcode is also used by the hashtable to locate the key s corresponding value. Methods notify, notifyall and the three overloaded versions of wait are related to multithreading, which is discussed in Chapter 23. In J2SE 5.0, the multithreading model has changed substantially, but these features continue to be supported. This method (introduced in Section 9.4.1) returns a String representation of an object. The default implementation of this method returns the package name and class name of the object s class followed by a hexadecimal representation of the value returned by the object s hashcode method. 72

Πολυμορφισμός (Polymorphism) Επιτρέπει πιο γενικό προγραμματισμό και επιτυγχάνεται επεκτασιμότητα του λογισμικού. Η ίδια κλήση μίας μεθόδου μπορεί να προκαλέσει διαφορετική εκτέλεση Όταν καλείται μια μέθοδος μέσω μιας αναφοράς σε αντικείμενο υπερτάξης, η επιλογή της μεθόδου εξαρτάται από τον τύπο του αντικειμένου στο οποίο πραγματικά αναφέρεται η αναφορά (reference) Ο πολυμορφισμός στην Java είναι δυνατός αφού μία υποτάξη μπορεί να χρησιμοποιηθεί στη θέση μίας υπερτάξης, αφού έχει τα χαρακτηριστικά και τη συμπεριφορά της. Μια αναφορά σε μια υπερτάξη μπορεί να αναφέρεται σε αντικείμενο υποτάξης Αυτό είναι δυνατό γιατί ένα αντικείμενο υποτάξης είναι επίσης ένα πλήρες αντικείμενο υπερτάξης συν τα επιπλέον στοιχεία της υποτάξης 73

Ο πολυμορφισμός επιτρέπει στον προγραμματιστή την γενικότερη αντιμετώπιση όσο αφορά την συμπεριφορά (δηλαδή τις μεθόδους) μιας τάξης παρέχοντας τη δυνατότητα να καθοριστούν πιο συγκεκριμένες συμπεριφορές για τα αντικείμενα υποτάξεων Ένα χαρακτηριστικό του πολυμορφισμού είναι η δυνατότητα η απόφαση για τη μέθοδο που θα κληθεί να παίρνεται δυναμικά κατά την εκτέλεση του προγράμματος ανάλογα με το αντικείμενο με το οποίο καλείται η μέθοδος: Αυτή η ιδιότητα ονομάζεται late binding (ή dynamic binding) αφού καθυστερεί ο μεταγλωττιστής την απόφαση για τη συγκεκριμένη μέθοδο που θα κληθεί μέχρι την ώρα της εκτέλεσης Σε αντίθεση με το static binding η απόφαση για το ποια ακριβώς μέθοδος θα κληθεί παίρνεται κατά τη μεταγλώττιση 74

Αν και ένα αντικείμενο μίας υποτάξης μπορεί να χρησιμοποιηθεί σαν αντικείμενο υπερτάξης, δηλαδή να χρησιμοποιηθεί μία αναφορά (reference) για υπερτάξη σε αυτό, το αντίθετο δεν είναι δυνατόν, εκτός και αν χρησιμοποιηθεί explicit casting. Αν ένα αντικείμενο οριστεί σε μια αναφορά (reference) που είναι τύπου υπερτάξης, τότε για να χρησιμοποιηθούν μέθοδοι της υποτάξης πρέπει το αντικείμενο να γίνει ρητά cast πίσω στην υποτάξη. Η σύνταξη για το casting μεταξύ δύο αντικειμένων είναι παρόμοια με αυτή μεταξύ δύο primitive τύπων δεδομένων Επιτρέπονται castings μόνο μεταξύ αντικειμένων μέσα από μια ιεραρχία κληρονομικότητας. Για την αποφυγή μη επιτρεπτών castings μπορεί να χρησιμοποιηθεί ο τελεστής instanceof για να επιβεβαιώσει εκ των προτέρων τον τύπο του αντικειμένου. 75

Καλείται η μέθοδος που αντιστοιχεί στην τάξη του πραγματικού αντικειμένου και όχι από την τάξη της αναφοράς (reference) που αναφέρεται στο αντικείμενο και μπορεί να είναι τύπου υπερτάξης του αντικειμένου Ενώ καθώς καλείται μία μέθοδος η απόφαση για το ποια μέθοδος θα κληθεί εξαρτάται από την τάξη που αντιστοιχεί στο αντικείμενο και όχι στο reference, όταν γίνεται πρόσβαση σε μεταβλητή κάποιου αντικειμένου η απόφαση είναι βάσει του τύπου του reference στο αντικείμενο και όχι του τύπου του αντικειμένου Οι υποτάξεις μπορούν να προσθέσουν άλλα μέλη, μεταβλητές ή/και μεθόδους. Μεταβλητές της υποτάξης με το ίδιο όνομα με μεταβλητές της υπερτάξης κρύβουν (hide) τις τελευταίες, οι οποίες όμως υπάρχουν και μόνο έμμεση πρόσβαση έχουμε σε αυτές. 76

Παρομοίως μια υποτάξη μπορεί να κληρονομήσει και να χρησιμοποιήσει ή επαναορίσει (κρύβοντας) τις μεθόδους των υπερτάξεων. Τελικές (final) ή στατικές (static) μέθοδοι δεν μπορούν να επαναοριστούν και συνεπώς δεν μπορούν να αποκρυφτούν. Πρόσβαση σε κρυμμένες (hidden) μεταβλητές και μεθόδους μιας υπερτάξης, λόγω επανορισμού σε υποτάξεις, γίνεται με χρήση του super keyword, το οποίο είναι μια έμμεση αναφορά σε μέλη κάποιας υπερτάξης του αντικειμένου που κάλεσε τη μέθοδο Μια μέθοδος υποτάξης μπορεί να έχει όνομα ίδιο με μέθοδο υπερτάξης και διαφορετικές παραμέτρους υπερφορτώνοντας ουσιαστικά τη μέθοδο (function overloading). Όμως μια μέθοδος υποτάξης με το ίδιο όνομα και παραμέτρους (same signature) με μέθοδο υπερτάξης πρέπει να έχει και τον ίδιο τύπο επιστρεφόμενης τιμής (return type) 77

Μέθοδοι νέων υποτάξεων μπορούν να καλέσουν με τον ίδιο τρόπο μεθόδους που ορίστηκαν σε υπερτάξεις χωρίς να χρειάζονται αλλαγές στο αρχικό λογισμικό. Η επαναοριζόμενη μέθοδος (overriding method) μπορεί να έχει διαφορετικό επίπεδο πρόσβασης (access specifier) μόνο εφόσον αυτό επιτρέπει περισσότερη πρόσβαση από ότι το επίπεδο πρόσβασης της μεθόδου της υπερτάξης που επαναορίζει Μπορεί να έχει διαφορετικό ορισμό throws από αυτό της μεθόδου της υπερτάξης αλλά όχι κάποιο που δεν συμπεριλαμβάνεται σε αυτά που δηλώθηκαν για τη μέθοδο της υπερτάξης 78

Ο τελεστής instanceof μπορεί να χρησιμοποιηθεί για να ελεγχθεί αν ένα αντικείμενο είναι συγκεκριμένης τάξης Αν μία αναφορά σε μια υποτάξη αποθηκευτεί σε μία μεταβλητή άμεσης ή έμμεσης υπερκλάσεως της, το οποίο είναι επιτρεπτό, τότε είναι επιτρεπτό η αναφορά στη συνέχεια να αποθηκευτεί σε μεταβλητή της υποτάξης αφού όμως πρώτα γίνει ρητή μετατροπή (explicit downcasting). Πριν να γίνει τέτοια μετατροπή μπορεί να χρησιμοποιηθεί ο τελεστής instanceof για να επιβεβαιωθεί η τάξη του αντικειμένου Αν το downcasting ενός αντικειμένου δεν είναι επιτρεπτό, τότε συμβαίνει ένα ClassCastException 79

Μετατροπές αναφορών και μέθοδοι getclass και getname Η μετατροπή downcasting: Μετατρέπει μια αναφορά σε υπερτάξη σε αναφορά σε υποτάξη Είναι επιτρεπτή όταν το αντικείμενο έχει σχέση is-a με την υποτάξη Μέθοδος getclass Κληρονομείται από την τάξη Object Επιστρέφει ένα αντικείμενο τύπου Class Μέθοδος getname της τάξης Class Επιστρέφει το όνομα της τάξης 80

class Point private double x, y; Point() this(0,0); Point(double x, double y) this.x = x; this.y = y; Point(Point p) x = p.x; y = p.y; public double getx() return x ; Point.java public double gety() return y ; public void setx(double newx) x = newx; public void sety(double newy) y = newy; public String tostring() return ("x = " + x + " y = " + y); 81

class Shape Point center; Shape.java Shape() center = new Point(); Shape(Point p) center = new Point(p); public String tostring() return (" Center: " + center); 82

class Circle extends Shape double radius; Circle.java Circle() radius = 0; Circle(Point p, double r) super(p); radius = r; public String tostring() return (" Circle: " + super.tostring() + " Radius = " + radius); 83

class TestShapes1 public static void main(string args[]) System.out.println("\n *** TestShapes1 ***"); TestShapes1.java Shape s1 = new Shape(); System.out.println("\n Shape 1: " + s1); Point p2 = new Point(4.7, -12.5); Shape s2 = new Shape(p2); System.out.println("\n Shape 2: " + s2); Circle c1 = new Circle(); System.out.println("\n Circle c1: " + c1); s1 = new Circle(p2, 7.5); System.out.println("\n Shape s1: " + s1 + "\n"); 84

85

Αόριστες τάξεις και μέθοδοι (Abstract Classes and Methods) Τάξεις οι οποίες είναι πολύ γενικές για να μπορούν να προσδιοριστούν πραγματικά αντικείμενα Χρησιμοποιούνται σαν γενικές υπερτάξεις για συγκεκριμένα ορισμένες υποτάξεις (concrete subclasses) με πραγματικά αντικείμενα, έτσι ώστε να μπορούν να οριστούν αναφορές του τύπου των αόριστων (ή αφηρημένων) υπερτάξεων Ορίζονται με χρήση του keyword abstract Είτε για να οριστεί μια τάξη σαν abstract o οι οποίες περιέχουν συνήθως μία ή περισσότερες αόριστες μεθόδους Είτε για να οριστεί μια μέθοδος σαν abstract o Όλες οι ορισμένες υποτάξεις πρέπει να επαναορίσουν όλες τις αόριστες μεθόδους που κληρονομούν από τις υπερτάξεις, αλλιώς και η υποτάξη πρέπει να είναι abstract 86

Μια abstract τάξη ορίζει κοινά χαρακτηριστικά και συμπεριφορά διαφόρων τάξεων σε μια ιεραρχία τάξεων. Συνήθως περιέχει μία ή περισσότερες abstract μεθόδους τις οποίες οι υποτάξεις πρέπει απαραίτητα να ορίσουν για να είναι εκείνες ορισμένες (concrete) και όχι αόριστες (abstract). Οι μεταβλητές (instance variables) και οι υπόλοιπες μη abstract μέθοδοι (δηλαδή οι concrete μέθοδοι μιας abstract τάξης) κληρονομούνται και χρησιμοποιούνται κανονικά. Προσπάθεια να δημιουργηθεί αντικείμενο μιας abstract τάξης προκαλεί λάθος κατά τη μεταγλώττιση (compilation error) Αν δεν οριστούν σε μία υποτάξη όλες οι abstract μέθοδοι μιας υπερτάξης πρέπει η υποτάξη να δηλωθεί σαν abstract 87

class Point private double x, y; Point() this(0,0); Point(double x, double y) this.x = x; this.y = y; Point(Point p) x = p.x; y = p.y; public double getx() return x ; Point.java public double gety() return y ; public void setx(double newx) x = newx; public void sety(double newy) y = newy; public String tostring() return ("x = " + x + " y = " + y); 88

abstract class Shape Point center; Shape.java Shape() center = new Point(); Shape(Point p) center = new Point(p); public String tostring() return (" Center: " + center); 89

class Circle extends Shape double radius; Circle.java Circle() radius = 0; Circle(Point p, double r) super(p); radius = r; public String tostring() return (" Circle: " + super.tostring() + " Radius = " + radius); 90

class Rectangle extends Shape double width, height; Rectangle.java Rectangle() width = height = 0; Rectangle(Point p, double w, double h) super(p); width = w; height = h; public String tostring() return (" Rectangle: " + super.tostring() + " Width = " + width + " height = " + height ); 91

class TestShapes2 TestShapes2.java public static void main(string args[]) System.out.println("\n *** TestShapes2: Testing arrays of Shapes ***"); // Shape s2 = new Shape(); Shape is abstract; cannot be instantiated Shape shapes[]; shapes = new Shape[4]; Point p1 = new Point(1.15, -1.25); Point p2 = new Point(24.7, -12.5); shapes[0] = new Circle(p1, 5.75); shapes[1] = new Rectangle(p2, 22.25, 14.7); shapes[2] = new Circle(); shapes[3] = new Rectangle(new Point(4.85, 16.3), 6.4, 31.2); System.out.println("\n Printing Shapes: "); for(int i=0; i<shapes.length ; i++) System.out.println("\n Shape " + i + ": " + shapes[i] + "\n"); 92

93

Τελικές μέθοδοι και τάξεις (final methods and classes) Τελικές μέθοδοι (final methods) Δεν μπορεί να επαναοριστεί (overridden) σε μία υποτάξη Μέθοδοι με private πρόσβαση ή/και static τύπου είναι έμμεσα final Οι κλήσεις σε final μεθόδους ξεκαθαρίζονται κατά τη μεταγλώττιση (static binding), ενώ μπορούν να βελτιστοποιηθούν με inlining του κώδικα o Inlining κάποιων μεθόδων βελτιώνει την απόδοση αποφεύγοντας κλήσεις μεθόδων Τελικές τάξεις (final classes) Δεν μπορούν να επεκταθούν (extended) από υποτάξεις Όλες οι μέθοδοι σε μια τελική τάξη είναι έμμεσα τελικές 94

Διαδυνδέσεις - Interfaces Τα interfaces (διαδυνδέσεις) ενώ είναι παρόμοια με τις τάξεις, περιέχουν μόνο κάποιες σταθερές και απλές δηλώσεις (declarations) για τις μεθόδους χωρίς να τις ορίζουν, δηλαδή έχουν μόνο abstract methods Όλα τα δεδομένα είναι έμμεσα public, static και final Όλες οι μέθοδοι είναι έμμεσα public abstract methods Μία διασύνδεση (interface) ορίζεται χρησιμοποιώντας το keyword interface Τάξεις μπορούν να υλοποιήσουν ένα ή περισσότερα interfaces Αν μία τάξη δεν ορίσει όλες τις μεθόδους ενός interface που υλοποιεί τότε πρέπει να δηλωθεί σαν abstract Μία διασύνδεση (interface) συνήθως ορίζεται σε αρχείο με ίδιο όνομα με αυτό και με.java επέκταση 95

Χρήση διασυνδέσεων (interfaces) δίνει τη δυνατότητα σε διάφορες τάξεις να μοιράζονται κοινές μεθόδους και σταθερές χωρίς απαραίτητα να ανήκουν στην ίδια ιεραρχία. Για να υλοποιήσει μια μέθοδος μία διασύνδεση (interface) πρέπει να το δηλώσει με το keyword implements Επιτρέπεται η υλοποίηση πολλαπλών interfaces, το οποίο καλύπτει τυχόν κενά από την απαγόρευση πολλαπλών άμεσων υπερτάξεων π.χ.: public class ClassName extends SuperclassName implements FirstInterface, SecondInterface, Μία διασύνδεση επεκτείνεται χρησιμοποιώντας το keyword extends Επιτρέπεται επέκταση πολλαπλών διασυνδέσεων Είναι περιττό να οριστεί μια μέθοδος ενός interface σαν public και abstract, όπως είναι περιττό να οριστεί κάποια σταθερά ενός interface σαν public, static και final. 96

Ένα interface καθορίζει κάποιες μεθόδους για τις οποίες δεν δίνει την υλοποίηση αλλά απλά την περιγραφή. Κάθε τάξη που στη συνέχεια υλοποιεί (implements) το interface ορίζει τις εντολές της κάθε μεθόδου (concrete methods) που έχει οριστεί στο interface Με τη χρήση των interfaces πετυχαίνεται κοινή συμπεριφορά όλων των τάξεων που υλοποιούν κάποιο interface και έτσι μπορούν αντικείμενα τέτοιων τάξεων να καλέσουν μεθόδους πολυμορφικά χρησιμοποιώντας αναφορά του τύπου του interface βάσει όμως της τάξης του πραγματικού αντικειμένου, και όχι του interface. Παρουσίαση διασυνδέσεων (interfaces) με UML Τα interfaces ξεχωρίζουν από τις τάξεις βάζοντας τη λέξη interface μέσα σε («και») πάνω από το όνομα του interface Η σχέση μεταξύ ενός interface και της τάξης (class) που το υλοποιεί ονομάζεται realization 97

Με τις διασυνδέσεις (interfaces), όπως και με την κληρονομικότητα (inheritance) πετυχαίνουμε μία is-a σχέση. Ένα αντικείμενο μιας τάξης που υλοποιεί ένα interface μπορούμε να το χειριστούμε σαν αντικείμενο του συγκεκριμένου τύπου interface Ένα αντικείμενο μιας υποτάξης μιας τάξης που υλοποιεί ένα interface μπορούμε επίσης να το χειριστούμε σαν αντικείμενο του συγκεκριμένου τύπου interface Μία αναφορά σε αντικείμενο υποτάξης μπορεί να αποθηκευτεί σε μεταβλητή του τύπου ενός interface αν κάποια υπερτάξη το κάνει implement Οι ιδιότητες του πολυμορφισμού ισχύουν και μεταξύ διασυνδέσεων (interfaces) και των τάξεων που τα υλοποιούν και των υποτάξεων τους 98

Χρησιμοποιώντας μία αναφορά τύπου διασύνδεσης (interface) μπορούμε πολυμορφικά να καλέσουμε οποιαδήποτε μέθοδο ορίζεται στο interface declaration καθώς και στη τάξη Object Όλες οι μέθοδοι της τάξης Object μπορούν να κληθούν χρησιμοποιώντας μία αναφορά τύπου interface. Μία αναφορά αναφέρεται σε ένα αντικείμενο και όλα τα αντικείμενα κληρονομούν τις μεθόδους της τάξης Object. Με τα interfaces μπορούν να οριστούν κάποιες σταθερές που να είναι κοινές σε πολλές τάξεις Αυτές οι σταθερές είναι έμμεσα public, static και final Χρησιμοποιώντας δήλωση στατικής εισαγωγής (static import declaration) επιτρέπει χρήση αυτών των σταθερών απλά με το όνομα τους 99

Η διασύνδεση (interface) Payable Περιέχει τη μέθοδο getpaymentamount Την οποία υλοποιεί (implements) οι τάξεις Invoice και Employee 100

Geometry.java interface Geometry public void print(); 101

class Point implements Geometry private double x, y; Point.java Point() x = y = 100.0; Point(double x, double y) this.x = x; this.y = y; public void print() System.out.print(" x = " + x + " y = " + y ); 102

class InterfacesExample1 public static void main(string args[]) Point p1; p1 = new Point(); Point p2 = new Point(2.2, 0.44); InterfacesExample1.java System.out.print("\n p1: "); p1.print(); System.out.print("\n p2: "); p2.print(); System.out.println(); 103

java InterfacesExample1 104