Προγραμματισμός

Μάθετε την Java από την αρχή

Θέλετε λοιπόν να προγραμματίσετε στην Java; Αυτό είναι υπέροχο και έχετε έρθει στο σωστό μέρος. ο Σειρά Java 101 παρέχει μια αυτοκαθοδηγούμενη εισαγωγή στον προγραμματισμό Java, ξεκινώντας από τα βασικά και καλύπτοντας όλες τις βασικές έννοιες που πρέπει να γνωρίζετε για να γίνετε παραγωγικός προγραμματιστής Java. Αυτή η σειρά είναι τεχνική, με πολλά παραδείγματα κώδικα που θα σας βοηθήσουν να κατανοήσετε τις έννοιες καθώς προχωράμε. Θα υποθέσω ότι έχετε ήδη κάποια εμπειρία προγραμματισμού, όχι μόνο στην Java.

Αυτό το πρώτο άρθρο εισάγει την πλατφόρμα Java και εξηγεί τη διαφορά μεταξύ των τριών εκδόσεών της: Java SE, Java EE και Java ME. Θα μάθετε επίσης για το ρόλο της εικονικής μηχανής Java (JVM) στην ανάπτυξη εφαρμογών Java. Θα σας βοηθήσω να δημιουργήσετε ένα Java Development Kit (JDK) στο σύστημά σας, ώστε να μπορείτε να αναπτύξετε και να εκτελέσετε προγράμματα Java και θα σας ξεκινήσω με την αρχιτεκτονική μιας τυπικής εφαρμογής Java. Τέλος, θα μάθετε πώς να μεταγλωττίζετε και να εκτελείτε μια απλή εφαρμογή Java.

Ενημερώθηκε για το Java 12 και το νέο JShell

Αυτή η σειρά έχει ενημερωθεί για το Java 12 και περιλαμβάνει μια γρήγορη εισαγωγή στο νέο jshell: ένα διαδραστικό εργαλείο για εκμάθηση Java και πρωτότυπο κώδικα Java.

λήψη Λήψη του κώδικα Λήψη του πηγαίου κώδικα για παράδειγμα εφαρμογές σε αυτό το σεμινάριο. Δημιουργήθηκε από τον Jeff Friesen για το JavaWorld.

Τι είναι η Java;

Μπορείτε να σκεφτείτε την Java ως γλώσσα γενικού σκοπού και αντικειμενοστραφής που μοιάζει πολύ με C και C ++, αλλά η οποία είναι ευκολότερη στη χρήση και σας επιτρέπει να δημιουργήσετε πιο ισχυρά προγράμματα. Δυστυχώς, αυτός ο ορισμός δεν σας δίνει πολλές πληροφορίες για την Java. Το 2000, η ​​Sun Microsystems (δημιουργός της πλατφόρμας Java) περιέγραψε την Java με αυτόν τον τρόπο:

Η Java είναι μια απλή, αντικειμενοστρεφής, κατανοητή από το δίκτυο, ερμηνευμένη, στιβαρή, ασφαλής, ουδέτερη αρχιτεκτονική, φορητή, υψηλής απόδοσης, πολλαπλών νημάτων, δυναμική γλώσσα υπολογιστή.

Ας εξετάσουμε κάθε έναν από αυτούς τους ορισμούς ξεχωριστά.

Η Java είναι μια απλή γλώσσα. Η Java αρχικά διαμορφώθηκε μετά από C και C ++, μείον μερικά δυνητικά μπερδεμένα χαρακτηριστικά. Οι δείκτες, η κληρονομιά πολλαπλών εφαρμογών και η υπερφόρτωση χειριστή είναι ορισμένες δυνατότητες C / C ++ που δεν αποτελούν μέρος της Java. Ένα χαρακτηριστικό που δεν απαιτείται από το C / C ++, αλλά είναι απαραίτητο για την Java, είναι μια εγκατάσταση συλλογής απορριμμάτων που λαμβάνει αυτόματα αντικείμενα και πίνακες.

