Κεφάλαιο 1: Τα βασικά της Java

Σχετικά έγγραφα
Δομές ελέγχου ροής προγράμματος

32-bit signed υποδιαστολής) Double διπλής ακρίβειας 64-bit signed Char unicode character 16-bit Boolean Boolean true or false

Αντικειµενοστρεφής Προγραµµατισµός

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Mεταβλητές (variables) και Σταθερές (constants)

Αντικειμενοστραφής Προγραμματισμός ΙΙ Java

Προγραμματισμός 2 Σημειώσεις εργαστηρίου

Εισαγωγή στη JAVA. Εισαγωγή στη Java. Η Java είναι δημιούργημα της SUN MICROSYSTEMS.

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

a = 10; a = k; int a,b,c; a = b = c = 10;

Βασικά Στοιχεία της Java

Δομημένος Προγραμματισμός (ΤΛ1006)

Αντικειμενοστρεφής Προγραμματισμός

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 8 & 9 18/10/07

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

ΕισαγωγήστουςΗ/Υ. PHP Hypertext Preprocessor

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

Βασικά Στοιχεία της Java

for for for for( . */

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 3: Έλεγχος ροής προγράμματος

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

Β. Εισαγωγή στον Προγραμματισμό Η/Υ με την JavaScript

HelloApplet. Παύλος Εφραιμίδης Java Applets 1

ΗΥ-150. Προγραµµατισµός. Εντολές Ελέγχου Ροής

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Σύντομη εισαγωγή στην Java

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal 1 ο Μέρος σηµειώσεων (Ενότητες 8.1 & 8.2 σχολικού βιβλίου)

Αντικείµενα. ηµιουργία και χρησιµοποίηση αντικειµένων. ηµιουργία αντικειµένων

Στοιχεία εξεταζόµενου Αριθµός Απάντησης Βαθµολογία. Σύνολο (Θέµα 4 ο )

Βασικά στοιχεία της Java

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 1: Εισαγωγικές έννοιες

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 18/3/2008

3. Εκφράσεις και έλεγχος ροής

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 22/11/07

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

if(συνθήκη) {... // οµάδα εντολών } C: Από τη Θεωρία στην Εφαρµογή 5 ο Κεφάλαιο

Wrapper Classes, Abstract Classes and Interfaces

Εισαγωγή στον Προγραμματισμό

2.1 Αντικειµενοστρεφής προγραµµατισµός

Στοιχειώδης προγραμματισμός σε C++

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting)

Οντοκεντρικός Προγραμματισμός

οµές Επιλογής Εντολές if και switch

Επιλογή και επανάληψη. Λογική έκφραση ή συνθήκη

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

Ανάπτυξη και Σχεδίαση Λογισμικού

ΗΥ-150. Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

Κλάσεις και Αντικείµενα

Ανάπτυξη και Σχεδίαση Λογισμικού

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

Java sessions. Part 1 - Βασικά έννοιες - μέθοδοι

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08

Επανάληψη για τις Τελικές εξετάσεις

Διαδικασιακός Προγραμματισμός

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ. Αλγοριθμική και Προγραμματισμός

ΗΥ-150. Προγραμματισμός

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Είναι μια αλληλουχία κατάλληλων οδηγιών(εντολών) που εκτελεί ο υπολογιστής για την επίλυση ενός προβλήματος.

Βασικοί τύποι δεδομένων (Pascal) ΕΠΑ.Λ Αλίμου Γ Πληροφορική Δομημένος Προγραμματισμός (Ε) Σχολ. Ετος Κων/νος Φλώρος

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Υποστηρικτικό υλικό Σημειώσεις

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

2 ΓΡΑΜΜΙΚΕΣ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 3 Ο. Σταθερές-Παράμετροι-Μεταβλητές Αριθμητικοί & Λογικοί Τελεστές Δομή ελέγχου-επιλογής Σύνθετοι έλεγχοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Εντολές επιλογής Επαναλήψεις (if, switch, while)

H ΓΛΩΣΣΑ C. Μάθηµα 1: Το Πρώτο µας Πρόγραµµα σε C. ηµήτρης Ψούνης

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 8/11/07

ΕΠΛ 012. JavaScripts

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

scanf() scanf() stdin scanf() printf() int float double %lf float

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός

Πανεπιστήµιο Πειραιά Τµήµα Εκπαιδευτικής Τεχνολογίας και Ψηφιακών Συστηµάτων. Εισαγωγή στη γλώσσα προγραµµατισµού. Java. Βασίλειος Βεσκούκης

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές

Προγραμματισμός Η/Υ (ΤΛ2007 )

Δομές ελέγχου & επανάληψης

ΕΝΟΤΗΤΑ 4 Λήψη Αποφάσεων και Συναρτήσεις Ελέγχου

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Κλάσεις.

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

Δεδομένα, τελεστές, είσοδος/έξοδος

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Στοιχειώδεις Δοµές Δεδοµένων Δοµικά Στοιχεία και Πίνακες Κεφάλαιο 3 (3.1 και 3.2) Ε. Μαρκάκης Επικ. Καθηγητής

Διαδικασιακός Προγραμματισμός

Transcript:

Κεφάλαιο 1: Τα βασικά της Java Εξοικείωση µε το περιβάλλον Αυτό το µάθηµα αποσκοπεί σε µία πρώτη γνωριµία µε τη Java Για να ξεκινήσουµε... Για να ξεκινήσουµε θα πρέπει να έχουµε εγκαταστήσει στον υπολογιστή µας την τρέχουσα έκδοση της JAVA: Μπορούµε να την κατεβάσουµε από το site της Java της εταιρίας Sun (http://java.sun.com) Ανεξαρτησία από µηχανή Ο µεταγλωττιστής της Java δεν παράγει εκτελέσιµο κώδικα αλλά παράγει µία µορφή αρχείων γνωστή ως Java Bytecodes που δεν είναι εκτελέσιµη απευθείας από µία µηχανή αλλά εκτελείται από την εικονική µηχανή Java (Java Virtual Machine JVM). Αυτό δίνει στην Java το πλεονέκτηµα της ανεξαρτησίας από την συγκεκριµένη µηχανή στην οποία εκτελείται. Αρκεί κανείς να έχει εγκαταστήσει την κατάλληλη έκδοση της Java και το πρόγραµµα θα εκτελεστεί από την εικονική µηχανή. Αυτή η επινόηση έµεινε γνωστή σαν «Γράψε µια φορά για να τρέχει παντού» (Write Once Run Everywhere). Εικονική Μηχανή Java (Java Virtual Machine - JVM) Η ακόλουθη εικόνα µας δείχνει την ιδέα της εικονικής µηχανής Java. Όπως δείχνει και η εικόνα το ίδιο πρόγραµµα αφού µεταφραστεί σε bytecodes στη συνέχεια µπορεί να τρέξει σε διαφορετικές µηχανές (π.χ Windows, Solaris ή MacOS). Αρκεί το σύστηµα να είναι εφοδιασµένο µε την κατάλληλη JVM που θα το εκτελέσει. Γιατί λοιπόν Java; Σ' αυτό το εδάφιο θα εξηγήσουµε τους λόγους που είναι προτιµότερο να χρησιµοποιήσουµε Java από άλλες εναλλακτικές λύσεις, κυρίως για τον προγραµµατισµό διαδικτυακών εφαρµογών αλλά και γενικότερα. - 1 -

Από την πηγή... Σύµφωνα µε τα λόγια του Tim Lindholm Senior Staff Engineer της JavaSoft σε άρθρο του τον Απρίλιο του 1996: «Με την Java σαν γλώσσα επέκτασης, ένα πρόγραµµα πλοήγησης του Web θα µπορούσε να έχει απεριόριστες δυνατότητες. Οι προγραµµατιστές θα µπορούσαν να γράψουν τα applets µια φορά και αυτά µετά θα έτρεχαν σε οποιαδήποτε µηχανή, οπουδήποτε. Οι επισκέπτες σε σελίδες µε Java δυνατότητες, θα µπορούσαν να χρησιµοποιήσουν το περιεχόµενο αυτών των σελίδων εφησυχασµένοι ότι τίποτα δεν θα µπορούσε να φθείρει την µηχανή τους. Με τα applets σαν αρχικό σηµείο εστίασης, η Java επέδειξε ένα νέο τρόπο για την διάθεση λογισµικού µε το Internet. Αυτός ο νέος παραδειγµατισµός προγραµµατισµού πηγαίνει πέρα από τα προγράµµατα πλοήγησης. Πιστεύουµε ότι είναι ένας νεωτερισµός µε την δυνατότητα να αλλάξει την πορεία της Πληροφορικής.» Λόγοι για να χρησιµοποιήσουµε τη Java Η Java είναι σχεδιασµένη για το Internet. Προγράµµατα της Java µπορούν να τρέχουν σε προγράµµατα πλοήγησης εφοδιασµένα µε την κατάλληλη JVM. Αφού το πρόγραµµα κατέβει από το Internet εκτελείται στη µηχανή του πελάτη και όχι στο Server. Αυτά τα προγράµµατα της Java είναι γνωστά σαν Java Applets. Η Java είναι σχεδιασµένη µε στόχο την εξασφάλιση ασφάλειας. Ένα Java Applet εκτελείται µε απόλυτη ασφάλεια στη µηχανή του χρήστη και δεν µπορεί να κάνει τίποτα που να µην επιτρέπεται από την πολιτική ασφάλειας της JVM της µηχανής του πελάτη. Η Java προσφέρει εκτέλεση σε όλους τους υπολογιστές. Με το επίπεδο αφαίρεσης υλικού της JVΜ ένα πρόγραµµα Java εκτελείται σε όλους τους υπολογιστές ανεξαρτήτως Λειτουργικού Συστήµατος. Αρκεί αυτές να είναι εφοδιασµένες µε την κατάλληλη JVM (Java Virtual Machine) Η Java είναι µια πλούσια γλώσσα προγραµµατισµού. Η Java είναι πολύ ισχυρή αντικειµενοστραφής γλώσσα προγραµµατισµού για το Internet (και όχι µόνο) και όχι µία απλή script γλώσσα για την σύνθεση συστατικών (π.χ. VBScript µε ActiveX controls). Αυτό µας επιτρέπει να γράφουµε προγράµµατα τα οποία είναι εύκολο να συντηρηθούν και να εξελιχτούν στο χρόνο και όχι απλά σενάρια (scripts) τα οποία παίζουν το ρόλο της κόλλας για components που έχουν γίνει µε άλλες γλώσσες αλλά γενικά δεν µπορούµε να τα αλλάξουµε ή να ελέγξουµε την εξέλιξή τους. Η Java προσφέρει την ευελιξία της δυναµικής σύνδεσης. Ένα πρόγραµµα Java εκτελείται από µία εικονική µηχανή και οι τάξεις (τα αρχεία.class που περιέχουν τα bytecodes) φορτώνονται από την JVM όταν εκτελείται το πρόγραµµα. Αυτό σηµαίνει ότι µπορεί κανείς να αντικαταστήσει µία παλιά τάξη µε µία νέα ακόµα και την στιγµή που εκτελείται το πρόγραµµα. Αυτό είναι ένα βασικό χαρακτηριστικό των components. Έτσι οι τάξεις Java πάνε πέρα από τον αντικειµενοστραφή προγραµµατισµό, στον προγραµµατισµό βασισµένο σε συστατικά (component-based programming). Είναι επίσης σηµαντικό ότι η Java είναι σχεδιασµένη γι αυτό και δεν απαιτείται η προσθήκη κάποιου πολύπλοκου µοντέλου (όπως το COM) της Microsoft, πάνω από µία γλώσσα προγραµµατισµού που δεν είναι σχεδιασµένη µε αυτό τον τρόπο (π.χ. Visual C++). Αρκεί κανείς να µελετήσει το specification του COM και να το συγκρίνει µε το specification των Java Beans για να πειστεί γι αυτό! Πιθανά µειονεκτήµατα της Java Τα προγράµµατα πλοήγησης ενδέχεται να µην µπορούν να εκτελέσουν το Applet µας. Αυτό διότι τα προγράµµατα πλοήγησης ενδέχεται να µην είναι εφοδιασµένα µε την τρέχουσα έκδοση της Java. Ο κώδικας που είναι µεταγλωττισµένος για µια συγκεκριµένη µηχανή είναι ταχύτερος από τον κώδικα που εκτελείται από ένα µεταφραστή (interpreter). Πάντως αξίζει να σηµειωθεί ότι µία τεχνική που ονοµάζεται Just-In Time µεταγλώττιση (JIT compilation) έχει βελτιώσει σηµαντικά τους χρόνους εκτέλεσης των Java προγραµµάτων. Αν και ακόµα τα προγράµµατα - 2 -

της Java δεν έχουν γίνει ταχύτερα από τον µεταγλωττισµένο κώδικα της C++, πολλοί είναι αυτοί που υποστηρίζουν ότι είναι αρκετά γρήγορα για να µην γίνει η ταχύτητα η αιτία να µην πετύχει η Java. Eφαρµογές Java Σ' αυτό το µάθηµα θα κάνουµε την πρώτη µας εφαρµογή σε Java η οποία (φυσικά) θα είναι το πρόγραµµα HelloWorld! και θα δούµε πως είναι µία εφαρµογή στη Java. Τι είναι µία εφαρµογή στη Java Μία Java εφαρµογή είναι ένα πρόγραµµα σχεδιασµένο για να εκτελεστεί από µία JVM στη µηχανή του χρήστη και όχι από ένα πρόγραµµα πλοήγησης. Μία Java εφαρµογή θα πρέπει να έχει και µία συνάρτηση main (κύρια) που είναι και το σηµείο εισόδου στην εφαρµογή (δηλαδή από εκεί ξεκινά το πρόγραµµα). Φυσικά µια συνάρτηση main θα πρέπει να βρίσκεται µέσα σε µία τάξη (class). Η Java είναι µία αντικειµενοστραφής γλώσσα προγραµµατισµού και εποµένως δεν µπορούµε να έχουµε καµία συνάρτηση που δεν είναι τµήµα µιας τάξης στη Java. Θα πρέπει να έχουµε µία έστω τάξη στην οποία θα περιέχεται η main ακόµα και αν δεν την χρειαζόµαστε! Η πρώτη µας εφαρµογή: Το πρόγραµµα "Hello World!" Σ αυτό το σηµείο θα κατασκευάσουµε την πρώτη µας εφαρµογή Java που ο κώδικάς της είναι ο ακόλουθος: public class HelloWorld public static void main(string[] args) System.out.println("Hello World!"); Θα πρέπει να αποθηκεύσουµε το αρχείο µε το όνοµα HelloWorld.java να το µεταγλωττίσουµε σε bytecodes δίνοντας javac HelloWorld.java και αν δεν έχει λάθη να το εκτελέσουµε πληκτρολογώντας java HelloWorld Java Applets Σ' αυτό το εδάφιο θα κάνουµε µία πρώτη επαφή µε τα Java Applets και θα κάνουµε το πρόγραµµα HelloWorld σε µορφή Applet. Επίσης θα κάνουµε µία HTML σελίδα που είναι απαραίτητη για να εισάγουµε σ' αυτήν το Applet. Τί είναι ένα Java Applet Τα Java Applets είναι προγράµµατα Java τα οποία είναι σχεδιασµένα για να εκτελούνται από ένα πρόγραµµα πλοήγησης (browser). Για λόγους διευκόλυνσης των προγραµµατιστών, η Sun παρέχει µε κάθε JDK (Java Development Kit) και ένα πρόγραµµα εκτέλεσης των Applets το οποίο λέγεται appletviewer. Κάθε Applet θα πρέπει να επεκτείνει την τάξη java.applet.applet και να υλοποιεί κάποιες µεθόδους (τουλάχιστον τη µέθοδο paint). Για να εκτελέσουµε ένα applet µέσα από ένα browser ή από τον appletviewer θα πρέπει να συµπεριλάβουµε την τάξη του applet σε µια HTML σελίδα χρησιµοποιώντας το tag <Applet>. Στη συνέχεια µπορούµε να φορτώσουµε τη σελίδα στο browser ή να δώσουµε appletviewer <όνοµα HTML αρχείου> για να δούµε το Applet να εκτελείται Το πρώτο µας Applet: Το Applet HelloWorldApplet - 3 -

Στη συνέχεια θα κατασκευάσουµε το Hello World πρόγραµµα σαν Applet, θα το µεταφράσουµε σε bytecodes και θα κατασκευάσουµε µια µινιµαλιστική HTML σελίδα για να µπορέσουµε να εκτελέσουµε το Applet µέσα από τον appletviewer: Το java πρόγραµµα είναι το ακόλουθο: import java.applet.applet; import java.awt.graphics; public class HelloWorldApplet extends Applet public void paint(graphics g) g.drawstring("hello world!", 50, 25); To HTML αρχείο είναι το ακόλουθο: <applet code="helloworldapplet.class" width=300 height=300> </applet> Για να εκτελέσουµε το applet θα πρέπει να φορτώσουµε την HTML σελίδα είτε σε ένα browser (π.χ. τον Internet Explorer) ή να εκτελέσουµε το applet µε τον appletviewer, δίνοντας την εντολή: appletviewer <όνοµα HTML σελίδας> Έννοιες αντικειµενοστραφούς προγραµµατισµού Η Java είναι µία αντικειµενοστραφής (object-oriented) γλώσσα προγραµµατισµού. Εποµένως είναι σηµαντικό να έχουµε από νωρίς µία γνωριµία µε τις βασικές έννοιες του αντικειµενοστραφούς προγραµµατισµού. Αυτό το εδάφιο αποσκοπεί σ' αυτή τη πρώτη γνωριµία µε τις έννοιες που διέπουν τον αντικειµενοστραφή προγραµµατισµό, ενώ αυτές οι έννοιες θα αναπτυχθούν αναλυτικά σε επόµενα µαθήµατα. Η έννοια της τάξης (class) Μία τάξη (class) είναι ένα καλούπι από το οποίο δηµιουργούνται αντικείµενα. Μία τάξη είναι µια µονάδα: (α) Αφαίρεσης: ιότι παριστάνει µία οντότητα του χώρου λύσης του προβλήµατος (β) Συγκέντρωσης: ιότι συγκεντρώνει δεδοµένα και µεθόδους κάτω από τον ίδιο τύπο. (γ) Απόκρυψης: ιότι επιτρέπει τον απόλυτο έλεγχο στο ποιες άλλες τάξεις µπορούν να προσπελάσουν τα δεδοµένα της (δ) Επέκτασης: ιότι µπορεί να αποτελέσει την βάση ή την επέκταση ή και τα δύο κάποιας ή κάποιων άλλων τάξεων. (ε) Εξέλιξης: ιότι δεδοµένων κάποιων προϋποθέσεων µπορεί να διευκολύνει στην εξέλιξη του λογισµικού µε συστηµατικό τρόπο Τα τµήµατα της δήλωσης µιας τάξης στη Java Τα τµήµατα αυτά είναι όπως φαίνονται στην ακόλουθη εικόνα: - 4 -

Η έννοια του αντικειµένου (object) Ένα αντικείµενο δεν είναι παρά µία περίσταση (instance) µιας τάξης. Όπως είδαµε µία τάξη είναι ένα καλούπι για να δηµιουργήσουµε αντικείµενα. Άρα αν δηµιουργήσουµε ένα αντικείµενο της τάξης Person που είδαµε στο προηγούµενο παράδειγµα, τότε αυτό θα έχει ένα ιδιωτικό ακέραιο µέλος (το age), ένα default κατασκευαστή που µόλις δηµιουργήσουµε το αντικείµενο θα θέσει την ηλικία του σε 33, και δύο µεθόδους την setage που µας επιτρέπει να θέσουµε την ηλικία κάποιου σε κάποια συγκεκριµένη τιµή και την getage που µας επιστρέφει την ηλικία του αντικειµένου. Σε ένα πρόγραµµα Java η δήλωση και η δηµιουργία αντικειµένου µπορεί να γίνει µε µία απλή δήλωση ενός αντικειµένου και την αρχικοποίησή του σε ένα νέο αντικείµενο του τύπου της τάξης. Για παράδειγµα για να δηλώσουµε ένα νέο Person το citizen θα γράφαµε: Person citizen = new Person(); Συγκέντρωση (encapsulation) και υπερφόρτωση (overloading) Η συγκέντρωση των δεδοµένων και των µεθόδων µίας τάξης είναι ένα από τα βασικά χαρακτηριστικά του αντικειµενοστραφούς προγραµµατισµού. Ένα αντικείµενο τύπου Person µπορεί να αναφερθεί σε µεθόδους της τάξης του χρησιµοποιώντας τον τελεστή 'τελεία', όπως στην ακόλουθη εντολή: citizen.setage(40); Αυτό µας επιτρέπει να έχουµε και άλλες τάξεις στις οποίες θα µπορούσαµε να έχουµε µία µέθοδο µε το ίδιο όνοµα. Για παράδειγµα θα µπορούσαµε να έχουµε και µία τάξη Animal που θα είχε µία µέθοδο setage. Η εικονική µηχανή Java δεν µπερδεύεται διότι γνωρίζει την τάξη του κάθε αντικειµένου. Αυτό το χαρακτηριστικό, η χρήση δηλαδή των ίδιων ονοµάτων για διαφορετικές τάξεις, ονοµάζεται υπερφόρτωση (overloading). Κληρονοµικότητα (Inheritance) Μία τάξη Java µπορεί να επεκταθεί (extend) από µία άλλη τάξη. Αυτή η άλλη τάξη ονοµάζεται υποτάξη της αρχικής που είναι η υπερτάξη της. Μια υποτάξη κληρονοµεί από την υπερτάξη της: (α) Όλα τα µέλη ιδιωτικά, προστατευµένα και δηµόσια, αν και µπορεί απευθείας να αναφερθεί µόνο στα προστατευµένα και στα δηµόσια. - 5 -

(β) Όλες τις µεθόδους ιδιωτικές, προστατευµένες και δηµόσιες αν και µπορεί απευθείας να αναφερθεί µόνο στις προστατευµένες και στις δηµόσιες. (γ) Τον τύπο της υπερτάξης της. Για το σύστηµα τύπων της Java αν η τάξη Β είναι υποτάξη της τάξης Α, τότε αντικείµενα της Β θα γίνουν δεκτά οπουδήποτε θα απαιτούνταν αντικείµενα της Α. Αυτή η συµβατότητα τύπων είναι µία πολύ ισχυρή ιδιότητα του αντικειµενοστραφούς προγραµµατισµού. Στη συνέχεια σαν παράδειγµα δίνουµε µία τάξη WorkingPerson η οποία επεκτείνει το Person. Αφού είναι Person τα αντικείµενα της τάξης WorkingPerson θα έχουν όλες τις µεθόδους και τα δεδοµένα της τάξης Person συν τα δικά τους: public class WorkingPerson extends Person String job; public WorkingPerson() super(); job= "Ανεργος"; //Η εξ ορισµού τιµή για την Ελλάδα! public void setjob(string j) job = j; public String getjob() return job; Πολυµορφισµός (polymorphism) Ένα αντικείµενο µιας υποτάξης είναι συµβατό για το σύστηµα τύπων µε την υπερτάξη διότι σηµασιολογικά το αντικείµενο της υποτάξης είναι και αντικείµενο της υπερτάξης. Αυτή η ιδιότητα µας επιτρέπει να καταχωρίσουµε σε αντικείµενα που έχουν δηλωθεί σαν αντικείµενα της υπερτάξης, αντικείµενα της υποτάξης. Αν η υπερτάξη και η υποτάξη έχουν λοιπόν µια κοινή µέθοδο, δηλαδή η µέθοδος ορίζεται εκ νέου στην υποτάξη, ποια µέθοδος θα κληθεί σε ένα αντικείµενο που έχει δηλωθεί σαν αντικείµενο της υπερτάξης; Η απάντηση σ αυτό το ερώτηµα είναι «Εξαρτάται». Αν το αντικείµενο είναι πράγµατι της υπερτάξης θα κληθεί η µέθοδος της υπερτάξης, αν όµως είναι της υποτάξης θα κληθεί η µέθοδος της υποτάξης. Αυτή η σηµαντική ιδιότητα ονοµάζεται πολυµορφισµός, διότι η ίδια µέθοδος για αντικείµενα του ιδίου τύπου φαίνεται να έχει πολλές µορφές, και είναι µία πολύ ισχυρή τεχνική στην οποία τα αντικειµενοστραφή συστήµατα οφείλουν µεγάλο µέρος της φήµης τους. Ο πολυµορφισµός, για παράδειγµα, µας δίνει το δικαίωµα να διατηρούµε δοµές δεδοµένων µε αντικείµενα µιας υπερτάξης τα οποία µπορεί να είναι στη πραγµατικότητα αντικείµενα των υποτάξεων και να διατρέχουµε αυτή τη δοµή καλώντας τη κοινή µέθοδο. Αυτό µας δίνει πολλές δυνατότητες τις οποίες θα διερευνήσουµε σε επόµενα µαθήµατα και κυρίως διευκολύνει την επεκτασιµότητα των εφαρµογών! Mεταβλητές (variables) Οι µεταβλητές είναι οι θέσεις µνήµης στις οποίες ένα πρόγραµµα τοποθετεί τα δεδοµένα του κατά τη διάρκεια της λειτουργίας του. Σ' αυτό το εδάφιο θα µάθουµε πως δηλώνουµε µεταβλητές, ποιοί είναι οι τύποι των µεταβλητών στη γλώσσα Java, πως πρέπει να είναι το όνοµα µιας µεταβλητής και ποια είναι η εµβέλεια της µεταβλητής. ήλωση µεταβλητών Η δήλωση µιας µεταβλητής έχει πάντοτε την µορφή: <Τύπος Μεταβλητής> <Όνοµα Μεταβλητής>; - 6 -

Για παράδειγµα η ακόλουθη δήλωση αφορά µία ακέραια µεταβλητή που ονοµάζεται count: int count; Προαιρετικά µπορεί να υπάρχει και µία αρχικοποίηση της µεταβλητής ταυτόχρονα µε την δήλωσή της. Για παράδειγµα η ακόλουθη δήλωση αρχικοποιεί την count στη τιµή 0. int count = 0; Στη συνέχεια και για την περιοχή εµβέλειας της συγκεκριµένης µεταβλητής µπορούµε να χρησιµοποιήσουµε την count όπου επιτρέπεται να χρησιµοποιηθούν ακέραιες τιµές. Ο τύπος εποµένως της µεταβλητής καθορίζει τις επιτρεπτές ενέργειες που µπορούν να γίνουν σε αυτή τη µεταβλητή. Τύποι µεταβλητών Οι τύποι των µεταβλητών της Java δίνονται από τον ακόλουθο πίνακα Τύπος Μέγεθος και µορφή Περιγραφή Ακέραιες µεταβλητές byte 8 bit σε µορφή Ακέραιος µήκους ενός byte συµπληρώµατος ως προς 2 short 16 bit σε µορφή Ακέραιος µικρού µήκους συµπληρώµατος ως προς 2 int 32 bit σε µορφή Ακέραιος συµπληρώµατος ως προς 2 long 64 bit σε µορφή Ακέραιος µεγάλου µήκους συµπληρώµατος ως προς 2 Πραγµατικές µεταβλητές float 32 bit σε µορφή IEEE 754 Πραγµατικός απλής ακρίβειας double 64 bit σε µορφή IEEE 754 Πραγµατικός διπλής ακρίβειας Άλλοι Τύποι char 16-bit Unicode χαρακτήρας Ένας χαρακτήρας boolean true ή false Μία boolean τιµή αληθής ή ψευδής Ονόµατα µεταβλητών Ένα πρόγραµµα Java αναφέρεται σε µία µεταβλητή µε το όνοµά της. Ένα όνοµα µιας µεταβλητής θα πρέπει να ικανοποιεί τους ακόλουθους περιορισµούς. (α) Πρέπει να είναι ένα έγκυρο αναγνωριστικό της Java αποτελούµενο από µία σειρά Unicode χαρακτήρων. (β) εν πρέπει να είναι δεσµευµένη λέξη της Java (keyword) (γ) εν πρέπει να υπάρχει άλλο ίδιο όνοµα µεταβλητής στην περιοχή εµβέλειας της µεταβλητής. Στη Java συνηθίζονται τα ακόλουθα: Τα ονόµατα των τάξεων ξεκινάνε µε κεφαλαία γράµµατα Τα ονόµατα των µεταβλητών ξεκινάνε µε πεζά γράµµατα Στη περίπτωση που έχουµε αναγνωριστικό πολλών λέξεων τότε ενώνουµε τις λέξεις γράφοντας µε κεφαλαίο το πρώτο γράµµα κάθε λέξης: π.χ. averylongidentifier - 7 -

Εµβέλεια µεταβλητών (scope) Η εµβέλεια µίας µεταβλητής είναι η περιοχή εκείνη του προγράµµατός µας στην οποία η µεταβλητή είναι ορατή και καθορίζει πότε η µεταβλητή δηµιουργείται και καταστρέφεται. Υπάρχουν τέσσερα ήδη µεταβλητών µε αντίστοιχα τέσσερις περιοχές εµβέλειας: Μεταβλητές µέλη µε εµβέλεια την τάξη Τοπικές µεταβλητές µε εµβέλεια την οµάδα εντολών στην οποία δηλώνονται Παράµετροι µεθόδων µε εµβέλεια την µέθοδο µέσα στην οποία δηλώνονται, και Παράµετροι χειριστών εξαιρέσεων µε εµβέλεια την οµάδα εντολών του χειριστή εξαιρέσεων Η εµβέλεια των µεταβλητών φαίνεται πιο παραστατικά στην ακόλουθη εικόνα: Τελικές µεταβλητές και παράµετροι Μπορούµε να δηλώσουµε µία µεταβλητή ή µία παράµετρος σε µία µέθοδο ως τελική (final).η δήλωση final έχει ως αποτέλεσµα την απαγόρευση της αλλαγής της τιµής στην εµβέλεια στην οποία ανήκει η µεταβλητή. ηλαδή η µεταβλητή είναι στη πραγµατικότητα σταθερά για την εµβέλεια αυτή. Στην περίπτωση της µεταβλητής η λέξη final θα πρέπει λογικά να χρησιµοποιηθεί µε κάποια αρχικοποίηση για την απόδοση της αρχικής και ταυτόχρονα οριστικής τιµής στη µεταβλητή, όπως στο ακόλουθο παράδειγµα: Final int interestrate = 0.15; Μπορούµε όµως να αναβάλλουµε την απόδοση της αρχικής τιµής και γι αργότερα αν αυτό είναι αναγκαίο. Η αρχική τιµή φυσικά µπορεί να αποδοθεί µόνο µία φορά. Μία τελική µεταβλητή στην οποία δεν έχει αποδοθεί ακόµα τιµή ονοµάζεται κενή (blank). Στην περίπτωση µιας παραµέτρου σε µία µέθοδο η δήλωση final έχει το νόηµα ότι η συγκεκριµένη παράµετρος δεν µπορεί να αλλάξει τιµή µέσα στη µέθοδο αλλά θα διατηρηθεί η τιµή που θα περαστεί από το καλούν τµήµα του προγράµµατος. Για παράδειγµα η µέθοδος withdraw δεν µπορεί να µεταβάλλει τη παράµετρο money, διότι η παράµετρος αυτή έχει δηλωθεί ως τελική (final). Μπορεί µόνο να την χρησιµοποιήσει.: public class Account - 8 -

public void withdraw(final double money) if (money > 0 && money<=balance) balance -= money; Τελεστές (operators) Σ' αυτό το µάθηµα θα αναφερθούµε στους τελεστές της Java και στις έγκυρες χρήσεις τους. Τι είναι οι τελεστές Οι τελεστές είναι σύµβολα τα οποία συµβολίζουν την τέλεση µιας λειτουργίας σε ένα, δύο ή και τρεις τελεστέους (operators). Υπάρχουν λοιπόν τρία είδη τελεστών ως προς τον αριθµό των τελεστέων στους οποίους επενεργούν: Μοναδιαίοι (unary) Τελεστές: Αυτοί επενεργούν σε ένα και µόνο τελεστέο. Για παράδειγµα ο τελεστής ++ αυξάνει κατά 1 τον τελεστέο του όπως στην έκφραση ++count. υαδικοί (binary) Τελεστές: Αυτοί επενεργούν σε δύο τελεστέους. Για παράδειγµα ο τελεστής + της αριθµητικής πρόσθεσης απαιτεί δύο τελεστέους όπως στην έκφραση op1 + op2. Τριαδικοί (ternary) Τελεστές: Αυτοί επενεργούν σε τρεις τελεστέους. Η Java έχει µόνο ένα τέτοιο τελεστή την έκφραση if που είναι ο :?, όπως στην ακόλουθη έκφραση a>4?a-4:4 Αριθµητικοί τελεστές Οι αριθµητικοί τελεστές χρησιµοποιούνται για τις αριθµητικές πράξεις και είναι αυτοί που φαίνονται στον ακόλουθο πίνακα. Τελεστής Χρήση Περιγραφή + n1+n2 Αποτιµάται στο άθροισµα των n1 και n2 - n1-n2 Αποτιµάται στη διαφορά των n1 και n2 * n1*n2 Αποτιµάται στο γινόµενο των n1 και n2 / n1 / n2 Αποτιµάται στο πηλίκο των n1 και n2 % n1%n2 Αποτιµάται στο υπόλοιπο της διαίρεσης του n1 δια του n2 ++ ++n ή ++n Αυξάνει την µεταβλητή n κατά 1 -- -- n ή n-- Μειώνει την µεταβλητή n κατά 1 Μερικές παρατηρήσεις για τους αριθµητικούς τελεστές είναι οι ακόλουθες: Ο τελεστής + στη Java έχει επεκταθεί έτσι ώστε να έχει και το νόηµα την συνένωσης για τα Strings. Έτσι για παράδειγµα οι ακόλουθες εντολές θα εµφανίσουν στην οθόνη τo µήνυµα των «Αρ. Χαρκτήρων: 10». Παρατηρείστε επίσης την σιωπηλή µετατροπή του count από int σε String για να συνενωθεί µε τη σταθερά «Αρ. Χαρακτήρων» int count = 10; System.out.println("Αρ. Χαρακτήρων: "+count); Ο τελεστής ++ όπως και ο --, µπορούν να εφαρµοστούν είτε από τα αριστερά (προ-αύξηση & προ-µείωση) είτε από τα δεξιά (µετά-αύξηση & µετά-µείωση). - 9 -

Προ-αύξηση και προ-µείωση σηµαίνει ότι αν η συγκεκριµένη έκφραση αποτελεί τµήµα µιας ευρύτερης έκφρασης πρώτα θα υπολογιστεί η νέα τιµή της µεταβλητής που αυξάνουµε ή µειώνουµε και µετά θα υπολογιστεί η έκφραση µε τη χρήση της νέας τιµής, όπως στο παράδειγµα: int x=10; y = ++x; //Στο y θα εισαχθεί η τιµή 11, και φυσικά το x θα γίνει 11 Μετά-αύξηση και µετά-µείωση σηµαίνει ότι αν η συγκεκριµένη έκφραση αποτελεί τµήµα µιας ευρύτερης έκφρασης πρώτα θα υπολογιστεί η έκφραση µε βάση τη τιµή εκείνη τη στιγµή που έχει η µεταβλητή που αυξάνουµε ή µειώνουµε και µετά θα αυξηθεί ή θα µειωθεί η µεταβλητή όπως στο παράδειγµα: int x=10; y = x++; //Στο y θα εισαχθεί η τιµή 10, και φυσικά το x θα γίνει 11 Τελεστές σύγκρισης Οι τελεστές σύγκρισης που δίνονται στη συνέχεια συγκρίνουν δύο τιµές και καθορίζουν τη σχέση µεταξύ τους. Η έκφραση που περιέχει ένα τελεστή σύγκρισης µπορεί να είναι true ή false. Τελεστής Χρήση Περιγραφή > n1>n2 true αν το n1 είναι µεγαλύτερο του n >= n1>=n2 true αν το n1 είναι µεγαλύτερο ή ίσο του n2 < n1<n2 true αν το n1 είναι µικρότερο του n2 <= n1<=n2 true αν το n1 είναι µικρότερο ή ίσο του n2 == n1==n2 true αν το n1 είναι ίσο µε το n2!= n1!=n2 true αν το n1 είναι διάφορο του n2 Λογικοί τελεστές Τους λογικούς τελεστές συνήθως τους χρησιµοποιούµε µε τους τελεστές σύγκρισης για την κατασκευή ποιο πολύπλοκων λογικών εκφράσεων, εκφράσεων δηλαδή που µπορεί να είναι true ή false. Για παράδειγµα η ακόλουθη έκφραση θα είναι true αν η τιµή του x είναι µεταξύ 10 και 100: x>=10 && x<=100 Οι λογικοί τελεστές είναι αυτοί που φαίνονται στον ακόλουθο πίνακα: Τελεστής Χρήση Περιγραφή && e1 && e2 true αν και η e1 και η e2 είναι true. H e2 δεν αποτιµάται αν η e1 είναι false e1 e2 false αν και η e1 και η e2 είναι false. Η e2 δεν αποτιµάται αν η e1 είναι true!!e H λογική άρνηση της έκφρασης e & e1&e2 Το ίδιο µε τον && µόνο που η e2 θα αποτιµηθεί ακόµα και αν η e1 είναι false e1 e2 Το ίδιο µε τον µόνο που η e2 θα αποτιµηθεί ακόµα και αν η e1 είναι true Μερικές φορές είναι επιθυµητό να αποτιµηθεί και το δεύτερο µέρος µιας σύνθετης λογικής έκφρασης ακόµα και αν έχει υπολογιστεί η τιµή αλήθειας της έκφρασης. Για παράδειγµα φανταστείτε την ακόλουθη έκφραση: x>0 && somefunc(x)>10-10 -

Αν θέλουµε σ αυτό το παράδειγµα να κληθεί οπωσδήποτε η συνάρτηση somefunc τότε θα πρέπει να χρησιµοποιήσουµε τον & αντί του &&, γιατί µε τον && αν το x <=0 δεν θα αποτιµηθεί το δεύτερο µέρος της έκφρασης µια και η τιµή αλήθειας της έκφρασης θα είναι ούτως ή άλλως false, αφού το πρώτο µέρος της έκφρασης θα είναι false. Ανάλογη είναι και η χρήση του τελεστή σε σχέση µε τον. Για παράδειγµα στην έκφραση x>0 somefunc(x)>10 θα κληθεί η somefunc ακόµα και αν το x είναι θετικό υαδικοί τελεστές Με τους τελεστές αυτούς µπορούµε και κάνουµε πράξεις σε επίπεδο bit. Τελεστής Χρήση Περιγραφή >> n1 >> n2 Κάνει ολίσθηση n2 bits δεξιά στο n1 << n1<<n2 Κάνει ολίσθηση n2 bits αριστερά στο n1 >>> n1 >>> n2 Το ίδιο µε τον >> αλλά χωρίς πρόσηµο & n1&n2 υαδικό ΚΑΙ των n1 και n2 n1 n2 υαδικό Ή των n1 και n2 ^ n1 ^ n2 Αποκλειστικό Ή (XOR) των n1 και n2 ~ ~n υαδικό συµπλήρωµα του n Οι τελεστές δυαδικών πράξεων χρησιµοποιούνται όταν θέλουµε να επέµβουµε στην τιµή µιας µεταβλητής σε επίπεδο bit. Για παράδειγµα έστω ότι έχουµε δηλώσει τις ακόλουθες σταθερές: final int TURBO = 1; final int TWO_DOORS = 2; final int CHEAP = 4; που έστω ότι αφορούν τα χαρακτηριστικά ενός αυτοκινήτου. Θα µπορούσαµε στη συνέχεια να δηλώσουµε µία µεταβλητή int έστω την int characteristics = 0 και στη συνέχεια να αποδώσουµε σε αυτή τη µεταβλητή ταυτόχρονα δύο ή και τρεις ιδιότητες χρησιµοποιώντας τον τελεστή όπως παρακάτω: characteristics = TURBO TWO_DOORS; Σε άλλο σηµείο του προγράµµατος θα µπορούσαµε να ελέγξουµε µε την χρήση του δυαδικού & αν ένα αυτοκίνητο είναι για παράδειγµα TURBO ως εξής: if ((characteristics & TURBO) == TURBO) Tελεστές καταχώρισης Ο τελεστής καταχώρισης τιµής σε µεταβλητή είναι ο =. Ο = αποδίδει την τιµή της έκφρασης στα δεξιά του στη µεταβλητή που βρίσκεται στα αριστερά του, όπως στην εντολή: x = y+10; όπου θα υπολογιστεί η έκφραση y+10 και στη συνέχεια θα καταχωρηθεί η τιµή αυτή στη µεταβλητή x. Στη Java χρησιµοποιούνται και άλλοι τελεστές απόδοσης τιµής όπου είναι ουσιαστικά συντοµεύσεις για απόδοση τιµής σε µεταβλητή µε ταυτόχρονη αύξηση, µείωση κτλ αυτής της µεταβλητής. Για παράδειγµα η έκφραση µε τον τελεστή +=: - 11 -

x += 10; είναι ταυτόσηµη µε την έκφραση: x = x+10; Αντίστοιχη σηµασία έχουν και οι τελεστές: -= *= /= %= &= = ^= <<= >>= >>>= οµές ελέγχου ροής προγράµµατος Σ' αυτό το µάθηµα θα ασχοληθούµε µε τις δοµές ροής ελέγχου προγράµµατος της Java, όπως η if και η while. οµές ελέγχου ροής στη Java Υπάρχουν γενικά δύο ήδη δοµών ελέγχου ροής (control flow): Οι δοµές επιλογής και Οι δοµές επανάληψης Ο ακόλουθος πίνακας συνοψίζει αυτές τις δοµές για τη Java Είδος δοµής ελέγχου ροής οµές Επιλογής οµές Επανάληψης οµή ελέγχου ροής if-else switch-case for while do-while Πέρα από τις εντολές του πιο πάνω πίνακα ο έλεγχος ροής σε ένα πρόγραµµα Java µπορεί να µεταφερθεί και σε κάποιο άλλο σηµείο εξαιτίας της πρόκλησης µιας εξαίρεσης. Αλλά για τις εξαιρέσεις (exceptions) και τους χειριστές τους (exception handlers) θα µιλήσουµε σε επόµενα µαθήµατα. Επίσης κάποιες άλλες εντολές πέρα από τις ίδιες τις δοµές ελέγχου ροής που είδαµε προηγουµένως είναι οι: break, continue και return που µεταφέρουν το έλεγχο ροής σε άλλα σηµεία του προγράµµατος. Την χρήση αυτών των εντολών θα τη δούµε στη συνέχεια. Η Java επιτρέπει και τη χρήση ετικετών αλλά δεν υποστηρίζει την εντολή goto. Αντί αυτής µπορούν και µε τις ετικέτες να χρησιµοποιηθούν οι εντολές break και continue. Η δοµή επιλογής if-else Η εντολή if µας βοηθάει στον έλεγχο µίας λογικής έκφρασης (της συνθήκης) και αν είναι αληθής εκτελούνται µία ή περισσότερες εντολές ενώ αν είναι ψευδής δεν εκτελούνται. Αν οι εντολές είναι περισσότερες από µία τότε θα πρέπει οι εντολές να περικλειστούν ανάµεσα από άγκιστρα (τα οποία οµαδοποιούν εντολές). Το συντακτικό της εντολής if είναι το ακόλουθο if (συνθήκη) εντολές - 12 -

π.χ. if (x!=0) System.out.println("To x δεν είναι 0"); y = 1/x; Η εντολή if έχει επίσης και τη φράση else µε την οποία επιτρέπεται η εκτέλεση µίας οµάδας εντολών εναλλακτικά αν δεν ισχύει η συνθήκη. Φυσικά µπορούµε να έχουµε και εµφωλευµένα if δηλαδή if µέσα σε άλλα if όσες φορές θέλουµε. Το συντακτικό της if επαυξηµένο µε τη φράση else είναι το ακόλουθο: π.χ. if (συνθήκη) οµάδα-εντολών-1 else οµάδα-εντολών-2 if (x!=0) System.out.println("Το x δεν είναι 0"); y=1/x; else System.out.println("Το x είναι 0"); y=0; Η δοµή επιλογής switch-case Όταν οι εναλλακτικές περιπτώσεις που πρέπει να ελέγξουµε µε την if είναι πάρα πολλές και αφορούν τον έλεγχο για ισότητα της τιµής µιας µεταβλητής ή µιας έκφρασης µε κάποιες τιµές προτιµάται η switch-case η οποία έχει την ακόλουθη γενική µορφή: switch (έκφραση) case τιµή-1: εντολές-1; [break;] case τιµή-ν: εντολές-ν; [break;] [default: εντολές; [break;]] Η switch-case αποτιµά την τιµή της έκφρασης που ελέγχεται και στη συνέχεια διατρέχει µε τη σειρά όλες τις περιπτώσεις που δίνονται. Αν κάποια περίπτωση βρεθεί αληθής τότε εκτελούνται οι εντολές που δίνονται µετά την άνω-κάτω τελεία γι αυτή τη περίπτωση. Αν καµία περίπτωση δεν βρεθεί αληθής τότε εκτελείται η default περίπτωση αν υπάρχει. Προσοχή χρειάζεται στη χρήση του break που είναι µεν προαιρετική αλλά απαιτείται τις περισσότερες φορές, µια και αν δεν υπάρχει τότε θα εκτελεστούν και οι εντολές τις επόµενης περίπτωσης (χωρίς να ελεγχθεί η τιµή της) και πιθανώς και άλλων, µέχρι να βρεθεί το επόµενο break ή να τελειώσει η switch-case. Παρόλα αυτά ενδέχεται να υπάρχουν κάποιες περιπτώσεις που αυτό θα ήταν βολικό, όπως δείχνει το ακόλουθο τµήµα κώδικα που υπολογίζει τις µέρες ενός µήνα ανάλογα µε το ποιος µήνας είναι (η τιµή της µεταβλητής month) και το αν το έτος (year) είναι δίσεκτο: - 13 -

switch (month) case 1: case 3: case 5: case 7: case 8: case 10: case 12: numdays = 31; break; case 4: case 6: case 9: case 11: numdays = 30; break; case 2: if ( ((year % 4 == 0) &&!(year % 100 == 0)) (year % 400 == 0) ) numdays = 29; else numdays = 28; break; Η δοµή επανάληψης for Η εντολή for είναι χρήσιµη για την επανάληψη µιας σειράς εντολών όταν είναι γνωστό εκ των προτέρων πόσες φορές θέλουµε να επαναληφθούν. Έτσι συνήθως το for ελέγχεται από ένα µετρητή ο οποίος µεταβάλλεται από µία αρχική τιµή µέχρι να ξεπεράσει µία τελική τιµή. Στη for επίσης καθορίζεται το πόσο θα µεταβάλλεται αυτός ο µετρητής σε κάθε βήµα. Η γενική µορφή της for είναι η ακόλουθη: for (αρχικοποίηση; τερµατισµός; αύξηση) εντολές; Για παράδειγµα το ακόλουθο τµήµα κώδικα εµφανίζει στην οθόνη τους αριθµούς από το 1 µέχρι το 10:... for (int i=1; i<=10; i++) System.out.println(i);... Στη φράση της αρχικοποίησης το i δηλώνεται (η εµβέλειά του είναι το for loop) και αρχικοποιείται στο1. Στη φράση του τερµατισµού το i ελέγχεται για το αν έχει ξεπεράσει το 10. Άρα ο συγκεκριµένος βρόχος θα επαναληφθεί µέχρι το i να ξεπεράσει το 10. Στη φράση της µεταβολής το i αυξάνεται κατά 1. Αυτό σηµαίνει ότι το i θα πάρει διαδοχικά τις τιµές 1, 2,, 10 Σε κάθε βήµα της επανάληψης ελέγχεται η τιµή του i. Aν το i ξεπεράσει το 10 ο βρόχος τερµατίζεται, αν όχι αυξάνεται κατά 1 και εκτελείται ξανά η µία και µοναδική εντολή αυτού του βρόχου. Η δοµή επανάληψης while - 14 -

Η εντολή for που είδαµε προηγουµένως είναι κατάλληλη όταν γνωρίζουµε πόσες επαναλήψεις θα γίνουν. Αν δεν γνωρίζουµε πόσες επαναλήψεις θα γίνουν µία καλύτερη εντολή είναι η while. H while έχει την ακόλουθη γενική µορφή: while (συνθήκη) εντολές; Η εντολή ή εντολές που ακολουθούν το while θα εκτελεστούν όσο η συνθήκη είναι αληθής. Ο βρόχος δηλαδή θα τερµατιστεί όταν η συνθήκη - που είναι µία boolean έκφραση - γίνει ψευδής Στο ακόλουθο τµήµα κώδικα ελέγχεται αν η τιµή x βρίσκεται µέσα στο πίνακα numbers. Κάνουµε δηλαδή µία σειριακή αναζήτηση στα στοιχεία του πίνακα. Αν το στοιχείο βρεθεί η µεταβλητή found γίνεται true και βγαίνουµε από το βρόχο. Επίσης από το βρόχο θα βγούµε αν ελεγχθούν και τα δέκα στοιχεία του πίνακα και δεν έχει βρεθεί ακόµα το x. boolean found = false; int i=0; while (!found && i!=10) if (numbers[i++] == x) found = true; Η δοµή επανάληψης do-while Υπάρχουν κάποιες περιπτώσεις στις οποίες θα θέλαµε οι εντολές µέσα στο βρόχο να εκτελεστούν τουλάχιστον µία φορά και στη συνέχεια να ελεγχθεί η συνθήκη εξόδου. Σ αυτές τις περιπτώσεις προτιµάται η χρήση της do-while αντί της while. Η do-while έχει την ακόλουθη γενική µορφή: do εντολές; while (συνθήκη); Στην do-while πρώτα εκτελούνται οι εντολές και στη συνέχεια ελέγχεται η συνθήκη. Ο βρόχος τερµατίζεται αν η συνθήκη βρεθεί ψευδής. H do-while δεν χρησιµοποιείται πολύ συχνά αλλά έχει κι αυτή τις χρήσεις της. Για παράδειγµα όταν διαβάζουµε χαρακτήρες από ένα αρχείο µέχρι να διαπιστώσουµε το τέλος του αρχείου θα πρέπει να διαβάσουµε τουλάχιστον ένα χαρακτήρα, όπως δείχνει και το ακόλουθο τµήµα κώδικα:... int c; Reader in;... do c = in.read();... while (c!= 1);... Εντολές διακλάδωσης Η Java έχει τρεις εντολές διακλάδωσης οι οποίες είναι βολικές σε αρκετές περιπτώσεις και ιδιαίτερα µε τις επαναληπτικές δοµές που έχουµε συζητήσει. Οι εντολές διακλάδωσης είναι οι: break, continue και return - 15 -

Την εντολή break ήδη την είδαµε σε µία χρήση της µε την switch-case. Μία ακόµα αρκετά συνήθη χρήση της break είναι η χρήση της για άµεση έξοδο από κάποιο βρόχο. Για παράδειγµα η σειριακή αναζήτηση που είδαµε µε το while θα µπορούσε να γίνει ως εξής: int i; boolean found = false; for (i=0; i<10; i++) if (numbers[i]==x) found = true; break; Η χρήση της continue µέσα σε ένα βρόχο προκαλεί την άµεση αποτίµηση και πάλι της συνθήκης εξόδου. Για να γίνει αυτό στις εντολές for και while ο έλεγχος µεταφέρεται στη πρώτη γραµµή του βρόχου ενώ στο do-while στη τελευταία. Στη συνέχεια αποτιµάται και πάλι η συνθήκη τερµατισµού και η επαναληπτική διαδικασία τερµατίζεται ή συνεχίζεται ανάλογα µε την τιµή της συνθήκης (true ή false) ως συνήθως. Οι εντολές break και continue έχουν και µία µορφή για ετικέτες (labeled break και labeled continue) που δεν θα συζητήσουµε εδώ µια και στη πράξη οι ετικέτες δεν χρησιµοποιούνται αφού οι υπόλοιπες δοµές που είδαµε αρκούν για όλες τις πιθανές χρήσεις, χωρίς να εµφανίζουν πολλά από τα προβλήµατα που πιθανώς να εµφανιστούν µε την χρήση των ετικετών. Η συζήτηση για την εντολή return αναβάλλεται µέχρι να συζητήσουµε για τις µεθόδους των τάξεων σε επόµενα µαθήµατα. Πίνακες Σ' αυτό το µάθηµα θα ασχοληθούµε µε τους πίνακες οµοειδών στοιχείων (π.χ. ακεραίων) στη Java. ήλωση και δηµιουργία πινάκων Οι πίνακες, όπως και στις άλλες γλώσσες προγραµµατισµού, είναι δοµές δεδοµένων για την συλλογή και διαχείριση δεδοµένων του ιδίου τύπου. Η διαφορά µε τις περισσότερες από τις άλλες γλώσσες είναι ότι οι πίνακες στη Java είναι αντικείµενα και έχουν και ιδιότητες όπως η length που µας δείχνει ποιο είναι το µέγεθος ενός πίνακα. Η δήλωση ενός πίνακα γίνεται ως εξής: τύπος[] όνοµα; όπως για παράδειγµα στην ακόλουθη δήλωση: int[] arrayofints; που δηλώνει ένα πίνακα ακεραίων µε το όνοµα arrayofints. Η δήλωση του πίνακα δεν αρκεί για τη χρησιµοποίησή του. Γι αυτό θα πρέπει να δεσµευτεί ο χώρος µνήµης που απαιτείται για το πίνακα. Επειδή ο πίνακας είναι αντικείµενο απαιτείται όπως και µε όλα τα αντικείµενα στη Java να δηµιουργήσουµε ένα αντικείµενο (instantiation) για τον πίνακα µε την εντολή new. Έτσι συνήθως η δήλωση ενός πίνακα συνδυάζεται µε την δηµιουργία του αντικειµένου µε την new, στην οποία προσδιορίζεται και το µέγεθος του πίνακα. Αυτό γίνεται ως εξής: - 16 -

τύπος[] όνοµα = new τύπος[µέγεθος]; όπως για παράδειγµα στην ακόλουθη δήλωση: int[] arrayofints = new int[10]; που δηµιουργεί ένα πίνακα 10 ακεραίων µε το όνοµα arrayofints. Η δηµιουργία του πίνακα δεν είναι απαραίτητο να γίνει ταυτόχρονα µε την δήλωσή του µπορεί να γίνει και αργότερα, όπως δείχνει το ακόλουθο τµήµα κώδικα: int[] arrayofints;... arrayofints = new int[10];... Σε κάθε περίπτωση πάντως δεν επιτρέπεται η αναφορά σε στοιχεία του πίνακα πριν να δηµιουργηθεί ο πίνακας µε την εντολή new. ΠΡΟΣΟΧΗ: Ένα σηµείο που προκαλεί σύγχυση στους νέους προγραµµατιστές στη Java είναι η χρήση των πινάκων για αντικείµενα και όχι για τύπους της γλώσσας όπως ο int. Σ αυτή τη περίπτωση πέρα από τη δηµιουργία του πίνακα απαιτείται και η δηµιουργία των ίδιων των αντικειµένων τα οποία βρίσκονται στον πίνακα. Χρήση πινάκων Το ακόλουθο τµήµα κώδικα δηµιουργεί ένα πίνακα 10 ακεραίων και στη συνέχεια τοποθετεί µέσα σ αυτόν τους ακεραίους από το 0 µέχρι το 9.... int[] arrayofints = new int[10]; for (int i=0; i<10; i++) arrayofints[i] = i;... Το ακόλουθο τµήµα κώδικα εµφανίζει τα στοιχεία που βρίσκονται στο πίνακα arrayofints. Παρατηρείστε τη χρήση της ιδιότητας length για να αναφερθούµε στο µήκος του πίνακα:... for (int i=0; i<arrayofints.length; i++) System.out.println(arrayOfInts[i]);... Πίνακες περισσοτέρων διαστάσεων Στη Java µπορείτε να έχετε πίνακες δύο, τριών, τεσσάρων κλπ διαστάσεων. Στη πράξη όµως σπάνια συναντούµε περιπτώσεις στις οποίες η χρήση πινάκων που έχουν περισσότερες από δύο διαστάσεις. Ο ακόλουθος πίνακας δίνει κάποια παραδείγµατα για την δηµιουργία, αναφορά σε στοιχεία και εύρεση µήκους πινάκων µέχρι και τριών διαστάσεων. ιάσταση ήλωση και ηµιουργία ενός πίνακα ακεραίων Αναφορά Εύρεση Μήκους 1 int a[] = new int[10] a[i] a.length 2 int a[][]=new int[3][10] a[i][j] a.length a[i].length - 17 -

3 int a[][][]= new int[3][5][10] a[i][j][k] a.length a[i].length a[i][j].length Το ακόλουθο είναι ένα απλό παράδειγµα χρήσης δύο διαστάσεων. Ανάλογη είναι και η χρήση πινάκων τριών διαστάσεων κλπ. class Array2 public static void main(string[] args) int marks[][] = new int[3][10]; for (int i=0; i<marks.length; i++) for (int j=0; j<marks[i].length; j++) marks[i][j] = i*j; System.out.print(marks[i][j]+" "); System.out.println(); Συµβολοσειρές (Strings) Σ' αυτό το µάθηµα θα αναφερθούµε αναλυτικά στην τάξη java.lang.string. ήλωση και δηµιουργία String Μία συµβολοσειρά είναι µία σειρά από χαρακτήρες. Στη Java µία συµβολοσειρά υλοποιείται µε τη τάξη String του πακέτου java.lang. Ένα String είναι λοιπόν ένα αντικείµενο και όπως όλα τα αντικείµενα πρέπει να δηλωθεί και να δηµιουργηθεί µε την εντολή new, όπως στο παράδειγµα: String s = new String(); Εναλλακτικά µπορούµε να δηµιουργήσουµε ένα String αν του αποδώσουµε µία τιµή που θα είναι µία σταθερά συµβολοσειρά, όπως στο παράδειγµα: String s = "George"; Αφού δηµιουργήσουµε το String µπορούµε στη συνέχεια να το χρησιµοποιήσουµε. H τάξη String παρέχει πολλές χρήσιµες µεθόδους γι αυτό. ΠΡΟΣΟΧΗ: Μια συνήθη πηγή λαθών για τους νέους στη Java είναι η σύγκριση για ισότητα των String. Επειδή τα String είναι αντικείµενα ο τελεστής == δεν συγκρίνει τη τιµή τους, αλλά τη διεύθυνσή τους στη µνήµη. Αν θέλουµε να δούµε αν δύο String έχουν την ίδια τιµή θα πρέπει να χρησιµοποιήσουµε τη συνάρτηση equals. Για παράδειγµα για να δούµε αν το String s1 έχει την ίδια τιµή µε το String s2, θα πρέπει να αποτιµήσουµε την έκφραση s1.equals(s2) ή s2.equals(s1). Οι παράµετροι της main Όπως ήδη θα έχετε παρατηρήσει στη µέθοδο main περνιέται σαν παράµετρος ένας πίνακας από String που τον ονοµάσαµε args. Αυτός ο πίνακας είναι µία σειρά παράµετροι που µπορούν να περαστούν στην εφαρµογή όταν τη ξεκινάµε, ως εξής: java <όνοµα-τάξης> <παράµετρος-0> <παράµετρος-ν> - 18 -

π.χ. java CheckUser Master Το ακόλουθο παράδειγµα ελέγχει τη πρώτη παράµετρο που δόθηκε στη γραµµή εντολών που ξεκίνησε το πρόγραµµα για να δει αν είναι Master. Αν είναι τότε εµφανίζει το µήνυµα Welcome Master! διαφορετικά εµφανίζει το µήνυµα Unauthorized User!. class CheckUser public static void main(string[] args) if (args[0].equals("master")) System.out.println("Welcome Master!"); //Kane kati epitrepto mono gia tous Masters else System.out.println( Unauthorized User!); Βασικές µέθοδοι της τάξης String int length(): Επιστρέφει το µήκος του String char charat(int index): Επιστρέφει τον χαρακτήρα του String στη θέση index. Ο index πρέπει να είναι από 0 έως length()-1. String substring(int beginindex): Επιστρέφει το substring που ξεκινά από την θέση beginindex µέχρι το τέλος του String. String substring(int beginindex, int endindex): Επιστρέφει το τµήµα του String από την θέση beginindex µέχρι την θέση endindex-1. byte[] getbytes(string enc): Μετατρέπει το array των χαρακτήρων που συνιστούν το String σε ένα array από bytes, χρησιµοποιώντας την κωδικοσελίδα που περιγράφεται από το String της παραµέτρου. void getchars(int srcbegin, int srcend, char[] dst, int dstbegin): Τοποθετεί τους χαρακτήρες του String από τη θέση srcbegin µέχρι την srcend-1 στο array dst, ξεκινώντας από την θέση dstbegin int indexof(int ch): Επιστρέφει τη θέση της πρώτης εµφάνισης του ch στο String ή 1 αν ο ch δεν υπάρχει στο String. int lastindexof(int ch): Επιστρέφει τη θέση της τελευταίας εµφάνισης του ch στο String ή 1 αν ο ch δεν υπάρχει στο String. int compareto(string anotherstring): Επιστρέφει θετικό αριθµό αν το anotherstring είναι µεγαλύτερο λεξικογραφικά από αυτό το String, αρνητικό αριθµό αν είναι µικρότερο, και 0 αν τα δύο Strings έχουν την ίδια τιµή boolean equals(object anobject): Επιστρέφει true αν το anobject είναι ένα String που δεν είναι null και που έχει την ίδια τιµή µε αυτό το String. int hashcode(): Είναι ουσιαστικά µια συνάρτηση κατακερµατισµού (hashing function) που επιστρέφει την τιµή µιας θέσης για το String σε µια δοµή Hashtable (π.χ. το java.util.hashtable). Η τιµή της συνάρτησης προκύπτει από τον υπολογισµό της ακόλουθης έκφρασης: s[0]*31^(n-1) + s[1]*31^(n-2) +... + s[n-1] όπου s[0], s[1] κ.λ.π. είναι οι χαρακτήρες του String, n είναι το µήκος του String και ο χαρακτήρας ^ έχει το νόηµα της ύψωσης σε δύναµη. Παράδειγµα της τάξης String - 19 -

Θα κάνουµε µία τάξη TokenMethods που θα έχει µια static µέθοδο printlnpertoken(string str) η οποία θα δέχεται ως παράµετρο ένα String και θα εκτυπώνει τα tokens µέσα στο String. Ως token θεωρούµε µια σειρά χαρακτήρων που είναι συνεχόµενη και χωρίζεται από ένα άλλο token µε έναν ή περισσότερους από τους χαρακτήρες λευκού διαστήµατος, που είναι \n, \t, \r, public class TokenMethods public static void printlnpertoken(string str) int currentposition = 0; int strlength = str.length(); int inwhitespace = 0; String whitespacechars = " \n\r\t"; //όσο δεν τελείωσε το String while (currentposition < strlength) //αγνόησε τους χαρακτήρες λευκού διαστήµατος στην αρχή της λέξης while (whitespacechars.indexof(str.charat(currentposition)) >= 0) currentposition++; int placeholder = currentposition; //όσο δεν είναι χαρακτήρας λευκού διαστήµατος απλά προχωρά στην //επόµενη θέση στο String while ((currentposition < strlength) && (whitespacechars.indexof(str.charat(currentposition))< 0)) currentposition++; //εκτυπώνει το String από τον τελευταίο µη λευκό χαρακτήρα έως και //πριν την τρέχουσα θέση System.out.println(str.substring(placeHolder, currentposition)); public static void main(string args[]) TokenMethods.printlnPerToken("Joshua Tree U2"); Στο πιο πάνω παράδειγµα η static µέθοδος printlnpertoken καλείται µε το String Joshua Tree Το αποτέλεσµα θα είναι: U2. Όπως βλέπετε το String εµφανίστηκε λέξη προς λέξη, µε κάθε λέξη σε ξεχωριστή γραµµή, ενώ αγνοήθηκαν οι χαρακτήρες λευκού διαστήµατος. Η τάξη StringBuffer - 20 -

Η τάξη StringBuffer, χρησιµοποιείται για Strings τα οποία θέλουµε να µπορούν να αλλάξουν τιµή. Σηµειωτέον πως ένα String δεν αλλάζει τιµή. Όταν δίνετε µία νέα τιµή σε ένα String τότε παρασκηνιακά δηµιουργείτε ένα νέο String µε την νέα τιµή. Έτσι η χρήση της τάξης StringBuffer συνίσταται όταν τα περιεχόµενα ενός String µπορεί να αλλάξουν συχνά, γιατί δεν απαιτείται η δηµιουργία νέων αντικειµένων και η συλλογή των παλιών από τον συλλέκτη σκουπιδιών. Βασικές µέθοδοι και κατασκευαστές της τάξης StringBuffer Βασικοί constructors StringBuffer(): Κατασκευάζει έναν άδειο StringBuffer StringBuffer(String str): Κατασκευάζει ένα StringBuffer µε αρχικά περιεχόµενα το str Βασικές µέθοδοι public StringBuffer append(char c): Προσαρτά τον c στο τέλος του StringBuffer. Μέθοδοι append υπάρχουν για κάθε βασικό τύπο της Java αλλά και για Strings ή και για οποιοδήποτε Object (String.valueOf(Object)). public StringBuffer insert(int offset, char c): Εισάγει τον c στη θέση offset. Μέθοδοι insert υπάρχουν επίσης για όλους τους τύπους. public void setcharat(int index, char ch): Αλλάζει τον χαρακτήρα στην θέση index µε τον ch public StringBuffer reverse(): Αντιστρέφει τα περιεχόµενα του StringBuffer. public char charat(int index): Επιστρέφει τον χαρακτήρα στη θέση index. public String tostring(): Επιστρέφει ένα νέο String µε τα περιεχόµενα του StringBuffer public int length(): Επιστρέφει το µήκος του StringBuffer Παράδειγµα της τάξης StringBuffer Θα κάνουµε τάξη Title µε µιά static µέθοδο της µορφής: public static void maketitle(stringbuffer sb) η οποία θα δέχεται ένα StringBuffer και θα αλλάζει τα πρώτα γράµµατα των λέξεων που περιέχει µε κεφαλαία. Για την µετατροπή σε κεφαλαία θα χρησιµοποιήσουµε την ακόλουθη static µέθοδο της τάξης Character: public static char touppercase(char ch) Επίσης για να διαπιστώσουµε αν ένας χαρακτήρας είναι whitespace, θα χρησιµοποιήσουµε την ακόλουθη static µέθοδο της τάξης Character: public static boolean iswhitespace(char ch) public class Title public static void maketitle(stringbuffer sb) boolean inwhitespace = false; for (int i = 0; i < sb.length(); i++) char c = sb.charat(i); if (Character.isWhitespace(c)) inwhitespace = true; else if (inwhitespace i==0) sb.setcharat(i, Character.toUpperCase(c)); inwhitespace = false; public static void main(string args[]) StringBuffer sb = new StringBuffer("pera apo tin afriki"); - 21 -

Title.makeTitle(sb); System.out.println(sb); Η µέθοδος maketitle απλά διασχίζει τον StringBuffer κάνοντας το πρώτο γράµµα κάθε λέξης κεφαλαίο. Το αποτέλεσµα της εκτέλεσης του προγράµµατος θα είναι: Ασκήσεις Να γίνει πρόγραµµα StringUpper.java το οποίο θα έχει πίνακα µε 10 String µε Αγγλικές λέξεις. Το πρόγραµµα θα πρέπει να διατρέχει τον πίνακα και να µετατρέπει κάθε String στο array αυτό σε ένα String µε κεφαλαία γράµµατα. Να χρησιµοποιήσετε τη συνάρτηση touppercase της τάξης String. (Προτεινόµενη λύση: StringUpper.java) Να γίνει πρόγραµµα SortArray.java το οποίο χρησιµοποιεί τον αλγόριθµο της ταξινόµησης µε τη µέθοδο της φυσαλίδας για την αύξουσα ταξινόµηση ενός πίνακα 10 ακεραίων (Προτεινόµενη λύση: SortArray.java) Να γίνει πρόγραµµα SeekNumber.java το οποίο χρησιµοποιεί τον αλγόριθµο της δυαδικής αναζήτησης για να αναζητήσει ένα ακέραιο που δίνεται σαν παράµετρος στο πρόγραµµα σε ένα πίνακα ακεραίων ο οποίος είναι ταξινοµηµένος. (Προτεινόµενη λύση: SeekNumber.java) Προτεινόµενες Λύσεις class StringUpper public static void main(string[] args) String[] arrayofwords = "backspace", "deletes", "the", "character", "to", "the", "left", "of", "the", "cursor"; for (int i=0; i<arrayofwords.length; i++) arrayofwords[i] = arrayofwords[i].touppercase(); System.out.println(arrayOfWords[i]); class SortArray public static void main(string[] args) int[] a = 10, 5, 109, 200, 8, 764, 32, 87, 87, 9; - 22 -

//bubble sort for (int i=1; i<a.length-1; i++) for (int j=a.length-1; j>=i; j--) if (a[j-1] > a[j]) int k = a[j-1]; a[j-1] = a[j]; a[j] = k; //Emfanisi tou apotelesmatos for (int i=0; i<a.length; i++) System.out.println("a["+i+"] = "+a[i]); class SeekNumber public static void main(string[] args) int a[] = 1, 9, 10, 23, 45, 67, 90, 95, 105, 180 ; int left, right, mid=0; if (args.length!= 1) System.out.println("Usage: java SeekNumber int"); System.exit(0); int x = Integer.parseInt(args[0]); left = 0; right = a.length-1; boolean found = false; while (!found && (left<=right)) mid = (left+right)/2; if (a[mid] == x) found = true; else if (a[mid] < x) left = mid + 1; else right = mid - 1; if (found) System.out.println(x+" was found in position a["+mid+"]"); else System.out.println(x+" was not found"); - 23 -

Κεφάλαιο 2: Αντικειµενοστραφής Προγραµµατισµός µε τη Java Σ' αυτό το εδάφιο θα κάνουµε µία εισαγωγή στις έννοιες που θα αναλύσουµε στα επόµενα. Σκοπός των επόµενων µαθηµάτων Στα επόµενα µαθήµατα θα µάθουµε τα ακόλουθα: 1. Πως δηµιουργούµε µία τάξη στη Java 2. Ποιος είναι ο κύκλος ζωής ενός αντικειµένου στη Java 3. εδοµένα και µέθοδοι µιας τάξης σε βάθος 4. Προσδιοριστές πρόσβασης 5. Κληρονοµικότητα τελικές, αφηρηµένες και εσωτερικές τάξεις 6. ιεπαφές (Interfaces) 7. Πακέτα (packages) Τι γνωρίζουµε ήδη Στο πρώτο µάθηµα είδαµε πως δηλώνουµε µία τάξη στη Java και κάναµε µία πρώτη γνωριµία µε τα βασικά στοιχεία της γλώσσας. Συγκεκριµένα είδαµε τα ακόλουθα: Πως είναι µία τάξη στη Java Τι είναι ένα αντικείµενο Τι είναι συγκέντρωση (encapsulation) και υπερφόρτωση (overloading) Τι είναι κληρονοµικότητα (inheritance), και Τι είναι πολυµορφισµός Αυτά αναφέρονται στο µάθηµα: "Έννοιες αντικειµενοστραφούς προγραµµατισµού" Στη συνέχεια θα εκµεταλλευτούµε αυτές τις βάσεις που θέσαµε για να επεκτείνουµε τις γνώσεις µας σ αυτές τις έννοιες Η αρχή είναι η τάξη Η βασική αρχή που διέπει τον αντικειµενοστραφή προγραµµατισµό είναι η έννοια της τάξης (class). Μία τάξη είναι όπως είδαµε ήδη, ένα καλούπι (ένα πρότυπο) από το οποίο δηµιουργούνται τα αντικείµενα αυτής της τάξης. Τα βασικά στοιχεία στον ορισµό µίας τάξης είναι τα ακόλουθα: Ένα όνοµα Κάποια δεδοµένα Ένα (ή περισσότερους) κατασκευαστές (constructors) Κάποιες µεθόδους Στα επόµενα µαθήµατα θα εξετάσουµε αναλυτικά ένα-ένα αυτά τα στοιχεία, έτσι ώστε να είµαστε σε θέση να χειριζόµαστε µε άνεση τις τάξεις. Η δήλωση της τάξης Η δήλωση µιας τάξης έχει την ακόλουθη γενική µορφή: [public] [abstract][final] class OνοµαΤάξης [extends τάξη] [implements λίστα-διεπαφών] - 24 -

<σώµα τάξης> Οι φράσεις µέσα σε αγκύλες είναι προαιρετικές. Το όνοµα µιας τάξης είναι σύµβαση να ξεκινά µε κεφαλαίο γράµµα. Αυτό δεν σηµαίνει ότι είστε υποχρεωµένοι να τηρήσετε αυτή τη σύµβαση, απλά οι «καλοί τρόποι» επιβάλλουν να το πράξετε! Αν το όνοµα της τάξης αποτελείται από πολλές λέξεις, µπορείτε είτε να ξεκινάτε την κάθε λέξη µε κεφαλαίο γράµµα ή να χωρίζεται τις λέξεις µε τον χαρακτήρα υπογράµµισης (underscore): π..χ ThisIsAVeryLongClassName ή This_is_a_very_long_class_name. Mία τάξη είναι καλό να περιέχεται µόνη της σε ένα και µόνο αρχείο, το δε όνοµα αυτού του αρχείου θα πρέπει να είναι το ίδιο µε το όνοµα της τάξης και µε την επέκταση java. Η πρόσβαση σε µία τάξη Εξ ορισµού σε µία τάξη έχουν πρόσβαση τάξεις του ιδίου πακέτου (package). Αν και δεν µιλήσαµε ακόµα για πακέτα, µπορείτε µε ασφάλεια να θεωρήσετε τη λέξη συνώνυµη µε την υποδιεύθυνση ή το φάκελο (directory, folder). Με την τοποθέτηση της λέξης public µπροστά από το όνοµα της τάξης, έχουν και άλλες τάξεις πρόσβαση σε αυτή και µπορούν να τη χρησιµοποιήσουν, ασχέτως από το αν ανήκουν στο ίδιο ή σε διαφορετικά πακέτα. Η δήλωση abstract Για αφηρηµένες (abstract) τάξεις και για τη χρήση τους θα µιλήσουµε σε επόµενα µαθήµατα. Προς το παρόν πάντως αρκεί να πούµε ότι µία τάξη που έχει δηλωθεί ως abstract δεν µπορεί να χρησιµοποιηθεί για τη δηµιουργία αντικειµένων. ηλαδή δεν µπορούµε να δηµιουργήσουµε αντικείµενα µιας abstract τάξης. Η δήλωση final Οι τάξεις που δηλώνονται ως final, δεν µπορούν να χρησιµοποιηθούν σαν υπερτάξεις άλλων τάξεων. Έτσι θα δηλώνετε µία τάξη ως final µόνο αν θέλετε να µην επεκταθεί. Η φράση extends Μία τάξη µπορεί να επεκτείνει (extend) µία άλλη τάξη µε τη χρήση της φράσης extends, όπως είδαµε και στο µάθηµα "Έννοιες αντικειµενοστραφούς προγραµµατισµού". Σηµειώστε ότι στη Java µια τάξη δεν µπορεί να επεκτείνει περισσότερες από µία τάξεις. εν υποστηρίζεται δηλαδή η πολλαπλή κληρονοµικότητα (multiple inheritance). Αλλά γι' αυτό και όλα τα σχετικά µε την κληρονοµικότητα θα µιλήσουµε σε επόµενα µαθήµατα. Η φράση implements Μία διεπαφή (interface) είναι ένα σύνολο δηλώσεων µεθόδων χωρίς ορισµούς. Μία τάξη µπορεί να υλοποιεί µία ή περισσότερες διεπαφές, µε τη χρήση της φράσης implements. Όταν µία τάξη δηλώνει πως υλοποιεί (implements) µία διεπαφή, θα πρέπει να ορίσει όλες τις µεθόδους που έχουν δηλωθεί στη διεπαφή αυτή. Για διεπαφές και τη φράση implements θα µιλήσουµε αναλυτικά σε επόµενα µαθήµατα. Παράδειγµα: Μία τάξη τραπεζικού λογαριασµού Για να αποσαφηνιστούν καλύτερα τα παραπάνω, ας δώσουµε σ' αυτό το σηµείο µία τάξη ενός τραπεζικού λογαριασµού. Η τάξη Account, όπως θα τη πούµε, θα είναι πολύ απλή. Θα αποτελείται από τα εξής: ένα ιδιωτικό µέλος balance το οποίο θα είναι το υπόλοιπο του λογαριασµού - 25 -