Переопределение статического метода в дочернем классе - PullRequest
6 голосов
/ 15 июля 2010

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

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

    }
}


class Parent{
    public static void test () {

    }
}

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

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

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

    }
}

Ответы [ 3 ]

10 голосов
/ 15 июля 2010

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

A2: JLS 8.4.8 пишет:

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

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

4 голосов
/ 15 июля 2010

вы не переопределяете его, вы прячете это

http://faq.javaranch.com/java/OverridingVsHiding

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

0 голосов
/ 15 июля 2010

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

Q2: Ваш метод выглядит корректным.Какую ошибку вы получаете?

...