ΕΙΣΑΓΩΓΗ
Στο σημερινό δωρεάν μάθημα Java θα αναλύσουμε γραμμή προς γραμμή τον κώδικα που δημιουργήθηκε αυτόματα όταν χρησιμοποιήσαμε
το Apache Maven για την κατασκευή του πρώτου μας Java project. Επίσης θα δούμε το ρόλο που έχει το JDK στην εκτέλεση των εφαρμογών μας.
CODE ANALYSIS
Πριν ξεκινήσουμε την ανάλυση μας, ας θυμηθούμε άλλη μια φορά το κώδικα που υπάρχει μέσα στη κλάση (class) App.java.
App.java
Hello World!
Ας ξεκινήσουμε την ανάλυση του κώδικα γραμμή προς γραμμή.
package com.example;
Στην αρχή του προγράμματος ορίζουμε το πακέτο (package) μέσα στο οποίο ανήκει η κλάση μας App. Κάθε κλάση πρέπει να ανήκει μέσα σε ένα πακέτο. Το όνομα του package το είχαμε ορίσει όταν είχαμε δηλώσει το όνομα για το group id κατά τη διαδικασία δημιουργίας του Java Maven Project.
Ένα package ορίζεται από την λέξη κλειδί package και αμέσως μετά ακολουθεί το όνομα του package. Για να ολοκληρωθεί η δήλωση του package θα πρέπει να ολοκληρώσουμε αυτό το statement με ένα semicolon( ; ). Το semicolon ( ; ) το χρησιμοποιεί η Java για να σηματοδοτήσει το τέλος μιας ολοκληρωμένης γραμμής κώδικα. Επίσης πρέπει να γνωρίζετε ότι η δήλωση του package πρέπει να είναι η πρώτη γραμμή κώδικα μέσα στο αρχείο της κλάσης. Δηλαδή πρώτα δηλώνουμε σε ποιο package ανήκει η κλάση και μετά αναπτύσσουμε τον κώδικα της.
Το όνομα του package μπορεί να αποτελείται από ένα ή περισσότερα ονόματα χωρισμένα με τελεία (. ). Στο δικό μας παράδειγμα το όνομα του package είναι com.example. Στην πραγματικότητα ένα package είναι ένας φάκελος στον σκληρό σας δίσκο. Χρησιμοποιούμε τα packages για να ομαδοποιήσουμε πολλαπλές κλάσεις που έχουν μια κοινή λειτουργία. Για παράδειγμα, σε ένα package μπορεί να έχουμε μόνο τις κλάσεις που αναφέρονται σε κώδικα που επικοινωνεί και ανταλλάσει δεδομένα με μια βάση δεδομένων, ενώ σε ένα άλλο package (μέσα στην ίδια εφαρμογή) ίσως έχουμε κλάσεις που περικλείουν την λογική του κώδικα μας όπως πολύπλοκους αλγόριθμούς.
Αν και θα μπορούσαμε προγραμματιστικά να έχουμε όλες τις κλάσεις μιας εφαρμογής σε ένα μόνο package, πρακτικά αυτό θα μας δυσκόλευε πάρα πολύ κυρίως όταν μεγάλωνε ο κώδικας μας και θα έπρεπε να εκτελέσουμε κάποιο troubleshooting.
Για αρχή, και επειδή τα προγράμματα που θα χτίσουμε (τουλάχιστον στις αρχικές ενότητες) είναι μικρά και αποτελούνται μόνο από μια κλάση, θα χρησιμοποιήσουμε το com.example package. Αργότερα που θα προσθέσουμε πολλαπλές κλάσεις στην εφαρμογή μας, θα δημιουργήσουμε καινούργια packages και θα δούμε ξεκάθαρα την χρησιμότητα τους.
Στη αμέσως επόμενη γραμμή ορίζουμε την πρώτη μας κλάση. Κάθε κώδικας που γράφουμε στη Java πρέπει να ανήκει σε μια κλάση (class) ακόμα και να τυπώσουμε στο terminal ένα απλό μήνυμα.
Με τη λέξη κλειδί class ορίζουμε ότι το όνομα που θα γράψουμε αμέσως μετά (App) θα είναι μια κλάση που ο κώδικας της θα ορίζεται από τα curly brackets ( { } ). Η λέξη κλειδί public μπροστά από το class δηλώνει ότι άλλες κλάσεις, από το ίδιο ή διαφορετικό package μπορούν να έχουν πρόσβαση σε μεταβλητές και μεθόδους που έχουμε ορίσει στην κλάση μας.
Η λέξη public ορίζει
το είδος της πρόσβασης που άλλα στοιχεία της εφαρμογής έχουν στη συγκεκριμένη
κλάση και είναι μέλος μια ευρύτερης κατηγορίας που ονομάζεται access modifiers. Υπάρχουν
και άλλοι access modifiers που θα αναλύσουμε σε μελλοντικές ενότητες. Για τώρα, και
μέχρι να φτάσουμε στην θεωρία των κλάσεων, θα χρησιμοποιούμε public.
Το όνομα της κλάσης πρέπει να ξεκινάει με γράμματα και μετά μπορεί να περιέχει και αριθμούς. Ο κανόνας ονομασίας κλάσεων (naming convention) προτείνει ότι το πρώτο γράμμα της κάθε λέξης, από τις οποίες αποτελείται το όνομα της κλάση, να είναι κεφαλαίο. Αυτός το στυλ ονοματολογίας των κλάσεων ονομάζεται “CamelCase”.
Ακόμα ένα στοιχείο που πρέπει να γνωρίζετε για τις κλάσεις,
είναι ότι για κάθε κλάση δημιουργείται και το αντίστοιχο αρχείο στο σκληρό σας δίσκο
με το ίδιο όνομα και με κατάληξη .java. Για τη κλάση App, στο folder με
το όνομα com.example θα βρείτε το αρχείο App.java.
Μια κλάση από μόνη της δεν είναι εκτελέσιμη και κατά συνέπεια ούτε η εφαρμογή που την περιέχει. Για να αποκτήσει η κλάση την δυνατότητα εκτέλεσης, και κατά συνέπεια ολόκληρη η εφαρμογή, θα πρέπει να περιέχει την ειδική μέθοδο main( ).
Πριν προχωρήσουμε στην ανάλυσης της main( ) , θα πρέπει να επισημάνουμε το γεγονός ότι η java είναι case sensitive. Αυτό με απλά λόγια σημαίνει ότι η λέξη Main και η λέξη main για τη Java είναι δύο διαφορετικά ονόματα. Προσέχουμε λοιπόν το όνομα της main για να μπορέσει να λειτουργήσει σωστά η εφαρμογή μας.
Η μέθοδος main( ) είναι η αρχή εκτέλεσης κάθε προγράμματος java. Η λέξη public, με την οποία ξεκινάει ο ορισμός της, επιτρέπει στο JVM της Java να αποκτήσει πρόσβαση σε αυτήν και να ξεκινήσει την εκτέλεση της. Η λέξη static επιτρέπει την απευθείας εκτέλεση της μεθόδου χωρίς να χρειαστεί να δημιουργήσουμε πρώτα ένα αντικείμενο από την κλάση. Η λέξη void ενημερώνει την Java ότι η συγκεκριμένη μέθοδο δεν θα μας επιστρέψει τίποτα πίσω στο πρόγραμμα. Με άλλα λόγια, ο κώδικας που περιέχεται μέσα στην μέθοδο main μπορεί να μας δείξει μηνύματα στο terminal που ίσως να είναι αποτέλεσμα κάποιων πράξεων αλλά δεν αναμένουμε κάποιο αποτέλεσμα πίσω από την ίδια την μέθοδο που μπορούμε να αποθηκεύσουμε σε κάποια μεταβλητή. Η λέξη κλειδί main ορίζει το όνομα της μεθόδου ενώ οι παρενθέσεις ορίζουν την ιδιότητα της – δηλαδή ότι είναι μέθοδος. Μέσα στην παρένθεση ορίζεται ένας String array σε περίπτωση που θέλουμε να περάσουμε κάποιες τιμές στην εφαρμογή μας κατά την εκτέλεση της από το terminal. Τέλος τα curly braces ( { } ) ορίζουν τον κώδικα που θα εκτελέσει η main.
Η παραπάνω εξήγηση του κώδικα σίγουρα σας ακούγεται δύσκολη και μη κατανοητή. Καθώς προχωράμε όμως στα δωρεάν μαθήματα Java, σχεδόν κάθε ενότητα θα καλύπτει και μια από αυτές τις έννοιες. Σε σύντομο χρονικό διάστημα θα μπορείτε άνετα να καταλάβετε όλες τις έννοιες που καλύψαμε κατά τον ορισμό της κλάσης και της main μεθόδου. Για τώρα απλά κρατάμε το γεγονός ότι έχουμε μια κλάση μέσα σε ένα πακέτο και χρειαζόμαστε τον ορισμό της main μεθόδου (ο οποίος δεν αλλάζει ποτέ) μέσα στην κλάση για να τρέξουμε τον κώδικα μας.
Τέλος, έχουμε το System που είναι μια στατική κλάση που παράγει ένα αντικείμενο out στο οποίο ανήκει μια μέθοδο με το όνομα println( ). Ότι κείμενο (String text) περάσουμε σαν παράμετρο μέσα στην println( ) μέθοδο, θα εμφανιστεί σαν αποτέλεσμα στο terminal γιατί έχει οριστεί σαν το default output του System.out αντικειμένου. Προσέχουμε πάντα να ολοκληρώσουμε το statement με semicolon ( ; ).
Αυτό το εύκολο, σε εκτέλεση και λειτουργία, πρόγραμμα περιέχει πολύ θεωρία που δεν μπορούμε ακόμα πλήρως να κατανοήσουμε σε βάθος. Αν κάποιοι (ή όλοι) από τους ορισμούς που χρησιμοποιήσαμε δεν είναι εντελώς κατανοητοί, μην ανησυχείτε γιατί θα επιστρέψουμε σε αυτούς πολλές φορές στα επόμενα δωρεάν μαθήματα Java. Για τώρα απλά κρατάμε τα εξής:
- Η Java είναι case sensitive
- Το πιο απλό πρόγραμμα χρειάζεται μια κλάση
- Κάθε κλάση δημιουργείται μέσα σε ένα πακέτο
- Για να είναι εκτελέσιμη η εφαρμογή, χρειαζόμαστε την main( ) μέθοδο
- Η γραμμή που ορίζει την main( ) θα παραμείνει η ίδια για όλα τα προγράμματα
- Για να δείξουμε μηνύματα στην κονσόλα, χρησιμοποιούμε την prinln( ) μέθοδο.
Ας παραμείνουμε για λίγο ακόμα στη μέθοδο println( ). Για να μπορεί η συγκεκριμένη μέθοδο να εμφανίσει στο terminal ένα text κείμενο (ή String όπως ονομάζεται επίσημα στη Java) θα πρέπει το κείμενο να βρίσκεται μέσα σε double quotes (“ “). Επίσης, αν γράψετε την println( ) χωρίς να περάσετε κάποια παράμετρο μέσα στη παρένθεση, το αποτέλεσμα που θα εμφανιστεί στο terminal θα είναι απλά μια κενή γραμμή.
COMMENTS
Υπάρχουν επίσης σημεία του κώδικα στα οποία ίσως θελήσουμε να προσθέσουμε κάποια επεξηγηματικά σχόλια έτσι ώστε όταν επιστρέψουμε στον ίδιο κώδικα μερικούς μήνες αργότερα θα σας βοηθήσουν να θυμηθούμε γρήγορα την λογική του προγράμματος. Τα comments είναι ένας επαγγελματικός τρόπος να βοηθάμε κυρίως άλλους προγραμματιστές να κατανοήσουν εύκολα την ροή του κώδικα.
Αν θέλουμε να γράψουμε ένα σχόλιο σε μια μόνο γραμμή
χρησιμοποιούμε // ενώ για σχόλια που
απασχολούν πολλές γραμμές μπορούμε να χρησιμοποιήσουμε /* */.
Τα σχόλια είναι πολύ χρήσιμα στον προγραμματισμό γιατί πρώτον δεν τυπώνονται στο τελικό αποτέλεσμα, και δεύτερον γιατί μπορούμε να απενεργοποιήσουμε κομμάτια του κώδικα όταν θέλουμε να κάνουμε κάποιο είδος troubleshooting.
Ας εφαρμόσουμε όλα όσα μάθαμε σε ένα κοινό πρόγραμμα. Γράφετε το παρακάτω κώδικα, και αφού εκτελέσετε τις εντολές clean και install του Maven τρέχετε την main( ) μέθοδο όπως έχουμε ήδη περιγράψει στο προηγούμενο δωρεάν μάθημα Java.
App.java
Output
Welcome to
Premier League
The best
soccer league on the planet
Get all the
results and statistics using our java app
JAVA VIRTUAL MACHINE
Στο πρώτο δωρεάν μάθημα Java είχαμε κατεβάσει και εγκαταστήσει το Java JDK από την Oracle. Η εγκατάσταση του Java JDK είναι απαραίτητη για δύο βασικούς λόγους:
- Να δημιουργηθεί ένα Java Virtual Machine στον υπολογιστή μας
- Να μας δοθεί η ευκαιρία να δημιουργούμε, να κάνουμε compile, και τέλος να εκτελούμε Java κώδικα.
Η ερώτηση όμως παραμένει – τι είναι ακριβώς το JVM? Θα έχετε ακούσει φαντάζομαι το λόγο που η Java έγινε γρήγορα διάσημη ανάμεσα στη κοινότητα των προγραμματιστών – Γιατί τα προγράμματα γραμμένα σε Java έχουν την δυνατότητα να τρέξουν σε όλα τα λειτουργικά συστήματα με σχεδόν καμία αλλαγή τον κώδικα. Πως όμως είναι αυτό εφικτό?
Όταν εγκαταστήσαμε το JDK, εγκαταστάθηκε στον υπολογιστή μας ένα Java Virtual Machine ή αλλιώς JVM. Κάθε Java εφαρμογή που δημιουργούμε και εκτελούμε τρέχει επάνω σε αυτό το JVM χωρίς ποτέ να «βλέπει» το πραγματικό λειτουργικό σύστημα. Με πολύ απλά λόγια, το JVM είναι η CPU, η μνήμη και το λειτουργικό σύστημα που νομίζει ότι βλέπει η κάθε Java εφαρμογή. Αν τώρα από τα Windows, για παράδειγμα, θέλετε να τρέξετε την εφαρμογή σας σε ένα Linux υπολογιστή, δεν έχετε παρά να εγκαταστήσετε το JDK για Linux και είσαστε έτοιμοι. Η Java εφαρμογή θα ψάξει και πάλι θα βρει το JVM που χρειάζεται για να εκτελεστεί χωρίς ποτέ να αντιληφθεί ότι το λειτουργικό σύστημα έχει αλλάξει.
Μπορούμε να δούμε όλη αυτή τη λειτουργία όπως περιγράφεται στην παρακάτω εικόνα:
Ας γυρίσουμε στο τελευταίο πρόγραμμα που δημιουργήσαμε. Η κλάση μας, μέσα στην οποία είναι γραμμένος ο κώδικα μας, έχει κατάληξη .java. Όλα τα java αρχεία, από τα οποία αποτελείται η εφαρμογή μας, έχουν java κατάληξη και αποτελούν το Java Source Code. Οπότε να γραφτεί και να αναπτυχθεί ο Java κώδικας είναι το πρώτο βήμα.
Όταν τώρα εκτελούμε την clean και Install εντολή,
στην πραγματικότητα αυτό που συμβαίνει είναι το JDK ελέγχει αν
συντακτικά ο κώδικα μας είναι σωστός. Αν δεν υπάρχουν λάθη, τότε προχωράει στην
φάση του compile όπου δημιουργούνται καινούργια αρχεία με το ίδιο όνομα αλλά
με κατάληξη .class. Αν
είχαμε μια εφαρμογή με τρεις κλάσεις, τότε μετά το clean και install θα
περιμέναμε να βρούμε τρία ακόμα αρχεία με κατάληξη .class. Τα αρχεία .class δημιουργούνται
μέσα στο target φάκελο τον οποίο δημιουργεί αυτόματα το Maven.
Τα καινούργια αυτά αρχεία
περιέχουν των κώδικα μας σε ψηφιακή μορφή bytecode.
Από εδώ και πέρα αναλαμβάνει το JVM το οποίο έχει την ικανότητα να διαβάσει
αυτά τα αρχεία και να τα μετατρέψει σε γλώσσα μηχανής του αντίστοιχου λειτουργικού
σύστημα στο οποίο τρέχει.
Κάθε φορά που αλλάζει κάτι στον
κώδικα και εκτελούμε την maven εντολή mvn clean
install , το maven καθαρίζει τα παλιά .class αρχεία και
δημιουργεί καινούργια αφού επαναλαμβάνει την διαδικασία του compilation. Επίσης δημιουργείται και ένα καινούργιο αρχείο το
οποίο έχει κατάληξη .jar,
περιέχει όλες τις κλάσεις της εφαρμογής μας και είναι εκτελέσιμο.
Αυτή είναι όλη η εφαρμογή μας
πακεταρισμένη κάτω από ένα όνομα και με κατάληξη .jar, με όλες τις κλάσεις που
χρειάζεται να τρέξει η εφαρμογή μας. Αν και είναι κάπως άστοχο το παράδειγμα,
απλά για να σας δώσω να καταλάβετε τι έχουμε δημιουργήσει, σκεφτείτε το σαν
κάτι αντίστοιχο ενός .exe αρχείου στα Windows. Δηλαδή τώρα έχουμε μια
εκτελέσιμη εφαρμογή? Και αν ναι, αν εκτελέσουμε αυτό το .jar αρχείο σε έναν
άλλο υπολογιστή στο οποίο ήδη έχουμε εγκαταστήσει το JDK, πως μπορούμε να το
εκτελέσουμε? Η απάντηση είναι πολύ απλή: γράφουμε την εντολή Java,
αμέσως μετά ορίζουμε το path
μέσα στο οποίο βρίσκονται τα .class
αρχεία και τέλος την κλάση που περιέχει την main.
Πριν κλείσουμε αυτή το δωρεάν
μάθημα Java ας κάνουμε μια γρήγορη ανακεφαλαίωση στο τι έχουμε καλύψει σαν
θεωρία. Κάθε φορά λοιπόν που εκτελείτε την εντολή mvn clean install, στην ουσία δημιουργείται ένα .jar αρχείο, το οποίο αντιπροσωπεύει
την εκτελέσιμη έκδοση της εφαρμογής. Μέσα σε αυτό το .jar αρχείο (μπορείτε να
το κάνετε unzip και να δείτε τι περιέχει) περιλαμβάνονται όλες οι κλάσεις της
εφαρμογής μας σε bytecode μορφή και
κατάληξη .class. Αυτά τα bytecode
αρχεία τα διαβάζει ο Java Interpreter
(το JVM με άλλα λόγια) και τα
μετατρέπει σε γλώσσα μηχανής του λειτουργικού σύστημα επάνω στο οποίο τρέχει η
εφαρμογή μας.
Μην ξεχάσετε να κάνετε ένα μικρό donation έτσι ώστε αυτό το blog να μεγαλώσει ακόμα πιο πολύ και να έχει περισσότερες δυνατότητες στην online παράδοση δωρεάν μαθημάτων.
full-width
1 Comments
Εξαιρετικό μάθημα. Νομίζω το καλύτερο που ανέβηκε ποτέ σε ελληνόγλωσσο site!
ReplyDeleteΗ γνώμη σας είναι σημαντική.