ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές...

50
ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 2. Επανάληψη Java + OOP ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 1

Transcript of ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές...

Page 1: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι

2. Επανάληψη Java + OOP

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 1

Page 2: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 2

Διάλεξη 02: ΑντικειμενοστρεφήςΠρογραμματισμός με την JAVA

Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:Εισαγωγή στις έννοιες:

- Επισκόπηση της JAVA

- Περισσότερες Πληροφορίες στο μάθημα ΕΠΛ233

http://www.cs.ucy.ac.cy/courses/EPL233/

Page 3: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

ΠρογράμματαΤα προγράμματα (software), είναι βασικά ένα σύνολο από οδηγίες στον υπολογιστή. Χωρίς τα προγράμματα ο υπολογιστής είναι μία άδεια μηχανή.

Δεδομένου ότι ο υπολογιστής δεν καταλαβαίνει την φυσική γλώσσα αλλά μόνο την γλώσσα μηχανής (machine language), χρειαζόμαστε κάποιες ειδικές γλώσσες (γλώσσες προγραμματισμού) για να επικοινωνήσουμε μαζί του.

Παραδείγματα γλωσσών προγραμματισμού: C, C++, JAVA, C#, Visual Basic, Fortran, κ.τ.λ.

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 3

ΠΑΡΑΔΕΙΓΜΑ ΠΡΟΓΡΑΜΜΑΤΟΣ σε JAVA

public class HelloWorld{public static void main(String[] args){

System.out.println("Hello World!!!");}

}

Page 4: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Περ

ιβά

λλο

ν

Μετα

γλώ

ττισ

ης

Η πλατφόρμα της JAVA• Πλατφόρμα:

• Περιβάλλον λογισμικού και υλικού στο οποίο εκτελείται ένα πρόγραμμα.

• Συνήθως είναι συνδυασμός του Λειτουργικού Συστήματος και του Υλικού Υποστρώματος του ΛΣ.

• Δημοφιλείς πλατφόρμες: Microsoft Windows, Linux, Solaris OS, Mac OS.

• Πλατφόρμα Java: Σύστημα λογισμικού που τρέχει πάνω σε διάφορες πλατφόρμες υλικού. Αποτελείται από:• Την Εικονική Μηχανή JAVA: Java Virtual

Machine

• Την Προγραμματιστική Διαπροσωπεία Εφαρμογών της JAVA (Java ApplicationProgramming Interface - API)

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 4

Πηγαίος Κώδικας (.java)

Java Bytecode (.class)

Compiler (javac.exe)

Πλα

τφό

ρμ

α J

AV

A

Class loader and Bytecode verifier

Java Class Library

The Java Virtual Machine

Java Interpreter (java.exe)

Just-in-time compiler

Run Time System

Operating System

Hardware

Page 5: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Τυπικός Κύκλος Ζωής ενός Προγράμματος JAVA

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 5

Δημιουργία/Ενημέρωση Πηγαίου Κώδικα

Μεταγλώττιση Πηγαίου Κώδικα

Πηγαίος Κώδικας(Αποθήκευση στον δίσκο)

ByteCode(Αποθήκευση στον δίσκο)

ΠΑΡΑΔΕΙΓΜΑ ΠΗΓΑΙΟΥ ΚΩΔΙΚΑpublic class HelloWorld{

public static void main(String[] args){System.out.println("Hello World!!!");

}}

Εκτέλεση Bytecode

Αποτέλεσμα

ΠΑΡΑΔΕΙΓΜΑ BYTE CODE …Method HelloWorld()

