GrabDuck

Cybern.ru » Java. Урок 30. Пакеты и области видимости

:

Файлы на компьютерах, располагаются в папках, что позволяет пользователю ориентироваться в них. Также классы в Java распределяют по пакетам. Обычно в один пакет кладут классы, которые взаимосвязаны или имеют одного и того же автора. Каждый пакет как и папка имеет свое имя, притом в Java реально создаются папки под ваши пакеты с совпадающим именем. Так как пакеты полностью ассоциируются с папками, то у них существует вложенность, она показывается с помощью точки, например «main.slave» будет означать, что пакет с именем slave находится в пакете main, тоже самое произойдет и с соответствующими папками. Все файлы которые вы создадите в пакете «main.slave» будут хранится в папке slave, очевидно, что классы из этого пакета будут иметь расширение «.java». Для того, чтобы класс находился в определенном пакете используется ключевое слово package. Давайте сначала создадим пакет ru в папочку scr для этого в среде нажмите правой кнопочкой и выберите Package после этого введите имя пакета. Все вы видите пакет с именем ru. Теперь создадим в нем пакет с именем cybern и наконец создадим в нем какой — нить класс:

package ru.cybern;
public class PackageTest {
}

Как вы могли заметить я не случайно создал пакеты с таким именем. В java принято именовать пакеты, которые вы разрабатываете, также как ваш личный сайт или сайт фирмы в которой вы работаете, записанный задом на перед, а дальше уже использовать специфичные имена типа util и прочее. Данная рекомендация присутствует для того, чтобы при подключении различных библиотек не произошел конфликт имен пакетов.
Создадим еще один класс в паке ru.cybern:

package ru.cybern;
public class Test {
public void test(){
PackageTest t = new PackageTest();
}
}

Как мы видим, что для того, чтобы обратиться к классу из того же пакета достаточно просто указать его имя, а теперь создадим класс в пакете ru:

package ru;
public class Test {
public void test(){
ru.cybern.PackageTest t = new ru.cybern.PackageTest();
}
}

Для того, чтобы обратиться к классу из другого пакета необходимо указать полный путь до класса, как это продемонстрировано выше. Как вы могли заметить в разных пакетах могут хранится классы с одинаковыми именами.
Если вы собираетесь часто обращаться к какому — то определенному классу, например к ru.cybern.PackageTest вы можете импортировать себе этот класс, тогда при обращении к нему достаточно будет использовать только его имя, например:

package ru;
import ru.cybern.PackageTest;
public class Test {
public void test() {
PackageTest t = new PackageTest();
}
}

Также можно импортировать весь пакет, для этого после его названия используют *:

import ru.cybern.*;

Такой способ не очень рекомендуется, так как может вызывать конфликт имен. Например, если мы импортируем в любой класс, который находится в пакете ru пакет cybern, то у нас получатся два равноправных класса Test, что может привести к ошибкам.

Файловая структура Java проекта

Давайте еще раз поговорим о структуре проекта. В папочке src располагаются все исходные коды программы. Внутри нее мы можем создавать пакеты, которые ассоциированы с папками. Пакеты могут быть любой вложенности. Любой пакет может содержать файлы кода. Каждый файл с расширением «java» может иметь только один публичный класс или интерфейс, который будет совпадать с названием файла. Очевидно, что все классы, которые не объявлены как public нельзя использовать за пределами пакета. Таким образом все классы и интерфейсы, которые вы собираетесь использовать вне пакета должны быть открытыми, а значит находится в отдельных файлах. Файл с расширением «.java» это обычный текстовый файл, которые можно открыть в любом редакторе. При компиляции приложения для каждого файла кода создается файл с расширением «.class». Они после компиляции будут находится в следующей папочке «имя_проекта\out\production\имя_проекта\». Для запуска проекта необходимо запустить класс, который содержит точку входа в программу (метод main).

Области видимости

Области видимости классов — это такой участок программы, где можно создавать объекты данного класса и обращаться к его статичным членам. Internal (default) и public классы видны внутри своего пакета, а открытые классы видны и из других пакетов через точку или с помощью import. Если класс объявлен внутри другого класса, то он виден только внутри того класса в котором объявлен. Если класс объявлен внутри метода, то он виден только в нем. Анонимные классы видны только в пределах команды, в которой они создаются.
Видимость членов класса — это возможность обращаться к методам и возможность смотреть и изменять поля класса.
Public члены класса видны там же, где виден сам класс. Protected члены классы видны в потомках класса. Private члены видны только внутри класса.
Переменные видны внутри блока, в котором они объявлены, т.е:

{
int x;
//видна
}
//не видна

Как вы помните нельзя создавать переменные с таким же именем, как те которые находятся в области видимости:

int x;
{
int x;//ошибка
}

Например нельзя в методе создать переменную с именем, совпадающем с названием параметра:

public void test(int t) {
PackageTest t = new PackageTest();//ошибка
}

Конфликт имен возникает в программе, когда импортируется два пакета, которые содержат классы с одинаковым именем. Java разрешает эту проблему следующим образом: класс, который был импортирован первым получает возможность быть созданным без точки, а второй класс может быть вызван только с использованием его полного имени. Например, если импортировать в какой — то класс пакеты ru и ru.cybern, то в зависимости от порядка, мы сможем обратиться к тому или иному классу Test.

import ru.Test;
import ru.cybern.*;
public class test {

public static void main(String[] args) {
Test test1 = new Test();//ru.Test
ru.cybern.Test test2 = new ru.cybern.Test();
}
}

Если конфликт имен переменных произошел между параметрами метода и полями класса, то для его разрешения используют ключевое слово this:

public class TestClass {
int key;
public void setKey(int key){
this.key = key;
}
}

На этом мы заканчиваем рассмотрение пакетов и областей видимости.