8. Μέθοδοι (Methods) Χειμερινό εξάμηνο 2012 Πέτρος Κωμοδρόμος komodromos@ucy.ac.cy http://www.eng.ucy.ac.cy/petros 1
Θέματα Μέθοδοι που παρέχονται από τη τάξη Math του Java API Χρήση στατικών μεθόδων και δεδομένων (static methods and fields) Κλήση μεθόδων και μεταφορά δεδομένων μεταξύ μεθόδων Χρήση πακέτων (packages) για ομαδοποίηση κοινών κλάσεων Δημιουργία τυχαίων αριθμών (random-number generation) Ορατότητα δηλώσεων (visibility of declarations) Υπερφόρτωση μεθόδων (method overloading) Αναδρομικές μέθοδοι (recursive methods) 2
Τμήματα προγραμμάτων (program modules) Μέθοδοι (methods/ functions ) Διαχωρισμός συγκεκριμένων έργων/ενεργειών σε αυτόνομες μεθόδους o Διαίρει και βασίλευε (divide-and-conquer) απλοποίηση του προβλήματος o o o Ευκολότερος προγραμματισμός μίας απλής μεθόδου Καλύτερος έλεγχος για λάθη Αποφυγή επανάληψης κώδικα και επαναχρησιμοποίηση μεθόδων Κλάσεις (classes) Πακέτα (packages) 3
Java Application Programming Interface (API) http://java.sun.com/javase/6/docs/api/index.html Είναι επίσης γνωστό σαν Java Class Library Περιέχει προκαθορισμένες κλάσεις (classes) και μεθόδους (methods), οι οποίες ομαδοποιούνται σε πακέτα (packages) όπως π.χ.: java.lang: βασικές κλάσεις και μέθοδοι, απαραίτητες σε κάθε πρόγραμμα java.math: κλάσεις και μέθοδοι για μαθηματικές πράξεις java.io: κλάσεις και μέθοδοι για είσοδο/έξοδο δεδομένων/αποτελεσμάτων java.awt: κλάσεις για τη δημιουργία γραφικών (graphics) και περιβαλλόντων διασύνδεσης (user interfaces) javax.swing: κλάσεις για τη δημιουργία γραφικών και περιβαλλόντων διασύνδεσης χρησιμοποιώντας μόνο Java ("lightweight, all-java language) javax.sql: κλάσεις και μέθοδοι για πρόσβαση σε δομές δεδομένων (database) java.applet: κλάσεις και μέθοδοι για Java applets 4
Java API Packages: http://java.sun.com/j2se/1.5.0/docs/api/ 5
6
Στατικές Μέθοδοι (static/class methods) Αφορούν τη τάξη (class) και όχι συγκεκριμένο αντικείμενο (object) Μπορούν να κληθούν και να χρησιμοποιηθούν χωρίς την ανάγκη ύπαρξης και χρήσης κάποιου αντικειμένου της τάξης Καλούνται, όπως πιο κάτω: ClassName.methodName( arguments ) Παράδειγμα: Όλες οι μέθοδοι της τάξης Math, η οποία ορίζεται στο πακέτο java.lang, είναι στατικές: Math.sqrt(40.75 ) 7
Στατικές μέθοδοι της τάξης (κλάσης) Math - Math class methods 8
Μεταβλητές σταθερών τιμών και στατικές μεταβλητές (constant and static data fields) Μεταβλητές σταθερών τιμών (constant data fields) Ορίζονται χρησιμοποιώντας το keyword final Δεν επιτρέπονται αλλαγές μετά την αρχικοποίηση (initialization) τους Στατικές μεταβλητές (static data fields) Ορίζονται χρησιμοποιώντας το keyword static Υπάρχει μόνο μία μεταβλητή για όλη τη κλάση Μεταβλητές σταθερών τιμών (constant and static data fields) Ορίζονται χρησιμοποιώντας και τα δύο keywords (final και static ) π.χ. Math.PI και Math.E 9
Μέθοδος main public static void main( String args[] ) Δηλώνεται σαν στατική (static) μέθοδος, ώστε να μπορεί να κληθεί χωρίς την ανάγκη προηγούμενης δημιουργίας αντίστοιχου αντικειμένου Δηλώνεται σαν public μέθοδος, ώστε να μπορεί να κληθεί από οποιαδήποτε άλλη κλάση, μέθοδο, κ.λπ. Η JVM καλεί τη μέθοδο main της κλάσης η οποία δίνεται μετά την εντολή java κατά την εκτέλεση του προγράμματος χρησιμοποιώντας την εντολή java java ClassName argument1 argument2. Σε κάθε κλάση μπορεί να δηλωθεί μέθοδος main 10
Μέθοδοι με πολλαπλές παραμέτρους - Παράδειγμα Prompt the user to enter and read three double values Call method maximum Display maximum value 11
Declare the maximum method Compare y and maximumvalue Compare z and maximumvalue Return the maximum value 12
Create a MaximumFinder object Call the determinemaximum method 13
Κλήση Μεθόδων Χρησιμοποιώντας το όνομα μεθόδου που ανήκει στην ίδια τάξη (κλάση) Δεν μπορεί από στατική μέθοδο να κληθεί μη στατική μέθοδος Χρησιμοποιώντας μια μεταβλητή που αναφέρεται σε κάποιο αντικείμενο (variable containing a reference to an object) ακολουθούμενη από την τελεία (.) και το όνομα κάποιας μεθόδου της κλάσης του συγκεκριμένου αντικειμένου. Χρησιμοποιώντας το όνομα μιας κλάσης ακολουθουμένης από την τελεία (.) και το όνομα κάποιας στατικής μεθόδου της κλάσης 14
Στοίβα Κλήσης Μεθόδων (Method Call Stack) Στοίβα (stack) Last-in, first-out (LIFO) data structures (δομές δεδομένων) o o Items are pushed (inserted) onto the top Items are popped (removed) from the top Στοίβα εκτέλεσης προγράμματος / κλήσης μεθόδων (program execution stack / method call stack) Οι διευθύνσεις επιστροφής των μεθόδων από όπου καλούνται άλλες μέθοδοι μπαίνουν σε αυτήν την στοίβα και αφαιρούνται όταν επιστρέψει ο έλεγχος από την καλούμενη μέθοδο Οι τοπικές μεταβλητές (local variables) αποθηκεύονται σε ένα τμήμα της στοίβας κλήσης μεθόδων γνωστό σαν method s activation record ή stack frame 15
Επιτρεπτές αυτόματες προαγωγές - Valid promotions 16
Εμβέλεια δηλώσεων - Scope of declarations Η εμβέλεια (scope) μιας παραμέτρου είναι το σώμα (body) της μεθόδου Η εμβέλεια (scope) μιας τοπικής μεταβλητής (local-variable) είναι από το σημείο της δήλωσης (point of declaration) μέχρι το τέλος εκείνου του μπλοκ (block) Η εμβέλεια (scope) μιας τοπικής μεταβλητής (local-variable) στην επικεφαλίδα ενός βρόγχου (initialization section of a for-loop header) είναι η υπόλοιπη επικεφαλίδα και το σώμα του βρόγχου Η εμβέλεια (scope) μιας μεθόδου ή μεταβλητής μέλους μιας κλάσης (method or field of a class) είναι ολόκληρο το σώμα της κλάσης (body of the class) Μια μεταβλητή μέλος ενός αντικειμένου (field) σκιάζεται (shadowed) από τοπική μεταβλητή ή παράμετρο με το ίδιο όνομα και αυτό διαρκεί μέχρι η τοπική μεταβλητή ή παράμετρος βγουν εκτός εμβέλειας (go out of scope) 17
Shadows field x Display value of local variable x 18
Shadows field x Display value of local variable x Display value of field x 19
20
Υπερφόρτωση μεθόδων (Method overloading) Πολλαπλές μέθοδοι μπορούν να καθοριστούν με το ίδιο όνομα εφόσον έχουν διαφορετικές παραμέτρους όσο αφορά τον αριθμό και τύπο τους Ο μεταγλωττιστής (compiler) αποφασίζει ποια μέθοδο να καλέσει βάσει της ταύτισης των παραμέτρων που χρησιμοποιούνται στην κλήση της μεθόδου και των παραμέτρων κάποιας από τις υπερφορτωμένες μεθόδους Διαφορές στον τύπο που επιστρέφεται (return type) από τη μέθοδο δεν επηρεάζουν την απόφαση για το ποια μέθοδος να κληθεί αφού δεν είναι μέρος της υπογραφής της μεθόδου (method signature) Είναι λάθος να έχει την ίδια υπογραφή μιας μέθοδος (method signature), ακόμη και αν έχει διαφορετικό τύπο επιστροφής (return type) 21
Calls the square of int method Calls the square of double method 22
23
Same method signature Compilation error 24
Αναδρομικές μέθοδοι (recursive methods) Οι αναδρομικές μέθοδοι μπορούν να χρησιμοποιηθούν για να επιλυθεί κάποιο πρόβλημα με νέα κλήση μέσα από την ίδια μέθοδο του εαυτού της για επίλυσης πιο απλοποιημένου προβλήματος, εφαρμόζοντας κατά κάποιο τρόπο το διαίρει και βασίλευε (divide & conquer) Η Java μας δίνει αυτή τη δυνατότητα αφού επιτρέπεται να κληθεί μία μέθοδος μέσα από εκτέλεση της ίδιας μεθόδου Πολλοί αλγόριθμοι μπορούν εναλλακτικά να υλοποιηθούν πιο κομψά με χρήση recursive methods/functions παρά με χρήση επαναλήψεων (iteratively) Κάποιος αλγόριθμος που υλοποιείται αναδρομικά (recursively) μπορεί να υλοποιηθεί και επαναληπτικά (iteratively) Πρέπει να υπάρχουν κάποιες συνθήκες τερματισμού της αναδρομής πιο κοντά στις οποίες πρέπει να οδηγούμαστε με κάθε νέα αναδρομική κλήση 25
Παράδειγμα: Υπολογισμός παραγοντικού public class TestMyFactorial { public static void main(string [] agrs) { System.out.println("Factorial computation:\n"); int n=5; System.out.printf("Factorial of %d = %di = %d\n", n, n, recursivefactorial(n)); } static int recursivefactorial(int n) { if(n>1) return n*recursivefactorial(n-1); else return 1; } } 26