0 aload_0…Method void main(java.lang.String[]){

0 getstatic #2 …3 ldc #3 < String "Hello World!!!" >5 invokevirtual #4

Σε περ

ίπτω

ση

πρ

οβ

λημ

άτω

νμ

εταγλώ

ττιση

ς

Σε περ

ίπτω

ση

λάθ

ος

απ

οτελέσ

μα

τος

Μεταγλώττιση (javac)

javac HelloWorld.java

Αρχείο HelloWorld.java

Διερμηνεία και Εκτέλεση (java)

java HelloWorld

Αρχείο HelloWorld.class

Page 6: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Ενσωματωμένο Περιβάλλον Ανάπτυξης (IDE)Ένα Ενσωματωμένο Περιβάλλον Ανάπτυξης (Integrated Development Environment (IDE)) συνήθως περιλαμβάνει:

• Ένα συντάκτη πηγαίου κώδικα (π.χ., Notepad)

• Εργαλεία αυτοματοποίησης (π.χ., αυτόματη μεταγλώττιση κώδικά, παρουσίαση συντακτικών λαθών)

• Ένα ελεγκτή/παρατηρητή (debugger)

Παράδειγμα – Eclipse IDE

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 6

Page 7: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Παραδείγματα: Κλάση

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 7

public class Circle {//Η ακτίνα αυτού του κύκλουprivate double radius = 1.0;

//Δημιούργησε ένα αντικείμενο τύπου κύκλοςCircle () {};

//Δημιούργησε ένα αντικείμενο τύπου κύκλος//με συγκεκριμένη ακτίναCircle (double newRadius) {radius = newRadius;

};

//Επέστρεψε το εμβαδό αυτόυ του κύκλουpublic double getArea () {return radius * radius * Math.PI;

}

}

Δεδομένα/Μεταβλητές

Κατασκευαστές

Μέθοδοι

Page 8: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Παραδείγματα: Αντικείμενα

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 8

Κλάση Circle

3 αντικείμενα

της κλάσης Circle

a

object Circle radius = 1.0

