Абстрактные и окончательные — это модификаторы доступа или спецификаторы доступа.

abstract final class Outer {

}

Итак, я компилировал приведенный выше код и получил очевидную ошибку, но ошибка была недопустимой комбинацией модификаторов доступа, но документ java http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html говорит, что существует только 3 модификатора доступа (общедоступный, частный и защищенный). Итак, эти abstract , final , public , private и protected являются модификаторами доступа или спецификаторами доступа или чем-то еще? потому что во многих книгах и на веб-сайтах эти ключевые слова упоминаются как модификаторы доступа, а иногда как спецификаторы доступа. я так запутался здесь.


person user3690061    schedule 04.06.2014    source источник
comment
Вы не можете сделать один класс абстрактным и окончательным одновременно. Abstract говорит, что вы собираетесь расширить класс и сделать его конкретным. Final говорит, что класс не может быть расширен.   -  person Gilbert Le Blanc    schedule 04.06.2014
comment
Final и abstract не являются модификаторами доступа. Единственными модификаторами доступа в Java являются общедоступные, частные и защищенные. Насколько мне известно, разница между модификаторами доступа и спецификаторами заключается только в терминологии.   -  person Clement Hoang    schedule 04.06.2014
comment
@ClementHoang, тогда почему я получил ошибку как недопустимую комбинацию модификаторов доступа   -  person user3690061    schedule 04.06.2014
comment
На самом деле существует четыре модификатора доступа: public protected private aaaa и package private (последний подразумевается, если модификатор доступа не указан)   -  person Durandal    schedule 04.06.2014
comment
Пакет @Durandal не является модификатором   -  person user3690061    schedule 04.06.2014
comment
@user3690061 пакет != пакет частный.   -  person Durandal    schedule 04.06.2014
comment
пакет private также не является модификатором доступа, я уверен на 100%   -  person user3690061    schedule 04.06.2014


Ответы (1)


В контексте объявления класса и в соответствии с JLS #8.1.1, это все модификаторы класса.

И если вы прочитаете немного дальше, то увидите, что только public, private и protected являются модификаторами доступа (что имеет смысл: они определяют, доступен класс или нет из других частей кода).

Так что да, технически abstract и final не являются модификаторами доступа, и сообщение об ошибке могло бы быть более точным. Обратите внимание, что сообщение об ошибке javac (Java 8):

недопустимая комбинация модификаторов: abstract и final

person assylias    schedule 04.06.2014
comment
Сначала вы говорите все модификаторы (абстрактные, окончательные, общедоступные, частные и защищенные), но в следующей строке вы говорите, что только общедоступные, частные и защищенные являются модификаторами. что это значит тогда? - person user3690061; 04.06.2014
comment
@user3690061 user3690061 это все модификаторы, но только private, public и protected являются модификаторами доступа. - person assylias; 04.06.2014
comment
так что нет ничего, что называется спецификатором доступа? - person user3690061; 04.06.2014
comment
@ user3690061 нет в официальной документации. Единственная ссылка на спецификатор в JLS находится в контексте спецификатора параметра, что означает тип и имя параметра метода, например int i в public void someMethod(int i) {}. - person assylias; 04.06.2014
comment
Итак, что может быть причиной того, что люди упомянули спецификаторы доступа как общедоступные, частные и защищенные, а модификаторы доступа - как абстрактные, окончательные. - person user3690061; 04.06.2014
comment
@user3690061 user3690061 Тот, кто сказал вам, что окончательный обзор amd содержит модификаторы доступа, был неправ. public, protected и private (package-private, если вы считаете неявные модификаторы) являются единственными модификаторами доступа. abstract, final, static, volatile, transient... все это модификаторы, но не модификаторы доступа - person Dioxin; 04.06.2014