Polimorfizm ze zmiennymi instancji [duplikat]

To pytanie ma już tutaj odpowiedź:

Zastępowanie zmiennych członkowskich w Javie 10 odpowiedzi

Oto 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ę,

questionAnswers(2)

yourAnswerToTheQuestion