Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
1
Αντικειμενοστραφής Προγραμματισμός & JAVA
Θ. Βαρβαρίγου Καθηγήτρια ΕΜΠ Τηλ
2
Δικτυακός Προγραμματισμός
Πρόγραμμα (Turing,1936) Είσοδος Επεξεργασία Έξοδος Προγραμματισμός Περιγραφή της επεξεργασίας δεδομένων Διαχείριση των δεδομένων στη μνήμη Γλώσσες προγραμματισμού Τυπική (formal) περιγραφή δεδομένων και λειτουργιών Μοντέλο αντιμετώπισης των εννοιών που πραγματεύονται τα προγράμματα Object Oriented Programming Τα πάντα αντιμετωπίζονται ως «αντικείμενα» (objects) Τα αντικείμενα είναι τύποι δεδομένων που δεν ορίζονται από τη γλώσσα, αλλά που η γλώσσα επιτρέπει την περιγραφή τους. 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 < 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 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 ); 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) Υπάρχουν λάθη στη δήλωση αυτών των συναρτήσεων; Ο compiler στις γλώσσες χρησιμοποιεί τα return types συναρτήσεων για να ελέγξει την ορθότητα της χρήσης τους. Δεν είναι δυνατό να γίνει έλεγχος αν δεν υπάρχει σταθερός τύπος επιστροφής. Το λάθος είναι ότι η δεύτερη και η πρώτη συνάρτηση έχουν ίδιο signature με διαφορετικό return type. 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; default: c = 444; } 9/3/2009 Δικτυακός Προγραμματισμός
7
Δικτυακός Προγραμματισμός
Διακλαδώσεις if ( <boolean-expression> ) <block> else if…else Δεν υπάρχει then! switch Έλεγχος έναντι πολλών πιθανών τιμών. Αντικαθιστά «πολλά» if…else Περιορισμοί στον τύπο ελέγχου Int Προσοχή στην εκτέλεση των blocks! Είναι ευθύνη του προγραμματιστή να τερματίσει ένα block! break If ( number % 2 == 1 ) System.out.println( “περριτός” ); If ( errors > 10 ) abort(); else carry_on(); switch ( <integer-expression> ) { case <integer-constant> : <block> default : } switch ( a ) { case 0 : c = 111; // Πήγαινε μετά το switch{} break; case 1 : c = 2222; // Χωρίς break ! case 3 : c = 333; default : c = 444; } Προσοχή στην απουσία ‘break’ στο switch για case (1). If ( a == 0 ) c = 111; else if ( a == 1 || a == 3 ) c = 333; else c = 444; 9/3/2009 Δικτυακός Προγραμματισμός
8
Δικτυακός Προγραμματισμός
Βρόγχοι Τα τμήματα ενός γενικού βρόγχου είναι: Initializer, guard, post, body Επιπλέον εντολές βρόγχων η χρήση τους επιτρέπεται μόνο στο body. break: τερματισμός λειτουργίας του βρόγχου. continue: διακοπή της εκτέλεσης του body και συνέχεια του βρόγχου /* Οι βρόγχοι στη Java: for ( initializer ; guard ; post ) body while ( guard ) do Σημείωση: στο 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; } int b = 1, a = 1; do { b *= a; } while ( ++a < 10 ); 9/3/2009 Δικτυακός Προγραμματισμός
9
Αντικείμενα – Objects (1)
Τα πάντα είναι ένα αντικείμενο (σχεδόν!) οτιδήποτε με το οποίο μπορούμε να αλληλεπιδράσουμε Τα αντικείμενα είναι αναγνωρίσιμα από μια σειρά χαρακτηριστικών που διαθέτουν. Μπορούμε να τα ομαδοποιήσουμε ανάλογα με κάποια από αυτά, ή και να τα ιεραρχήσουμε. Τα χαρακτηριστικά ενός αντικείμενου είναι Ιδιότητες Λειτουργίες 9/3/2009 Δικτυακός Προγραμματισμός
10
Αντικείμενα – Objects (2)
Κατηγορίες Αντικειμένων - Classes Λέξεις που παραπέμπουν σε οικογένειες ομοειδών πραγμάτων. Περιγραφές ιδιοτήτων και λειτουργιών. Αντικείμενα - Instances Συγκεκριμένα αντικείμενα μιας κατηγορίας. Έχουν τιμές στις ιδιότητες τους. Μπορούν να εκτελέσουν τις λειτουργίες τους. Classes & Instances; Τελικά τι είναι Object; Ο όρος Object (αντικείμενο) χρησιμοποιείται και για τα δύο κατά περίπτωση. Συνήθως είναι σαφές τι εννοούμε, αλλά για ακρίβεια οι λέξεις class και instance είναι ενδεδειγμένες. 9/3/2009 Δικτυακός Προγραμματισμός
11
Αντικείμενα – Objects (3)
// δημιουργία αντικειμένου. MyObject o = new MyObject(); // νέα δημιουργία αντικειμένου. // τι συμβαίνει στο παλαιό; o = new MyObject(); o = null; // 2 προσπελάσεις: με τον operator ‘.’ // ο ‘.’ ονομάζεται member-of operator o . var = o . foo(); Τα αντικείμενα: Δημιουργούνται: όταν δεσμεύεται μνήμη προς χρήση τους. Το αποτέλεσμα της ύπαρξης ενός νέου instance. Καταστρέφονται: όταν παύουν να είναι χρήσιμα στο υπόλοιπο πρόγραμμα. Το Instance παύει να υπάρχει και η μνήμη είναι ελεύθερη προς νέα χρήση. Προσπελαύνονται: Κάθε φορά που ο υπόλοιπος κώδικας διαβάζει ή / και γράφει στη μνήμη που είναι δεσμευμένη για το αντικείμενο. Κάθε φορά που ο κώδικας καλεί μια μέθοδό τους. Μνήμη & Java: H Java δεν επιτρέπει την καταστροφή αντικειμένων από τον κώδικα – όχι άμεσα. Η καταστροφή είναι αυτόματη. Καλύτερα ή χειρότερα; Απλώς διαφορετικά! Πάντα χρειάζεται προσοχή, όπως με όλα στον προγραμματισμό. 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; 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 είναι 12. Ποια είναι η τιμή της n ; 9/3/2009 Δικτυακός Προγραμματισμός
14
Object Oriented Programming: Encapsulation (1)
// Ενθυλάκωση: η «κακή» χρήση 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 ); } Encapsulation (ενθυλάκωση) Κάθε τύπος (class) έχει τα δικά του δεδομένα των οποίων γνωρίζει τη χρήση και σημασία. Κάθε class παρέχει methods που αλλάζουν ή / και χρησιμοποιούν τα δεδομένα της. Η ενθυλάκωση χρησιμοποιείται για να απομονωθούν τα τμήματα του προγράμματος. Διαχωρίζεται το «πότε» από το «πως». Η διαχείριση συγκεκριμένου είδος πληροφοριών οργανώνεται σε μια μονάδα προγραμματισμού (class). Άρα, με σωστή χρήση, η απομόνωση προσφέρει καλύτερο έλεγχο. Επεκτασιμότητα Θα φανεί αργότερα σε συνδυασμό με τα άλλα στοιχεία του OOP. // Ενθυλάκωση: η «καλή» χρήση 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(); 9/3/2009 Δικτυακός Προγραμματισμός
15
Object Oriented Programming: Encapsulation (2)
Ένα σημείο (class) του κώδικα ασχολείται με μια συγκεκριμένη λειτουργία (και ο υπόλοιπος κώδικας γνωρίζει αυτό το class)... ... αντί να είναι χωρισμένη μια λειτουργία σε διάφορα σημεία (ανάλογα με τη ροή του προγράμματος). Οι διορθώσεις λαθών και οι αλλαγές στους αλγόριθμους γίνονται σε συγκεκριμένα σημεία Ο κώδικας είναι περισσότερο ευανάγνωστος. Ο κώδικας που αφορα στη διαχείριση συγκεκριμένων δεδομένων, είναι μαζεμένος στο ίδιο τμήμα του κώδικα. Δεν επαναλαμβάνονται ίδια ή όμοια τμήματα κώδικα. Μεταφέρουμε αντικείμενα έναντι πολλών (και διαφορετικών) δεδομένων. Δεν υπάρχει ανάγκη μεταφοράς μεγάλου όγκου δεδομένων, μιας και αυτά είναι μέσα σε ένα αντικείμενο. 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. 9/3/2009 Δικτυακός Προγραμματισμός
17
Object Oriented Programming: Inheritance (1)
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 dz = z0 – z1; float dxy = super.length() * super.length(); return Math.sqrt( dxy + dz*dz ); Ένα class μπορεί να «επεκτείνει» ένα άλλο Ιδιότητες και λειτουργίες μπορούν να προστεθούν. Το νέο class είναι το πλουσιότερο! Το παλαιό δεν άλλαξε καθόλου, ούτε κι ο κώδικας που το χρησιμοποιεί! Το νέο class μπορεί να χρησιμοποιηθεί όπου και το παλαιό. Απλώς άλλαξε συμπεριφορά Line.length() 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 Δικτυακός Προγραμματισμός
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 είναι γενικά προβληματική. 9/3/2009 Δικτυακός Προγραμματισμός
19
Object Oriented Programming: Inheritance (3)
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 dz = z0 – z1; float dxy = super.length() * super.length(); return Math.sqrt( dxy + dz*dz ); Πρόσβαση στους «γονείς» Tα members των super-classes είναι γενικά προσβάσιμα από τα sub-classes. Αρκεί να είναι visible! Μεταβλητές και μέθοδοι με ίδια ονόματα. Όταν σε ένα sub-class δηλώνεται ένα field με ίδιο όνομα με visible field του super-class, το ονόμα αναφέρεται στη μεταβλητή που είναι στο sub-class. Όμως ένα sub-class εξακολουθεί να μπορεί να καλέσει μέθοδο ή / και να προσπελάσει μεταβλητή του super-class Με τη λέξη κλειδί: super Line.length() 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 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(); } Θέλουμε τα sub-class να «βλέπουν» το center. Ποιοι άλλοι το «βλέπουν»; 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; } } Το field ‘center’ είναι visible στην class Shape, σε όλα τα class που κάνουν extend Shape ΚΑΙ σε όλα τα class που βρίσκονται στο ίδιο package με τη Shape 9/3/2009 Δικτυακός Προγραμματισμός
22
Object Oriented Programming: Abstraction (3)
Επεκτασιμότητα: Δήλωση αλγορίθμου που δεν γνωρίζει το ακριβές είδος των δεδομένων που χρειάζεται, αλλά το τι απαιτείται από αυτά. Ο αλγόριθμος sort() χρησιμοποιεί αντικείμενα Comparable – όχι integers!!! API για επικοινωνία ομάδας προγραμματιστών: API: Application Programming Interface Η συμφωνία σε συγκεκριμένα πρότυπα (API) διαχωρίζει το υπό ανάπτυξη σύστημα σε τμήματα που μπορούν να αναπτυχθούν ανεξάρτητα. Δομή προγραμμάτων & Inheritance: Γίνεται καλύτερη εκμετάλλευση της δομής ιεραρχίας, έχοντας τον κώδικα σε μέρη όπου ταιριάζει περισσότερο. Γενικά το abstraction είναι ο μηχανισμός που επιτρέπει την πλήρη εκμετάλλευση του Inheritance και του Encapsulation μαζί 9/3/2009 Δικτυακός Προγραμματισμός
23
Object Oriented Programming: Polymorphism
class LineUser { float totalLength = 0; void (Line line) { totalLength += line.length(); } Προγραμματίστε το μια φορά, χρησιμοποιείστε το για τα πάντα Ο πολυμορφισμός είναι ένας συνδυασμός ιδιοτήτων Η ιδιότητα των αντικειμένων να επαναπροσδιορίζουν τη συμπεριφορά τους. Η ιδιότητα του κώδικα να χρησιμοποιεί την «κατάλληλη» συμπεριφορά ανά περίπτωση. Method Overriding: O επαναπροσδιορισμός συμπεριφοράς μιας μεθόδου H παλαιά και η νέα μέθοδος πρέπει να έχουν ακριβώς το ίδιο signature. Το μεγαλύτερο πλεονέκτημα του πολυμορφισμού Το φροντίζει η γλώσσα να δουλεύει, όχι ο προγραμματιστής! Άρα το εμπιστευόμαστε, ως ιδιότητα ελεύθερη λαθών. class Line { float length() { ..... } class Line3D extends Line { 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() 9/3/2009 Δικτυακός Προγραμματισμός
24
Java & Object Oriented Programming
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) { … } Marker Interface Overloading Overriding 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’. Γενικά η δομή του κώδικα εξαρτάται από τα δεδομένα που χειρίζεται και τις λειτουργίες που εκτελεί. Οπότε πρέπει να δημιουργούνται αντίστοιχοι τύποι που παρέχουν ακριβώς όσα χρειάζονται 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!” ); } 9/3/2009 Δικτυακός Προγραμματισμός
27
Δικτυακός Προγραμματισμός
Scope (1) Το scope δηλώσεων τύπων (class), μεταβλητών και μεθόδων αφορά τα τμήματα ενός «προγράμματος» που μπορούν να προσπελαστούν κάνοντας χρήση του ονόματος τους. Το scope ενός τμήματος κώδικα είναι όλοι οι τύποι, data, και methods που αυτό το τμήμα «βλέπει». Το scope είναι ιεραρχικό. Οτιδήποτε visible «παραπάνω» είναι visible «παρακάτω» Hiding: δήλωση με όνομα που βρίσκεται εν χρήση. 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 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.*; 9/3/2009 Δικτυακός Προγραμματισμός
29
Άλλα στοιχεία της Java this, super
Μπορεί να χρησιμοποιηθεί σε κάθε 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; } } 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… 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 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 ) …. /// θα τρέξει αυτός ο κώδικας; - Άρα τα arrays ΔΕΝ ΜΠΟΡΟΥΝ να γίνουν extend !!!!! 9/3/2009 Δικτυακός Προγραμματισμός
33
Άλλα στοιχεία της Java Strings
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” String είναι: Αντικείμενο στο οποίο αποθηκεύεται μια ακολουθία χαρακτήρων. Οι χαρακτήρες στη Java είναι UNICODE. Η γλώσσα χειρίζεται με ιδιαίτερο τρόπο αυτά τα αντικείμενα – υπάρχει και ειδική σύνταξη για την εύκολη δηλωσή τους. Μετά τη δημιουργία ενός string τα δεδομένα που περιέχει δεν αλλάζουν. String δεν είναι: char[] Κάθε 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!” 9/3/2009 Δικτυακός Προγραμματισμός
34
Ο κύκλος ζωής ενός Object
Αν και αυτός έχει διαφορετική διάρκεια για το καθένα! Κατασκευή – Χρήση – Καταστροφή Κατασκευή Γίνεται με τον operator new. Χρήση Η χρήση του αντικειμένου είναι ευθύνη του κώδικα που το χρησιμοποιεί – όχι του ίδιου του αντικειμένου Όμως το τι περιλαμβάνει εξαρτάται άμεσα από τον τύπο. Καταστροφή Δεν γίνεται άμεσα από τον κώδικα ΟΜΩΣ ελέγχεται από τον κώδικα 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 ); 9/3/2009 Δικτυακός Προγραμματισμός
36
Object Construction (2)
new Δέσμευση μνήμης Αρχικοποίηση member fields Για όσα δεν υπάρχει αρχική τιμή, μηδενίζεται η μνήμη: Booleans: false Numerical types: zero Reference types (classes & arrays): null Εκτέλεση instance initializers Καλείται ο constructor Επιλογή βάσει τύπων παραμέτρων που δόθηκαν στον new operator. Class Loading Πριν τη χρήση ενός class, αυτό γίνεται “load”. H διαδικασία είναι: Αρχικοποίηση static member fields Εκτέλεση 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() { … } 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! } - Διότι το ‘cnstrArgs’ έχει ήδη γίνει initialize! Γιατί; 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! Με bold είναι οι εντολές που προκαλούν αντικείμενα να γίνουν unreachable 9/3/2009 Δικτυακός Προγραμματισμός
39
Δικτυακός Προγραμματισμός
Object Destruction (2) Τι συμβαίνει με ένα unreachable object; Τα αντικείμενα αυτά προστίθενται σε εξειδικευμένες λίστες Κάτι σαν death-lists Αυτή η διαδικασία ονομάζεται garbage collection Όταν κρίνεται σκόπιμο και αναγκαίο (δηλαδή όταν εξειδικευμένοι αλγόριθμοι το αποφασίσουν), τότε γίνεται free από τη μνήμη του προγράμματος Η ολοκλήρωση αυτής της διαδικασίας αυξάνει την ελεύθερη μνήμη του προγράμματος (κατά το μέγεθος των κατεστραμμένων αντικειμένων). Πως αντιλαμβάνεται ένα αντικείμενο την καταστροφή του; Τα αντικείμενα έχουν μια μέθοδο που καλείται κατά την καταστροφή τους. protected void finalize() Δηλωμένη στο Object Υπάρχει προκειμένου να δοθεί ο έλεγχος σε ένα instance πριν την καταστροφή του Μερικές φορές αυτό χρησιμοποιείται γιανα κάνει free όσα resources δεν γίνονται αυτόματα 9/3/2009 Δικτυακός Προγραμματισμός
40
Δικτυακός Προγραμματισμός
Object Destruction (3) finalize() Η μέθοδος είναι σαν οποιαδήποτε άλλη μέθοδο Μπορεί να κληθεί από οπουδήποτε στον κώδικα είναι visible (έχει αρχικά δηλωθεί protected). Η κλήση της από τον κώδικα δεν συνεπάγεται την καταστροφή αντικειμένου! 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 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 */ Monitors & Threads: Η Java έχει έννοιες αυτές τις έννοιες ως τμήμα της γλώσσας. Θα παρουσιαστούν σε επόμενο μάθημα. 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 τις ίδιες τιμές; Παραδείγματα: Είναι δύο Strings ίδια; String a; String b; a.equals( b ) Είναι δύο int ίδιοι; int a; int b; a == b /// ΔΕΝ υπάρχει equals()!!!!!!!! Εχουν δύο objects τις ίδιες τιμές; MyObj a; MyObj b; a.equals( b ) //// αφού πρώτα γίνει η σχετική υλοποίηση στο MyObj 9/3/2009 Δικτυακός Προγραμματισμός
43
Δικτυακός Προγραμματισμός
Exceptions void foo( String name ) throws IOException { if( name == null ) throw new NullPointerException(); this.source = new BufferedReader( new FileReader( name ) ); } Exceptions: ο μηχανισμός της Java για τη διαχείριση λαθών. Όταν συμβαίνει ένα λάθος στο πρόγραμμα η τρέχουσα μέθοδος κάνει throw ένα exception Αλλάζει η ροή του προγράμματος. Τα μόνα αντικείμενα που μπορούν να γίνουν throw, είναι subclasses του Throwable. Τα subclasses του Exception ονομάζονται checked exceptions. Αλλά όχι τα subclasses του RuntimeException, που είναι subclass του Exception! java.lang.Throwable (implements java.io.Serializable) java.lang.Error java.lang.AssertionError java.lang.LinkageError java.lang.ThreadDeath java.lang.VirtualMachineError java.lang.InternalError java.lang.OutOfMemoryError java.lang.StackOverflowError java.lang.UnknownError java.lang.Exception java.lang.ClassNotFoundException java.lang.RuntimeException java.lang.ArithmeticException java.lang.IndexOutOfBoundsException java.lang.NullPointerException java.io.IOException java.io.FileNotFound … 9/3/2009 Δικτυακός Προγραμματισμός
44
Δικτυακός Προγραμματισμός
Μέθοδοι & Exceptions Οι μέθοδοι οφείλουν να δηλώνουν τα checked exceptions που κάνουν throw. Ο Java Compiler κάνει αυστηρούς ελέγχους σχετικά με αυτές τις δηλώσεις. Μπορούν να δηλώνονται και τα unchecked exceptions, αλλά δεν απαιτείται. Όμως σε πολλές περιπτώσεις κάνει ποιο καθαρό τον κώδικα. Η δήλωση των exceptions γίνεται στο throw list μιας μεθόδου. void foo( String name ) throws IOException, ElementNotFoundException { … } 9/3/2009 Δικτυακός Προγραμματισμός
45
Χειρισμός Exceptions (1)
void foo( String name ) throws IOException { ... } .... try foo( “somefile.txt” ); catch( NullPointerException x ) x.printStackTrace(); } catch( IOException x ) finally // εκτελείται σε κάθε περίπτωση. Για το χειρισμό των 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. 9/3/2009 Δικτυακός Προγραμματισμός
46
Χειρισμός Exceptions (2)
void foo( String name ) throws IOException { ... } .... try foo( “somefile.txt” ); catch( NullPointerException x ) x.printStackTrace(); } catch( IOException x ) x.printStackTrace(); throw x; // ξανα-throw !!! finally // εκτελείται σε κάθε περίπτωση. 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! Το πρόγραμμα ποτέ δε μαθαίνει ότι συνέβησαν. 9/3/2009 Δικτυακός Προγραμματισμός
47
Χειρισμός Exceptions (3)
void foo( String name ) throws IOException { ... } .... try foo( “somefile.txt” ); catch( NullPointerException x ) x.printStackTrace(); } catch( IOException x ) x.printStackTrace(); throw x; // ξανα-throw !!! finally // εκτελείται σε κάθε περίπτωση. 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 νέα τιμή επιστροφής είναι αυτή που πραγματικά θα επιστραφεί. 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 9/3/2009 Δικτυακός Προγραμματισμός
49
Exceptions & Debugging
Όλα έχουν μια μέθοδο: printStackTrace() H κλήση της μεθόδου μοιάζει κάπως έτσι: Αυτή η πληροφορία χρησιμοποιείται για να βρεθεί από που ακριβώς έγινε throw το exception και πως έφτασε ο κώδικας μέχρι εκεί. 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 ); } Προσοχή! Στο παράδειγμα ανάγνωσης!!! Δουλεύει με streams… 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. 9/3/2009 Δικτυακός Προγραμματισμός
52
Δικτυακός Προγραμματισμός
Προγραμματίζοντας (2) Εισαγωγή κώδικα στα αρχεία Προσοχή στα ονόματα! Compile Το directory από το οποίο τρέχει ο compiler είναι αυτό που θεωρείται ως default package. Run! public class Program { public static void main(String[ ] args) System.out.println( “Hello world!” ); } 9/3/2009 Δικτυακός Προγραμματισμός
53
Δικτυακός Προγραμματισμός
Java Virtual Machine JVM: είναι μια εικονική μηχανή. java.exe: ο προσομοιωτής Τρέχει σε διαφορετικά λειτουργικά συστήματα, ακριβώς το ίδιο πρόγραμμα Χωρίς επιπλέον προγραμματισμό, ούτε re-compile! Για να τρέξει φορτώνει κάποιες standard libraries που θεωρούνται τμήμα της πλαταφόρμας Η πλατφόρμα επεκτείνεται πολύ περα της γλώσσας, με πολλές δυνατότητες στο standard πακέτο. 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 9/3/2009 Δικτυακός Προγραμματισμός
55
Java Platform & Libraries (2)
9/3/2009 Δικτυακός Προγραμματισμός
56
Java Platform & Libraries (3)
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 9/3/2009 Δικτυακός Προγραμματισμός
58
Java Documentation: javadoc
Java 6 API Packages Package java.util docs Classes & Interfaces Σημείωση: Πολλές σελίδες για packages έχουν ιδιαίτερα χρήσιμες πληροφορίες στο τέλος της σελίδας τους. Αυτές αφορούν στη φιλοσοφία σχεδίασης του package και αναφέρουν από που να ξεκινήσει κανείς για να πετύχει συγκεκριμένους στόχους. 9/3/2009 Δικτυακός Προγραμματισμός
59
Java Documentation: javadoc
Class Hierarchy Implemented Interfaces Και αυτά που κάνουν implement τα super-class Γενικές πληροφορίες για Υλοποίηση Χρήση Constructors & Methods Inherited Methods 9/3/2009 Δικτυακός Προγραμματισμός
60
Java Documentation: javadoc
Για κάθε μέθοδο και constructor υπάρχουν Προσδιορισμός visibility Return type & signature Αν ορίζονται από κάποιο class / interface Με τον προσδιορισμό ‘Specified by:’ Παραμέτρους μία προς μία Τη λίστα με τα exceptions που είναι δυνατόν να πεταχτούν από τη μέθοδο. 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 Προγραμματίστε και πειραματιστήτε! 9/3/2009 Δικτυακός Προγραμματισμός
62
Δικτυακός Προγραμματισμός
Ερωτήσεις 9/3/2009 Δικτυακός Προγραμματισμός
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.