2013-06-17 2 views
3

В чем разница между переопределение и затенения, в частности, к этому утверждению «Статический метод не может быть переопределен в подклассе, только слежка»Override против Shadowing в Java

+0

На самом деле это называется [скрывается] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.8), а не затенением. – assylias

+0

Затенение (по крайней мере, в моем опыте), которое вы используете, чтобы прерывания на микроконтроллере не зависали нить, выполняемая в то время. Теневые регистры обновляются каждый раз, когда реальные изменения изменяются в основном потоке, но прекращают обновление, когда его микроконтроллер прерывается, поэтому регистры могут быть восстановлены из них при выходе из процедуры прерывания. – AJMansfield

+0

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

ответ

4

Если вы действительно переопределяется метод, вы можете вызовите super() в какой-то момент, чтобы вызвать реализацию суперкласса. Но так как методы static принадлежат классу, а не экземпляру, вы можете «тенеизировать» их, предоставляя метод с той же сигнатурой. Статические члены любого типа не могут быть унаследованы , так как к ним необходимо получить доступ через класс.

+0

** Статические ** члены могут быть доступны через экземпляр объекта, используя ** this.staticVariable **, но считается плохой практикой. – NoName

1

Переопределение ... Этот термин относится к полиморфному поведению, например,

class A { 
    method(){...} // method in A 
} 

class B extends A { 
    @Override 
    method(){...} // method in B with diff impl. 
} 

При попытке вызова метода из класса B вы получите переопределенная behvaior ..eg

A myA = new B(); 
myB.method(); // this will print the content of from overriden method as its polymorphic behavior 

, но предположим, что вы объявили метод со статическим модификатором, чем пытаться один и тот же код

A myA = new B(); 
myA.method(); // this will print the content of the method from the class A 

это статические методы, основанные на методе Beacuse, не могут быть переопределены ... метод класса B просто затеняет метод из класса A ...

+4

2-й код: 'myB.method();' => Я думаю, что это опечатка, вы имели в виду 'myA.method();'? – jordom