Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
1
2η ΟΣΣ – Σύγχρονες μέθοδοι προγραμματισμού - Java
ΠΛΣ60 – Εξειδ. Τεχνολογίας Λογισμικού ΠΣ Εξειδικεύσεις στα Πληροφοριακά Συστήματα Σχολή Θετικών Επιστημών & Τεχνολογίας Ελληνικό Ανοικτό Πανεπιστήμιο
2
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Πλάνο Παρουσίασης 1ο Μέρος – Βασικές Έννοιες 2ο Μέρος – Τελεστές & Πίνακες 3ο Μέρος – Αντικειμενοστραφείς Έννοιες, Κλάσεις 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
3
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Επισκόπηση 1ου μέρους Εισαγωγή στις έννοιες της Java και του αντικειμένου Τύποι Δεδομένων, Μεταβλητές, Τελεστές Οι δομές for, while, if, switch Πίνακες Εισαγωγή στο IDE: BlueJ 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
4
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Χρήσιμα Links Περιβάλλον BlueJ: Java Standard Edition 7 Download: Java SE 7 API Specification: Java Platform SE 7 Documentation: 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
5
Κεντρική Έννοια: Αντικείμενα
Ένα αντικείμενο είναι μια σύλληψη/έννοια, αφαίρεση ή απτή οντότητα με συγκεκριμένα όρια και έννοια για μια εφαρμογή. Διαθέτει: Κατάσταση – State Συμπεριφορά – Behaviour Ταυτότητα - Identity name Α. Καθηγητής personID Κ00108 dateHired /08/2013 department InfSystems Α. Καθηγητής Κατάσταση: Κάθε αντικείμενο αναπαρίσταται από τιμές χαρακτηριστικών και στιγμιότυπα σχέσεων (συνδέσεις) Συμπεριφορά: Εκφράζεται με μεθόδους. Αναπαρίσταται από ένα σύνολο μηνυμάτων στα οποία μπορεί να ανταποκριθεί, δηλαδή αφορά στις λειτουργίες που επιτελεί Ταυτότητα: κάθε αντικείμενο έχει δική του ταυτότητα – υπόσταση ακόμη και αν η κατάστασή του είναι πανομοιότυπη με αυτή κάποιου άλλου αντικειμένου Αναθέτουμε σε τμήμα InfSystems του κ. Α. Καθηγητή Returns: Aνάληψη θέσης-Έναρξη διδασκαλίας Α. Καθηγητής Γραφείο Εκπαίδευσης Είναι άλλο από Α. Καθηγητής Α. Καθηγητής 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
6
Πώς λειτουργεί η Java Βήματα προγραμματισμού με Java Πηγαίος Κώδικας
σε σύνταξη ΟΟP - Java !) person.java Java Compiler Έξοδος (κώδικας) (bytecode) person.class Με κειμενογράφο συντάσσουμε τον πηγαίο κώδικα σε Java 1 2 O compiler ελέγχει το πρόγραμμα και ενημερώνει για λάθη εφόσον δεν ικανοποιούνται οι απαιτήσεις της γλώσσα Smart TV 3 Smartphone Android .ΝΕΤ / C# .. Στην πράξη υλοποιήσεις της JVM πλατφόρμας που να είναι σταθερές από το .NET παρόλο που το Mono project κάνει διαθέσιμο το .ΝΕΤ σε άλλα μη-Windows λειτουργικά Και άλλα όπως το Silverlight , Flash/Adobe 4 Ο compiler δημιουργεί νέο αρχείο κωδικοποιημένο σύμφωνα με τη Java ώστε να μπορεί να το μεταγλωττίσει και τελικά να το εκτελέσει. O bytecode είναι ανεξάρτητος πλατφόρμας Χωρίς να απαιτείται φυσική μηχανή java αλλά με ένα εικονικό περιβάλλον εκτέλεσης Java είναι δυνατό να γίνεται εκτέλεση σε πολύ διαφορετικά συστήματα. Διαβάζει και εκτελεί τον bytecode. Άλλες γλώσσες/περιβάλλοντα το υποστηρίζουν αυτό; Είναι σημαντικό και πόσο; 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
7
Πώς λειτουργούμε την Java
Compiled from "hello.java" public class hello { public hello(); Code: 0: aload_0 1: invokespecial #8 4: return public static void main(java.lang.String[]); 0: getstatic #16 3: ldc #22 5: invokevirtual #24 8: return } public class hello { public static void main(String[] args) { System.out.println("Hello World!");} } Με κειμενογράφο συντάσσουμε τον πηγαίο κώδικα σε Java και τον αποθηκεύουμε π.χ.: hello.java 1 2 Κάνουμε compile το hello.java με τη χρήση του javac (java compiler) και εφόσον δεν υπάρχουν λάθη παράγεται το αρχείο hello.class 3 ΒΗΜΑ 3: ο bytecode είναι σε μορφή byte, δηλαδή το αρχείο hello.class είναι σε μορφή byte. Με χρήση του javap (bytecode disassembler) παρουσιάζεται μία κειμενική εκδοχή του bytecode αναγνώσιμη από τον χρήστη (και όχι από τη μηχανή) 4 Έξοδος To bytecode hello.class Σημαντικό: Το παραπάνω είναι απλώς μια κειμενική εκδοχή του (ενώ το κανονικό αρχείο έχει bytecode και όχι text) Εκτέλεση του προγράμματος με εκκίνηση της Java Virtual Machine με το αρχείο hello.class. H JVM μετατρέπει τον bytecode σε κάτι που η πλατφόρμα μπορεί να εκτελέσει στη συνέχεια. Ίδιο όνομα με την κλάση 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
8
Πρώτο Πρόγραμμα σε java
public class Hello // The Hello class { public static void main(String[] args) //The main method System.out.println("Hello World!"); //Print "Hello World!" } main – κάθε εφαρμογή πρέπει να περιέχει μία μέθοδο main Είναι η μέθοδος που θα εκτελεστεί κατά τον χρόνο εκτέλεσης και μπορεί να καλεί τυχόν άλλες μεθόδους public – φανερώνει ότι η μέθοδος μπορεί να κληθεί από οποιοδήποτε αντικείμενο static – δηλώνει ότι πρόκειται για μέθοδο κλάσης void – η μέθοδος δεν επιστρέφει κάποια τιμή args – είναι ένας πίνακας τύπου String ο οποίος αποθηκεύει τα command line ορίσματα: Πρέπει να δηλωθεί ακόμα και αν ο χρήστης δεν επιδιώκει να δώσει κάποια command line ορίσματα Η ιδιότητα args.length αντιπροσωπεύει τον αριθμό των ορισμάτων που δόθηκαν 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
9
Δήλωση Κλάσεων και Αντικειμένων
Απλή δήλωση κλάσης: class Student{ //field, constructor, and method declarations } Δήλωση υποκλάσης που επιπλέον υλοποιεί μία διεπαφή: public class Student extends Person Implements Activities{ //field, constructor, and method declarations } Ένα αντικείμενο μια κλάσης αρχικοποιείται πλήρως μόνο όταν έχει δηλωθεί ο τύπος του και έχει γίνει χρήση του new όχι μόνο με το πρώτο. Δήλωση αντικειμένων/στιγμιοτύπων μιας κλάσης: Πλήρης αρχικοποίηση: new class ObjectExample { Student s1 = new Student(); // Object of type Student Person s2 = new Person(); // Object of type Person } 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
10
Δήλωση Κλάσης - Παράδειγμα
public class Student { //Fields static int id = 1; String firstName; String lastName; String ; String address; boolean status; String[] courseList; //Constructor public Student(){ id++; // For each Student object increment id } // method declarations follows public static void main(String[] args) System.out.println("Student's name: " + firstName + " " + lastName); Σχόλια Για πολλαπλές σειρές χρήση του /* .. */ Το τέλος μιας πρότασης (statement) δηλώνεται με το ελληνικό ερωτηματικό (“;”) Τα ονόματα στη java είναι case sensitive: main(), Main(), MAIN() είναι διαφορετικές μεταξύ τους μέθοδοι! 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
11
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Ερώτημα 1 Έστω το παρακάτω πρόγραμμα. Ποια είναι η έξοδος που παράγεται; (τι εκτυπώνεται ;) 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
12
Ερώτημα 2 Έστω το παρακάτω κομμάτι ενός προγράμματος. Ποια είναι η έξοδος που παράγεται; (τι εκτυπώνεται ;) int number; number = (1/4) * 4; System.out.println("(1/4) * 4 gives us " +number); Tip: Προσέξτε τα εισαγωγικά 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
13
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Τύποι Δεδομένων Πρωτογενούς τύπου (primitive data types) Σε μια μεταβλητή πρωτογενούς τύπου εκχωρείται τιμή συμβατή με αυτό που αντιπροσωπεύει ο εν λόγω τύπος π.χ. σε μια μεταβλητή τύπου int ανατίθεται ακέραιος αριθμός Τύπου αναφοράς/αντικειμένου (reference/object data types) Σε μια μεταβλητή τύπου αναφοράς μπορεί να εκχωρηθεί: Η αναφορά null Αναφορά σε κάποιο αντικείμενο το οποίο ανήκει σε κλάση συμβατή με τον τύπο της μεταβλητής Τύπος Μέγεθος Εύρος byte 8-bit -128 … 127 short 16-bit … 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
14
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Ερώτημα 3 Έστω το παρακάτω κομμάτι ενός προγράμματος για την μετατροπή θερμοκρασίας Fahreneit σε Celcius. Γιατί δεν λειτουργεί σωστά; double f = 120 ; double c; c = (5/9) * (f ); double f = 120 ; double c; c = (5.0/9.0) * (f ); Aρχικά η ακέραια διαίρεση έδινε πηλίκο 0. Ζητώντας double διαίρεση λαμβάνουμε double αποτέλεσμα (χρήση 5.0) 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
15
Primitive Wrapper Classes
int Integer double Double Περικλείουν («wrap») αντικείμενα τα οποία αντιμετωπίζονται ως πρωτογενείς τύποι δεδομένων class Rectangle{ int length, breadth; void show(int x, int y){ length = x; breadth = y; } int calculate(){ return(length * breadth); public class EnterValuesFromKeyboard{ public static void main(String[] args) { Rectangle rectangle = new Rectangle(); int a = Integer.parseInt(args[0]); // args[0] is converted to int int b = Integer.parseInt(args[1]); // args[1] is converted to int rectangle.show(a, b); System.out.println(" you have entered these values : " + a + " and " + b); int area = rectangle.calculate(); System.out.println(" area of a rectangle is : " + area); 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
16
Κατηγορίες Μεταβλητών
Μεταβλητές μέλους (member variables) ή πεδία (fields) Μεταβλητές στιγμιοτύπου (instance variables) Μοναδική τιμή για καθένα στιγμιότυπο της κλάσης Μεταβλητές κλάσης (class/static variables) Μία τιμή για όλα τα στιγμιότυπα της κλάσης Τοπικές μεταβλητές (local variables) Δηλώνονται μέσα στο σώμα μιας μεθόδου Είναι ορατές μόνο εντός της μεθόδου Παράμετροι (parameters) Είναι ορίσματα σε μεθόδους ΤΙP: Πρέπει να δηλωθούν προτού χρησιμοποιηθούν για πρώτη φορά Τα ονόματα είναι case sensitive Ο πρώτος χαρακτήρας του ονόματος μπορεί να είναι : γράμμα (προτείνεται), ή τα σύμβολα “$”, “_” // “args” is a parameter of the main method public static void main(String[] args) 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
17
Τύποι Μεταβλητών - Παράδειγμα
public class Student{ public String name; // Instance variable public static int id = 3333; // Class variable public static String status = "undergraduate"; // Class variable public void info(int age, int durationOfStudies){ // Parameters int graduationAge = age + durationOfStudies; // Local variable id = 1234; System.out.println("Age: " + age); System.out.println("Graduation age: " + graduationAge); System.out.println("ID number: " + id); } public static void main(String args[]){ Student maria = new Student(); maria.info(18,5); /* Age: 18 Graduation age: 23 ID number: */ System.out.println("Status: " + Student.status); // Status: undergraduate System.out.println("ID number: " + Student.id); // ID number: 1234 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
18
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Εισαγωγή στο BlueJ To BlueJ είναι ένα ακαδημαϊκό ολοκληρωμένο περιβάλλον ανάπτυξης λογισμικού. Ανήκει δηλαδή στην ευρύτερη κατηγορία των IDE (Integrated Development Environment) και περιλαμβάνει: Kειμενογράφο (editor), για να γράφετε προγράμματα (σε Java) Εκσφαλματωτή (debugger), για τον εντοπισμό λαθών Χώρο προβολής (viewer), για να βλέπετε τα text αποτελέσματα των προγραμμάτων σας Έναν εύκολο τρόπο για εκτέλεση προγραμμάτων Java Έναν εύκολο τρόπο για να βλέπετε την τεκμηρίωση (documentation) 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
19
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
BlueJ: Νew Project 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
20
BlueJ: Create Class Το όνομα της κλάσης ξεκινά με κεφαλαία 30/11/2013
Το όνομα της κλάσης ξεκινά με κεφαλαία 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
21
BlueJ: Επεξεργασία με διπλό κλικ στην κλάση
Οι γραμμές δείχνουν ότι η κλάση δεν έχει μεταφραστεί (compile) και άρα δεν είναι εκτελέσιμη ακόμη 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
22
BlueJ: Εκτέλεση με διπλό κλικ στην κλάση
Compile πριν την εκτέλεση Ανοίγει ο επεξεργαστής κειμένου με διπλό κλικ και μπορείτε να κάνετε τις μετατροπές που επιθυμείτε στο πρόγραμμά σας. 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
23
BlueJ: Δεξί κλικ στην κλάση για εκτέλεση και ΟΚ
Εδώ μπορείτε να δώσετε τιμή στο args[] 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
24
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
BlueJ: tips! Όταν κάνετε compile το BlueJ αποθηκεύει αυτόματα το πρόγραμμά σας! Όταν κλείνετε το BlueJ και το ανοίγετε ξανά μπορείτε να χρησιμοποιήσετε το Open Project για να συνεχίσετε το πρόγραμμά σας Μπορείτε να βρείτε όλες τις λεπτομέρειες για το περιβάλλον BlueJ στο: Σε περίπτωση που έχετε ήδη το BlueJ εγκατεστημένο παρακαλείστε να κάνετε αναβάθμιση στην πιο πρόσφατη έκδοση 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
25
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Πλάνο Παρουσίασης 1ο Μέρος – Βασικές Έννοιες 2ο Μέρος – Τελεστές & Πίνακες 3ο Μέρος – Αντικειμενοστραφείς Έννοιες, Κλάσεις 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
26
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Επισκόπηση 2ου μέρους Τελεστές, Αλφαριθμητικά Δομές επανάληψης και ελέγχου Πίνακες 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
27
Τελεστής Ελέγχου Τύπου
Τελεστές Τελεστές Παράδειγμα Τελεστής Ανάθεσης = Ανάθεση τιμής int x = 15, y=3, z=0; boolean bvar = true; Μοναδιαίοι Τελεστές ++ Αύξηση τιμής κατά 1 x++ ή ++x -- Μείωση τιμής κατά 1 x-- ή --x ! Αντιστροφή της τιμής ενός boolean !bvar Τελεστής Ελέγχου Τύπου instanceOf Έλεγχος του τύπου ενός αντικειμένου obj1 instanceOf Class (true or false) 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
28
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Αλφαριθμητικά O τύπος του αλφαριθμητικού αναπαρίσταται με την κλάση String Η λέξη κλειδί null Ειδική τιμή που φανερώνει ότι η μεταβλητή δεν αναφέρεται σε κανένα αντικείμενο Δεν μπορεί να θεωρηθεί 0 ούτε και να χρησιμοποιηθεί σε εκφράσεις με τους πρωτογενείς τύπους της java π.χ. int i = null; // Μη αποδεκτή δήλωση String s = null; // Αποδεκτή δήλωση 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
29
Χαρακτήρας που αναπαρίσταται
Ειδικοί Χαρακτήρες (Escape Sequences) Συμβολισμός Χαρακτήρας που αναπαρίσταται \n Newline (0x0a) \r Carriage return (0x0d) \f Formfeed (0x0c) \b Backspace (0x08) \s Space (0x20) \t tab \" Double quote \' Single quote \\ backslash \ddd Octal character (ddd) \uxxxx Hexadecimal UNICODE character (xxxx) 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
30
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Ο Βρόχος “for” for (init-stmt; condition; next-stmt) { body } public class ForLoop { public static void main(String[] args) { System.out.println("Let's count to 10:"); for (int i = 1; i <= 10; i++) { System.out.println(i); } Ειδική μορφή του for (enhanced for): public class EnhancedForLoop { public static void main(String[] args) { int[] numbers = {1,2,3,4,5,6,7,8,9,10}; for (int counter : numbers) { System.out.println(counter); } 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
31
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Ο Βρόχος “while” Διαδικασία εκτέλεσης: Εξετάζεται η συνθήκη στο “while” Αν η συνθήκη είναι αληθής, εκτελείται το σώμα του βρόχου Επιστροφή στο βήμα 1. init-stmt; while (condition) { body next-stmt; } public class WhileLoop { public static void main(String[] args) { System.out.println("Let's count to 10 using while:"); int i = 1; while (i <= 10) { System.out.println(i); i++; } 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
32
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Ερώτημα 4 Ποια είναι η έξοδος στο παρακάτω; int x = 1; while( x < 10 ) { System.out.println( x ); x += 2; // x = x + 2; } 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
33
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Ερώτημα 5 Ποια είναι η διαφορά στα παρακάτω προγράμματα; (1) int count = 0; while( count++ < 5 ) System.out.print( count + ", " ); (2) int count = 0; while ( ++count <5 ) System.out.print ( count + ", " ); 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
34
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Εμφωλευμένο“if” public class IfStatement { public static void main(String[] args){ String signColour = "blue"; if (signColour == "red") System.out.println("Program suitable only for adults"); else if (signColour == "purple") System.out.println("Program suitable for children above 15"); else { //nested "if-else" statement System.out.print("Program suitable for all:"); if (signColour == "green") System.out.println("No parental guidance is required"); else if (signColour == "blue") System.out.println("Parental guidance suggested"); else if (signColour =="orange") System.out.println("Parental guidance required"); else System.out.println("Without any special rating"); } 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
35
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Ερώτημα 6 Ποια είναι η λειτουργία στο παρακάτω πρόγραμμα για n>0; int MyMethod(int n) { if (n == 1) return 1; return n * MyMethod(n-1); } Μια απλή αναδρομική μέθοδος που υπολογίζει το n παραγοντικό: n! = n × (n-1) × (n-2) × ... × 2 × 1 Tip: Δοκιμάστε το για το n=1 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
36
Η Πρόταση“switch” – Παράδειγμα
class SwitchStatement { public static void main(String[] args) { int month = 3; switch (month) { // Accepts byte, char, short, or int // It can also work with Strings (1.7), EnumTypes // and the wrapper classes Byte, Char, Short and Int case 1: System.out.println("January"); break; case 2: System.out.println("February"); break; case 3: System.out.println("March"); break; case 4: System.out.println("April"); break; case 5: System.out.println("May"); break; case 6: System.out.println("June"); break; case 7: System.out.println("July"); break; case 8: System.out.println("August"); break; case 9: System.out.println("September"); break; case 10: System.out.println("October"); break; case 11: System.out.println("November"); break; case 12: System.out.println("December"); break; default: System.out.println("Invalid month.");break; } Πώς θα ήταν η εναλλακτική υλοποίηση με nested if ; Αποτέλεσμα εκτέλεσης : March 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
37
Εναλλακτική Υλοποίηση με “if”
class SwitchStatement { public static void main(String[] args) { int month = 3; if(month == 1) System.out.println("January"); else if (month == 2) System.out.println("February"); else if (month == 3) System.out.println("March"); else if (month == 4) System.out.println("April"); else if (month == 5) System.out.println("May"); else if (month == 6) System.out.println("June"); else if (month == 7) System.out.println("July"); else if (month == 8) System.out.println("August"); else if (month == 9) System.out.println("September"); else if (month == 10) System.out.println("October"); else if (month == 11) System.out.println("November"); else if (month == 12) System.out.println("December"); else System.out.println("Invalid month!"); } } 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
38
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Πίνακες (Arrays) Δήλωση και αρχικοποίηση ενός πίνακα ακεραίων: Άλλοι τύποι πινάκων: byte[] anArrayOfBytes; short[] anArrayOfShorts; long[] anArrayOfLongs; float[] anArrayOfFloats; double[] anArrayOfDoubles; boolean[] anArrayOfBooleans; char[] anArrayOfChars; String[] anArrayOfStrings; int[] anArray = new int[5]; anArray[0] = 10; anArray[1] = 20; anArray[2] = 30; anArray[3] = 40; anArray[4] = 50; ή: int[] anArray = {10,20,30,40,50}; int[] anArray = new int[]{10,20,30,40,50}; 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
39
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Πίνακες (Arrays) Πίνακες αντικειμένων: Book[] arrayOfBooks = {new Book(5011,"Title1"), new Book(7490,"Title2") }; Προσπέλαση στοιχείων πίνακα: int[] num = new int[3]; for (int i = 0; i < 3; i++) { System.out.println(num[i]); } … ή χρησιμοποιώντας την ιδιότητα length : int[] num = new int[3]; for (int i = 0; i < num.length; i++){ System.out.println(num[i]); } … ή χρησιμοποιώντας τη βελτιωμένη μορφή του for: int[] num = new int[3]; for (int elements: num) { System.out.println(elements);} 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
40
Πολυδιάστατοι Πίνακες
Δήλωση πολυδιάστατου πίνακα: dataype arrayName = new datatype[size1][size2] ... [sizeN]; π.χ: nums 1 2 3 4 5 int[][] nums = new int[3][6]; Είναι δυνατόν να αρχικοποιηθεί μόνο η μία διάσταση: int[][] nums = new int[3][]; null nums 1 2 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
41
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Πλάνο Παρουσίασης 1ο Μέρος – Βασικές Έννοιες 2ο Μέρος – Τελεστές & Πίνακες 3ο Μέρος – Αντικειμενοστραφείς Έννοιες, Κλάσεις 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
42
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Επισκόπηση Βασικές έννοιες του αντικειμενοστραφούς προγραμματισμού Κλάσεις, στιγμιότυπα, μέθοδοι Δημιουργοί (constructors) 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
43
Βασικές Έννοιες Αντικειμενοστρέφειας
Κληρονομικότητα (Inheritance) Η ιδιότητα μιας κλάσης (που καλείται υποκλάση) να μπορεί να χρησιμοποιεί τις ιδιότητες και τις μεθόδους μιας άλλης κλάσης (της υπερκλάσης) Η υποκλάση μπορεί να υλοποιεί επιπλέον λειτουργικότητα π.χ. Η κλάση Student είναι υποκλάση της κλάσης Person Αφαίρεση (Abstraction) Η τεχνική να αναπαρίσταται η κοινή λειτουργικότητα μεταξύ ενός συνόλου κλάσεων π.χ. Όλες οι υποκλάσεις της κλάσης Student (Post GraduateStudent και UnderGraduateStudent) έχουν την κοινή ιδιότητα ότι παρακολουθούν κάποιο πρόγραμμα σπουδών (attendCourse) χωρίς να είναι αναγκαίες οι λεπτομέρειες (θεωρούμε ότι η Student δηλώνεται ως abstract) 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
44
Βασικές Έννοιες Αντικειμενοστρέφειας
Πολυμορφισμός (Polymorphism) Κρύβουμε διαφορετικές υλοποιήσεις πίσω από την ίδια διεπαφή. Η ίδια μέθοδος προκαλεί την εκτέλεση διαφορετικού κώδικα ανάλογα με τον τύπο του αντικειμένου που την καλεί. π.χ. η μέθοδος calculateArea (της υπερ-κλάσης Shape) υπολογίζει το εμβαδό με διαφορετικό τρόπο για ένα αντικείμενο Triangle και διαφορετικά για ένα αντικείμενο Rectangle (Triangle και Rectangle είναι υποκλάσεις της Shape) Ενθυλάκωση (Encapsulation) Η δυνατότητα να αποκρύπτονται δεδομένα (data hiding) της κλάσης (τα οποία δηλώνονται ως private) και να επιτρέπεται η προσπέλασή τους μέσω public μεθόδων (setters and getters) Τηλεόραση Α Τηλεόραση Β Τηλεόραση Γ Remote Control (ίδια διεπαφή – διαφορετικές υλοποιήσεις για κάθε τηλεόραση) 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
45
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Κλάσεις Οι κλάσεις είναι το πιο σημαντικό χαρακτηριστικό μιας γλώσσας που υποστηρίζει τον Αντικειμενοστραφή Προγραμματισμό Ο προγραμματισμός στη Java συνίσταται στον ορισμό ενός αριθμού κλάσεων Κάθε πρόγραμμα είναι μια κλάση Όλο το βοηθητικό λογισμικό αποτελείται από κλάσεις Όλοι οι τύποι που ορίζονται από τον προγραμματιστή είναι κλάσεις 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
46
Δήλωση Κλάσεων – Αντικειμένων
class Student { //field, constructor, and method declarations } Δήλωση στιγμιοτύπων μιας κλάσης: class ObjectExample { Student maria = new Student(); // Object of type Student Person nikos = new Person(); // Object of type Person } 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
47
Μια κλάση είναι ένας τύπος …
Μια κλάση είναι ένας ειδικός τύπος δεδομένων ορισμένος από τον προγραμματιστή, και παρέχεται η δυνατότητα να ορίζουμε μεταβλητές αυτού του τύπου Μια κλάση προσδιορίζει τους τύπους των δεδομένων που μπορεί να περιέχει ένα αντικείμενο, καθώς και τις ενέργειες που μπορεί να εκτελέσει 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
48
Δημιουργός (constructor)
Οι δημιουργοί (constructors) κατασκευάζουν στιγμιότυπα της κλάσης στην οποία ανήκουν Μοιάζουν πολύ με μεθόδους, αλλά: Δεν έχουν τύπο επιστροφής στον ορισμό τους (άρα δεν επιστρέφουν κάποια τιμή ή αναφορά) χωρίς void! Το όνομά τους είναι ίδιο με το όνομα της κλάσης Σε μια κλάση μπορεί να υπάρχουν περισσότεροι του ενός δημιουργοί – ο καθένας με διαφορετικό αριθμό ή/και τύπο ορισμάτων O default constructor μπορεί να είναι implicit Αν δεν υπάρχει κανένας, τότε εισάγει ο compiler public class Student{ String name; int age; // default constructor without arguments public Student() { } // constructor with two arguments public Student(String name, int age) { this.name = name; this.age = age; Η λέξη-κλειδί this μπορεί να χρησιμοποιηθεί μέσα στους δημιουργούς και στις μεθόδους Επιστρέφει την αναφορά στο τρέχον αντικείμενο Μπορεί να χρησιμοποιηθεί από ένα δημιουργό προκειμένου να καλέσει έναν άλλο δημιουργό της ίδιας κλάσης Πρακτικά: Τρόπος να διαχωρίζουμε την τοπική μεταβλητή name & age από τις μεταβλητές μέλη 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
49
Δημιουργοί Παράδειγμα
Student.java (Student class) StudentExample.java (main class) 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
50
Επιστρεφόμενος τύπος αντικειμένου ή void (καμία επιστροφή)
Μέθοδοι (methods) Οι ορισμοί των μεθόδων διαιρούνται σε δυο τμήματα: την επικεφαλίδα (heading) και το σώμα της μεθόδου (method body): Οι μέθοδοι ενεργοποιούνται χρησιμοποιώντας το όνομα του καλούντος αντικειμένου και το όνομα της μεθόδου ως εξής: classVar.myMethod(); Η ενεργοποίηση μιας μεθόδου είναι ισοδύναμη με την εκτέλεση του σώματος της μεθόδου Επιστρεφόμενος τύπος αντικειμένου ή void (καμία επιστροφή) // Instance Method public String getFullName() { String fullName = firstName + " " + lastName; // access instance variables return fullName; } 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
51
Ερώτημα 8 Τι παρατηρείτε στο παρακάτω πρόγραμμα; Υπάρχει σφάλμα;
Τι παρατηρείτε στο παρακάτω πρόγραμμα; Υπάρχει σφάλμα; public Student(){ id++; } public class Student { static int id = 1; String firstName; String lastName; String ; String address; boolean status; String[] courseList; public void fullName() { System.out.println("name: " + firstName); Δεν υπάρχουν μέθοδοι εκτός κλάσεων στη Java ! 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
52
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Κατηγορίες Μεθόδων Μέθοδοι στιγμιοτύπου (Instance methods) Συσχετίζονται με ένα αντικείμενο και χρησιμοποιούν τις μεταβλητές στιγμιοτύπου Μέθοδοι κλάσης (Class methods) Δηλώνονται με τη λέξη-κλειδί static Μπορούν να κληθούν απευθείας με το όνομα της κλάσης, χωρίς να απαιτείται η δημιουργία στιγμιοτύπου: Συνήθως χρησιμοποιούνται για να προσπελαστούν οι μεταβλητές κλάσης (static) Student.staticMethodName(agrs) // encouraged maria.staticMethodName(args) // discouraged 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
53
Κατηγορίες Μεθόδων - Ορατότητα
Μέθοδοι Στιγμιοτύπου: Μπορούν να προσπελάσουν απευθείας: Μεταβλητές στιγμιοτύπου και μεθόδους στιγμιοτύπου Μεταβλητές κλάσης και μεθόδους κλάσης Μέθοδοι Κλάσης: Μπορούν να προσπελάσουν απευθείας μεταβλητές κλάσης και μεθόδους κλάσης Δεν μπορούν να προσπελάσουν απευθείας μεταβλητές στιγμιοτύπου ή μεθόδους στιγμιοτύπου Πρέπει να χρησιμοποιηθεί αναφορά σε αντικείμενο Δεν μπορούν να χρησιμοποιήσουν το this 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
54
Ορατότητα Μεθόδων Παράδειγμα
Student.java (Student class) MethodVisibilityExample.java (main class) 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
55
Χρήση του = και == με Μεταβλητές Τύπου Κλάσης
Όταν χρησιμοποιείται με μεταβλητές τύπου κλάσης, ο τελεστής ανάθεσης (=) παράγει δυο μεταβλητές που αναφέρονται (ονοματίζουν) το ίδιο αντικείμενο Αυτή η συμπεριφορά είναι πολύ διαφορετική από τη συμπεριφορά που επιδεικνύει με μεταβλητές primitive τύπου Επίσης, ο έλεγχος για ισότητα (==) συμπεριφέρεται διαφορετικά για μεταβλητές τύπου κλάσης Ο τελεστής == ελέγχει μόνο ότι δυο μεταβλητές τύπου κλάσης έχουν την ίδια διεύθυνση μνήμης Διαφορετικά από τη μέθοδο equals, δεν ελέγχει ότι οι instance variables έχουν τις ίδιες τιμές Δυο αντικείμενα σε δυο διαφορετικές τοποθεσίες (μνήμης) των οποίων οι instance variables έχουν ακριβώς τις ίδιες τιμές, θα συγκρίνονταν ως "not equal" 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
56
Packages και Δηλώσεις Import
Με τις δηλώσεις import δηλώνουμε ότι θα χρησιμοποιήσουμε κάποια πακέτα - packages στη Java, όπως την κλάση π.χ. Scanner από το package java.util import java.util.Scanner; Είναι δυνατό να κάνουμε διαθέσιμες όλες τις κλάσεις που βρίσκονται σε ένα package, αντί για μία μόνο: import java.util.*; Σημειώστε ότι δεν υπάρχει επιπλέον επιβάρυνση για να κάνουμε import ολόκληρο το package 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
57
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Ερώτημα 9 Τι παρατηρείτε στο παρακάτω πρόγραμμα; Υπάρχει σφάλμα; public class Student { public String firstName; public String lastName; public String address; } public class StudentExample public static void main(String[] args) Student s1 = new Student(); Student s2; System.out.println("1st Student: " + s1.lastName); System.out.println("2nd Student: " + s2.lastName); Δεν έχει αρχικοποιηθεί και δεν έχει γίνει δέσμευση μνήμης για το αντικείμενο s2 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
58
ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Ερώτημα 10 Τι παρατηρείτε στο παρακάτω πρόγραμμα; Υπάρχει σφάλμα; public class Student { public int age; public static void main(String[] args) System.out.println (" age : " + age); } Δε μπορεί να προσπελαστεί από static μέθοδο μία non static μεταβλητή (age) 30/11/2013 ΠΛΣ60: Εξειδ. Τεχνολογίας Λογισμικού
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.