JAVA ΕΝΟΤΗΤΑ 18 – METHOD OVERLOADING

 

ΕΙΣΑΓΩΓΗ

Στο σημερινό δωρεάν μάθημα Java, θα εξηγήσουμε τι είναι το method overloading και πως πρακτικά το χρησιμοποιούμε. 

Η θεωρία αυτή θα μας φανεί πολύ χρήσιμη όταν σε μελλοντικό δωρεάν μάθημα Java θα μιλήσουμε για τους constructors.

ΟΡΙΣΜΟΣ ΤΟΥ METHOD OVERLOADING

Τι είναι λοιπόν το method overloading? Είναι η δυνατότητα που μας δίνει η Java να έχουμε πολλαπλές μεθόδους με το ίδιο όνομα μέσα στη ίδια κλάση. Αυτό επιτρέπεται από τη Java αν και μόνο αν το signature της κάθε μεθόδου είναι διαφορετικό από τις υπόλοιπες.

Υπενθυμίζω ότι σαν signature είχαμε ορίσει την πρώτη γραμμή ορισμού μιας μεθόδου όπου ορίζονται το όνομα της μεθόδου, οι παραμέτρους που δέχεται, το return type (δηλαδή τι είδος data επιστρέφει) και τον access specifier. Η Java λοιπόν για να μπορέσει να ξεχωρίσει τις μεθόδους μεταξύ τους, διαβάζει και αναγνωρίζει τι διαφορετικό έχει το ένα signature από το άλλο. Αυτό που κάνει το signature μιας μεθόδου να ξεχωρίζει από το signature μιας άλλης μεθόδου είναι κυρίως ο αριθμός των παραμέτρων και τα data types που δέχεται η κάθε μέθοδος. To return type της μεθόδου από μόνο του δεν είναι ικανό να μας προσφέρει overloading.

METHOD OVERLOADING EXAMPLE

Ας δούμε λοιπόν ένα Java πρόγραμμα μέσα από το οποίο προσπαθούμε να δημιουργήσουμε ένα μόνο είδος μεθόδου που θα μπορεί να πολλαπλασιάζει όλα τα είδη των αριθμών – π.χ. δύο int αριθμούς, ή ένα int με ένα float.


 

Ο κώδικας που ακολουθεί είναι μια κλάση με το όνομα Calculator η οποία περιέχει τις overloaded methods και μια κλάση με το όνομα OverloadDemo μέσα στην οποία δημιουργούμε ένα αντικείμενο είδος Calculator και καλούμε τις μεθόδους του.

Calculator.java

package com.example;

public class Calculator {
    public int multiply(int x, int y) {
        System.out.println("Multiply int * int");
        return x * y;
    }

    public double multiply(double x, double y) {
        System.out.println("Multiply double * double");
        return x * y;
    }

    public double multiply(int x, double y) {
        System.out.println("Multiply int * double");
        return x * y;
    }

    public int multiply(int x) {
        System.out.println("Multiply int * itself");
        return x * x;
    }

    public int multiply(int x, int y, int z) {
        System.out.println("Multiply three ints");
        return x * y * z;
    }
}


OverloadDemo.java

package com.example;

public class OverloadDemo {
    public static void main(String[] args) {
        System.out.println("Instantiating a Calculator...");
        Calculator calc = new Calculator();
        calc.System.out.println("Initializing some variables...");
        int a = 5;
        int b = 8;
        double d1 = 2.5;
        double d2 = -1.0;
        float f = 4.0F;

        int intAnswer = 0;
        double doubleAnswer = 0.0;

        intAnswer = calc.multiply(a, b);
        System.out.println(a + " * " + b + " = " + intAnswer);

        doubleAnswer = calc.multiply(d1, d2);
        System.out.println(d1 + " * " + d2 + " = " + doubleAnswer);

        intAnswer = calc.multiply(b);
        System.out.println(b + " * " + b + " = " + intAnswer);

        intAnswer = calc.multiply(a, b, a);
        System.out.println(a + " * " + b + " * " + a + " = " + intAnswer);

        doubleAnswer = calc.multiply(b, f);
        System.out.println(b + " * " + f + " = " + doubleAnswer);

        doubleAnswer = calc.multiply(d2, f);
        System.out.println(d2 + " * " + f + " = " + doubleAnswer);
    }
}


