Переопределение статического метода в дочернем классе
Я хотел бы знать причину, по которой это впервые разрешено в Java (или oops вообще) Я помню, что статические методы являются общими как для родительского, так и для дочернего класса
public class Redefine extends Parent{
public static void test () {
}
}
class Parent{
public static void test () {
}
}
Q1: поскольку переопределение не поддерживается для статических методов, как оба класса могут содержать одинаковые методы ?
Q2: Если изменить метод в статике, чтобы бросить исключение, не определенное, его не компилируют. почему так происходит. Его явно не перекрывают, так что мне следует позволить бросать новые исключения правильно ?
public class Redefine extends Parent{
public static void test () throws Exception{
}
}
3 ответа:
А1::
static
метод относится к каждому классу. Они не имеют ничего общего с иерархией наследования в терминах полиморфизма. Таким образом, вызовParent.test()
вызовет родительский метод, а вызовRedefine.test()
вызовет дочерний.А2: JLS 8.4.8 пишет:
Если класс объявляется статическим методом м, то объявление м, как говорят, скрывает любого метода м', где подпись м. подподписью (§8.4.2) подписи м, в суперклассах и суперинтерфейсы класса, которые в противном случае были бы доступны для кода в классе.
Объявление метода не должно иметь предложения throws, которое конфликтует (§8.4.6) с предложением любого метода, который оно переопределяет или скрывает; в противном случае возникает ошибка компиляции.
Вы не переопределяете его, вы скрываете его
Http://faq.javaranch.com/java/OverridingVsHiding
Какое исключение вы получаете?