Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metoda_OOP.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2 Мб
Скачать
☆

2.2.5Видимость имен

Проблема каждого языка программирования состоит в управлении именами. Если использовать имена в одном модуле программы, а другой программист использует эти же имена в другом модуле, возникает проблема как отличить одно имя от другого и предохранить два имени от “конфликта”? В C это обычная проблема, поэтому программы часто содержат неуправляемое море имен. Классы C++ (на которых основываются классы Java) содержат функции внутри классов, так что они не могут конфликтовать с именами функций, расположенных в других классах.

В Java для производства недвусмысленных имен для библиотеки используется спецификатор, мало чем отличающийся от доменных имен Internet. Фактически, создатели Java хотят использовать доменные имена Internet в обратном порядке, так как это гарантирует их уникальность. Например: ua.cn.stu.oop.labs.

Этот механизм означает, что все файлы автоматически живут в своем собственном пространстве имен, и каждый класс в файле должен иметь уникальный идентификатор.

2.2.6Использование других компонентов

Когда требуется использовать предопределенные классы в программе, компилятор должен знать, где они расположены. Конечно, класс может существовать в том же самом файле исходного кода, из которого он вызывается. В этом случае просто используется класс — даже если класс определен дальше по файлу. Java устранит проблему “ранней ссылки”, так что нет необходимости думать об этом.

Решение проблемы использования класса, определенного в другом файле, выполняется путем точного сообщения компилятору Java классов, которые не обходимо использовать, с помощью ключевого слова import. import говорит компилятору о введении пакета, который является библиотекой классов.

import java.util.ArrayList;

Пакет util содержит несколько классов, и можно использовать некоторые из них, не объявляя их точно. Это легче всего выполнить, используя ‘*’. Это более общий способ для импорта набора классов, в отличие от индивидуального импорта каждого класса.

import java.util.*;

2.2.7Ключевое слово static

Обычно, когда создается класс, описывается, как выглядит объект класса и как он будет себя вести. На самом деле ничего не получается, пока не создается объект класса с помощью new, и в этом месте создается хранилище данных, и становятся доступными методы.

Но есть две ситуации, в которых этот подход не достаточен. Один из них, если требуется иметь только одну часть хранилища для определенных данных, не зависимо от того, сколько объектов создано, или даже если не было создано объектов этого класса. Второй, если нужен метод, который не ассоциируется с объектом определенного класса. То есть, нужен метод, который можно вызвать, даже если объект не создан. Можно достигнуть этих эффектов с помощью ключевого слова static. Когда говорится о чем-то static, это означает, что данные или метод не привязаны к определенному экземпляру объекта класса. Даже если никогда не создавать объект этого класса, можно вызвать статический метод или получить доступ к части статических данных. Так как статическим методам не нужно создавать объект до их использования, они не могут получить прямой доступ к не статическим членам или методам простым вызовом этих методов без указания имени объекта (так как не статические члены и методы должны быть привязаны к определенному объекту).

Некоторые объектно-ориентированные языки используют термины данные класса и методы класса в том смысле, что данные и методы существуют только для класса, как целое, а не для любого определенного объекта класса. Иногда литература по Java тоже использует эти термины.

Чтобы сделать член-данное или член-метод статическим, необходимо просто поместить ключевое слово перед определением. Например, следующий код производит статический член-данное и инициализирует его:

class StaticTest {

static int i = 47;

}

Теперь, даже если создать два объекта StaticTest, будет только одна часть хранилища для StaticTest.i. Оба объекта будут разделять одну и ту же i. Например:

StaticTest st1 = new StaticTest();

StaticTest st2 = new StaticTest();

В этом месте и st1.i, и st2.i имеют одно и то же значение 47, так как они ссылаются на одну и ту же область памяти.

Есть два способа сослаться на статическую переменную. Как показано выше, можно назвать ее через объект, например, сказав st2.i. Также можете прямо сослаться через имя класса, что нельзя сделать с не статическими членами. (Это предпочтительный способ сослаться на статическую переменную, та как это подчеркивает, что переменная имеет статическую природу.)

StaticTest.i++;

Оператор ++ инкрементирует переменную. В этом месте и st1.i, и st2.i будут иметь значение 48.

Сходная логика применима и к статическим методам. Можно сослаться на статический метод либо через объект, как можно сделать с любым методом, или с помощью специального дополнительного синтаксиса ClassName.method( ). Статический метод определяется сходным образом:

class StaticFun {

static void incr() { StaticTest.i++; }

}

Метод incr() класса StaticFun инкрементирует статическую переменную i. Можно вызвать incr() обычным способом, через объект:

StaticFun sf = new StaticFun();

sf.incr();

Или можно вызвать его прямо через класс:

StaticFun.incr();

Когда static применяется к членам-данным, это изменяет путь создания данных (один экземпляр для всего класса против не статического: один для каждого объекта). Важность использования static для методов в том, чтобы позволить вызывать этот метод без создания объекта.

Как и любой метод, статический метод может создавать или использовать именованные объекты того же типа.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]