Η Java είναι μια αντικειμενοστρεφής γλώσσα. Η αντικειμενοστραφής εστίαση της Java επιτρέπει στους προγραμματιστές να εργαστούν για την προσαρμογή της Java στην επίλυση ενός προβλήματος, αντί να μας αναγκάζει να χειριστούμε το πρόβλημα για να ανταποκριθούμε στους γλωσσικούς περιορισμούς. Αυτό διαφέρει από μια δομημένη γλώσσα όπως το C. Για παράδειγμα, ενώ η Java σάς επιτρέπει να εστιάζετε σε αντικείμενα λογαριασμού ταμιευτηρίου, το C απαιτεί από εσάς να σκέφτεστε χωριστά για λογαριασμό ταμιευτηρίου κατάσταση (μια τέτοια ισορροπία) και συμπεριφορές (όπως κατάθεση και ανάληψη).

Η Java είναι μια γλώσσα που καταλαβαίνει το δίκτυο. Η εκτεταμένη βιβλιοθήκη δικτύου της Java διευκολύνει την αντιμετώπιση πρωτοκόλλων δικτύου Transmission Control Protocol / Internet Protocol (TCP / IP), όπως HTTP (HyperText Transfer Protocol) και FTP (File Transfer Protocol), και απλοποιεί το έργο της δημιουργίας συνδέσεων δικτύου. Επιπλέον, τα προγράμματα Java μπορούν να έχουν πρόσβαση σε αντικείμενα σε ένα δίκτυο TCP / IP, μέσω Uniform Resource Locators (URLs), με την ίδια ευκολία με την πρόσβαση σε αυτά από το τοπικό σύστημα αρχείων.

Η Java είναι μια ερμηνευμένη γλώσσα. Κατά το χρόνο εκτέλεσης, ένα πρόγραμμα Java εκτελείται έμμεσα στην υποκείμενη πλατφόρμα (όπως τα Windows ή το Linux) μέσω μιας εικονικής μηχανής (που είναι μια αναπαράσταση λογισμικού μιας υποθετικής πλατφόρμας) και του σχετικού περιβάλλοντος εκτέλεσης. Η εικονική μηχανή μεταφράζει το πρόγραμμα Java bytecodes (οδηγίες και σχετικά δεδομένα) σε συγκεκριμένες πλατφόρμες οδηγίες μέσω ερμηνείας. Ερμηνεία είναι η πράξη του να καταλάβουμε τι σημαίνει μια εντολή bytecode και στη συνέχεια να επιλέξεις ισοδύναμες "κονσέρβες" συγκεκριμένες πλατφόρμες οδηγίες για εκτέλεση. Στη συνέχεια, η εικονική μηχανή εκτελεί αυτές τις οδηγίες για συγκεκριμένη πλατφόρμα.

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

Η Java είναι μια ισχυρή γλώσσα. Τα προγράμματα Java πρέπει να είναι αξιόπιστα, επειδή χρησιμοποιούνται τόσο σε εφαρμογές κρίσιμες για τον καταναλωτή όσο και σε αποστολές, που κυμαίνονται από συσκευές αναπαραγωγής Blu-ray έως συστήματα πλοήγησης ή ελέγχου αέρα. Οι γλωσσικές δυνατότητες που βοηθούν στο Java να είναι ισχυρές περιλαμβάνουν δηλώσεις, διπλό έλεγχο τύπου κατά το χρόνο μεταγλώττισης και χρόνο εκτέλεσης (για την αποφυγή προβλημάτων αναντιστοιχίας έκδοσης), πραγματικούς πίνακες με αυτόματο έλεγχο ορίων και παράλειψη δεικτών. (Ανατρέξτε στην ενότητα "Στοιχεία στοιχειώδους γλώσσας Java" για να ξεκινήσετε με τύπους γλώσσας Java, κυριολεκτικά, μεταβλητές και άλλα.)

