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

Предисловие



На 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.

Спасибо за внимание и удачного вам экзамена!
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 25

    +2
    strictfp это strict Floating Point. На эту тему советую почитать habrahabr.ru/blogs/cpp/112953/
    CamelCase с маленькой буквы часто называют camelCase или lowerCamelCase.
      0
      Интересно, а почему у Android установка слушателя события через set, а не add?
      К примеру — setOnClickListener.
        +2
        Мб потомучто он один?
          +2
          Формально говоря, все, что я сказал про сеттеры, геттеры и регистрацию листенеров — это Java Beans. Ребята из Android в общем-то и не обязаны придерживаться этих рекомендаций. У них свои есть тут.
            0
            Точно! И это утверждение.
          +2
          А где можно сдать такой экзамен на украине?
            0
            я сдавал 7го ноября в компании Softline(Киев). При регистрации через PersonVUE на сдачу екзамена можно сразу выбрать где удобно сдавать(предлагается список центров сертификации).
            0
            Сколько скидка по партнерке вышла?
              0
              Я так и не воспользовался нашей партнеркой. Не знаю почему. Наверное философское. Просто сам заплатил и все. Это 125$. Скидка партнерам, если я не ошибаюсь, процентов 30. Кто-нибудь пользовался?
                0
                так 300 же экзамены стоят — нет?
              +8
              Ключевые слова необходимо выучить, вопросы на эту тему будут с большой вероятностью.


              Про модификаторы доступа обязательно нужно знать что они значат и как применяются.
              Модификаторы STATIC, FINAL, ABSTRACT, SYNCHRONIZED, STRICTFP, NATIVE, TRANSIENT, VOLATILE
              Их возможные комбинации.
              final – нельзя изменять значение переменной, нельзя переопределять метод родителя, нельзя наследовать класс
              abstract – первая окончательная реализация класса должна переопределять все абстрактные методы. Не должно быть фигурных скобок.
              Не сочетается с FINAL, PRIVATE, STATIC, NATIVE, STRICTFP, TRANSIENT
              synchronized – сочетается с любым из четырёх модификаторов доступа
              native – только для методов. Не должно быть фигурных скобок.
              strictfp – только для методов. Приводит работу с числами с плавающей запятой к определённому стандарту (IEEE 754).
              transient – отменяет сериализацию данной переменной
              volatile – применяется для безопасной работы с потоками
              static – можно помечать методы, переменные класса, вложенный класс, блоки инициализации


              Также следует помнить, что конструктор не может быть FINAL, STATIC или ABSTRACT

              Дополнение по поводу интерфейса:
              • Методы всегда PUBLIC и ABSTRACT, даже если это не объявлено.
              • Методы НЕ могут быть STATIC, FINAL, STRICTFP, NATIVE, PRIVATE, PROTECTED
              • Переменные только PUBLIC STATIC FINAL, даже если это не объявлено.
              • Переменные НЕ могут быть STRICTFP, NATIVE, PRIVATE, PROTECTED
              • Может только наследовать (extend) другой интерфейс, но не реализовывать интерфейс или класс (implement).

              Этой информации достаточно, чтобы ответить на все вопросы, связанной с модификаторами доступа и ключевыми словами.
                0
                • static – можно помечать методы, переменные класса, вложенный класс, блоки инициализации

                не забывая что во вложенном не статическом классе не может бьіть статических переменных и методов.
                  +1
                  Ваши дополнения по интерфейсам целиком в статье :-). За остальное спасибо. Ключевым словам действительно много внимания. Понравился где-то на хабре пример с параметром int String и вопросом, скомпилируется или нет. В этом же примере демонстрировалось разделение имен идентификаторов для меток и переменных.
                  +4
                  Вы не указали, что интерфейс может иметь вложенный класс.

                  public interface IClass {
                  
                      void doJtest();
                  
                      class Tester implements IClass {
                  
                          @Override
                          public void doJtest() {
                              System.out.println("Doing test:\n"+this.getClass().getName());
                          }
                      };
                  }


                    0
                    > Готовлюсь я, кстати, по книге Sun Certified Programmer for Java 6: Study Guide за авторством Kathy Sierra и Bert Bates.

                    мне больше понравилась книга SCJP: Sun Certified Programmer for Java Platform Study Guide: SE6. Читал обе, но ту что вы предложили недочитал, слишком много ненужного текста как по мне.
                      0
                      ой, извините, не туда нажал для ответа:-[
                        0
                        Лишнего текста действительно ОЧЕНЬ много. Что временами утомляет. Ососбенно 100500 извинений, что все не по стандарту написано. Но зато автор очень добросовестно подходит к деталям. Важные факты повторяются снова, снова и снова. Закрепляются примерами.
                      0
                      Мне стыдно. Я этого не знал.
                      Спасибо тебе, добрый человек!
                      0
                      Вот уже довольно устаревшее, но тем не менее отличное подспорье в подготовке.
                        0
                        > 5. Файлы, которые не содержат публичных классов, должны иметь имя, которое не совпадает ни с одним из объявленных в нем классов.

                        Если не секрет, кто знает как такое использовать?
                          +1
                          В каком смысле «как использовать»? По желанию ) Например для описания внутренних для пакета классов. Из пакета использовать можно, а снаружи — нет.
                            0
                            Спасибо, просто я как-то привык к публичным классам :)
                              0
                              Ключевое слово тут «привык» на самом деле. До того, как стал готовиться к экзамену, не замечал одной любопытной детали. В диалоге создания класса, например, NetBeans нет возможности указать, что вы хотели бы создать непубличный класс. От вас требуется только указать имя класса, а среда уже за вас сгенерирует имя файла и модификатор подставит.
                          0
                          >5. Файлы, которые не содержат публичных классов, должны иметь имя, которое не совпадает ни с одним из объявленных в нем классов.

                          А что в данном случае значит «должны»?
                          Компилятор не жалуется.
                            0
                            Перепроверил этот факт. Был в нем всегда уверен. Однако компилятор действительно не ругается. Более того, спецификация утверждает ровно обратное: мы можем назвать файл с непубличными классами как нам заблагорассудится. Поправил в статье. Спасибо.

                          Only users with full accounts can post comments. Log in, please.