Download - ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

Transcript
Page 1: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 1

8. Μέθοδοι (Methods)

Χειμερινό εξάμηνο 2012

Πέτρος Κωμοδρόμος

[email protected]

http://www.eng.ucy.ac.cy/petros

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής

Page 2: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 2

Θέματα

Μέθοδοι που παρέχονται από τη τάξη Math του Java API

Χρήση στατικών μεθόδων και δεδομένων (static methods and fields)

Κλήση μεθόδων και μεταφορά δεδομένων μεταξύ μεθόδων

Χρήση πακέτων (packages) για ομαδοποίηση κοινών κλάσεων

Δημιουργία τυχαίων αριθμών (random-number generation)

Ορατότητα δηλώσεων (visibility of declarations)

Υπερφόρτωση μεθόδων (method overloading)

Αναδρομικές μέθοδοι (recursive methods)

Page 3: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 3

Τμήματα προγραμμάτων (program modules)

Μέθοδοι (methods/ functions )

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

o Διαίρει και βασίλευε (divide-and-conquer)

απλοποίηση του προβλήματος

o Ευκολότερος προγραμματισμός μίας απλής μεθόδου

o Καλύτερος έλεγχος για λάθη

o Αποφυγή επανάληψης κώδικα και επαναχρησιμοποίηση μεθόδων

Κλάσεις (classes)

Πακέτα (packages)

Page 4: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 4

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

Page 5: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 5

Java API Packages: http://java.sun.com/j2se/1.5.0/docs/api/

Page 6: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 6

Page 7: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 7

Στατικές Μέθοδοι (static/class methods)

Αφορούν τη τάξη (class) και όχι συγκεκριμένο αντικείμενο (object)

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

χρήσης κάποιου αντικειμένου της τάξης

Καλούνται, όπως πιο κάτω:

ClassName.methodName( arguments )

Παράδειγμα: Όλες οι μέθοδοι της τάξης Math, η οποία ορίζεται στο πακέτο

java.lang, είναι στατικές:

Math.sqrt(40.75 )

Page 8: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 8

Στατικές μέθοδοι της τάξης (κλάσης) Math - Math class methods

Page 9: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 9

Μεταβλητές σταθερών τιμών και στατικές μεταβλητές

(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

Page 10: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 10

Μέθοδος main

public static void main( String args[] )

• Δηλώνεται σαν στατική (static) μέθοδος, ώστε να μπορεί να κληθεί χωρίς την

ανάγκη προηγούμενης δημιουργίας αντίστοιχου αντικειμένου

• Δηλώνεται σαν public μέθοδος, ώστε να μπορεί να κληθεί από οποιαδήποτε άλλη

κλάση, μέθοδο, κ.λπ.

Η JVM καλεί τη μέθοδο main της κλάσης η οποία δίνεται μετά την εντολή

java κατά την εκτέλεση του προγράμματος χρησιμοποιώντας την εντολή java

java ClassName argument1 argument2 ….

Σε κάθε κλάση μπορεί να δηλωθεί μέθοδος main

Page 11: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 11

Μέθοδοι με πολλαπλές παραμέτρους - Παράδειγμα

Prompt the user to enter and

read three double values

Call method maximum

Display maximum value

Page 12: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 12

Declare the maximum method

Compare y and maximumValue

Compare z and maximumValue

Return the maximum value

Page 13: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 13

Create a MaximumFinder object

Call the determineMaximum method

Page 14: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 14

Κλήση Μεθόδων

Χρησιμοποιώντας το όνομα μεθόδου που ανήκει στην ίδια τάξη (κλάση)

• Δεν μπορεί από στατική μέθοδο να κληθεί μη στατική μέθοδος

Χρησιμοποιώντας μια μεταβλητή που αναφέρεται σε κάποιο αντικείμενο (variable

containing a reference to an object) ακολουθούμενη από την τελεία (.) και το όνομα

κάποιας μεθόδου της κλάσης του συγκεκριμένου αντικειμένου.

Χρησιμοποιώντας το όνομα μιας κλάσης ακολουθουμένης από την τελεία (.) και το

όνομα κάποιας στατικής μεθόδου της κλάσης

Page 15: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 15

Στοίβα Κλήσης Μεθόδων (Method Call Stack)

Στοίβα (stack)

• Last-in, first-out (LIFO) data structures (δομές δεδομένων)

o Items are pushed (inserted) onto the top

o Items are popped (removed) from the top

Στοίβα εκτέλεσης προγράμματος / κλήσης μεθόδων

(program execution stack / method call stack)

• Οι διευθύνσεις επιστροφής των μεθόδων από όπου καλούνται άλλες μέθοδοι

μπαίνουν σε αυτήν την στοίβα και αφαιρούνται όταν επιστρέψει ο έλεγχος από την

καλούμενη μέθοδο

• Οι τοπικές μεταβλητές (local variables) αποθηκεύονται σε ένα τμήμα της στοίβας

κλήσης μεθόδων γνωστό σαν method’s activation record ή stack frame

Page 16: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 16

Επιτρεπτές αυτόματες προαγωγές - Valid promotions

Page 17: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 17

Εμβέλεια δηλώσεων - 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)

