2015-04-26 5 views
2

Я читал во многих местах, что статический метод нельзя переопределить. Тем не менее, я написал образец запроса для тестирования, казалось, мой статический метод был переопределен.Java - статический метод override

Ниже мой запрос:

public class staticTestDriver{ 

    public static void main(String[] args){ 
     subClass.print(); //seems the print() method has been overridden 
    } 
} 

class superClass { 
    static void print(){ 
     System.out.println("this is static"); 
    } 
} 

class subClass extends superClass{ 
    static void print(){ 
     System.out.println("This is overridden"); 
    } 
} 

Выход "это отменяется". Есть идеи?

+1

Вы должны прочитать это http://stackoverflow.com/questions/2223386/why-doesnt-java-allow-overriding-of-static-methods – xsami

+3

Это не главное. Это просто затенение. – SLaks

+3

Это не переопределение, это [скрытие] (https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.8.2). – RealSkeptic

ответ

0

Поскольку статические методы вызывают, указав имя класса явно, любая попытка полиморфизма является недействительной.

Иными словами. Это правда, что вы можете теневать/скрывать/заменять статические методы в подклассе, но поскольку вы никогда не ссылаетесь на статические методы на любом экземпляре, единственная цель - исключить что-либо. Вы уже знаете, во время компиляции, какой класс вы вызываете.

Таким образом, хотя ваш код действителен java, он не выполняет определение переопределенного метода.

+0

Java позволяет вам вызывать статические методы, используя ссылку на экземпляр. Иначе всего «скрывающего» определения не будет. – RealSkeptic

+0

Да, вы правы. Но какой метод для вызова основан на объявленном типе переменной, а не на фактическом типе экземпляра. Но ты прав, потому что это пугает меня. – JHH

0

Спасибо всем. Я нашел статью, которая дает очень хорошее объяснение этой ситуации. Пожалуйста, проверьте the answer here

Кроме того, я согласен с вами в том, что это неприменимо для переопределения. Потому что «переопределение зависит от наличия экземпляра класса». (Ссылка here)

Так что, если я делаю код, упомянутый Роберт Bain

superClass myClass = new subClass(); myClass.print(); 

Вывод будет «это статический», то есть не переопределение произошло.

Смежные вопросы