Κλάσειςστη Java - · PDF fileJava...

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

Transcript of Κλάσειςστη Java - · PDF fileJava...

Page 1: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 1

Κλάσεις στη Java

Παύλος Εφραιμίδης

Page 2: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 2

Κλάσεις στην Java

• Θα δούμε τη διαδικασία δημιουργίας μιαςκλάσης

• Θα υλοποιήσουμε μια κλάση για τη ΔομήΔεδομένων Stack

Page 3: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 3

Στοίβα - Stack

• Η στοίβα είναι μια LIFO – Last In First Out ουρά

• Οι βασικές πράξεις είναι– push: Εισάγει ένα νέο στοιχείο στο τέλος τηςστοίβας

– pop: Αφαιρεί το τελευταίο στοιχείο της στοίβας

Page 4: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 4

Η κλάσηStack

Page 5: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 5

Η κλάση Vector της Java

• Η κλάση Vector της Java υλοποιεί ένανδυναμικό πίνακα αντικειμένων

• Το μέγεθος του Vector αυξάνεται αυτόματαόταν προστεθούν νέα στοιχεία στο τέλοςτου Vector

• Θα χρησιμοποιήσουμε την κλάση Vector για να αποθηκεύουμε τα δεδομένα τηςστοίβας

Page 6: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 6

Δήλωση της κλάσης• Δημιουργία Κλάσης: Για να δημιουργηθείμια νέα κλάση πρέπει να δοθεί– η δήλωση της κλάσης (declaration), και– η υλοποίηση (το σώμα) της κλάσης (body)

• Στην Java η υλοποίηση της κλάσης δίνεταιμαζί με τη δήλωσή της, σε αντίθεση με τηC++ όπου κατά κανόνα δίνονται χωριστά

Page 7: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 7

Η υλοποίηση της κλάσης

• Η υλοποίηση της κλάσης– ακολουθεί τη δήλωση της κλάσης, και– δίνεται μέσα σε αγκύλες { και }.

• Η υλοποίηση περιλαμβάνει– δηλώσεις μεταβλητών των στιγμιοτύπων– δηλώσεις μεταβλητών της κλάσης (στατικέςμεταβλητές)

– δηλώσεις και υλοποιήσεις μεθόδων των στιγμιοτύπων– δηλώσεις και υλοποιήσεις μεθόδων της κλάσης

(στατικές μέθοδοι)

Page 8: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 8

Συναρτήσεις Δόμησης (Constructors)• Η κλάση περιλαμβάνει ένα σύνολο από

constructors• Constructor είναι μέθοδος που καλείταιόταν δημιουργείται ένα νέο στιγμιότυπο(αντικείμενο) της κλάσης

• Εάν δεν υλοποιηθεί κανένας constructor, ηJava παρέχει ένα default constructor πουδεν εκτελεί καμία εντολή– Επομένως όλες οι κλάσεις έχουν constructor

Page 9: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 9

Μεταβλητές

• Η κατάσταση ενός αντικειμένου περιγράφεται μετις τιμές των μεταβλητών του

• Οι μεταβλητές δηλώνονται μέσα στο σώμα τηςκλάσης, συνήθως πριν από τις μεθόδους

• Προσοχή: Οι μεταβλητές μέλη της κλάσηςδηλώνονται έξω από τις μεθόδους της κλάσης, διαφορετικά είναι τοπικές μεταβλητές τωνμεθόδων και όχι της κλάσης

Page 10: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 10

Μέθοδοι

• Η συμπεριφορά και η λειτουργικότητα μιαςκλάσης καθορίζεται από τις μεθόδους(συναρτήσεις) που έχει η κλάση

• Οι μέθοδοι δηλώνονται και υλοποιούνταιμέσα στο σώμα της κλάσης

Page 11: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 11

Πρόσβαση στα μέλη μιας κλάσης

• Για κάθε μέλος μιας κλάσης καθορίζεται τοεπίπεδο πρόσβασης σε αυτό

• Η Java υποστηρίζει τα επίπεδα– public, protected, package και private

Page 12: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 12

Στατικά Μέλη

• Τα μέλη μιας κλάσης μπορεί να ανήκουν:– Στα στιγμιότυπα (αντικείμενα) της κλάσης.Στην περίπτωση αυτή κάθε στιγμιότυπο έχει ταδικά του τοπικά στιγμιότυπα αυτών των μελών

– Στην ίδια την κλάση (στατικά μέλη).Τα μέλη αυτά ανήκουν στην κλάση και όλα τααντικείμενα της κλάσης χρησιμοποιούν το ίδιοστιγμιότυπο αυτού του μέλους

Page 13: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 13

Δήλωση Κλάσης (1)

Page 14: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 14

Δήλωση Κλάσης (2)

