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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Wrapper Classes, Abstract Classes and Interfaces

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

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Προγραµµατισµός ΙΙ Java 2

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

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

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

5.1 ηµιουργία αντικειµένων

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

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

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

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

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

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

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

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

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

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

Εξαιρέσεις. try, catch, finally, throw, throws

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

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

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

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

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

Κεφάλαιο 15 Γλώσσα προγραμματισμού Java

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

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

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

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΕΙΣ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Ιανουάριος 2007 Οι απαντήσεις να είναι καθαρογραμμένες με ευδιάκριτους όλους του χαρακτήρες.

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

Δομές Δεδομένων & Ανάλυση Αλγορίθμων. 3ο Εξάμηνο. Ουρά (Queue) Υλοποίηση της με τη βοήθεια πίνακα.

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

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

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

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

Προγραμματισμός Διαδικτύου

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 5: Κατασκευαστές (Constructors)

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

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

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

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

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

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

Oι βασικές πράξεις (λειτουργίες) που ορίζονται για τον τύπο στοίβα αναφέρονται παρακάτω:

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

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

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

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

Mεταβλητές (variables) και Σταθερές (constants)

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

12.6. Άσκηση 6 - [αξιοποίηση γραφικής διεπαφής (GUI)] (έκδοση 2006)

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

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

Περιεχόμενα. Πρόλογος... 17

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

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

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

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

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

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

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

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

Προγραµµατισµός ΙΙ Java 2

Transcript:

Κλάσεις Τροποποιητές, Πακέτα, ιασυνδέσεις Τροποποιητές ελέγχου προσπέλασης µεταβλητών και µεθόδων Υπάρχουν 4τροποποιητές: default, public, private, protected. Default: εν προηγείται τροποποιητής του ονόµατος της µεθόδου ή της µεταβλητής. Σε αυτή την περίπτωση η µέθοδος ή η µεταβλητή είναι ορατή σε κάθε κλάση µέσα στο ίδιο πακέτο. Οποιαδήποτε κλάσητουπακέτουµπορείναδιαβάσειήακόµηκαινα τροποποιήσει µια µεταβλητή αυτής της κατηγορίας και µπορεί επίσης και να χρησιµοποιήσει κάθε µέθοδο της κατηγορίας αυτής. Private: εν µπορεί καµιά άλλη κλάση να έχει προσπέλαση στις private µεταβλητές ή µεθόδους µιας κλάσης. Public: Κάθε κλάση µπορεί να έχει προσπέλαση σε µεταβλητές ή µεθόδους αυτής της κατηγορίας. Protected: Οι µέθοδοι και οι µεταβλητές αυτής της κατηγορίας µπορούν να προσπελαστούν τόσο από υποκλάσεις όσο και από κλάσεις που βρίσκονται στο ίδιο πακέτο. (Σηµείωση οι κλάσεις ενόςπακέτουδενανήκουνπάνταστοίδιοπακέτοµετις υπερκλάσειςσους).

Κλάσεις και κληρονοµικότητα Μια κλάση µπορεί να κληρονοµεί: Από προηγούµενα ορισµένες από το χρήστη κλάσεις (extends ->κληρονοµικότητα) Από µια κλάση της βασικής βιβλιοθήκης των κλάσεων (import ->έτοιµηβιβλιοθήκη) Έλεγχος προσπέλασης και υπέρβαση µεθόδου Αν σε µία δευτερεύουσα κλάση γίνεται υπέρβαση µιας µεθόδου πρέπει να ληφθεί υπόψη ο τροποποιητής προσπέλασης της αντίστοιχης µεθόδου της υπερκλάσης προκειµένου να αποφασιστεί ο τροποποιητής ελέγχου προσπέλασης της µεθόδου της υποκλάσης. Ο γενικότερος κανόνας που ισχύει σε αυτές τις περιπτώσεις λέει πωςδενµπορείναγίνειυπέρβασηµιαςµεθόδουκαιηµέθοδοςτης δευτερεύουσας κλάσης να είναι πιο περισσότερο ιδιωτική από αυτή της υπερκλάσης. Αντιθέτως µπορεί να γίνει περισσότερο δηµόσια. Πιο συγκεκριµένα οι κανόνες ανάλογα µε τον τροποποιητή ελέγχου της µεθόδου της υπερκλάσης έχουν ως εξής: Οι µέθοδοι που δηλώνονται σαν public στην υπερκλάση πρέπει υποχρεωτικά να είναι public σε όλες τις δευτερεύουσες κλάσεις. Οι µέθοδοι που δηλώνονται σαν protected στην υπερκλάση µπορεί ναείναι protected ή public στιςυποκλάσεις. Οι µέθοδοι που δεν έχουν τροποποιητή (default) µπορούν να δηλώνονται είτε χωρίς τροποποιητή (default) είτε protected είτε public. Για τις private δεν υπάρχει θέµα γιατί δεν κληρονοµούνται.

