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

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

Αντικειμενοστραφής Προγραμματισμός & JAVA Θ. Βαρβαρίγου Καθηγήτρια ΕΜΠ Τηλ 210 - 772 2484

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


Παρουσίαση με θέμα: "Αντικειμενοστραφής Προγραμματισμός & JAVA Θ. Βαρβαρίγου Καθηγήτρια ΕΜΠ Τηλ 210 - 772 2484"— Μεταγράφημα παρουσίασης:

1 Αντικειμενοστραφής Προγραμματισμός & JAVA Θ. Βαρβαρίγου Καθηγήτρια ΕΜΠ Τηλ

2 9/3/2009Δικτυακός Προγραμματισμός2 Προγραμματισμός Πρόγραμμα (Turing,1936) –Είσοδος –Επεξεργασία –Έξοδος Προγραμματισμός –Περιγραφή της επεξεργασίας δεδομένων –Διαχείριση των δεδομένων στη μνήμη Γλώσσες προγραμματισμού –Τυπική (formal) περιγραφή δεδομένων και λειτουργιών –Μοντέλο αντιμετώπισης των εννοιών που πραγματεύονται τα προγράμματα Object Oriented Programming –Τα πάντα αντιμετωπίζονται ως «αντικείμενα» (objects) –Τα αντικείμενα είναι τύποι δεδομένων που δεν ορίζονται από τη γλώσσα, αλλά που η γλώσσα επιτρέπει την περιγραφή τους.

3 9/3/2009Δικτυακός Προγραμματισμός3 Βασικοί Τύποι / Τελεστές Βασικοί τύποι –Έχουν ένα σύνολο τελεστών που υποστηρίζεται από τη γλώσσα. Τελεστές (operators) –Αναθέσεις –Απλές μαθηματικές εκφράσεις –Απλές εκφράσεις σχετικές με τη δομή της γλώσσας –Υπάρχει προτεραιότητα, που (συνήθως) μπορεί να αλλάξει με χρήση παρενθέσεων. Οι γλώσσες με αυστηρό έλεγχο τύπων απαιτούν ακριβείς χρήσεις τους ακόμα και για τους βασικούς τύπους –Η Java είναι τέτοια γλώσσα. Java Built-in types –boolean –byte, char, short, int, long –float, double –Void Βασικοί Τελεστές =Simple assignment operator + Additive operator (also used for String concatenation) - Subtraction operator *Multiplication operator / Division operator %Remainder operator Unary Τελεστές ++ Increment operator; increments a value by 1 -- Decrement operator; decrements a value by 1 ! Logical compliment operator; inverts the value of a boolean Equality και Relational Τελεστές ==Equal to !=Not equal to >Greater than >=Greater than or equal to

