2010-07-15 1 views
6

Я хотел бы знать причину, почему это первое разрешено в Java (или упс вообще) я помню, что статические методы являются общими для обоих родителей и ребенка классаПереосмысление статический метод в дочернем классе

public class Redefine extends Parent{ 
    public static void test() { 

    } 
} 


class Parent{ 
    public static void test() { 

    } 
} 

Q1: Поскольку Overriding не поддерживается для статических методов, как обе эти оболочки могут содержать одинаковые методы?

Q2: Если изменить метод в static, чтобы исключить исключение, его не компилировать. Почему так. Очевидно, что он не переопределяет, поэтому мне должно быть позволено делать новые исключения?

public class Redefine extends Parent{ 
    public static void test() throws Exception{ 

    } 
} 

ответ

10

A1:: static Метод указаны на классе. Они не имеют ничего общего с иерархиями наследования с точки зрения полиморфизма. Поэтому вызов Parent.test() вызовет родительский метод, а вызов Redefine.test() вызовет дочерний элемент.

A2:JLS 8.4.8 пишет:

Если класс объявляет статический метод м, то объявление м называется скрыть любой метод т», где подпись т является подсигнатурой (§8.4 .2) сигнатуры m ', в суперклассах и суперинтерфейсах класса, которые в противном случае были бы доступны для кода в классе.

Объявление метода не должно иметь предложение throws, которое конфликтует (§8.4.6) с любым способом, который он переопределяет или скрывает; в противном случае возникает ошибка времени компиляции.

0

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

Q2: Ваш метод кажется действительным. Какая у вас ошибка?

+1

re: Q2: Если вы попробуете OP-версию Redefine.test(), которая объявлена ​​как 'throws Exception', тогда вы должны получить ошибку компилятора' Exception Exception 'несовместимо с предложением throws в Parent.test() ' , – mikej