Полиморфизм с переменными экземпляра [дубликат]
На этот вопрос уже есть ответ здесь:
Переопределение переменных-членов в 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?
Заранее спасибо,