Download JAVA

Document related concepts
no text concepts found
Transcript
Αντικειμενοστραφής
Προγραμματισμός
& 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
Related documents