public class Test{

public static void main(String[] args){Circle a = new Circle();Circle b = new Circle(5);Circle c = new Circle(20);

Κλάση Test: περιλαμβάνει την μέθοδο main

b

object Circle radius = 5.0

c

object Circle radius = 20.0

Page 9: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Απλό if … else• Θυμηθείτε το πρόγραμμα για τη δημιουργία

κύκλων με ακτίνα

• Πρόβλημα: Τι γίνεται αν δώσουμε αρνητική τιμή για την ακτίνα του κύκλου; ➔ λάθος αποτέλεσμα

• Λύση: Μόνο αν ο χρήστης δώσει θετική τιμή τότε αλλάζουμε την τιμή της radius

• Σύνταξη απλού if: if ( <boolean expression> ) { … } else { … }

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 9

class Circle {double radius = 1.0;…Circle (double newRadius) {radius = newRadius;

};…

}

class Circle {double radius = 1.0;…Circle (double newRadius) {if ( newRadius >= 0 ){radius = newRadius;

}

else {radius = 0;}

Page 10: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

if … else if … else• Τι συμβαίνει αν υπάρχουν πολλές συνθήκες για την ίδια μεταβλητή;

• Παράδειγμα: Υπάρχουν οι ακόλουθοι φόροι σύμφωνα με τον μισθό κάποιου ατόμου:μισθός <=20,000 ➔ 0% φόροςμισθός >20,000 και <=30,000 ➔ 20% φόροςμισθός >30,000 και <=40,000 ➔ 30% φόροςμισθός >40,000 ➔ 40% φόρος

• Πρόβλημα: Χρειάζεται να γράψουμε 3x if statements; ➔ ΌΧΙ

• Λύση: Χρήση του if … else if … else

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 10

computeTax (double salary) {double tax = 0.0;if ( salary <= 20000 ) { tax = 0.0; }else if ( salary > 20000 && salary <= 30000) { tax = 0.2; }else if ( salary > 30000 && salary <= 40000) { tax = 0.3; }else { tax = 0.4; }return tax * salary;

}Λογικός Τελεστής ΚΑΙ (&&)

(στις επόμενες διαφάνειες)

Page 11: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

switch ( <switch-expression> ) {case value1: statement(s)1;

break;case value2: statement(s)2;

break;…case valueN: statement(s)N;

break;

default: statement(s)-for-default;}

switch … case

• To switch ομαδοποιεί πολλά if

• Σύνταξη:

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 11

Μεταβλητές τύπου char, byte, short, intString (Java SE 7+)

Μεταβλητές ίδιου τύπου με <switch-expression>

Όταν κανένα case δεν ικανοποιηθεί τότε εκτελούνται οι δηλώσεις του default

To break σταματάει την εκτέλεση. Αν δεν υπάρχει break τότε η εκτέλεση θα συνεχιστεί στο επόμενο case

Page 12: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

O τριαδικός τελεστής συνθήκης (ternary operator)• Η ακόλουθη δήλωση είναι ισοδύναμη με

• Σύνταξη Τριαδικού Τελεστή: ( <boolean-exp> ) ? exp1 : exp2;

• Παραδείγματα

System.out.println( ( num % 2 == 0 ) ? // (boolean-exp)num + “is even” : // exp1

num + “is odd”); // exp2

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 12

if (x > 0) y = 1;

elsey = -1;

y = (x > 0) ? 1 : -1;

Page 13: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Προγραμματισμός με βρόγχους (loops)3 είδη δηλώσεων προγραμματισμού με βρόγχους

• whilewhile ( <boolean expression> ) {

//δηλώσεις

}

• do … whiledo {

//δηλώσεις

} while ( <boolean expression> );

• forfor( <initial actions>; <boolean expr.>; actions after step )

//δηλώσεις

}

• Όλα τα είδη βρόγχων είναι ισοδύναμα.

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 13

Page 14: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Παραδείγματα προγραμματισμού με βρόγχους

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 14

Παράδειγμα <while>int i = 0;while (i < 10) {System.out.println(

"while");i ++;

}

Παράδειγμα <do-while>int i = 0;do {System.out.println(

"do-while");i++;

} while (i < 10);

Παράδειγμα <for>for ( int i=0; i<10; i++) {System.out.println(

"for");}

while

do-while

for

Page 15: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Μέθοδοι (methods)• Μέθοδος: μία συλλογή από ομαδοποιημένες δηλώσεις οι οποίες

εκτελούν κάποια (ες) λειτουργία (ες).

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

• Σύνταξη:

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 15

public static int max( int num1, int num2 ) {

int result = num1;if ( num2 > num1 ) {

result = num2;}return result;

}

modifiers return value type

methodname

parameter list

method signature

method body

return value

Page 16: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Πέρασμα Παραμέτρων• Πέρασμα διά τιμής: οι τιμές των μεταβλητών αντιγράφονται στις

παραμέτρους της μεθόδου ==> οι αρχικές μεταβλητές δεν αλλάζουν

• Πέρασμα διά αναφοράς: δεν υπάρχει!

• Παράδειγμα

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 16

public class Increment { public static void main( String[] args ) {

int x = 1; System.out.println(

"before the call, x is " + x); increment(x); System.out.println(

"after the call, x is " + x); }public static void increment( int n ) {

n++; System.out.println(

"n inside the method is " + n); }

}

1. x=1

2. x=13. x=1 copy to n

4. n=1

5. n=2

6. n=2

7. x=1

Page 17: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Πίνακες• Πίνακας: μία δομή δεδομένων που αντιπροσωπεύει μία συλλογή με

στοιχεία του ίδιου τύπου.

• Οι πίνακες στην JAVA έχουν σχεδιαστεί κατά τρόπον ώστε να ξεπερνιούνται οι δυσκολίες του προγραμματισμού πινάκων της C/C++.

• Στη JAVA είναι εξασφαλισμένο ότι ένας πίνακας θα αρχικοποιηθεί και ότι δεν θα επισυμβεί πρόσβαση εκτός των ορίων του.

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

• Κατά τη δημιουργία ενός πίνακα, κατ’ ουσίαν δημιουργείται ένας πίνακας χειριστηρίων (Handles), τα οποία αρχικοποιούνται σε null.

• Είναι ευθύνη του προγραμματιστή να αρχικοποιήσει σωστά τα χειριστήρια, ώστε να παραπέμπουν σε αντικείμενα.

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 17

Page 18: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Πίνακες (συν.)• Παράδειγμα αναπαράστασης πίνακα: int[] x = new int[5];

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 18

1

5

2

13

8

xx[0]

x[1]

x[2]

x[3]

x[4]

στοιχείο

στη θέση 2

τιμή πεδίου

αναφορά μνήμης

Μεταβλητή

αναφοράς

• Πρόσβαση σε κάθε στοιχείο του πίνακα με το ευρετήριο του. π.χ., το στοιχείο στη θέση 2 = x[2].

• Ιδιότητα (property) <length>: Επιστρέφει το μέγεθος του πίνακα.π.χ., x.length = 5

Page 19: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Παραδείγματα χρήσης πίνακα• Τύπωμα των στοιχείων ενός πίνακα

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 19

int[] x = new int[5];

...for(int i=0; i<x.length; i++) {

System.out.println( x[i] );}

• Πρόσθεση των στοιχείων ενός πίνακα

int[] x = new int[5];

int sum=0;

...for(int i=0; i<x.length; i++) {

sum = sum + x[i];}

Page 20: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Πολυδιάστατοι πίνακες

Σύνταξη: <τύπος δεδομένων>[ ][ ]... <όνομα πίνακα>, π.χ., int[][] x

Δήλωση Πινάκων

• int[][] x; //Δήλωση πίνακα 2D με ακέραιους

• char[][][] a; //Δήλωση πίνακα 3D με χαρακτήρες

Αρχικοποίηση Πινάκων

• Η αρχικοποίηση μπορεί να γίνει με τη δήλωση newx = new int[2][3]; //Δημιουργία πίνακα με 2 γραμμές και 3 στήλες

• ή μπορεί να γίνει με την αυτόματη ανάθεση στοιχείωνx = { {1, 2, 3}, {4, 5, 6} }; μόνο κατά την δήλωση!

Δήλωση και Αρχικοποίηση σε ένα Βήμα

• int[][] x= new int[2][3];

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 20

Page 21: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Garbage Collector

Σε αντίθεση με τη γλώσσα C++, στη Java η κατάργηση αντικειμένων δεν επιτελείται από το χρήστη αλλά από το runtime system της Java.

H αποδέσμευση της μνήμης γίνεται αυτόματα από το garbage collector ο οποίος φροντίζει για τη διαγραφή των αντικειμένων που δεν χρησιμοποιούνται πλέον.

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 1-21

Page 22: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Κληρονομικότητα

Δύο βασικές έννοιες:

• Ένα είδος σχέσης

• Ένας προγραμματιστικός μηχανισμός για επαναχρησιμοποίηση

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 22

Page 23: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Προγραμματιστικός Μηχανισμός Κληρονομικότητας

• Μία κλάση μπορεί να κληρονομήσει όλα τα “επιτρεπτά”στοιχεία (πεδία και μεθόδους) από τον “πατέρα” της από τον πατέρα του πατέρα της, κτλ.

• Μία υποκλάση μπορεί να προσθέσει καινούρια πεδία

• Μία υποκλάση μπορεί να προσθέσει καινούριες μεθόδους

• Μία υποκλάση μπορεί να επεκτείνει υφιστάμενες μεθόδους (overloading)

• Μία υποκλάση μπορεί να επανακαθορίσει υφιστάμενες μεθόδους (overriding)

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 23

Page 24: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Υποκλάσεις και Υπερκλάσεις

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 24

Specialize

Generalize

Υπερκλάση

Υποκλάση

Circle Circle Data Circle Methods

CylinderCircle Data

Cylinder DataCircle Methods

Cylinder Methods

Page 25: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Υποκλάσεις και Υπερκλάσεις (συν.)

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 25

class Circle {// Η ακτίνα αυτού του κύκλουprivate double radius;

// Δημιούργησε ένα κύκλοpublic Circle () {radius = 1.0;}

// Δημιούργησε ένα κύκλο // συγκεκριμένη ακτίναpublic Circle(double newRadius) {radius = newRadius;

}

// Επέστρεψε την ακτίναpublic double getRadius() {return radius;

}

// Επέστρεψε το εμβαδό public double getArea() {return radius * radius * π;

}}