Output

Instantiating a Calculator...

Initializing some variables...

Multiply int * int

5 * 8 = 40

Multiply double * double     

2.5 * -1.0 = -2.5

Multiply int * itself

8 * 8 = 64

Multiply three ints

5 * 8 * 5 = 200

Multiply int * double

8 * 4.0 = 32.0

Multiply double * double

-1.0 * 4.0 = -4.0

 Ας δούμε λίγο πιο αναλυτικά πως ακριβώς υλοποιήσαμε το overloading στη κλάση Calculator. Για λόγους ευκολίας, θα συγκρίνουμε τις δύο πρώτες μεθόδους αφού και οι υπόλοιπες μέθοδοι ακολουθούν την ίδια λογική.

Έχουμε λοιπόν μια πρώτη μέθοδο με το όνομα multiply η οποία δέχεται δύο τιμές int τιμές και επιστρέφει int τιμή. Όπως ήδη έχουμε αναφέρει, η Java ενδιαφέρεται κυρίως για το είδος των τιμών που περνάμε στην μέθοδο. Στη δεύτερη μέθοδο περνάνε δύο double τιμές στις μεταβλητές αφού το data type των τιμών είναι double. Επειδή το signature της μια μεθόδου διαφέρει από εκείνο της δεύτερης, η Java επιτρέπει το overloading. Καταλαβαίνετε λοιπόν ότι οποιοσδήποτε μοναδικός συνδυασμός ανάμεσα στις μεταβλητές θα μας επιτρέψει να πραγματοποιήσουμε method overloading. Και αυτή ακριβώς είναι η λογική που ακολουθούμε στις υπόλοιπες μεθόδους – διαφορετικοί συνδυασμοί όπως int και double, μια int, τρεις int κτλ.


 

Τώρα αν νομίζετε ότι μια τέτοια προγραμματιστική προσέγγιση ίσως να μην σας φανεί χρήσιμη, σας προτείνω να το σκεφτείτε ξανά γιατί πολύ απλά η ίδια η Java χρησιμοποιεί τον μηχανισμό του overloading σε συνηθισμένες εντολές. Ο εύκολος τρόπος να το αποδείξουμε αυτό είναι να τυπώσετε System.out. Αμέσως θα σας εμφανιστεί μια λίστα από print και println μεθόδους. Εσείς δεν επιλέγετε ποια ακριβώς από τις μεθόδους θα εκτελεστεί. Αυτό το κάνει η Java ανάλογα με τον input που παρέχετε.

Τώρα, στη κλάση OverloadDemo, σαν πρώτο βήμα, δημιουργούμε ένα αντικείμενο είδος Calculator και επίσης ορίζουμε κάποιες τοπικές μεταβλητές διαφορετικών data type και τιμών. Αμέσως μετά φαίνεται η πραγματική αξία του overloading που υλοποιήσαμε στο κώδικα μας. Όπως η Java επιλέγει για εμάς ποια print ή println μέθοδο θα εκτελέσει, έτσι και στο δικό μας πρόγραμμα η Java επιλέγει ποια multiply μέθοδο θα εκτελέσει ανάλογα με το είδος των τιμών που περνάμε στην μέθοδο. Η ευκολία στην όλη διαδικασία είναι ότι εμείς σαν προγραμματιστές έχουμε να καλέσουμε ένα μόνο όνομα (multiply) και απλά περνάμε τις επιθυμητές τιμές στη μέθοδο.

Τη πρώτη φορά καλούμε τη multiply μέθοδο περνώντας δύο int τιμές. Η Java ανατρέχει πίσω στη κλάση Calculator από την οποία δημιουργήσαμε το αντικείμενο και εξετάζει αν υπάρχει κάποια μέθοδο που να δέχεται δύο int τιμές. Αν υπάρχει τότε την εκτελεί, αν όχι θα μας επιστρέψει λάθος. Αμέσως μετά από τον ορισμό του αντικειμένου μπορούμε να δούμε την λίστα με τις διαθέσιμες μεθόδους.

Μην ξεχάσετε να κάνετε ένα μικρό donation έτσι ώστε αυτό το blog να μεγαλώσει ακόμα πιο πολύ και να έχει περισσότερες δυνατότητες στην online παράδοση δωρεάν μαθημάτων.

 
full-width

Post a Comment

0 Comments