Ορισμός κλάσεων
- Η δήλωση μιας κλάσης
τυπικά αποτελείται από τον προσδιοριστή public,
το όνομά της και ορισμό των μελών της
μέσα σε αγκύλες.
και τις μεθόδους.
public class Point {
/* Fields are defined here */
}
- Ο προδιοριστής public κάνει την κλάση μας ορατή σε κλάσεις που
έχουν οριστεί σε διαφορετικά αρχεία
- Το όνομα του αρχείου της κλάσης πρέπει να ταυτίζεται με το όνομα της
κλάσης
- Στη Java προτρέπουμε το όνομα της κλάσης να αρχίζει με κεφαλαίο γράμμα
Ορισμός πεδίων υπόστασης
- Τα πεδία υπόστασης ορίζονται σαν να ήταν μεταβλητές,
μέσα στο σώμα της κλάσης.
class Point {
/* Fields */
/** Point x coordinate */
private int x;
/** Point y coordinate */
private int y;
}
- Καλό είναι τα πεδία να ορίζονται με τον προσδιοριστή
private έτσι ώστε να μην είναι ορατά σε άλλες κλάσεις.
- Στη Java προτρέπουμε τα ονόματα των πεδίων να αρχίζουν με πεζό γράμμα
Ορισμός μεθόδων υπόστασης
- Οι μέθοδοι υπόστασης ορίζονται ως συναρτήσεις
μέσα στο σώμα της κλάσης (χωρίς προσδιοριστή static).
class Point {
/* Fields */
/** Point x coordinate */
private int x;
/** Point y coordinate */
private int y;
/* Methods */
/** Return the x coordinate */
public int getX() { return x; }
/** Return the y coordinate */
public int getY() { return y; }
/** Set the point position to the specified coordinates */
public void setPosition(int sx, int sy) {
x = sx;
y = sy;
}
/** Return string representation */
@Override public String toString() {
return "x=" + Integer.valueOf(x).toString() +
" y=" + Integer.valueOf(y).toString();
}
}
- Στη Java προτρέπουμε τα ονόματα των μεθόδων να αρχίζουν με πεζό γράμμα
Πρόσβαση στα μέλη της κλάσης
- Μέσα στο σώμα των μεθόδων υπόστασης της κλάσης έχουμε άμεση πρόσβαση
σε όλες τις μεθόδους και τα πεδία με απλή χρήση του ονόματός τους
- Όταν αναφερόμαστε σε μια μέθοδο ή πεδίο εξυπακούεται πως αναφερόμαστε
στο αντικείμενο για το οποίο κλήθηκε η δική μας μέθοδος
- Στο αντικείμενο αυτό μπορούμε να αναφερθούμε και με το όνομα
this
.
- Από μεθόδους κλάσης (static) δε μπορούμε να έχουμε άμεση
πρόσβαση σε μεθόδους
και πεδία υπόστασης μια και οι μέθοδοι κλάσης δεν καλούνται για ένα
συγκεκριμένο αντικείμενο.
Πρόσβαση στα μέλη της κλάσης: παράδειγμα
- Έτσι οι ο ορισμός
class Point {
/** Set the point position to the specified coordinates */
public void setPosition(int sx, int sy) {
x = sx;
y = sy;
}
}
είναι ίδιος με τον ορισμό
class Point {
/** Set the point position to the specified coordinates */
public void setPosition(int x, int y) {
this.x = x;
this.y = y;
}
}
Μέθοδοι κατασκευής
- Σε κάθε κλάση μπορούν να οριστούν
μέθοδοι κατασκευής με όνομα ίδιο
με αυτό της κλάσης.
-
Η μέθοδος κατασκευής καλείται κάθε φορά που δημιουργείται
ένα νέο αντικείμενο (με τη χρήση new ObjectType).
-
Το όρισμα που δηλώνουμε στη μέθοδο κατασκευής επιτρέπει προσδιορισμό
ιδιοτήτων του αντικειμένου που δημιουργούμε (π.χ. τον αριθμό στοιχείων
σε έναν πίνακα) ή αρχικών τιμών.
- Για το ίδιο αντικείμενο μπορούμε να ορίσουμε πολλές μεθόδους κατασκευής
με διαφορετικά ορίσματα.
- Η μέθοδος κατασκευής δε χρειάζεται κάποιον
προσδιοριστή (static, public, void) στον ορισμό της.
- Ρόλος της μεθόδου κατασκευής είναι συνήθως να δίνει αρχικές τιμές
στα πεδία της κλάσης και να αποκτά πρόσβαση σε εξωτερικούς πόρους που
απαιτούνται για τη λειτουργία της.
Μέθοδοι κατασκευής: παράδειγμα
class Point {
/* Fields */
/** Point x coordinate */
private int x;
/** Point y coordinate */
private int y;
/* Methods */
/** Default constructor */
Point() { x = y = 0; }
/** Constructor with coordinates */
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
Έλεγχος πρόσβασης
Κάθε μέθοδος ή πεδίο μπορεί να έχει ως προσδιοριστή
- public
- Το μέλος είναι ορατό σε όλες τις άλλες κλάσεις
- private
- Το μέλος είναι ορατό μόνο στις μεθόδους της δικής μας κλάσης
- (τίποτα)
- Το μέλος είναι ορατό στις κλάσεις του πακέτου μας
Μια καλοσχεδιασμένη κλάση έχει:
- Όλα τα μέλη υπόστασης ορισμένα ώς private.
- Όλες τις μεθόδους που δεν έχουν σχεδιαστεί για χρήση έξω από
την κλάση ορισμένες ως private.
Ορισμός ιδιοτήτων και μεθόδων κλάσης
-
Σε μια κλάση μπορούν να δηλωθούν (με τον προσδιορισμό static)
πεδία τα οποία υπάρχουν μόνο μια φορά για όλη την κλάση,
καθώς και αντίστοιχες μέθοδοι.
-
Τα μέλη αυτά χρησιμοποιούνται για την επεξεργασία στοιχείων
που αφορούν ολόκληρη την κλάση και όχι τα αντικείμενά της.
-
Οι συναρτήσεις που έχουν οριστεί static δεν έχουν πρόσβαση σε μη
static μεταβλητές ούτε στη μεταβλητή this.
Παράδειγμα ιδιοτήτων και μεθόδων κλάσης
-
Το παρακάτω παράδειγμα ορίζει έναν μετρητή numPoints που μετρά πόσα
σημεία είναι ενεργά καθώς και την αντίστοιχη συνάρτηση πρόσβασης getNumPoints:
class Point {
private int x, y;
/** Count number of points used */
private static int numPoints = 0;
/** Point constructor */
Point(int ix, int iy) {
x = ix;
y = iy;
numPoints++; // Adjust points counter
}
/** Point constructor */
Point() {
x = y = 0;
numPoints++; // Adjust points counter
}
// Return number of points currently used
public static int getNumPoints() {
return numPoints;
}
static public void main(String args[]) {
Point a = new Point(1, 2);
Point b = new Point(5, 8);
Point c = b;
System.out.println(getNumPoints() + " points have been created");
}
}
Δήλωση μεταβλητών με var
- Τοπικές (και μόνο) αρχικοποιημένες μεταβλητές μπορούν να οριστούν με τη λέξη var
- Παράδειγμα:
var p = new Point();
var s = "hello";
- Ο τύπος της μεταβλητής καθορίζεται από τον τύπο της έκφρασης αρχικοποίησης.
- Για το λόγο αυτό απαιτείται η έκφραση αρχικοποίησης και αυτή δεν μπορεί να είναι null.
- Με var δεν μπορούν να οριστούν παράμετροι, πεδία, ή ο τύπος επιστροφής μιας μεθόδου.
Μπλοκ αρχικοποίησης
Σε ανώνυμα μπλοκ
{ }
στο σώμα της κλάσης μπορεί να τοποθετηθεί:
- κώδικας που αρχικοποιεί όλη την κλάση (με τον προσδιοριστή static),
- κώδικας που αρχικοποιεί κάθε αντικείμενο (χωρίς προσδιοριστή).
- Τα μπλοκ αρχικοποίησης αντικειμένων καλούνται πριν τους κατασκευαστές.
Εσωτερικές κλάσεις
Μια κλάση μπορεί να οριστεί εσωτερικά:
- στο σώμα μιας κλάσης, με προσδιοριστή:
- public ώστε να είναι ορατή έξω από αυτή
- private ώστε να μην είναι ορατή έξω από αυτή
- static όταν δεν απαιτεί πρόσβαση στα πεδία υπόστασης
- μέσα στο σώμα μιας μεθόδου
- ανώνυμα, ως επέκταση του κατασκευαστή μιας υπάρχουσας κλάσης ή διεπαφής
Παράδειγμα εσωτερικής κλάσης
class Rectangle {
private static class Point {
private int x, y;
/** Point constructor */
Point(int ix, int iy) {
x = ix;
y = iy;
}
}
private Point topLeft, bottomRight;
/** Rectangle constructor */
Rectangle(int x, int y, int height, int width) {
topLeft = new Point(x, y);
bottomRight = new Point(x + width, y + height);
}
}
Παράδειγμα ανώνυμης κλάσης
class InnerCall {
public static void main(String args[]) {
System.out.println(new Object());
System.out.println(new Object() {
@Override
public String toString() {
return "I am a woke object";
}
});
}
}
Απαριθμήσεις
- Η απαρίθμηση (enumeration) είναι ένας
ειδικός τύπος κλάσης που ορίζει με συμβολικό τρόπο σταθερές
τιμές.
- Οι τιμές ορίζονται (ως στατικά μέλη της κλάσης) χωρισμένες με κόμμα.
Παράδειγμα
enum Ingredients {
TOMATO,
ONION,
TZATZIKI,
POTATO,
MUSTARD,
SOUVLAKI,
GYROS
};
Χρήση απαριθμήσεων
- Κάθε στοιχείο της απαρίθμησης μπορεί να χρησιμοποιηθεί σαν
να είχε οριστεί ως
public final
μέλος της κλάσης.
- Οι τιμές μπορούν να χρησιμοποιηθούν ως τιμή σε
case
,
π.χ. case Ingredients.POTATO:
.
- Η μέθοδος
int ordinal()
επιστρέφει τη θέση ενός στοιχείου στην απαρίθμηση.
- Η μέθοδος
String name()
επιστρέφει το όνομα ενός στοιχείου.
- Η στατική μέθοδος
valueOf
επιστρέφει την τιμή της απαρίθμησης με βάση συμβολοσειρά με το όνομά της, π.χ. Enum.valueOf(Ingredients.class, "TOMATO")
.
- Η στατική μέθοδος
values
επιστρέφει έναν πίνακα με τις τιμές μιας απαρίθμησης.
Το σχεδιαστικό πρότυπο singleton
- Πολλές κλάσεις αντιπροσωπεύουν αντικείμενα από τα οποία μπορεί να υπάρξει μόνο ένα.
- Μερικοί παριστάνουν τέτοιες κλάσεις με τη χρήση μελών κλάσης (static).
- Η λύση αυτή είναι άκομψη και δεν επιτρέπει την εύκολη αλλαγή του σχεδίου αν τελικά χρειαστούν παραπάνω αντικείμενα της κλάσης.
- Το σχεδιαστικό πρότυπο (design pattern)
singleton επιτρέπει τον ελεγχόμενο ορισμό ενός μοναδικού αντικειμένου
μιας κλάσης.
Παράδειγμα singleton
-
public class Accounts {
/** Single instance of a company's accounts. */
private static final Accounts instance = new Accounts();
/** Return the single instance of the company's accounts. */
public static Accounts getInstance() {
return instance;
}
/** Supress public default constructor to assure non-instantiation */
private final Accounts() {
// Never invoked from outside the class
}
}
- Πρόσβαση στο μοναδικό αντικείμενο Accounts έχουμε μόνο με τη μέθοδο getInstance()
Άσκηση: δημιουργία μιας κλάσης
Άσκηση 4
Μπορείτε να κατεβάσετε το αντίστοιχο αρχείο και να στείλετε τους
βαθμούς σας από τους δεσμούς που βρίσκονται στη
σελίδα των ασκήσεων.
Βιβλιογραφία
- Rogers Candenhead. Πλήρες Εγχειρίδιο της Java 12. 8η Έκδοση.
Εκδόσεις X. Γκιούρδα, 2023.
Κεφ. 3.
- Herbert Schildt. Οδηγός της Java 7. 5η έκδοση. Εκδόσεις Γκιούρδας Μ., Αθήνα 2012. Κεφ. 1, 2, 3.
- Harvey M. Deitel και Paul J. Deitel. Java Προγραμματισμός, 6η έκδοση. Εκδόσεις Μ. Γκιούρδας, Αθήνα 2005. Κεφάλαια 5,8
- Else Lervik και Vegard B. Havdal Java με UML. Εκδόσεις Κλειδάριθμος 2005. Κεφάλαιο 4.
- Rogers Cadenhead και Laura Lemay Πλήρες εγχειρίδιο της Java 2 Εκδόσεις Μ. Γκιούρδας, Αθήνα 2003. Κεφάλαιο 5.
- Γιάννη Κάβουρα. Προγραμματισμός με Java. Εκδόσεις Κλειθάριθμος, Αθήνα 2003. Κεφάλαιο 9, 12.
- Rogers Cadenhead και Laura Lemay Πλήρες εγχειρίδιο της Java 2 Εκδόσεις Μ. Γκιούρδας, Αθήνα 2003. Κεφάλαιο 5.
- Joshua Bloch.
Effective
Java, pages 10–12.
Addison-Wesley, Reading, MA, 2001.
- Erich Gamma, Richard
Helm, Ralph Johnson, and John Vlissides.
Design
Patterns: Elements of Reusable Object-Oriented Software, pages
127–134.
Addison-Wesley, Reading, MA, 1995.
Περιεχόμενα