class Cylinder extends Circle {// Το μήκος αυτού του κύλινδρουprivate double length;

// Δημιούργησε ένα κύλινδροpublic Cylinder() {super();this.length= 1.0;}

// Δημιούργησε ένα κύλινδρο με// συγκεκριμένο μήκοςpublic Cylinder(int length) {this.length= length; }

// Επέστρεψε το μήκοςpublic double getLength() {return length; }

// Επέστρεψε τον όγκο// αυτού του κύλινδρουpublic double getVolume () {return getArea() * length;}

}

Page 26: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Χειριστήριο Υπερκλάσης (super)

• Η λέξη κλειδί super αναφέρεται στην υπερκλάση

• Μπορεί να χρησιμοποιηθεί με δύο τρόπους:

• Για το κάλεσμα του constructor της υπερκλάσης

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

• Στην περίπτωση που καλείται ο constructor της κλάσης τότε πρέπει να είναι η πρώτη δήλωση στον κώδικα.

• Σημείωση: Η λέξη κλειδί this αναφέρεται στην υποκλάση και είναι ένα χειριστήριο προς το ίδιο το αντικείμενο.

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 26

Page 27: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Απόκρυψη Ονομάτων (Name Hiding)

Πεδία

• Μέσα σε μία κλάση, κάθε πεδίο πρέπει να έχει μοναδικό όνομα

