Переопределение статического метода в дочернем классе


Я хотел бы знать причину, по которой это впервые разрешено в 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 6

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

Какое исключение вы получаете?

Q1: статические методы не переопределяются, поэтому это два разных метода с одной и той же сигнатурой. Один называется с родителем.test (), другой вызывается с переопределением.test ()

Q2: ваш метод кажется допустимым. Какую ошибку вы получаете?