- Η ιεραρχία των κλάσεων εκφράζεται στην Java με τον ορισμό μιας κλάσης που
είναι υποκλάση (subclass) μιας άλλης κλάσης (που
ονομάζεται βασική κλάση (base class)).
- Η σύνταξη για τον ορισμό αυτό είναι της μορφής:
class υποκλάση extends βασική_κλάση {
// ...
- Κάθε υποκλάση κληρονομεί (inherits) τις μεθόδους
και τις ιδιότητες που έχουν οριστεί ως public στη βασική κλάση.
- Η υποκλάση δεν έχει πρόσβαση στις μεθόδους και τις ιδιότητες
που έχουν οριστεί ως private στη βασική κλάση.
- Η υποκλάση μπορεί να ορίσει νέες ιδιότητες και μεθόδους και να
υπερσκελίσει (override)
ιδιότητες και μεθόδους που έχει ορίσει η βασική κλάση.
- Έτσι, οι περισσότερες κλάσεις αντικαθιστούν τη μέθοδο toString()
που επιστρέφει μια συμβολοσειρά που αντιστοιχεί στο περιεχόμενο ενός
αντικειμένου και παρέχεται από την Java για όλα τα αντικείμενα με μια πιο
εξειδικευμένη μέθοδο.
- Μέσα από την κλάση μπορούμε να αναφερθούμε στη βασική κλάση
με τον προσδιορισμό super.
- Παράδειγμα:
import gr.aueb.dds.BIO;
class Shape {
private int x, y; // Position
public void setPosition(int px, int py) {
x = px;
y = py;
}
public String toString() {
return "Shape(" + x + ", " + y + ")";
}
}
class Circle extends Shape {
private int radius;
public void setRadius(int r) {
radius = r;
}
public String toString() {
return super.toString() + ": Circle(" + radius + ")";
}
}
class Rectangle extends Shape {
private int height, width;
public void setDimensions(int h, int w) {
height = h;
width = w;
}
public String toString() {
return super.toString() + ": Rectangle(" + height + " x " + width + ")";
}
}
class Test {
static public void main(String args[])
{
Circle c = new Circle();
Rectangle r = new Rectangle();
r.setPosition(1, 2);
r.setDimensions(50, 50);
c.setPosition(3, 4);
c.setRadius(10);
BIO.println(r);
BIO.println(c);
}
}
- Η παραπάνω διάταξη μπορεί να παρασταθεί σχηματικά ως εξής:
- Μπορούμε να ορίσουμε μια άλλη κατηγορία μεθόδων και ιδιοτήτων
με τον προσδιορισμό protected.
Αυτές είναι προσβάσιμες από τις υποκλάσεις της
κλάσης μας, αλλά όχι από άλλες συναρτήσεις.
Παράδειγμα:
class Shape {
private int x, y; // Position
protected int getX() { return x; }
protected int getY() { return y; }
public void setPosition(int px, int py) {
x = px;
y = py;
}
public String toString() {
return "Shape(" + x + ", " + y + ")";
}
}
- Μια αναφορά (αντικείμενο) σε μια υποκλάση μπορεί αυτόματα να μετατραπεί σε
αναφορά (αντικείμενο) της βασικής της κλάσης.
Αυτό επιτρέπεται διότι κάθε αντικείμενο μιας υποκλάσης
είναι (is a) και αντικείμενο της βασικής κλάσης.
Το αντικείμενο συνεχίζει να διατηρεί τις ιδιότητες της υποκλάσης
μετά τη μετατροπή και μπορεί να μετατραπεί πίσω στην ίδια υποκλάση
με τη χρήση ρητού τελεστή μετατροπής (cast).
Παράδειγμα:
static public void main(String args[])
{
Rectangle r = new Rectangle();
Shape s;
r.setposition(1, 2);
r.setdimensions(50, 50);
s = r;
s.setposition(10, 20);
BIO.println(r);
BIO.println(s);
r = (Rectangle)s;
}