• Μέσα από την κληρονομικότητα προκύπτουν περιπτώσεις που ένα πεδίο στην υποκλάση μπορεί να έχει το ίδιο όνομα με ένα πεδίο στην υπερκλάση

• Σε αυτή την περίπτωση, το πεδίο στην υποκλάση κρύβει/επισκιάζει (hides) το πεδίο στην υπερκλάση

• Για να έχουμε πρόσβαση στο πεδίο της υπερκλάσης πρέπει να χρησιμοποιήσουμε την λέξη κλειδί super

Μεθόδοι

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

• Σε αυτή την περίπτωση, η μέθοδος της υποκλάσης υπερσκελίζει (overrides) την μέθοδο της υπερκλάσης

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 27

Page 28: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Παράδειγμα Υπερσκέλισης (Overriding)

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 28

public class Circle extends GeometricObject {// Other methods are omitted

/** Override the toString method defined in GeometricObject */

public String toString() {return super.toString() +

"\nradius is " + radius;}

}

Page 29: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Διαπροσωπείες (Interfaces)

• Μία διαπροσωπεία (interface) είναι μία δομή (παρόμοια με την κλάση) ή οποία περιέχει:

• Δηλώσεις μεθόδων και όχι καθορισμό τους

• Σταθερές (constant) μεταβλητές

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

• Δηλώνεται με την λέξη interface

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 29

Page 30: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Δήλωση Διαπροσωπείας (Interface Declaration)

• Σύνταξη δήλωσης διαπροσωπείας:

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 30

public interface InterfaceName { //constant declarations//method signatures

}

• Παράδειγμα

public interface Edible{ // Describe how to eatpublic String howToEat();

}

Page 31: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Σταθερές Μεταβλητές (Constant Variables)

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 31

public interface InterfaceName { //constant declarationsint x=1; double PI=3.1415;

}

public interface InterfaceName { //constant declarationspublic static final int x=1; public static final double PI=3.1415;

}

• Το πιο πάνω είναι ισοδύναμο με το πιο κάτω

• Παράδειγμα δήλωσης Σταθερών Μεταβλητών

• Πρόσβαση με <διαπροσωπεία>.<μεταβλητή>π.χ., InterfaceName.x

Page 32: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Παράδειγμα Διαπροσωπείας 1

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 32

<<interface>>Animals

Attributes

Operationspublic String walk()

Mammals

Attributes

Operations

public String walk() { … }

Birds

Attributes

Operations

public String walk() { … }

Fish

Attributes

Operations

public String walk() { … }

Page 33: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Παράδειγμα Διαπροσωπείας και Κληρονομικότητας

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 33

<<interface>>IAnimalsAttributesOperations

public String eat()

MammalsAttributesOperations

public String eat() { … }

BirdsAttributesOperations