Μια άλλη πτυχή της ευρωστίας της Java είναι ότι οι βρόχοι πρέπει να ελέγχονται από εκφράσεις Boolean αντί για ακέραιες εκφράσεις όπου το 0 είναι ψευδές και η μη μηδενική τιμή είναι αληθής. Για παράδειγμα, η Java δεν επιτρέπει βρόχο τύπου C όπως ενώ (x) x ++; γιατί ο βρόχος μπορεί να μην τελειώσει εκεί που αναμενόταν. Αντ 'αυτού, πρέπει να παρέχετε ρητά μια Boolean έκφραση, όπως ενώ (x! = 10) x ++; (που σημαίνει ότι ο βρόχος θα τρέξει μέχρι Χ ισούται με 10).

Η Java είναι μια ασφαλής γλώσσα. Τα προγράμματα Java χρησιμοποιούνται σε δίκτυα / κατανεμημένα περιβάλλοντα. Επειδή τα προγράμματα Java μπορούν να μετεγκατασταθούν και να εκτελεστούν σε διάφορες πλατφόρμες ενός δικτύου, είναι σημαντικό να προστατευθούν αυτές οι πλατφόρμες από κακόβουλο κώδικα που μπορεί να διαδώσει ιούς, να κλέψει πληροφορίες πιστωτικής κάρτας ή να εκτελέσει άλλες κακόβουλες ενέργειες. Οι λειτουργίες γλώσσας Java που υποστηρίζουν την ευρωστία (όπως η παράλειψη δεικτών) λειτουργούν με λειτουργίες ασφαλείας, όπως το μοντέλο ασφαλείας Java sandbox και κρυπτογράφηση δημόσιου κλειδιού. Μαζί αυτές οι δυνατότητες αποτρέπουν ιούς και άλλους επικίνδυνους κώδικες να καταστρέφουν μια ανυποψίαστη πλατφόρμα.

Θεωρητικά, η Java είναι ασφαλής. Στην πράξη, έχουν εντοπιστεί και αξιοποιηθεί διάφορες ευπάθειες ασφαλείας. Ως αποτέλεσμα, η Sun Microsystems τότε και η Oracle συνεχίζουν τώρα να κυκλοφορούν ενημερώσεις ασφαλείας.

Η Java είναι μια ουδέτερη αρχιτεκτονική γλώσσα. Τα δίκτυα συνδέουν πλατφόρμες με διαφορετικές αρχιτεκτονικές που βασίζονται σε διάφορους μικροεπεξεργαστές και λειτουργικά συστήματα. Δεν μπορείτε να περιμένετε ότι η Java θα δημιουργήσει οδηγίες για συγκεκριμένη πλατφόρμα και θα έχει αυτές τις οδηγίες "κατανοητές" από όλα τα είδη πλατφορμών που αποτελούν μέρος ενός δικτύου. Αντ 'αυτού, η Java δημιουργεί ανεξάρτητες από την πλατφόρμα οδηγίες bytecode που είναι εύκολο να ερμηνευθούν από κάθε πλατφόρμα (μέσω της εφαρμογής του JVM).

Η Java είναι μια φορητή γλώσσα. Η ουδετερότητα της αρχιτεκτονικής συμβάλλει στη φορητότητα. Ωστόσο, υπάρχουν περισσότερα για τη φορητότητα της Java από τις οδηγίες bytecode ανεξάρτητες από την πλατφόρμα. Λάβετε υπόψη ότι τα ακέραια μεγέθη τύπου δεν πρέπει να διαφέρουν. Για παράδειγμα, ο ακέραιος τύπος 32-bit πρέπει πάντα να είναι υπογεγραμμένος και να καταλαμβάνει 32 bit, ανεξάρτητα από το πού γίνεται επεξεργασία του ακέραιου 32-bit (π.χ., μια πλατφόρμα με καταχωρητές 16-bit, μια πλατφόρμα με καταχωρητές 32-bit ή μια πλατφόρμα με καταχωρητές 64-bit). Οι βιβλιοθήκες της Java συμβάλλουν επίσης στη φορητότητα. Όπου είναι απαραίτητο, παρέχουν τύπους που συνδέουν κώδικα Java με συγκεκριμένες δυνατότητες πλατφόρμας με τον πιο φορητό τρόπο.

