Подготовка к сдаче сертификационного экзамена SCJP 6
Термины
State (состояние) – определяется переменными экземпляра.
Declaration – объявление.
Overriding Method – замещающий метод (подкласс).
Overriden Method – замещаемый метод (суперкласс).
Свойство в JavaBeans – это переменная с модификатором доступа private.
Аргумент – значение, которое необходимо указать процедуре при ее вызове. Код вызова указывает аргументы при вызове процедуры. Часть вызова процедуры, которая определяет аргументы, называется списком аргументов.
doStuff("a", 2); // вызов doStuff, a и 2 - аргументы
Параметр – значение, указанное в параметрах процедуры при ее вызове. В объявлении процедуры определяются ее параметры.
void doStuff(String s, int a) { } // ожидается 2 параметра: String и int
Допустимые идентификаторы
Идентификатор в Java может начинаться с символа $ (валютный символ), любой буквы Unicode или с подчеркивания (_). Идентификатор не может начинаться с цифры.
После первого символа идентификатор может содержать любую комбинацию букв Unicode, валютных символов, соединяющих символов (_) или цифр.
В качестве идентификатора не может выступать ключевое слово Java. Список ключевых слов Java приведен в Таблице 1.
| abstract | assert | boolean | break | byte | case |
| catch | char | class | const | continue | default |
| do | double | else | enum | extends | final |
| finally | float | for | goto | if | implements |
| import | instanceof | int | interface | long | native |
| new | package | private | protected | public | return |
| short | static | strictfp | super | switch | synchronized |
| this | throw | throws | transient | try | void |
| volatile | while |
На экзамене необходимо помнить, что идентификаторы в Java чувствительны к регистру символов.
Примеры допустимых идентификаторов
- int _a;
- int $c;
- int ______2_w;
- int _$;
- int this_is_a_very_detailed_name_for_an_identifier;
Примеры недопустимых идентификаторов
- int :b;
- int -d;
- int e#;
- int .f;
- int 7g;
Правила создания исходника (файла с кодом Java, имеющего расширение .java)
Файл может содержать только один класс с модификатором public.
Имя файла должно совпадать с именем public-класса.
Если класс является частью пакета, то первой строкой кода должно быть объявление package.
Объявление import должно располагаться между объявлением package и объявлением класса.
import и package применяются ко всем классам, находящимся в файле.
Файл, не содержащий ни одного public-класса может быть назван любым именем.
Модификаторы класса
Модификаторы доступа
К классу можно применить только два модификатора – это public и модификатор доступа по умолчанию (default).
Класс с модификатором default виден только классам из того же пакета.
Класс с модификатором public виден всем классам из всех паетов.
На экзамене необходимо обращать внимание на то, что перед использованием класса, который находится в другом пакете, его нужно сначала импортировать.
Non-access модификаторы
В объявлении класса можно использовать следующие non-access модификаторы: strictfp, final, abstract.
Модификаторы доступа и non-access модификаторы смешивать (использовать одновременно) можно, например public final, но не всегда можно смешивать non-access модификаторы друг с другом.
Можно одновременно использовать strictfp и final.
Нельзя одновременно использовать final и abstract.
strictfp можно применять к классу или к методу, но нельзя применять к переменной. Если класс strictfp, то все его методы будут соответствовать стандарту IEEE 754 для плавающей точки. Без этого модификатора вычисления будут зависеть от платформы.
final означает, что класс не может иметь подклассов (т.е. его нельзя расширить и он является листом дерева иерархии).
Нельзя создать экземпляр абстрактного (abstract) класса, но можно создать массив с типом абстрактного класса.
Если хотя бы один метод объявлен как abstract, то класс тоже нужно объявить abstract.
Интерфейсы
Все методы интерфейса неявно являются abstract и public.
Все переменные, объявленные в интерфейсе являются константами, т.е. public static final. Рассмотрим пример:
interface Foo { int BAR = 42; void go(); } class Zap implements Foo { public void go() { BAR = 27; } }
Этот пример не скомпилируется т.к. нельзя изменить значение константы. Значение константе должно быть присвоено в месте ее объявления и больше изменяться не может. Следовательно на строке BAR = 27 произойдет ошибка.
К методам интерфейса нельзя применять модификаторы static, final, strictfp, native.
Интерфейс может расширять (extends) один или более интерфейсов.
Интерфейс не может расширять ничего, кроме интерфейса.
Интерфейс не может реализовать (implements) другой интерфейс или класс.
Примеры правильного объявления методов интерфейса:
void bounce(); public void bounce(); abstract void bounce(); public abstract void bounce(); abstract public void bounce();
Примеры неправильного объявления методов интерфейса:
final void bounce(); // final использовать запрещено static void bounce(); // интерфейсы определяют методы экземпляра private void bounce(); // методы интерфейса всегда public protected void bounce(); // методы интерфейса всегда public
Члены класса
public-члены доступны из любых методов любых классов. Наследуются любыми классами.
private-члены доступны только из этого же класса. Не наследуются. В подклассе можно объявить точно такой же член, но это не будет являться переопределением (overriding).
D – вызов метода, объявленного в том же классе; R – вызов метода через ссылку; I – вызов унаследованного метода.

