Survey
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
Αντικειμενοστραφής Προγραμματισμός & JAVA Θ. Βαρβαρίγου Καθηγήτρια ΕΜΠ Τηλ 210 - 772 2484 email: [email protected] http://demo2.dbnet.ntua.gr Προγραμματισμός • Πρόγραμμα (Turing,1936) – Είσοδος – Επεξεργασία – Έξοδος • Προγραμματισμός – Περιγραφή της επεξεργασίας δεδομένων – Διαχείριση των δεδομένων στη μνήμη • Γλώσσες προγραμματισμού – Τυπική (formal) περιγραφή δεδομένων και λειτουργιών – Μοντέλο αντιμετώπισης των εννοιών που πραγματεύονται τα προγράμματα • Object Oriented Programming – Τα πάντα αντιμετωπίζονται ως «αντικείμενα» (objects) – Τα αντικείμενα είναι τύποι δεδομένων που δεν ορίζονται από τη γλώσσα, αλλά που η γλώσσα επιτρέπει την περιγραφή τους. 9/3/2009 Δικτυακός Προγραμματισμός 2 Βασικοί Τύποι / Τελεστές • Βασικοί τύποι • – Έχουν ένα σύνολο τελεστών που υποστηρίζεται από τη γλώσσα. • • – – – – • Τελεστές (operators) – Αναθέσεις – Απλές μαθηματικές εκφράσεις – Απλές εκφράσεις σχετικές με τη δομή της γλώσσας – Υπάρχει προτεραιότητα, που (συνήθως) μπορεί να αλλάξει με χρήση παρενθέσεων. Οι γλώσσες με αυστηρό έλεγχο τύπων απαιτούν ακριβείς χρήσεις τους ακόμα και για τους βασικούς τύπους – Η Java είναι τέτοια γλώσσα. • • • boolean byte, char, short, int, long float, double Void Βασικοί Τελεστές = Simple assignment operator + Additive operator (also used for String concatenation) Subtraction operator * Multiplication operator / % • 9/3/2009 Java Built-in types 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 < Less than <= Less than or equal to Conditional Τελεστές && Conditional-AND || Conditional-OR ?: Ternary (shorthand for if-then-else statement) Type Comparison Τελεστής instanceof Compares an object to a specified type Δικτυακός Προγραμματισμός 3 Συναρτήσεις (1) • Σημαντικό: η Java δεν υποστηρίζει συναρτήσεις – μόνο methods – Είσοδος: ορίσματα – Επεξεργασία: σώμα – Έξοδος: τιμή επιστροφής • Για καμία: void ! • Pass by reference – Το όρισμα δεν δίδεται το ίδιο, αλλά μια αναφορά σε αυτό. – Οι αλλαγές στην αναφορά δεν επηρεάζουν το αρχικό όρισμα που δόθηκε. 9/3/2009 /* Αυτή είναι μια συνάρτηση. 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 ); } Δικτυακός Προγραμματισμός 4 Συναρτήσεις (2) • Υπογραφή συνάρτησης (signature): – όνομα και σειρά ορισμάτων – τα ορίσματα στην υπογραφή εμφανίζονται με τους τύπους τους • Overloading συναρτήσεων – Η ύπαρξη 2+ συναρτήσεων με ίδιο όνομα, αλλά διαφορετικό signature. • H ύπαρξη συναρτήσεων με ίδιο signature και διαφορετικό return type είναι λάθος σε ΟΛΕΣ τις γλώσσες. – Γιατί; 9/3/2009 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) Δικτυακός Προγραμματισμός 5 Δομώντας Υπο-Προγράμματα • Η δόμηση προγραμμάτων απαιτεί: – – – • Δήλωση μεταβλητών Εφαρμογή λειτουργιών στα δεδομένα • Τελεστές της γλώσσας • Κλήση υπο-προγραμμάτων Διαχείριση ροής • Εκτέλεση (ή μη) εργασιών ανάλογα με τις τιμές των δεδομένων. Βασικές δομές ελέγχου ροής – – Διακλάδωση • if … else • switch Βρόγχοι • Είδη: for, while, do … while 9/3/2009 /* ο κώδικας εμφανίζεται πάντα εντός υποπρογραμμάτων. */ 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; } } 6 Διακλαδώσεις if ( <boolean-expression> ) <block> • if…else – Δεν υπάρχει then! • switch – Έλεγχος έναντι πολλών πιθανών τιμών. – Αντικαθιστά «πολλά» if…else – Περιορισμοί στον τύπο ελέγχου • Int – Προσοχή στην εκτέλεση των blocks! • Είναι ευθύνη του προγραμματιστή να τερματίσει ένα block! – break 9/3/2009 if ( <boolean-expression> ) <block> else <block> If ( number % 2 == 1 ) System.out.println( “περριτός” ); If ( errors > 10 ) abort(); else carry_on(); switch ( <integer-expression> ) { case <integer-constant> : <block> switch ( a ) default : { <block> case 0 : } c = 111; // Πήγαινε μετά το switch{} break; case 1 : c = 2222; // Χωρίς break ! case 3 : If ( a == 0 ) c = 333; c = 111; break; else if ( a == 1 || a == 3 ) default : c = 333; c = 444; else break; c = 444; } Δικτυακός Προγραμματισμός 7 Βρόγχοι • Τα τμήματα ενός γενικού βρόγχου είναι: /* Οι βρόγχοι στη Java: – Initializer, guard, post, body • Επιπλέον εντολές βρόγχων – η χρήση τους επιτρέπεται μόνο στο body. – break: τερματισμός λειτουργίας του βρόγχου. – continue: διακοπή της εκτέλεσης του body και συνέχεια του βρόγχου for ( initializer ; guard ; post ) body while ( guard ) body do body while ( guard ) Σημείωση: στο do…while, το body, είναι και body και initializer */ int b = 1; for ( int a = 1 ; a < 10 ; ++a ) b *= a; int b = 1, a = 1; while ( a < 10 ) { b *= a; ++a; } 9/3/2009 Δικτυακός Προγραμματισμός int b = 1, a = 1; do { b *= a; } while ( ++a < 10 ); 8 Αντικείμενα – Objects (1) • Τα πάντα είναι ένα αντικείμενο (σχεδόν!) – οτιδήποτε με το οποίο μπορούμε να αλληλεπιδράσουμε • Τα αντικείμενα είναι αναγνωρίσιμα από μια σειρά χαρακτηριστικών που διαθέτουν. – Μπορούμε να τα ομαδοποιήσουμε ανάλογα με κάποια από αυτά, ή και να τα ιεραρχήσουμε. – Τα χαρακτηριστικά ενός αντικείμενου είναι • Ιδιότητες • Λειτουργίες 9/3/2009 Δικτυακός Προγραμματισμός 9 Αντικείμενα – Objects (2) • Κατηγορίες Αντικειμένων - Classes – Λέξεις που παραπέμπουν σε οικογένειες ομοειδών πραγμάτων. – Περιγραφές ιδιοτήτων και λειτουργιών. • Αντικείμενα - Instances – Συγκεκριμένα αντικείμενα μιας κατηγορίας. – Έχουν τιμές στις ιδιότητες τους. – Μπορούν να εκτελέσουν τις λειτουργίες τους. • Classes & Instances; Τελικά τι είναι Object; – Ο όρος Object (αντικείμενο) χρησιμοποιείται και για τα δύο κατά περίπτωση. – Συνήθως είναι σαφές τι εννοούμε, αλλά για ακρίβεια οι λέξεις class και instance είναι ενδεδειγμένες. 9/3/2009 Δικτυακός Προγραμματισμός 10 Αντικείμενα – Objects (3) // δημιουργία αντικειμένου. MyObject o = new MyObject(); • Τα αντικείμενα: – Δημιουργούνται: // νέα δημιουργία αντικειμένου. // τι συμβαίνει στο παλαιό; o = new MyObject(); • όταν δεσμεύεται μνήμη προς χρήση τους. • Το αποτέλεσμα της ύπαρξης ενός νέου instance. o = null; – Καταστρέφονται: • όταν παύουν να είναι χρήσιμα στο υπόλοιπο πρόγραμμα. • Το Instance παύει να υπάρχει και η μνήμη είναι ελεύθερη προς νέα χρήση. // 2 προσπελάσεις: με τον operator ‘.’ // ο ‘.’ ονομάζεται member-of operator o . var = o . foo(); • – Προσπελαύνονται: • Κάθε φορά που ο υπόλοιπος κώδικας διαβάζει ή / και γράφει στη μνήμη που είναι δεσμευμένη για το αντικείμενο. • Κάθε φορά που ο κώδικας καλεί μια μέθοδό τους. 9/3/2009 Μνήμη & Java: – H Java δεν επιτρέπει την καταστροφή αντικειμένων από τον κώδικα – όχι άμεσα. – Η καταστροφή είναι αυτόματη. • Καλύτερα ή χειρότερα; – Απλώς διαφορετικά! – Πάντα χρειάζεται προσοχή, όπως με όλα στον προγραμματισμό. Δικτυακός Προγραμματισμός 11 Αντικείμενα – Objects (4) • • • Πώς μοιάζει η δήλωση αντικειμένων; – Ιδιότητες: Member Variables – Λειτουργίες: Member Methods (ή απλά Methods) • Μοιάζουν με συναρτήσεις. – Αλλάζει από γλώσσα σε γλώσσα. Η θεωρία περιλαμβάνει πολλά σύνθετα στοιχεία για τα αντικείμενα – Η δήλωση μπορεί να γίνει ιδιαίτερα πολύπλοκη. Στοιχεία ΟΟP – Encapsulation – Inheritance – Abstraction – Polymorphism – Και πολλά άλλα που παρέχει η Java και άλλες γλώσσες. 9/3/2009 Δικτυακός Προγραμματισμός // 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; } 12 Βασική χρήση Αντικειμένων • Οι τύποι αντικειμένων μαζί ονομάζονται reference types. – Μια μεταβλητή μπορεί να είναι είτε builtin-type, είτε reference-type variable. – Κάθε reference-type variable μπορεί να πάρει την τιμή null. • • Έχει τιμή. Απλά δεν αναφέρεται σε κάποιο αντικείμενο. Έχοντας μια reference-type variable υπάρχει πρόσβαση στα μέλη της – Η πρόσβαση ελέγχεται από κάθε class, κατά τη δήλωση. • Ο operator είναι μια τελεία: . – • a . b = c . d . e(); Pass by reference – Ισχύει ο κανόνας ότι η συνάρτηση δεν είναι δυνατόν να πειράξει το ίδιο το reference. – Μπορεί όμως να έχει πρόσβαση σε μέλη (ιδιότητες και μεθόδους), άρα να υπάρξει έτσι κάποια αλλαγή στα μέλη αυτά. – Για τα builtin-types έχουμε pass by value. 9/3/2009 void foo( MyObject obj ) { obj.number = 12; obj = new MyObject(); obj.number = 10; } Visibility – περισσότερα σε λίγο. – Η πρόσβαση γίνεται με τον operator member-of. • class MyObject { int number; } Δικτυακός Προγραμματισμός void test_foo() { MyObject myObj = new MyObject(); foo( myObj ); int n = myObj.number; } Ποια είναι η τιμή της n ; 13 Object Oriented Programming: Encapsulation (1) • Encapsulation (ενθυλάκωση) – Κάθε τύπος (class) έχει τα δικά του δεδομένα των οποίων γνωρίζει τη χρήση και σημασία. – Κάθε class παρέχει methods που αλλάζουν ή / και χρησιμοποιούν τα δεδομένα της. • Η ενθυλάκωση χρησιμοποιείται για να απομονωθούν τα τμήματα του προγράμματος. – Διαχωρίζεται το «πότε» από το «πως». – Η διαχείριση συγκεκριμένου είδος πληροφοριών οργανώνεται σε μια μονάδα προγραμματισμού (class). – Άρα, με σωστή χρήση, η απομόνωση προσφέρει καλύτερο έλεγχο. – Επεκτασιμότητα // Ενθυλάκωση: η «κακή» χρήση 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; • Θα φανεί αργότερα σε συνδυασμό με τα άλλα στοιχεία του OOP. 9/3/2009 Δικτυακός Προγραμματισμός 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(); } } 14 Object Oriented Programming: Encapsulation (2) • Το encapsulation δίνει τη δυνατότητα απομόνωσης δεδομένων και λειτουργιών. – Ένα σημείο (class) του κώδικα ασχολείται με μια συγκεκριμένη λειτουργία (και ο υπόλοιπος κώδικας γνωρίζει αυτό το class)... – ... αντί να είναι χωρισμένη μια λειτουργία σε διάφορα σημεία (ανάλογα με τη ροή του προγράμματος). • Οι διορθώσεις λαθών και οι αλλαγές στους αλγόριθμους γίνονται σε συγκεκριμένα σημεία – Ο κώδικας είναι περισσότερο ευανάγνωστος. – Ο κώδικας που αφορα στη διαχείριση συγκεκριμένων δεδομένων, είναι μαζεμένος στο ίδιο τμήμα του κώδικα. • Δεν επαναλαμβάνονται ίδια ή όμοια τμήματα κώδικα. – Μεταφέρουμε αντικείμενα έναντι πολλών (και διαφορετικών) δεδομένων. • Δεν υπάρχει ανάγκη μεταφοράς μεγάλου όγκου δεδομένων, μιας και αυτά είναι μέσα σε ένα αντικείμενο. 9/3/2009 Δικτυακός Προγραμματισμός 15 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. 9/3/2009 Δικτυακός Προγραμματισμός 16 Object Oriented Programming: Inheritance (1) // Παράδειγμα Inheritance • Ένα class μπορεί να «επεκτείνει» ένα άλλο – Ιδιότητες και λειτουργίες μπορούν να προστεθούν. • Το νέο class είναι το πλουσιότερο! – Το παλαιό δεν άλλαξε καθόλου, ούτε κι ο κώδικας που το χρησιμοποιεί! – Το νέο class μπορεί να χρησιμοποιηθεί όπου και το παλαιό. • Απλώς άλλαξε συμπεριφορά 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; Line.length() 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 ); 9/3/2009 Δικτυακός Προγραμματισμός 17 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 γενικά έχουν «περισσότερα» από τα superclasses, άρα η χρήση του sub-class στη θέση του super-class είναι γενικά προβληματική. 9/3/2009 Δικτυακός Προγραμματισμός 18 Object Oriented Programming: Inheritance (3) // Παράδειγμα Inheritance • Πρόσβαση στους «γονείς» – Tα members των super-classes είναι γενικά προσβάσιμα από τα sub-classes. • Αρκεί να είναι visible! • Μεταβλητές και μέθοδοι με ίδια ονόματα. – Όταν σε ένα sub-class δηλώνεται ένα field με ίδιο όνομα με visible field του super-class, το ονόμα αναφέρεται στη μεταβλητή που είναι στο sub-class. – Όμως ένα sub-class εξακολουθεί να μπορεί να καλέσει μέθοδο ή / και να προσπελάσει μεταβλητή του super-class • Με τη λέξη κλειδί: super 9/3/2009 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; Line.length() float length() { float dz = z0 – z1; float dxy = super.length() * super.length(); return Math.sqrt( dxy + dz*dz ); } } Δικτυακός Προγραμματισμός 19 Object Oriented Programming: Abstraction (1) • Ο καλύτερος τρόπος σκέψης όταν υλοποιείται ένα class: – Να μη γνωρίζεις πως, πότε και (κυρίως) από που αυτό θα χρησιμοποιηθεί. abstract class Shape { Point center; Point getCenter() { return center; } • Η αφαίρεση δίνει τη δυνατότητα να περιγράφονται οι τύποι μερικώς – Η περιγραφή περιορίζεται σε αυτά που χρειάζεται να γνωρίζει ο κώδικας που γράφουμε. • Η αφαίρεση έχει νόημα μόνο σε δένδρα ιεραρχίας. – abstract float area(); } Κοντά στη ρίζα του δένδρου (ποιο γενικός τύπος) ορίζονται κοινά πρότυπα συμπεριφορών, αλλά όχι οι ίδιες οι συμπεριφορές. • Οι classes που δεν είναι abstract ονομάζονται concrete. • Κάθε class που δεν είναι abstract πρέπει να υλοποιεί όλα τα inherited abstract methods. 9/3/2009 Shape Rectangle Cycle Δικτυακός Προγραμματισμός Polygon 20 Object Oriented Programming: Abstraction (2) public abstract class Shape { protected Point center; public Point getCenter() { return center; } Θέλουμε τα sub-class να «βλέπουν» το center. Ποιοι άλλοι το «βλέπουν»; public abstract float area(); } public class Rectangle extends Shape { private Point upleft; public class Circle extends Shape { private float radius; public float area() { float dx = upleft.x – center.x; float dy = upleft.y – center.y; public float area() { return Math.PI * radius * radius; } } return 2*dx * 2*dy; } } 9/3/2009 Δικτυακός Προγραμματισμός 21 Object Oriented Programming: Abstraction (3) • Γιατί να δηλώνεται αόριστος (abstract) κώδικας; – Επεκτασιμότητα: • Δήλωση αλγορίθμου που δεν γνωρίζει το ακριβές είδος των δεδομένων που χρειάζεται, αλλά το τι απαιτείται από αυτά. – Ο αλγόριθμος sort() χρησιμοποιεί αντικείμενα Comparable – όχι integers!!! – API για επικοινωνία ομάδας προγραμματιστών: • API: Application Programming Interface • Η συμφωνία σε συγκεκριμένα πρότυπα (API) διαχωρίζει το υπό ανάπτυξη σύστημα σε τμήματα που μπορούν να αναπτυχθούν ανεξάρτητα. – Δομή προγραμμάτων & Inheritance: • Γίνεται καλύτερη εκμετάλλευση της δομής ιεραρχίας, έχοντας τον κώδικα σε μέρη όπου ταιριάζει περισσότερο. • Γενικά το abstraction είναι ο μηχανισμός που επιτρέπει την πλήρη εκμετάλλευση του Inheritance και του Encapsulation μαζί 9/3/2009 Δικτυακός Προγραμματισμός 22 Object Oriented Programming: Polymorphism • • Προγραμματίστε το μια φορά, χρησιμοποιείστε το για τα πάντα Ο πολυμορφισμός είναι ένας συνδυασμός ιδιοτήτων – Η ιδιότητα των αντικειμένων να επαναπροσδιορίζουν τη συμπεριφορά τους. – Η ιδιότητα του κώδικα να χρησιμοποιεί την «κατάλληλη» συμπεριφορά ανά περίπτωση. • Method Overriding: – O επαναπροσδιορισμός συμπεριφοράς μιας μεθόδου – H παλαιά και η νέα μέθοδος πρέπει να έχουν ακριβώς το ίδιο signature. • Το μεγαλύτερο πλεονέκτημα του πολυμορφισμού – Το φροντίζει η γλώσσα να δουλεύει, όχι ο προγραμματιστής! • 9/3/2009 class LineUser { float totalLength = 0; class Line { float length() { ..... } } void (Line line) { totalLength += line.length(); } } class Line3D extends Line { float length() { ....... } } Method overriding 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() Line3D.length() Line3D.length() 23 Java & Object Oriented Programming • Ιδιαίτερα στοιχεία της Java – Single class inheritance • Σχηματίζεται ένα δέντρο «ιεραρχίας» • Στη ρίζα του δέντρου είναι το java.lang.Object – Interfaces • Είναι τμήμα της γλώσσας • Multiple interface inheritance • Overriding & Overloading – Διαφορετικοί μηχανισμοί για διαφορετικό σκοπό – Γενικά: • Overloading: επαναχρησιμοποίηση ονομάτων με άλλα ορίσματα • Overriding: χρήση πολυμορφισμού, επαναπροσδιορισμός συμπεριφοράς • Ορολογία: – Η υλοποίηση ενός abstract method ΔΕΝ είναι overriding! 9/3/2009 interface Iface { void foo(); void bar(); } Marker Interface 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() { … } } Δικτυακός Προγραμματισμός Overloading Overriding 24 Όλα μαζί! • • Η δημιουργία ενός προγράμματος έχει κυρίως να κάνει με την εύρεση των αντικειμένων που το απαρτίζουν Τα αντικείμενα έχουν ιδιότητες και λειτουργίες – Encapsulation & Visibility • Πολλά αντικείμενα έχουν κοινές ιδιότητες και λειτουργίες – Inheritance • Αλλά για κάποια οι ίδιες οι λειτουργίες διαφέρουν στην υλοποίηση – Abstraction (στο common super-class) • Φαίνεται τα αντικείμενα να ανήκουν σε άνω του ενός δένδρα ιεραρχίας – Interfaces αντί για abstract classes – Multiple interface inheritance • Ο αλγόριθμος που εκτελείται εξαρτάται από το τρέχον context και διαφέρει ανά περίπτωση – Polymorphism – πχ. Κάνοντας ένα class Comparable, μπορούμε να χρησιμοποιήσουμε τις έτοιμες υλοποιήσεις για ταξινομήσεις. • • Το Comparable είναι interface και βρίσκεται στο package ‘java.util’. Γενικά η δομή του κώδικα εξαρτάται από τα δεδομένα που χειρίζεται και τις λειτουργίες που εκτελεί. – Οπότε πρέπει να δημιουργούνται αντίστοιχοι τύποι που παρέχουν ακριβώς όσα χρειάζονται 9/3/2009 Δικτυακός Προγραμματισμός 25 Java Code Layout • • Η Java έχει κανόνες σχετικά με την οργάνωση του κώδικα σε αρχεία. Κάθε public class πρέπει να δηλώνεται σε ένα αρχείο με το όνομα του class και με κατάληξη ‘.java’. – • • • Κάθε directory που έχει αρχεία java λέγεται package. Το directory στο οποίο ξεκινά ο java compiler είναι το default package. Tα packages ορίζουν λογικές ενότητες στον κώδικα και έχουν μέγιστη σημασία στο visibility. – – • Εντός ενός package έχει ισχύ το default visibility. Μόνο τα public classes μπορούν να χρησιμοποιηθούν εκτός του package. package pckg1; public class MyClass { public static void main(String[ ] args) { System.out.println( “Hello world!” ); } } Κάθε αρχείο ξεκινά δηλώνοντας το package στο οποίο ανήκει. – • Το κάθε αρχείο με κώδικα ονομάζεται compilation unit. Εκτός από όσα βρίσκονται στο default. Κάθε αρχείο java μπορεί να έχει το πολύ ένα public class. 9/3/2009 Δικτυακός Προγραμματισμός 26 Scope (1) • Το scope δηλώσεων τύπων (class), μεταβλητών και μεθόδων αφορά τα τμήματα ενός «προγράμματος» που μπορούν να προσπελαστούν κάνοντας χρήση του ονόματος τους. • Το scope ενός τμήματος κώδικα είναι όλοι οι τύποι, data, και methods που αυτό το τμήμα «βλέπει». • Το scope είναι ιεραρχικό. – Οτιδήποτε visible «παραπάνω» είναι visible «παρακάτω» – Hiding: δήλωση με όνομα που βρίσκεται εν χρήση. 9/3/2009 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. { … } Current Block Δικτυακός Προγραμματισμός Class Compilation Unit 27 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.*; 9/3/2009 Δικτυακός Προγραμματισμός 28 Άλλα στοιχεία της Java this, super • this – Μπορεί να χρησιμοποιηθεί σε κάθε instance method και σε κάθε constructor (βλέπε παρακάτω). – Είναι του τύπου στον οποίο μέσα χρησιμοποιείται. – Αναφέρεται στο running instance του class. • Έχουμε πρόσβαση σε όλα τα δεδομένα του instance και του class. class Foo { int value = 0; void setValue( int value ) { this.value = value; } } • super – Όμοια με το this – Αναφέρεται στο super-class. • Αν έχει κάποιο δηλωθεί (με χρήση extends) • Αλλιώς το java.lang.Object 9/3/2009 Δικτυακός Προγραμματισμός 29 Άλλα στοιχεία της Java static • Το static χρησιμοποιείται όταν θέλουμε να προσδώσουμε σε ένα class στοιχεία ενός instance. • Με τη χρήση του δηλώνεται ένα member ως member του τύπου, κι όχι του κάθε instance. – Tα member fields έχουν την ίδια τιμή για όλα τα instances – Όλα τα static members (fields & methods) είναι accessible από τον τύπο – χωρίς να απαιτούν κάποιο instance. class Foo { static int a = 3; int b = 12; static void foo() { ….. } } • Τίποτα δεν μπορεί να είναι ταυτόχρονα static και abstract! 9/3/2009 Δικτυακός Προγραμματισμός Foo bar = new Foo(); int c = Foo.a; c = foo.b; c = Foo.b; // WRONG Foo.foo(); bar.foo(); // correct, but… 30 Άλλα στοιχεία της Java final • final class – Δεν μπορεί να γίνει extend • final field – Δεν μπορεί να αλλάξει τιμή (είναι σταθερά) • final method – Δεν μπορεί να γίνει override – ΜΠΟΡΕΙ να γίνει Overload!!! • final method parameter – Δεν μπορεί να γίνει ανάθεση σε αυτό το όρισμα μέσα στη μέθοδο. – ΜΠΟΡΕΙ να γίνει ανάθεση σε member του ορίσματος. 9/3/2009 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 } } Δικτυακός Προγραμματισμός 31 Άλλα στοιχεία της 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 ) { …. /// θα τρέξει αυτός ο κώδικας; } – Άρα; 9/3/2009 Δικτυακός Προγραμματισμός 32 Άλλα στοιχεία της Java Strings • String είναι: – Αντικείμενο στο οποίο αποθηκεύεται μια ακολουθία χαρακτήρων. – Οι χαρακτήρες στη Java είναι UNICODE. – Η γλώσσα χειρίζεται με ιδιαίτερο τρόπο αυτά τα αντικείμενα – υπάρχει και ειδική σύνταξη για την εύκολη δηλωσή τους. – Μετά τη δημιουργία ενός string τα δεδομένα που περιέχει δεν αλλάζουν. • String δεν είναι: – char[] 9/3/2009 String foo_0 = “foo”; String foo_1 = new String( “foo” ); String foo_2 = “foo” + foo_0 + foo_1; String f = “2” + 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: Foo@2ab36f3 bar:hallo!” Δικτυακός Προγραμματισμός 33 Ο κύκλος ζωής ενός Object • Tα αντικείμενα έχουν όλα τον ίδιο κύκλο ζωής – Αν και αυτός έχει διαφορετική διάρκεια για το καθένα! • Κατασκευή – Χρήση – Καταστροφή • Κατασκευή – Γίνεται με τον operator new. • Χρήση – Η χρήση του αντικειμένου είναι ευθύνη του κώδικα που το χρησιμοποιεί – όχι του ίδιου του αντικειμένου • Όμως το τι περιλαμβάνει εξαρτάται άμεσα από τον τύπο. • Καταστροφή – Δεν γίνεται άμεσα από τον κώδικα – ΟΜΩΣ ελέγχεται από τον κώδικα 9/3/2009 Δικτυακός Προγραμματισμός 34 Object Construction (1) • Constructor είναι: – Κώδικας που εκτελείται κατά την κατασκευή ενός αντικειμένου (instance). – Καλείται από τον operator new, ή από άλλον constructor του ίδιου τύπου ή υπο-τύπου, αφού έχει γίνει η δέσμευση μνήμης και έχουν αρχικοποιηθεί όλα τα member fields. – Μπορεί να πάρει διάφορα ορίσματα, όπως και ένα method, καθώς και να γίνει overload (αλλάζοντας το signature). • Constructor δεν είναι: Default constructor: – Είναι εκείνος που δεν έχει parameters. – Αν δεν έχει δηλωθεί κανείς constructor, o compiler δηλώνει ένα default • • 9/3/2009 Foo(){ cnstrArgs = 0; } Foo(int a) { cnstrArgs = 1; } Foo(int a, int b) { cnstrArgs = 2; } Foo( double c ) { this( (int) c ); } } – Method • class Foo { int cnstrArgs; Δεν κάνει τίποτα Το visibility είναι αυτό του class. class Bar extends Foo { Bar() { } Bar(int a) { } Bar(int a, int b) { super( a, b ); } } Δικτυακός Προγραμματισμός 35 Object Construction (2) • new 1. 2. Δέσμευση μνήμης Αρχικοποίηση member fields • Για όσα δεν υπάρχει αρχική τιμή, μηδενίζεται η μνήμη: – – – 3. 4. { // initializer. cnstrArgs = 0; } Booleans: false Numerical types: zero Reference types (classes & arrays): null Εκτέλεση instance initializers Καλείται ο constructor • • class Foo { static final int CONSTANT = 18; int cnstrArgs = -18; Foo() { } Foo(int a) { cnstrArgs = 1; } Foo(int a, int b) { cnstrArgs = 2; } Επιλογή βάσει τύπων παραμέτρων που δόθηκαν στον new operator. Foo( double c ) { this( (int) c ); } Class Loading – – Πριν τη χρήση ενός class, αυτό γίνεται “load”. H διαδικασία είναι: 1. 2. 3. 9/3/2009 Δέσμευση μνήμης Αρχικοποίηση static member fields Εκτέλεση static initializers // correct: not-a-constructor! void Foo() { … } } Δικτυακός Προγραμματισμός 36 Object Construction (3) • class Foo { final int cnstrArgs = -18; Blank finals – Τα members που έχουν δηλωθεί ως final, είτε: • • 9/3/2009 Έχουν αρχική τιμή που τους δίδεται στη δήλωση. Ή ονομάζονται blank final fields και κάθε constructor πρέπει να τους δώσει κάποια τιμή. Foo(int a) { cnstrArgs = 1; } Foo(int a, int b) { cnstrArgs = 2; } Foo( double c ) { this( (int) c ); cnstrArgs = 3; // WRONG! } } Δικτυακός Προγραμματισμός Γιατί; 37 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; int a = 3; a = 2; 9/3/2009 // το αντικείμενο από το τελευταίο new έγινε unreachable. // τίποτα! Τα Builtin types δεν γίνονται ποτέ unreachable, // διότι δεν γίνονται ποτέ destroy! Δικτυακός Προγραμματισμός 38 Object Destruction (2) • Τι συμβαίνει με ένα unreachable object; – Τα αντικείμενα αυτά προστίθενται σε εξειδικευμένες λίστες • Κάτι σαν death-lists • Αυτή η διαδικασία ονομάζεται garbage collection – Όταν κρίνεται σκόπιμο και αναγκαίο (δηλαδή όταν εξειδικευμένοι αλγόριθμοι το αποφασίσουν), τότε γίνεται free από τη μνήμη του προγράμματος • Η ολοκλήρωση αυτής της διαδικασίας αυξάνει την ελεύθερη μνήμη του προγράμματος (κατά το μέγεθος των κατεστραμμένων αντικειμένων). • Πως αντιλαμβάνεται ένα αντικείμενο την καταστροφή του; – Τα αντικείμενα έχουν μια μέθοδο που καλείται κατά την καταστροφή τους. • protected void finalize() • Δηλωμένη στο Object – Υπάρχει προκειμένου να δοθεί ο έλεγχος σε ένα instance πριν την καταστροφή του • Μερικές φορές αυτό χρησιμοποιείται γιανα κάνει free όσα resources δεν γίνονται αυτόματα 9/3/2009 Δικτυακός Προγραμματισμός 39 Object Destruction (3) • finalize() – Η μέθοδος είναι σαν οποιαδήποτε άλλη μέθοδο • Μπορεί να κληθεί από οπουδήποτε στον κώδικα είναι visible (έχει αρχικά δηλωθεί protected). – Η κλήση της από τον κώδικα δεν συνεπάγεται την καταστροφή αντικειμένου! 9/3/2009 Δικτυακός Προγραμματισμός 40 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() 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 */ • Επιστρέφει την περιγραφή της δομής του αντικειμένου – final void notify() • Ενεργοποιεί το πολύ ένα thread που αναμένει στο τρέχον monitor – final void notifyAll() • Ενεργοποιεί όλα threads που αναμένει στο τρέχον monitor – final void wait() • Αναμένει σε ένα monitor 9/3/2009 Δικτυακός Προγραμματισμός Monitors & Threads: Η Java έχει έννοιες αυτές τις έννοιες ως τμήμα της γλώσσας. Θα παρουσιαστούν σε επόμενο μάθημα. 41 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; – Ανάλογα με το τι πρέπει να ελεγθεί – Παραδείγματα: • • • 9/3/2009 Είναι δύο Strings ίδια; Είναι δύο int ίδιοι; Εχουν δύο objects τις ίδιες τιμές; Δικτυακός Προγραμματισμός 42 Exceptions • Exceptions: ο μηχανισμός της Java για τη διαχείριση λαθών. • Όταν συμβαίνει ένα λάθος στο πρόγραμμα η τρέχουσα μέθοδος κάνει throw ένα 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) – java.lang.Error • • • • • Τα μόνα αντικείμενα που μπορούν να γίνουν throw, είναι subclasses του Throwable. – Τα subclasses του Exception ονομάζονται checked exceptions. – Αλλά όχι τα subclasses του RuntimeException, που είναι subclass του Exception! java.lang.AssertionError java.lang.LinkageError java.lang.ThreadDeath java.lang.VirtualMachineError – – – – – java.lang.Exception • • java.lang.ClassNotFoundException java.lang.RuntimeException – – – • Δικτυακός Προγραμματισμός java.lang.ArithmeticException java.lang.IndexOutOfBoundsException java.lang.NullPointerException java.io.IOException – – 9/3/2009 java.lang.InternalError java.lang.OutOfMemoryError java.lang.StackOverflowError java.lang.UnknownError java.io.FileNotFound … 43 Μέθοδοι & Exceptions • Οι μέθοδοι οφείλουν να δηλώνουν τα checked exceptions που κάνουν throw. – Ο Java Compiler κάνει αυστηρούς ελέγχους σχετικά με αυτές τις δηλώσεις. – Μπορούν να δηλώνονται και τα unchecked exceptions, αλλά δεν απαιτείται. • Όμως σε πολλές περιπτώσεις κάνει ποιο καθαρό τον κώδικα. • Η δήλωση των exceptions γίνεται στο throw list μιας μεθόδου. void foo( String name ) throws IOException, ElementNotFoundException { … } 9/3/2009 Δικτυακός Προγραμματισμός 44 Χειρισμός 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. – void foo( String name ) throws IOException { ... } .... try { foo( “somefile.txt” ); } catch( NullPointerException x ) { x.printStackTrace(); } catch( IOException x ) { x.printStackTrace(); } finally { // εκτελείται σε κάθε περίπτωση. } Ακόμα κι αν δεν γίνει catch το exception στο ίδιο try-block. 9/3/2009 Δικτυακός Προγραμματισμός 45 Χειρισμός 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 { // εκτελείται σε κάθε περίπτωση. } – Το πρόγραμμα ποτέ δε μαθαίνει ότι συνέβησαν. 9/3/2009 Δικτυακός Προγραμματισμός 46 Χειρισμός 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, αυτό χάνεται! • – To finally μπορεί να κάνει return από μια μέθοδο. – Αν είχε ήδη γίνει return (πχ, στο try) 9/3/2009 .... try { foo( “somefile.txt” ); } catch( NullPointerException x) { x.printStackTrace(); } catch( IOException x ) { x.printStackTrace(); throw x; Finally & return • void foo( String name ) throws IOException { ... } H νέα τιμή επιστροφής είναι αυτή που πραγματικά θα επιστραφεί. Δικτυακός Προγραμματισμός // ξανα-throw !!! } finally { // εκτελείται σε κάθε περίπτωση. } 47 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 9/3/2009 Δικτυακός Προγραμματισμός 48 Exceptions & Debugging • Πώς μοιάζει ένα exception; – Όλα έχουν μια μέθοδο: printStackTrace() – H κλήση της μεθόδου μοιάζει κάπως έτσι: – Αυτή η πληροφορία χρησιμοποιείται για να βρεθεί από που ακριβώς έγινε throw το exception και πως έφτασε ο κώδικας μέχρι εκεί. 9/3/2009 Δικτυακός Προγραμματισμός 49 Προγράμματα Java • Σημείο έναρξης προγράμματος – main() – ΠΑΝΤΑ δηλωμένη με ακριβώς τον ίδιο τρόπο: • public static void main(String[] args) • Το throw list μπορεί να περιέχει ότι χρειάζεται. • Μπορούμε να χρησιμοποιούμε static members & fields για βασικά Ι/Ο 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 ); – Π.χ. System.out.println() } } 9/3/2009 Δικτυακός Προγραμματισμός 50 Προγραμματίζοντας (1) • Προαπαιτούμενα – J2SE JDK • • Java2, Standard Edition, Java development kit http://java.sun.com – 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] – Είναι ο «προσομοιωτής» της εικονικής μηχανής. • 9/3/2009 Διαβάζει τα class files, αγνoεί τα java files. Δικτυακός Προγραμματισμός 51 Προγραμματίζοντας (2) 1. Εισαγωγή κώδικα στα αρχεία – Προσοχή στα ονόματα! public class Program { public static void main(String[ ] args) { System.out.println( “Hello world!” ); } } 2. Compile – 3. Το directory από το οποίο τρέχει ο compiler είναι αυτό που θεωρείται ως default package. Run! 9/3/2009 Δικτυακός Προγραμματισμός 52 Java Virtual Machine • JVM: είναι μια εικονική μηχανή. • java.exe: ο προσομοιωτής – Τρέχει σε διαφορετικά λειτουργικά συστήματα, ακριβώς το ίδιο πρόγραμμα • Χωρίς επιπλέον προγραμματισμό, ούτε recompile! • Για να τρέξει φορτώνει κάποιες standard libraries που θεωρούνται τμήμα της πλαταφόρμας – Η πλατφόρμα επεκτείνεται πολύ περα της γλώσσας, με πολλές δυνατότητες στο standard πακέτο. 9/3/2009 Δικτυακός Προγραμματισμός 53 Java Platform & Libraries (1) • H πλατφόρμα Java περιλαμβάνει πολλές τεχνολογίες – Αυτές υποστηρίζονται από της βιβλιοθήκες που περιλαμβάνονται σε κάθε JRE • Μερικά απαραίτητα στοιχεία, σχεδόν σε κάθε πρόγραμμκα – java.lang – – – – java.util java.io java.math java.net – lookups, ... java.sql – java.awt – javax.swing – components java.applet 9/3/2009 — basic language functionality and fundamental types — collection data structure classes — file operations — multiprecision arithmetics — networking operations, sockets, DNS — Java Database Connectivity (JDBC) to access databases — basic hierarchy of packages for native GUI components — hierarchy of packages for platform-independent rich GUI — classes for creating and implementing applets Δικτυακός Προγραμματισμός 54 Java Platform & Libraries (2) 9/3/2009 Δικτυακός Προγραμματισμός 55 Java Platform & Libraries (3) 9/3/2009 Δικτυακός Προγραμματισμός 56 Documentation • Πολλή πληροφορία και class; • Ευτυχώς το πρόβλημα λύνεται με το documentation του κώδικα java: JavaDoc! • Οι πληροφορίες που παρέχονται αφορούν σε: – Δομή των packages – Διαχωρισμός class, interfaces & exceptions ανά package. – Ανάλυση των μεθόδων και των μεταβλητών που έχουν τα class • Αναφέροντια μόνον εκείνα που είναι visible στον κώδικα που τα χρησιμοποιεί. • Σε μερικές περιπτώσεις υπάρχουν ακόμα και παραδείγματα χρήσης. • Είναι μόνο στα αγγλικά • Άλλη πηγή για πληροφορίες; – Google (aka: programmer’s best friend)! • Πχ. java.util tutorial, java file example 9/3/2009 Δικτυακός Προγραμματισμός 57 Java Documentation: javadoc Java 6 API Packages Package java.util docs Classes & Interfaces Σημείωση: Πολλές σελίδες για packages έχουν ιδιαίτερα χρήσιμες πληροφορίες στο τέλος της σελίδας τους. Αυτές αφορούν στη φιλοσοφία σχεδίασης του package και αναφέρουν από που να ξεκινήσει κανείς για να πετύχει συγκεκριμένους στόχους. 9/3/2009 Δικτυακός Προγραμματισμός 58 Java Documentation: javadoc • Class Hierarchy • Implemented Interfaces – Και αυτά που κάνουν implement τα super-class • Γενικές πληροφορίες για – Υλοποίηση – Χρήση • Constructors & Methods • Inherited Methods 9/3/2009 Δικτυακός Προγραμματισμός 59 Java Documentation: javadoc • Για κάθε μέθοδο και constructor υπάρχουν – Προσδιορισμός visibility – Return type & signature – Αν ορίζονται από κάποιο class / interface • Με τον προσδιορισμό ‘Specified by:’ – Παραμέτρους μία προς μία – Τη λίστα με τα exceptions που είναι δυνατόν να πεταχτούν από τη μέθοδο. 9/3/2009 Δικτυακός Προγραμματισμός 60 Και τώρα; • 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 • Προγραμματίστε και πειραματιστήτε! 9/3/2009 Δικτυακός Προγραμματισμός 61 Ερωτήσεις 9/3/2009 Δικτυακός Προγραμματισμός 62