Полиморфизм с переменными экземпляра [дубликат]

На этот вопрос уже есть ответ здесь:

Переопределение переменных-членов в Java 10 ответов

Вот три класса, которые я написал:

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());
    }
}

Выходные данные из основного метода класса Tester:

I am a rectangle!

1

I am a rectangle!

L*W

0

1

Почему s.x возвращает 0, а не 1? Как нетt текущий экземпляр переменной a Rectangle, и у этого класса также объявлена та же самая переменная экземпляра, или переменная в классе Rectangle не переопределяет предыдущую общедоступную переменную x в классе Shape, как это происходит с методом getX () в класс прямоугольника, таким образом, возвращающий 1?

Также, как общее правило, суперкласс имеет доступ к реализации методов своих подклассов, только если они также объявлены в этом классе? Это потому, что компилятор увидит, что одинаковое количество методов с одинаковой сигнатурой находится вФорма» класс (с переопределенными реализациями Rectangle) и принять их как допустимые методы Shape?

Заранее спасибо,

Ответы на вопрос(2)

Ваш ответ на вопрос