Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων Αντικειμενοστρεφής Προγραμματισμός 4/3/2019 Δρ. Ανδριάνα Πρέντζα Αναπληρώτρια Καθηγήτρια aprentza@unipi.gr
Βασικό λεξιλόγιο Μία ενότητα κώδικα, ένα πρόγραμμα κατά την ορολογία των διαδικαστικών γλωσσών προγραμματισμού ονομάζεται κλάση (class) Οι υπορουτίνες της ονομάζονται μέθοδοι (methods) Μία κλάση μπορεί να ορίζει μεθόδους για δική της χρήση (ιδιωτικές μέθοδοι) ή για χρήση από άλλες κλάσεις (δημόσιες μέθοδοι) Όταν καλούμε μία μέθοδο, στέλνουμε ένα μήνυμα (message) στο αντικείμενο του οποίου η κλάση υλοποιεί την ομώνυμη μέθοδο. Το πλήρες όνομα της μεθόδου είναι ΌνομαΚλάσης.ΌνομαΜεθόδου και ακολουθεί η λίστα παραμέτρων Μπορούμε να δηλώσουμε τις ιδιότητες (properties) που περιλαμβάνει μία κλάση σα να ορίζαμε ένα νέο τύπο δεδομένων Σε αυτή την περίπτωση οι κλάσεις λειτουργούν ως πρότυπα ή καλούπια δεδομένων Κατά την εκτέλεση δημιουργούνται αντικείμενα (objects) που είναι στιγμιότυπα των κλάσεων
Βασικές αρχές λειτουργίας ενός τυπικού περιβάλλοντος Java Συστήματα ανάπτυξης εφαρμογών σε Java Αποτελούνται από το περιβάλλον ανάπτυξης, την γλώσσα, Java Applications Programming Interface (API), class libraries Τα προγράμματα Java ακολουθούν τις εξής φάσεις δημιουργίας: Edit (πληκτρολόγηση) Χρήση ενός editor ώστε να γραφτεί το πρόγραμμα Java vi,emacs, notepad, Jbuilder, Visual J++.java extension Compile (μετάφραση) Μεταφράζει το πρόγραμμα σε μορφή που είναι κατανοητή σε έναν μεταφραστή Java javac εντολή: javac myprogram.java Δημιουργεί.class αρχείο που περιέχει σειρά από bytes (myprogram.class)
Βασικές αρχές λειτουργίας ενός τυπικού περιβάλλοντος Java Loading (φόρτωμα) Ο Class loader μεταφέρει το αρχείο τύπου.class στη μνήμη Εφαρμογές: τρέχουν στον υπολογιστή του χρήστη Applets: φορτώνονται, προσωρινά, στο web browser του χρήστη Οι κλάσεις φορτώνονται και εκτελούνται από τον διερμηνευτή με χρήση της εντολής java, π.χ. java Welcome
Βασικές αρχές λειτουργίας ενός τυπικού περιβάλλοντος Java Verify (επαλήθευση) Ο Bytecode verifier επαληθεύει ότι ο ενδιάμεσος κώδικας είναι σωστός και δεν παραβιάζει την ασφάλεια Η Java πρέπει να είναι ασφαλής δυνατή η πρόκληση προβλημάτων (π.χ. από ιούς) Execute (εκτέλεση) Ο υπολογιστής εκτελεί τον κώδικα, ένα-ένα bytecode Έτσι, εκτελεί τον υπολογισμό που περιγράφεται στο πρόγραμμα Debugging (αποσφαλμάτωση) καθώς τα προγράμματα (συνήθως) δεν τρέχουν σωστά με την πρώτη! Κάνουμε τις απαραίτητες αλλαγές και επαναλαμβάνουμε τη διαδικασία
Βήματα Δημιουργίας Προγράμματος σε Java (1/3) Δημιουργία του πηγαίου κώδικα (source code) με τη χρήση ενός editor (π.χ. Notepad, Textpad, κλπ.) MyProgram.java
Βήματα Δημιουργίας Προγράμματος σε Java (2/3) Μεταγλώττιση (compilation) του πηγαίου κώδικα (MyProgram.java) σε Java bytecode (MyProgram.class) από τον Java Compiler javac MyProgram.java Αν δεν υπάρχουν λάθη MyProgram.class
Βήματα Δημιουργίας Προγράμματος σε Java (3/3) Εκτέλεση προγράμματος του bytecode (MyProgram.class) από τον Java Interpreter java MyProgram Αν δεν υπάρχουν λάθη ΑΠΟΤΕΛΕΣΜΑΤΑ (υπολογισμοί, εκτύπωση στην οθόνη, άλλες λειτουργίες, κλπ.)
Compiling Java
Παρατήρηση H Java είναι case-sensitive (διάκριση μεταξύ πεζών και κεφαλαίων χαρακτήρων) Myprogram MyProgram myprogram
Εκτός από το JDK, επιπλέον Ένας απλός editor (Notepad, WordPad, κλπ.) ή Ένα ολοκληρωμένο περιβάλλον ανάπτυξης IDE (Integrated Development Environment) π.χ. Eclipse, NetBeans, κλπ.
Το πρώτο πρόγραμμα σε Java Παράδειγμα Εκτύπωση μιας γραμμής κειμένου 2005 Pearson Education, Inc. All rights reserved.
Εκτύπωση μιας γραμμής κειμένου 1 // Welcome.java 2 // Text-printing program. 3 4 public class Welcome { 5 6 // main method begins execution of Java application 7 public static void main( String args[] ) 8 { 9 System.out.println( "Welcome to Java Programming!" ); 10 11 } // end method main 12 13 } // end class Welcome Welcome to Java Programming! 2005 Pearson Education, Inc. All rights reserved.
Δομή προγράμματος class CLASSNAME { public static void main(string args[]){ STATEMENTS } }
1 // Welcome.java Σχόλια αρχίζουν με // Αγνοούνται κατά την εκτέλεση Περιγραφή και τεκμηρίωση κώδικα Αναγνωσιμότητα Επίσης με /*... */ /* αυτό είναι ένα παραδοσιακό σχόλιο και μπορεί να χωριστεί σε πολλές γραμμές */ 2 // Text-printing program Άλλο ένα σχόλιο Προσοχή: Οι αριθμοί των γραμμών δεν είναι μέρος του προγράμματος, προστίθενται για ευκολία 2005 Pearson Education, Inc. All rights reserved.
4 public class Welcome { Δήλωση κλάσης για την κλάση Welcome Κάθε πρόγραμμα Java έχει τουλάχιστον μία κλάση που ορίζεται από το χρήστη (user-defined class) Λέξη κλειδί class ακολουθούμενη από το όνομα της κλάσης Κατά την επικρατούσα προγραμματιστική σύμβαση τα ονόματα των κλάσεων ξεκινούν με κεφαλαίο Το ίδιο ισχύει για κάθε νέα λέξη εντός του ονόματος της κλάσης Π.χ. SampleClassName 2005 Pearson Education, Inc. All rights reserved.
4 public class Welcome { Δήλωση κλάσης για την κλάση Welcome Σειρά χαρακτήρων από γράμματα, ψηφία, underscores ( _ ) και dollar ( $ ) Δεν αρχίζει με ψηφίο, δεν έχει κενά Παραδείγματα: Welcome, $value, _value, button7 7button δεν είναι έγκυρο Η Java διακρίνει τα πεζά και τα κεφαλαία γράμματα (case sensitive) Τα a1 και A1 είναι διαφορετικά Προς το παρόν θα ασχοληθούμε μόνο με public κλάσεις 2005 Pearson Education, Inc. All rights reserved.
4 public class Welcome { Αποθήκευση αρχείων Το όνομα το αρχείου προκύπτει από το όνομα της κλάσης με την επέκταση.java Welcome.java Αριστερή αγκύλη { Ξεκινά το σώμα κάθε κλάσης Δεξιά αγκύλη τερματίζει τις δηλώσεις (γραμμή 13) ΠΡΟΣΟΧΗ!!!! Τι γίνεται όταν το όνομα του αρχείου.class είναι διαφορετικό από το όνομα της κλάσης που έχει δηλωθεί ως public μέσα στο αρχείο? 2005 Pearson Education, Inc. All rights reserved.
Καλή Προγραμματιστική Τεχνική Όταν πληκτρολογείτε μία αριστερή αγκύλη, {, στο πρόγραμμά σας, αμέσως πληκτρολογείστε και τη δεξιά αγκύλη, }, και μετά βάλτε τον κέρσορα μεταξύ των δύο αγκυλών και ξεκινείστε να γράφετε το σώμα. Έτσι αποφεύγετε λάθη αγκυλών που λείπουν. 2005 Pearson Education, Inc. All rights reserved.
7 public static void main( String args[] ) Όλες οι εφαρμογές στη Java ξεκινούν την εκτέλεσή τους σε μία main και περιέχουν μία ή περισσότερες μεθόδους Ακριβώς ΜΙΑ μέθοδος πρέπει να ονομάζεται main Οι μέθοδοι μπορούν να εκτελούν λειτουργίες και να επστρέφουν πληροφορία Το void σημαίνει ότι η main δεν επιστρέφει πληροφορία 8 { Η αριστερή αγκύλη ξεκινά το σώμα της δήλωσης μιας μεθόδου (εδώ της main) Τερματισμός με δεξιά αγκύλη } (γραμμή11) 2005 Pearson Education, Inc. All rights reserved.
9 System.out.println( "Welcome to Java Programming!" ); Δίνει οδηγία στον υπολογιστή να εκτελέσει μια λειτουργία Εκτυπώνει string χαρακτήρων String σειρά χαρακτήρων εντός διπλών εισαγωγικών Τα κενά εντός των strings δεν αγνοούνται από τον compiler System.out Στάνταρτ αντικείμενο εξόδου (output object) Εκτύπωση στο command window (δηλ. MS-DOS prompt) Η μέθοδος System.out.println - η println είναι μέθοδος του αντικειμένου System.out Εμφανίζει γραμμή κειμένου Το όρισμα μέσα σε παρενθέσεις Ως εντολή θα πρέπει να τερματίζει με ; 2005 Pearson Education, Inc. All rights reserved.
11 } // end method main Τερματίζει τη δήλωση της μεθόδου 13 } // end class Welcome Τερματίζει τη δήλωση της κλάσης Τα σχόλια διευκολύνουν την αναγνωσιμότητα και την παρακολούθηση του προγράμματος 2005 Pearson Education, Inc. All rights reserved.
Εκτύπωση μιας γραμμής κειμένου Μεταγλώττιση ενός προγράμματος javac Welcome.java Αν δεν υπάρχουν λάθη, δημιουργείται το αρχείο Welcome.class Περιέχει τα bytecodes που αντιστοιχούν στην εφαρμογή Τα bytecodes περνούν στο μεταφραστή της Java 2005 Pearson Education, Inc. All rights reserved.
Εκτύπωση μιας γραμμής κειμένου Εκτέλεση ενός προγράμματος java Welcome Ο μεταφραστής φορτώνει το αρχείο.class για την κλάση Welcome Η επέκταση.class παραλείπεται 2005 Pearson Education, Inc. All rights reserved.
You type this command to execute the application The program outputs Welcome to Java Programming! Executing Welcome in a Microsoft Windows Command Prompt window. 2005 Pearson Education, Inc. All rights reserved.
Τροποποίηση του πρώτου προγράμματος Τροποποίηση του πρώτου προγράμματος για να εκτυπώνει τα ίδια με πριν 9 System.out.print("Welcome to "); 10 System.out.println("Java Programming!"); Η γραμμή 9 εμφανίζει Welcome to με τον κέρσορα να παραμένει στη γραμμή Η γραμμή 10 εμφανίζει Java Programming! στην ίδια γραμμή με τον κέρσορα να πηγαίνει επόμενη 2005 Pearson Education, Inc. All rights reserved.
1 // Welcome2.java 2 // Printing a line of text with multiple statements. 3 4 public προγράμματος class Welcome2 { 5 6 // main method begins execution of Java application 7 public static void main(string args[]) 8 { 9 System.out.print("Welcome to "); 10 System.out.println("Java Programming!"); 11 12 } // end method main Τροποποίηση του πρώτου 13 14 } // end class Welcome2 Η System.out.print διατηρεί τον κέρσορα στην ίδια γραμμή και η System.out.println συνεχίζει στην επόμενη Welcome to Java Programming! 2005 Pearson Education, Inc. All rights reserved.
Τροποποίηση του πρώτου προγράμματος Escape χαρακτήρες Backslash ( \ ) Σηματοδοτεί ειδικούς χαρακτήρες Newline characters (\n) Ερμηνεύονται ως ειδικοί χαρακτήρες από τις μεθόδους System.out.print και System.out.println Σημαίνει ότι ο κέρσορας θα πάει στην αρχή της επόμενης γραμμής 9 System.out.println( "Welcome\nto\nJava\nProgramming!" ); Σπάσιμο γραμμής στο \n 2005 Pearson Education, Inc. All rights reserved.
1 // Welcome3.java 2 // Printing a line of text with multiple statements. 3 Τροποποίηση του πρώτου 4 public class Welcome3 { 5 προγράμματος 6 // main method begins execution of Java application 7 public static void main( String args[] ) 8 { 9 System.out.println( "Welcome\nto\nJava\n Programming!" ); 11 12 } // end method main 13 14 } // end class Welcome3 Για κάθε ακολουθία \n μία νέα γραμμή είναι η έξοδος Welcome to Java Programming! 2005 Pearson Education, Inc. All rights reserved.
Χαρακτήρες διαφυγής...κατά τα γνωστά Escape sequence Description \n Newline. Position the screen cursor at the beginning of the next line. \t Horizontal tab. Move the screen cursor to the next tab stop. \r Carriage return. Position the screen cursor at the beginning of the current line do not advance to the next line. Any characters output after the carriage return overwrite the characters previously output on that line. \\ Backslash. Used to print a backslash character. \" Double quote. Used to print a double-quote character. For example, System.out.println( "\"in quotes\"" ); displays "in quotes" 2005 Pearson Education, Inc. All rights reserved.
Κενά White spaces Κενά, κενές γραμμές και tabs ονομάζονται συλλογικά white space και χρησιμοποιούνται για το διαχωρισμό λέξεων και συμβόλων σε ένα πρόγραμμα Extra white space αγνοείται, επομένως ένα έγκυρο Java πρόγραμμα μπορεί να γίνει formatted με πολλούς διαφορετικούς τρόπους Τα προγράμματα θα πρέπει να γράφονται με τέτοιο τρόπο έτσι ώστε να αυξάνεται η αναγνωσιμότητά τους
Εμφάνιση κειμένου με την printf System.out.printf ισοδύναμο με System.out.format Εμφανίζει μορφοποιημένα τα δεδομένα Δέχεται ως παραμέτρους: String format, Object... args Το format είναι ένα string που καθορίζει τι format θα χρησιμοποιηθεί args είναι η λίστα των μεταβλητών που θα τυπωθούν με αυτό το format 2005 Pearson Education, Inc. All rights reserved.
Εμφάνιση κειμένου με την printf Παράδειγμα System.out.printf("The value of " + "the float variable is " + "%f, while the value of the " + "integer variable is %d, " + "and the string is %s", floatvar, intvar, stringvar); Η 1 η παράμετρος, format, είναι τύπου string και καθορίζει πώς τα αντικείμενα στη 2 η παράμετρο θα εμφανιστόύν. Η 1 η παράμετρος περιέχει απλό κείμενο αλλά και καθοριστές του format (format specifiers), δηλ. ειδικούς χαρακτήρες που καθορίζουν το format των ορισμάτων - Object... Args Π.χ. 0.3f σημαίνει ότι θα έχουμε 3 δεκαδικά ψηφία 2005 Pearson Education, Inc. All rights reserved.
Εμφάνιση κειμένου με την printf 1 // Welcome3a.java 2 // Printing multiple lines in a dialog box. 3 4 public class Welcome3a 5 { 6 // main method begins execution of Java application 7 public static void main( String args[] ) 8 { 9 System.out.printf("%s\n%s\n", 10 "Welcome to", "Java Programming!" ); 11 12 } // end method main 13 14 } // end class Welcome3a System.out.printf εμφανίζει μορφοποιημένα τα δεδομένα Welcome to Java Programming! 2005 Pearson Education, Inc. All rights reserved.
Τύποι και μεταβλητές Είδη τιμών που μπορούν να αποθηκευτούν και να τις επεξεργαστεί κάποιος boolean: Truth value (true or false) int: Integer (0, 1, -47) double: Real number (3.14, 1.0, -2.1) String: Text ( hello, example ). Μεταβλητές Ονοματισμένη θέση που αποθηκεύει μία τιμή ενός τύπου. Ορισμός: TYPE NAME; Παράδειγμα:String foo;
Καταχώρηση (Assignment) Χρησιμοποιούμε = για να δώσουμε τιμή σε μεταβλητή Παράδειγμα: String foo; foo = IAP 6.092 ; Μπορεί να συνδυαστεί με δήλωση τύπου Παράδειγμα: double badpi = 3.14; boolean ismarch = true;
Εμφάνιση κειμένου με μεταβλητή 1 // Welcome3b.java 2 // Printing variable value 3 4 public class Welcome3b 5 { 6 // main method begins execution of Java application 7 public static void main( String args[] ) 8 { 9 String foo= Welcome to Java Programming ; 10 System.out.println(foo); 11 foo= Something else ; 12 System.out.println(foo); 13 } // end method main 14 15 } // end class Welcome3b Welcome to Java Programming Something else
Τελεστές Σύμβολα για απλούς υπολογισμούς Καταχώρηση: = Πρόσθεση: + Αφαίρεση: - Πολλαπλασιασμός: * Διαίρεση: / Σειρά εκτέλεσης πράξεων Standard κανόνες μαθηματικών: Παρενθέσεις Πολλαπλασιασμός και διαίρεση Πρόσθεση και αφαίρεση
Συνένωση ακολουθιών String Concatenation (+) String text = "hello" + " world"; text = text + " number " + 5; // text = "hello world number 5"
Μία δεύτερη εφαρμογή Java Πρόσθεση 2 ακέραιων αριθμών Χρήση της Scanner για ανάγνωση 2 ακέραιων από το χρήστη Χρήση printf για εμφάνιση του αθροίσματος των 2 τιμών Χρήση packages 2005 Pearson Education, Inc. All rights reserved.
1// Fig. 2.7: Addition.java 2// Addition program that displays the sum of two numbers. 3import java.util.scanner; // program uses class Scanner 4 Πρόσθεση 2 ακέραιων Η δήλωση import εισάγει την 5public class Addition κλάση Scanner από το πακέτο 6{ (package) java.util. 7 // main method begins execution of Java application 8 public static void main (String args[]) 9 { 10 // create Scanner to obtain input from command window 11 Scanner input = new Scanner(System.in); 12 13 int number1; // first number to add 14 int number2; // second number to add 15 int sum; // sum of number1 and number2 16 17 System.out.print("Enter first integer: "); // prompt 18 number1 = input.nextint(); // read first number Δήλωση και αρχικοποίηση της μεταβλητής input, που είναι μία Scanner. Δήλωση μεταβλητών number1, number2 και sum. Διαβάζει έναν integer από το χρήστη και τον αναθέτει στη number1. 2005 Pearson Education, Inc. All rights reserved.
20 System.out.print("Enter second integer: "); //prompt 21 number2 = input.nextint(); // read second number from user 22 23 sum = number1 + number2; // add numbers 24 Πρόσθεση 2 ακέραιων 25 System.out.printf("Sum is %d\n", sum); // display sum 26 στη number2. 27 } // end method main 28 29} // end class Addition Enter first integer: 45 Enter second integer: 72 Sum is 117 Εμφανίζει το sum με χρήση μορφοποιημένης εξόδου Διαβάζει έναν integer από το χρήστη και τον αναθέτει Υπολογίζει το άθροισμα των number1 και number2, και θέτει το αποτέλεσμα στη sum. 2005 Pearson Education, Inc. All rights reserved.
Πρόσθεση 2 ακέραιων 3 import java.util.scanner; // program uses class Scanner Δηλώσεις import Χρησιμοποιούνται από τον compiler για να προσδιορίζει και να εντοπίζει classes Του υποδεικνύει να φορτώσει την κλάση Scanner από το package java.util 5 public class Addition 6 { Έναρξη κλάσης public class Addition Το όνομα του αρχείου πρέπει να είναι Addition.java Γραμμές 8-9: ξεκινά η main 2005 Pearson Education, Inc. All rights reserved.
Αποφυγή λαθών Όλες οι δηλώσεις import πρέπει να εμφανίζονται πριν τη δήλωση της κλάσης στο αρχείο Διαφορετικά (π.χ. Στο σώμα δήλωσης ή μετά τη δήλωση της κλάσης) syntax error Αν ξεχάσουμε να συμπεριλάβουμε μια δήλωση import για μια κλάση που χρησιμοποιούμε στο πρόγραμμα Συνήθως cannot resolve symbol. 2005 Pearson Education, Inc. All rights reserved.
10 // create Scanner to obtain input from command window 11 Scanner input = new Scanner(System.in); Πρόσθεση 2 ακέραιων Η input είναι αντικείμενο τύπου Scanner δίνει τη δυνατότητα στο πρόγραμμα να διαβάσει δεδομένα για χρήση Έχουμε δήλωση μεταβλητής Θέση στη μνήμη που αποθηκεύει μία τιμή Δήλωση με όνομα και τύπο πριν τη χρήση Με το = η input αποκτά ένα στιγμιότυπο της κλάσης Scanner Αυτή η έκφραση δημιουργεί ένα αντικείμενο της κλάσης Scanner που διαβάζει τα δεδομένα που πληκτρολογεί ο χρήστης Όνομα μεταβλητής: any valid identifier Declarations end with semicolons ; Initialize variable in its declaration Equal sign Standard input object System.in 2005 Pearson Education, Inc. All rights reserved.
Πρόσθεση 2 ακέραιων Δήλωση μεταβλητών number1, number2 και sum τύπου int int holds integer values (whole numbers): i.e., 0, -4, 97 Types float and double can hold decimal numbers Type char can hold a single character: i.e., x, $, \n, 7 int, float, double and char are primitive types Προσθήκη σχολίων για σκοπό των μεταβλητών 13 int number1; // first number to add 14 int number2; // second number to add 15 int sum; // second number to add Κλασικά, μπορούμε να δηλώσουμε πολλαπλές μεταβλητές του ίδιου τύπου μαζί int number1, // first number to add number2, // second number to add sum; // second number to add Χρήση διαχωριστή (comma) 2005 Pearson Education, Inc. All rights reserved.
Προσοχή Κατά συνθήκη, τα ονόματα των μεταβλητών ξεκινούν με πεζά γράμματα Και κάθε λέξη στο όνομα μετά την πρώτη λέξη ξεκινά με κεφαλαίο γράμμα Παράδειγμα firstnumber 2005 Pearson Education, Inc. All rights reserved.
Ορισμός Μεταβλητών Τύπος μεταβλητής Γενικά Όνομα_Μεταβλητής παραδείγματα int number1; float a, b, c = 5.5; boolean temp; char mychar = c ; Δήλωση και αρχικοποίηση μαζί
Οι βασικοί τύποι δεδομένων στη Java Τύποι Δεδομένων byte Ακέραιοι short, int, long Κινητής Υποδιαστολής float, double boolean Χαρακτήρες char
Τύποι Δεδομένων (με παραδείγματα) Literal Data Type 178 int 8864L long 37.266 double 37.266D double 87.363F float 26.77e3 double c true false char boolean boolean
Primitive datatypes (integers) Πρωταρχικοί τύποι δεδομένων
Primitive datatypes (floating point)
Miscellaneous datatypes
Πρόσθεση 2 ακέραιων 17 System.out.print( "Enter first integer: " ); // prompt Καλείται ένα prompt κατευθύνει το χρήστη να κάνει μια λειτουργία Package java.lang 18 number1 = input.nextint(); // read first number from user Το αποτέλεσμα της κλήσης του nextint δίνεται στη number1 με χρήση του τελεστή ανάθεσης = Τελεστής ανάθεσης = δυαδικός τελεστής έχει δύο τελεστέους Η έκφραση στα δεξιά υπολογίζεται και ανατίθεται στη μεταβλητή στα αριστερά Δηλ: η number1 παίρνει την τιμή της input.nextint() 2005 Pearson Education, Inc. All rights reserved.
Προσοχή!!! Εξ ορισμού, το πακέτο (package) java.lang εισάγεται σε κάθε πρόγραμμα Java Επομένως, το java.lang είναι το μόνο package στο Java API που δε χρειάζεται δήλωση import 2005 Pearson Education, Inc. All rights reserved.
Πρόσθεση 2 ακέραιων 20 System.out.print( "Enter second integer: " ); // prompt Ομοίως με πριν για το δεύτερο ακέραιο 21 number2 = input.nextint(); // read second number from user Ομοίως με πριν, αναθέτει στη number2 τον δεύτερο εισαχθέντα ακέραιο 23 sum = number1 + number2; // add numbers Δήλωση ανάθεσης Υπολογίζει το άθροισμα των number1 και number2 (right hand side) Χρήση τελεστή ανάθεσης = για ανάθεση αποτελέσματος στη μεταβλητή sum Δηλ.: Η sum παίρνει την τιμή του number1 + number2 2005 Pearson Education, Inc. All rights reserved.
Πρόσθεση 2 ακέραιων 25 System.out.printf( "Sum is %d\n: ", sum ); // display sum Χρήση System.out.printf για εμφάνιση αποτελεσμάτων Χρήση %d για μορφοποίηση σε int System.out.printf( "Sum is %d\n: ", ( number1 + number2 ) ); Οι υπολογισμοί μπορούν να γίνουν εντός της printf Οι παρενθέσεις για την έκφραση number1 + number2 δεν είναι απαραίτητες Άσκηση! Αντίστοιχα με την πρόσθεση 2 ακεραίων, γράψτε ένα ολοκληρωμένο πρόγραμμα που υπολογίζει και προβάλει το γινόμενο τριών ακεραίων! 2005 Pearson Education, Inc. All rights reserved.
Διαίρεση Η διαίρεση ( / ) λειτουργεί διαφορετικά σε integers και doubles! Παράδειγμα: double a = 5.0/2.0; int b = 4/2; int c = 5/2; double d = 5/2; // a = 2.5 // b = 2 // c = 2 // d = 2.0
Προτεραιότητα πράξεων Από αριστερά προς δεξιά Το δεξί μέρος του = υπολογίζεται πρώτα Παράδειγμα: double x = 3 / 2 + 1; double y = 3 / (2 + 1); // x = 2.0 // y = 1.0
Mismatched Types Η Java πάντα ελέγχει ότι οι τύποι ταιριάζουν: String five = 5; // ERROR! test.java.2: incompatible types found: int required: java.lang.string String five = 5;
Μετατροπή με casting int a = 2; // a = 2 double a = 2; // a = 2.0 (Implicit) int a = 18.7; // ERROR int a = (int)18.7; // a = 18 double a = 2/3; // a = 0.0 double a = (double)2/3; // a = 0.6666.
Methods
Προσθήκη μεθόδων public static void NAME() { } STATEMENTS Για την κλήση μιας μεθόδου: NAME();
Προσθήκη μεθόδων class NewLine { public static void newline() { System.out.println(""); } public static void threelines() { } newline(); newline(); newline(); } public static void main(string[] arguments){ System.out.println("Line 1"); threelines(); System.out.println("Line 2"); }
Παράμετροι public static void NAME(TYPE NAME) { } STATEMENTS Για την κλήση: NAME(EXPRESSION);
Προσθήκη μεθόδων class Square { public static void printsquare(int x){ System.out.println(x*x); } } public static void main(string[] arguments){ int value = 2; printsquare(value); printsquare(3); printsquare(value*2); }
What s wrong here? class Square2 { public static void printsquare(int x){ System.out.println(x*x); } } public static void main(string[] arguments){ printsquare( hello ); printsquare(5.5); }
Πολλαπλές παράμετροι [ ] NAME(TYPE NAME, TYPE NAME) { } STATEMENTS Για την κλήση: NAME(ΑRG1, ARG2);
Προσθήκη μεθόδων class Multiply { public static void times (int a, int b){ System.out.println(a * b); } } public static void main(string[] arguments){ times (2, 2); times (3, 4); }
Τιμές επιστροφής public static TYPE NAME( ) { STATEMENTS return EXPRESSION; } void: σημαίνει no type
Τιμές επιστροφής class Square3 { public static void printsquare(int x){ System.out.println(x*x); } } public static void main(string[] arguments){ } printsquare(5);
Τιμές επιστροφής class Square4 { public static double square(int x){ return x*x; } } public static void main(string[] arguments){ } System.out.println(square(5)); System.out.println(square(2));
Methods: Building Blocks Τα μεγάλα προγράμματα χτίζονται με μικρές μεθόδους Οι μέθοδοι μπορούν να αναπτυχθούν, ελεγχθούν και ξαναχρησιμοποιηθούν ανεξάρτητα Ο χρήστης της μεθόδου δεν χρειάζεται να ξέρει πώς δουλεύει! Αυτό στην Επιστήμη των Υπολογιστών, ονομάζεται abstraction (αφαίρεση)
if statement if (CONDITION) { } STATEMENTS Συνθήκη Η έκφραση μπορεί να είναι είτε true είτε false if statement Αν μία συνθήκη είναι true, τότε το body της if statement εκτελείται Οι συνθήκες στα if statements σχηματίζονται με τελεστές ισότητας και σχεσιακούς τελεστές
Παράδειγμα public static void test(int x){ if (x > 5){ System.out.println(x + " is > 5"); } } public static void main(string[] arguments){ test(6); test(5); test(4); }
Τελεστές ισότητας και σχεσιακοί τελεστές Standard algebraic equality or relational operator Java equality or relational operator Sample Java condition Meaning of Java condition Equality operators == x == y x is equal to y!= x!= y x is not equal to y Relational operators > x > y x is greater than y < x < y x is less than y >= x >= y x is greater than or equal to y <= x <= y x is less than or equal to y 2005 Pearson Education, Inc. All rights reserved.
Τελεστές ισότητας ΜΗ ΧΡΗΣΙΜΟΠΟΙΕΙΤΕ ΠΟΤΕ == σε doubles! double a = Math.cos (Math.PI / 2); double b = 0.0; a = 6.123233995736766E-17 a == b επιστρέφει FALSE!
1 // Fig. 2.15: Comparison.java 2 // Compare integers using if statements, relational operato 3 // and equality operators. 4 import java.util.scanner; // program uses class Scanner 5 Παράδειγμα 6 public class Comparison 7 { 8 // main method begins execution of Java application 9 public static void main( String args[] ) 10 { 11 // create Scanner to obtain input from command window 12 Scanner input = new Scanner( System.in ); 13 14 int number1; // first number to compare 15 int number2; // second number to compare 16 17 System.out.print( "Enter first integer: " ); // prompt 18 number1 = input.nextint(); // read first number from user 19 20 System.out.print( "Enter second integer: " ); // prompt 21 number2 = input.nextint(); // read second number from user 22 23 if ( number1 == number2 ) 24 System.out.printf( "%d == %d\n", number1, number2 ); 25 26 if ( number1!= number2 ) 27 System.out.printf( "%d!= %d\n", number1, number2 ); 28 29 if ( number1 < number2 ) 30 System.out.printf( "%d < %d\n", number1, number2 ); 2005 Pearson Education, Inc. All rights reserved.
31 32 if ( number1 > number2 ) 33 System.out.printf( "%d > %d\n", number1, number2 ); 34 35 Παράδειγμα if ( number1 <= number2 ) 36 System.out.printf( "%d <= %d\n", number1, number2 ); 37 38 if ( number1 >= number2 ) 39 System.out.printf( "%d >= %d\n", number1, number2 ); 40 41 } // end method main 42 43 } // end class Comparison Enter first integer: 777 Enter second integer: 777 777 == 777 777 <= 777 777 >= 777 Enter first integer: 1000 Enter second integer: 2000 1000!= 2000 1000 < 2000 1000 <= 2000 Enter first integer: 2000 Enter second integer: 1000 2000!= 1000 2000 > 1000 2000 >= 1000 2005 Pearson Education, Inc. All rights reserved.
Τελεστές ισότητας και Σχεσιακοί τελεστές Γραμμή 6: αρχίζει η δήλωση της class Comparison Γραμμή 12: ορίζει Scanner variable input και καταχωρεί μία Scanner που διαβάζει δεδομένα από standard input Γραμμές 14-15: δηλώνουν μεταβλητές int Γραμμές 17-18: ζητάνε από το χρήστη να εισάγει τον πρώτο ακέραιο και εισάγει την τιμή Γραμμές 20-21: ζητάνε από το χρήστη να εισάγει το δεύτερο ακέραιο και εισάγει την τιμή 2005 Pearson Education, Inc. All rights reserved.
Τελεστές ισότητας και Σχεσιακοί τελεστές 23 if ( number1 == number2 ) 24 System.out.printf( "%d == %d\n", number1, number2 ); if statement για τον έλεγχο ισότητας με (==) Αν οι μεταβλητές είναι ίσες (συνθήκη true) Εκτελείται η γραμμή 24 Αν οι μεταβλητές δεν είναι ίσες, τότε η εντολή παραλείπεται ΟΧΙ ; στο τέλος του if statement Άδειο statement Δεν εκτελείται καμία λειτουργία Γραμμές 26-27, 29-30, 32-33, 35-36 και 38-39 Ελέγχουν τα number1 και number2 με τους τελεστές!=, <, >, <= και >=, αντίστοιχα 2005 Pearson Education, Inc. All rights reserved.
Συχνό Προγραμματιστικό Λάθος Η σύγχυση του τελεστή ισότητας «==» με τον τελεστή ανάθεσης «=» μπορεί να προκαλέσει λογικό ή συντακτικό λάθος! Ο τελεστής ισότητας πρέπει να διαβάζεται ως ισούται με, και ο τελεστής ανάθεσης πρέπει να διαβάζεται and the assignment operator should be read as παίρνει ή παίρνει την τιμή. Μερικοί άνθρωποι διαβάζουν τον τελεστή ισότητας ως διπλό ίσον ή ίσον ίσον. 2005 Pearson Education, Inc. All rights reserved.
Συχνό Προγραμματιστικό Λάθος Είναι συντακτικό λάθος αν οι τελεστές ==,!=, >= και <= περιέχουν διαστήματα ανάμεσα στα σύμβολά τους, όπως στα = =,! =, > = και < =, αντιστοίχως. Η αναστροφή των τελεστών!=, >= και <=, όπως στα =!, => and =<, αποτελεί συντακτικό λάθος. Η τοποθέτηση ; αμέσως μετά τη δεξιά παρένθεση της συνθήκης σε μία πρόταση if είναι κανονικά λογικό σφάλμα. 2005 Pearson Education, Inc. All rights reserved.
Τελεστές boolean &&: logical AND : logical OR if (x > 6) { if ( x > 6 && x < 9) { if (x < 9) { } } }
else if (CONDITION) { STATEMENTS } else { STATEMENTS }
Παράδειγμα public static void test(int x){ } if (x > 5){ } else { } System.out.println(x + " is > 5"); System.out.println(x + " is not > 5"); } public static void main(string[] arguments){ test(6); test(5); test(4); }
else if if (CONDITION) { STATEMENTS } else if (CONDITION) { STATEMENTS } else if (CONDITION) { STATEMENTS } else { STATEMENTS }
Παράδειγμα public static void test(int x){ } if (x > 5){ System.out.println(x + " is > 5"); } else if (x == 5){ } else { } System.out.println(x + " equals 5"); System.out.println(x + " is < 5"); public static void main(string[] arguments){ test(6); test(5); test(4); }
Καλές προγραμματιστικές τεχνικές! Ο στόχος του καλού προγραμματιστικού στυλ είναι να είναι ο κώδικάς μας πιο ευανάγνωστος! Από εμάς και από τους άλλους!!!
Κανόνας #1: χρησιμοποείστε καλά (meaningful) ονόματα String a1; int a2; double b; // BAD!! String firstname; // GOOD String lastname; // GOOD int temperature; // GOOD
Κανόνας #2: Χρησιμοποιείστε indentation public static void main (String[] arguments) { int x = 5; x = x * x; if (x > 20) { } double y = 3.4; } System.out.println(x + is greater than 20. );
Κανόνας #3: Χρησιμοποιείστε κενούς χαρακτήρες Βάλετε κενούς χαρακτήρες σε πολύπλοκες εκφράσεις: // BAD!! double cel=fahr*42.0/(13.0-7.0); // GOOD double cel = fahr * 42.0 / (13.0-7.0);
Κανόνας #3: Χρησιμοποιείστε κενούς χαρακτήρες Βάλετε κενές γραμμές για βελτίωση αναγνωσιμότητας: public static void main (String[] arguments) { int x = 5; x = x * x; if (x > 20) { } System.out.println(x + is > 20. ); } double y = 3.4;
Κανόνας #4: Μην επαναλαμβάνετε ελέγχους if (basepay < 8.0) {... } else if (hours > 60) {... } else if (basepay >= 8.0 && hours <= 60) {... }
Κανόνας #4: Μην επαναλαμβάνετε ελέγχους if (basepay < 8.0) {... } else if (hours > 60) {... } else if (basepay >= 8.0 && hours <= 60) {... } BAD
Κανόνας #4: Μην επαναλαμβάνετε ελέγχους if (basepay < 8.0) {... } else if (hours > 60) {... } else {... }
Δομές ελέγχου Εντολές επανάληψης Γνωστές και ως εντολές βρόχου Επανειλημμένα εκτελούνται ενέργειες για όσο η συνθήκη συνέχισης του βρόχου παραμένει αληθής εντολή while Εκτελεί τις ενέργειες εντός του σώματός της 0 ή περισσότερες φορές εντολή do while Εκτελεί τις ενέργειες εντός του σώματός της 1 ή περισσότερες φορές εντολή for Εκτελεί τις ενέργειες εντός του σώματός της 0 ή περισσότερες φορές 2005 Pearson Education, Inc. All rights reserved.
Παραδείγματα Ακολουθούν παραδείγματα χρήσης των παραπάνω εντολών (ήδη γνωστών από τη C) σε JAVA 2005 Pearson Education, Inc. All rights reserved.
Παράδειγμα 1 Ψευδοκώδικας για την επίλυση του προβλήματος εύρεσης του μέσου όρου βαθμών σε μία τάξη 10 σπουδαστών με επανάληψη ελεγχόμενη από μετρητή (counter-controlled) 1 Set total to zero 2 Set grade counter to one 3 4 While grade counter is less than or equal to ten 5 Prompt the user to enter the next grade 6 Input the next grade 7 Add the grade into the total 8 Add one to the grade counter 9 10 Set the class average to the total divided by ten 11 Print the class average 2005 Pearson Education, Inc. All rights reserved.
1 // Fig. 4.6: GradeBook.java 2 // GradeBook class that solves class-average problem using 3 // counter-controlled repetition. 4 import java.util.scanner; // program uses class Scanner 5 6 public class GradeBook 7 { 8 private String coursename; // name of course this GradeBook represents 9 10 // constructor initializes coursename 11 public GradeBook(String name) 12 { 13 coursename = name; // initializes coursename 14 } // end constructor 15 16 // method to set the course name 17 public void setcoursename(string name) 18 { 19 coursename = name; // store the course name 20 } // end method setcoursename 21 22 // method to retrieve the course name 23 public String getcoursename() 24 { 25 return coursename; 26 } // end method getcoursename 27 Ανάθεση τιμής στη μεταβλητή coursename Δήλωση μεθόδου setcoursename Δήλωση μεθόδου getcoursename 2005 Pearson Education, Inc. All rights reserved.
28 // display a welcome message to the GradeBook user 29 public void displaymessage() Δήλωση μεθόδου 30 { displaymessage 31 // getcoursename gets the name of the course 32 System.out.printf( "Welcome to the grade book for\n%s!\n\n, 33 getcoursename() ); 34 } // end method displaymessage 35 36 // determine class average based on 10 grades entered by user 37 public void determineclassaverage() 38 { Δήλωση μεθόδου 39 // create Scanner to obtain input from command window determinecla 40 Scanner input = new Scanner(System.in); ssaverage 41 42 int total; // sum of grades entered by user Δήλωση και 43 int gradecounter; // number of the grade to be entered αρχικοποίηση next τη 44 int grade; // grade value entered by user μεταβλητή input 45 int average; // average of grades τύπου Scanner 46 47 // initialization phase 48 total = 0; // initialize total 49 gradecounter = 1; // initialize loop counter 50 Δήλωση τοπικών μεταβλητών total, gradecounter, grade and average τύπου int 2005 Pearson Education, Inc. All rights reserved.
51 // processing phase 52 while (gradecounter<=10) // loop 10 times 53 { 54 System.out.print("Enter grade: "); // prompt 55 grade = input.nextint(); // input next gradε 56 total = total + grade; // add grade 57 gradecounter = gradecounter + 1; // increment 58 } // end while 59 60 // termination phase 61 average = total / 10; // integer division 62 63 // display total and average of grades Αύξηση της μεταβλητήςμετρητή gradecounter 64 System.out.printf("\nTotal of all 10 grades is %d\n", total); 65 System.out.printf("Class average is %d\n", average); 66 } // end method determineclassaverage 67 68 } // end class GradeBook Εμφάνιση αποτελεσμάτων Υπολογισμός μέσου όρου βαθμών Ο βρόχος while επαναλαμβάνεται για όσο ισχύει ότι gradecounter <= 10 2005 Pearson Education, Inc. All rights reserved.
1 // Fig. 4.7: GradeBookTest.java 2 // Create GradeBook object and invoke its determineclassaverage method. 3 4 public class GradeBookTest 5 { 6 public static void main(string args[]) 7 { 8 // create GradeBook object mygradebook and 9 // pass course name to constructor 10 GradeBook mygradebook = new GradeBook( 11 "CS101 Introduction to Java Programming"); 12 13 mygradebook.displaymessage(); // display welcome message 14 mygradebook.determineclassaverage(); // find average 15 } // end main 16 17 } // end class GradeBookTest Δημιουργία νέου (new) αντικειμένου GradeBook Πέρασμα του ονόματος του μαθήματος στον κατασκευαστή GradeBook ως string Κλήση της determineclassaverage μεθόδου της GradeBook 2005 Pearson Education, Inc. All rights reserved.
Παρατηρήσεις Η εμπειρία έχει δείξει ότι το πιο δύσκολο κομμάτι επίλυσης προβλήματος σε έναν υπολογιστή είναι η επινόηση και ανάπτυξη του αλγόριθμου επίλυσης Εφόσον έχει καθοριστεί ένας σωστός αλγόριθμος, η διαδικασία παραγωγής ενός προγράμματος Java program (που να δουλεύει :-)) είναι απλά ρουτίνα 2005 Pearson Education, Inc. All rights reserved.
Αποφυγή λαθών Να αρχικοποιείτε κάθε μετρητή (counter) και μεταβλητή συνόλου (total), είτε στη δήλωσή της είτε με μια εντολή ανάθεσης Συνήθως οι μεταβλητές total αρχικοποιούνται στο 0. οι μετρητές αρχικοποιούνται στο 0 ή το 1. 2005 Pearson Education, Inc. All rights reserved.
Welcome to the grade book for CS101 Introduction to Java Programming! Enter grade: 67 Enter grade: 78 Enter grade: 89 Enter grade: 67 Enter grade: 87 Enter grade: 98 Enter grade: 93 Enter grade: 85 Enter grade: 82 Enter grade: 100 Total of all 10 grades is 846 Class average is 84 2005 Pearson Education, Inc. All rights reserved.
Πηγές/Acknowledgements http://java.sun.com/j2se H. M. Deitel, P. J. Deitel, Java Προγραμματισμός, 6η έκδοση, Μ. Γκιούρδας, 2006 D. Barnes, M. Kolling, Αντικειμενοστρεφής Προγραμματισμός σε Java, Κλειδάριθμος, 2008 Βασίλης Χριστοφίδης, Αντικειμενοστρεφής Προγραμματισμός, Πανεπιστήμιο Κρήτης Κ. Τσαγκάρης, Εισαγωγή στις εφαρμογές της Java, Πανεπιστήμιο Πειραιώς Jones, Evan, Adam Marcus, and Eugene Wu. 6.092 Introduction to Programming in Java,January IAP 2010. (Massachusetts Institute of Technology: MIT OpenCourseWare), http://ocw.mit.edu (Accessed 10 Mar, 2013). License: Creative Commons BY-NC-SA