Αντικείµενα ηµιουργία και χρησιµοποίηση αντικειµένων ηµιουργία αντικειµένων Για να δηµιουργήσω ένα νέο αντικείµενο χρησιµοποιώ τον τελεστή new µε τοόνοµατηςκλάσηςαπότηνοποίαθέλωναδηµιουργήσωένααντικείµενο, ακολουθούµενοαπόπαρενθέσεις. Γιαπαράδειγµα: VolcanoRobot dante = new VolcanoRobot(); Οι παρενθέσεις µπαίνουν ακόµη και αν δεν έχω ορίσµατα όπως στο προηγούµενο παράδειγµα. Σε άλλες περιπτώσεις µπορώ να έχω ορίσµατα όπως στο παράδειγµα που ακολουθεί: Point pt = new Point(0,0); Οαριθµόςκαιοτύποςτωνορισµάτωνκαθορίζονταιµέσααπότηνίδιατην κλάση χρησιµοποιώντας µια ειδική µέθοδο που ονοµάζεται constructor. Οι constructors είναι µέθοδοι που αρχικοποιούν ένα αντικείµενο και τις µεταβλητές του. Μέσα σε µία κλάση µπορώ να έχω πολλαπλούς ορισµούς constructor και καθένας από αυτούς να έχει διαφορετικό πλήθος και τύπο ορισµάτων. Με τη χρήση του new η java δεσµεύει την απαραίτητη µνήµη που χρειάζεται για το αντικείµενο. Η απελευθέρωση αυτής της δεσµευµένης µνήµης γίνεται αυτόµατα και δεν χρειάζεται να το κάνει ο προγραµµατιστής. 1
Στοπαράδειγµαπουακολουθείβλέπουµεαντικείµενοµιαςκλάσηςµε 1 ή 2 ορίσµατα στην κλάση που αναφέρεται µετά το new. Η κλάση StringTokenizer Η κλάση αυτή υπάρχει στη βιβλιοθήκη κλάσεων της java και είναι µέρος του πακέτου java.util. Τα αντικείµενα αυτής της κλάσης παίρνουν ένα String και µια λίστα από stop χαρακτήρες και χωρίζουν το string αυτό σε SubStrings του αρχικού string που τελειώνουν µε τους stop χαρακτήρες. Αν δεν υπάρχει λίστα από stop χαρακτήρες θεωρεί το κενό ως stop χαρακτήρα. Κάθετέτοιο substring ονοµάζεται token. Γιαπαράδειγµατο string this is the first course θαδώσει 5 tokens (1 ο this, 2 ο is, 3 ο the, 4 ο first, 5 ο course). Αν δώσωσαν stop χαρακτήρατο @ στο string 11@02@23 θαπάρω 3 tokens (1 ο 11, 2 ο 02, 3 ο 23) Βασικές µέθοδοι της κλάσης nexttokenεξάγειτοεπόµενο String πουοριοθετείταιαπότους stop χαρακτήρες και µετακινεί τον δείκτη στο επόµενο String hasmoretoken επιστρέφει true αν υπάρχουν άλλα tokens. Το αποτέλεσµα του προηγούµενου παραδείγµατος είναι: Στοπαράδειγµαδηµιουργήθηκαν 2 αντικείµενα StringTokenizer χρησιµοποιώντας διαφορετικά ορίσµατα στην κλάση που αναφέρεται µετά τον new. Στην πρώτη περίπτωση το όρισµα είναι το string µε το όνοµα quote1 και στην δεύτερητο quote2 καιοχαρακτήρας @ που είναι ο νέος stop χαρακτήρας. 2
Στο παρακάτω παράδειγµα ορίζω 3 αντικείµενα της κλάσης Date καθένα εκ των οποίων παίρνει διαφορετικά ορίσµατα. Το πρώτο δεν παίρνει κανένα όρισµα, το δεύτερο παίρνει 5 ακεραίους σαν ορίσµατα και το τρίτο µία συµβολοσειρά. Το πρώτο επιστρέφει την τρέχουσα ηµεροµηνία, το δεύτερο επιστρέφει την ηµεροµηνία που του δίνω στους 5 ακεραίους και το τρίτο την ηµεροµηνία που του δίνω στη συµβολοσειρά. import java.util.date; public class ReturnDate { public static void main(string args[]){ Date d1, d2, d3; d1= new Date(); System.out.println("Date 1: "+d1); d2= new Date(71,07,1,3,30); System.out.println("Date 2: "+d2); d3= new Date("April 3 1973 21:24"); System.out.println("Date 3: "+d3); Date 1: Thu Mar 05 12:53:46 EET 2009 Date 2: Sun Aug 01 03:30:00 EET 1971 Date 3: Tue Apr 03 21:24:00 EET 1973 Οτελεστήςτελεία "." Ο τελεστής "." χρησιµοποιείται για να αναφερθώ στις µεταβλητές και στις µεθόδους ενός αντικειµένου. Στα αριστερά της τελείας είναι το αντικείµενο και στα δεξιά η µεταβλητή. Θυµηθείτε το αντικείµενο dante της κλάσης VolcanoRobot και τον τρόπο που αναφερόµαστε σεµεταβλητέςκαιµεθόδουςτουαντικειµένουπ.χ. dante.status, dante.speed, dante.showattributes(), dante.checktemperature(). Η εκχώρηση τιµής σε µία µεταβλητή αντικειµένου γίνεται όπως στις απλές µεταβλητές. dante.speed=15; Και η αλλαγή τιµών γίνεται εξίσου απλά. Στο παράδειγµα που ακολουθεί φαίνεται πως γίνεται η αλλαγή τιµών στις µεταβλητές του αντικειµένου της κλάσης Point. Η κλάση Point είναι µέρος του πακέτου java.awt και αναφέρεται σε σηµείο µε συντεταγµένες x και y. 3
import java.awt.point; public class SetPoints { public static void main(string args[]){ Point location = new Point(4,13); System.out.println("Starting location: "); System.out.println("X equals " + location.x); System.out.println("Y equals " + location.y); System.out.println("\nChange values of x and y"); location.x=7; location.y=6; System.out.println("\nNew location: "); System.out.println("X equals " + location.x); System.out.println("Y equals " + location.y); Starting location: X equals 4 Y equals 13 Change values of x and y New location: X equals 7 Y equals 6 Μεταβλητές κλάσης Οιµεταβλητέςκλάσηςορίζονταιµέσαστηνίδιατηνκλάσηκαιέχουντηνίδιατιµήγια όλα τα αντικείµενα της κλάσης. ηλώνονταιχρησιµοποιώνταςτηνλέξηκλειδί staticπριντοόνοµατηςµεταβλητής. Για παράδειγµα class citizens { static String city = Athens ; int age; String name; Αν ορίσω κάποιο αντικείµενο της κλάσης αυτής και αλλάξω την τιµή της µεταβλητής city τότε η τιµή θα αλλάξει για όλα τα αντικείµενα της κλάσης. Για να αποφευχθούν τέτοιες κατά λάθος αλλαγές καλόν θα ήταν να αλλάζουµε την τιµή της µεταβλητής κλάσης µέσα στον κώδικα και όχι αντικειµένου της κλάσης. οκιµάστε να τυπώσετε την τιµή της µεταβλητής city της κλάσης του προηγούµενου παραδείγµατος. Στη συνέχεια ορίστε 2 αντικείµενα της κλάσης και προσπαθήστε να αλλάξετε την τιµή της µεταβλητής city είτε σαν µεταβλητής αντικειµένου είτε σαν µεταβλητής κλάσης. Τυπώστε τα αποτελέσµατα. 4
Παράδειγµα χρήσης της κλάσης String και των µεθόδων της. Ηκλήσηµιαςµεθόδουσεένααντικείµενογίνεταιµετηχρήσητουτελεστή τελεία όπως και στις µεταβλητές αντικειµένου. Το όνοµα του αντικειµένου είναι στα αριστερά της τελείας και το όνοµα της µεθόδου στα δεξιά. Παράδειγµα χρήσηςτωνµεθόδων length(), charat(), substring(), indexof(), touppercase(). class klhsh_methodvn { public static void main(string args[]) { String str = "Java is an object oriented programming language"; System.out.println("The string is: " + str); System.out.println("Length of this string: "+ str.length()); System.out.println("The character at position 5: "+ str.charat(5)); System.out.println("The substring from 11 to 17: "+ str.substring(11, 17)); System.out.println("The index of the character d: "+ str.indexof('d')); System.out.print("The index of the beginning of the "); System.out.println("substring \"Java\":"+ str.indexof("java")); System.out.println("The string in upper case: "+ str.touppercase()); Επιστρέφει το µήκος του string Επιστρέφειτον 5 ο χαρακτήρα The string is: Java is an object oriented programming language Length of this string: 47 The character at position 5: i (η µέτρηση αρχίζει από το 0. Στη θέση 0 έχουµε το J στη θέση 1 το a κ.λπ.) The substring from 11 to 17: object The index of the character d: 25 The index of the beginning of the substring "Java":0 The string in upper case: JAVA IS AN OBJECT ORIENTED PROGRAMMING LANGUAGE Επιστρέφει τους χαρακτήρες στο διάστηµα 11-17 Επιστρέφουν την θέση του χαρακτήρα ή substring Μετατρέπει σε κεφαλαία Αναφορά σε αντικείµενα import java.awt.point; public class references_test { public static void main (String args[]) { Point pt1, pt2; pt1 = new Point(3, 14); pt2 = pt1; System.out.println("Point1: " + pt1.x + ", " + pt1.y); System.out.println("Point2: " + pt2.x + ", " + pt2.y); pt1.x = 6; pt1.y = 7; System.out.println("Point1: " + pt1.x + ", " + pt1.y); System.out.println("Point2: " + pt2.x + ", " + pt2.y); Το αντικείµενο pt2 δεν έχει δηµιουργηθεί. Αυτό που κάνω µε την µεταβλητή pt2 είναι να δηµιουργήσωµίααναφοράστοαντικείµενο pt1 και όχι να δηµιουργήσω ένα νέο αντικείµενο. Τι θαγίνειανδηµιουργήσωένανέοαντικείµενο; Point1: 3, 14 Point2: 3, 14 Point1: 6, 7 Point2: 6, 7 5
Οι τελεστές == και!= µε αντικείµενα Οι τελεστές σύγκρισης ισχύουν για πρωταρχικούς τύπους δεδοµένων. ύο από αυτούς οι == και!= εφαρµόζονται και στην περίπτωση που έχω να κάνω µε αντικείµενα. Στην περίπτωση των αντικειµένων δεν συγκρίνω τις τιµές τους αλλά αν τα δύο αντικείµενα αναφέρονται στο ίδιο αντικείµενο. Γιαπαράδειγµατααντικείµενατηςκλάσης String.Είναιδυνατόνναέχω 2 τέτοια αντικείµενα µε τις ίδιες τιµές. Αν όµως εφάρµοζα µεταξύ τους τον τελεστή == θα έπαιρνα false και αυτό διότι αναφέροµαι σε διαφορετικά αντικείµενα. Για να συγκρίνω τις τιµές δύο αντικειµένων της κλάσης String χρησιµοποιώ ως τελεστή την µέθοδο equals() η οποία συγκρίνει τις τιµές δύο διαφορετικώναντικειµένωνκαιεπιστρέφει true ανέχουντιςίδιεςτιµές. Στο παράδειγµα που ακολουθεί δηλώνω δύο µεταβλητές τύπου String και δηµιουργώένανέοαντικείµενοµετοντελεστή new γιατηνµίαµεταβλητή. Στη συνέχεια θέτω την δεύτερη µεταβλητή ίση µε την πρώτη. Ο έλεγχος ισότητας που ακολουθεί δίνει true. Στη συνέχεια δηµιουργώ ένα νέο αντικείµενο µε την ίδια τιµή για τη δεύτερη µεταβλητή. Ο έλεγχος ισότητας δίνει false γιατί αναφέροµαι σε 2 διαφορετικά αντικείµενα που έχουν ίδιες τιµές. Ο έλεγχος ισότητας τιµών που ακολουθεί δίνει false. true false true 6
Εύρεση της κλάσης ενός αντικειµένου και έλεγχος αν ένα αντικείµενο ανήκει σε κάποια κλάση Για να µάθω την κλάση ενός αντικειµένου που έχει εκχωρηθεί στην µεταβλητή x γράφω το εξής: String class_name = x.getclass().getname(); Στην µεταβλητή class_name παίρνω το όνοµα της κλάσης. Για να διαπιστώσω αν ένα αντικείµενο το οποίο έχει εκχωρηθεί στην µεταβλητή x είναι αντικείµενο της κλάσης Y γράφω το εξής: boolean answer = x instanceof Y; Η µεταβλητή answer παίρνει την τιµή true αν το X είναι αντικείµενο της κλάσης Y. Στα παραδείγµατα που ακολουθούν χρησιµοποιώ την µέθοδο εντοπισµού µιας κλάσης ενός αντικειµένου καθώς και την επαλήθευση ή µη του αν ένα αντικείµενο είναι αντικείµενο κάποιας κλάσης. import java.awt.point; public class SetPoints { public static void main(string args[]){ Point location = new Point(4,13); System.out.println("Starting location: "); System.out.println("X equals " + location.x); System.out.println("Y equals " + location.y); System.out.println("\nChange values of x and y"); location.x=7; location.y=6; System.out.println("\nNew location: "); System.out.println("X equals " + location.x); System.out.println("Y equals " + location.y); boolean k= location instanceof Point; System.out.println(k); String class_name = location.getclass().getname(); System.out.println(class_name); Starting location: X equals 4 Y equals 13 Change values of x and y New location: X equals 7 Y equals 6 true java.awt.point 7
public class Motorcycle { String make; String color; boolean enginestate; void startengine() { if (enginestate == true) System.out.println("The engine is already on."); else { enginestate = true; System.out.println("The engine is now on."); void showatts() { System.out.println("This motorcycle is a " + color + " " + make); if (enginestate == true) System.out.println("The engine is on."); else System.out.println("The engine is off."); public class motorcycles { public static void main (String args[]) { Motorcycle m = new Motorcycle(); m.make = "Yamaha RZ350"; m.color = "yellow"; System.out.println("Calling showatts..."); m.showatts(); System.out.println(" "); System.out.println("Starting engine..."); m.startengine(); System.out.println(" "); System.out.println("Calling showatts..."); m.showatts(); System.out.println(" "); System.out.println("Starting engine..."); m.startengine(); String class_name = m.getclass().getname(); This motorcycle is a yellow Yamaha RZ350 The engine is off. Starting engine... The engine is now on. Calling showatts... This motorcycle is a yellow Yamaha RZ350 The engine is on. Starting engine... The engine is already on. Η κλάση είναι η Motorcycle System.out.println("The class is the class with name " +class_name); 8