• public: Είναι προσπελάσιμη από παντού• abstract: Είναι αφηρημένη κλάση, δηλαδήδεν επιτρέπεται να δημιουργήσουμεστιγμιότυπα της κλάσης. Σε τι χρησιμεύει;

• final: Δεν επιτρέπεται να κληρονομήσουμετην κλάση, να δημιουργήσουμε απογόνουςτης κλάσης

Page 15: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 15

Δήλωση Κλάσης (3)

• class ΌνομαΚλάσης– Με τη λέξη κλειδί class δηλώνουμε ότιακολουθεί δήλωση κλάσης

• extends ΚλάσηΠρόγονος– Η κλάση είναι απόγονος της κλάσης καικληρονομεί όλα τα χαρακτηριστικά κλάσηςπρογόνου

• implements Interfaces– Δηλώνεται ότι η κλάση υλοποιεί ένα ηπερισσότερα interfaces

Page 16: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 16

Το σώμα της κλάσης

• Περιλαμβάνει όλα τα μέλη της κλάσης– μεταβλητές– μεθόδους– μεθόδους constructors– μέθοδο finalize

Page 17: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 17

Constructors για Stack• Μπορούμε να υλοποιήσουμε περισσότερους από ένανυπερφορτώνοντας (overloading) το όνομα τουconstructor για διαφορετικά σύνολα παραμέτρων

• Για παράδειγμα:public Stack() {

items = new Vector(10);}public Stack(int size) {

items = new Vector(size);}

Page 18: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 18

Δημιουργία αντικειμένου Stack

• Δημιουργία αντικειμένου Stack με τον πρώτοconstructor:

Stack s1= new Stack();• Δημιουργία αντικειμένου Stack με το δεύτερο

constructor:Stack s2 = new Stack(30);• O compiler αναγνωρίζει από τις παραμέτρουςποιον constructor πρέπει να καλέσει σε κάθεπερίπτωση

Page 19: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 19

super()• Ο constructor μπορεί να περιλαμβάνει ότιπεριλαμβάνουν και οι κανονικές μέθοδοι μιαςκλάσης

• Επιπλέον υποστηρίζει και την εντολή super()– Με την εντολή super() καλούμε τον constructor τηςκλάσης προγόνου

– Εάν υπάρχει η εντολή super() θα πρέπειυποχρεωτικά να είναι στην αρχή του κώδικα τουconstructor

Page 20: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 20

Δήλωση μεταβλητών κλάσης (1)

Page 21: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 21

Δήλωση μεταβλητών κλάσης (2)• δικαιώματα πρόσβασης: public, protected, private,

package• static: στατική μεταβλητή• final: δεν μπορεί να μεταβληθεί (σταθερά)

– πχ. final double AVOGADRO = 6.022e23; • transient: Αφορά το serialization αντικειμένων τηςκλάσης και δηλώνει ότι η μεταβλητή δεν θααποθηκευτεί

• volatile: Δηλώνει ότι δεν πρέπει να εφαρμόσει οcompiler ορισμένες βελτιστοποιήσεις και αφοράεφαρμογές με πολλά threads (multithreading).

• <type> <name>: τύπος και όνομα της μεταβλητής

Page 22: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 22

Δήλωση Μεθόδων (1)

Page 23: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 23

Δήλωση Μεθόδων (2)

Page 24: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 24

Δήλωση Μεθόδων (3)• δικαιώματα πρόσβασης: public, protected,

private, package• static: στατική μέθοδος• abstract: δεν δίνεται υλοποίηση της μεθόδουαλλά μόνο η δήλωσή της

• final: δεν επιτρέπεται να ξανα-οριστεί ημέθοδος σε κλάση απόγονο

• native: η μέθοδος υλοποιείται σε άλλη γλώσσαπρογραμματισμού (βλέπε JNI: Java Native Interface)

Page 25: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 25

Δήλωση Μεθόδων (4)• synchronized: Χρησιμοποιείται στοσυγχρονισμό/αμοιβαίο αποκλεισμό ότανεκτελούνται ταυτόχρονα περισσότερα του ενόςthreads

• <return-type>: τι επιστρέφει η μέθοδος• <parameter-list>: παράμετροι της μεθόδου• throws exception: δηλώνεται εάν η μέθοδοςπαράγει εξαιρέσεις

Page 26: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 26

Τι επιστρέφει μια μέθοδος• Η μέθοδος μπορεί να επιστρέφει μια τιμή όταντερματίσει

• Η τιμή που επιστρέφει η μέθοδος καθορίζεται με τηνεντολή return. Για παράδειγμα:

public boolean isEmpty() { if (items.size() == 0)

return true; else

return false; }

Page 27: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 27

