Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Ειδικά Θέματα στον Προγραμματισμό Υπολογιστών

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "Ειδικά Θέματα στον Προγραμματισμό Υπολογιστών"— Μεταγράφημα παρουσίασης:

1 Ειδικά Θέματα στον Προγραμματισμό Υπολογιστών
Κλάσεις και Αντικείμενα στην Java (Classes and Objects) Βελώνης Γεώργιος – Καθηγητής Πληροφορικής ΠΕ20 Σχολ. Έτος

2 Περιεχόμενα Τι είναι ο Αντικειμενοστρεφής Προγραμματισμός
Τι είναι τα Αντικείμενα (Objects) Τι είναι οι Κλάσεις (Classes) Δημιουργία Κλάσεων Δηλώσεις Μεθόδων Πρόσβαση σε ιδιότητες και μεθόδους Η Μεταβλητή this Κατασκευαστές Κλάσεων Χρήση Κλάσεων Αναφορά στα αντικείμενα Πακέτα Κλάσεων (Packages) Δημιουργία & Μεταγλώττιση Πακέτων Κλάσεων

3 Περιεχόμενα Ενθυλάκωση (Encapsulation) Κληρονομικότητα (Inheritance)
Πολυμορφισμός (Polymorphism) Υπερφόρτωση (Overloading) Υποσκέλιση (Overriding) Αφαίρεση δεδομένων (Abstraction) Αφηρημένη κλάση (Abstract Class)

4 Τι είναι ο Αντικειμενοστρεφής Προγραμματισμός
Ο αντικειμενοστρεφής προγραμματισμός (OOP - Object Oriented Programming) είναι μια τεχνική ανάπτυξης προγραμμάτων διαφορετική από τις παλαιές τεχνικές προγραμματισμού, όπως ο διαδικαστικός (procedural) και συναρτησιακός (functional) προγραμματισμός. Στον αντικειμενοστρεφή προγραμματισμό, ένα πρόγραμμα είναι μια συλλογή από κλάσεις (classes) και αντικείμενα (objects), όπου το ένα επικοινωνεί με το άλλο και δίνεται έμφαση στη δημιουργία μονάδων οι οποίες θα περιλαμβάνουν τα δεδομένα αλλά και τις εντολές που θα τα διαχειριστούν.

5 Τι είναι τα Αντικείμενα
Βασικά στοιχεία του αντικειμενοστρεφούς προγραμματισμού είναι τα αντικείμενα. Στον κόσμο που μας περιβάλλει, ως αντικείμενο ορίζουμε οποιοδήποτε πράγμα υπάρχει σε αυτόν, κάτι ανάλογο δηλαδή με αυτό που στη γραμματική της φυσικής μας γλώσσας ονομάζουμε «ουσιαστικό». Για παράδειγμα μπορούμε να αναφέρουμε μία μπάλα, ένα αυτοκίνητο, ένα σκύλο κ.λπ., οντότητες δηλαδή (έμψυχες ή άψυχες) οι οποίες έχουν συγκεκριμένες ιδιότητες ή/και μπορούν να εκτελούν συγκεκριμένες ενέργειες. Στην προγραμματιστική ορολογία, ως αντικείμενο χαρακτηρίζεται μια δομή δεδομένων η οποία διαθέτει ιδιότητες (attributes ή properties) και μεθόδους (methods).

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

7 Τι είναι οι Κλάσεις Η κεντρική έννοια του αντικειμενοστρεφούς προγραμματισμού είναι η Κλάση (Class). Τα αντικείμενα δημιουργούνται από τις κλάσεις. Για την ακρίβεια μάλιστα, οι κλάσεις ορίζονται ως εργοστάσια αντικειμένων (object factories). Είναι δηλαδή, τα στοιχεία εκείνα της γλώσσας, τα οποία κατασκευάζουν αντικείμενα. Όλα τα νέα αντικείμενα που δημιουργούνται από μία κλάση ονομάζονται στιγμιότυπα (instances) της κλάσης. Για παράδειγμα, στο διπλανό σχήμα η κλάση «car» θα μπορούσε να περιλαμβάνει τις ιδιότητες «κατασκευαστής», «μοντέλο», «ίπποι», κ.λπ., καθώς και τις μεθόδους «ξεκίνημα», «σταμάτημα», «επιτάχυνση», κ.λπ., ενώ αντικείμενα αυτής θα μπορούσαν να είναι ένα Polo, ένα Mini ή ένα Beetle.

8 Τι είναι οι Κλάσεις Στο παράδειγμα της προηγούμενης διαφάνειας, βλέπουμε ότι όλα τα αντικείμενα έχουν γενικά χαρακτηριστικά της κλάσης «car» (κατασκευαστή, μοντέλο, ίππους, κ.λπ.), αλλά το καθένα έχει και κάποιες ιδιαίτερες ιδιότητες, όπως το είδος του καυσίμου που καταναλώνει (βενζίνη, ντίζελ, αέριο), το αν έχει αποσπώμενη οροφή ή όχι, κ.λπ. Εκτός από τις κλάσεις που μπορεί να δημιουργήσει ο χρήστης, στην Java υπάρχουν και έτοιμες κλάσεις τις οποίες μπορεί να χρησιμοποιεί στα προγράμματά του για να δημιουργεί αντικείμενα (π.χ. κλάση Button, Frame, κ.λπ.). Δύο είναι τα στοιχεία που συμπεριλαμβάνονται στον ορισμό μιας κλάσης και τα οποία προαναφέραμε όταν περιγράφαμε τα αντικείμενα, οι μεταβλητές (variables) και οι μέθοδοι (methods).

