Как стать автором
Обновить

Подготовка к экзамену Oracle Certified Professional Java Programmer

Время на прочтение6 мин
Количество просмотров26K

Предисловие



На 16 декабря сего года я назначил себе прохождение экзамена Oracle Certified Professional Java Programmer. Он же Sun Certified Programmer в прошлом. Кроме того я подтолкнул к этому важному шагу еще троих своих товарищей. Начинаем готовиться. Пока вяло, но все же… И чтобы систематизировать получаемые знания, я решил периодически составлять «выжимки» — краткое содержание того, что нашел, прочитал или испытал на собственной шкуре. То, что вы читаете в данный момент — выжимка за номером ноль. Надеюсь, что это поможет кому-то избежать покупки дорогостоящих книг и перелистывания огромного количества статей. Готовлюсь я, кстати, по книге Sun Certified Programmer for Java 6: Study Guide за авторством Kathy Sierra и Bert Bates. Хорошая книга, отличный автор, легкий язык. Рекомендую.

Обращаю внимание, что я не претендую на полное описание всего того, что нужно знать перед экзаменом. Без помощи хаброжителей я подобную работу проделать не смогу, просто потому, что я еще не сдавал сам экзамен. Многое из приведенного ниже может показаться кому-то примитивным. Однако, как показывает практика нарешивания тестов, дьявол кроется именно в деталях. Будем считать это попыткой сжато изложить необходимое от правил именования идентификаторов до подводных камней перегрузки методов при наследовании и далее. Кроме того, я надеюсь подчерпнуть что-то полезное из комментариев людей, которые этот путь уже прошли. В лучшем случае на Хабре появится successfull story с полным описанием того, как все начиналось, росло и развивалось. Поскольку по задумке публиковаться все будет в реальном времени, — раз в двое суток примерно, — то те, кому предстоит сдавать экзамен смогут сравнивать по датам свой темп обучения с нашим и проходить чекпоинты намного быстрее.



Содержание для всей серии


  1. Идентификаторы, правила именования, модификаторы для классов и интерфейсов
  2. Модификаторы для методов и полей, vararg, enum и массивы


Итак, начнем



Ни для кого не секрет, что все компоненты Java, — будь то классы, переменные, методы или нечто иное, — должны иметь имена или, что звучит немного научнее, идентификаторы. При этом следует учитывать, что есть два уровня «правильности» идентификатора. Во-первых, он должен удовлетворять требованиям языка, а именно:

  1. Идентификатор должен начинаться с буквы, символа валюты (например, $) или знака подчеркивания. Обратите внимание, идентификатор не может начинаться с цифры.
  2. После первого символа идентификатор может содержать любые комбинации букв, символов валюты, соединяющих символов или цифр.
  3. С точки зрения компилятора, нет никаких ограничений на количество символов, содержащихся в идентификаторе.
  4. Вы не можете использовать ключевые слова Java в качестве идентификатора.
  5. Идентификаторы в Java чувствительны к регистру символов. Таким образом, foo и FOO — не одно и то же.


Во-вторых, идентификатор должен удовлетворять Java Naming Convention. Важно понимать, что даже если идентификатор не является правильным с точки зрения соглашений, он все еще может оставаться валидным для компилятора. Например, компилятор скушает объявление переменной int _$ даже не возмутившись. В ходе экзмена важно понимать, требуется ли определить синтаксическую верность идентификатора, или же нужно понять, удовлетворяет он общепринятому стандарту или нет. Весь стандарт, кстати, с вас никто спрашивать не будет. Важно помнить только несколько фактов:

  1. Имена классов пишем с большой буквы. В остальном — Camel Case.
  2. Имена методов и идентификаторов пишем с маленькой буквы. В остальном — Camel Case.
  3. Константы объявляем как static и final переменные. Их имя целиком пишется большими буквами, слова разделяются при помощи знака подчеркивания.
  4. Чтобы получить имя getter'а для свойства, просто меняем первую букву в его имени на заглавную и дописываем слово get в начало.
  5. Чтобы получить имя setter'a для свойства, просто меняем первую букву в его имени на заглавную и дописываем слово set в начало.
  6. Если свойство булевское, то допустимо использовать префикс is вместо get.
  7. Метод, который используется для регистрации листенеров, должен собираться из слова add и типа листенера. Например, addActionListener.
  8. Метод, который используется для изъятия листенеров, должен собираться из слова remove и типа листенера. Например, removeActionListener.


Вот, собственно, и все основные правила, которых нужно придерживаться. Замечу, правда, что сами авторы книги этим правилам следуют не всегда, за что дико извиняются в самом ее начале. Причной этому, как они говорят, служат особенности утилиты, используемой при интернационализации экзамена. Сертифицированные-то программисты, ИМХО, могли бы и поправить ))

