Αντικειμενοστραφής Προγραμματισμός ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Ενότητα 6: Κληρονομικότητα, Interfaces και I/O Δρ. Χαράλαμπος Ζ. Πατρικάκης Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε Κάντε κλικ για να ξεκινήσετε
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3
Ευχαριστίες Στην ανάπτυξη του υλικού βοήθησαν οι φοιτητές Λάζαρος Τουμανίδης, Λίλιαν Γούσιου και ο βοηθός εργαστηρίου Κόγιας Δημήτριος. 4
Βιβλιογραφία Harvey Deitel,Paul Deitel, «Java Προγραμματισμός, 8η έκδοση», Γκιούρδας, 2010. Γιώργος Λιακέας, «Εισαγωγή στη Java», Κλειδάριθμος, 2009. Χρήστος Κυτάγιας, Κώστας Δ. Κυτάγιας, Γιώργος Πρεζεράκος, Δημήτρης Κυτάγιας, «Αντικειμενοστραφής Προγραμματισμός με Java», Σύγχρονη Εκδοτική, 2013. Wanda Dann, Stephen Cooper, and Randy Pausch, «Learning to program with Alice» 3rd edition, Pearson Education, 2012. Michael Kölling, «Introduction to Programming with Greenfoot». «Object-Oriented Programming in Java with Games and Simulations», Pearson Education, August 2009. Οι σημειώσεις είναι βασισμένες και σε υλικό του καθηγητή του ΤΕΙ Πειραιά Γ. Πρεζεράκου. 5
Περιεχόμενα 6.1 Κληρονομικότητα 6.2 Interfaces (Διεπαφές) 6.3 Είσοδος Έξοδος (I/O) 6
Προσδοκώμενα Αποτελέσματα Στην ενότητα αυτή θα μάθετε για: Την έννοια και την χρήση της κληρονομικότητας, Τον τρόπο χρήσης των διεπαφών, Τις εντολές για προσδιορισμό του τρόπου εισόδου και εξόδου σε ένα πρόγραμμα. 7
6.1 Κληρονομικότητα 8
Βασική Κλάση Φτιάχνοντας ένα παιχνίδι: Φτιάχνουμε μια κλάση για τη δημιουργία ενός χαρακτήρα. public class Person { public String name; public int hp = 100; public int mp = 0; public void sayname() { System.out.println(name); public void punchface(person target) { target.hp -= 10; 9
Κληρονομικότητα Τώρα φτιάχνουμε ένα Μάγο (Wizard)... public class Wizard { // πρέπει να αντιγράψουμε τον κώδικα // από την κλάση Person. // Θα μπορούσε να αποφευχθεί; 10
Κληρονομικότητα; Τώρα φτιάχνουμε ένα Μάγο (Wizard)... Αλλά περιμένετε! Ένας Μάγος μπορεί και κάνει οτιδήποτε ένας Person μπορεί και κάνει! 11
Κληρονομικότητα; Τώρα φτιάχνουμε ένα Μάγο (Wizard)... Μην δράσετε αμέσως! Δε χρειάζεται να κάνετε αντιγραφή και επικόλληση! 12
Χρήση Κληρονομικότητας Ο Wizard είναι μία υποκατηγορία της κλάσης Person public class Wizard extends Person { 13
Κληρονομικότητα Ο Wizard μπορεί να χρησιμοποιήσει ό,τι* το Person έχει! wizard1.hp += 1; O Wizard μπορεί να κάνει ό,τι* το Person κάνει! wizard1.punchface (person1); Μπορείτε να χρησιμοποιήσετε ένα Wizard όπως και ένα Person επίσης! person1.punchface(wizard1); *εκτός των ιδιωτικών πεδίων και μεθόδων 14
Κληρονομικότητα Τώρα αυξάνει ένα Wizard public class Wizard extends Person { public void cast(string spell) { // κώδικας της μεθόδου... mp -= 10; 15
Κληρονομώντας από Κλάσεις που Έχουν Κληρονομήσει Τι συμβαίνει με το Grand Wizard; public class GrandWizard extends Wizard { public void sayname() { System.out.println( Grand wizard + name) grandwizard1.name = Flash grandwizard1.sayname(); ((Person)grandWizard1).sayName(); 16
Πως το Καταφέρνει Αυτό η Java; Πως συμπεριφέρεται η Java όταν βλέπει grandwizard1.punchface(person1) 1. Ψάχνει για punchface() στην κλάση GrandWizard. 2. Δεν είναι εδώ! Έχει το GrandWizard κληρονομιά; 3. Ναι. Ψάχνει για punchface() στην κλάση Wizard. 4. Δεν είναι εδώ! Έχει το Wizard κληρονομιά; 5. Ναι. Ψάχνει το punchface() στην κλάση Person. 6. To βρήκε! Καλεί το punchface() 7. Αφαιρεί hp από το person1 17
Πως το καταφέρνει αυτό η Java; Πως συμπεριφέρεται η Java όταν βλέπει ((Person)grandWizard1).sayName() 1. Η μετατροπή σε Person λέει στην Java να αναζητήσει αρχικά τη μέθοδο στην κλάση Person. 2. Ψάχνει για το sayname() στην κλάση Person. 3. To βρήκε! Καλεί το sayname() 18
Τι Συμβαίνει στο Παράδειγμα μας; Πατέρας των Wizard και Elf. Person Παιδί του Person. Wizard Thief Elf Παιδί του Wizard. Grand Wizard 19
Μπορείτε να Κληρονομήσετε Μόνο από μία Κλάση 20
Μπορείτε να Κληρονομήσετε Μόνο από μία Κλάση 21
Μπορείτε να Κληρονομήσετε Μόνο από μία Κλάση Έστω ότι τόσο η κλάση Thief όσο και η κλάση Elf έχουν μια μέθοδο: public void sneakup(), την οποία και υλοποιούν με διαφορετικό τρόπο. Αν η κλάση Bad Elf καλούσε τη μέθοδο sneakup() τότε ποια υλοποίηση θα έπρεπε να πραγματοποιηθεί; 22
Για να Διαβάσετε Περισσότερα: http://java.sun.com/docs/books/tutorial/java/iandi/subclasses.html http://home.cogeco.ca/~ve3ll/jatutor5.htm http://en.wikipedia.org/wiki/inheritance_(computer_science) http://www.google.com 23
6.2 Διεπαφές (Interfaces) 24
Υλοποίηση/ Διεπαφή 25
Διεπαφές Java Με τις διεπαφές μπορείτε να χειριστείτε τα αντικείμενα, χωρίς να γνωρίζετε πως λειτουργούν. Είναι ωφέλιμο να έχετε παρόμοια αλλά όχι ταυτόσημα αντικείμενα. Είναι ωφέλιμο να χρησιμοποιείτε κώδικα γραμμένο από άλλους. 26
Παράδειγμα Διεπαφής: Σχεδιασμός ενός Κουτιού public class BouncingBox { public void draw(graphics surface) { // κώδικας σχεδιασμού ενός κουτιού // Σχεδιασμός κουτιών for (BouncingBox box : boxes) { box.draw(surface); 27
Παράδειγμα Διεπαφής: Σχεδιασμός ενός Λουλουδιού public class Flower { public void draw(graphics surface) { // κώδικας σχεδιασμού ενός λουλουδιού // Σχεδιασμός λουλουδιών for (Flower flower : flowers) { flower.draw(surface); 28
Παράδειγμα public class DrawGraphics { ArrayList<BouncingBox> boxes = new ArrayList<BouncingBox>(); ArrayList<Flower> flowers = new ArrayList<Flower>(); ArrayList<Car> cars = new ArrayList<Car>(); public void draw(graphics surface) { for (BouncingBox box : boxes) { box.draw(surface); for (Flower flower : flowers) { flower.draw(surface); for (Car car : cars) { car.draw(surface); 29
Παράδειγμα public class DrawGraphics { ArrayList<Drawable> shapes = new ArrayList<Drawable>(); ArrayList<Flower> flowers = new ArrayList<Flower>(); ArrayList<Car> cars = new ArrayList<Car>(); public void draw(graphics surface) { for (Drawable shape : shapes) { shape.draw(surface); for (Flower flower : flowers) { flower.draw(surface); for (Car car : cars) { car.draw(surface); 30
Διεπαφές Συλλογές κλάσεων που μοιράζονται μεθόδους. Δηλώνετε μία διεπαφή με μία συνήθη μέθοδο. Μπορείτε στη συνέχεια να χρησιμοποιήσετε την διεπαφή, χωρίς να ξέρετε το συγκεκριμένο τύπο του αντικειμένου. 31
Διεπαφές: Σχεδιάζοντας Σχήματα import java.awt.graphics; interface Drawable { void draw(graphics surface); void setcolor(color color); 32
Υλοποιώντας Διεπαφές Οι υλοποιήσεις των διεπαφών παρέχουν πλήρεις μεθόδους: import java.awt.graphics; class Flower implements Drawable { //... Υπόλοιπος κώδικας... public void draw(graphics surface) { //... Κώδικας σχεδιασμού flower εδώ... 33
Παρατηρήσεις Έχουν μόνο μεθόδους (ως επί το πλείστον αληθές). Δεν παρέχουν κώδικα, μόνο τον ορισμό (ονομάζονται υπογραφές). Μία κλάση μπορεί να εκτελέσει έναν αριθμό διεπαφών. 34
6.3 Είσοδος Έξοδος (I/O) 35
Ένας Τρόπος Εξόδου που Γνωρίζουμε System.out.println( some string ); 36
Η Ολοκληρωμένη Εικόνα 37
InputStream InputStream είναι μια σειρά από bytes Διαβάζει το ένα Βyte μετά το άλλο με χρήση του read(). Ένα byte είναι απλά ένας αριθμός Τα δεδομένα του σκληρού σας δίσκου αποθηκεύονται σε Βytes. Τα Bytes μπορούν να ερμηνευτούν ως χαρακτήρες, αριθμοί InputStream stream = System.in; 38
InputStreamReader O Reader είναι μια κλάση για μια σειρά χαρακτήρων Διαβάζει τον ένα χαρακτήρα μετά τον άλλο με χρήση του read() To InputStreamReader παίρνει ένα InputStream και μετατρέπει τα bytes σε χαρακτήρες Και πάλι δεν είναι πολύ βολικό: Μπορεί να διαβάσει μόνο ένα χαρακτήρα τη φορά new InputStreamReader(stream) 39
BufferReader Ο BufferReader ρυθμίζει μία σειρά χαρακτήρων ώστε να μπορείτε να διαβάσετε τη μία σειρά μετά την άλλη - String readline() new BufferedReader( new InputStreamReader(System.in)); 40
Είσοδος Χρήστη InputStreamReader ir = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(ir); br.readline(); 41
FileReader Ο FileReader παίρνει ένα αρχείο κειμένου - Το μετατρέπει σε σειρά χαρακτήρων. - FileReader( PATH TO FILE ); Χρησιμοποιήστε αυτό καθώς και τον BufferReader για να διαβάσετε αρχεία! FileReader fr = new FileReader( readme.txt ); BufferedReader br = new BufferedReader(fr); 42
Κώδικας FileReader import java.io.bufferedreader; import java.io.filereader; import java.io.ioexception; public class ReadFile { public static void main(string[] args) throws IOException { // Τα ονόματα των διαδρομών είναι σχετικά με τη θέση του φακέλου του project FileReader fr = new FileReader("./src/readme"); BufferedReader br = new BufferedReader(fr); String line = null; while ((line = br.readline())!= null) { System.out.println(line); br.close(); 43
Για περισσότερα σχετικά με Ι/Ο http://java.sun.com/docs/books/tutorial/essential/io/ 44
Εργασία Μαγικά Τετράγωνα Διαβάστε δύο αρχεία Ελέγξτε ότι όλες οι σειρές και οι στήλες έχουν άθροισμα 15 45
Σε αυτή την ενότητα μιλήσαμε για: 6.1 Κληρονομικότητα 6.2 Interfaces (Διεπαφές) 6.3 Είσοδος Έξοδος (I/O) 47
Αντικειμενοστραφής Προγραμματισμός ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Ενότητα 6: Κληρονομικότητα, Interfaces και I/O Δρ. Χαράλαμπος Ζ. Πατρικάκης Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε