[Java] Урок: Пакеты и области видимости - Форум Cheat-Master.ru
  • Страница 1 из 1
  • 1
Модератор форума: Alowir, Sanoxxx  
[Java] Урок: Пакеты и области видимости
DexT3R Дата: Воскресенье, 03.11.2013, 13:45 | Сообщение # 1
(•̪●)=ε/̵͇̿̿/’̿’̿ ̿ ̿̿ ̿ ̿””
Сообщений: 1978
Статус: Offline
Файлы на компьютерах, располагаются в папках, что позволяет пользователю ориентироваться в них. Также классы в 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;
     }
}

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


НИЧЕГО НЕ ПРОДАЮ В ТЕЛЕГРАММЕ И ВК!!
[WS]Grenhelgets Дата: Понедельник, 01.12.2014, 17:45 | Сообщение # 2
Боец
Статус: Offline
Добавь в скайп nicelse.ws предложение есть.
GlaroX Дата: Четверг, 24.11.2016, 03:05 | Сообщение # 3
Боец
Сообщений: 201
Статус: Offline
Отличный разбор немного изучаю!

  • Страница 1 из 1
  • 1
Поиск:
Статистика Форума