Если вы хотите, чтобы классы B и C имели отдельные статические переменные, вам нужно объявить переменные в этих классах. По сути, статические члены и полиморфизм не сочетаются друг с другом.
Обратите внимание, что доступ к статическим элементам через ссылки - это действительно плохая идея с точки зрения читабельности - это заставляет его выглядеть как будто это зависит от значения ссылки, когда она не правда. Таким образом, ваш текущий код даже не скомпилируется, когда вы переместили str
вниз на B и C. Вместо этого вам понадобится
System.out.println("b.str = " + B.str);
System.out.println("c.str = " + C.str);
Если вам действительно нужен полиморфный доступ к значению (т. Е. Через экземпляр A), тогда одним из вариантов является создание полиморфного геттера:
public class A {
public abstract String getStr();
}
public class B extends A {
private static String str = "b";
@Override public String getStr() {
return str;
}
}
(и то же самое для C).
Таким образом, вы получаете желаемое поведение с точки зрения отсутствия отдельной переменной на экземпляр, но вы все равно можете использовать ее полиморфно. Для члена экземпляра немного странно возвращать статическое значение, подобное этому, но вы используете значение для полиморфизма типа, в основном ...