Εισαγωγή στη Java (Μέρος B’) Για όσους γνωρίζουν C++ Βασίλης Στούμπος
29/6/2015Εισαγωγή στη Java για όσους γνωρίζουν C++2 Περιγραφή Παρουσίασης Πληροφορίες για τη JavaΠληροφορίες για τη Java Δομή ΠρογραμμάτωνΔομή Προγραμμάτων Χαρακτηριστικά ΓλώσσαςΧαρακτηριστικά Γλώσσας Αντικειμενοστραφές Μοντέλο στη JavaΑντικειμενοστραφές Μοντέλο στη Java Διαχείριση ΜνήμηςΔιαχείριση Μνήμης Εξαιρέσεις (Exceptions)Εξαιρέσεις (Exceptions) Συγχρονισμός (Synchronization)Συγχρονισμός (Synchronization)
29/6/2015Εισαγωγή στη Java για όσους γνωρίζουν C++3 Περιγραφή Παρουσίασης Πληροφορίες για τη JavaΠληροφορίες για τη Java Δομή ΠρογραμμάτωνΔομή Προγραμμάτων Χαρακτηριστικά ΓλώσσαςΧαρακτηριστικά Γλώσσας Αντικειμενοστραφές Μοντέλο στη JavaΑντικειμενοστραφές Μοντέλο στη Java –Πακέτα, κλάσεις, διεπαφές και αντικείμενα. –Ενθυλάκωση (encapsulation). –Κληρονομικότητα. –Πολυμορφισμός. Διαχείριση ΜνήμηςΔιαχείριση Μνήμης Εξαιρέσεις (Exceptions)Εξαιρέσεις (Exceptions) Συγχρονισμός (Synchronization)Συγχρονισμός (Synchronization)
29/6/2015Εισαγωγή στη Java για όσους γνωρίζουν C++4 Πακέτα Οργάνωση κλάσεων σε πακέτα.Οργάνωση κλάσεων σε πακέτα. –Ονόματα όπως: java.io, javax.swing, org.apache, … Ορατότητα κλάσεων:Ορατότητα κλάσεων: –public –package Χρήση πακέτων με import.Χρήση πακέτων με import. Δήλωση πακέτων με package.Δήλωση πακέτων με package.
29/6/2015Εισαγωγή στη Java για όσους γνωρίζουν C++5 Κλάσεις (1) –Πεδία (fields). –Πεδία κλάσεων (class fields). –Μεθόδους (methods). –Μεθόδους κλάσεων (class methods). –Μεθόδους δημιουργίας (constructors). –Αναφορά this. public class Counter { private static int OBJECTS = 0; private static int OBJECTS = 0; int value = 0; int value = 0; public Counter() { public Counter() { this(0); this(0); } Counter(int value) { Counter(int value) { Counter.OBJECTS++; Counter.OBJECTS++; this.value = value; this.value = value; } public int increment() { public int increment() { return ++this.value; return ++this.value; }} public class Counter { private static int OBJECTS = 0; private static int OBJECTS = 0; int value = 0; int value = 0; public Counter() { public Counter() { this(0); this(0); } Counter(int value) { Counter(int value) { Counter.OBJECTS++; Counter.OBJECTS++; this.value = value; this.value = value; } public int increment() { public int increment() { return ++this.value; return ++this.value; }}
29/6/2015Εισαγωγή στη Java για όσους γνωρίζουν C++6 Κλάσεις (2) –Μπλοκ στατικής αρχικοποίησης (static initializers). –Εσωτερικές κλάσεις (inner classes). –Ανώνυμες εσωτερικές κλάσεις (anonymous inner classes). –Προσοχή: ΚλάσηΚλάση ΑντικείμενοΑντικείμενο ΑναφοράΑναφορά public class Counter { private static private static ObjectCounter OBJECTS; ObjectCounter OBJECTS; int value = 0; int value = 0; static { static { Counter.OBJECTS = Counter.OBJECTS = new ObjectCounter(); new ObjectCounter(); } private class ObjectCounter { private class ObjectCounter { //… //… }} public class Counter { private static private static ObjectCounter OBJECTS; ObjectCounter OBJECTS; int value = 0; int value = 0; static { static { Counter.OBJECTS = Counter.OBJECTS = new ObjectCounter(); new ObjectCounter(); } private class ObjectCounter { private class ObjectCounter { //… //… }}
29/6/2015Εισαγωγή στη Java για όσους γνωρίζουν C++7 Ενθυλάκωση (Encapsulation) Απόκρυψη εσωτερικής δομής με προσδιορισμό ορατότητας μελών.Απόκρυψη εσωτερικής δομής με προσδιορισμό ορατότητας μελών. Ορατότητες:Ορατότητες: –public –private –protected –package Διεπαφές (Interfaces) –Κλάσεις, χωρίς πεδία και με την δήλωση μεθόδων μόνο. –Προσδιορίζουν τρόπο χρήσης αντικειμένων. public interface Counter { public int increment(); public int increment(); public int decrement(); public int decrement(); public int getValue(); public int getValue(); public void setValue(int v); public void setValue(int v);} public interface Counter { public int increment(); public int increment(); public int decrement(); public int decrement(); public int getValue(); public int getValue(); public void setValue(int v); public void setValue(int v);}
29/6/2015Εισαγωγή στη Java για όσους γνωρίζουν C++8 Κληρονομικότητα (1) Κλασσικό παράδειγμα:Κλασσικό παράδειγμα: –Γενική (abstract) κλάση. –Ιεραρχία κλάσεων. Διαμάντι ΚληρονομικότηταςΔιαμάντι Κληρονομικότητας –Μία κλάση αποτελεί ταυτόχρονα εξειδίκευση δύο κλάσεων με κοινό πρόγονο. RectangleTriangle PolygonCircle Shape Text CircledText
29/6/2015Εισαγωγή στη Java για όσους γνωρίζουν C++9 Κληρονομικότητα (2) Circle Shape public abstract class Shape { public Shape() {…} public Shape() {…} abstract void draw(…); abstract void draw(…);} public abstract class Shape { public Shape() {…} public Shape() {…} abstract void draw(…); abstract void draw(…);} public class Circle extends Shape { Point centre; Point centre; int radius; int radius; public Circle(int radious) { public Circle(int radious) { super(); super(); } void draw(…) {…} void draw(…) {…}} public class Circle extends Shape { Point centre; Point centre; int radius; int radius; public Circle(int radious) { public Circle(int radious) { super(); super(); } void draw(…) {…} void draw(…) {…}} Text public final class Text extends Shape { extends Shape { //… //…} public final class Text extends Shape { extends Shape { //… //…} …
29/6/2015Εισαγωγή στη Java για όσους γνωρίζουν C++10 Κληρονομικότητα (3) Χρήση Διεπαφών:Χρήση Διεπαφών: –Περιγράφουμε τρόπους χρήσης. –Ένα αντικείμενο μπορεί να χρησιμοποιηθεί με πάνω από ένα τρόπους. –Δεν έχουμε προβλήματα «διαμαντιού». Αλλαγές στο Σχεδιασμό!Αλλαγές στο Σχεδιασμό! RectangleTriangle PolygonCircleSimple Text CircledText ShapeText
29/6/2015Εισαγωγή στη Java για όσους γνωρίζουν C++11 Κληρονομικότητα (4) public interface Shape { abstract void draw(…); abstract void draw(…);} public interface Shape { abstract void draw(…); abstract void draw(…);} public class Circle implements Shape { Point centre; Point centre; int radius; int radius; void draw(…) { void draw(…) { // … // … }} public class Circle implements Shape { Point centre; Point centre; int radius; int radius; void draw(…) { void draw(…) { // … // … }} public interface Text { abstract String getText(); abstract String getText();} public interface Text { abstract String getText(); abstract String getText();} Circled Text Circle ShapeText public class CircledText implements Shape, Text { implements Shape, Text { public void draw(…) {…} public void draw(…) {…} public String getText() {…} public String getText() {…}} public class CircledText implements Shape, Text { implements Shape, Text { public void draw(…) {…} public void draw(…) {…} public String getText() {…} public String getText() {…}}
29/6/2015Εισαγωγή στη Java για όσους γνωρίζουν C++12 Πολυμορφισμός Από το προηγούμενο παράδειγμα:Από το προηγούμενο παράδειγμα: –Καλούμε την draw σε μεταβλητή τύπου Shape. –Καλείται η draw του πραγματικού αντικειμένου. –Υποκλάση (extends) ή Υλοποίηση (implements). –Όλες οι μέθοδοι στη Java είναι όπως οι virtual της C++. Shape[] shapes = new Shapes[3]; shapes[0] = new CircledText(…); shapes[1] = new Triangle(…); shapes[2] = new Circle(…); for (int i=0; i<shapes.length; i++){ shapes[i].draw(); shapes[i].draw();} Shape[] shapes = new Shapes[3]; shapes[0] = new CircledText(…); shapes[1] = new Triangle(…); shapes[2] = new Circle(…); for (int i=0; i<shapes.length; i++){ shapes[i].draw(); shapes[i].draw();}
29/6/2015Εισαγωγή στη Java για όσους γνωρίζουν C++13 Περιγραφή Παρουσίασης Πληροφορίες για τη JavaΠληροφορίες για τη Java Δομή ΠρογραμμάτωνΔομή Προγραμμάτων Χαρακτηριστικά ΓλώσσαςΧαρακτηριστικά Γλώσσας Αντικειμενοστραφές Μοντέλο στη JavaΑντικειμενοστραφές Μοντέλο στη Java Διαχείριση ΜνήμηςΔιαχείριση Μνήμης –Καταστροφή αντικειμένων. –«Σκουπιδιάρης» (garbage collector). Εξαιρέσεις (Exceptions)Εξαιρέσεις (Exceptions) Συγχρονισμός (Synchronization)Συγχρονισμός (Synchronization)
29/6/2015Εισαγωγή στη Java για όσους γνωρίζουν C++14 Διαχείριση Μνήμης (1) Δημιουργία ΑντικειμένωνΔημιουργία Αντικειμένων –Μέθοδοι δημιουργίας (constructors). –Πολλοί τρόποι δημιουργίας. Αναφορά σε ΑντικείμεναΑναφορά σε Αντικείμενα –Ποτέ δεν έχουμε μεταβλητή στο πραγματικό αντικείμενο. –Όλες οι μεταβλητές είναι αναφορές. Καταστροφή;Καταστροφή; void drawWithBorder(Circle c) { int r = c.getRadius(); int r = c.getRadius(); Circle outer = new Circle(r+1); Circle outer = new Circle(r+1); c.draw(); c.draw(); outer.draw(); outer.draw();} void drawWithBorder(Circle c) { int r = c.getRadius(); int r = c.getRadius(); Circle outer = new Circle(r+1); Circle outer = new Circle(r+1); c.draw(); c.draw(); outer.draw(); outer.draw();} Circle[] list = …; for (int i=0; i<list.length; i++){ Circle c = list[i]; Circle c = list[i]; border(c); border(c);} Circle[] list = …; for (int i=0; i<list.length; i++){ Circle c = list[i]; Circle c = list[i]; border(c); border(c);}
29/6/2015Εισαγωγή στη Java για όσους γνωρίζουν C++15 void border(Circle c) { int r = c.getRadius(); int r = c.getRadius(); Circle outer = new Circle(r+1); Circle outer = new Circle(r+1); c.draw(…); c.draw(…); outer.draw(); outer.draw();} void border(Circle c) { int r = c.getRadius(); int r = c.getRadius(); Circle outer = new Circle(r+1); Circle outer = new Circle(r+1); c.draw(…); c.draw(…); outer.draw(); outer.draw();} Διαχείριση Μνήμης (2) Καταστροφή ΑντικειμένωνΚαταστροφή Αντικειμένων –Έμμεσα, μόλις παύουν να χρησιμοποιούνται. –Μετρητές αναφορών. –«Σκουπιδιάρης» (garbage collector). outer c
29/6/2015Εισαγωγή στη Java για όσους γνωρίζουν C++16 Περιγραφή Παρουσίασης Πληροφορίες για τη JavaΠληροφορίες για τη Java Δομή ΠρογραμμάτωνΔομή Προγραμμάτων Χαρακτηριστικά ΓλώσσαςΧαρακτηριστικά Γλώσσας Αντικειμενοστραφές Μοντέλο στη JavaΑντικειμενοστραφές Μοντέλο στη Java Διαχείριση ΜνήμηςΔιαχείριση Μνήμης Εξαιρέσεις (Exceptions)Εξαιρέσεις (Exceptions) –Παράδειγμα χρήσης εξαιρέσεων. –Κατηγορίες εξαιρέσεων. Συγχρονισμός (Synchronization)Συγχρονισμός (Synchronization)
29/6/2015Εισαγωγή στη Java για όσους γνωρίζουν C++17 Εξαιρέσεις (1) Διαχείριση Εξαιρετικών ΠεριπτώσεωνΔιαχείριση Εξαιρετικών Περιπτώσεων –Μη κανονική λειτουργία μόνο. ΠαραδείγματαΠαραδείγματα –Δεν υπάρχει το αρχείο. –Χάθηκε η σύνδεση. –Διαίρεση με το μηδέν. –… Κατηγορίες –Κρίσιμα λάθη (error/failure) –Εξαιρέσεις κατά την εκτέλεση (runtime exception) –Εξαιρέσεις Εφαρμογής (exception) Κάθε φορά που υπάρχει εξαίρεση χρειάζεται ειδικός χειρισμός (exception handling).
29/6/2015Εισαγωγή στη Java για όσους γνωρίζουν C++18 Εξαιρέσεις (2) InputStream in = null; try { in = new FileInputStream( in = new FileInputStream( new File(“file.dat”)); new File(“file.dat”)); } catch(FileNotFoundException fnfe) { // … // … } catch(SecurityException se) { // … // … } finally { // … // …} InputStream in = null; try { in = new FileInputStream( in = new FileInputStream( new File(“file.dat”)); new File(“file.dat”)); } catch(FileNotFoundException fnfe) { // … // … } catch(SecurityException se) { // … // … } finally { // … // …} java.lang. Throwable java.lang. Error java.lang. Exception java.lang. Runtime Exception ex
29/6/2015Εισαγωγή στη Java για όσους γνωρίζουν C++19 Περιγραφή Παρουσίασης Πληροφορίες για τη JavaΠληροφορίες για τη Java Δομή ΠρογραμμάτωνΔομή Προγραμμάτων Χαρακτηριστικά ΓλώσσαςΧαρακτηριστικά Γλώσσας Αντικειμενοστραφές Μοντέλο στη JavaΑντικειμενοστραφές Μοντέλο στη Java Διαχείριση ΜνήμηςΔιαχείριση Μνήμης Εξαιρέσεις (Exceptions)Εξαιρέσεις (Exceptions) Συγχρονισμός (Synchronization)Συγχρονισμός (Synchronization) –Νήματα (threads). –Κλειδώματα σε κοινούς πόρους.
29/6/2015Εισαγωγή στη Java για όσους γνωρίζουν C++20 Νήματα ΝήμαΝήμα –Ένα νήμα είναι μία ροή ελέγχου. –Η εκτέλεση της main γίνεται σε ένα νήμα. –Ο «σκουπιδιάρης» δουλεύει σε ένα νήμα. –«Αύξηση» απόδοσης προγραμμάτων. –Δυνατότητα για πολύπλοκες εφαρμογές. Νήμα στη Java –Κλάση java.lang.Thread και διεπαφή java.lang.Runnable. –Επεκτείνουμε την κλάση ή υλοποιούμε τη διεπαφή για να φτιάξουμε δικό μας νήμα. Ζητήματα: –Πληροφορία & Συγχρονισμός.
29/6/2015Εισαγωγή στη Java για όσους γνωρίζουν C++21 Επέκταση Thread public class ThreadTest { public static void main(String[] s) { public static void main(String[] s) { PrintThread t1 = PrintThread t1 = new PrintThread(“a”); new PrintThread(“a”); PrintThread t1 = PrintThread t1 = new PrintThread(“b”); new PrintThread(“b”); t1.start(); t1.start(); t2.start(); t2.start(); try { try { t1.join(); t1.join(); t2.join(); t2.join(); } catch(InterruptedException ie) {} } catch(InterruptedException ie) {} }} public class ThreadTest { public static void main(String[] s) { public static void main(String[] s) { PrintThread t1 = PrintThread t1 = new PrintThread(“a”); new PrintThread(“a”); PrintThread t1 = PrintThread t1 = new PrintThread(“b”); new PrintThread(“b”); t1.start(); t1.start(); t2.start(); t2.start(); try { try { t1.join(); t1.join(); t2.join(); t2.join(); } catch(InterruptedException ie) {} } catch(InterruptedException ie) {} }} public class PrintThread extends Thread { extends Thread { String msg; String msg; public PrintThread(String msg) { public PrintThread(String msg) { super(); super(); this.msg = msg; this.msg = msg; } public void run() { public void run() { for (int k=0; k<100; k++) { for (int k=0; k<100; k++) { System.out.println( System.out.println( “[” + k + “] ” + this.msg); “[” + k + “] ” + this.msg); } }} public class PrintThread extends Thread { extends Thread { String msg; String msg; public PrintThread(String msg) { public PrintThread(String msg) { super(); super(); this.msg = msg; this.msg = msg; } public void run() { public void run() { for (int k=0; k<100; k++) { for (int k=0; k<100; k++) { System.out.println( System.out.println( “[” + k + “] ” + this.msg); “[” + k + “] ” + this.msg); } }}
29/6/2015Εισαγωγή στη Java για όσους γνωρίζουν C++22 Υλοποίηση Runnable public class ThreadTest { public static void main(String[] s) { public static void main(String[] s) { PrintThread t1 = new Thread( PrintThread t1 = new Thread( new PrintThread(“a”)); new PrintThread(“a”)); PrintThread t1 = new Thread( PrintThread t1 = new Thread( new PrintThread(“b”)); new PrintThread(“b”)); t1.start(); t1.start(); t2.start(); t2.start(); try { try { t1.join(); t1.join(); t2.join(); t2.join(); } catch(InterruptedException ie) {} } catch(InterruptedException ie) {} }} public class ThreadTest { public static void main(String[] s) { public static void main(String[] s) { PrintThread t1 = new Thread( PrintThread t1 = new Thread( new PrintThread(“a”)); new PrintThread(“a”)); PrintThread t1 = new Thread( PrintThread t1 = new Thread( new PrintThread(“b”)); new PrintThread(“b”)); t1.start(); t1.start(); t2.start(); t2.start(); try { try { t1.join(); t1.join(); t2.join(); t2.join(); } catch(InterruptedException ie) {} } catch(InterruptedException ie) {} }} public class PrintThread implements Runnable { implements Runnable { String msg; String msg; public PrintThread(String msg) { public PrintThread(String msg) { this.msg = msg; this.msg = msg; } public void run() { public void run() { for (int k=0; k<100; k++) { for (int k=0; k<100; k++) { System.out.println( System.out.println( “[” + k + “] ” + this.msg); “[” + k + “] ” + this.msg); } }} public class PrintThread implements Runnable { implements Runnable { String msg; String msg; public PrintThread(String msg) { public PrintThread(String msg) { this.msg = msg; this.msg = msg; } public void run() { public void run() { for (int k=0; k<100; k++) { for (int k=0; k<100; k++) { System.out.println( System.out.println( “[” + k + “] ” + this.msg); “[” + k + “] ” + this.msg); } }}
29/6/2015Εισαγωγή στη Java για όσους γνωρίζουν C++23 Κοινοί Πόροι –Κατά την δημιουργία των νημάτων δίνεται αναφορά στον κοινό πόρο. –Τα νήματα πρέπει να έχουν «συγχρονισμένα» πρόσβαση στον κοινό πόρο. –Χρησιμοποιούμε synchronized μπλοκ. public class Resources { public synchronized public synchronized Resource consume(); Resource consume(); public void synchronized public void synchronized produce(Resource r); produce(Resource r);} public class Resources { public synchronized public synchronized Resource consume(); Resource consume(); public void synchronized public void synchronized produce(Resource r); produce(Resource r);}