Όνομα μιας Μεθόδου• Η Java υποστηρίζει την υπερφόρτωση (overloading)των ονομάτων μεταβλητών

• Μπορεί δηλαδή να δίνονται πολλές μέθοδοι με το ίδιοόνομα (ή αλλιώς πολλές διαφορετικές υλοποιήσεις τηςίδιας μεθόδου) που διαφέρουν μεταξύ τους ως προς τοπλήθος ή/και τον τύπο των παραμέτρων τους

• Παράδειγμα:class DataRenderer {

void draw(String s) { . . . } void draw(int i) { . . . } void draw(float f) { . . . }

}

Page 28: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 28

Πέρασμα Παραμέτρων• Στην Java οι παράμετροι των μεθόδων περνάνεΠΑΝΤΟΤΕ ΜΕ ΤΙΜΗ !

• Οι παράμετροι μπορεί να είναι βασικοί τύποιδεδομένων (primitive) ή αντικείμενα κλάσεων

• Προσοχή: Όταν η παράμετρος είναι ένα αντικείμενο, περνάει με τιμή η αναφορά στο αντικείμενο– Αυτό μοιάζει με το πέρασμα δείκτη (pointer) στη C/C++

• Ερώτημα: Πως μπορούμε να περάσουμε primitiveμεταβλητή ώστε να μπορεί να τροποποιηθεί μέσα στημέθοδο

Page 29: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 29

Boxing/Unboxing Πρωτογενών Τύπων

• Για να περάσουμε μια primitive μεταβλητή ωςπαράμετρο σε μέθοδο ώστε να μπορεί να τροποποιηθεί ημεταβλητή αυτή μπορούμε– να κάνουμε wrap την primitive μεταβλητή σε ένα αντίστοιχοαντικείμενο (πχ. Integer για int, Double για double, κτλ.)

– να περάσουμε ως παράμετρο το αντικείμενο (ουσιαστικά τηναναφορά στο αντικείμενο)

• Αυτή η διαδικασία ονομάζεται ονομάζεται– Boxing: Μετατροπή από πρωτογενή τύπο σε αντικείμενο– Unboxing: Μετατροπή από αντικείμενο σε πρωτογενή τύπο

Page 30: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 30

Παράδειγμα Boxing/Unboxing// ακέραια μεταβλητή (πρωτογενής τύπος δεδομένων)int i = 10;

// αναφορά σε αντικείμενο της κλάσης IntegerInteger iObj;

// boxing: Από πρωτογενή τύπο δεδ. σε αντικ.iObj = new Integer(i);

// unboxing: Από αντικ. σε πρωτογενή τύπο δεδ.int k = iObj.intValue();

• Σημείωση: Από την Java 5.0 (ή αλλιώς 1.5) και μετά ορισμένεςλειτουργίες μετατροπής boxing/unboxing έχουν απλοποιηθεί

Page 31: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 31

Σώμα της Μεθόδου• Μέσα στο σώμα (στην υλοποίηση) της μεθόδουμπορούμε να χρησιμοποιήσουμε:– this: Η λέξη κλειδί this είναι μια αναφορά στοτρέχον αντικείμενο στο οποίο ανήκει η μέθοδος πουεκτελείται

– super(): • Η εντολή super() καλεί τον constructor της κλάσηςπρογόνου

• H εντολή super καλεί μέλη της κλάσης προγόνου πουμπορεί να “έχουν καλυφθεί” από μέλη της κλάσηςαπογόνου

Page 32: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 32

thisclass Point {

int x; int y;public Point(int x, int y) {

this.x = x;this.y = y;

}}

Page 33: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 33

• Η βασική κλάση:class ASillyClass {

boolean aVariable;void aMethod() {

aVariable = true; }

} • Η κλάση απόγονος “κρύβει” τη μεταβλητή aVariable και ξανα-ορίζει τη μέθοδο aMethod: class ASillierClass extends ASillyClass {

boolean aVariable;void aMethod() {

aVariable = false;super.aMethod();System.out.println(aVariable);System.out.println(super.aVariable);

} }

Παράδειγμαχρήσης της

super

Page 34: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 34

Τοπικές Μεταβλητές• Μέσα στο σώμα (υλοποίηση) μιας μεθόδουμπορούν να οριστούν μεταβλητές

• Οι μεταβλητές αυτές ονομάζονται τοπικέςμεταβλητές και έχουν εμβέλεια τη μέθοδο αυτή

Page 35: Κλάσειςστη Java - · PDF fileJava ΚλάσειςστηJava 3 Στοίβα- Stack • ΗστοίβαείναιμιαLIFO – Last In First Out ... int k = iObj.intValue();

Java Κλάσεις στη Java 35

Πηγές/Αναφορές

• The Java Tutorial, www.sun.com