ΕΝΟΤΗΤΑ 3 - "HELLO WORLD" CODE EXPLANATION
ΕΙΣΑΓΩΓΗ
Στο σημερινό δωρεάν μάθημα Java με VS Code θα αναλύσουμε γραμμή προς γραμμή τον κώδικα του Hello World παραδείγματος που το Apache Maven δημιουργήσε αυτόματα για εμάς όταν δημιουργήθηκε το Java Project. Επίσης σε αυτή την ενότητα θα δούμε και τον ρόλο που έχει το JDK στην εκτέλεση των προγραμμάτων μας.
ΑΝΑΛΥΣΗ ΤΟΥ ΚΩΔΙΚΑ
Πριν ξεκινήσουμε, ας δούμε άλλη μια φορά τον κώδικα που έχει ήδη δημιουργηθεί αυτόματα μέσα στην κλάση App.java όταν δημιουργήσαμε το Java Maven Project.
App.java
Output
Στην γραμμή 1 ορίζουμε το πακέτο (package) μέσα στο οποίο ανήκει η κλάση μας. Κάθε κλάση πρέπει να ανήκει μέσα σε ένα πακέτο. Το όνομα του πακέτου το είχατε ορίσει όταν είχατε δώσει το όνομα για το group id κατά την δημιουργία του Java Maven Proejct.
Ένα πακέτο ορίζεται από την λέξη package και αμέσως μετά το όνομα του πακέτου. Για να ολοκληρωθεί η δήλωση του πακέτου θα πρέπει να τελειώσουμε την γραμμή του κώδικα μας με ένα semicolon (;);
Το όνομα του πακέτου μπορεί να αποτελείται από ένα ή περισσότερα μέρη. Στο δικό μας παράδειγμα το όνομα του πακέτου αποτελείται από com.example. Στην πραγματικότητα ένα πακέτο είναι ένας φάκελος στον σκληρό σας δίσκο. Χρησιμοποιούμε τα πακέτα για να ομαδοποιήσουμε πολλαπλές κλάσεις που έχουν μια κοινή λειτουργία. Για παράδειγμα, σε ένα πακέτο μπορεί να έχουμε μόνο τις κλάσεις που αναφέρονται σε κώδικα που επικοινωνεί με μια βάση δεδoμένων, ενώ σε άλλο πακέτο να έχουμε κλάσεις που να περικλύουν την λογική του κώδικα μας όπως αριθμητικές πράξεις. Αν και θα μπορούσαμε να έχουμε όλες τις κλάσεις μιας εφαρμογής σε ένα μόνο πακέτο, αυτό θα μας δυσκόλευε όταν μεγάλωνε ο κώδικας μας γιατί δεν θα ήταν αμέσως ορατή η χρήση της κάθε κλάσης. Στην αρχή θα χρησιμοποιήσουμε αυτό το πακέτο για τον απλό κώδικα που θα αναπτύξουμε, αλλά αργότερα θα δημιουργήσουμε νέα πακέτα για να οργανώσουμε καλύτερα την εφαρμογή μας.
Στην γραμμή 3 ορίζουμε την πρώτη μας κλάσης. Κάθε κώδικας που γράφουμε στην java πρέπει να ανήκει μέσα σε μια κλάση. Αυτή είναι άλλωστε η λογική της Java για αυτό και ονομάζεται αντικειμενοστραφή γλώσσα προγραμματισμού. Η λέξη κλειδί class ορίζει ότι το όνομα App είναι κλάση και ο κώδικας που θα ανήκει σε αυτήν ορίζεται από τα άγκιστρα ( { } ). Η λέξη κλειδί public μπροστά από το class δηλώνει ότι άλλες κλάσεις, από το ίδιο ή διαφορετικό πακέτο, μπορούν να καλέσουν μεταβλητές και μεθόδους που έχει να προσφέρει η δική μας κλάση. Επειδή η λέξη public ορίζει το είδος της πρόσβασης που άλλα μέρη της εφαρμογής έχουν στην συγκεκριμένη κλάση ανήκει σε μια ευρύτερη κατηγορία που ονομάζουμε access modifiers. Υπάρχουν και άλλοι access modifiers που θα αναλύσουμε σε μελλοντικές ενότητες. Για τώρα θα χρησιμοποιήσουμε την λέξη public.
Το όνομα της κλάσης πρέπει να ξεκινάει με γράμμα και μετά μπορεί να περιέχει και αριθμούς. Το naming convention που χρησιμοποιούμε για να δίνουμε ονόματα στις κλάσεις είναι το εξής: το πρώτο γράμμα της κάθε λέξης είναι κεφαλαίο. Αυτός το τρόπος ονοματολογίας των κλάσεων ονομάζεται "CamelCase".
Ακόμα ένα στοιχείο που πρέπει να γνωρίζεται για τις κλάσεις είναι ότι για κάθε κλάση δημιουργείται και το αντίστοιχο αρχείο στον σκληρό σας δίσκο με το ίδιο όνομα και με κατάληξη .java. Για την κλάση App, στο folder που είναι δημιουργημένο το project σας θα βρείτε το αρχείο App.java.
Όμως μια κλάση από μόνη της δεν κάνει μια εφαρμογή εκτελέσιμη. Αυτή την δυνατότητα την αποκτάει η κλάση, και κατά συνέπεια ολόκληρη η εφαρμογή, όταν συμπεριλάβουμε μια δυναμική μέθοδο που προσφέρει η Java και ονομάζεται main.
Πριν προχωρήσουμε στην ανάλυση της main, θα πρέπει να επισημάνουμε το γεγονός ότι η Java είναι case sensitive. Αυτό με απλά λόγια σημαίνει ότι η λέξη Main και η λέξη main για την Java είναι δύο διαφορετικά ονόματα. Προσέχουμε λοιπόν το πως γράφουμε το όνομα της main για μπορέσει να λειτουργήσει σωστά η εφαρμογή μας.
Η μέθοδος main είναι η αρχή εκτέλεσης κάθε προγράμματος Java. Η λέξη public, με την οποία ξεκινάει ο ορισμός της, επιτρέπει στο JVM της Java να αποκτήσει πρόσβαση σε αυτήν και να ξεκινήσει η εκτέλεση της. Η λέξη static επιτρέπει την εκτέλεση της μεθόδου χωρίς πρώτα να χρειαστεί να δημιουργήσουμε αντικείμενο από την κλάση στην οποία περιέχεται. Η λέξη void ενημερώνει την Java ότι η συγκεκριμένη μέθοδο δεν θα επιστρέψει τίποτα πίσω στο πρόγραμμα. Με άλλα λόγια εκτελεί τον κώδικα ή δείχνει μηνύματα στην κονσόλα αλλά δεν περιμένουμε κάποιο αποτέλεσμα πίσω το οποίο θα χρησιμοποιήσουμε για συνεχίσουμε με κάποιες άλλες πράξεις. Η λέξη main() (μαζί με τις παρενθέσεις) ορίζει το όνομα της και την ιδιότητα της – δηλαδή ότι είναι μέθοδος. Μέσα στην παρένθεση ορίζεται ένας String array σε περίπτωση που θέλουμε να περάσουμε κάποιες τιμές στην εφαρμογή πριν την εκτέλεση της. Τέλος τα άγκιστρα ( { }) ορίζουν τον κώδικα που θα εκτελέσει η main.
Η πιο παραπάνω επεξήγηση του κώδικα μπορεί αυτή τη στιγμή να ακούγεται κάπως δύσκολη, αλλά όταν προχωρήσουμε στην θεωρία μας, κάθε μια από τις λέξεις κλειδιά της main στις οποίες αναφερθήκαμε θα ξεκαθαρίσει γιατί πολύ απλά θα τις χρησιμοποιήσετε και εσείς σε δικό μας κώδικα. Για τώρα απλά κρατάμε το γεγονός ότι έχουμε μια κλάση μέσα σε ένα πακέτο και χρειαζόμαστε τον ορισμό της main μεθόδου (ο οποίος δεν αλλάζει) μέσα στην κλάση για να τρέξουμε τον κώδικα μας.
Τέλος, έχουμε το System που είναι μια στατική κλάση και παράγει ένα αντικείμενο out στο οποίο ανήκει μια μέθοδο που ονομάζεται println( ). Ότι κείμενο περάσουμε σαν παράμετρο μέσα στην println( ) μέθοδο θα εμφανιστεί σαν αποτέλεσμα στο terminal γιατί είναι το default output του System.out αντικειμένου. Προσέχουμε να ολοκληρώσουμε την εντολή με semicolon ( ; ).
Αυτό το εύκολο, σε εκτέλεση και λειτουργία, πρόγραμμα περιέχει πολύ θεωρία που δεν μπορούμε ακόμα να αναλύσουμε σε βάθος γιατί πολύ απλά είναι πολύ νωρίς για να μιλήσουμε για όλη την θεωρία του object-oriented προγραμματισμού. Αν κάποιοι από τους ορισμούς που χρησιμοποιήσαμε δεν είναι εντελώς ξεκάθαροι, μην ανησυχείτε γιατί θα επιστρέψουμε σε αυτούς πολλές φορές στα επόμενα προγράμματα μας. Για τώρα απλά κρατάμε τα εξής:
- Η Java είναι case sensitive.
- Το πιο απλό πρόγραμμα χρειάζεται την δημιουργία μιας κλάσης.
- Κάθε κλάση δημιουργείται μέσα σε ένα πακέτο.
- Για να είναι εκτελέσιμη η εφαρμογή μας χρειαζόμαστε την main( ) μέθοδο.
- Η γραμμή που ορίζει την main( ) θα παραμείνει πάντα η ίδια για όλα τα προγράμματα.
- Για να δείξουμε μηνύματα στην κονσόλα, χρησιμοποιούμε την println( ) μέθοδο.
Ας παραμείνουμε για λίγο ακόμα στην μέθοδο println( ). Για να μπορεί η συγκεκριμένη μέθοδο να εμφανίσει στο terminal ένα text κείμενο (ή String όπως ονομάζεται επίσημα στην Java) θα πρέπει το κείμενο να βρίσκεται μέσα σε double quotes (" "). Επίσης, αν γράψετε την println( ) χωρίς να περάσετε κάποια παράμετρο μέσα στην παρένθεση, το αποτέλεσμα θα είναι να έχουμε μια κενή γραμμή όταν εμφανίζεται στο terminal.
Υπάρχουν επίσης σημεία του κώδικα στα οποία ίσως να θέλετε να προσθέσετε κάποια έξτρα σχόλια έτσι ώστε όταν αναλύσετε τον ίδιο κώδικα μερικούς μήνες αργότερα να σας βοηθήσουν να καταλάβετε γρήγορα την λογική του κώδικα. Τα comments είναι ένας σωστός και επαγγελματικός τρόπος να βοηθάμε και τους υπόλοιπους προγραμματιστές που ασχολούνται με τον κώδικα μας. Αν θέλουμε να γράψουμε ένα σχόλιο σε μια μόνο γραμμή χρησιμοποιούμε // ενώ για σχόλια που αναπτύσσονται σε περισσότερες από μια γραμμή μπορούμε να χρησιμοποιήσουμε /* */
Τα σχόλια είναι πολύ χρήσιμα στον προγραμματισμό γενικότερα γιατί πρώτον δεν τυπώνονται στο αποτέλεσμα, αλλά και κυρίως γιατί μπορούμε γρήγορα να απομονώσουμε και να απενεργοποιήσουμε γραμμές κώδικα.
Ας εφαρμόσουμε όσα μάθαμε στον κώδικα του προγράμματος μας. Γράφετε τον παρακάτω κώδικα, και αφού εκτελέσετε τις εντολές clean και install του Maven τότε τρέχετε τον κώδικα όπως ήδη έχουμε περιγράψει στην προηγούμενη ενότητα.
App.java
Output
JAVA VIRTUAL MACHINE
Στην πρώτη ενότητα είχαμε εγκαταστήσει μια από τις εκδόσεις της Java εκτελώντας ένα αρχείο με το όνομα OpenJDK. Η εγκατάσταση του OpenJDK είχε δύο κύριους σκοπούς:
- πρώτον να δημιουργηθεί ένα Java Virtual Machine στον υπολογιστή μας
- και κατά δεύτερον να μας δοθεί η δυνατότητα να δημιουργούμε, να κάνουμε compile και τέλος να τρέχουμε τα Java προγράμματα μας.
Η ερώτηση όμως παραμένει – τι είναι το JVM? Θα έχετε ακούσει φαντάζομαι τον λόγο που η Java έγινε διάσημη ανάμεσα στην κοινότητα των προγραμματιστών – Γιατί κάθε εφαρμογή έχει την δυνατότητα να τρέξει σε όλα τα λειτουργικά συστήματα με σχεδόν καμία αλλαγή στον κώδικα. Πως όμως είναι αυτό εφικτό?
Όταν εγκαταστήσαμε το JDK εγκαταστάθηκε στον υπολογιστή μας ένα Java Virtual Machine ή αλλιώς JVM. Κάθε Java εφαρμογή που χτίζουμε και εκτελούμε τρέχει επάνω σε αυτό το JVM χωρίς ποτέ να “βλέπει” το πραγματικό λειτουργικό σύστημα. Με πολύ απλά λόγια, το JVM είναι η CPU, η μνήμη και το λειτουργικό σύστημα που νομίζει ότι βλέπει η Java εφαρμογή. Αν τώρα από Windows, για παράδειγμα, θέλετε να τρέξετε την εφαρμογή σας σε ένα Linux υπολογιστή, δεν έχετε παρά να εγκαταστήσετε το JDK για Linux και είσαστε έτοιμοι. Η Java εφαρμογή θα ψάξει και θα βρει πάλι το JVM που χρειάζεται για να εκτελεστεί χωρίς να αντιληφθεί ότι το λειτουργικό σύστημα έχει αλλάξει.
Μπορούμε να δούμε όλη αυτή την λειτουργία με περισσότερη λεπτομέρεια. Θα χρειαστούμε όμως την βοήθεια της πιο κάτω εικόνας:
Έχουμε δημιουργήσει ένα απλό Java πρόγραμμα. Η κλάση μας μέσα στην οποία είναι γραμμένος ο κώδικας μας έχει κατάληξη .java. Όλα τα αρχεία java κώδικα από τα οποία αποτελείται μια εφαρμογή έχουν κατάληξη .java. Αυτό ονομάζεται Java Source Code και είναι το πρώτο βήμα.
Όταν εκτελέσαμε την clean και install εντολή στο project, στην πραγματικότητα αυτό που έγινε ήταν το OpenJDK να ελέγξει αν συντακτικά ο κώδικας μας ήταν εντάξει. Αφού το πρόγραμμα δεν είχε λάθη, τότε έκανε compile την κλάση μας και δημιούργησε ένα καινούργιο αρχείο με το ίδιο όνομα αλλά με κατάληξη .class. Αν είχαμε μια εφαρμογή π.χ με τρεις κλάσεις τότε θα είχαμε την δημιουργία τριών καινούργιων αρχείων με κατάληξη .class. Αν κοιτάξουμε μέσα στον target φάκελλο (όπως δείχνει η παρακάτω εικόνα) θα δούμε την δημιουργία του .class αρχείου.
Τα καινούργια αυτά αρχεία περιέχουν των κώδικα μας σε ψηφιακή μορφή bytecode. Από εδώ και πέρα αναλαμβάνει το JVM το οποίο έχει την ικανότητα να διαβάσει αυτά τα αρχεία και να τα μετατρέψει σε γλώσσα μηχανής του αντίστοιχου λειτουργικού σύστημα στο οποίο τρέχει.
Κάθε φορά που αλλάζει κάτι στον κώδικα και εκτελούμε την maven εντολή mvn clean install , το maven καθαρίζει τα παλιά .class αρχεία και δημιουργεί καινούργια αφού επαναλαμβάνει την διαδικασία του compilation. Επίσης δημιουργείται και ένα καινούργιο αρχείο το οποίο έχει κατάληξη .jar, περιέχει όλες τις κλάσεις της εφαρμογής μας και είναι εκτελέσιμο.
Αυτή είναι όλη η εφαρμογή μας πακεταρισμένη κάτω από ένα όνομα και με κατάληξη .jar, με όλες τις κλάσεις που χρειάζεται να τρέξει η εφαρμογή μας. Αν και είναι κάπως άστοχο το παράδειγμα, απλά για να σας δώσω να καταλάβετε τι έχουμε δημιουργήσει, σκεφτείτε το σαν κάτι αντίστοιχο ενός .exe αρχείου στα Windows. Δηλαδή τώρα έχουμε μια εκτελέσιμη εφαρμογή? Και αν ναι, αν εκτελέσουμε αυτό το .jar αρχείο σε έναν άλλο υπολογιστή στο οποίο ήδη έχουμε εγκαταστήσει το OpenJDK, πως μπορούμε να το εκτελέσουμε? Η απάντηση είναι πολύ απλή: java -jar (και το όνομα του αρχείου).
Πριν κλείσουμε αυτή το δωρεάν μάθημα Java ας κάνουμε μια γρήγορη ανακεφαλαίωση στο τι έχουμε καλύψει σαν θεωρία. Κάθε φορά λοιπόν που εκτελείτε την εντολή mvn clean install, στην ουσία δημιουργείται ένα .jar αρχείο, το οποίο αντιπροσωπεύει την εκτελέσιμη έκδοση της εφαρμογής. Μέσα σε αυτό το .jar αρχείο (μπορείτε να το κάνετε unzip και να δείτε τι περιέχει) περιλαμβάνονται όλες οι κλάσεις της εφαρμογής μας σε bytecode μορφή και κατάληξη .class. Αυτά τα bytecode αρχεία τα διαβάζει ο Java Interpreter (το JVM με άλλα λόγια) και τα μετατρέπει σε γλώσσα μηχανής του λειτουργικού σύστημα επάνω στο οποίο τρέχει η εφαρμογή μας.
Μην ξεχάσετε να κάνετε ένα μικρό donation έτσι ώστε αυτό το site να μεγαλώσει ακόμα πιο πολύ και να έχει περισσότερες δυνατότητες στην Online παράδοση δωρεάν μαθημάτων.
ΕΙΣΗΓΗΤΗΣ
Μιχάλης Κασάπογλου
Ο Μιχάλης Κασάπογλου, είναι ένας από τους πιο έμπειρους τεχνικούς εκπαιδευτές στον χώρο του προγραμματισμού με πάνω από 20 χρόνια εμπειρία. Έχει εργαστεί σαν IT Operations Manager, Senior Programmer, και Training Team Leader ενώ κατέχει και αρκετές πιστοποιήσεις που καλύπτουν ένα μεγάλο φάσμα τεχνολογιών στο προγραμματισμό, σε βάσεις δεδομένων και cloud. Στον ελεύθερο του χρόνο διατηρεί ένα τεχνολογικό blog στο οποίο θα βρείτε αρκετά δωρεάν μαθήματα προγραμματισμού για αρχάριους.