2016-06-17 4 views
5
class Clidder { 
    private final void flipper() { 
     System.out.println("Clidder"); 
    } 
} 
public class Clidlet extends Clidder { 
    public final void flipper() { 
     System.out.println("Clidlet"); 
    } 
    public static void main(String args[]) { 
     new Clidlet().flipper(); 
    } 
} 

Каков результат? на этот вопрос я ожидал, что ответ «компиляция не удастся», потому что окончательный метод не может быть переопределен, и он не позволяет наследовать. но ответ был «Cliddet», почему? я неправильно понял что-то в этой концепции. как это может быть результат? пожалуйста, объясни.Точный способ использования конечных методов в java

+0

Интересный кромка. Правило большого пальца: просто не делайте этого :) – dimo414

+0

если вы действительно этого хочешь, чтобы проверить окончательные, удалите ключевое слово 'private' – emotionlessbananas

ответ

4

Частный модификатор указывает, что метод flipper() в классе Clidder не может быть замечен из дочернего класса Clidlet. Таким образом, это не переопределяет, а просто выглядит как новое объявление метода в дочернем классе. Закрытый метод/поле нельзя переопределить, поскольку его невозможно увидеть.

+0

phew! Меня обманули. спасибо за объяснение. – vidya

1

private методы не переопределены, поэтому здесь нет переопределения, поэтому нет нарушения final. Фактически final по методу private бессмысленны или излишни, возьмите ваш выбор.

0

Ответ должен быть «Cliddet», поскольку ваш окончательный метод имеет модификатор доступа private, который делает его невидимым для дочернего класса. Метод flipper в классе Clidlet эффективно скрывает тот же метод в родительском классе. Это довольно опасно, так как результат будет зависеть от того, вызывается ли он из суперкласса или подкласса.

Clidlet clidlet = new Clidlet(); 
clidlet.flipper(); // prints Clidlet 

Clidder clidder = new Clidlet(); 
clidder.flipper(); // prints Clidder 
0

В этом случае ключевое слово private препятствует доступу подкласса к методу. В результате Clidlet спрашивает Clidder о свойствах метода, получает ответ «Я держу его в тайне» и выполняет его собственный метод.

Этот случай иллюстрирует, что тот факт, что private предшествует (имеет более высокий приоритет, чем) final, что private final == private и демонстрирует путаницу это может привести к.

+0

частный + финал используется меньше, но это законно? если бы не было ключевого слова private и только final, тогда ответ компиляции не удался, правильно? – vidya

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