Polimorfizm ze zmiennymi instancji [duplikat]
To pytanie ma już tutaj odpowiedź:
Zastępowanie zmiennych członkowskich w Javie 10 odpowiedziOto trzy klasy, które napisałem:
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ściem 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? Podobnie jak bieżąca instancja zmiennej Rectangle i ta klasa nie ma również tej samej zmiennej instancji zadeklarowanej, czy też zmienna w klasie Rectangle nie przesłania poprzedniej publicznej zmiennej x klasy Shape, jak ma to miejsce w przypadku getX () metoda w klasie prostokąta, zwracając 1?
Ponadto ogólnie nadklasa ma dostęp do implementacji metod podklas tylko wtedy, gdy są zadeklarowane również w tej klasie? Czy to dlatego, że kompilator zobaczy, że ta sama liczba metod o tej samej sygnaturze znajduje się w klasie „Shape” (z nadpisanymi implementacjami Rectangle) i akceptuje te jako prawidłowe metody Shape?
Z góry dziękuję,