Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
ΔημοσίευσεΛυσάνδρα Ανδρέου Τροποποιήθηκε πριν 8 χρόνια
1
Εισαγωγή στον Προγ/μό Η/Υ Ενότητα 7 – 2ο μέρος: Επιπλέον έννοιες σχετικά με αντικείμενα Διδάσκων: Μιχάλης Τίτσιας
2
Περιεχόμενα Τι μπορεί να περιέχει μια τάξη Μέθοδοι τάξης και σταθερές τάξης Πολυμορφισμός Κληρονομικότητα και προσπέλαση Κληρονομικότητα ως εξέλιξη ή ως εξειδίκευση Παύση της κληρονομικότητας H τάξη Object και η μέθοδος equals Πακέτα και οργάνωση τάξεων
3
Τι μπορεί να περιέχει μια τάξη Μεταβλητές στιγμιοτύπου: Καταγράφουν τα δεδομένα του αντικειμένου και αλλάζουν από αντικείμενο (δηλ. στιγμιότυπο της τάξης) σε αντικείμενο. Πχ num και den σε αντικείμενα της Rational είναι μεταβλητές στιγμιοτύπου. Κατασκευαστές. Μεθόδους στιγμιοτύπου: Μηνύματα που στέλνονται σε σε συγκεκριμένα αντικείμενα. Πχ r1.toString() όπου r1 αντικείμενο της τάξης Rational. Μεθόδους τάξης (στατικές μέθοδοι τάξης): Μηνύματα που στέλνονται στην τάξη. Σταθερές τάξης: Σταθερές κοινές για όλα τα αντικείμενα της τάξης.
4
Τι μπορεί να περιέχει μια τάξη public class X { private int n; private int d; public X(int a, int b) { n = a; d = b; } public String toString() { return n+d; } public void method1(arguments) { …} public static int method2(arguments) { …..} public final static double E = 2.7; } Μεταβλητές στιγμιοτύπου Κατασκευαστής Μέθοδος στιγμιοτύπου Μέθοδος τάξης Σταθερά τάξης
5
Μέθοδοι και σταθερές τάξης Η δεσμευμένη λέξη static είναι αυτή που καθορίζει της μεθόδους τάξης και σταθερές τάξης. Με τη σύνταξη ClassName.namemethod(arguments); ClassName.namevar; μπορούμε να καλέσουμε μια μέθοδο τάξης ή να αναφερθούμε σε μια σταθερά τάξης αντίστοιχα. Πχ σε ένα πρόγραμμα που χρησιμοποιεί την τάξη X που ορίσαμε στην προηγούμενη διαφάνεια θα μπορούσε να εμφανίζονται τις εντολές X.method2(arguments); double n1 = X.E;
6
Μέθοδοι τάξης: Παραδείγματα απο java.lang.*
7
Σταθερές τάξης: Παραδείγματα από java.* Math.PI // π (τύπου double) Math.E // e (τύπου double) Integer.MAX_VALUE // Η μεγαλύτερη τιμή int System.out // Αντικείμενο τάξης PrintStream π.χ., System.out.println(”Hello world”); System.in // Αντικείμενο τάξης InputStream π.χ., Scanner sc = new Scanner(System.in); int i = sc.nextInt(); // Ανάγνωση ακέραιας τιμής // από τον χρήστη
8
Σταθερές τάξης: Παραδείγματα από την γνωστή μας τάξη Color Χρώματα όπως Color.RED, Color.BLACK, κτλ.
9
Πολυμορφισμός Πολυμορφισμό έχουμε όταν η ίδια μέθοδος ή ο ίδιος τελεστής χρησιμοποιείται με διαφορετικούς τύπους δεδομένων. Για παράδειγμα ο τελεστής + είναι πολυμορφικός διότι μπορεί να χρησιμοποιηθεί με αριθμητικά δεδομένα αλλά και για την συνένωση αλφαριθμητικών. Πχ 3 + 4 “Hello” + “World” Στον αντικειμενοστρεφή προγραμματισμό ο πολυμορφισμός εμφανίζεται ως συνέπεια της κληρονομικότητας και του γεγονότος ότι η ίδια μέθοδος μπορεί να έχει διαφορετική λειτουργία σε διαφορετικά αντικείμενα.
10
Πολυμορφισμός public class Polymorphism extends Program { public void run() { Object obj1 = new Object(); println(obj1.toString()); Counter obj2 = new Counter(); println(obj2.toString()); } Στο πρόγραμμα παρακάτω η μέθοδος toString εμφανίζει πολυμορφισμό διότι στην πρώτη κλήση println(obj1.toString()) οδηγεί στην κλήση της toString που έχει οριστεί στην τάξη Object, ενώ στην δεύτερη περίπτωση println(obj2.toString()) οδηγεί στην κλήση της toString που έχει οριστεί στην τάξη Counter (ή οποία παρακάμπτει την αρχική toString).
11
Πολυμορφισμός Ο αποστολέας μηνυμάτων στα αντικείμενα δε χρειάζεται να ξέρει πως αυτά συμπεριφέρονται. Η χρήση αντικειμένων παλιών όσο και μελλοντικών τάξεων, από τον ίδιο κώδικα είναι δυνατή. Πχ αν είχαμε μια προγενέστερη έκδoση της Counter όπου η toString δεν είχε οριστεί τότε η εντολή println(obj2.toString()); στο ίδιο κυρίως πρόγραμμα της προηγούμενης διαφάνειας θα είχε διαφορετική λειτουργία αφού τώρα θα γινόταν κλήση στην toString της τάξης Object.
12
Κληρονομικότητα και προσπέλαση Όταν δημιουργούμε μια υποκλάση που επεκτείνει μια υπάρχουσα υπερ-τάξη, τότε όλες οι μέθοδοι και τα δεδομένα της υπέρ-τάξης (μεταβλητές και σταθερές) κληρονομούνται στην υποκλάση. Ωστόσο το παραπάνω δεν σημαίνει ότι αντικείμενα της υπο-τάξης έχουν αυτομάτως πρόσβαση σε όλες τις μεθόδους και δεδομένα της υπέρ-τάξης. Αυτό εξαρτάται από το πώς έχει οριστεί η προσπέλαση (public, private κτλ). Για παράδειγμα αν στην υπέρ-τάξη υπάρχουν οι δηλώσεις μεταβλητών στιγμιοτύπου private int x; private int y; τότε αντικείμενα μιας υπό-τάξης δεν έχουν άμεση πρόσβαση στις τιμές αυτές. Πχ αν a είναι ένα αντικείμενο της υπό-τάξης τότε οι εντολές int n1= a.x*5; ή a.x++ θα οδηγούσαν σε σφάλμα κατά την μεταγλώττιση. Προκειμένου αντικείμενα της υπό-τάξης να αποκτήσουν πρόσβαση στις παραπάνω τιμές είτε θα αλλάξουμε τους ορισμούς στην υπέρ-τάξης ώστε protected int x; protected int y; το οποίο ενδεχομένως να μην είναι και τόσο καλή λύση (από την σκοπιά της αντικειμεστρεφούς σχεδίασης). Είτε θα ορίσουμε ειδικές μεθόδους στην υπέρ-τάξη της μορφής getValue και setValue με τις οποίες θα έχουμε (έμμεση) πρόσβαση στις τιμές x,y.
13
Η RandomGeneratorImproved είναι πιο εξελιγμένο «είδος» από τη RandomGenerator αφού κάνει ότι και η δεύτερη συν κάποιες επιπλέον λειτουργίες. Κληρονομικότητα ως εξέλιξη RandomGenerator RandomGeneratorImproved «Εξελίσσει την»
14
Η Circle είναι ένα Shape. Κληρονομικότητα ως εξειδίκευση Shape area perimeter Circle area perimeter «Είναι»
15
Οι Circle και Square είναι Shape. Εδώ σε κάθε εξειδίκευση θα πρέπει να ξανά-οριστούν οι μέθοδοι area και perimeter. Κληρονομικότητα ως εξειδίκευση Shape area perimeter Circle area perimeter «Είναι» Square area perimeter «Είναι»
16
Κληρονομικότητα ως εξειδίκευση class Shape { public double area() { return -1.0; } public double perimeter() { return -1.0; } } Αντικείμενα Shape δεν έχουν νόημα. Μόνο αντικείμενα εξειδικευμένων ταξεών της (π.χ., Circle, Square) έχουν. Εντούτοις αναφορές σε Shape είναι χρήσιμες γιατί μπορούμε να γράφουμε «γενικό» κώδικα που θα δουλεύει στο μέλλον με όλα τα αντικείμενα κληρονόμων τάξεων (στα οποία αυτές οι αναφορές θα αναφέρονται.)
17
Κληρονομικότητα ως εξειδίκευση class Circle extends Shape { double r; // μήκος ακτίνας final double pi = 3.1415927; public double area() { return pi*r*r; } public double perimeter() { return 2*pi*r; } public Circle(double p) { r = p; } } class Square extends Shape { double s; // μήκος πλευράς public double area() { return s*s; } public double perimeter() { return 4*s; } public Square(double p) { s = p; } }
18
Κληρονομικότητα ως εξειδίκευση: Αφηρημένες τάξεις/μέθοδοι Ο προγραμματιστής μπορεί να δημιουργεί αφηρημένες (abstract) τάξεις. – Η χρήση αναφορών αφηρημένων τάξεων επιτρέπεται Στις εξειδικευμένες τάξεις (π.χ., Square, Circle), πρέπει να οριστούν οι αφηρημένες μέθοδοι. abstract class Shape { public abstract double area(); // Αφηρημένη μέθοδος public abstract double perimeter(); // Αφηρημένη μέθοδος public String toString() { // Μη αφηρημένη μέθοδος return ”Γειά σου, είμαι ένα σχήμα”; }
19
Παύση της κληρονομικότητας Δεν επιτρέπεται η εξέλιξη της RationalV2 public final class RationalV2 extends Rational { public RationalV2(int a, int b) { super(a, b); } public String toString() {return 2*n+”/”+2*d;} } Μπορούμε να κατασκευάζουμε αντικείμενα της RationalV2 αλλά δεν μπορούμε να την επεκτείνουμε, δηλ. τα ορίσουμε υποκλάσεις της. Στην Java ο τύπος δεδομένων String έχει οριστεί ως final class.
20
Η πρωταρχική τάξη Object Μπορούμε να γράφουμε «γενικό» κώδικα για αντικείμενα οποιασδήποτε τάξης; Ναι! Όλες οι τάξεις κληρονομούν την Object: class X { class X extends Object { … ισοδύναμο με … } Μηνύματα της Object (υποστηρίζονται από όλα τα αντικείμενα κάθε τάξης): toString(), equals(Object b), …
21
Μηνύματα τάξης Object obj1.toString() Επιστρέφει String που περιγράφει το αντικείμενο: τάξη@μοναδικό_αναγνωριστικό Object toString() String αναφ. Object obj1
22
Μηνύματα τάξης Object obj1.toString() Επιστρέφει String που περιγράφει το αντικείμενο, εάν οριστεί ξανά η toString() στην τάξη X X toString() String αναφ. Object obj1
23
Μηνύματα τάξης Object Integer obj1 = new Integer(32); println(obj1.toString()); Integer toString() ”32” αναφ. Integer obj1 32
24
Μηνύματα τάξης Object obj1.equals(obj2) Η equals της Object επιστρέφει true εάν τα obj1, obj2 είναι ίσα Δηλαδή true, εάν αναφέρονται στο ίδιο αντικείμενο equals(obj2) boolean obj1 αναφ. Object
25
Μηνύματα τάξης Object obj1.equals(obj2) Συνήθως αλλάζουμε την equals έτσι ώστε να είναι true εάν τα αντικείμενα που αναφέρονται οι αναφορές obj1, obj2 είναι ίσα. (Χωρίς να είναι κατ’ανάγκη ίδια.) X equals(obj2) boolean obj1 αναφ. Object
26
Μηνύματα τάξης Object Integer obj1 = new Integer(32); Integer obj2 = new Integer(32); println(obj1.equals(obj2)); // Όμως obj1 != obj2 Integer equals(obj2) true obj1 obj2 Integer 32 αναφ. Integer αναφ. Integer
27
Μηνύματα τάξης Object Παράδειγμα: public void run() { Rational r1 = new Rational(1,2); Rational r2 = new Rational(2,4); println(r1.equals(r2)); }
28
Μηνύματα τάξης Object Αντικατάσταση του equals στη RationalV3: class RationalV2 extends Rational { public boolean equals(Object obj) { if ( obj instanceof Rational ) { // τελεστής instanceof Rational r = (Rational) obj; return n*r.d == d*r.n; } else return false; } Η boolean έκφραση obj instanceof X είναι true εάν και μόνο εάν το obj είναι αντικείμενο Χ ή υπο-τάξης της X.
29
Μηνύματα τάξης Object Δοκιμή με RationalV3: public void run() { RationalV3 r1 = new RationalV3(1,2); Rational r2 = new Rational(2,4); println(r1.equals(r2)); // Εμφανίζει true! println(r1.equals(”1/2”)); // Εμφανίζει false }
30
Οργάνωση τάξεων στη Java πακέτο: σύνολο από σχετιζόμενες τάξεις java.lang java.util acm.program aueb.math Rational RationalV2 Program String Scanner RationalV3 String Scanner Program
31
Πρόσβαση μεταξύ πακέτων packageBD packageAC public class A { public int i; private int j; int k; protected int m; … } class C { C() { A a; a.i = 1; a.k = 2; } … } class B extends A { B() { i = 1; m = 3; } … } class D { D() { A a; a.i = 1; } … }
32
Πρόσβαση μεταξύ πακέτων packageBD packageAC public class A { public int i; private int j; int k; protected int m; … } class C { C() { A a; a.i = 1; a.k = 2; } … } class B extends A { B() { i = 1; m = 3; } … } class D { D() { A a; a.i = 1; } … }
33
Πρόσβαση μεταξύ πακέτων packageBD packageAC public class A { public int i; private int j; int k; protected int m; … } class C { C() { A a; a.i = 1; a.k = 2; } … } class B extends A { B() { i = 1; m = 3; } … } class D { D() { A a; a.i = 1; } … }
34
Πρόσβαση μεταξύ πακέτων packageBD packageAC public class A { public int i; private int j; int k; protected int m; … } class C { C() { A a; a.i = 1; a.k = 2; } … } class B extends A { B() { i = 1; m = 3; } … } class D { D() { A a; a.i = 1; } … }
35
Πρόσβαση μεταξύ πακέτων packageBD packageAC public class A { public int i; private int j; int k; protected int m; … } class C { C() { A a; a.i = 1; a.k = 2; a.m= 3; }… } class B extends A { B() { i = 1; m = 3; } … } class D { D() { A a; a.i = 1; } … }
36
Οργάνωση τάξεων στη Java Ιεραρχική οργάνωση ονομάτων τάξεων – Π.χ.: java.lang.String, java.util.Scanner, acm.program.Program, aueb.math.RationalV2 Ιεραρχική οργάνωση αρχείων.class (για μεταγλώττιση & εκτέλεση)
37
πακέτο: σύνολο από σχετιζόμενες τάξεις Ιεραρχική οργάνωση αρχείων CLASSPATH = java lang util … lang util program math … Rational.class RationalV2.class … Program.class ConsoleProgram.class … Scanner.class … String.class … RationalV3.class … C:\dir1 java … acm … program … aueb … math … F:\local acm aueb …
38
πακέτο: σύνολο από σχετιζόμενες τάξεις Ιεραρχική οργάνωση αρχείων CLASSPATH = java lang util … lang util program math … Rational.class RationalV2.class … Program.class ConsoleProgram.class … Scanner.class … String.class … RationalV3.class … C:\dir1 java … acm … program … F:\local acm aueb … aueb … math …
39
πακέτο: σύνολο από σχετιζόμενες τάξεις Ιεραρχική οργάνωση αρχείων CLASSPATH = java lang util … lang util math … Rational.class RationalV2.class … Scanner.class … String.class … RationalV3.class … C:\dir1 java … F:\local aueb … aueb … math … acm.jar
40
πακέτο: σύνολο από σχετιζόμενες τάξεις Ιεραρχική οργάνωση αρχείων CLASSPATH = java lang util … lang util math … Rational.class RationalV2.class … Scanner.class … String.class … RationalV3.class … C:\dir1 java … F:\local aueb … aueb … math … acm.jar > cd F:\local > jar –cf aueb.jar aueb
41
πακέτο: σύνολο από σχετιζόμενες τάξεις Ιεραρχική οργάνωση αρχείων CLASSPATH = java lang util … lang util … Scanner.class … String.class … C:\dir1 java … F:\local aueb.jar aueb … acm.jar > cd F:\local > jar –cf aueb.jar aueb
42
πακέτο: σύνολο από σχετιζόμενες τάξεις Ιεραρχική οργάνωση αρχείων CLASSPATH = java lang util … lang util … Scanner.class … String.class … C:\dir1 java … F:\local aueb … acm.jaraueb.jar
43
Οργάνωση τάξεων στη Java Αρχείο Rational.java: package aueb.math; // Οι ορισμοί που ακολουθούν είναι μέρος του πακέτου aueb.math public class Rational { // Πλήρες όνομα τάξης: aueb.math.Rational int n; int d; public Rational(int a, int b) { n = a; d = b; } public String toString() { return n+”/”+d; } public void add(Rational r) { n = n*r.d+d*r.n; d = d*r.d; }
44
Οργάνωση τάξεων στη Java Αρχείο RationalV2.java: package aueb.math; // Οι ορισμοί που ακολουθούν είναι μέρος του πακέτου aueb.math public class RationalV2 extends Rational { // πλήρες όνομα: aueb.math.RationalV2 public RationalV2(int a, int b) { super(a, b); } public String toString() {reduce(); return n+”/”+d;} void reduce() {int m = gcd(n, d); n /= m; d /= m; } int gcd(int a, int b) { if ( a == 0 ) return b; return b>a ? gcd(b,a) : gcd(a%b, b); }
45
Οργάνωση τάξεων στη Java Αρχείο Test.java: // δεν υπάρχει package.. = ανήκει στο «κενό» πακέτο import acm.program.*; public class Test extends Program { public void run() { aueb.math.Rational r1 = new aueb.math.Rational(1,2); println(r1.toString()); }
46
Οργάνωση τάξεων στη Java Αρχείο Test.java: // δεν υπάρχει package.. = ανήκει στο «κενό» πακέτο import acm.program.*; import aueb.math; public class Test extends Program { public void run() { Rational r1 = new Rational(1,2); println(r1.toString()); }
47
Οργάνωση τάξεων στη Java Αρχείο Test.java: // δεν υπάρχει package.. = ανήκει στο «κενό» πακέτο //import acm.program.*; import aueb.math; public class Test extends acm.program.Program { public void run() { Rational r1 = new Rational(1,2); println(r1.toString()); }
48
Οργάνωση τάξεων στη Java Αρχείο Test.java: // δεν υπάρχει package.. = ανήκει στο «κενό» πακέτο //import acm.program.*; //import aueb.math; public class Test extends acm.program.Program { public void run() { aueb.math.Rational r1 = new aueb.math.Rational(1,2); println(r1.toString()); }
49
Διάβασμα για το σπίτι Κεφάλαιο 6 από «Η Τέχνη και Επιστήμη της JAVA: Μια εισαγωγή στην Επιστήμη των Υεπολογιστών», E. Roberts Κεφάλαιο 5 και 6 του βιβλίου «Εισαγωγή στην JAVA», Γιώργος Λιακέας.
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.