Η Java είναι μια γλώσσα υψηλής απόδοσης. Η ερμηνεία αποδίδει ένα επίπεδο απόδοσης που συνήθως είναι περισσότερο από επαρκές. Για σενάρια εφαρμογών πολύ υψηλής απόδοσης, η Java χρησιμοποιεί σύνταξη just-in-time, η οποία αναλύει ερμηνευμένες ακολουθίες εντολών bytecode και συλλέγει ακολουθίες εντολών που ερμηνεύονται συχνά σε συγκεκριμένες πλατφόρμες οδηγίες. Οι επακόλουθες προσπάθειες ερμηνείας αυτών των ακολουθιών εντολών bytecode έχουν ως αποτέλεσμα την εκτέλεση ισοδύναμων συγκεκριμένων εντολών πλατφόρμας, με αποτέλεσμα την ενίσχυση της απόδοσης.

Η Java είναι μια πολυήματη γλώσσα. Για τη βελτίωση της απόδοσης των προγραμμάτων που πρέπει να ολοκληρώσουν πολλές εργασίες ταυτόχρονα, η Java υποστηρίζει την έννοια του εκτέλεση με σπείρωμα. Για παράδειγμα, ένα πρόγραμμα που διαχειρίζεται ένα γραφικό περιβάλλον εργασίας χρήστη (GUI) ενώ περιμένει είσοδο από μια σύνδεση δικτύου χρησιμοποιεί ένα άλλο νήμα για να εκτελέσει την αναμονή αντί να χρησιμοποιήσει το προεπιλεγμένο νήμα GUI και για τις δύο εργασίες. Αυτό διατηρεί το GUI ανταποκρινόμενο. Τα πρωτόγοντα συγχρονισμού της Java επιτρέπουν στα νήματα να επικοινωνούν με ασφάλεια μεταξύ τους δεδομένα χωρίς να καταστρέφουν τα δεδομένα. (Δείτε τον προγραμματισμό με σπείρωμα στην Java που συζητείται αλλού στη σειρά Java 101.)

Η Java είναι μια δυναμική γλώσσα. Επειδή οι διασυνδέσεις μεταξύ κώδικα προγράμματος και βιβλιοθηκών συμβαίνουν δυναμικά κατά το χρόνο εκτέλεσης, δεν είναι απαραίτητο να τις συνδέσετε ρητά. Ως αποτέλεσμα, όταν εξελίσσεται ένα πρόγραμμα ή μία από τις βιβλιοθήκες του (για παράδειγμα, για διόρθωση σφαλμάτων ή βελτίωση απόδοσης), ένας προγραμματιστής χρειάζεται μόνο να διανείμει το ενημερωμένο πρόγραμμα ή τη βιβλιοθήκη. Παρόλο που η δυναμική συμπεριφορά οδηγεί σε λιγότερο κώδικα για διανομή όταν πραγματοποιείται αλλαγή έκδοσης, αυτή η πολιτική διανομής μπορεί επίσης να οδηγήσει σε διενέξεις έκδοσης. Για παράδειγμα, ένας προγραμματιστής καταργεί έναν τύπο τάξης από μια βιβλιοθήκη ή το μετονομάζει. Όταν μια εταιρεία διανέμει την ενημερωμένη βιβλιοθήκη, τα υπάρχοντα προγράμματα που εξαρτώνται από τον τύπο τάξης θα αποτύχουν. Για να μειώσει σημαντικά αυτό το πρόβλημα, η Java υποστηρίζει ένα τύπος διεπαφής, που είναι σαν σύμβαση μεταξύ δύο μερών. (Δείτε διεπαφές, τύπους και άλλες αντικειμενοστρεφείς λειτουργίες γλώσσας που συζητούνται αλλού στη σειρά Java 101.)