Page 18: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 18

Shadows

field x

Display value

of local

variable x

Page 19: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 19

Shadows

field x

Display value

of local

variable x

Display

value of

field x

Page 20: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 20

Page 21: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 21

Υπερφόρτωση μεθόδων (Method overloading)

Πολλαπλές μέθοδοι μπορούν να καθοριστούν με το ίδιο όνομα εφόσον έχουν

διαφορετικές παραμέτρους όσο αφορά τον αριθμό και τύπο τους

Ο μεταγλωττιστής (compiler) αποφασίζει ποια μέθοδο να καλέσει βάσει της ταύτισης

των παραμέτρων που χρησιμοποιούνται στην κλήση της μεθόδου και των

παραμέτρων κάποιας από τις υπερφορτωμένες μεθόδους

• Διαφορές στον τύπο που επιστρέφεται (return type) από τη μέθοδο δεν επηρεάζουν την

απόφαση για το ποια μέθοδος να κληθεί αφού δεν είναι μέρος της υπογραφής της

μεθόδου (method signature)

• Είναι λάθος να έχει την ίδια υπογραφή μιας μέθοδος (method signature), ακόμη και αν

έχει διαφορετικό τύπο επιστροφής (return type)

Page 22: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 22

Calls the “square of

int” method

Calls the “square of

double” method

Page 23: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 23

Page 24: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 24

Same method

signature

Compilation

error

Page 25: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 25

Αναδρομικές μέθοδοι (recursive methods)

Οι αναδρομικές μέθοδοι μπορούν να χρησιμοποιηθούν για να επιλυθεί κάποιο

πρόβλημα με νέα κλήση μέσα από την ίδια μέθοδο του εαυτού της για επίλυσης

πιο απλοποιημένου προβλήματος, εφαρμόζοντας κατά κάποιο τρόπο το διαίρει και

βασίλευε (divide & conquer)

Η Java μας δίνει αυτή τη δυνατότητα αφού επιτρέπεται να κληθεί μία μέθοδος

μέσα από εκτέλεση της ίδιας μεθόδου

Πολλοί αλγόριθμοι μπορούν εναλλακτικά να υλοποιηθούν πιο κομψά με χρήση

recursive methods/functions παρά με χρήση επαναλήψεων (iteratively)

Κάποιος αλγόριθμος που υλοποιείται αναδρομικά (recursively) μπορεί να υλοποιηθεί

και επαναληπτικά (iteratively)

Πρέπει να υπάρχουν κάποιες συνθήκες τερματισμού της αναδρομής πιο κοντά στις

οποίες πρέπει να οδηγούμαστε με κάθε νέα αναδρομική κλήση

Page 26: ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής · ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής 26

Παράδειγμα: Υπολογισμός παραγοντικού

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;

}

}