Теперь поговорим немного правилах использования файлов с исходным кодом наших классов.

  1. Важный факт. Один файл может содержать только один класс с модификатором public. Классов с идентификатором по умолчанию, при этом, в нем может быть сколько угодно.
  2. Если файл содрежит класс с модификатором доступа public, то имя этого файла должно совпадать с именем публичного класса.
  3. Если класс — это часть пакета, то декларация пакета должна быть первой строчкой в файле.
  4. Если есть импорты других пакетов, то они идут сразу за декларацией пакета и до объявления любых классов. Если декларации пакета нет — в начале файла.
  5. Файлы, которые не содержат публичных классов, могут иметь имя, которое не совпадает ни с одним из объявленных в нем классов.

В Java существует всего четыре модификатора доступа. Первые три — это public, private и protected. Четвертый — отсутствие модификатора. При этом для объявления классов и интерфейсов могут использоваться только два типа модификаторов: public или по умолчанию. Это ограничение не касается вложенных классов, спасибо за наводку webkumo, однако это отдельная тема на экзамене. О них — позже.

  1. Если класс не имеет никакого модификатора доступа в своем объявлении, то он получает область видимости по умолчанию. Это значит, что его видят только классы, расположенные с ним в одном пакете. И никакие иные.
  2. Если класс имеет модификатор доступа public, то он доступен и виден для всей Java-вселенной.


Модификаторы доступа вы можете в произвольном порядке чередовать с еще несколькими ключевыми словами: final, abstract или strictfp. Вы легко можете объявить класс с модификаторами, скажем, public final strictfp, если вам хочется. Причем порядок не важен. Можно и поменять местами что-нибудь: final public strictfp. Все модификаторы асболютно равноправны. Не стоит только применять final и abstract одноврмененно. Это вызовет ошибку компилятора, так как вы применяете взаимно противоположные по смыслу модификаторы.

  1. Модификатор strictfp был для меня открытием. Откровенно говоря, вряд ли вам придется его применять. Но знать и помнить — полезно. Если он применяется к классу, то обеспечивает соответствие всех операций над числами с плавующими точками стандарту IEEE 754. Как оказалось, применяется он для получения предсказуемого результата, поскольку различные процессоры могут по разному обрабатывать числа с плавающей точкой.
  2. Модификатор final запрещает наследование от класса. Часто применяется для классов, содержащих только константы и набор статических методов для работы над ними. Ну и, скажем, класс String является final.
  3. Модификатор abstract используется для обозначения абстрактных классов. По сути он означает, что объекты такого класса никогда не должны создаваться непосредственно. Только как часть наследников. Класс обязан содержать этот идентификатор, если он содержит хотя бы один метод, обозначенный как abstract.


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

  1. Все методы интерфейса неявным образом объявляются как public и abstract. Таким образом, не имеет значения, написали ли вы явным образом public abstract void foo(), public void foo() или просто void foo() внутри интерфейса. Компилятор все равно воспримет это как public abstract void foo().
  2. Так как интерфейсы полностью абстрактны, то к ним неприменимы понятия final (просто бессмысленно), strictfp (следовать загадочному стандарту просто нечему) или native.
  3. Интерфейс может расширять (extends) один или несколько других интерфейсов. И только их. Ничего кроме интерфейсов он расширять не может.
  4. Интерфейс не может реализовывать (implements) другие интерфейсы.


Следует учитывать, что в рамках интерфейса можно объявлять коснтатны. Более того, любое поле, которое вы нарисуете в интерфейсе, получит модификаторы public, static и final. Не имеет значения, написали вы int a = 48, public int a = 48 или public static final int a = 48 внутри интерфейса. Все три объявления будут восприняты как public static final a = 48 со всеми вытекающими.

На этом сегодня все. В следующий раз постараюсь подробнее рассмотреть особенности применения модификаторов доступа к полям и методам класса. Кроме того мы рассмотрим примитивные типы, массивы и статические переменные, а также пройдем первый тест для проверки того, насколько все хорошо усвоилось и переварилось. Тест оформлю как форму в Google Docs.

Если кому-то интересно, могу также опубликовать подробную инструкцию, посвященную тому, как на этот экзамен зарегистрироваться через сайты авторизованных партнеров Oracle. Мне лично, чтобы уяснить, где и что выбирать, кому писать и с кем договариваться, пришлось связываться с саппортом Oracle.

Спасибо за внимание и удачного вам экзамена!
Теги:
Хабы:
+40
Комментарии25

Публикации

Изменить настройки темы

Истории

Работа

Java разработчик
352 вакансии

Ближайшие события