Нет, вы не можете переопределить статический метод. Статика разрешается против класса, а не экземпляра.
public class Parent {
public static String getCName() {
return "I am the parent";
}
}
public class Child extends Parent {
public static String getCName() {
return "I am the child";
}
}
У каждого класса есть статический метод getCName (). Когда вы вызываете имя класса, оно ведет себя так, как вы ожидаете, и каждый возвращает ожидаемое значение.
@Test
public void testGetCNameOnClass() {
assertThat(Parent.getCName(), is("I am the parent"));
assertThat(Child.getCName(), is("I am the child"));
}
Никаких сюрпризов в этом модульном тесте. Но это не переопределение. Это объявление чего-то, имеющего конфликт имен.
Если мы попытаемся достичь статики из экземпляра класса (не очень хорошая практика), то это действительно показывает:
private Parent cp = new Child();
`enter code here`
assertThat(cp.getCName(), is("I am the parent"));
Несмотря на то, что cp является дочерним, статическое значение разрешается через объявленный тип Parent вместо фактического типа объекта. Для нестатики это разрешается правильно, потому что нестатический метод может переопределить метод своего родителя.