2013-12-25 8 views
3

Мой код:Override в наследство

public class PrivateOverride { 

private void f() { 
    System.out.println("private f()"); 
} 

public static void main(String[] args) { 
    PrivateOverride po = new derived(); 
    po.f(); 
    } 
} 

class derived extends PrivateOverride { 

public void f() { 
    System.out.println("public f()"); 
    } 
} 

Выход: private f()

Почему?

ответ

7

Потому что derived#f()не переопределяет класс родителей частный f() метод.

Вы можете подтвердить это, добавив @Override аннотация к f() методу в классе derived и посмотреть, что он не будет компилироваться.

Дополнительные советы:
К переопределение метод f(), он должен быть унаследовал от класса родителя, т.е. видимым в подклассе, который никогда не бывает в случае частных методов.

Дополнительные правила для правильного переопределения метода суммированы в this table.

2

derived не может видеть PrivateOverridef(), потому что он является частным, и, следовательно, это не переопределение, это определение нового метода. Всегда рекомендуется добавлять аннотацию @Override по переопределенному методу, чтобы избежать таких скрытых проблем.

2

Метод f в PrivateOverride указан как private. Это означает, что он не переопределяется классом derived.

Вот почему вы должны использовать аннотацию @Override. В этом случае он покажет вам ошибку.

0

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

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