Αντικείμενα
- Ένα αντικείμενο ορίζεται ως ένα σύνολο από
πεδία (fields) (ή
μεταβλητές υπόστασης (instance variables) ή
ιδιότητες (properties))
και
μεθόδους (methods).
- Και οι δύο κατηγορίες ονομάζονται μέλη (members) του αντικειμένου.
- Τα πεδία περιέχουν δεδομένα σχετικά με την κατάσταση του αντικειμένου
- Οι μέθοδοι περιέχουν κώδικα που επιτρέπει την πρόσβαση και την αλλαγή
των ιδιοτήτων του αντικειμένου
- Τα πεδία και οι μέθοδοι ενός συγκεκριμένου αντικειμένου ονομάζονται
πεδία και ιδιότητες της
υπόστασης (instance) του αντικειμένου.
Κλάσεις
Δημιουργία νέων αντικειμένων
- Κάθε αντικείμενο της κλάσης έχει ένα δικό του αντίγραφο των πεδίων
που έχουμε ορίσει.
- Σε αντίθεση με τους βασικούς τύπους της Java (int, boolean, double)
που ο ορισμός τους καθορίζει και την περιοχή της μνήμης που φυλάσσονται
τα αντίστοιχα στοιχεία, οι μεταβλητές που ορίζονται ως αντικείμενα περιέχουν
απλώς έναν δείκτη σε περιοχή της μνήμης που πιθανώς να περιέχει τα στοιχεία
για το συγκεκριμένο αντικείμενο.
- Αφού ορίσουμε μια μεταβλητή ως αντικείμενο, πρέπει να καθορίσουμε
και την περιοχή της μνήμης στην οποία θα φυλάσσονται τα πεδία του.
Καθορισμός μνήμης αντικειμένων με new
- Νέα περιοχή μνήμης οριζόμενη με τη σύνταξη
objectVariable = new ObjectType();
Παράδειγμα:
Point a, b;
a = new Point();
b = new Point();
Καθορισμός μνήμης αντικειμένων με αναφορά
- Αντιγράφοντας στο συγκεκριμένο αντικείμενο αναφορά
σε κάποιο άλλο το οποίο έχει ήδη οριστεί:
Παράδειγμα:
Point a, b;
a = new Point();
b = a;
Στην περίπτωση αυτή, τα δύο αντικείμενα μοιράζονται (share)
την ίδια περιοχή της μνήμης.
Κλήση μεθόδων
- Καλούμε τις μεθόδους ενός αντικειμένου με τη
σύνταξη αντικείμενο.μέθοδος(...)
- Παράδειγμα
import java.util.Date;
import java.util.GregorianCalendar;
class TestCal {
public static void main(String argv[]) {
GregorianCalendar then = new GregorianCalendar();
then.set(1973, 10, 17);
System.out.println(then.getTimeInMillis());
GregorianCalendar now = new GregorianCalendar();
Date d = new Date();
now.setTime(d);
System.out.println(now.getTimeInMillis());
}
}
Πρόσβαση σε ιδιότητες
- Αντίστοιχα έχουμε πρόσβαση στα πεδία ενός αντικειμένου με
τη σύνταξη αντικείμενο.πεδίο
- Η παραπάνω σύνταξη δε χρησιμοποιείται συχνά στη χρήση ξένων
κλάσεων μια και οι αντίστοιχες κλάσεις
ορίζουν ξεχωριστές μεθόδους για πρόσβαση στα πεδία υπόστασης των
αντικειμένων τους και απαγορεύουν την απευθείας πρόσβαση.
Ορατότητα
- Όταν χρησιμοποιούμε μεταβλητές μιας κλάσης μέσα
σε μια άλλη, τότε μπορούμε να χρησιμοποιήσουμε όλα τα πεδία και όλες
τις μεθόδους που έχουν οριστεί με
δημόσιο (public)
προσδιοριστή.
- Αντίθετα, δεν μπορούμε να χρησιμοποιήσουμε σε άλλες κλάσεις
πεδία και μεθόδους που έχουν οριστεί με
ιδιωτικό (private) ή
προστατευόμενο (protected)
προσδιοριστή.
Αυτές μπορούν να χρησιμοποιηθούν μόνο μέσα από μεθόδους της
κλάσης στην οποία ορίζονται.
- Στο παρακάτω παράδειγμα στην κλάση Point τα στοιχεία public είναι τα
x, y, και moveToCenter().
Αντίθετα τα μέλη (ιδιότητες) της κλάσης visible και serialNumber και η
μέθοδος setpos
δεν είναι ορατά και προσβάσιμα παρά μόνο από τις συναρτήσεις (μεθόδους)
της κλάσης.
Παράδειγμα: Point
class Point {
// Public fields
public int x, y;
private boolean visible;
private int serialNumber;
// Private method
private void setpos(int sx, int sy) {
x = sx;
y = sy;
}
// Public methd
public void moveToCenter() {
setpos(0, 0);
}
}
Παράδειγμα: TestPoint
class TestPoint {
public static void main(String args[])
{
Point a;
a = new Point();
a.moveToCenter();
// Use public field
a.x = 10;
}
}
Μέθοδοι κατασκευαστές
- Σε κάθε κλάση μπορούν να οριστούν
μέθοδοι κατασκευαστές (constructors) με όνομα ίδιο
με αυτό της κλάσης.
-
Η μέθοδος κατασκευής καλείται κάθε φορά που δημιουργείται
ένα νέο αντικείμενο (με τη χρήση new ObjectType).
-
Το όρισμα που δηλώνουμε στη μέθοδο κατασκευής επιτρέπει προσδιορισμό
ιδιοτήτων του αντικειμένου που δημιουργούμε (π.χ. τον αριθμό στοιχείων
σε έναν πίνακα) ή αρχικών τιμών.
- Για το ίδιο αντικείμενο μπορεί να έχουν οριστεί πολλές μεθόδοι κατασκευής
με διαφορετικά ορίσματα.
Κλήση κατασκευαστών
- Η κλήση της συνάρτησης κατασκευής μπορεί να γίνει κατά τον
ορισμό μιας μεταβλητής με τη μορφή "κλάση μεταβλητή = new κλάση(όρισμα)".
- Παράδειγμα
import java.util.GregorianCalendar;
class TestCal {
public static void main(String argv[]) {
GregorianCalendar then = new GregorianCalendar(1973, 10, 17);
System.out.println(then.getTimeInMillis());
}
}
Ιδιότητες και μέθοδοι κλάσης
- Σε μια κλάση μπορούν να δηλωθούν (με τον προσδιορισμό static)
(πεδία) τα οποία υπάρχουν μόνο μια φορά για όλη την κλάση.
- Επίσης μπορούν να δηλωθούν
αντίστοιχες μέθοδοι που μπορούν
να κληθούν με τη σύνταξη κλάση.συνάρτηση.
- Τα πεδία αυτά χρησιμοποιούνται για την επεξεργασία στοιχείων
που αφορούν ολόκληρη την κλάση και όχι τα αντικείμενά της.
Δήλωση μεταβλητών με var
- Τοπικές (και μόνο) αρχικοποιημένες μεταβλητές μπορούν να οριστούν με τη λέξη var
- Παράδειγμα:
var p = new Point();
var s = "hello";
- Ο τύπος της μεταβλητής καθορίζεται από τον τύπο της έκφρασης αρχικοποίησης.
- Για το λόγο αυτό απαιτείται η έκφραση αρχικοποίησης και αυτή δεν μπορεί να είναι null.
- Με var δεν μπορούν να οριστούν παράμετροι, πεδία, ή ο τύπος επιστροφής μιας μεθόδου.
Παράδειγμα: εύρεση ημέρας
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
class FindDay {
/** Return the name of the given numeric week day */
public static String weekDayName(int weekNumber) {
return switch (weekNumber) {
case Calendar.MONDAY -> "Δευτέρα";
case Calendar.TUESDAY -> "Τρίτη";
case Calendar.WEDNESDAY -> "Τετάρτη";
case Calendar.THURSDAY -> "Πέμπτη";
case Calendar.FRIDAY -> "Παρασκευή";
case Calendar.SATURDAY -> "Σάββατο";
case Calendar.SUNDAY -> "Κυριακή";
default -> throw new IllegalStateException("Unexpected value: " + weekNumber);
};
}
public static void main(String args[]) throws Exception {
// ...
}
Παράδειγμα: εύρεση ημέρας (main)
public static void main(String[] args) throws Exception {
// Are appropriate arguments given?
if (args.length != 3) {
System.err.println("usage: FindDay year month day");
System.exit(1);
}
// Parse year, month, day
int year = Integer.parseInt(args[0]);
int month = Integer.parseInt(args[1]) - 1;
int monthDay = Integer.parseInt(args[2]);
// Set the calendar and calculate the day name
var d = new GregorianCalendar(year, month, monthDay);
String dn = weekDayName(d.get(Calendar.DAY_OF_WEEK));
// Print the day name
System.out.println(dn);
}
Μέθοδοι όλων των αντικειμένων
- Όλες οι κλάσεις της Java υποστηρίζουν αντικείμενα με τις
παρακάτω μεθόδους:
- Object clone()
- Επιστρέφει ένα αντίγραφο του αντικειμένου
- String toString()
- Επιστρέφει μια συμβολοσειρά που παριστάνει το αντικείμενο
- boolean equals(Object obj)
- Επιστρέφει true αν το αντικείμενο είναι "ίσο" με το obj
Άσκηση: δημιουργία αντικειμένων και πρόσβαση στις μεθόδους τους
Άσκηση 3
Μπορείτε να κατεβάσετε το αντίστοιχο αρχείο και να στείλετε τους
βαθμούς σας από τους δεσμούς που βρίσκονται στη
σελίδα των ασκήσεων.
Βιβλιογραφία
- Rogers CadenheadΠλήρες εγχειρίδιο της Java 12Όγδοη έκδοση. Εκδόσεις Μ. Γκιούρδας, Αθήνα 2023. Κεφ. 3.
- Joyce Farrell. Java: Εκμάθηση με πρακτικά παραδείγματα. 2η έκδοση. Εκδόσεις Κριτική, Αθήνα 2024. Κεφ. 1-4.
- Herbert Schildt. Οδηγός της Java 7. 5η έκδοση. Εκδόσεις Γκιούρδας Μ., Αθήνα 2012. Κεφ. 4, 6.
- Harvey M. Deitel και Paul J. Deitel. Java Προγραμματισμός, 6η έκδοση. Εκδόσεις Μ. Γκιούρδας, Αθήνα 2005. Κεφάλαιο 3.
- Else Lervik και Vegard B. Havdal Java με UML. Εκδόσεις Κλειδάριθμος 2005. Κεφάλαιο 3.
- Γιάννη Κάβουρα. Προγραμματισμός με Java. Εκδόσεις Κλειθάριθμος, Αθήνα 2003. Κεφάλαιο 9.
- Rogers Cadenhead και Laura Lemay Πλήρες εγχειρίδιο της Java 2 Εκδόσεις Μ. Γκιούρδας, Αθήνα 2003. Κεφάλαιο 3.
Περιεχόμενα