[Java] Библиотеки и пакеты
Библиотека Java — это сборник классов. Если программе нужен какой-то класс, то нужно подключить библиотеку, в которой этот класс находится.
Пакеты — это механизм, который служит как для работы с пространством имен, так и для ограничения видимости. У каждого файла .java есть 4 внутренних части.
Общая форма исходного файла Java:
- одиночный оператор package (необязателен)
- любое количество операторов import (необязательны)
- одиночное объявление открытого (public) класса
- любое количество закрытых (private) классов пакета (необязательны)
Оператор package
Сообщает транслятору, в каком пакете должны определяться содержащиеся в данном файле классы. Пакеты задают набор раздельных пространств имен, в которых хранятся имена классов. Если оператор package не указан, классы попадают в безымянное пространство имен, используемое по умолчанию. Если объявляется класс, принадлежащий определенному пакету, например,
package java.awt.image;
то и исходный код этого класса должен храниться в каталоге java/awt/image
Трансляция классов в пакетах
При попытке поместить класс в пакет, вы сразу натолкнетесь на жесткое требование точного совпадения иерархии каталогов с иерархией пакетов. Нельзя переименовать пакет, не переименовав каталог, в котором хранятся его классы. Эта трудность видна сразу, но есть и менее очевидная проблема.
Оператор import
После оператора package, но до любого определения классов в исходном Java-файле, может присутствовать список операторов import. Общая форма оператора import такова:
import пакет1 [.пакет2].(имякласса|*);
Здесь пакет1 — имя пакета верхнего уровня, пакет2 — это необязательное имя пакета, вложенного в первый пакет и отделенное точкой. И, наконец, после указания пути в иерархии пакетов, указывается либо имя класса, либо метасимвол звездочка. Звездочка означает, что, если Java-транслятору потребуется какой-либо класс, для которого пакет не указан явно, он должен просмотреть все содержимое пакета со звездочкой вместо имени класса.
import java.util.Date import java.io.*;
Замечание: Использование * может существенно увеличить время трансляции программы. На скорость работы и размер программы не влияет.
Если в двух пакетах, подключаемых с помощью формы оператора import со звездочкой, есть классы с одинаковыми именами, однако вы их не используете, транслятор не отреагирует. А вот при попытке использовать такой класс, вы сразу получите сообщение об ошибке, и вам придется переписать операторы import, чтобы явно указать, класс какого пакета вы имеете ввиду.
class MyDate extends Java.util.Date { }
Уровни доступа
В языке Java имеется три уровня доступа, определяемых ключевыми словами: private (закрытый), public (открытый) и protected (защищенный).
private | модификатор отсутствует | private protected | protected | public | |
тот же класс | да | да | да | да | да |
подкласс в том же пакете | нет | да | да | да | да |
независимый класс в том же пакете | нет | да | нет | да | да |
подкласс в другом пакете | нет | нет | да | да | да |
независимый класс в другом пакете | нет | нет | нет | нет | да |
- Элемент, объявленный public, доступен из любого места
- Все, что объявлено private, доступно только внутри класса, и нигде больше
- Если у элемента вообще не указан модификатор уровня доступа, то такой элемент будет виден из подклассов и классов того же пакета. (по умолчанию)
- Чтобы элемент был доступен извне пакета, но только подклассам того класса, которому он принадлежит, нужно объявить такой элемент protected
- Чтобы элемент был доступен только подклассам, причем независимо от того, находятся ли они в данном пакете или нет — используйте комбинацию private protected
Небольшой пример
Создаём новый проект и добавляем в папку src новый Пакет "alg" (New -> Package)
В папке пакета создаем класс sort (New -> Java Class)
В новом классе пишем наши уже знакомые функции сортировки с обязательным модификатором доступа public.
В итоге должно получиться следующее:
package alg; public class sort { public void gnom(int[] mas) { int p = 2; int i = 1; for (; i < mas.length; ) { if (mas[i - 1] <= mas[i]) { p++; i = p; } else { int a = mas[i]; mas[i] = mas[i - 1]; mas[i - 1] = a; i--; if (i == 0) { p++; i = p; } } } } public void gnom(double[] mas) { int p = 2; int i = 1; for (; i < mas.length; ) { if (mas[i - 1] <= mas[i]) { p++; i = p; } else { double a = mas[i]; mas[i] = mas[i - 1]; mas[i - 1] = a; i--; if (i == 0) { p++; i = p; } } } } }
Сохраняем. Создаём еще один проект. Или открываем старый.
Добавляем созданый модуль alg также как описывалось в предыдущей статье
Делаем новый класс и пишем туда первой строчкой:
import alg.sort;
Всё. Мы подключили наш пакет с функциями сортировки!
Дописываем функцию main
В итоге:
import alg.sort; class Hello { public static void main(String args[]) { int masI[] = {5, 5, 9, 8, 0, -5, 9, 10}; double masD[] = {5.9, 5.7, 9.6, 8.9, 0.7, -5.6, 9.9, 10.0}; sort s1 = new sort(); s1.gnom(masI); s1.gnom(masD); }
Нет обратных ссылок на эту запись.
Leave a comment