Η αποσυσκευασία αυτού του ορισμού μας διδάσκει πολλά για την Java. Το πιο σημαντικό, αποκαλύπτει ότι η Java είναι τόσο μια γλώσσα όσο και μια πλατφόρμα. Θα μάθετε περισσότερα σχετικά με τα στοιχεία της πλατφόρμας Java - δηλαδή την εικονική μηχανή Java και το περιβάλλον εκτέλεσης Java - αργότερα σε αυτό το σεμινάριο.

Τρεις εκδόσεις Java: Java SE, Java EE και Java ME

Η Sun Microsystems κυκλοφόρησε το κιτ ανάπτυξης λογισμικού Java 1.0 (JDK) τον Μάιο του 1995. Το πρώτο JDK χρησιμοποιήθηκε για την ανάπτυξη εφαρμογών επιτραπέζιου υπολογιστή και μικροεφαρμογών και στη συνέχεια η Java εξελίχθηκε ώστε να περιλαμβάνει προγραμματισμό εταιρικών διακομιστών και κινητών συσκευών. Η αποθήκευση όλων των απαραίτητων βιβλιοθηκών σε ένα μόνο JDK θα έκανε το JDK πολύ μεγάλο για διανομή, ειδικά επειδή η διανομή στη δεκαετία του 1990 περιοριζόταν από CD μικρού μεγέθους και χαμηλές ταχύτητες δικτύου. Δεδομένου ότι οι περισσότεροι προγραμματιστές δεν χρειάζονταν κάθε τελευταίο API (ένας προγραμματιστής εφαρμογών για επιτραπέζιους υπολογιστές δεν θα χρειαζόταν να έχει πρόσβαση σε εταιρικά Java API), η Sun συνήγαγε την Java σε τρεις κύριες εκδόσεις. Αυτά τελικά έγιναν γνωστά ως Java SE, Java EE και Java ME:

  • Java Platform, Standard Edition (Java SE) είναι η πλατφόρμα Java για την ανάπτυξη εφαρμογών από την πλευρά του πελάτη (που εκτελούνται σε επιτραπέζιους υπολογιστές) και μικροεφαρμογών (που εκτελούνται σε προγράμματα περιήγησης στο Web). Λάβετε υπόψη ότι για λόγους ασφαλείας οι μικροεφαρμογές δεν υποστηρίζονται πλέον επίσημα.
  • Java Platform, Enterprise Edition (Java EE) είναι η πλατφόρμα Java που έχει δημιουργηθεί πάνω από το Java SE, η οποία χρησιμοποιείται αποκλειστικά για την ανάπτυξη εφαρμογών διακομιστή προσανατολισμένων στην επιχείρηση. Περιλαμβάνονται εφαρμογές από διακομιστή Servlets Java, τα οποία είναι προγράμματα Java που μοιάζουν με μικροεφαρμογές αλλά εκτελούνται σε διακομιστή και όχι σε πελάτη. Servlets συμμορφώνονται με το Java Servlet API.
  • Java Platform, Micro Edition (Java ME) είναι επίσης χτισμένο στην κορυφή του Java SE. Είναι η πλατφόρμα Java για ανάπτυξη MIDlets, τα οποία είναι προγράμματα Java που εκτελούνται σε κινητές συσκευές πληροφοριών και Xlets, τα οποία είναι προγράμματα Java που εκτελούνται σε ενσωματωμένες συσκευές.

Το Java SE είναι η θεμελιώδης πλατφόρμα για την Java και είναι το επίκεντρο της σειράς Java 101. Τα παραδείγματα κώδικα θα βασίζονται στην πιο πρόσφατη έκδοση της Java κατά τη στιγμή της σύνταξης, Java 12.

Η πλατφόρμα Java και το JVM