public String eat() { … }

FishAttributesOperations

public String eat() { … }

LionAttributesOperations

public String eat() { … }

EagleAttributesOperations

public String eat() { … }

SharkAttributesOperations

public String eat() { … }

Page 34: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Παράδειγμα Διαπροσωπείας και Κληρονομικότητας

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 34

public interface IAnimals {abstract void eat();String getName();}

class Mammals implements IAnimals {public void eat() { }public String getName() {}

}

class Birds implements IAnimals {public void eat() { }public String getName() {}

}

class Fish implements IAnimals {public void eat() { }public String getName() {}

}

class Lion extends Mammals {public void eat() { }public String getName() {}

}

class Eagle extends Birds {public void eat() { }public String getName() {}

}

class Shark extends Fish {public void eat() { }public String getName() {}}

Page 35: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Controlling Access to Members of a Class

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 35

static keyword to create fields and methods

that belong to the class, rather than to an

instance of the class.

Every instance of the class shares a class

variable, which is in one fixed location in

memory.

Static methods, should be invoked with the

class name, without the need for creating an

instance of the class

The static modifier, in combination with the

final modifier, is also used to define

constants.

static final double PI =

3.141592653589793;

Page 36: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Generic Types• Τα Generics έχουν προστεθεί στη JAVA από το 2004 ως μέρος του

J2SE 5.0

• Με τη χρήση των generics μπορούμε να δημιουργήσουμε κλάσεις και μεθόδους που να διαχειρίζονται διαφόρων ειδών αντικείμενα (π.χ., Στοίβα με ακέραιους, Στοίβα με συμβολοσειρές) με την ίδια υλοποίηση.

• Ο προγραμματισμός με generics μπορεί να γίνει αρκετά περίπλοκος

• Εμείς, θα επικεντρωθούμε στα ιδιώματα και την σύνταξη που παρουσιάζονται στο βιβλίο.

• Δεν θα μπούμε σε βάθος που να καλύπτει όλο το εύρος της χρήσης τους

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 36

Page 37: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Μία γενική κλάση MemoryCell (πριν την JAVA 5.0)// MemoryCell class

// Object read( ) --> Returns the stored value

// void write( Object x ) --> x is stored

public class MemoryCell {

// Private internal data representation

private Object storedValue;

// Public methods

public Object read() {

return storedValue;

}

public void write(Object x) {

storedValue = x;

}

}

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 37

Page 38: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Μία γενική κλάση MemoryCell (με Generics)// MemoryCell class

// AnyType read( ) --> Returns the stored value

// void write( AnyType x ) --> x is stored

public class MemoryCell<AnyType> {

// Private internal data representation

private AnyType storedValue;

// Public methods

public AnyType read() {

return storedValue;

}

public void write(AnyType x) {

storedValue = x;

}

}

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 38

Page 39: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Γιατί να χρησιμοποιηθούν τα generics;Μία κλάση generic έχει την πιο κάτω μορφή:

class name<T1, T2, ..., Tn> { /* ... */ }

Ο κώδικας που χρησιμοποιεί generics έχει πολλά πλεονεκτήματα:

• Καλύτερος έλεγχος σε επίπεδο μεταγλώττισηςΟ μεταγλωττιστής της JAVA εφαρμόζει ισχυρό έλεγχο για τύπους. Έτσι τα λάθη διορθώνονται σε επίπεδο μεταγλώττισης και είναι πιο δύσκολο να δημιουργηθούν runtime exceptions

• Απάλειψη των μετατροπών τύπων (casting)

• Παράδειγμα χωρίς generics: List list = new ArrayList(); list.add("hello"); String s = (String) list.get(0);

• Παράδειγμα με generics: List<String> list = new ArrayList<String>();list.add("hello"); String s = list.get(0); // no cast

• Επιτρέπει την δημιουργία γενικών αλγορίθμωνΟι προγραμματιστές μπορούν να δημιουργούν γενικούς αλγόριθμους που δουλεύουν σε συλλογές διαφορετικών τύπων που είναι ασφαλής όσο αφορά τους τύπους (type safe) και είναι πιο κατανοητές

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 39

