Почему частные методы в Java неявно окончательные?

Я хотел указать на эти строки в книге «Java в двух словах», что вызвало у меня некоторое замешательство:

частные методы не наследуются подклассами и, следовательно, не могут быть переопределены (т. е. все частные методы неявно являются окончательными).

Я интерпретировал, что все частные методы являются окончательными, и я понимаю, что:

  • Финальные методы нельзя переопределить, но их можно вызывать из подкласса.
  • Частные методы нельзя переопределить, и их нельзя вызывать из подкласса.

Верны ли мои утверждения?


person gibarsin    schedule 22.11.2014    source источник
comment
окончательные методы не могут быть переопределены. Это все, что делает final. Они могут или не могут быть вызваны подклассами в зависимости от их модификатора видимости (общедоступный, частный, защищенный или нет). docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol. html   -  person JB Nizet    schedule 22.11.2014
comment
В тексте говорится, что private методы являются final, а не иначе. Таким образом, Методы Final нельзя переопределить, но их можно вызывать из подкласса — это недоразумение. Второе утверждение верно.   -  person Luiggi Mendoza    schedule 22.11.2014
comment
Ты прав. В то время я не думал о видимости.   -  person gibarsin    schedule 22.11.2014
comment
Если я правильно помню, в книге также говорится об оптимизации конечных методов. Я думаю, что причина, по которой они ввели final в этот контекст, состоит в том, чтобы показать, что те же оптимизации применимы и к закрытым методам.   -  person Sergey Kalinichenko    schedule 22.11.2014


Ответы (3)


Финальные методы нельзя переопределить, но их можно вызывать из подкласса.

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

Частные методы нельзя переопределить, и их нельзя вызывать из подкласса.

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

person kinbiko    schedule 22.11.2014

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

частный

это модификатор доступа, он указывает, какой класс может видеть этот метод. (т.е. только этот класс, подкласс, другой класс в пакете). Следовательно, любой метод, помеченный как частный, можно увидеть только внутри того же класса. Следовательно, ваше утверждение верно, поскольку метод, помеченный как private, нельзя увидеть ни в одном подклассе, не говоря уже о переопределении или вызове.

окончательный

это означает, что что-либо внутри { } этого метода не может быть изменено извне. Следовательно, любой метод, помеченный как final, не может быть переопределен. Однако метод final может быть вызван из других классов в зависимости от его модификатора доступа. Поэтому ваше утверждение о final также верно, но опять же часть вызова строго зависит от модификатора доступа метода.

person muradbax    schedule 22.11.2014

final не могу переопределить

private нельзя использовать во внешнем классе, таком как подкласс.

Методы private неявно являются окончательными, поэтому их нельзя переопределить.

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

person Community    schedule 13.02.2017