
- •Конструкторы классов
- •Наследование
- •Модификаторы видимости
- •Перегрузка
- •Полиморфизм
- •Приемы программирования: наследование и полиморфизм
- •Конструктор по умолчанию
- •Вызов конструктора суперкласса
- •Приведение типов
- •Оператор instanceof
- •Анонимные и вложенные классы
- •Модификатор static
- •Модификатор final
- •Абстрактные классы
- •Множественное наследование
- •Описание интерфейса
- •Реализация интерфейса
- •Переменные интерфейсного типа
- •Приемы программирования: пример применения интерфейсов
- •Пакеты и области видимости Пакеты
- •Импортирование пакетов
- •Файловая структура Java-проекта
- •Области видимости классов
- •Области видимости членов класса
- •Области видимости переменных
- •Конфликты имен
- •Ход работы:
- •Задание №1
- •Задание №2
- •Задание №2
- •Задание № 3
- •Контрольные вопросы:
Области видимости классов
Область видимости класса – это участок программы, в котором можно объявлять переменные и создавать объекты этого класса.
Объект, созданный в области видимости своего класса, может продолжать свое существование и за ее пределами. Но переменные типа «невидимого» класса объявить нельзя, поэтому обращаться к такому объекту можно только с помощью переменных типов «видимых» классов-предков. Следовательно, и вызывать можно лишь те методы объекта, которые его класс унаследовал от соответствующего предка.
Обычный класс всегда виден в пределах своего пакета. Если класс является открытым, он виден также из других пакетов (в этом случае к нему надо обращаться, используя полное имя или, если предварительно импортировать пакет, сокращенное).
Вложенные классы, объявленные без модификатора public, видны только в методах содержащего их класса. Классы, описанные в методах, видны только в пределах этих методов.
Анонимные классы видны лишь в пределах команды, которой они создаются.
Области видимости членов класса
Члены класса (методы и атрибуты), объявленные как public, видны везде, где виден сам класс.
Члены класса, объявленные как protected видны в самом классе и его потомках.
Члены класса, объявленные как private, видны только в пределах класса.
Если к члену класса не применяется ни один из модификаторов public, private, protected, он виден в пределах текущего пакета.
«Видимость» поля означает, что его можно использовать в выражениях, передавать в качестве аргумента в методы, изменять его значение с помощью присваивания.
«Видимость» метода означает возможность его вызова.
Для обращения к полям и методам класса используется полное имя, состоящее из имени объекта соответствующего класса и собственно имени атрибута или метода. В теле метода того же класса имя объекта можно опускать (если подразумевается this – объект, для которого вызван данный метод).
Области видимости переменных
Переменные, объявленные в теле метода, видны от места объявления до конца блока, в котором это объявление находится. Границы блока задаются фигурными скобками {}. Поэтому в следующем примере:
{
int x = 0;
}
{
int x = 2;
}
используются две разные переменные x (первая переменная, равная 0, перестает существовать за границами своего блока).
Переменные, являющимися параметрами метода, видны во всем теле метода.
Перечисленные переменные называются локальными переменными. Двух локальных переменных с одинаковыми именами и перекрывающимися областями видимости быть не должно. Нельзя, например, объявить две переменных следующим образом:
int x = 0;
{
int x = 2;
}
Нельзя, в частности, объявлять в теле метода переменную, совпадающую (по имени) с одним из параметров метода.
Конфликты имен
Конфликт имен возникает, если в одной области видимости оказываются два объекта с одинаковыми именами, причем такая ситуация является в языке разрешенной (в противном случае это не конфликт имен, а ошибка в программе).
Конфликт имен возникает, когда импортируются два пакета, содержащие классы с одинаковыми именами.
В этом случае Java отдает предпочтение классу, который был импортирован первым. Для обращения к остальным классам следует использовать их полные имена.
Java «просматривает» имена классов в следующем порядке. Сначала – классы, импортированные поодиночке. Потом – классы, определенные в данном пакете. В последнюю очередь классы из пакетов, импортируемых полностью в порядке следования команд import.
Конфликт имен возникает так же, когда имя одного из параметров метода совпадает с именем одного из атрибутов этого же класса. Такая ситуация возникает довольно часто, поскольку для метода, изменяющего значение этого атрибута, такое называние параметра довольно наглядно. Например:
сlass Dog {
int age;
...
public void setAge(int age) {
...
};
...
}
Такой заголовок метода setAge(int age) лучше, чем использовавшийся нами на прошлом занятии setAge(int a), поскольку сразу позволяет судить о назначении параметра. Однако возникает вопрос: к чему будет относиться имя age в теле этого метода – к атрибуту или к параметру.
Ответ: к параметру. Имя параметра «перекрывает» имя атрибута.
Для того, чтобы обратиться к атрибуту, следует использовать полное имя (т.е. указатель на объект this).
Реализация метода должна выглядеть следующим образом:
public void setAge(int age) {
this.age = age; // проверку диапазона параметра в этом примере проигнорируем
};