Page 40: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Κοινοί τύπου Generics

• E - Element (used extensively by the Java Collections Framework)

• K - Key

• N - Number

• T - Type

• V - Value

• S,U,V etc. - 2nd, 3rd, 4th types

• Αυτοί οι τύποι χρησιμοποιούνται σε διάφορες βιβλιοθήκες του Java API

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 40

Page 41: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Δημιουργία και Αρχικοποίηση ενός τύπου Generic• Για δημιουργία και αναφορά ενός τύπου Generic στον κώδικα, θα

πρέπει να αντικαταστήσετε τον τύπο Generic (π.χ., E, T) με ένα “γνωστό/κανονικό” τύπο (π.χ., Integer).Παράδειγμα:

MemoryCell<Integer> intMemoryCell;

• Προσοχή: μπορούν αν χρησιμοποιηθούν μόνο αναφορές σε αντικείμενα (δηλ., Integer και όχι ο αρχέγονος τύπος int)

• Παρόμοια με άλλες δηλώσεις μεταβλητών, ο πιο πάνω κώδικας έχει δημιουργήσει μία αναφορά σε ένα αντικείμενο τύπου MemoryCellobject. Για να αρχικοποιηθεί το αντικείμενο θα πρέπει να χρησιμοποιηθεί το keyword new, αλλά επίσης να δηλωθεί ο τύπος που θα χρησιμοποιηθεί (δηλ., Integer) πριν τις παρενθέσεις ():

MemoryCell<Integer> intMemoryCell = new MemoryCell<Integer>();

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 41

Page 42: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Δημιουργία και Αρχικοποίηση ενός τύπου Generic• Από την Java SE 7, κατά τη διαδικασία αρχικοποίησης, μπορούν να

αντικατασταθούν οι παράμετροι τύπου με το άδειο σύνολο (<>) δεδομένου ότι ο μεταγλωττιστής μπορεί να ερμηνεύσει τον τύπο από την δήλωσηΠαράδειγμα:

MemoryCell<Integer> intMemoryCell = new MemoryCell<>();

• Οι παρενθέσεις <>, ονομάζονται και the diamond.

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 42

Page 43: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Παράδειγμα Generic Interfaces

• Η διαπροσωπεία Comparable, Java v.x < 5

package java.lang;

public interface Comparable {

public int compareTo( Object o );

}

• Η διαπροσωπεία Comparable, Java v.x >= 5

package java.lang;

public interface Comparable<T> {

public int compareTo( T o );

}

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 43

Page 44: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Οριοθέτηση των ΠαραμέτρωνΕνδέχεται να υπάρχουν φορές που θέλουμε να περιορίσουμε τα εύρος των τύπων που μπορούν να χρησιμοποιηθούν σε ένα αντικείμενο generic.

Για παράδειγμα, μια μέθοδος που λειτουργεί σε Numbers μπορεί να θέλει να δεχτεί μόνο στιγμιότυπα του Numbers ή των subclasses του.

Αυτές είναι οι bounded type parameters. Για το σκοπό αυτό χρησιμοποιούμε την λέξη extends.

public class NaturalNumber<T extends Integer> {

private T n;

public NaturalNumber(T n) { this.n = n; }

public boolean isEven() {

return n.intValue() % 2 == 0;

}

// ...

}

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 44

Page 45: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Τύποι Μπαλαντέρ (Wildcards <?>) (για Παραμέτρους)

• Το wildcard μπορεί να χρησιμοποιηθεί σε διάφορες καταστάσεις: ως τύπος παραμέτρου, πεδίου, τοπικής μεταβλητής.

• Υποθέστε μία κλάση Shape και μία μέθοδο double area()

• Υποθέστε επίσης ότι υπάρχει μία στατική μέθοδος totalArea() που δέχεται μία συλλογή (Collection) από Shapes (δηλ., Collection<Shape>) και βρίσκει το συνολικό εμβαδό όλων των σχημάτων της συλλογήςpublic static double totalArea (Collection<Shape> arr) {

double total = 0.0;

for ( Shape s : arr ) //For-Each Shape s in arr

if ( s != null ) total += s.area();

return total;

}

