Java сертификация. Подготовка к SCJP

    В этом месяце я сдавал экзамен SCJP. В этом топике я расскажу о подготовке и экзамене.
    В основном для тех, кто собирается сдавать и кому нужно больше информации об этом.

    Уточнение


    Так как Sun'a больше нет, то и экзамена SCJP тоже нет. Теперь он значится так:
    1Z0-851 Java Standard Edition 6 Programmer Certified Professional Exam.


    Подготовка


    Подготовка заняла две недели. Использовал только эти источники:

    Чтобы попробовать себя, есть еще такие ресурсы:
    • nikojava.wordpress.com
      Эти записи блога — сборник экзаменационных задач с ответами (правда, были и ошибочные ответы, будьте внимательны! При сомнениях — дайте на проверку компилятору).
    • http://www.certpal.com/
      Это эмулятор экзамена. Примерно так экзамен и выглядит.


    Всё. Этого хватит, чтобы сдать экзамен (и не с минимальным проходным баллом, а с очень даже хорошим). Правда, это при условии, что всё-таки вы на Джаве программировали и не путаетесь в основных конструкциях.
    Я просто читал вышеупомянутые статьи. Иногда что-то проверял на практике. Тесты в эмуляторе прошел по разу. Смотрел то, что неправильно, чтобы в будущем не натыкаться на те же грабли.

    Экзамен


    Сдавал в Петербурге. Экзамен стоит 125$ (сама организация экзамена. Положительный результат не гарантирован :)).
    В экзаменационном центре встретили радушно, напоили чаем, угостили печеньками. Сфотографировали. Потом начался тест. Сдавал в одиночестве (комната рассчитана на двоих сдающих, но я был один). 150 минут на 60 вопросов. Тут ничего особенного — тест как во всех эмуляторах.
    Надо ответить правильно не менее, чем на 61% вопросов.
    Пользоваться ничем нельзя, выходить — можно. Время при этом не останавливается.
    Результат — сразу. Сертификат — через несколько недель по почте.

    Задачи


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

    1. I/O — знай сигнатуры методов

    Что произойдет после выполнения этого кода?
    public class Main{
    
    
        public static final void main(String[] args) {
            String  path = "somepath"; // путь существующий и все права на запись есть
            String  name = "somename";
            File file = new File(path, name);
            file.mkdir();
            try {
                file.createNewFile();
            } catch (Exception e) {
    
            }
        }
    
    }
    

    1. Будет создан и каталог и файл
    2. Только каталог
    3. Не скомпилируется
    4. Выбросится java.io.IOException

    Ответ:
    2. Только каталог (с именем somename). Больше ничего не произойдет.

    2. Сериализация и конструкторы

    Что будет выведено в результате выполнения этого кода?
    import java.io.*;
    import java.util.*;
    
    
    public class Main {
    
    
        public static final void main(String[] args) throws Exception {
            ObjectOutputStream out = new ObjectOutputStream(
                    new FileOutputStream("abra-cadabra"));
            out.writeObject(new C(123));
    
            ObjectInputStream in = new ObjectInputStream(
                    new FileInputStream("abra-cadabra"));
            System.out.print(in.readObject());
        }
    
    }
    
    class A {
        public A() {
            System.out.print("A ");
        }
    
        public A(int number) {
            System.out.print("1 ");
        }
    }
    
    class B extends A {
        public B() {
            System.out.println("B ");
        }
    
        public B(int number) {
            super(number);
            System.out.print("2 ");
        }
    }
    
    class C extends B implements Serializable {
        public C() {
            System.out.print("C ");
        }
    
        public A a = null;
    
        public C(int number) {
            super(number);
            System.out.print("3 ");
        }
    }
    
    

    1. Не скомпилируется
    2. Выбросится java.io.NotSerializableException
    3. 1 2 3
    4. 1 2 3 A B

    Ответ:
    4. 1 2 3 A B
    Наличие в классе C переменной A a = null не ведет к NotSerializableException, так как a = null. Если вместо public A a = null; написать public A a = new A(); — выкинется NotSerializableException.
    В данном же случае все будет сериализовываться. При десериализации не вызывается конструктор дессириализуемого класса, но если его родители не реализуют интерфейс Serializable, то у них вызывается конструктор по умолчанию.
    Если в этом примере A будет реализоываться Serializable, а не C, то вывод будет 1 2 3
    Если в этом примере во всех трех классах убрать конструктор без параметров, то при десериализации выкинется java.io.InvalidClassException: no valid constructor, так как джава пытается вызвать конструктор без параметров у родителя.

    3. Введение в заблуждение

    Что будет выведено в результате выполнения этого кода?
    import java.util.*;
    public class Main {
    
        public static List getSorted()
        {
            List<Integer> sorted = new LinkedList<Integer>();
            sorted.add(3);
            sorted.add(1);
            sorted.add(2);
            return sorted;
    
        }
    
        public static final void main(String[] args) throws Exception {
                System.out.println(getSorted());
        }
    
    }

    1. 1 2 3
    2. 3 2 1
    3. 3 1 2
    4. Не скомпилируется
    5. Ошибка времени выполнения

    Ответ:
    3. 3 1 2.
    То, что метод и лист внутри метода называются getSorted() и sorted, вовсе не означает, что LinkedList тоже sorted.

    4. instanceof

    Что будет выведено в результате выполнения этого кода?
    class A {
    }
    
    class B extends A {
    }
    
    class C extends B {
    }
    
    class D {
    }
    
    public class Main {
    
        public static final void main(String[] args)  {
            B b = new C();
            A a = new C();
            D d = new D();
            System.out.println(b instanceof A);
            System.out.println(a instanceof B);
            System.out.println(d instanceof C);
        }
    
    }
    

    1. true true false
    2. true false false
    3. Ошибка компиляции

    Ответ:
    3. Ошибка компиляции. Так произойдет, потому что D и C находятся на разных ветках иерархии и не приводимы друг к другу.

    5. А что за параметр?

    public static void print(List<? extends String> list)
        {
                // сюда можно добавить...
        }
    

    1. list.add(«Привет, Хабрахабр!»);
    2. list.add(new Object());
    3. list = new ArrayList();
    4. list = new ArrayList<?>();
    5. list = new ArrayList<Objeсt>();

    Ответ:
    3. list = new ArrayList();
    Всё логично: вдруг к нам придет List<Т>, где T и правда наследуется от String?.. Тогда при вызове list.add(«Привет, Хабрахабр!»); джава просто не сможет сделать преобразование типов. Понимая это, компилятор компилироваться коду со строкой '1' не даёт. С 2, 4, 5 — тоже всё понятно. list = new ArrayList(); — корректный код.

    6. Исключения и переопределение метода

    Что будет выведено в результате выполнения этого кода?
    class A {
        public void print() throws Exception {
            throw new Exception();
        }
    }
    
    class B extends A {
        public void print() {
            System.out.println("B");
        }
    }
    
    public class Main {
    
        public static final void main(String[] args) {
            B b = new B();
            b.print();
        }
    
    }
    

    1. B
    2. Ничего
    3. Ошибка компиляции
    4. Exception

    Ответ:
    Переопределяющий метод не должен бросать новое или более широкое по классу исключение. Не бросать его вообще он может. Так что код скомпилируется и выведет B.

    7. Исключения и переопределение метода — 2

    Что будет выведено в результате выполнения этого кода?
    class A {
        public void print() throws Exception {
            throw new Exception();
        }
    }
    
    class B extends A {
        public void print() {
            System.out.println("B");
        }
    }
    
    public class Main {
    
        public static final void main(String[] args) {
            A a = new B();
            a.print();
        } 
    
    }
    

    1. B
    2. Ничего
    3. Ошибка компиляции
    4. Exception

    Ответ:
    3. Ошибка компиляции.
    Так как мы в классе A объявлено исключение, а в main(...) мы его не обрабатываем. Тип возвращаемого значения (который может быть не таким, как в суперклассе, ведь есть covariant return) и выбрасываемые исключения проверяются компилятором по типу ссылки.

    8. Integer++?

    Как можно изменить класс A, чтобы не повлиять на клиентский класс?
    class A {
        private int i = 0;
        public void add(int i)
        {
           update(++i);
        }
    
        private void update(int i)
        {
            this.i = i;
        }
    }
    
    public class Main {
    
        public static final void main(String[] args) {
               new A().add(5);
        }
    
    }
    

    1. Заменить ++i на i++
    2. Заменить public void add(int i) на private void add(int i)
    3. Заменить public void add(int i) на public void add(Integer i)
    4. Ничего из вышеперечисленного

    Ответ:
    3. Заменить public void add(int i) на public void add(Integer i)
    Просто нужно знать, что ++ и -- работает и с Integer. И с Double. И с Float. И со всеми численными обертками.

    Читайте статьи, практикуйтесь. И всё получится. Сложного в этом ничего нет.
    Если есть какие-то вопросы об экзамене, отвечу в комментариях.
    Поделиться публикацией
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 43
      +2
      Однозначно в избранное, автору спасибо!
        +8
        Спасибо, было интересно почитать.

        Только в 4-м не понятно, откуда вообще известна иерархия классов A, B C и D.
        А в 7-м по любому будет ошибка компиляции, даже если исключение перехватить:), должно быть a.print();
          0
          Согласен! Своими замыленными глазами в 7-й сделал опечатку, а в 4-й потерял часть кода.
          Но всё проапдейтил.
          0
          Поясните, пожалуйста, на пальцах задание №8.
          Я просто не понял, «Как можно изменить класс A...», чтобы достить какого результата?
            0
            Чтобы для внешнего кода ничего не изменилось.
              0
              Да, что бы внешний (клиентский) класс не заметил разницы в поведении класса А. И чтобы вообще не сломать.
              +1
              На rutracker.org есть еще несколько эмуляторов SCJP.
                +1
                А можно подробнее, как искали вендора, у которого сдавать тест? При Лужкове Sun'е вроде через авторизованные Prometric центры можно было сдавать, а у Оракла как?
                  +1
                  Тоже самое. Авторизированный центр. Я искал поближе к дому, но их вообще не мало.
                    0
                    Через Prometric искали?
                      0
                      Нет, на сайте Орекла есть все необходимые контакты.
                    +2
                    Оракл работает с Pearson VUE. Все Sun'овские екзамены перевели в эту систему.
                    0
                    Теги радуют. Притом если SCJP достаточно интересен, так как значительная часть экзамена там на логику и понимания ООП в Java, то «задротство» это первое слово, которое вертится в голове при подготовке/сдаче Sun Certified Web Component Developer.

                    Если после SCJP у меня набралось материала для двух хабрастатей, то за время подготовки и сдачи scwcd — ни одной задачки для хабра не встретилось. Тупая заучка спецификаций.
                      0
                      Подтверждаю, то же самое для SCBCD, задротство и ничего больше.
                        –1
                        Задродсто-не задртство, но это оказывается очень полезным, так как во-первых спека очень грамотная, позволяет пояь не тоько jee но и общие концепции веба. После этого также понимаешь как работает спринг, хибер и чем именно он помогает. После подготовки к самому экзамену, появляется оеь правильное видение того, как должно выглядитть пиложение.

                        Вышесказанное больше относитс правда к scwcd, так как scbcd показался более поверхностным
                          0
                          Если после SCJP у меня набралось материала для двух хабрастатей

                          В одной из которых, кстати, Вы говорите следующее:
                          Данная тема достаточно сложна, и у меня есть мысли посвятить нюансам работы с коллекциями в Java отдельную статью. Там я постараюсь осветить эти моменты подробнее.

                          Мне очень не хватало статьи про коллекции :)
                          +3
                          Собираюсь сдавать через неделю.
                          Если есть небольшой опыт программирования, то для подготовки достаточно книги Sun Certified Programmer for java 6 Study Guide авторов Kathy Sierra, Bert Bates.
                          Для проверки полученных знаний http://examlab.tk/scjp6.html — бесплатный тест, по уровню сложнее самого экзамена, если его проходите, можно смело идти сдавать.
                            +2
                            Подтверждаю. Сам сдал где-то месяц назад.
                            Учился по этих двух пунктах: SCJP 6 Study Guide + ExamLab.
                            ExamLab'овские тесты очень хорошие, посложнее самого экзамена и с отличными объяснениями.
                            Если их проходиш хоть на 60-70, то на реальном экзамене можно получить высокий бал.
                              0
                              правильно делаете что Кати читаете. Автор вообще ее не затронул(это огромный минус)
                              +9
                              Вы понимаете, что нарушили условия сертификации, выкладывая задачи с экзамена?
                                +5
                                Кто? Анонимный пользователь? Нарушил? Да не было никакого экзамена! Это мы тут в письменном творчестве развлекаемся.
                                  –3
                                  Сам ты анонимный. Ваня с 50-ым размером, закончивший лицей №1580 при МГТУ им.Баумана, ныне студент кафедры ИУ-9 аналогичного института. Программист, сисадмин с таким огромным количеством аккаунтов в разых соц. сетях и формах, что можно полную биографию составить. :))
                                    0
                                    А составьте? По аккаунтам, созданным в школьное время и давно заброшенным?
                                    Одноклассники, мой круг, вконтакте — все такое старое, что даже смешно.

                                    Вы бы еще мою 5-10 летнюю прописку нашли по базам.
                                      0
                                      Вы лучше сами поищите и посмотрите. У вас и правда много данных в сети. Старые аккаунты — это не минус для такого поиска, а плюс — можно посмотреть информацию разной давности. Да и не такие они у вас и старые, судя по обновлениями в вашем твиттере и фоткам на квип-хостинге. :)
                                      При этом учитывайте то, что всякие списки для гос. учреждений могут публиковаться в сети (например, списки поступающих и т.д.). Найти ваш телефон и адрес — дело 10 минут.
                                      У вас Акадо? Зная номер телефона, можно подключать и отключать разные услуги по телефону, или сменить тариф.

                                      Нет в сети никакой анонимности, забудьте. Лучше следите за своими данными. :)
                                        0
                                        Квип хостинг? Квип? Айсикью?

                                        Это не правда, что зная номер телефона можно отключать/подключать услуги. Нужны еще и паспротные данные, на кого оно зарегистрировано.

                                        И вот тут-то и есть privacy — есть информация, которую люди публично выкладывают в сеть, а есть та, которая доступна только им.

                                        Твиттер или социальные сети это пример того, что я хочу, чтобы было в сети. Номер телефона или паспортные данные (хотя тут не только от меня зависит) — нет.
                                          0
                                          Позвоните своему оператору, попросите включить какую-нибудь услугу. У вас спросят номер договора. Говорите, что не помните, готовы назвать номер + на кого зарегистрирован номер.
                                          Номер телефона и все, кто прописан в квартире, это данные, которые легко достать, сходив за соот. дисков на горбушку (или заглянуть на сайта nomer.org и пр.). Несколько попыток (звонков), или вежливое общение с оператором («ой, забыл, мы ж на бабушку оформляли, вот её ФИО») приведет вас к результату. )

                                          Это очень глупо думать, что если вы не написали на стене свои паспортные данные, то их нельзя достать, зная ваш логин на форуме (почту, ICQ, skype, такой же аватар, имя...).
                                            0
                                            Да наоборот же.
                                            Глупо думать, что я где-то указал свои данные в открытую.
                                            Скажем телефон я нигде не укажу. А то, что f0b0s == Ваня Давиденко == Аватар со смайликом это публичная информация.
                                              0
                                              Петрович?:)
                                  +4
                                  Как информация к размышлению не помешают и реальные примеры задач. Билеты к теоретическому экзамену ПДД вообще в свободном доступе, так что ничего не мешает зазубрить их и даже сдать экзамен. Другое дело, что без понимания зазубренного ездить потом тяжко придётся.
                                    +1
                                    Вообще понимаю. Но если формально, то это не совсем задачи с экзамена. Все имена, форматирование, иногда даже количество классов, порядок их объявления (я ж не всё помню) и так далее изменены. Осталась только суть. Так что это не те задачи.
                                    0
                                    Тоже сдал, когда был студентом — просто, чтобы самому себе доказать, что я Java знаю. Причем сдавал под Новый год и попал под скидку 50% :)

                                    Больше всего мне понравились задачи, где нужно было перетаскивать фрагменты кода, чтобы получить желаемый результат. Довольно много было задач на wildcards, annotations и threading. Времени, которого дают, хватает с лихвой — я по всем вопросам пробежался пару раз и все равно закончил минут на 40 раньше. Балл отличный, не 100%б но где-то близко.

                                    Самое интересное, что теперь в резюме его не указываю — вроде бы как пару лет назад считалось дурным тоном. Мол, экзамен сдают только задроты, которые программировать не умеют, а работу получить хотят. Как сейчас к сертификации относятся, не в курсе.
                                      0
                                      где нужно было перетаскивать фрагменты кода

                                      Именно перетаскивать?

                                      У меня кстати, на аннотации и wildcards задач не было.
                                        0
                                        Да-да, драгэндропом. Правда, сдавал я тест по Java 1.5 — давно это было. Спрашивали в основном новенькое на тот момент — на дженерики было около половины вопросов.
                                      0
                                      Скажите, а зачем оно вообще нужно?
                                        0
                                        Что именно? Сертиификация? У всех по-разному. У кого-то требование работодателя, кто-то хочет устроиться на работу и иметь при себе дополнительные плюсы в виде сертификатов, кто-то сдает просто для себя. Вообще, у нас, по-моему, третий вариант распространен больше всего.
                                          0
                                          Сертификация помогла хоть немножко закрепить, разбросанные по всей моей юной голове, базовые java-знания.
                                          0
                                          ох как любят подобное на собеседованиях спрашивать :)
                                            0
                                            А на www.quizful.net пробовали тестироваться? Актуальный тест сложнее чем на quizful или проще?
                                              0
                                              Не пробовал… Какие-то задачи там решал, но уже не помню ничего.
                                              0
                                              С SCJP понятно, а кто знает, обязательное платное обучение для девелопера и архитектора таки ввели?
                                              http://www.osp.ru/news/2011/0302/13006032/

                                              И мои пять копеек, Kathy Sierra и Bert Bates для полного цикла подготовки вполне достаточно.
                                                0
                                                Архитекторам точно ввели, при этом это обучение у нас в Роиссии не достать вообще.
                                                0
                                                Скажите, а почему 125$, на сайте оракла цена в 300$! Или я чего-то недопонял…

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

                                              Самое читаемое