Oto trzy klasy, które napisałem:Polimorfizm ze zmiennych instancji
public class Shape {
public int x = 0;
public void getArea() {
System.out.println("I don't know my area!");
}
public String toString() {
return "I am a shape!";
}
public int getX() {
return x;
}
}
public class Rectangle extends Shape {
public int x = 1;
public int getX() {
return x;
}
public void getArea() {
System.out.println("L*W");
}
public String toString() {
return "I am a rectangle!";
}
}
public class Tester {
public static void main(String[] args) {
Shape s = new Shape();
Rectangle r = new Rectangle();
System.out.println(r);
System.out.println(r.x + "\n");
s = r;
System.out.println(s);
s.getArea();
System.out.println(s.x);
System.out.println(s.getX());
}
}
Wyjście z głównej metody klasy Tester jest:
I am a rectangle! 1 I am a rectangle! L*W 0 1
Dlaczego s.x zwraca 0, a nie 1? Ponieważ nie jest bieżącą instancją zmiennej Rectangle i ta klasa ma zadeklarowaną tę samą instancję zmiennej, czy też zmienna w klasie Rectangle nie przesłania poprzedniej zmiennej publicznej x w klasie Shape tak jak robi to w getX() metoda w klasie prostokąta, zwracając 1?
Co więcej, nadrzędna klasa ma również dostęp do implementacji metod jej podklas tylko wtedy, gdy są one zadeklarowane również w tej klasie? Czy to dlatego, że kompilator zobaczy, że ta sama ilość metod z tym samym sygnaturą znajduje się w klasie "Shape" (z przesłoniętymi implementacjami Rectangle) i akceptuje je jako prawidłowe metody Shape?
Dzięki z góry,
Dlaczego to instancja zmiennej publicznej !!? Nigdy nie powinieneś nigdy udostępniać publicznie zmiennej instancji !!! – DrinkJavaCodeJava
To był test, aby zobaczyć, co się stanie. Doskonale zdaję sobie sprawę z enkapsulacji, jak robiłem wcześniej projekt MVC. – PragmaticProgrammer