• Τώρα, υποθέστε δύο κλάσεις Circle και Square που κληρονομούν την κλάση Shape.

• Ερώτηση: Τι θα συμβεί αν περάσουμε σαν παράμετρο μία συλλογή τύπου Collection<Square>;

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 45

Page 46: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Σημαντικές διαπροσωπείες: Comparable

• Η διαπροσωπεία Comparable: χρησιμοποιείται για καθορισμό του πως γίνεται σύγκριση αντικειμένων (π.χ., String, Date)

java.lang Interface Comparable

int compareTo(T o)

• Καθορίζει μία φυσική σειρά για τα αντικείμενα όπως ισχύει για αριθμητικά δεδομένα, π.χ., 1<2, “ab”<”ac”

• Περιλαμβάνει την μέθοδο compareTo: Συγκρίνει το αντικείμενο this με το αντικείμενο που δίνεται σαν παράμετρος

• Ακολούθως συγκρίνουμε αντικείμενα σαν να είναι αριθμοί, π.χ.,

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 46

Page 47: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Παράδειγμα Χρήσης Comparable

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 47

class ComparableCircleextends Circle implements Comparable {

public ComparableCircle(double radius) {super(radius);

}

/** Implement the compareTo method defined in Comparable */public int compareTo(Object o) {if (getRadius() > ((ComparableCircle) o).getRadius())

return 1;else if (getRadius() < ((ComparableCircle) o).getRadius())

return -1;else

return 0;}

}

Page 48: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Χρήσιμες Βιβλιοθήκες (java.lang.Math)

• Σταθερές Κλάσης:

• PI: το π = 3.1415...

• E: το e = 2.718...

• Μέθοδοι Κλάσης:

• Trigonometric Methods: π.χ., sin(double a), cos(double a)

• Exponent Methods: π.χ., log10(double a), pow(double a, double b), sqrt(double a)

• Rounding Methods: π.χ., double ceil(double x), double floor(double x)

• Other methods: min, max, abs, and random

ΕΠΛ231 – Δομές Δεδομένων και Αλγόριθμοι 48

• Παραδείγματα:Math.sin(Math.PI / 2) = 1.0

Math.cos(0) = 1.0

Math.exp(1) = 2.71

Math.log(2.71) = 1.0

Math.pow(2, 3) = 8.0

Math.ceil(2.1) = 3.0

Math.floor(2.1) = 2.0

Math.ceil(-2.1) = -2.0

Math.max(2, 3) = 3

Math.min(2.5, 3.6) = 2.5

Math.abs(-2) = 2

0 <= Math.random() < 1.0

(int)(Math.random() * 10) = [0..9]

Page 49: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Διαίσθηση

49

Client API- volume- change channel- adjust picture- decode NTSC signal

Implementation- cathode ray tube- electron gun- Sony Wega 36XBR250- 241 pounds

Η υλοποίηση και ο πελάτης πρέπει αρχικά να συμφωνήσουν στο API

Ο πελάτης χρειάζεται να γνωρίζει πώς να χρησιμοποιεί το API

Η υλοποίηση χρειάζεται να γνωρίζει το API που είναι να υλοποιηθεί

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

Page 50: ΕΠΛ231 –Δομές Δομένων και ΑλόριθμοιΕΠΛ231 –Δομές Δομένων και Αλόριθμοι 2 Διάλεξη 02: Ανʐικειμενοσʐρεφής

Διαίσθηση

50

API- volume- change channel- adjust picture- decode NTSC signal

Implementation- gas plasma monitor- Pioneer PDP-502MX- wall mountable- 4 inches deep

Μπορεί να αντικαταστήσει σε μία καλύτερη εφαρμογή χωρίς να αλλαγή στον πελάτη

Client

Ο πελάτης χρειάζεται να γνωρίζει πώς να χρησιμοποιεί το API

Η υλοποίηση χρειάζεται να γνωρίζει το API που είναι να υλοποιηθεί

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι