java:hiding_static_methods

Καλώντας στατικές μεθόδους από την γονική κλάση και την υποκλάση

Ας δοκιμάσουμε το παρακάτω παράδειγμα κληρονομικότητας δύο κλάσεων που περιέχουν δύο στατικές μεθόδους με το ίδιο signature.

Animal.java
public class Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Animal");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Animal");
    }
}
Cat.java
public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Cat");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Cat");
    }
}
TestCat.java
public class TestCat {
    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimalCat = myCat;
        Animal myAnimal = new Animal();
 
        Animal.testClassMethod();
        Cat.testClassMethod();
 
        System.out.println("");
 
        myAnimalCat.testClassMethod();
        myAnimal.testClassMethod();
        myCat.testClassMethod();
 
        System.out.println("");
 
        myAnimalCat.testInstanceMethod();
        myAnimal.testInstanceMethod();
        myCat.testInstanceMethod();        
    }
}

Η έξοδος του παραπάνω προγράμματος είναι

The static method in Animal
The static method in Cat

The static method in Animal
The static method in Animal
The static method in Cat

The instance method in Cat
The instance method in Animal
The instance method in Cat

Παρατηρούμε ότι ο τύπος των δεδομένων από τον οποίο καλούμε μία στατική μέθοδο είναι καθοριστικός για το ποια μέθοδος θα κλήθεί τελικά. Για παράδειγμα, η μεταβλητή myAnimal ορίζεται ως τύπου Animal αλλά δείχνει σε ένα αντικείμενο τύπου Cat. Η στατική μέθοδος που τελικά καλείται είναι εκείνη που ορίζεται από τον τύπο της reference μεταβλητής (Animal ή Cat) και όχι από το ίδιο το αντικείμενο στο οποίο δείχνει αυτή, όπως ίσως θα περίμενε ίσως κανείς να ισχύει με βάση τον δυναμικό πολυμορφισμό της προηγούμενης παραγράφου.

Οι 3 τελευταίες γραμμές του προγράμματος αναφέρονται σε δυναμικό πολυμορφισμό για να δείξουν την αντίθεση των αποτελεσμάτων στην κλήση στατικών και μη στατικών μεθόδων.

java/hiding_static_methods.txt · Last modified: 2016/03/31 08:46 by doufexi