Доступ к private-методам в Java
protected и default-члены полностью идентичны за исключением одной разницы: default-члены могут быть доступны только если класс из которого осуществляется доступ находится в том же пакете.
protected-члены могут быть доступны через наследование даже если подкласс находится в другом пакете.
Итого: default – только package; protected – package + kids; protected = inheritance, т.е. по ссылке получить доступ к protected-члену из другого пакета нельзя; подкласс может видеть protectde-член только через наследование.
Наследуемый подклассом protected-член является private для любого кода за пределами этого класса за исключением подкласса подкласса.
defaul-члены видны подклассам только если подкласс и суперкласс находятся в одном пакете.

Доступ к default и protected-методам в Java
| Видимость | Public | Protected | Default | Private |
| Из того же класса | Да | Да | Да | Да |
| Из любого класса того же пакета | Да | Да | Да | Нет |
| Из подкласса в том же пакете | Да | Да | Да | Нет |
| Из подкласса, расположенного в другом пакете | Да | Да, через наследование | Нет | Нет |
| Из другого пакета и не подкласса | Да | Нет | Нет | Нет |
Локальные переменные и модификаторы доступа
Модификаторы доступа не применимы к локальным переменным.
К локальным переменным можно применять только final.
Non-access модификаторы для членов класса
final для метода предотвращает переопределение в подклассах.
final для аргумента метода означает, что переменной присвоить новое значение.
Модификатор abstract
Если в классе есть хотя бы один abstract-метод, то класс доджен быть объявлен с модификатором abstract, поэтому следующий код не скомпилируется:
public class IllegalClass{ public abstract void doIt(); }
Класс с модификатором abstract (абстрактный класс) может не иметь абстрактных методов, поэтому следующий код допустим:
public abstract class LegalClass{ void goodMethod() { // тут сложные и серьезные алгоритмы } }
Любой класс, который расширяет абстрактный класс, должен реализовать все абстрактные методы суперкласса, только если подкласс не абстрактный. Рассмотрим пример:
public abstract class A { abstract void foo(); } class B extends A { void foo(int I) { } }
Класс B не скомпилируется, т.к. метод foo() не реализован. foo(int I) – это не реализация абстрактного метода, а всего лишь перегруженный метод.
Объявление абстрактного метода должно заканчиваться символом (;).
Метод не может быть одновременно и abstract и final.
Метод не может быть одновременно и abstract и private.
Метод не может быть одновременно и abstract и static.
abstract static void doStuff();
Этот пример не скомпилируется:
MyClass.java:2: illegal combination of modifiers: abstract and static abstract static void doStuff();
synchronized-методы
synchronized-метод может быть доступен только одному потоку в определенный момент времени.
Модификатор synchronized может применяться только к методам и может комбинироваться с любыми модификаторами доступа.
native-методы
Модификатор native указывает на то, что метод реализован в платформно-зависимом коде, например в C.
native применяется только к методам.
Телом native-метода является символ ; как у абстрактного метода, что означает что реализация опущена.
Методы с переменным списком аргументов (var-args)
var-args – должен быть последним параметром в сигнатуре метода.
В методе может быть только один var-args параметр.
Примеры правильного использования var-args:
void doStuff(int... x) {} // Ожидается 0 или более параметров void doStuff(char c, int... x) {} void doStuff(Animal... animal) {}
Примеры неправильного использования var-args:
void doStuff(int x...) {} void doStuff(int... x, char... y) {} void doStuff(String... s, byte b) {}
Объявление конструкторов
Конструктор не возвращает значение.
Конструктор имеет такое же имя, как у класса, в котором он объявлен (другими словами, имена конструктора и класса должны совпадать).
Конструктор не может быть static, final или abstract (т.к. его нельзя переопределить).
Объявление переменных
Пробные тесты (Mock exam)
http://www.quizful.net/test – на Quizful можно пройти два теста SCJP 1.4, один тест SCJP 5 и один SCJP 6. Кроме пробных сертификационных экзаменов по Java, этот ресурс предлагает еще около 100 тестов, которые позволят проверить ваши знания практически в любой области информационных технологий.
#1 by Korotkov Nikolay on 15 Декабрь 2009 - 22:30
Quote
default-члены могут быть доступны только если класс из которого осуществляется доступ находится в том же классе.
…..помоему что-то не то.может имелось ввиду пакет
#2 by Korotkov Nikolay on 15 Декабрь 2009 - 22:54
Quote
а не правильно тока как-то мудрено
#3 by Дмитрий Леонтьев on 16 Декабрь 2009 - 9:53
Quote
Тут действительно ошибка. Правильно: “default-члены могут быть доступны только если класс из которого осуществляется доступ находится в том же пакете.”
В тексте тоже поправил. Спасибо.
#4 by eldest on 28 Декабрь 2009 - 13:09
Quote
// final для аргумента метода означает, что переменной присвоить новое значение.
Возможно тут пропущено слово “нельзя”.
Большое спасибо за ссылку на тесты.
#5 by Claire on 27 Июнь 2011 - 13:51
Quote
Здравствуйте.
В Таблице 2 – по-моему protected не видны из любого класса того же пакета, а только из подклассов.