9 Δημιουργία Κλάσεων Ο ορισμός μιας κλάσης γίνεται χρησιμοποιώντας τη λέξη class ακολουθούμενη από το όνομα που θα της δώσουμε. Σύνταξη: class όνομα_κλάσης {       μεταβλητές (ιδιότητες);       μέθοδοι;   } Παράδειγμα: class OneClass { Το παραπάνω παράδειγμα μπορεί να αποθηκευτεί (OneClass.java) και στη συνέχεια να μεταγλωττιστεί δημιουργώντας το αρχείο OneClass.class αλλά δε θα κάνει τίποτε, γιατί δεν «είπαμε» στην κλάση OneClass να κάνει κάτι.

10 Δημιουργία Κλάσεων Παράδειγμα:
Στο παράδειγμα που ακολουθεί, έχουμε δημιουργήσει μια κλάση μαθητής (Student) που έχει τέσσερα μέλη δεδομένων, τα schoolid (ταυτότητα σχολείου), StCode(κωδικός μαθητή), όνομα (name), coefficient (συντελεστής), μάθημα (subject) και βαθμός (grade). class Student { int schoolid; int StCode; String name; static float coefficient=1.5; static String subject="Freehand drawing"; float grade; }

11 Δημιουργία Κλάσεων Παρατηρώντας το παράδειγμα της προηγούμενης διαφάνειας, βλέπουμε ότι στην κλάση ορίζονται 6 μεταβλητές: schoolid, StCode, name, coefficient, subject και grade. Οι μεταβλητές αυτές ανήκουν σε δύο κατηγορίες: Στη 1η κατηγορία βρίσκονται οι μεταβλητές coefficient και subject, κάθε μία από τις οποίες θεωρείται ως μεταβλητή κλάσης (class variable) και δηλώνεται με τη λέξη static. Μια μεταβλητή κλάσης, όπως οι δύο παραπάνω, υπάρχει, έστω κι αν δεν έχει δημιουργηθεί (ακόμη) κανένα αντικείμενο της κλάσης. Κάθε αντικείμενο της κλάσης Student, όταν δημιουργηθεί, περιέχει τη τιμή της coefficient και subject. Αν οι τιμές αυτές αλλάξουν, τότε οι νέες τιμές τοποθετούνται σε όλα τα αντικείμενα της κλάσης.

12 Δημιουργία Κλάσεων Στη 2η κατηγορία που βρίσκονται οι υπόλοιπες μεταβλητές (schoolid, StCode, name και grade), κάθε μία από τις οποίες θεωρείται ως μεταβλητή στιγμιότυπου (instance variable) . Σε κάθε αντικείμενο της κλάσης Student που δημιουργείται, οι μεταβλητές αυτές υπάρχουν, αλλά έχουν διαφορετική τιμή από αντικείμενο σε αντικείμενο. Μια μεταβλητή στιγμιότυπου δηλώνεται με τον τρόπο που ήδη γνωρίζουμε, δηλαδή με το είδος του τύπου και το όνομά της.

13 Δημιουργία Κλάσεων Ορισμός της κλάσης Student class Student { Κλάση
int schoolid; int StCode; String name; static float coefficient=1.5; static String subject="Freehand drawing"; float grade; } Κλάση Student Μαθητής Νο1 schoolid, StCode, name, grade 1.5 Freehand drawing Αντικείμενο Οι μεταβλητές Student.schoolid και Student.subject είναι κοινές για όλα τα αντικείμενα.

14 Δηλώσεις Μεθόδων Στον προγραμματισμό, Συνάρτηση αποκαλείται μια αυτοδύναμη μονάδα κώδικα προγράμματος που έχει σχεδιασθεί για να εκτελεί μια συγκεκριμένη εργασία. Οι συναρτήσεις χρησιμοποιούνται για να γλυτώσουμε την επανάληψη κώδικα μέσα στα προγράμματα. Δηλαδή, αν πρέπει να γίνει μια συγκεκριμένη εργασία πολλές φορές μέσα σ’ ένα πρόγραμμα, τότε γράφουμε μια φορά μια κατάλληλη συνάρτηση και μετά την χρησιμοποιούμε από το πρόγραμμα όταν και όπου την χρειαζόμαστε. Όπως έχουμε ξαναπεί (κέφαλαιο Μέθοδοι στη Java), μία μέθοδος δεν είναι τίποτα άλλο παρά μία συνάρτηση που ανήκει σε ένα αντικείμενο.

15 Δηλώσεις Μεθόδων Ανάλογα με τις μεταβλητές, υπάρχουν και δύο κατηγορίες μεθόδων, οι μέθοδοι κλάσης (class methods) και οι μέθοδοι στιγμιότυπου (instance methods). Οι μέθοδοι κλάσης, δηλώνονται και αυτοί όπως και οι μεταβλητές με τη λέξη static και μπορούν να εκτελεστούν ακόμη και αν δεν έχει δημιουργηθεί κανένα αντικείμενο της κλάσης. Για το λόγο αυτό, δεν αναφέρονται σε μεταβλητές στιγμιότυπου, ενώ αντίθετα, για να εκτελεστούν οι μεταβλητές στιγμιότυπου, πρέπει να υπάρχουν αντικείμενα, διαφορετικά δεν έχει νόημα η εκτέλεση μιας τέτοιας μεθόδου. Σύνταξη: τύπος όνομα_μεθόδου(παράμετρος_1, παράμετρος_2,…,παράμετρος_ν){ κώδικας μεθόδου; }

16 Δηλώσεις Μεθόδων Ο τύπος αναφέρεται στην τιμή που επιστρέφει μία μέθοδος και μπορεί να είναι οποιαδήποτε ή να είναι μια άλλη κλάση. Στην περίπτωση που μια μέθοδος δεν επιστρέφει καμία τιμή, τότε στη θέση του τύπου βάζουμε τη λέξη void. Το όνομα και οι παράμετροι μιας μεθόδου καθορίζονται από εμάς και μπορούν να χρησιμοποιηθούν μέσα στη μέθοδο όπως οι τοπικές μεταβλητές. Σε περίπτωση που δεν υπάρχουν παράμετροι, τοποθετούμε απλώς τις παρενθέσεις. Ας θυμηθούμε ότι για την επιστροφή μιας τιμής από μία μέθοδο, γίνεται χρήση της εντολής return. Ο τύπος της τιμής αυτής πρέπει να συμφωνεί με τον τύπο που δηλώθηκε στη μέθοδο.

17 Δηλώσεις Μεθόδων Συνεχίζοντας το παράδειγμα με την κλάση Student, θα ορίσουμε μέσα στο σώμα της και κάτω από τις δηλώσεις των μεταβλητών της, δύο νέες μεθόδους. H 1η show_subject, θα είναι μία μέθοδος κλάσης και κάθε φορά που θα καλείται θα επιστρέφει το τίτλο του μαθήματος, ενώ η 2η total_result, θα υπολογίζει τα μόρια του μαθητή, ανάλογα με το βαθμό του και τη τιμή του συντελεστή. Παράδειγμα: static String show_subject( ){ return subject; } float total_result( ){ return coefficient*grade;

18 Πρόσβαση σε ιδιότητες και μεθόδους
Προκειμένου να αποκτήσουμε πρόσβαση στις ιδιότητες και στις μεθόδους των αντικειμένων που δημιουργήσαμε, χρησιμοποιούμε το λεγόμενο dot notation. Δηλαδή: όνομα_αντικειμένου.ιδιότητα όνομα_αντικειμένου.μέθοδος( ) Οι μέθοδοι κλάσης χρησιμοποιούνται ευρέως για γενικές μεθόδους εργασιών (utility methods). Το όνομα της μεθόδου γράφεται μετά το όνομα της κλάσης και μια τελεία (.), αλλιώς η κλήση μεθόδων κλάσης γίνεται με τον κλασικό τρόπο. Η μέθοδος στιγμιότυπου είναι μια μέθοδος σε ένα αντικείμενο. Η τελεία (.) μαζί με μια αναφορά σε ένα αντικείμενο χρησιμοποιούνται για την κλήση μιας μεθόδου στιγμιότυπου.

19 Η Μεταβλητή this Όπως είδαμε, μία μέθοδος στιγμιότυπου χρησιμοποιείται ξεχωριστά από κάθε αντικείμενο, ενώ υπάρχει ένα μόνο αντίγραφό της στη μνήμη, το οποίο μοιράζεται από όλα τα αντικείμενα. Έτσι για παράδειγμα, η μέθοδος: float total_result( ){ return coefficient*grade; } χρησιμοποιεί τη μεταβλητή αντικείμενου grade και τη μεταβλητή κλάσης coefficient. Ενώ η μεταβλητή κλάσης coefficient είναι κοινή για όλα τα αντικείμενα, η μεταβλητή αντικείμενου grade διαφέρει για κάθε αντικείμενο που θα δημιουργηθεί.

20 Η Μεταβλητή this Προκειμένου λοιπόν το μοναδικό αυτό αντίγραφο της μεθόδου να μπορεί κάθε φορά να σχετίζεται ξεχωριστά με οποιοδήποτε αντικείμενο την καλεί, ο μεταγλωττιστής παρεμβάλει την μεταβλητή this σε κάθε μεταβλητή αντικειμένου έτσι ώστε η παραπάνω κατάσταση να είναι ισοδύναμη με τη this.grade: float total_result( ){ return coefficient*this.grade; } Να σημειωθεί ότι επειδή το this αναφέρεται στο τρέχον αντικείμενο της κλάσης, μπορούμε να το χρησιμοποιήσουμε μόνο με τις μεθόδους στιγμιότυπου και όχι με τις μεθόδους κλάσης.

21 Κατασκευαστές Κλάσεων
Σε κάθε κλάση μπορούν να οριστούν μέθοδοι κατασκευαστές (constructors) με όνομα ίδιο με αυτό της κλάσης. Η μέθοδος κατασκευής καλείται κάθε φορά που δημιουργείται ένα νέο αντικείμενο (με τη χρήση new ObjectType) και χρησιμοποιείται για την απόδοση τιμών στις μεταβλητές-μέλη που αυτό περιέχει. Να σημειωθεί ότι οι κατασκευαστές δεν επιστρέφουν τιμή και δε βάζουμε μπροστά τους τύπο επιστροφής, όπως γίνεται με τις άλλες μεθόδους, αλλά ούτε και τη λέξη void.

22 Κατασκευαστές Κλάσεων
Παράδειγμα: class Student { int schoolid; int StCode; ……………… // constructor class Student (int schoolid1, int StCode1, String name1, float grade1){ schoolid= schoolid1; StCode=StCode1; name=name1; grade=grade1; }

23 Κατασκευαστές Κλάσεων
Η παραπάνω μέθοδος constructor κάθε φορά που θα καλείται για να δημιουργηθεί ένα αντικείμενο κλάσης Student, αφενός θα δίνει κάποιες τιμές στις μεταβλητές schoolid, StCode, name και grade. Ο κατασκευαστής μπορεί να έχει όσες παραμέτρους θέλουμε, ενδεχομένως όμως να μην έχει και καμία. Μπορούμε επίσης να έχουμε περισσότερους κατασκευαστές για την ίδια κλάση, καθένας από τους οποίους να περιλαμβάνει διαφορετική λίστα παραμέτρων. Εάν δεν δημιουργήσουμε κατασκευαστή για μία κλάση, η Java δημιουργεί έναν από μόνη της, ο οποίος δεν κάνει τίποτε.

24 Κατασκευαστές Κλάσεων
Τα αντικείμενα δημιουργούνται από μια κλάση όταν δηλώνουμε: όνομα_κλάσης όνομα_μεταβλητής; Παράδειγμα: Student st1; /* δήλωση της μεταβλητής st1 που θα αποτελέσει μία αναφορά προς το αντικείμενο της κλάσης Student */ Δεν έχει δημιουργηθεί ακόμα το αντικείμενο. Για να γίνει αυτό πρέπει να γράψουμε: όνομα_μεταβλητής = new όνομα_κλάσης(παράμετροι); // δημιουργία αντικειμένου της κλάσης Student st1 = new Student(1000,100,"Nikolopoulos Nikos",12.3f);

25 Χρήση Κλάσεων Αφού αποθηκευτή η ολοκληρωμένη κλάση που φτιάξαμε (όνομα_κλάσης.java) και μεταγλωττιστεί για να δημιουργήσουμε το αρχείο όνομα_κλάσης.class, στη συνέχεια θα πρέπει να γράψουμε ένα άλλο πρόγραμμα, με το οποίο θα δημιουργήσουμε τα αντικείμενα της κλάσης. Παράδειγμα: public class testStudent { public static void main(String args[ ]) { Student st1=new Student(1000,100,"Nikolopoulos Nikos",12.3f); Student st2=new Student(1000,101,"Nikolaou Anna",15.1f); System.out.println(st1.name+" Grade: "+st1. total_result( )); System.out.println(st2.name+" Grade: "+st2. total_result( )); }

26 Χρήση Κλάσεων Απλή υλοποίηση κλάσης χωρίς τη χρήση κατασκευαστή – δομητή και με τη μέθοδο υπολογισμού χωρίς επιστρεφόμενο αποτέλεσμα. Παράδειγμα: // ορισμός των πεδίων – μεταβλητών των αντικειμένων class Rect{ double width, height; // μέθοδος για την εμφάνιση του εμβαδού του ορθ. παρ/μου void Area(){ System.out.println("Area: "+(width*height)); }

27 Χρήση Κλάσεων Παράδειγμα συνέχεια: class Rect_Example{
public static void main(String args[ ]){ Rect rect1 = new Rect(); // Είσοδος τιμών στο αντικείμενο rect1 rect1.width=5; rect1.height=6; // Εμφάνιση του εμβαδού του αντικειμένου rect1 rect1.Area(); }

28 Χρήση Κλάσεων Υλοποίηση κλάσης χωρίς τη χρήση κατασκευαστή – δομητή αλλά με τη μέθοδο υπολογισμού να επιστρέφει αποτέλεσμα. Παράδειγμα: // ορισμός των πεδίων – μεταβλητών των αντικειμένων class Rect{ double width, height; // μέθοδος για την επιστροφή του εμβαδού του ορθ. παρ/μου double Area(){ return width*height; }

29 Χρήση Κλάσεων Παράδειγμα συνέχεια: class Rect_Example{
public static void main(Strin args[ ]){ Rect rect1 = new Rect(); // Είσοδος τιμών στο αντικείμενο rect1 rect1.width=5; rect1.height=6; // Εμφάνιση του εμβαδού του αντικειμένου rect1 System.out.println(("Area: "+rect1.Area()); }

30 Χρήση Κλάσεων Υλοποίηση κλάσης με τη χρήση παραμετρικού κατασκευαστή – δομητή και με τη μέθοδο υπολογισμού να επιστρέφει αποτέλεσμα. Παράδειγμα: class Rect{ // ορισμός των πεδίων–μεταβλητών των αντικειμένων double width, height; Rect(double x, double y){ // ο κατασκευαστής της Rect width=x; height=y; } double Area(){ // μέθοδος για την επιστροφή του εμβαδού return width*height;

31 Χρήση Κλάσεων Παράδειγμα συνέχεια: class Rect_Example{
public static void main(Strin args[ ]){ // δημιουργία και αρχικοποίηση αντικειμένου Rect rect1 = new Rect(5,6); // Εμφάνιση του εμβαδού του αντικειμένου rect1 System.out.println(("Area: "+rect1.Area()); }

32 Αναφορά στα αντικείμενα
Όταν εκχωρούμε αντικείμενα στις μεταβλητές, οι μεταβλητές δείχνουν στα αντικείμενα και δε τα περιλαμβάνουν αυτά καθαυτά. Αυτό μας δίνει τη δυνατότητα να δημιουργούμε πολλαπλές μεταβλητές, οι οποίες όμως δείχνουν στο ίδιο αντικείμενο. Για παράδειγμα: Student st1; st1=new Student(1000,100,"Nikolopoulos Nikos",12.3f); Student st3=st1; Μνήμη Αντικείμενο Student schoolid=1000 StCode=100 name="Nikolopoulos Nikos" grade=12.3 st1 st3

33 Αναφορά στα αντικείμενα
Εάν κάνουμε μια αλλαγή στις παραμέτρους ενός αντικειμένου μέσω της μίας μεταβλητής, τότε η αλλαγή περνά και στην άλλη. Για παράδειγμα: ……….. st1.StCode=200; System.out.println(st3. StCode); // Θα εμφανίσει 200 Μνήμη Αντικείμενο Student schoolid=1000 StCode=200 name="Nikolopoulos Nikos" grade=12.5 st1 st3

34 Πακέτα Κλάσεων (Packages)
Ένα πακέτο κλάσεων είναι μία ομαδοποιημένη συλλογή ενός πλήθους κλάσεων. Οι κλάσεις από τις οποίες αποτελείται η Java είναι ομαδοποιημένες σε τέτοιου είδους πακέτα, ενώ κάθε πακέτο έχει το δικό του όνομα και οι κλάσεις του βρίσκονται στον ίδιο φάκελο (directory), ο οποίος επίσης έχει το ίδιο όνομα με το πακέτο. Η δήλωση του πακέτου στο οποίο ανήκει μια κλάση γίνεται στην αρχή του πηγαίου κώδικα της κλάσης: package όνομα_πακέτου; Κλάσεις ενσωματωμένες στα πακέτα προσαρτώνται στον κώδικα άλλων κλάσεων με τη δήλωση: import όνομα_πακέτου.όνομα_κλάσης;

35 Πακέτα Κλάσεων (Packages)
java.lang Περιέχει τις θεμελιώδεις κλάσεις της Java (όπως π.χ. την κλάση Math για τις μαθηματικές συναρτήσεις ή την κλάση String). Είναι το βασικό πακέτο της Java γι’ αυτό δεν είναι απαραίτητη η δήλωσή του. java.io Περιέχει κλάσεις οι οποίες αφορούν στην διαχείριση των λειτουργιών εισόδου/εξόδου. java.awt Παρέχει κλάσεις οι οποίες υποστηρίζουν την διαχείριση γραφικών. Εναλλακτικά υπάρχει και το πακέτο javax.swing το οποίο διαχειρίζεται με μεγαλύτερη επάρκεια και ευκολία γραφικά αντικείμενα.

36 Πακέτα Κλάσεων (Packages)
javax.swing Παρέχει τις swing συνιστώσες ενός GUI (Graphical User Interface), μία δηλαδή συλλογή από κλάσεις οι οποίες είναι πιο εύχρηστες στη διαχείριση γραφικών απ’ τις αντίστοιχες του πακέτου java.awt. javax.swing.border Ομάδα κλάσεων για την δημιουργία γραφικών ορίων γύρω από swing αντικείμενα. javax.swing.event Ομάδα κλάσεων για την υποστήριξη διαδραστικών γεγονότων στα swing αντικείμενα. java.awt.event Παρέχει κλάσεις για την υποστήριξη διαδραστικών συμβάντων.

37 Πακέτα Κλάσεων (Packages)
java.awt.image Παρέχει κλάσεις για την υποστήριξη επεξεργασίας εικόνας. java.applet Περιέχει κλάσεις που είναι απαραίτητες για τη δημιουργία και υποστήριξη κώδικα applet. java.util Παρέχει κλάσεις οι οποίες καλύπτουν ένα εύρος από τυποποιημένες λειτουργίες όπως η διαχείριση δεδομένων, η πρόσβαση στην ώρα και στην ημερομηνία του συστήματος και η ανάλυση συμβολοσειρών (strings). java.util.zip Περιέχει κλάσεις για την υποστήριξη και δημιουργία αρχείων .jar (Java ARchive) java.sql Παρέχει κλάσεις για την υποστήριξη SQL βάσεων δεδομένων.

38 Δημιουργία & Μεταγλώττιση Πακέτων Κλάσεων
Ακριβώς όπως χρησιμοποιούμε τυποποιημένα πακέτα από την Java, μπορούμε να τυποποιήσουμε και δικές μας κλάσεις σε πακέτα. Εάν μία δική μας κλάση θέλουμε να ανήκει σε ένα πακέτο, πριν από οποιαδήποτε άλλη δήλωση χρησιμοποιούμε τη δήλωση package: package όνομα_πακέτου; public class όνομα_κλάσης; { // Ο υπόλοιπος κώδικας }

39 Δημιουργία & Μεταγλώττιση Πακέτων Κλάσεων
Παράδειγμα: package geometry; public class MyCircle { double Pi=3.14; double radius; double x,y; public MyCircle (double radius1, double x1, double y1){ radius=radius1; x=x1; y=y1; }

40 Δημιουργία & Μεταγλώττιση Πακέτων Κλάσεων
Παράδειγμα συνέχεια: public MyCircle (double radius2){ radius=radius2; x=y=0.0; } public double area(){ return Pi*radius*radius;

41 Δημιουργία & Μεταγλώττιση Πακέτων Κλάσεων
Το επόμενο βήμα είναι να μεταγλωττίσουμε την κλάση έτσι ώστε το αρχείο .class που της αντιστοιχεί να αποθηκευτεί στο φάκελο που θέλουμε. Σύνταξη: javac –d φάκελος_προορισμού όνομα_αρχείου.java Η παράμετρος -d χρησιμοποιείται για τη δημιουργία του φακέλου. Έστω ότι θέλουμε να δημιουργηθεί ο φάκελος geometry μέσα στο φάκελο C:\myapps στον οποίο βρίσκεται και το αρχείο MyCircle.java. Θα πρέπει να δώσουμε στη μεταγλώττιση: javac –d . MyCircle.java (χρησιμοποιούμε τελεία για να κρατήσουμε το πακέτο μέσα στον ίδιο κατάλογο)

42 Δημιουργία & Μεταγλώττιση Πακέτων Κλάσεων
Δημιουργούμε το πρόγραμμα που θα κάνει χρήση του πακέτου geometry και της κλάσης MyCircle. import geometry.MyCircle; public class Circle_Shapes{ public static void main(String args[ ]){ MyCircle troxos = new MyCircle(7.0,10.0,10.0); System.out.println("Area of troxos: "+troxos.area()); MyCircle roda = new MyCircle(10.0); System.out.println("Area of roda: "+roda.area()); }

43 Δημιουργία & Μεταγλώττιση Πακέτων Κλάσεων
Για κάθε νέα κλάση που θέλουμε να ανήκει στο πακέτο geometry, χρησιμοποιούμε την ίδια δήλωση στην αρχή του κώδικα. Επιπρόσθετα όλα τα αρχεία των κλάσεων αυτών πρέπει να είναι αποθηκευμένα στον ίδιο φάκελο, ο οποίος πρέπει να έχει την ονομασία του πακέτου. Σε περίπτωση που θελήσουμε να κατηγοριοποιήσουμε περισσότερο τις κλάσεις μας, μπορούμε να δημιουργήσουμε υποφακέλους κάτω από τον φάκελο geometry. Έτσι η κλάση MyCircle3D θα ανήκει πλέον στον υποφάκελο Shapes3D. package geometry.Shapes3D; public class MyCircle3D; { // Ο υπόλοιπος κώδικας }

44 Ενθυλάκωση (Encapsulation)
Ενθυλάκωση δεδομένων (data encapsulation) καλείται η ιδιότητα που προσφέρουν οι κλάσεις να «κρύβουν» τα ιδιωτικά δεδομένα τους από το υπόλοιπο πρόγραμμα και να εξασφαλίζουν πως μόνο μέσω των δημόσιων μεθόδων τους θα μπορούν αυτά να προσπελαστούν. Αυτή η τακτική παρουσιάζει μόνο οφέλη καθώς εξαναγκάζει κάθε εξωτερικό πρόγραμμα να φιλτράρει το χειρισμό που επιθυμεί να κάνει στα πεδία μίας κλάσης μέσω των ελέγχων που μπορούν να περιέχονται στις δημόσιες μεθόδους της κλάσης. Επίσης, επιτρέπει στον προγραμματιστή να τροποποιεί ή να βελτιώνει τους αλγόριθμους που υπάρχουν σε μια κλάση χωρίς να ανησυχεί μήπως προκαλέσει απρόβλεπτα αποτελέσματα.

45 Ενθυλάκωση (Encapsulation)

46 Ενθυλάκωση (Encapsulation)
Ένα παράδειγμα ενθυλάκωσης είναι το ράδιο αυτοκινήτου: Η διεπαφή (interface) αποτελείται από τα σημεία διασύνδεσης του ραδίου µε το αυτοκίνητο. Οι λεπτομέρειες σχετικά µε το πώς δουλεύει το ράδιο αποκρύπτονται (Για την εγκατάσταση ενός ραδίου δεν χρειάζεται να γνωρίζουμε τίποτα για το ηλεκτρονικό του σύστημα).

47 Ενθυλάκωση (Encapsulation)
Τα δεδομένα και οι μέθοδοι μιας κλάσης μπορεί να δηλωθούν ως public, ως private, ως protected, ή χωρίς κανέναν από τους προηγούμενους τρεις προσδιοριστές προσπέλασης (access modifiers). Οι μεταβλητές, οι μέθοδοι, και οι κλάσεις που δηλώνονται ως public, μπορούν να προσπελαστούν από οποιαδήποτε άλλη κλάση, όπου κι αν βρίσκεται αυτή. Οι μεταβλητές και μέθοδοι που χαρακτηρίζονται ως private, μπορούν να προσπελαστούν και να χρησιμοποιηθούν μόνο από το ίδιο το αντικείμενο, ενώ δεν μπορούν να προσπελαστούν από πουθενά έξω από αυτό. Οι μεταβλητές και οι μέθοδοι που έχουν δηλωθεί ως protected σε μια κλάση μπορούν να προσπελαστούν από όλες τις κλάσεις που βρίσκονται στο ίδιο πακέτο ή από τις υποκλάσεις (subclasses).

48 Ενθυλάκωση (Encapsulation)
Εάν δεν χρησιμοποιηθεί κανένας από τους προσδιοριστές public, private ή protected για μια μεταβλητή, μέθοδο ή κλάση, τότε αυτή μπορεί να χρησιμοποιηθεί μόνο από τις κλάσεις που βρίσκονται στο ίδιο πακέτο. Σε γενικές γραμμές, οι μεταβλητές εντός μιας κλάσης πρέπει να δηλώνονται σαν private και οι μέθοδοι που θα καλούνται εκτός της κλάσης public. Ακόμα και εάν χρειάζεται να υπάρχει πρόσβαση στις μεταβλητές εκτός της κλάσης τους, καλό είναι αυτές να παραμένουν private και ο έλεγχος να γίνεται μέσω μιας μεθόδου που θα δηλώνεται public.

49 Ενθυλάκωση (Encapsulation)

50 Ενθυλάκωση (Encapsulation)
Παράδειγμα: class Student2 { private int schoolid; private int StCode; private String name; static float coefficient=1.5f; static String subject="Freehand drawing"; private float grade; //Getter and Setter methods public int getSchoolid(){ return schoolid; }

51 Ενθυλάκωση (Encapsulation)
Παράδειγμα συνέχεια: public int getStCode(){ return StCode; } public String getName(){ return name; public float getGrade(){ return grade; public void setSchoolid(int newValue){ schoolid = newValue; Εναλλακτικά: public void setSchoolid(int schoolid) { this.schoolid = schoolid; }

52 Ενθυλάκωση (Encapsulation)
Παράδειγμα συνέχεια: public void setStCode(int newValue){ StCode = newValue; } public void setName(String newValue){ name = newValue; public void setGrade(float newValue){ grade = newValue; public float total_result(){ return coefficient*grade;

53 Ενθυλάκωση (Encapsulation)
Παράδειγμα συνέχεια: public class class_example2{ public static void main(String args[]){ Student2 st1=new Student2(); st1.setSchoolid(1000); st1.setStCode(100); st1.setName("Nikolopoulos Nikos"); st1.setGrade(10.0f); System.out.println("Code: "+st1.getStCode()+" " st1.getName()+" Grade: "+st1.total_result()); }

54 Κληρονομικότητα (Inheritance)
Με τον όρο κληρονομικότητα, εννοούμε τη δυνατότητα που έχει μια κλάση να κληρονομεί όλες τις ιδιότητες και τις μεθόδους μιας άλλης κλάσης. Χρησιμοποιώντας λίγο πιο επίσημη ορολογία, λέμε ότι η κλάση που ορίζεται πρώτη είναι η βασική κλάση (base class) και η κλάση που κληρονομεί τη βασική κλάση ονομάζεται παράγωγη κλάση (derived class). Εναλλακτικά οι βασικές κλάσεις ονομάζονται και υπερκλάσεις (superclasses) ενώ οι παράγωγες κλάσεις, οι οποίες κληρονομούν αυτόματα όλες τις μεταβλητές και τις μεθόδους από τις υπερκλάσεις τους, ονομάζονται υποκλάσεις (subclasses). H υπερκλάση δεν έχει καμία διαφορά από τις κλάσεις που έχουμε δει έως τώρα. H υποκλάση όμως χρησιμοποιεί ελαφρά διαφορετική σύνταξη.

55 Κληρονομικότητα (Inheritance)
Η ClassA είναι υπερκλάση της ClassB. Η ClassB είναι υποκλάση της ClassA και υπερκλάση των ClassC και ClassD. Οι ClassC και ClassD είναι υποκλάσεις της ClassB.

56 Κληρονομικότητα (Inheritance)
Με την κληρονομικότητα, επιτυγχάνεται η επαναχρησιμοποίηση κώδικα ο οποίος έχει γραφεί πριν και είναι ένα από τα σημαντικά πλεονεκτήματα των αντικειμενοστρεφών γλωσσών προγραμματισμού σε σχέση με τις συμβατικές γλώσσες. Για να καταλάβουμε την κληρονομικότητα, φανταστείτε το πρόβλημα μιας εταιρίας η οποία έχει ως αντικείμενα πελάτες, υπαλλήλους, προμηθευτές και άλλα συναφή. Τόσο οι πελάτες και οι προμηθευτές όσο και οι υπάλληλοι έχουν κοινά χαρακτηριστικά και συμπεριφορές (μεθόδους). Θα πρέπει να φτιάξουμε 3 κλάσεις με στοιχεία το επώνυμο, όνομα, κωδικό, διεύθυνση, κ.λπ., με συνέπεια να έχουμε πολλές φορές τον ίδιο κώδικα.

57 Κληρονομικότητα (Inheritance)
Αφού λοιπόν οι 3 κλάσεις έχουν τόσα πολλά παρόμοια χαρακτηριστικά, θα ήταν καλύτερα να κάνουμε κάτι διαφορετικό, δηλαδή να φτιάξουμε μια υπερκλάση η οποία θα περιέχει τα κοινά χαρακτηριστικά των πελατών, των προμηθευτών και των υπαλλήλων της εταιρίας. Έπειτα θα ορίσουμε 3 υποκλάσεις (πελάτες, προμηθευτές, υπάλληλοι), κάθε μια από τις οποίες να έχει τα γενικά χαρακτηριστικά της υπερκλάσης. Οι 3 υποκλάσεις, εκτός από τις ιδιότητες τις οποίες ορίζονται μέσα στο εσωτερικό τους, κληρονομούν (άρα μπορούν να χρησιμοποιήσουν) και τις ιδιότητες της υπερκλάσης τους.

58 Κληρονομικότητα (Inheritance)
Τύποι Κληρονομικότητας (Απλή, Πολλαπλών Επιπέδων, Ιεραρχική)

59 Κληρονομικότητα (Inheritance)
Παράδειγμα: class Parents{ protected String Father_Name; protected String Mother_Name; Parents(String F_N, String M_N){ Father_Name=F_N; Mother_Name=M_N; }

60 Κληρονομικότητα (Inheritance)
Παράδειγμα συνέχεια: class Child extends Parents { String Child_Name; int age; Child(String F_N, String M_N, String C_N, int a){ super(F_N,M_N); Child_Name=C_N; age=a; } public String toString() { return "Father's name: "+Father_Name+"\nMother's name: "+Mother_Name+"\nChild's name: "+Child_Name+"\nAge: "+age; Η δεσμευμένη λέξη super χρησιμεύει για την κλήση της υπερκλάσης μιας κλάσης, καλώντας τον κατασκευαστή της. Όλες οι κλάσεις της Java είναι υποκλάσεις της κλάσης Object που περιέχει πολλές σημαντικές μεθόδους, όπως τη toString() που χρησιμοποιείται για να εμφανίζει τα στοιχεία ενός αντικειμένου. Παρότι οι δύο κλάσεις βρίσκονται στο ίδιο αρχείο (Parents.java), η μεταγλώττιση θα δημιουργήσει δύο αρχεία, το Parents.class και το Child.class.

61 Κληρονομικότητα (Inheritance)
Παράδειγμα συνέχεια: class Family{ public static void main(String args[ ]){ Child c1=new Child("Nick","Anna","George",15); System.out.println(c1); }

62 Πολυμορφισμός (Polymorphism)
Ο Πολυμορφισμός είναι μία από τις πιο βασικές έννοιες στον αντικειμενοστρεφή προγραμματισμό και σχετίζεται με την αποσύνδεση των μεθόδων από τους τύπους. Πολυμορφισμό έχουμε στην περίπτωση που η ίδια μέθοδος ή ο ίδιος τελεστής χρησιμοποιείται με διαφορετικούς τύπους δεδομένων.

63 Πολυμορφισμός (Polymorphism)
Σαν παράδειγμα από την καθημερινή μας ζωή μπορούμε να αναφέρουμε: Κάνω καφέ Κάνω τα μαθήματά μου Κάνω τις δουλειές του σπιτιού Κάνω βόλτα Η λέξη «Κάνω» χρησιμοποιείται με διαφορετική έννοια. Ένα άλλο παράδειγμα πολυμορφισμού είναι ο τελεστής της πρόσθεσης «+». Μπορεί να χρησιμοποιηθεί τόσο για την πρόσθεση δύο αριθμών όσο και για τη συνένωση δύο αλφαριθμητικών.

64 Πολυμορφισμός (Polymorphism)
Παράδειγμα: class Rect2{ double Area(double x, double y){ return x*y; } int Area(int x, int y){

65 Πολυμορφισμός (Polymorphism)
Παράδειγμα συνέχεια: class Polymorphism_Example{ public static void main(String args[ ]){ Rect2 rect1 = new Rect2(); Rect2 rect2 = new Rect2(); System.out.println("Area: "+rect1.Area(5.5,6.5)); System.out.println("Area: "+rect2.Area(5,7)); }

66 Υπερφόρτωση (Overloading)
Η Υπερφόρτωση είναι ένα χαρακτηριστικό των γλωσσών προγραμματισμού που επιτρέπει τη δημιουργία διαφορετικών μεθόδων που έχουν το ίδιο όνομα, αλλά διαφέρουν μεταξύ τους όσον αφορά τις παραμέτρους τους. Κατά την κλήση μιας μεθόδου κατ' αρχήν εξετάζεται το όνομά της και έπειτα εξετάζεται και η λίστα των παραμέτρων της, όσον αφορά το πλήθος, τον τύπο και τη σειρά τους. Αυτό είναι και μια μορφή Πολυμορφισμού.

67 Υπερφόρτωση (Overloading)
Συχνά οι λειτουργίες Πολυμορφισμός και Υπερφόρτωση συγχέονται ως συνώνυμα εξαιτίας της ομοιότητάς τους σε λειτουργία. Ωστόσο, αυτά τα δύο είναι διαφορετικές λειτουργίες και χρησιμοποιούνται για να παράγουν διαφορετικά αποτελέσματα.

68 Υπερφόρτωση (Overloading)
Παράδειγμα: class Rect3{ double width, height; Rect3(double x, double y){ width=x; height=y; } Rect3(double x){ width=height=x; double Area(){ return width*height; }

69 Υπερφόρτωση (Overloading)
Παράδειγμα συνέχεια: class Overloading_Example{ public static void main(String args[ ]){ Rect3 rect1 = new Rect3(5,6); Rect3 rect2 = new Rect3(5); System.out.println("Area: "+rect1.Area()); System.out.println("Area: "+rect2.Area()); }

70 Υποσκέλιση (Overriding)

71 Υποσκέλιση (Overriding)
Παράδειγμα: class Square{ double a; Square(double a){ this.a=a; } double Area(){ return a*a; class Rectangle extends Square{ double b; Rectangle(double a, double b){ super(a); this.b=b; } double Area(){ return a*b;

72 Υποσκέλιση (Overriding)
Παράδειγμα συνέχεια: class Overriding_Example{ public static void main(String args[ ]){ Square shape1 = new Square(5); Rectangle shape2 = new Rectangle(5,6); System.out.println("Square Area: "+shape1.Area()); System.out.println("Reactangle Area: "+shape2.Area()); }

73 Αφηρημένες κλάσεις και Μέθοδοι (Abstract)
Αφηρημένες κλάσεις είναι οι κλάσεις που ορίζονται μόνο για την αναπαράσταση αντικειμένων στον πραγματικό κόσμο που είναι αφηρημένα ως έννοιες, όπως για παράδειγμα το σχήμα, η μουσική, το όχημα κ.λπ. και για τα οποία παρέχουν μία βασική υλοποίηση. Κύριο χαρακτηριστικό τους είναι η μη ύπαρξη δυνατότητας δημιουργίας αντικειμένων, δηλαδή στιγμιότυπων των συγκεκριμένων κλάσεων. Για να ορίσουμε μία κλάση ως αφηρημένη, χρησιμοποιούμε τη δεσμευμένη λέξη abstract. Επιπλέον, θα πρέπει η κλάση να περιέχει και τουλάχιστον μία αφηρημένη μέθοδο, η οποία επίσης δηλώνεται με τη δεσμευμένη λέξη abstract και επομένως δεν υλοποιείται.

74 Αφηρημένες κλάσεις και Μέθοδοι (Abstract)
Παράδειγμα: abstract class Exams { abstract double getRateOfCoefficient(); } class Mathematics extends Exams{ double getRateOfCoefficient(){return 1.5;} class Greek_Lang extends Exams{

75 Αφηρημένες κλάσεις και Μέθοδοι (Abstract)
Παράδειγμα συνέχεια: class Networks extends Exams{ double getRateOfCoefficient(){return 3.5;} } class Programming extends Exams{

76 Αφηρημένες κλάσεις και Μέθοδοι (Abstract)
Παράδειγμα συνέχεια: public class Coefficients { public static void main(String[] args) { Exams a = new Mathematics(); Exams b = new Greek_Lang(); Exams c = new Networks(); Exams d = new Programming(); System.out.println("Coefficient of Mathematics is: " + a.getRateOfCoefficient()); System.out.println("Coefficient of Greek Language is: " +b.getRateOfCoefficient()); System.out.println("Coefficient of Networks is: "+c.getRateOfCoefficient()); System.out.println("Coefficient of Programming is: " +d.getRateOfCoefficient()); } Coefficient of Mathematics is: 1.5 Coefficient of Greek Language is: 1.5 Coefficient of Networks is: 3.5 Coefficient of Programming is: 3.5

77 Τελικές κλάσεις και Μέθοδοι (Final)
public final class Shape δεν επιτρέπει τη δημιουργία υποκλάσεων της Shape. Αντίστοιχα γίνεται και με τις μεθόδους. Για παράδειγμα, η δήλωση: public final double Area() ακυρώνει τη μέθοδο Area. Σημείωση: Τη δεσμευμένη λέξη final, την έχουμε χρησιμοποιήσει στο παρελθόν για τις δηλώσεις σταθερών μέσα στο πρόγραμμα. Για παράδειγμα: public final double FPA=0.24;

78 Αφαίρεση δεδομένων (Abstraction)
Αφαίρεση δεδομένων ή Αφαιρετικότητα καλείται η διαδικασία εξαγωγής µόνο των σχετικών ιδιοτήτων ενός «αντικειμένου». Οι ιδιότητες αυτές ορίζουν µια άποψη του αντικειμένου. Για παράδειγμα, ένας πωλητής αυτοκινήτων ασχολείται µε τα στοιχεία που αφορούν την πώληση ενός αυτοκινήτου όπως τιμή, χρόνος εγγύησης, χρώμα, επιπρόσθετος εξοπλισμός κ.λπ., ενώ ένας μηχανικός βλέπει το αυτοκίνητο από την άποψη της συντήρησης του συστήματος, όπως είδος λαδιού, μέγεθος φίλτρου λαδιού κ.λπ.

79 Αφαίρεση δεδομένων (Abstraction)

80 Συνεχίζεται….

81 Πηγές Εισαγωγή στην Java 2 – Γεώργιος Λιακέας
Η γλώσσα JavaScript – Λιακέας Γ. greek.readthedocs.org/en/latest/oop_general.html polymorphism-and-overloading ΕΠΛ 132 – Αρχές Προγραμματισµού ΙΙ μός Αλγοριθμική και Προγραμματισμός – Παναγιώτης Σφέτσος


Κατέβασμα ppt "Ειδικά Θέματα στον Προγραμματισμό Υπολογιστών"

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google