4 9/3/2009Δικτυακός Προγραμματισμός4 Συναρτήσεις (1) Σημαντικό: η Java δεν υποστηρίζει συναρτήσεις –μόνο methods –Είσοδος: ορίσματα –Επεξεργασία: σώμα –Έξοδος: τιμή επιστροφής Για καμία: void ! Pass by reference –Το όρισμα δεν δίδεται το ίδιο, αλλά μια αναφορά σε αυτό. –Οι αλλαγές στην αναφορά δεν επηρεάζουν το αρχικό όρισμα που δόθηκε. /* Αυτή είναι μια συνάρτηση. int sum_i ( int a, int b ) { // body return a + b; } float sum_f ( int a, int b ) { a++; b -= 2; return (float) sum_i( a, b ); }

5 9/3/2009Δικτυακός Προγραμματισμός5 Συναρτήσεις (2) Υπογραφή συνάρτησης (signature): –όνομα και σειρά ορισμάτων –τα ορίσματα στην υπογραφή εμφανίζονται με τους τύπους τους Overloading συναρτήσεων –Η ύπαρξη 2+ συναρτήσεων με ίδιο όνομα, αλλά διαφορετικό signature. H ύπαρξη συναρτήσεων με ίδιο signature και διαφορετικό return type είναι λάθος σε ΟΛΕΣ τις γλώσσες. –Γιατί; int sum ( int a, int b ) { // body return a + b; } // Signature: sum(int, int) float sum ( int a, int b ) { return (float) a / b; } // Signature: sum ( int, int ) double sum ( double a, boolean b ) { return b ? a : -a; } // Signature: sum (double, boolean) Υπάρχουν λάθη στη δήλωση αυτών των συναρτήσεων;

6 9/3/2009Δικτυακός Προγραμματισμός6 Δομώντας Υπο-Προγράμματα Η δόμηση προγραμμάτων απαιτεί: –Δήλωση μεταβλητών –Εφαρμογή λειτουργιών στα δεδομένα Τελεστές της γλώσσας Κλήση υπο-προγραμμάτων –Διαχείριση ροής Εκτέλεση (ή μη) εργασιών ανάλογα με τις τιμές των δεδομένων. Βασικές δομές ελέγχου ροής –Διακλάδωση if … else switch –Βρόγχοι Είδη: for, while, do … while /* ο κώδικας εμφανίζεται πάντα εντός υπο- προγραμμάτων. */ void foo( void ) { // Δήλωση μεταβλητών int a = 3; float c = 33.4f; double bb = 2.5; bb = c + a; bb += sum( bb, bb ); // Java: οι μεταβλητές δηλώνονται // όποτε είναι επιθυμητό. boolean flag = false; if ( flag ) a = 5;// δεν εκτελείται ποτέ else flag = true; // εκτελείται πάντα switch( a ) { case 0: c = 111; // Πήγαινε μετά το switch{} break; case 1: c = 2222; // Χωρίς break ! case 3: c = 333; break; default: c = 444; break; }

7 9/3/2009Δικτυακός Προγραμματισμός7 If ( number % 2 == 1 ) System.out.println( “περριτός” ); If ( errors > 10 ) abort(); else carry_on(); Διακλαδώσεις if…else –Δεν υπάρχει then! switch –Έλεγχος έναντι πολλών πιθανών τιμών. –Αντικαθιστά «πολλά» if…else –Περιορισμοί στον τύπο ελέγχου Int –Προσοχή στην εκτέλεση των blocks! Είναι ευθύνη του προγραμματιστή να τερματίσει ένα block! –break if ( ) if ( ) else switch ( ) { case : default : } switch ( a ) { case 0 : c = 111; // Πήγαινε μετά το switch{} break; case 1 : c = 2222; // Χωρίς break ! case 3 : c = 333; break; default : c = 444; break; } If ( a == 0 ) c = 111; else if ( a == 1 || a == 3 ) c = 333; else c = 444;

8 9/3/2009Δικτυακός Προγραμματισμός8 Βρόγχοι Τα τμήματα ενός γενικού βρόγχου είναι: –Initializer, guard, post, body Επιπλέον εντολές βρόγχων –η χρήση τους επιτρέπεται μόνο στο body. –break: τερματισμός λειτουργίας του βρόγχου. –continue: διακοπή της εκτέλεσης του body και συνέχεια του βρόγχου /* Οι βρόγχοι στη Java: for ( initializer ; guard ; post ) body while ( guard ) body do body while ( guard ) Σημείωση: στο do…while, το body, είναι και body και initializer */ int b = 1, a = 1; do { b *= a; } while ( ++a < 10 ); int b = 1, a = 1; while ( a < 10 ) { b *= a; ++a; } int b = 1; for ( int a = 1 ; a < 10 ; ++a ) b *= a;

9 9/3/2009Δικτυακός Προγραμματισμός9 Αντικείμενα – Objects (1) Τα πάντα είναι ένα αντικείμενο (σχεδόν!) –οτιδήποτε με το οποίο μπορούμε να αλληλεπιδράσουμε Τα αντικείμενα είναι αναγνωρίσιμα από μια σειρά χαρακτηριστικών που διαθέτουν. –Μπορούμε να τα ομαδοποιήσουμε ανάλογα με κάποια από αυτά, ή και να τα ιεραρχήσουμε. –Τα χαρακτηριστικά ενός αντικείμενου είναι Ιδιότητες Λειτουργίες

10 9/3/2009Δικτυακός Προγραμματισμός10 Αντικείμενα – Objects (2) Κατηγορίες Αντικειμένων - Classes –Λέξεις που παραπέμπουν σε οικογένειες ομοειδών πραγμάτων. –Περιγραφές ιδιοτήτων και λειτουργιών. Αντικείμενα - Instances –Συγκεκριμένα αντικείμενα μιας κατηγορίας. –Έχουν τιμές στις ιδιότητες τους. –Μπορούν να εκτελέσουν τις λειτουργίες τους. Classes & Instances; Τελικά τι είναι Object; –Ο όρος Object (αντικείμενο) χρησιμοποιείται και για τα δύο κατά περίπτωση. –Συνήθως είναι σαφές τι εννοούμε, αλλά για ακρίβεια οι λέξεις class και instance είναι ενδεδειγμένες.

11 9/3/2009Δικτυακός Προγραμματισμός11 Αντικείμενα – Objects (3) Τα αντικείμενα: –Δημιουργούνται: όταν δεσμεύεται μνήμη προς χρήση τους. Το αποτέλεσμα της ύπαρξης ενός νέου instance. –Καταστρέφονται: όταν παύουν να είναι χρήσιμα στο υπόλοιπο πρόγραμμα. Το Instance παύει να υπάρχει και η μνήμη είναι ελεύθερη προς νέα χρήση. –Προσπελαύνονται: Κάθε φορά που ο υπόλοιπος κώδικας διαβάζει ή / και γράφει στη μνήμη που είναι δεσμευμένη για το αντικείμενο. Κάθε φορά που ο κώδικας καλεί μια μέθοδό τους. Μνήμη & Java: –H Java δεν επιτρέπει την καταστροφή αντικειμένων από τον κώδικα – όχι άμεσα. –Η καταστροφή είναι αυτόματη. Καλύτερα ή χειρότερα; –Απλώς διαφορετικά! –Πάντα χρειάζεται προσοχή, όπως με όλα στον προγραμματισμό. // δημιουργία αντικειμένου. MyObject o = new MyObject(); // νέα δημιουργία αντικειμένου. // τι συμβαίνει στο παλαιό; o = new MyObject(); o = null; // 2 προσπελάσεις: με τον operator ‘.’ // ο ‘.’ ονομάζεται member-of operator o. var = o. foo();

12 9/3/2009Δικτυακός Προγραμματισμός12 Αντικείμενα – Objects (4) Πώς μοιάζει η δήλωση αντικειμένων; –Ιδιότητες: Member Variables –Λειτουργίες: Member Methods (ή απλά Methods) Μοιάζουν με συναρτήσεις. –Αλλάζει από γλώσσα σε γλώσσα. Η θεωρία περιλαμβάνει πολλά σύνθετα στοιχεία για τα αντικείμενα –Η δήλωση μπορεί να γίνει ιδιαίτερα πολύπλοκη. Στοιχεία ΟΟP –Encapsulation –Inheritance –Abstraction –Polymorphism –Και πολλά άλλα που παρέχει η Java και άλλες γλώσσες. // To απλούστερο Java αντικείμενο class MyObject { } // κι ένα ποιο σύνθετο... class AnotherObject { /// members int prop_1; // methods void set(int i) { prop_1 = i; } int get() { return prop_1; } /// …. float prop_2 =.3; }

13 9/3/2009Δικτυακός Προγραμματισμός13 Βασική χρήση Αντικειμένων Οι τύποι αντικειμένων μαζί ονομάζονται reference types. –Μια μεταβλητή μπορεί να είναι είτε builtin-type, είτε reference-type variable. –Κάθε reference-type variable μπορεί να πάρει την τιμή null. Έχει τιμή. Απλά δεν αναφέρεται σε κάποιο αντικείμενο. Έχοντας μια reference-type variable υπάρχει πρόσβαση στα μέλη της –Η πρόσβαση ελέγχεται από κάθε class, κατά τη δήλωση. Visibility – περισσότερα σε λίγο. –Η πρόσβαση γίνεται με τον operator member-of. Ο operator είναι μια τελεία:. –a. b = c. d. e(); Pass by reference –Ισχύει ο κανόνας ότι η συνάρτηση δεν είναι δυνατόν να πειράξει το ίδιο το reference. –Μπορεί όμως να έχει πρόσβαση σε μέλη (ιδιότητες και μεθόδους), άρα να υπάρξει έτσι κάποια αλλαγή στα μέλη αυτά. –Για τα builtin-types έχουμε pass by value. class MyObject { int number; } void foo( MyObject obj ) { obj.number = 12; obj = new MyObject(); obj.number = 10; } void test_foo() { MyObject myObj = new MyObject(); foo( myObj ); int n = myObj.number; } Ποια είναι η τιμή της n ;

14 9/3/2009Δικτυακός Προγραμματισμός14 Object Oriented Programming: Encapsulation (1) Encapsulation (ενθυλάκωση) –Κάθε τύπος (class) έχει τα δικά του δεδομένα των οποίων γνωρίζει τη χρήση και σημασία. –Κάθε class παρέχει methods που αλλάζουν ή / και χρησιμοποιούν τα δεδομένα της. Η ενθυλάκωση χρησιμοποιείται για να απομονωθούν τα τμήματα του προγράμματος. –Διαχωρίζεται το «πότε» από το «πως». –Η διαχείριση συγκεκριμένου είδος πληροφοριών οργανώνεται σε μια μονάδα προγραμματισμού (class). –Άρα, με σωστή χρήση, η απομόνωση προσφέρει καλύτερο έλεγχο. –Επεκτασιμότητα Θα φανεί αργότερα σε συνδυασμό με τα άλλα στοιχεία του OOP. // Ενθυλάκωση: η «κακή» χρήση  class Line { float x0, y0; float x1, y1; } class LineUser { float totalLength = 0; void addLengthOf(Line line) { float dx = line.x0 – line.x1; float dy = line.y0 – line.y1; totalLength += Math.sqrt( dx*dx + dy*dy ); } // Ενθυλάκωση: η «καλή» χρήση class Line { float x0, y0; float x1, y1; float length() { float dx = x0 – x1; float dy = y0 – y1; return Math.sqrt( dx*dx + dy*dy ); } class LineUser { float totalLength = 0; void countLength(Line line) { totalLength += line.length(); }

15 9/3/2009Δικτυακός Προγραμματισμός15 Object Oriented Programming: Encapsulation (2) Το encapsulation δίνει τη δυνατότητα απομόνωσης δεδομένων και λειτουργιών. –Ένα σημείο (class) του κώδικα ασχολείται με μια συγκεκριμένη λειτουργία (και ο υπόλοιπος κώδικας γνωρίζει αυτό το class)... –... αντί να είναι χωρισμένη μια λειτουργία σε διάφορα σημεία (ανάλογα με τη ροή του προγράμματος). Οι διορθώσεις λαθών και οι αλλαγές στους αλγόριθμους γίνονται σε συγκεκριμένα σημεία –Ο κώδικας είναι περισσότερο ευανάγνωστος. –Ο κώδικας που αφορα στη διαχείριση συγκεκριμένων δεδομένων, είναι μαζεμένος στο ίδιο τμήμα του κώδικα. Δεν επαναλαμβάνονται ίδια ή όμοια τμήματα κώδικα. –Μεταφέρουμε αντικείμενα έναντι πολλών (και διαφορετικών) δεδομένων. Δεν υπάρχει ανάγκη μεταφοράς μεγάλου όγκου δεδομένων, μιας και αυτά είναι μέσα σε ένα αντικείμενο.

16 9/3/2009Δικτυακός Προγραμματισμός16 Object Oriented Programming: Encapsulation (3) Οι αντικειμενοστραφείς γλώσσες προγραμματισμού δίνουν τη δυνατότητα στον προγραμματιστή να ορίσει για κάθε class member, ποια άλλα classes έχουν πρόσβαση σε αυτά. Ο μηχανισμός ελέγχου ονομάζεται visibility –Γίνεται με χρήση συγκεκριμένων λέξεων κλειδιά στη δήλωση των members –O ορισμός γίνεται αντιμετωπίζοντας τα classes του κώδικα ως μέλη κάποιων ομάδων: Όλα τα class Όλα τα subclass Όλα τα class που ανήκουν στην ίδια λογική ενότητα με το τρέχον class. –Στη Java, οι ενότητες αυτές ονομάζονται packages – περισσότερα παρακάτω. Το ίδιο το class και κανείς άλλος. –Οι λέξεις κλειδιά στη Java είναι: public : Όλα τα class protected : Όλα τα subclass & όλα τα class στο ίδιο package. private : Το ίδιο το class και κανείς άλλος. –H απουσία λέξης κλειδιού στη Java, έχει ιδιαίτερο νόημα: Visibility σε όλα τα class στο ίδιο package. Ονομάζεται default visibility.

17 9/3/2009Δικτυακός Προγραμματισμός17 Object Oriented Programming: Inheritance (1) Ένα class μπορεί να «επεκτείνει» ένα άλλο –Ιδιότητες και λειτουργίες μπορούν να προστεθούν. Το νέο class είναι το πλουσιότερο! –Το παλαιό δεν άλλαξε καθόλου, ούτε κι ο κώδικας που το χρησιμοποιεί! –Το νέο class μπορεί να χρησιμοποιηθεί όπου και το παλαιό. Απλώς άλλαξε συμπεριφορά // Παράδειγμα Inheritance class Line { float x0, y0; float x1, y1; float length() { float dx = x0 – x1; float dy = y0 – y1; return Math.sqrt( dx*dx + dy*dy ); } class Line3D extends Line { float z0, z1; float length() { float dz = z0 – z1; float dxy = super.length() * super.length(); return Math.sqrt( dxy + dz*dz ); } LineUser u = new LineUser(); Line l1 = new Line(); Line3D l2 = new Line3D(); Line l3 = new Line3D(); u.addLengthOf( l1 ); u.addLengthOf( l2 ); u.addLengthOf( l3 ); Line.length()

18 9/3/2009Δικτυακός Προγραμματισμός18 Object Oriented Programming: Inheritance (2) Όταν το class A κάνει inherit το class B, λέμε ότι το A είναι τύπου B. –Άρα υπάρχει η δυνατότητα να χρησιμοποιηθεί κάθε instance του A εκεί όπου αναμένονται instances του B. Αυτό είναι μια ιδιαίτερη περίπτωση casting (αλλαγής τύπου) που ονομάζεται up-casting –up: επειδή «ανεβαίνει» το δέντρο ιεραρχίας προς τη ρίζα. –Η Java κάνει αυτόματο up-casting, χωρίς να χρειάζεται ο προγραμματιστής να ασχοληθεί. Η περίπτωση να χρησιμοποιηθεί ένα instance του B (super-class) εκεί όπου αναμένεται ένα instance του A (sub-class), είναι η αντίστροφη διαδικασία –Ονομάζεται down-casting –H Java απαγορεύει το down-casting και δεν μπορεί αυτό να ξεπεραστεί (αντίθετα με άλλες γλώσσες, πχ C++) ΚΑΛΩΣ: τα sub-classes γενικά έχουν «περισσότερα» από τα super- classes, άρα η χρήση του sub-class στη θέση του super-class είναι γενικά προβληματική.

19 9/3/2009Δικτυακός Προγραμματισμός19 Object Oriented Programming: Inheritance (3) Πρόσβαση στους «γονείς» –Tα members των super-classes είναι γενικά προσβάσιμα από τα sub-classes. Αρκεί να είναι visible! Μεταβλητές και μέθοδοι με ίδια ονόματα. –Όταν σε ένα sub-class δηλώνεται ένα field με ίδιο όνομα με visible field του super-class, το ονόμα αναφέρεται στη μεταβλητή που είναι στο sub-class. –Όμως ένα sub-class εξακολουθεί να μπορεί να καλέσει μέθοδο ή / και να προσπελάσει μεταβλητή του super-class Με τη λέξη κλειδί: super // Παράδειγμα Inheritance class Line { float x0, y0; float x1, y1; float length() { float dx = x0 – x1; float dy = y0 – y1; return Math.sqrt( dx*dx + dy*dy ); } class Line3D extends Line { float z0, z1; float length() { float dz = z0 – z1; float dxy = super.length() * super.length(); return Math.sqrt( dxy + dz*dz ); } Line.length()

20 9/3/2009Δικτυακός Προγραμματισμός20 Object Oriented Programming: Abstraction (1) Ο καλύτερος τρόπος σκέψης όταν υλοποιείται ένα class: –Να μη γνωρίζεις πως, πότε και (κυρίως) από που αυτό θα χρησιμοποιηθεί. Η αφαίρεση δίνει τη δυνατότητα να περιγράφονται οι τύποι μερικώς –Η περιγραφή περιορίζεται σε αυτά που χρειάζεται να γνωρίζει ο κώδικας που γράφουμε. Η αφαίρεση έχει νόημα μόνο σε δένδρα ιεραρχίας. –Κοντά στη ρίζα του δένδρου (ποιο γενικός τύπος) ορίζονται κοινά πρότυπα συμπεριφορών, αλλά όχι οι ίδιες οι συμπεριφορές. Οι classes που δεν είναι abstract ονομάζονται concrete. Κάθε class που δεν είναι abstract πρέπει να υλοποιεί όλα τα inherited abstract methods. abstract class Shape { Point center; Point getCenter() { return center; } abstract float area(); } Shape Rectangle Cycle Polygon

21 9/3/2009Δικτυακός Προγραμματισμός21 Object Oriented Programming: Abstraction (2) public abstract class Shape { protected Point center; public Point getCenter() { return center; } public abstract float area(); } public class Rectangle extends Shape { private Point upleft; public float area() { float dx = upleft.x – center.x; float dy = upleft.y – center.y; return 2*dx * 2*dy; } } public class Circle extends Shape { private float radius; public float area() { return Math.PI * radius * radius; } } Θέλουμε τα sub-class να «βλέπουν» το center. Ποιοι άλλοι το «βλέπουν»;

22 9/3/2009Δικτυακός Προγραμματισμός22 Object Oriented Programming: Abstraction (3) Γιατί να δηλώνεται αόριστος (abstract) κώδικας; –Επεκτασιμότητα: Δήλωση αλγορίθμου που δεν γνωρίζει το ακριβές είδος των δεδομένων που χρειάζεται, αλλά το τι απαιτείται από αυτά. –Ο αλγόριθμος sort() χρησιμοποιεί αντικείμενα Comparable – όχι integers!!! –API για επικοινωνία ομάδας προγραμματιστών: API: Application Programming Interface Η συμφωνία σε συγκεκριμένα πρότυπα (API) διαχωρίζει το υπό ανάπτυξη σύστημα σε τμήματα που μπορούν να αναπτυχθούν ανεξάρτητα. –Δομή προγραμμάτων & Inheritance: Γίνεται καλύτερη εκμετάλλευση της δομής ιεραρχίας, έχοντας τον κώδικα σε μέρη όπου ταιριάζει περισσότερο. Γενικά το abstraction είναι ο μηχανισμός που επιτρέπει την πλήρη εκμετάλλευση του Inheritance και του Encapsulation μαζί

23 9/3/2009Δικτυακός Προγραμματισμός23 Object Oriented Programming: Polymorphism Προγραμματίστε το μια φορά, χρησιμοποιείστε το για τα πάντα Ο πολυμορφισμός είναι ένας συνδυασμός ιδιοτήτων –Η ιδιότητα των αντικειμένων να επαναπροσδιορίζουν τη συμπεριφορά τους. –Η ιδιότητα του κώδικα να χρησιμοποιεί την «κατάλληλη» συμπεριφορά ανά περίπτωση. Method Overriding: –O επαναπροσδιορισμός συμπεριφοράς μιας μεθόδου –H παλαιά και η νέα μέθοδος πρέπει να έχουν ακριβώς το ίδιο signature. Το μεγαλύτερο πλεονέκτημα του πολυμορφισμού –Το φροντίζει η γλώσσα να δουλεύει, όχι ο προγραμματιστής! Άρα το εμπιστευόμαστε, ως ιδιότητα ελεύθερη λαθών. LineUser u = new LineUser(); Line l1 = new Line(); Line3D l2 = new Line3D(); Line l3 = new Line3D(); u.addLengthOf( l1 ); u.addLengthOf( l2 ); u.addLengthOf( l3 ); class Line { float length() {..... } class Line3D extends Line { float length() { } class LineUser { float totalLength = 0; void (Line line) { totalLength += line.length(); } Line.length() Line3D.length() Method overriding

24 9/3/2009Δικτυακός Προγραμματισμός24 Java & Object Oriented Programming Ιδιαίτερα στοιχεία της Java –Single class inheritance Σχηματίζεται ένα δέντρο «ιεραρχίας» Στη ρίζα του δέντρου είναι το java.lang.Object –Interfaces Είναι τμήμα της γλώσσας Multiple interface inheritance Overriding & Overloading –Διαφορετικοί μηχανισμοί για διαφορετικό σκοπό –Γενικά: Overloading: επαναχρησιμοποίηση ονομάτων με άλλα ορίσματα Overriding: χρήση πολυμορφισμού, επαναπροσδιορισμός συμπεριφοράς Ορολογία: –Η υλοποίηση ενός abstract method ΔΕΝ είναι overriding! interface Iface { void foo(); void bar(); } interface Empty { } abstract class Base { void foo() { … } abstract void foobar(); } class Concrete extends Base implements Iface, Empty { void bar() { … } void foobar() { … } void foo(int a) { … } void foo() { … } } Overriding Overloading Marker Interface

25 9/3/2009Δικτυακός Προγραμματισμός25 Όλα μαζί! Η δημιουργία ενός προγράμματος έχει κυρίως να κάνει με την εύρεση των αντικειμένων που το απαρτίζουν Τα αντικείμενα έχουν ιδιότητες και λειτουργίες –Encapsulation & Visibility Πολλά αντικείμενα έχουν κοινές ιδιότητες και λειτουργίες –Inheritance Αλλά για κάποια οι ίδιες οι λειτουργίες διαφέρουν στην υλοποίηση –Abstraction (στο common super-class) Φαίνεται τα αντικείμενα να ανήκουν σε άνω του ενός δένδρα ιεραρχίας –Interfaces αντί για abstract classes –Multiple interface inheritance Ο αλγόριθμος που εκτελείται εξαρτάται από το τρέχον context και διαφέρει ανά περίπτωση –Polymorphism –πχ. Κάνοντας ένα class Comparable, μπορούμε να χρησιμοποιήσουμε τις έτοιμες υλοποιήσεις για ταξινομήσεις. Το Comparable είναι interface και βρίσκεται στο package ‘java.util’. Γενικά η δομή του κώδικα εξαρτάται από τα δεδομένα που χειρίζεται και τις λειτουργίες που εκτελεί. –Οπότε πρέπει να δημιουργούνται αντίστοιχοι τύποι που παρέχουν ακριβώς όσα χρειάζονται

26 9/3/2009Δικτυακός Προγραμματισμός26 Java Code Layout Η Java έχει κανόνες σχετικά με την οργάνωση του κώδικα σε αρχεία. Κάθε public class πρέπει να δηλώνεται σε ένα αρχείο με το όνομα του class και με κατάληξη ‘.java’. –Το κάθε αρχείο με κώδικα ονομάζεται compilation unit. Κάθε directory που έχει αρχεία java λέγεται package. Το directory στο οποίο ξεκινά ο java compiler είναι το default package. Tα packages ορίζουν λογικές ενότητες στον κώδικα και έχουν μέγιστη σημασία στο visibility. –Εντός ενός package έχει ισχύ το default visibility. –Μόνο τα public classes μπορούν να χρησιμοποιηθούν εκτός του package. Κάθε αρχείο ξεκινά δηλώνοντας το package στο οποίο ανήκει. –Εκτός από όσα βρίσκονται στο default. Κάθε αρχείο java μπορεί να έχει το πολύ ένα public class. package pckg1; public class MyClass { public static void main(String[ ] args) { System.out.println( “Hello world!” ); }

27 9/3/2009Δικτυακός Προγραμματισμός27 Scope (1) Το scope δηλώσεων τύπων (class), μεταβλητών και μεθόδων αφορά τα τμήματα ενός «προγράμματος» που μπορούν να προσπελαστούν κάνοντας χρήση του ονόματος τους. Το scope ενός τμήματος κώδικα είναι όλοι οι τύποι, data, και methods που αυτό το τμήμα «βλέπει». Το scope είναι ιεραρχικό. –Οτιδήποτε visible «παραπάνω» είναι visible «παρακάτω» –Hiding: δήλωση με όνομα που βρίσκεται εν χρήση. Compilation UnitClassCurrent Block package test; import javax.swing.JFrame; public class Test extends JFrame { private String title= "My Frame"; public static void main(String[] args) { Test test = new Test(); test.setTitle( test.title ); test.setVisible( true ); } class Foo // όχι public, default. { … }

28 9/3/2009Δικτυακός Προγραμματισμός28 Scope (2) Γενικά το Scope είναι άμεσα συνδεδεμένο με την έννοια του block. –Block είναι το τμήμα κώδικα που βρίσκεται μεταξύ { και }. –Κάθε block ορίζει το δικό του scope Είναι το ίδιο με το πατρικό Μπορεί να έχει επιπλέον δεδομένα –Αλλά αυτά δεν υφίστανται όταν η εκτέλεση βγει εκτός του block. Μπορεί να κάνει hide δεδομένα του πατρικου scope. –Τα blocks δεν είναι όλα του ίδιου τύπου. Block είναι το body ενός method Block είναι και το body ενός class Compilation Unit –Είναι κάθε Java αρχείο και αποτελεί scope για τον περιεχόμενο κώδικα στο ίδιο το αρχείο. –Το compilation unit scope εμπλουτίζεται με τη χρήση των import statements. Class import: κάνει visible ένα class από ένα συγκεκριμένο package. To class μπορεί να αναφέρεται με όνομά του, χωρίς προσδιορισμό του package στο οποίο ανήκει. Package import: κάνει visible όλα τα classes από ένα συγκεκριμένο package. Ότι είναι στο package java.lang είναι πάντα in-scope –Χωρίς να απαιτείται import. import some.package.ClassName; import some.other.package.*;

29 9/3/2009Δικτυακός Προγραμματισμός29 Άλλα στοιχεία της Java this, super this –Μπορεί να χρησιμοποιηθεί σε κάθε instance method και σε κάθε constructor (βλέπε παρακάτω). –Είναι του τύπου στον οποίο μέσα χρησιμοποιείται. –Αναφέρεται στο running instance του class. Έχουμε πρόσβαση σε όλα τα δεδομένα του instance και του class. super –Όμοια με το this –Αναφέρεται στο super-class. Αν έχει κάποιο δηλωθεί (με χρήση extends) Αλλιώς το java.lang.Object class Foo { int value = 0; void setValue( int value ) { this.value = value; } }

30 9/3/2009Δικτυακός Προγραμματισμός30 Άλλα στοιχεία της Java static Το static χρησιμοποιείται όταν θέλουμε να προσδώσουμε σε ένα class στοιχεία ενός instance. Με τη χρήση του δηλώνεται ένα member ως member του τύπου, κι όχι του κάθε instance. –Tα member fields έχουν την ίδια τιμή για όλα τα instances –Όλα τα static members (fields & methods) είναι accessible από τον τύπο – χωρίς να απαιτούν κάποιο instance. Τίποτα δεν μπορεί να είναι ταυτόχρονα static και abstract! class Foo { static int a = 3; int b = 12; static void foo() { ….. } } Foo bar = new Foo(); int c = Foo.a; c = foo.b; c = Foo.b;// WRONG  Foo.foo(); bar.foo(); // correct, but…

31 9/3/2009Δικτυακός Προγραμματισμός31 Άλλα στοιχεία της Java final final class –Δεν μπορεί να γίνει extend final field –Δεν μπορεί να αλλάξει τιμή (είναι σταθερά) final method –Δεν μπορεί να γίνει override –ΜΠΟΡΕΙ να γίνει Overload!!! final method parameter –Δεν μπορεί να γίνει ανάθεση σε αυτό το όρισμα μέσα στη μέθοδο. –ΜΠΟΡΕΙ να γίνει ανάθεση σε member του ορίσματος. class Foo { static final int a = 3; final int b = 12; static void foo() { b = 8;// WRONG  } int zero; void bar(int cc, final int bb) { for( ; cc < 10; ++cc ) zero += bb; bb = 8;// WRONG  }

32 9/3/2009Δικτυακός Προγραμματισμός32 Άλλα στοιχεία της Java Arrays Η Java υποστηρίζει πίνακες (arrays) από οποιοδήποτε τύπο (builtin, class ή arrays). Tα αντικείμενα αυτά είναι συγκεκριμένου μήκους το οποίο ορίζεται στη δημιουργία του αντικειμένου. –Έπειτα είναι accessible από το public final int length member του array instance που δημιουργήθηκε. Η προσπέλαση του κάθε element του array γίνεται με τον operator [ ]. –Χρησιμοποιείται zero-based index (offset). Τα arrays είναι final classes. –Άρα; class Foo { int value; } Foo[ ] foos = new Foo[ 3 ]; foos[0] = new Foo(); foos[1] = null; int c = foos.length; foos.length = 5; // WRONG , είναι final! int array[ ] = new int[ ] { 2, 3, 4, 5, 6 }; int i = 3; If ( array[i] == i + 2 ) { …. /// θα τρέξει αυτός ο κώδικας; }

33 9/3/2009Δικτυακός Προγραμματισμός33 Άλλα στοιχεία της Java Strings String είναι: –Αντικείμενο στο οποίο αποθηκεύεται μια ακολουθία χαρακτήρων. –Οι χαρακτήρες στη Java είναι UNICODE. –Η γλώσσα χειρίζεται με ιδιαίτερο τρόπο αυτά τα αντικείμενα – υπάρχει και ειδική σύνταξη για την εύκολη δηλωσή τους. –Μετά τη δημιουργία ενός string τα δεδομένα που περιέχει δεν αλλάζουν. String δεν είναι: –char[] String foo_0 = “foo”; String foo_1 = new String( “foo” ); String foo_2 = “foo” + foo_0 + foo_1; String f = “2” ( 3 * 4 ); // f == “2212” String f1 = 2 + (3*4) + “2”; // f == “142” Κάθε class έχει μια μεθοδο toString() Δηλώνεται στο Object και κάθε class μπορεί να το κάνει override. class Foo { } class Bar { public String toString() { return “hallo!”; } … Foo foo = new Foo(); Bar bar = new Bar(); String f = “foo:” + foo + “ bar:” + bar; // == “foo: bar:hallo!”

34 9/3/2009Δικτυακός Προγραμματισμός34 Ο κύκλος ζωής ενός Object Tα αντικείμενα έχουν όλα τον ίδιο κύκλο ζωής –Αν και αυτός έχει διαφορετική διάρκεια για το καθένα! Κατασκευή – Χρήση – Καταστροφή Κατασκευή –Γίνεται με τον operator new. Χρήση –Η χρήση του αντικειμένου είναι ευθύνη του κώδικα που το χρησιμοποιεί – όχι του ίδιου του αντικειμένου Όμως το τι περιλαμβάνει εξαρτάται άμεσα από τον τύπο. Καταστροφή –Δεν γίνεται άμεσα από τον κώδικα –ΟΜΩΣ ελέγχεται από τον κώδικα

35 9/3/2009Δικτυακός Προγραμματισμός35 Object Construction (1) Constructor είναι: –Κώδικας που εκτελείται κατά την κατασκευή ενός αντικειμένου (instance). –Καλείται από τον operator new, ή από άλλον constructor του ίδιου τύπου ή υπο-τύπου, αφού έχει γίνει η δέσμευση μνήμης και έχουν αρχικοποιηθεί όλα τα member fields. –Μπορεί να πάρει διάφορα ορίσματα, όπως και ένα method, καθώς και να γίνει overload (αλλάζοντας το signature). Constructor δεν είναι: –Method Default constructor: –Είναι εκείνος που δεν έχει parameters. –Αν δεν έχει δηλωθεί κανείς constructor, o compiler δηλώνει ένα default Δεν κάνει τίποτα Το visibility είναι αυτό του class. class Foo { int cnstrArgs; Foo(){ cnstrArgs = 0; } Foo(int a) { cnstrArgs = 1; } Foo(int a, int b) { cnstrArgs = 2; } Foo( double c ) { this( (int) c ); } class Bar extends Foo { Bar() { } Bar(int a) { } Bar(int a, int b) { super( a, b ); }

36 9/3/2009Δικτυακός Προγραμματισμός36 Object Construction (2) new 1.Δέσμευση μνήμης 2.Αρχικοποίηση member fields Για όσα δεν υπάρχει αρχική τιμή, μηδενίζεται η μνήμη: –Booleans: false –Numerical types: zero –Reference types (classes & arrays): null 3.Εκτέλεση instance initializers 4.Καλείται ο constructor Επιλογή βάσει τύπων παραμέτρων που δόθηκαν στον new operator. Class Loading –Πριν τη χρήση ενός class, αυτό γίνεται “load”. –H διαδικασία είναι: 1.Δέσμευση μνήμης 2.Αρχικοποίηση static member fields 3.Εκτέλεση static initializers class Foo { static final int CONSTANT = 18; int cnstrArgs = -18; { // initializer. cnstrArgs = 0; } Foo() { } Foo(int a) { cnstrArgs = 1; } Foo(int a, int b) { cnstrArgs = 2; } Foo( double c ) { this( (int) c ); } // correct: not-a-constructor! void Foo() { … } }

37 9/3/2009Δικτυακός Προγραμματισμός37 Object Construction (3) Blank finals –Τα members που έχουν δηλωθεί ως final, είτε: Έχουν αρχική τιμή που τους δίδεται στη δήλωση. Ή ονομάζονται blank final fields και κάθε constructor πρέπει να τους δώσει κάποια τιμή. class Foo { final int cnstrArgs = -18; Foo(int a) { cnstrArgs = 1; } Foo(int a, int b) { cnstrArgs = 2; } Foo( double c ) { this( (int) c ); cnstrArgs = 3; // WRONG!  } Γιατί;

38 9/3/2009Δικτυακός Προγραμματισμός38 Object Destruction (1) Πότε καταστρέφονται τα instances; –Όταν ο κώδικας δεν μπορεί να τα προσπελάσει με κανένα τρόπο. –Δεν υπάρχει κανένα reference-type variable που να περιέχει reference στο instance. H Java ονομάζει τα αντικείμενα αυτά unreachable. Object obj = new Object(); // δημιουργία! obj = new Object(); // το προηγούμενο είναι unreachable Object obj2 = obj; obj = new Object(); // το προηγούμενο παραμένει (στο obj2) obj = null;// το αντικείμενο από το τελευταίο new έγινε unreachable. int a = 3; a = 2;// τίποτα! Τα Builtin types δεν γίνονται ποτέ unreachable, // διότι δεν γίνονται ποτέ destroy!

39 9/3/2009Δικτυακός Προγραμματισμός39 Object Destruction (2) Τι συμβαίνει με ένα unreachable object; –Τα αντικείμενα αυτά προστίθενται σε εξειδικευμένες λίστες Κάτι σαν death-lists Αυτή η διαδικασία ονομάζεται garbage collection –Όταν κρίνεται σκόπιμο και αναγκαίο (δηλαδή όταν εξειδικευμένοι αλγόριθμοι το αποφασίσουν), τότε γίνεται free από τη μνήμη του προγράμματος Η ολοκλήρωση αυτής της διαδικασίας αυξάνει την ελεύθερη μνήμη του προγράμματος (κατά το μέγεθος των κατεστραμμένων αντικειμένων). Πως αντιλαμβάνεται ένα αντικείμενο την καταστροφή του; –Τα αντικείμενα έχουν μια μέθοδο που καλείται κατά την καταστροφή τους. protected void finalize() Δηλωμένη στο Object –Υπάρχει προκειμένου να δοθεί ο έλεγχος σε ένα instance πριν την καταστροφή του Μερικές φορές αυτό χρησιμοποιείται γιανα κάνει free όσα resources δεν γίνονται αυτόματα

40 9/3/2009Δικτυακός Προγραμματισμός40 Object Destruction (3) finalize() –Η μέθοδος είναι σαν οποιαδήποτε άλλη μέθοδο Μπορεί να κληθεί από οπουδήποτε στον κώδικα είναι visible (έχει αρχικά δηλωθεί protected). –Η κλήση της από τον κώδικα δεν συνεπάγεται την καταστροφή αντικειμένου!

41 9/3/2009Δικτυακός Προγραμματισμός41 THE Java Object Το java.lang.Object είναι στην κορυφή του class hierarchy. Έχει κάποιες μεθόδους για την υποστήριξη βασικών δομών και δυνατοτήτων της γλώσσας. –Object clone() Δημιουργία ενός deep-copy του αντικειμένου –boolean equals(Object), int hashCode() Έλεγχος ισότητας –void finalize() Καταστροφή αντικειμένου –String toString() Δημιουργία ενός String από το αντικείμενο –final Class getClass() Επιστρέφει την περιγραφή της δομής του αντικειμένου –final void notify() Ενεργοποιεί το πολύ ένα thread που αναμένει στο τρέχον monitor –final void notifyAll() Ενεργοποιεί όλα threads που αναμένει στο τρέχον monitor –final void wait() Αναμένει σε ένα monitor Monitors & Threads: Η Java έχει έννοιες αυτές τις έννοιες ως τμήμα της γλώσσας. Θα παρουσιαστούν σε επόμενο μάθημα. public class MyObject extends Object { public static void main(String[] args) { // Create a new instance of MyObject. MyObject obj = new MyObject(); // Get the Class associated with MyObject. Class myClass = obj.getClass(); // Print out the type of obj. System.out.println("obj is of type " + myClass.getName()); } /* Output: obj is of type MyObject */

42 9/3/2009Δικτυακός Προγραμματισμός42 Equality (-ies) Instance equality vs. Object equality –Ο διαχωρισμός έχει νόημα σε τιμές reference-type μεταβλητών. Instance equality –Ελέγχεται με τον operator == –Δύο μεταβλητές είναι instance equal όταν αναφέρονται στο ίδιο αντικείμενο στη μνήμη Δηλαδή, σε ένα αντικείμενο που δημιουργήθηκε απο μόνο μια κλήση στον operator new. Object equality –Με βάση το Java specification, δύο reference-type variables είναι object equal, όταν: Η μέθοδος equals() και για τα δύο instances με όρισμα το άλλο, επιστρέφει πάντα true. Η μέθοδος hashCode() των δύο μεθόδων επιστρέφει το ίδιο αποτέλεσμα. –Στην πράξη ελέγχουμε μόνο με μία κλήση στην equals() του ενός instance. –Όμως, η equals() πρέπει να γίνει Override για κάθε νέο αντικείμενο προκειμένου να δουλέψει... Διαφορετικά το default implementation (Object.equals) δεν ανταποκρίνεται στα παραπάνω. Πότε χρησιμοποιούμε το κάθε equality type; –Ανάλογα με το τι πρέπει να ελεγθεί –Παραδείγματα: Είναι δύο Strings ίδια; Είναι δύο int ίδιοι; Εχουν δύο objects τις ίδιες τιμές;

43 9/3/2009Δικτυακός Προγραμματισμός43 Exceptions Exceptions: ο μηχανισμός της Java για τη διαχείριση λαθών. Όταν συμβαίνει ένα λάθος στο πρόγραμμα η τρέχουσα μέθοδος κάνει throw ένα exception –Αλλάζει η ροή του προγράμματος. Τα μόνα αντικείμενα που μπορούν να γίνουν throw, είναι subclasses του Throwable. –Τα subclasses του Exception ονομάζονται checked exceptions. –Αλλά όχι τα subclasses του RuntimeException, που είναι subclass του Exception! void foo( String name ) throws IOException { if( name == null ) throw new NullPointerException(); this.source = new BufferedReader( new FileReader( name ) ); } java.lang.Throwable (implements java.io.Serializable)ThrowableSerializable –java.lang.ErrorError java.lang.AssertionErrorAssertionError java.lang.LinkageErrorLinkageError java.lang.ThreadDeathThreadDeath java.lang.VirtualMachineErrorVirtualMachineError –java.lang.InternalErrorInternalError –java.lang.OutOfMemoryErrorOutOfMemoryError –java.lang.StackOverflowErrorStackOverflowError –java.lang.UnknownErrorUnknownError –java.lang.ExceptionException java.lang.ClassNotFoundExceptionClassNotFoundException java.lang.RuntimeExceptionRuntimeException –java.lang.ArithmeticExceptionArithmeticException –java.lang.IndexOutOfBoundsExceptionIndexOutOfBoundsException –java.lang.NullPointerExceptionNullPointerException java.io.IOExceptionIOException –java.io.FileNotFoundFileNotFound –……

44 9/3/2009Δικτυακός Προγραμματισμός44 Μέθοδοι & Exceptions Οι μέθοδοι οφείλουν να δηλώνουν τα checked exceptions που κάνουν throw. –Ο Java Compiler κάνει αυστηρούς ελέγχους σχετικά με αυτές τις δηλώσεις. –Μπορούν να δηλώνονται και τα unchecked exceptions, αλλά δεν απαιτείται. Όμως σε πολλές περιπτώσεις κάνει ποιο καθαρό τον κώδικα. Η δήλωση των exceptions γίνεται στο throw list μιας μεθόδου. void foo( String name ) throws IOException, ElementNotFoundException { … }

45 9/3/2009Δικτυακός Προγραμματισμός45 Χειρισμός Exceptions (1) Για το χειρισμό των exceptions υπάρχει σύνταξη που επιτρέπει τη γραφή κώδικα σχεδιασμένου για κάθε είδος (type, class) ενός λάθους. Η λογική είναι ότι κάθε τμήμα κώδικα εκτελείται εντός ενός try-block Αν ένα exception γίνει throw, στο ποιο κοντινό try-block, δίνεται η ευκαιρία για χειρισμό –Αν το try-block κάνει throw το exception το ποιο υψηλό σε ιεραρχία try-block το χειρίζεται. –Όταν δεν υπάρχει κανένα try-block που να χειρίζεται το exception, τότε η ίδια η Java παρέχει ένα Το default exception handling όμως σταματά το πρόγραμμα. Υπάρχει ο μηχανισμός finally για να εκτελείται κώδικας είτε το try-block τρέξει μέχρι τέλους, είτε γίνει throw ένα exception. –Ακόμα κι αν δεν γίνει catch το exception στο ίδιο try-block. void foo( String name ) throws IOException {... }.... try { foo( “somefile.txt” ); } catch( NullPointerException x ) { x.printStackTrace(); } catch( IOException x ) { x.printStackTrace(); } finally { // εκτελείται σε κάθε περίπτωση. }

46 9/3/2009Δικτυακός Προγραμματισμός46 Χειρισμός Exceptions (2) catch-list –Όταν ένα exception γίνεται catch, τότε εκτελείται ο κώδικας του πρώτου catch block που «πιάνει» exceptions του τύπου που έχει γίνει throw. Μετά η ροή «πηδά» στο finally-block – αν υπάρχει. Αν δεν υπάρχει «πηδά» μετά το κλείσιμο του τελευταίου catch-block. –Μπορεί να γίνει throw ενός νέου exception (ή και του παλαιού) στο catch-block. H ροή ακολουθεί τους ίδιους κανόνες, αλλά το τρέχον try-block δεν έχει τη δυνατότητα να «πιάσει» αυτό το exception. H σειρά δήλωσης του catch list έχει σημασία –Πρέπει να ακολουθείται η ιεραρχία των class Μιας και με το κάθε catch block γίνεται έλεγχος για το type του exception, με τη σειρά που έχουν δηλωθεί τα catch blocks. Τα VirtualMachineError δεν μπορούν να γίνουν catch! –Το πρόγραμμα ποτέ δε μαθαίνει ότι συνέβησαν. void foo( String name ) throws IOException {... }.... try { foo( “somefile.txt” ); } catch( NullPointerException x ) { x.printStackTrace(); } catch( IOException x ) { x.printStackTrace(); throw x;// ξανα-throw !!! } finally { // εκτελείται σε κάθε περίπτωση. }

47 9/3/2009Δικτυακός Προγραμματισμός47 Χειρισμός Exceptions (3) finally –Μπορεί να υπάρχει το πολύ ένα. –Βρίσκεται πάντα μετά από όλα τα catch blocks. –ΔΕΝ απαιτείται να υπάρχουν catch blocks! –Εκτελείται πάντα! Δηλαδή: Όταν το try body εκτελεστεί πλήρως χωρίς να κάνει throw ένα exception. Όταν ένα catch body εκτελεστεί πλήρως χωρίς να κάνει throw ένα exception. Όταν γίνει throw ένα exception είτε από το try body είτε από ένα catch body που ανήκει στο ίδιο try block με αυτό του finally. Σημαντικό: αν στο finally γίνει throw ένα exception το παλαιό χάνεται –Ακολουθείτε η ίδια διαδικασία με οποιοδήποτε άλλο throw, αλλά... –... αν υπήρχε κάποιο exception που δεν είχε γίνει catch, αυτό χάνεται! Finally & return –To finally μπορεί να κάνει return από μια μέθοδο. –Αν είχε ήδη γίνει return (πχ, στο try) H νέα τιμή επιστροφής είναι αυτή που πραγματικά θα επιστραφεί. void foo( String name ) throws IOException {... }.... try { foo( “somefile.txt” ); } catch( NullPointerException x ) { x.printStackTrace(); } catch( IOException x ) { x.printStackTrace(); throw x;// ξανα-throw !!! } finally { // εκτελείται σε κάθε περίπτωση. }

48 9/3/2009Δικτυακός Προγραμματισμός48 Built-in Exceptions Υπάρχουν πάρα πολλά exceptions που μπορεί να εμφανιστούν κατά την εκτέλεση ενός απλού προγράμματος Java. Μερικά από τα ποιο βασικά είναι: –NullPointerException Unchecked error που γίνεται throw όταν γίνεται access ένα member ενός reference type variable που είναι null –ArithmeticException Unchecked error που γίνεται throw όταν ο κώδικας εκτελεί μια μαθηματική πράξη που δεν γίνεται (πχ, διαίρεση με το 0). –IndexOutOfBoundsException Unchecked error που γίνεται throw όταν ο κώδικας κάνει access ένα μέλος μιας ακολουθίας, αλλά το index που χρησιμοποιείται είναι εκτός εύρους –Μπορεί να εμφανιστεί στη χρήση των arrays και Strings (και πολλών άλλων). –ClassCastException Unchecked error που γίνεται throw όταν ο κώδικας κάνει κάποιο illegal-cast –ClassNotFoundException Εμφανίζεται όταν το πρόγραμμα δεν βρίσκει όλες τις βιβλιοθήκες που απαιτούνται για την εκτέλεσή του. –IOException CHECKED error. Είναι το super-class για όλα τα exceptions Που συνδέονται με λάθη εισόδου / εξόδου. –Πχ. FileNotFoundException

49 9/3/2009Δικτυακός Προγραμματισμός49 Exceptions & Debugging Πώς μοιάζει ένα exception; –Όλα έχουν μια μέθοδο: printStackTrace() –H κλήση της μεθόδου μοιάζει κάπως έτσι: –Αυτή η πληροφορία χρησιμοποιείται για να βρεθεί από που ακριβώς έγινε throw το exception και πως έφτασε ο κώδικας μέχρι εκεί.

50 9/3/2009Δικτυακός Προγραμματισμός50 Προγράμματα Java Σημείο έναρξης προγράμματος –main() –ΠΑΝΤΑ δηλωμένη με ακριβώς τον ίδιο τρόπο: public static void main(String[] args) Το throw list μπορεί να περιέχει ότι χρειάζεται. Μπορούμε να χρησιμοποιούμε static members & fields για βασικά Ι/Ο –Π.χ. System.out.println() public class Program { public static void main(String[ ] args) { System.out.println( “Hello world!” ); System.err.println( “Not an error :)” ); } public class Program { public static void main(String[ ] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader( System.in ) ); System.out.println( “Say something!” ); String something = input.readLine(); System.out.println( “You said:” + something ); }

51 9/3/2009Δικτυακός Προγραμματισμός51 Προγραμματίζοντας (1) Προαπαιτούμενα –J2SE JDK Java2, Standard Edition, Java development kit –To JRE δεν φτάνει! Java Runtime Environment Το JDK, όμως, περιέχει ένα JRE Compiler (JDK only): javac.exe –javac [options] [sourcefiles] –Δημιουργεί class αρχεία από java αρχεία. –Τα class αρχεία περιέχεουν Αναγκαίες πληροφορίες για τη δημιουργία των class του κώδικα Εντολές assembly για τα class. –Assembly: γλώσσα μηχανής –Java assembly: γλώσσα εικονικής μηχανής. Η εκτέλεση γίνεται από software που προσομοιώνει τη μηχανή. Java Virtual Machine (JDK & JRE): java.exe –java [options] class [arguments] –java [options] -jar file [arguments] –Είναι ο «προσομοιωτής» της εικονικής μηχανής. Διαβάζει τα class files, αγνoεί τα java files.

52 9/3/2009Δικτυακός Προγραμματισμός52 1.Εισαγωγή κώδικα στα αρχεία –Προσοχή στα ονόματα! 2.Compile –Το directory από το οποίο τρέχει ο compiler είναι αυτό που θεωρείται ως default package. 3.Run! Προγραμματίζοντας (2) public class Program { public static void main(String[ ] args) { System.out.println( “Hello world!” ); }

53 9/3/2009Δικτυακός Προγραμματισμός53 Java Virtual Machine JVM: είναι μια εικονική μηχανή. java.exe: ο προσομοιωτής –Τρέχει σε διαφορετικά λειτουργικά συστήματα, ακριβώς το ίδιο πρόγραμμα Χωρίς επιπλέον προγραμματισμό, ούτε re- compile! Για να τρέξει φορτώνει κάποιες standard libraries που θεωρούνται τμήμα της πλαταφόρμας –Η πλατφόρμα επεκτείνεται πολύ περα της γλώσσας, με πολλές δυνατότητες στο standard πακέτο.

54 9/3/2009Δικτυακός Προγραμματισμός54 Java Platform & Libraries (1) H πλατφόρμα Java περιλαμβάνει πολλές τεχνολογίες –Αυτές υποστηρίζονται από της βιβλιοθήκες που περιλαμβάνονται σε κάθε JRE Μερικά απαραίτητα στοιχεία, σχεδόν σε κάθε πρόγραμμκα –java.lang — basic language functionality and fundamental types –java.util — collection data structure classes –java.io — file operations –java.math — multiprecision arithmetics –java.net — networking operations, sockets, DNS lookups,... –java.sql — Java Database Connectivity (JDBC) to access databases –java.awt — basic hierarchy of packages for native GUI components –javax.swing — hierarchy of packages for platform-independent rich GUI components –java.applet — classes for creating and implementing applets

55 9/3/2009Δικτυακός Προγραμματισμός55 Java Platform & Libraries (2)

56 9/3/2009Δικτυακός Προγραμματισμός56 Java Platform & Libraries (3)

57 9/3/2009Δικτυακός Προγραμματισμός57 Documentation Πολλή πληροφορία και class; Ευτυχώς το πρόβλημα λύνεται με το documentation του κώδικα java: JavaDoc! Οι πληροφορίες που παρέχονται αφορούν σε: –Δομή των packages –Διαχωρισμός class, interfaces & exceptions ανά package. –Ανάλυση των μεθόδων και των μεταβλητών που έχουν τα class Αναφέροντια μόνον εκείνα που είναι visible στον κώδικα που τα χρησιμοποιεί. Σε μερικές περιπτώσεις υπάρχουν ακόμα και παραδείγματα χρήσης. Είναι μόνο στα αγγλικά Άλλη πηγή για πληροφορίες; –Google (aka: programmer’s best friend)! Πχ. java.util tutorial, java file example

58 9/3/2009Δικτυακός Προγραμματισμός58 Java Documentation: javadoc Java 6 API Packages Classes & Interfaces Package java.util docs Σημείωση: Πολλές σελίδες για packages έχουν ιδιαίτερα χρήσιμες πληροφορίες στο τέλος της σελίδας τους. Αυτές αφορούν στη φιλοσοφία σχεδίασης του package και αναφέρουν από που να ξεκινήσει κανείς για να πετύχει συγκεκριμένους στόχους.

59 9/3/2009Δικτυακός Προγραμματισμός59 Java Documentation: javadoc Class Hierarchy Implemented Interfaces –Και αυτά που κάνουν implement τα super-class Γενικές πληροφορίες για –Υλοποίηση –Χρήση Constructors & Methods Inherited Methods

60 9/3/2009Δικτυακός Προγραμματισμός60 Java Documentation: javadoc Για κάθε μέθοδο και constructor υπάρχουν –Προσδιορισμός visibility –Return type & signature –Αν ορίζονται από κάποιο class / interface Με τον προσδιορισμό ‘Specified by:’ –Παραμέτρους μία προς μία –Τη λίστα με τα exceptions που είναι δυνατόν να πεταχτούν από τη μέθοδο.

61 9/3/2009Δικτυακός Προγραμματισμός61 Και τώρα; To JavaDoc είναι φίλος μας! Human beings, who are almost unique in having the ability to learn from the experience of others, are also remarkable for their apparent disinclination to do so. –Douglas Adams, Last Chance to See Προγραμματίστε και πειραματιστήτε!

62 Ερωτήσεις 9/3/2009Δικτυακός Προγραμματισμός62


Κατέβασμα ppt "Αντικειμενοστραφής Προγραμματισμός & JAVA Θ. Βαρβαρίγου Καθηγήτρια ΕΜΠ Τηλ 210 - 772 2484"

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


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