Учась на 6 экзамен SCJP, я натолкнулся на этот вопрос в тест-экзамен:Java унаследовал метод вопрос
class A{
private static String staticProperty = " a ";
String getStaticProperty() { return staticProperty; }
}
class B extends A {
private static String staticProperty = " b ";
public static void main(String[] args){
new B().go(new A());
}
void go(A t){
String s = t.getStaticProperty() + B.staticProperty + staticProperty + (new B().getStaticProperty());
System.out.println(s);
}
}
Что выход ??
Выход здесь a b b a
Я прекрасно понимаю a b b
, но не понимают «а» в конце. Если вы наследуете метод (в этом случае B наследует getStaticProperty() от A), и этот метод возвращает статическую переменную из родительского (staticProperty), которую вы переопределяете в дочернем элементе, вы ВСЕГДА используете родительскую статическую переменную стоимость??
Кстати, удаление статического идентификатора и создание staticField экземпляра классов возвращает те же результаты. Изменение модификаторов доступа от частного к публичному или другому возвращает те же результаты. Мне нужно было переопределить метод getStaticProperty, чтобы получить то, что я хотел видеть.
Итак, даже если B наследует метод getStaticProperty() от A (и, следовательно, если бы было так, как если бы B объявлял его сам), этот унаследованный метод все еще ссылается на свойство из суперкласса? Я вижу конфликт с именем участника. Возможно, если staticProperty в B имеет другое имя, все будет легче увидеть. – Dan