Η Java είναι τόσο μια γλώσσα προγραμματισμού όσο και μια πλατφόρμα για την εκτέλεση μεταγλωττισμένου κώδικα Java. Αυτή η πλατφόρμα αποτελείται κυρίως από το JVM, αλλά περιλαμβάνει επίσης ένα περιβάλλον εκτέλεσης που υποστηρίζει την εκτέλεση του JVM στην υποκείμενη (εγγενή) πλατφόρμα. Το JVM περιλαμβάνει διάφορα στοιχεία για τη φόρτωση, την επαλήθευση και την εκτέλεση κώδικα Java. Το σχήμα 1 δείχνει πώς ένα πρόγραμμα Java εκτελείται σε αυτήν την πλατφόρμα.

Τζεφ Φρίσεν

Στην κορυφή του διαγράμματος υπάρχει μια σειρά αρχείων κατηγορίας προγραμμάτων, ένα από τα οποία συμβολίζεται ως το κύριο αρχείο κλάσης. Ένα πρόγραμμα Java αποτελείται τουλάχιστον από το κύριο αρχείο κλάσης, το οποίο είναι το αρχείο πρώτης τάξης που φορτώνεται, επαληθεύεται και εκτελείται.

Η JVM αναθέτει τη φόρτωση κλάσης στο στοιχείο φόρτωσης κλάσης. Οι Classloaders φορτώνουν αρχεία κλάσης από διάφορες πηγές, όπως συστήματα αρχείων, δίκτυα και αρχεία αρχειοθέτησης. Μονώνουν το JVM από τις περιπλοκές της φόρτωσης τάξης.

Ένα φορτωμένο αρχείο κλάσης αποθηκεύεται στη μνήμη και αντιπροσωπεύεται ως αντικείμενο που δημιουργήθηκε από το Τάξη τάξη. Μόλις φορτωθεί, ο επαληθευτής bytecode επαληθεύει τις διάφορες οδηγίες bytecode για να διασφαλίσει ότι είναι έγκυρες και δεν θα θέσει σε κίνδυνο την ασφάλεια.

Εάν οι bytecodes του αρχείου κλάσης δεν είναι έγκυροι, το JVM τερματίζει. Διαφορετικά, το συστατικό του διερμηνέα ερμηνεύει την εντολή bytecode μία κάθε φορά. Η ερμηνεία προσδιορίζει εντολές bytecode και εκτελεί αντίστοιχες εγγενείς οδηγίες.

Ορισμένες ακολουθίες εντολών bytecode εκτελούνται πιο συχνά από άλλες. Όταν ο διερμηνέας εντοπίσει αυτήν την κατάσταση, ο μεταγλωττιστής JVM just-in-time (JIT) μεταγλωττίζει την ακολουθία bytecode σε εγγενή κώδικα για ταχύτερη εκτέλεση.

Κατά τη διάρκεια της εκτέλεσης, ο διερμηνέας αντιμετωπίζει συνήθως ένα αίτημα για εκτέλεση ενός bytecode άλλου αρχείου κλάσης (που ανήκει στο πρόγραμμα ή σε μια βιβλιοθήκη). Όταν συμβεί αυτό, ο φορτωτής κλάσης φορτώνει το αρχείο κλάσης και ο επαληθευτής bytecode επαληθεύει τον bytecode του φορτωμένου κλάσης προτού εκτελεστεί. Επίσης κατά τη διάρκεια της εκτέλεσης, οι οδηγίες bytecode ενδέχεται να ζητήσουν από το JVM να ανοίξει ένα αρχείο, να εμφανίσει κάτι στην οθόνη, να κάνει έναν ήχο ή να εκτελέσει μια άλλη εργασία που απαιτεί συνεργασία με την εγγενή πλατφόρμα. Το JVM αποκρίνεται χρησιμοποιώντας την τεχνολογία γέφυρας Java Native Interface (JNI) για να αλληλεπιδράσει με την εγγενή πλατφόρμα για την εκτέλεση της εργασίας.