Προσπέλαση µεταβλητών που έχουν δηλωθεί private Η µεταβλητή που έχει δηλωθεί private δεν είναι ορατή σε άλλες κλάσεις. Κάποιες φορές όµως είναι απαραίτητο κάποια άλλη κλάση ναθέσειήναδιαβάσειτηντιµήµιαςµεταβλητής. Σε αυτές τις περιπτώσεις χρησιµοποιούνται µέθοδοι (που δεν είναι private) οι οποίες δίνουν µε έµµεσο τρόπο την δυνατότητα να δωθεί µια τιµή σε private µεταβλητή ή να διαβαστεί η τιµή της µεταβλητής από κάποια µέθοδο. Στις µεθόδους αυτές συνήθως δίνουµε ονόµατα που ξεκινούν µε set ή get. (Συνηθίζεται αυτό στις γλώσσες αντικειµενοστρεφούς προγραµµατισµού χωρίς να είναι υποχρεωτικό). Παράδειγµα: public class access_method { private int x; public void set_x(int k){ x=k; public int get_x(){ return x; public class access_main { public static void main(string args[]){ access_method item = new access_method(); item.set_x(5); System.out.println("h timh tou x einai "+item.get_x()); Τροποποιητής static Η λέξη κλειδί static χρησιµοποιείται για να δηλώσουµε µεθόδους και µεταβλητές κλάσης. Ο τρόπος προσπέλασης των µεταβλητών κλάσης γίνεται µε το όνοµα της κλάσης ακολουθούµενο από µια τελεία και το όνοµα της µεταβλητής ή της µεθόδου. Μπορεί να χρησιµοποιηθεί και το όνοµα του αντικειµένου ακολουθούµενουαπόµιατελείακαιτοόνοµατηςµεθόδουήτης µεταβλητής αλλά καλό είναι να αποφεύγεται. Αντιθέτως οι µεταβλητές υπόστασης (αντικειµένου) θα πρέπει να χρησιµοποιούνται µε το όνοµα του αντικειµένου και όχι µε το όνοµα της κλάσης. Οι µεταβλητές κλάσης αρχικοποιούνται όταν δηµιουργείται η κλάση. Στο παράδειγµα που ακολουθεί υπάρχει µεταβλητή και µέθοδος static. Η µεταβλητή υπολογίζει το πλήθος των αντικειµένων που δηµιουργούνται. Η µεταβλητή αυτή δεν έχει σχέση µε κάποιο συγκεκριµένο αντικείµενο αλλά µε το πλήθος των αντικειµένων. Για το λόγο αυτό δηλώνεται ως static.

public class metrhsh_antikeimenwn { private static int numinstances=0; protected static int getnuminstances(){ return numinstances; private static void addinstance(){ numinstances++; metrhsh_antikeimenwn(){ metrhsh_antikeimenwn.addinstance(); public static void main(string args[]){ System.out.println( Αρχήµε " + metrhsh_antikeimenwn.getnuminstances() +" αντικείµενα"); for (int i=0; i<10; ++i) new metrhsh_antikeimenwn(); System.out.println( Σύνολο: + metrhsh_antikeimenwn.getnuminstances() + αντικείµενα"); Αποτέλεσµα Αρχή µε 0 αντικείµενα Σύνολο: 10 αντικείµενα Τροποποιητής final Χρησιµοποιείται µε κλάσεις, µεθόδους, µεταβλητές. Κλάσεις: Μία κλάση που δηλώνεται final δεν µπορεί να έχει υποκλάσεις Μέθοδοι: Σε µία µέθοδο final δεν µπορεί να γίνει υπέρβασή της από µέθοδο σεδευτερεύουσακλάση. Μία µέθοδος δηλώνεται final µόνο και µόνο για να επιτύχουµε υψηλότερες ταχύτητες. Αυτό επιτυγχάνεται ως εξής: όταν καλείται µία µέθοδος ο µεταγλωττιστής java ελέγχει πρώτα αν υπάρχει η µέθοδος στην τρέχουσα κλάση και στη συνέχεια την αναζητά στην υπερκλάση και συνεχίζει ώσπου να την βρεί. Αν όµως η µέθοδος δηλωθεί final ο µεταγλωττιστής τοποθετεί εκτελέσιµο bytecode στην κλάση που καλεί την µέθοδο και η ταχύτητα του προγράµµατος βελτιώνεται. Χρειάζεται προσοχή η δήλωση µιας µεθόδου ως final γιατίπρέπειναελεχθείαπότηναρχήανθαχρειαστείναγίνει υπέρβαση αυτής στη συνέχεια ή όχι. Οι µέθοδοι private είναι final εξ ορισµού γιατί δεν µπορεί να γίνει υπέρβαση αυτών στη συνέχεια Μεταβλητές: Μία µεταβλητή final δεν µπορεί να αλλάξει τιµή. Με τις µεταβλητές ο τροποποιητής χρησιµοποιείται συνήθως µε τον τροποποιητή static γιατί αν η τιµή δεν αλλάξει ποτέ δεν υπάρχει λόγος κάθε αντικείµενο ναέχειτοδικότουαντίγραφοτιµής. Μία κλάση που δηλώνεται final δεν µπορεί να χρησιµοποιηθεί σε υποκλάσειςαλλάυπάρχουνκαιεδώκάποιαοφέληόπωςστιςµεθόδους. Μερικέςγνωστές final κλάσειςείναιοι String, Math (java.lang.string, java.lang.math).

Τροποποιητής abstract Κάθε φορά που δηµιουργείται µία ιεραρχία κλάσεων συλλέγονται οι κοινές συµπεριφορές και ιδιότητες όσο πιο ψηλά γίνεται στην ιεραρχία. Μερικές φορές φτάνοντας στην κορυφή της ιεραρχίας δεν υπάρχει συγκεκριµένη κοινή συµπεριφορά για να κληρονοµηθεί. Σε αυτές τις περιπτώσεις ορίζονται abstract µέθοδοι που είναι ουσιαστικά υπογραφές µεθόδων χωρίς υλοποίηση. Οι µέθοδοι δηλώνονται τότε ως abstract και οι κλάσεις που τις περιέχουν ορίζονται abstract επίσης. Αν µία κλάση έχει τουλάχιστον µία abstract µέθοδο είναι και εκείνη abstract. Οι abstract κλάσεις χρησιµοποιούνται µόνο για να ορίσουν γενικές έννοιες από τις οποίες εκπορεύονται συγκεκριµένες κλάσεις. abstract class Shape { private double x, y; public double get_x() { return x; public double get_y() { return y; public void shmeio(double cor_x, double cor_y ) { this.x = cor_x; this.y = cor_y; public abstract double area(); public String tostring() { return "Shape(x=" + x + ", y=" + y + ", area=" + area() + ")";

class Rectangle extends Shape { private double height, width; public void setdimensions(double h, double w) { height = h; width = w; public double area() { return height * width; public String tostring() { return super.tostring() + ": Rectangle(" + height + " * " + width + ")"; class Circle extends Shape { private double radius; public void setradius(double r) { radius = r; public double area() { return Math.PI * radius * radius; public String tostring() { return super.tostring() + ": Circle(" + radius + ")"; public class Shape_main { static public void main(string args[ ]) { Circle c = new Circle(); Rectangle r = new Rectangle(); Shape s[] = new Shape[2]; s[0] = r; r.shmeio(5, 8); r.setdimensions(50, 50); s[1] = c; c.shmeio(2, 6); c.setradius(10); for (int i = 0; i < s.length; i++) System.out.println(s[i]);

Πακέτα Ένας τρόπος οργάνωσης των κλάσεων στη java είναι η χρησιµοποίηση πακέτων. Πακέτα έχουµε χρησιµοποιήσει έως τώρα µε την εντολή import. Κάθε πακέτο περιλαµβάνει έναν αριθµό κλάσεων στην java που σχετίζονται µεταξύ τους είτε γιατί ικανοποιούν τους στόχους µιας εφαρµογής, είτε γιατί υλοποιούν κάποιο δέντρο κληρονοµικότητας είτε για οποιαδήποτε άλλο σκοπό αποφασίσει ο προγραµµατιστής να τις οργανώσει στο ίδιο πακέτο. Η οργάνωση των κλάσεων σε πακέτα διευκολύνει την καλύτερη οργάνωση των προγραµµάτων. Μειώνονται τα προβλήµατα µε την χρήση ίδιων ονοµάτων. Προστατεύεται η κατά λάθος πρόσβασησεκλάσεις, µεθόδουςκαιµεταβλητές. Ταπακέταµπορούνεπίσηςναπεριλαµβάνουνάλλαπακέτα. Επιτυγχάνεται έτσι καλύτερη οργάνωση των κλάσεων. Αν δεν δηµιουργήσουµε πακέτο για τις κλάσεις µας αυτές αυτόµατα τοποθετούνται στο default package. Για να εισάγω κλάσεις από ένα πακέτο χρησιµοποιώ την εντολή import. Ακολουθεί το όνοµα του πακέτου και στη συνέχεια το όνοµα της κλάσης. Όταν θέλω να εισάγω όλες τις κλάσεις ενός πακέτου βάζω *. Για παράδειγµα: import java.awt.* Από τις κλάσεις του πακέτου εισάγονται µόνο αυτές που ζητούνται στηνκλάσηκαιστιςοποίεςητρέχουσακλάσηµπορείναέχει προσπέλαση δηλαδή να είναι public Ηχρήσητου * γιαταπακέταδιαφέρειλίγοαπόαυτήνγιατααρχείακαιτους φακέλους. Καταρχήνότανκάνω import όλεςτιςκλάσειςενόςπακέτουµε * δενκάνω import καιόλεςτιςκλάσειςπουανήκουνσεπακέτακάτωαπότο πακέτοπουκάνω import. Ανθέλωναεισάγωκαιτιςκλάσειςόλωντων πακέτων που είναι κάτω από το πακέτο µου πρέπει να εισάγω χειρονακτικά κάθε πακέτο. Επίσης δεν υπάρχει η δυνατότητα να εισάγω µόνο τις κλάσεις του πακέτου που αρχίζουν από κάποιο γράµµα (να γράψω για παράδειγµα import packet1.s*). Γιαναδηλώσωότιηκλάσηπουδηµιουργώανήκεισεκάποιοπακέτο γράφω package όνοµα πακέτου ; Ηδήλωσηαυτήπρέπειναείναιηπρώτηγραµµήστονκωδικά µουκαι ακολουθούν οι import για όσα πακέτα θέλω να κάνω import στην κλάση µου και τέλος ο ορισµός της κλάσης. Για παράδειγµα: package paketo1; import java.awt.*; import java.lang.*; public class mypaketo { //σώµα της κλάσης Ανσεµίακλάσηεισάγωδύοήπερισσότεραπακέταµε 2 κλάσειςπουέχουν το ίδιο όνοµα ο µεταγλωττιστής θα δείξει λάθος. Απαιτείται προσοχή στα ονόµατα που χρησιµοποιούνται.

ιασυνδέσεις Οι διασυνδέσεις παρέχουν πρότυπα συµπεριφοράς που αναµένεται να υλοποιήσουν άλλες κλάσεις όπως ακριβώς συµβαίνει µε τις abstract κλάσεις και µεθόδους. Πολλές φορές χρειάζεται κάποιες κλάσεις να κληρονοµήσουν συµπεριφορές από περισσότερες από µία κλάσεις ενός δέντρου ιεραρχίας. Στις περιπτώσεις αυτές χρησιµοποιείται µία άλλη ιεραρχία πέρα από την ιεραρχία των κλάσεων που ονοµάζεται ιεραρχία διασυνδέσεων. Μια διασύνδεση αποτελείται από ορισµούς αφηρηµένων µεθόδων ή από σταθερές. Μπορεί να αποτελείται µόνο από αφηρηµένες µεθόδους ή µόνο από σταθερές ή και τα δύο. εν περιέχει µεταβλητές αντικειµένουούτευλοποιήσειςµεθόδων. Για να δηλώσω πως µία κλάση υλοποιεί µία διασύνδεση χρησιµοποιώ τη λέξη κλειδί implements. Μιακλάσηµπορείνακληρονοµείαπόµίακύριακλάσηκαιναυλοποιεί µία ή περισσότερες διασυνδέσεις. Στην περίπτωση αυτή γράφω όλες τις διασυνδέσεις χωρισµένες µε κόµµατα. Χρειάζεται όµως προσοχή στο ποιές και πόσες διασυνδέσεις θα υλοποιεί η κλάση µου γιατί ισχύει ο παρακάτω κανόνας: Αν υλοποιηθεί µια διασύνδεση πρέπει να υλοποιηθούν όλες οι µέθοδοι αυτής και όχι µόνο αυτές που πιθανόν χρειαζόµαστε. ιασυνδέσεις (συνέχεια) Εξαίρεση στον προηγούµενο κανόνα αποτελεί η περίπτωση µερικής υλοποίησης που συµβαίνει σε κλάσεις που δηλώνονται abstract. Οι κλάσεις αυτές αν και υλοποιούν µια διασύνδεση δεν είναι υποχρεωτικό να υλοποιούν όλες τις µεθόδους της διασύνδεσης. Αν µία κλάση υλοποιήσει µία διασύνδεση τότε όλες οι δευτερεύουσες κλάσεις αυτής κληρονοµούν τις µεθόδους της διασύνδεσης και µπορούν να τις υπερβούν, να τις υπερφορτώσουν σαν να τις είχε ορίσει η αρχική κλάση. Έτσι αν η υπερκλάση υλοποιεί µια διασύνδεση δεν χρειάζεται να οριστεί η λέξη κλειδί implements στην δευτερεύουσα κλάση. Έχει αυτόµατα κληρονοµήσει όλες τις µεθόδους της διασύνδεσης. Οι διασυνδέσεις οργανώνονται σε ιεραρχία όπως συµβαίνει µε τις κλάσεις. ηλαδή µία διασύνδεση µπορεί να κληρονοµεί από µία ή περισσότερες διασυνδέσεις. Για να δηλωθεί πως µία διασύνδεση κληρονοµεί από άλλες χρησιµοποιείται η λέξη κλειδί extends (όπως και στις κλάσεις) και ακολουθούν τα ονόµατα των υπερ διασυνδέσεων χωρισµένα µε κόµµατα.

Χρήση διασυνδέσεων και ορισµός νέων Για να χρησιµοποιήσω (υλοποιήσω) µια διασύνδεση σε µία κλάση χρησιµοποιώ τη λέξη κλειδί implements. Αν επιπλέον η κλάση µου κληρονοµεί και από µία υπερκλάση αυτά όλα δηλώνονται στη γραµµή ορισµού της κλάσης όπως φαίνεται στο παράδειγµα που ακολουθεί. Στην περίπτωση που έχω περισσότερες από µία διασυνδέσεις τις χωρίζω µε κόµµατα. Για παράδειγµα: public class όνοµακλάσης extends όνοµαυπερκλάσης implements όνοµαδιασύνδεσης1, όνοµαδιασύνδεσης2,...{ // κώδικας της κλάσης µου Για να ορίσω τις δικές µου διασυνδέσεις χρησιµοποιώ τη λέξη κλειδί interface. Μέσα στο σώµα των διασυνδέσεων έχω µόνο αφηρηµένες µεθόδουςήσταθερέςήκαιταδύο. Ανηδιασύνδεσήµουείναι public oι µέθοδοί µου είναι public και abstract, ενώ οι σταθερές µου είναι public, static και final έστω και αν δεν δηλωθούν έτσι. εν µπορώ να δηλώσωµιαµέθοδοσεµίαδιασύνδεσησαν protected ή private. Επίσης οι µέθοδοι πρέπει να είναι χωρίς σώµα. Το σώµα το υλοποιούν οι κλάσεις που θα υλοποιήσουν την διασύνδεση. είτε το παρακάτω παράδειγµα: public interface όνοµαδιασύνδεσης { public static final τύποςµεταβλητής1 όνοµαµεταβλητής 1= ; τύπος µεταβλητής1 όνοµα µεταβλητής 1= ; //ουσιαστικά είναι public static και final public abstract τύπος επιστροφής µεθόδου όνοµα µεθόδου 1() ; τύπος επιστροφής µεθόδου όνοµα µεθόδου 2() ; //ουσιαστικά είναι public και abstract ηµιουργία νέας διασύνδεσης και δήλωση µεταβλητής της εν µπορώ να χρησιµοποιήσω τη λέξη new για µία διασύνδεση. Μπορώ όµως να δηλώσω µία µεταβλητή να είναι ενός τύπου διασύνδεσης. Στο παράδειγµα που ακολουθεί ορίζω µία διασύνδεση και µία κλάση που την υλοποιεί. public interface myinterface { void metod1(int a); // ορίζωµίαµέθοδοχωρίςσώµα public class myclass implements myinterface{ public void metod1(int a){ // ακολουθεί η υλοποίηση του σώµατος της µεθόδου της διασύνδεσης System.out.println("this is my interface's methodos "+a); public void metod2(){ // µέθοδοςκλάσηςκαιόχιδιασύνδεσης System.out.println("this is my class's methodos"); public static void main(string args[]){ // ορίζω µία µεταβλητή τύπου myinterface myinterface antik=new myclass(); myclass item=new myclass(); antik.metod1(5); //antik.metod2(); //antik είναι µεταβλητή τύπου myinterface εποµένως δεν έχει τη metod2() item.metod1(10); //item είναι µεταβλητή τύπου myclass εποµένως δεν τη metod2() item.metod2();

Παράδειγµα ίνεταιέναπαράδειγµαχρήσηςδιασυνδέσεων, κλάσεωνκαικληρονοµικότητας. Ας υποθέσουµε ότι έχουµε την διασύνδεση machine και την διασύνδεση oxhma Η δεύτερη διασύνδεση oxhma, κληρονοµεί από την διασύνδεση metaforiko_meso και την διασύνδεση person_machine. Έχουµε επίσης την κλάση tetratroxo και την υποκλάση της car. Η κλάση car κληρονοµεί από την tetratroxo και υλοποιεί τις διασυνδέσεις oxhma και machine. Να δούµε ποιές µέθοδοι και πως υλοποιούνται στηνκλάση car.

Μέθοδοι και πολλές διασυνδέσεις Μίακλάσηανκαικληρονοµείαπόµίακαιµόνοκλάσηµπορείνα υλοποιεί παραπάνω από µία διασυνδέσεις όπως φάνηκε από το προηγούµενοπαράδειγµα. Υπάρχει όµως το ενδεχόµενο κάθε φορά που µία κλάση υλοποιεί παραπάνω από µία διασυνδέσεις να βρεθεί µέθοδος µε το ίδιο όνοµα και στις δύο διασυνδέσεις. Στις περιπτώσεις αυτές αν οι µέθοδοι έχουν ίδιες παραµέτρους και επιστρεφόµενο τύπο υλοποιείται η µέθοδος και ικανοποιεί και τις δύο διασυνδέσεις. Αν οι µέθοδοι έχουν διαφορετική λίστα παραµέτρων και επιστρέφουν τον ίδιο τύπο υλοποιούνται και οι δύο µέθοδοι και όπως συµβαίνει στην υπερφόρτωση µεθόδων είναι γνωστό ποιά µέθοδος αντιστοιχεί σε κάθε διασύνδεση. Ανοιµέθοδοιδενέχουντονίδιοεπιστρεφόµενοτύποτότεπρέπεινα ελεχθεί η σχεδίαση των διασυνδέσεων γιατί υπάρχει πρόβληµα. Γενικότερα απαιτείται προσεχτικός σχεδιασµός των κλάσεων και των διασυνδέσεων και προσοχή στην ονοµατολογία προκειµένου να αποφευχθεί η άσκοπη χρήση του ίδιου ονόµατος µεθόδου σε περισσότερες από µία διασυνδέσεις. Πηγές και Προτεινόµενη Βιβλιογραφία ιαδικτυακόςπρογραµµατισµός: JAVA εκδότης Σταµούλης Η βίβλος της Java 2 εκδότης Μ. Γκιούρδας Πλήρες εγχειρίδιο της Java 6 εκδότης Μ. Γκιούρδας Thinking in Java published by Prentice-Hall