Пакеты и интерфейсы
Пакет (package) — это некий контейнер, который используется для того, чтобы изолировать имена классов. Например, вы можете создать класс List, заключить его в пакет и не думать после этого о возможных конфликтах, которые могли бы возникнуть если бы кто-нибудь еще создал класс с именем List.
Интерфейс — это явно указанная спецификация набора методов, которые должны быть представлены в классе, который реализует эту спецификацию. Реализация же этих методов в интерфейсе отсутствует. Подобно абстрактным классам интерфейсы обладают замечательным дополнительным свойством — их можно многократно наследовать. Конкретный класс может быть наследником лишь одного суперкласса, но зато в нем может быть реализовано неограниченное число интерфейсов.
Пакеты
Все идентификаторы, которые мы до сих пор использовали в наших примерах, располагались в одном и том же пространстве имен (name space). Это означает, что нам во избежание конфликтных ситуаций приходилось заботиться о том, чтобы у каждого класса было свое уникальное имя. Пакеты — это механизм, который служит как для работы с пространством имен, так и для ограничения видимости. У каждого файла .java есть 4 одинаковых внутренних части, из которых мы до сих пор в наших примерах использовали только одну. Ниже приведена общая форма исходного файла Java.
- одиночный оператор package (необязателен)
- любое количество операторов import (необязательны)
- одиночное объявление открытого (public) класса
- любое количество закрытых (private) классов пакета (необязательны)
Оператор package
Первое, что может появиться в исходном файле Java — это оператор package, который сообщает транслятору, в каком пакете должны определяться содержащиеся в данном файле классы. Пакеты задают набор раздельных пространств имен, в которых хранятся имена классов. Если оператор package не указан, классы попадают в безымянное пространство имен, используемое по умолчанию. Если вы объявляете класс, как принадлежащий определенному пакету, например,
package java.awt.image;
то и исходный код этого класса должен храниться в каталоге java/awt/image.
Замечание
Каталог, который транслятор Java будет рассматривать, как корневой для иерархии пакетов, можно задавать с помощью переменной окружения СLASSPATH. С помощью этой переменной можно задать несколько корневых каталогов для иерархии пакетов (через ; как в обычном PATH).
Трансляция классов в пакетах
При попытке поместить класс в пакет, вы сразу натолкнетесь на жесткое требование точного совпадения иерархии каталогов с иерархией пакетов. Вы не можете переименовать пакет, не переименовав каталог, в котором хранятся его классы. Эта трудность видна сразу, но есть и менее очевидная проблема.
Представьте себе, что вы написали класс с именем PackTest в пакете test. Вы создаете каталог test, помещаете в этот каталог файл PackTest.Java и транслируете. Пока — все в порядке. Однако при попытке запустить его вы получаете от интерпретатора сообщение «can’t find class PackTest» («He могу найти класс PackTest»).
Ваш новый класс теперь хранится в пакете с именем test, так что теперь надо указывать всю иерархию пакетов, разделяя их имена точками — test.PackTest. Кроме того Вам надо либо подняться на уровень выше в иерархии каталогов и снова набрать , либо внести в переменную CLASSPATH каталог, который является вершиной иерархии разрабатываемых вами классов.
Оператор import
После оператора package, но до любого определения классов в исходном Java-файле, может присутствовать список операторов import. Пакеты являются хорошим механизмом для отделения классов друг от друга, поэтому все встроенные в Java классы хранятся в пакетах. Общая форма оператора import такова:
import пакет1 [.пакет2].(имякласса|*);
Здесь пакет1 — имя пакета верхнего уровня, пакет2 — это необязательное имя пакета, вложенного в первый пакет и отделенное точкой. И, наконец, после указания пути в иерархии пакетов, указывается либо имя класса, либо метасимвол звездочка. Звездочка означает, что, если Java-транслятору потребуется какой-либо класс, для которого пакет не указан явно, он должен просмотреть все содержимое пакета со звездочкой вместо имени класса. В приведенном ниже фрагменте кода показаны обе формы использования оператора import :
import java.util.Date import java.io.*;
Замечание
Но использовать без нужды форму записи оператора import с использованием звездочки не рекомендуется, т.к. это может значительно увеличить время трансляции кода (на скорость работы и размер программы это не влияет).
Все встроенные в Java классы, которые входят в комплект поставки, хранятся в пакете с именем java. Базовые функции языка хранятся во вложенном пакете java.lang. Весь этот пакет автоматически импортируется транслятором во все программы. Это эквивалентно размещению в начале каждой программы оператора
import java.lang.*;
Если в двух пакетах, подключаемых с помощью формы оператора im-port со звездочкой, есть классы с одинаковыми именами, однако вы их не используете, транслятор не отреагирует. А вот при попытке использовать такой класс, вы сразу получите сообщение об ошибке, и вам придется переписать операторы import, чтобы явно указать, класс какого пакета вы имеете ввиду.
class MyDate extends Java.util.Date
Ограничение доступа
Java предоставляет несколько уровней защиты, обеспечивающих возможность тонкой настройки области видимости данных и методов. Из-за наличия пакетов Java должна уметь работать еще с четырьмя категориями видимости между элементами классов :
- Подклассы в том же пакете.
- Не подклассы в том же пакете.
- Подклассы в различных пакетах.
- Классы, которые не являются подклассами и не входят в тот же пакет.
В языке Java имеется три уровня доступа, определяемых ключевыми словами: private (закрытый), public (открытый) и protected (защищенный), которые употребляются в различных комбинациях. Содержимое ячеек таблицы определяет доступность переменной с данной комбинацией модификаторов (столбец) из указанного места (строка).
| private | модификатор отсутствует | private protected | protected | public | |
| тот же класс | да | да | Да | да | да |
| подкласс в том же пакете | нет | да | Да | да | да |
| независимый класс в том же пакете | нет | да | Нет | да | да |
| подкласс в другом пакете | нет | нет | Да | да | да |
| независимый класс в другом пакете | нет | нет | Нет | нет | да |
На первый взгляд все это может показаться чрезмерно сложным, но есть несколько правил, которые помогут вам разобраться. Элемент, объявленный public, доступен из любого места. Все, что объявлено private, доступно только внутри класса, и нигде больше. Если у элемента вообще не указан модификатор уровня доступа, то такой элемент будет виден из подклассов и классов того же пакета.
Именно такой уровень доступа используется в языке Java по умолчанию. Если же вы хотите, чтобы элемент был доступен извне пакета, но только подклассам того класса, которому он принадлежит, вам нужно объявить такой элемент protected. И наконец, если вы хотите, чтобы элемент был доступен только подклассам, причем независимо от того, находятся ли они в данном пакете или нет — используйте комбинацию private protected.
Ниже приведен довольно длинный пример, в котором представлены все допустимые комбинации модификаторов уровня доступа. В исходном коде первого пакета определяется три класса: Protection, Derived и SamePackage. В первом из этих классов определено пять целых переменных — по одной на каждую из возможных комбинаций уровня доступа.
Переменной n приписан уровень доступа по умолчанию, n_pri — уровень private, n_pro — protected, n_pripro — private protected и n_pub — public. Во всех остальных классах мы пытаемся использовать переменные первого класса.
Те строки кода, которые из-за ограничения доступа привели бы к ошибкам при трансляции, закомментированы с помощью однострочных комментариев (//) — перед каждой указано, откуда доступ при такой комбинации модификаторов был бы возможен. Второй класс — Derived — является подклассом класса Protection и расположен в том же пакете р1. Поэтому ему доступны все перечисленные переменные за исключением n_pri. Третий класс, SamePackage, расположен в том же пакете, но при этом не является подклассом Protection. По этой причине для него недоступна не только переменная n_pri, но и n_pripro, уровень доступа которой — private protected.
package р1; public class Protection < int n = 1; private int n_pri = 2; protected int n_pro = 3; private protected int n_pripro = 4; public int n_pub = 5; public Protection() < System.out.println(«base constructor»); System.out.println(«n=»+n); System.out.println(«n_pri=»+n_pri); System.out.println(«n_pro=»+n_pro); System.out.println(«n_pripro=»+n_pripro); System.out.println(«n_pub=»+n_pub); >> class Derived extends Protection < Derived() < System.out.println(«derived constructor»); System.out.println(«n = » + n); // только в классе // System.out.println(«n_pri=»+n_pri); System.out.println(«n_pro=»+n_pro); System.out.println(«n_pripro=»+n_pripro); System.out.println(«n_pub=»+n_pub); >> class SamePackage < SamePackage() < Protection p = new Protection(); System.out.println(«same package constructor»); System.out.println(«n=»+p.n); // только в классе // System.out.println(«n_pri=»+p.n_pri); System.out.println(«n_pro=»+p.n_pro); // только в классе и подклассе // System.out.println(«n_pripro=»+p.n_pripro): System.out.println(«n_pub callback called with » + p); >>
В очередном примере метод callback интерфейса, определенного ранее, вызывается через переменную — ссылку на интерфейс:
class TestIface < public static void main(String args[]) < Callback с = new client(); c.callback(42); >>
Ниже приведен результат работы программы:
С:> Java TestIface callback called with 42
Переменные в интерфейсах
Интерфейсы можно использовать для импорта в различные классы совместно используемых констант. В том случае, когда вы реализуете в классе какойлибо интерфейс, все имена переменных этого интерфейса будут видимы в классе как константы. Это аналогично использованию файлов-заголовков для задания в С и C++ констант с помощью директив #define или ключевого слова const в Pascal / Delphi.
Если интерфейс не включает в себя методы, то любой класс, объявляемый реализацией этого интерфейса, может вообще ничего не реализовывать. Для импорта констант в пространство имен класса предпочтительнее использовать переменные с модификатором final. В приведенном ниже примере проиллюстрировано использование интерфейса для совместно используемых констант.
import java.util.Random; interface SharedConstants < int NO = 0; int YES = 1; int MAYBE = 2; int LATER = 3; int SOON = 4; int NEVER = 5; >class Question implements SharedConstants < Random rand = new Random(); int ask() < int prob = (int) (100 * rand.nextDouble()); if (prob
Обратите внимание на то, что результаты при разных запусках программы отличаются, поскольку в ней используется класс генерации случайных чисел Random пакета java.util. Описание этого пакета приведено в главе 12.
С:> Java AskMe Later Scon No Yes
Использование пакетов
Теперь вы обладаете полной информацией для создания собственных пакетов классов. Легко понимаемые интерфейсы позволят другим программистам использовать ваш код для самых различных целей.
Инструменты, которые вы приобрели, изучив эту и предыдущую главы, должны вам помочь при разработке любых объектно-ориентированных приложений. В дальнейшем вы познакомитесь с некоторыми важными специфическими свойствами Java, которые представлены в виде классов в пакете java.lang. В трех последующих главах вы освоите работу с текстовыми строками, параллельное программирование и обработку исключительных ситуаций.
Источник: codenet.ru
Java import что это за программа
Как правило, в Java классы объединяются в пакеты. Пакеты позволяют организовать классы логически в наборы. По умолчанию java уже имеет ряд встроенных пакетов, например, java.lang , java.util , java.io и т.д. Кроме того, пакеты могут иметь вложенные пакеты.
Организация классов в виде пакетов позволяет избежать конфликта имен между классами. Ведь нередки ситуации, когда разработчики называют свои классы одинаковыми именами. Принадлежность к пакету позволяет гарантировать однозначность имен.
Чтобы указать, что класс принадлежит определенному пакету, надо использовать директиву package , после которой указывается имя пакета:
package название_пакета;
Как правило, названия пакетов соответствуют физической структуре проекта, то есть организации каталогов, в которых находятся файлы с исходным кодом. А путь к файлам внутри проекта соответствует названию пакета этих файлов. Например, если классы принадлежат пакету mypack, то эти классы помещаются в проекте в папку mypack.
Классы необязательно определять в пакеты. Если для класса пакет не определен, то считается, что данный класс находится в пакете по умолчанию, который не имеет имени.
Например, создадим в папке для исходных файлов каталог study . В нем создадим файл Program.java со следующим кодом:
package study; public class Program < public static void main(String[] args) < Person kate = new Person(«Kate», 32); kate.displayInfo(); >> class Person < String name; int age; Person(String name, int age)< this.name = name; this.age = age; >void displayInfo() < System.out.printf(«Name: %s t Age: %d n», name, age); >>
Директива package study в начале файла указывает, что классы Program и Person, которые здесь определены, принадлежат пакету study.
Когда мы работаем в среде разработки, например, в Netbeans, то IDE берет на себя все вопросы компиляции пакетов и входящих в них файлов. Соответственно нам достаточно нажать на кнопку, и все будет готово. Однако если мы компилируем программу в командной строке, то мы можем столкнуться с некоторыми трудностями. Поэтому рассмотрим этот аспект.
Для компиляции программы вначале в командной строке/терминале с помощью команды cd перейдем к папке, где находится каталог study.
cd C:java
Например, в моем случае это каталог C:java (то есть файл с исходным кодом расположен по пути C:javastudyProgram.java).
Для компиляции выполним команду
javac studyProgram.java
После этого в папке study появятся скомпилированные файлы Program.class и Person.class. Для запуска программы выполним команду:
java study.Program
Импорт пакетов и классов
Если нам надо использовать классы из других пакетов, то нам надо подключить эти пакеты и классы. Исключение составляют классы из пакета java.lang (например, String ), которые подключаются в программу автоматически.
Например, знакомый по прошлым темам класс Scanner находится в пакете java.util , поэтому мы можем получить к нему доступ следующим способом:
java.util.Scanner in = new java.util.Scanner(System.in);
То есть мы указываем полный путь к файлу в пакете при создании его объекта. Однако такое нагромождение имен пакетов не всегда удобно, и в качестве альтернативы мы можем импортировать пакеты и классы в проект с помощью директивы import , которая указывается после директивы package:
package study; import java.util.Scanner; // импорт класса Scanner public class Program < public static void main(String[] args) < Scanner in = new Scanner(System.in); >>
Директива import указывается в самом начале кода, после чего идет имя подключаемого класса (в данном случае класса Scanner).
В примере выше мы подключили только один класс, однако пакет java.util содержит еще множество классов. И чтобы не подключать по отдельности каждый класс, мы можем сразу подключить весь пакет:
import java.util.*; // импорт всех классов из пакета java.util
Теперь мы можем использовать любой класс из пакета java.util.
Возможна ситуация, когда мы используем два класса с одним и тем же названием из двух разных пакетов, например, класс Date имеется и в пакете java.util , и в пакете java.sql . И если нам надо одновременно использовать два этих класса, то необходимо указывать полный путь к этим классам в пакете:
java.util.Date utilDate = new java.util.Date(); java.sql.Date sqlDate = new java.sql.Date();
Статический импорт
В java есть также особая форма импорта — статический импорт. Для этого вместе с директивой import используется модификатор static :
package study; import static java.lang.System.*; import static java.lang.Math.*; public class Program < public static void main(String[] args) < double result = sqrt(20); out.println(result); >>
Здесь происходит статический импорт классов System и Math. Эти классы имеют статические методы. Благодаря операции статического импорта мы можем использовать эти методы без названия класса. Например, писать не Math.sqrt(20) , а sqrt(20) , так как функция sqrt() , которая возвращает квадратный корень числа, является статической. (Позже мы рассмотрим статические члены класса).
То же самое в отношении класса System: в нем определен статический объект out , поэтому мы можем его использовать без указания класса.
Источник: metanit.com
Пакеты
Обычно проект содержит большое количество классов и держать их в одном каталоге крайне неудобно. Кроме того, может возникнуть ситуация, когда два программиста создали класс с одинаковым названием. Для решения этих проблем в Java существует такой механизм как пакеты. Пакеты по своей сути очень похожи на каталоги файловой системы и должны совпадать с ней.
В следующем примере мы демонстрируем как добавить класс MyFirstApp в пакет lesson1 .
Для добавления класса в пакет, используется оператор package , который задается всегда первой строкой в файле. А также этот класс должен находиться в одноименном нашему пакету каталоге — lesson1 . Вот и все.
package lesson1; public class MyFirstApp < public static void main(String[] args) throws Exception < System.out.print(«Hello world. «); >>
Java также предоставляет возможность создания многоуровневого пакета. В этом примере мы добавляем класс MyFirstApp в пакет com.examclouds.javabasics.lesson1 и соответственно в каталог com/examclouds/javabasics/lesson1 .
package com.examclouds.javabasics.lesson1; public class MyFirstApp < public static void main(String[] args) throws Exception < System.out.print(«Hello world. «); >>
Существуют также правила для наименования пакетов. Для коммерческих проектов пакет должен начинаться с com, потом следует имя организации и название проекта. Потом пакеты обычно именуются по какому-то функциональному признаку. В примере 2 наименование пакета соответствует этому правилу.
Полное имя класса включает в себя название пакета. В примере 1 полное имя класса — lesson1.MyFirstApp , а в примере 2 — com.examclouds.javabasics.lesson1.MyFirstApp .
Кроме разделения пространств имен классов, пакеты также служат для управления доступностью объектов. В пакете можно определить классы, недоступные для кода за пределами этого пакета. В нем можно также определить члены класса, доступные только другим членам этого же пакета. Благодаря такому механизму классы могут располагать полными сведениями друг о друге, но не предоставлять эти сведения остальному миру.
2. Импорт пакетов
Хорошей практикой считается добавлять классы в пакеты. Но так как полное имя класса включает в себя имя пакета, в коде это может привести к достаточно длинным строкам, что крайне неудобно. Для решения этой проблемы в Java придуман такой механизм как импорт. Оператор import позволяет импортировать класс, после чего к нему можно обращаться просто по имени.
2.1. Использование класса из другого пакета
Рассмотрим пример, в котором имеется два класса находящихся в разных пакетах — first.Example1 и second.Example2 :
package first; public class Example1 < public static void main(String[] args) < second.Example2 example2 = new second.Example2(); System.out.print(«Done!»); >>
package second; public class Example2
Класс first.Example1 создает экземпляр объекта second.Example2 , указывая его полное имя. Очевидно, что указывать полное имя класса не очень удобно, особенно если класс находится в многоуровневом пакете.
2.2. Использование оператора import
Перепишем класс first.Example1 используя оператор import :
package first; import second.Example2; public class Example1 < public static void main(String[] args) < Example2 example2 = new Example2(); System.out.print(«Done!»); >>
В языке Java операторы import всегда пишутся после оператора package , и перед определением класса.
Разные варианты написания import:
import java.util.regex.Matcher; import java.time.*;
Существует один пакет, классы которого импортируются в код по умолчанию. Это пакет jаva.lang, в котором находятся наиболее часто используемые классы.
Вы можете импортировать два пакета, в которых находятся классы с одинаковыми именами. Но обращаться к ним по короткому имени будет ошибкой — компилятор не сможет определить какой именно класс вам нужен. Поэтому к таким классам придется обращаться только по полному имени.
При импорте пакета, доступны только publiс классы этого пакета. Например, в следующем примере класс MyClass импортирует весь пакет p1 . Но ему будут доступен только AClass . BClass недоступен, так как он не public .
package p1; public class AClass < >class BClass
package p2; import p1.*; public class MyClass < public static void main(String[] args) < AClass aClass = new AClass(); BClass bClass = new BClass(); //ошибка компиляции. Класс недоступен, т. к. он не public >>
- Используем оператор package для объявления пакета, который задается всегда первой строкой в файле.
- Если оператора package нет, то классы добавляются в пакет по умолчанию, у которого нет имени.
- Класс должен находиться в одноименном нашему пакету каталоге файловой системы.
- Можно (и нужно) создавать иерархию пакетов. Для разделения используется точка.
- Один пакет может содержать множество классов.
- Полное имя класса включает в себя название пакета.
- Пакеты служат и для управления доступностью объектов.
- В языке Java операторы import всегда пишутся после оператора package , и перед написанием класса.
- Классы пакета jаva.lang импортируются компилятором неявно.
Презентацию с видео можно скачать на Patreon .
- Создание первого приложения
- Установка JDK
- Команды командной строки (CMD)
- Компиляция и запуск приложения из командной строки
- Компиляция с помощью -sourcepath
- Classpath
- JAR-Файлы
- Аргументы командной строки
- Создание проекта в IntelliJ IDEA
- Задания
Источник: www.examclouds.com
Импорт пакетов в Java
Если вспомнить, что пакеты предлагают эффективный механизм изоляции различных классов друг от друга, то становится понятно, почему все встроенные классы Java хранятся в пакетах.
Ни один из основных классов Java не хранится в неименованном пакете, используемом по умолчанию. Все стандартные классы непременно хранятся в каком-нибудь именованном пакете.
А поскольку в самих пакетах классы должны полностью определяться по именам их пакетов, то длинное, разделяемое точками имя пути к пакету каждого используемого класса может оказаться слишком громоздким.
Следовательно, чтобы отдельные классы или весь пакет можно было сделать доступными, в Java внедрен оператор import.
После того как класс импортирован, на него можно ссылаться непосредственно, используя только его имя.
Оператор import служит только для удобства программирования и не является обязательным с формальной точки зрения для создания завершенной программы нa java.
Но если в прикладном коде приходится ссылаться на несколько десятков классов, то оператор import значительно сокращает объем вводимого исходного кода.
В исходном файле программы нa java операторы import должны следовать непосредственно за оператором package (если таковой имеется) и перед любыми определениями классов.
Оператор import имеет следующую общую форму:
Источник: pro-java.ru
Java import что это за программа
Буду оставлять посты в каждой лекции, если нет моегг сообщения ) Вы меня обогнали ))) Просьба , оставить похожий пост ))) Обьясние, где почитать ьез знаний английского языка о последних задачах. ПОчему там в <> этих скобках у ArrayLIst написаны lang и прочее? Что это значит?
Алексей Wel Уровень 26
5 сентября 2022
Буду оставлять посты в каждой лекции, если нет моегг сообщения ) Вы меня обогнали ))) Просьба , оставить похожий пост )))
John Wick Уровень 15
3 сентября 2022
Вот вроде и просто все, но иногда складывается ощущение что читаешь не на русском а на китайском, смысл вроде и понял, но тут же забыл.
Anonymous #3113984 Уровень 51
16 августа 2022
*Об примечании 1* Из «Чистого Кода» помню, что если используешь 2+ импорта с одинаковой «первой частью», тогда желательно использовать «версию для ленивых». ДО:
import java.util.Arrays; import java.util.Scanner;
ПОСЛЕ:
import java.util.*;
P.S. поправьте, если я не прав или что-то забыл
Алексей Хрусталев Уровень 11
28 июля 2022
Отдых, отдых, одтых пока не отдохнул не мог понять тему
MineJavaAcc Уровень 41
19 июля 2022
Среда IDEA подсвечивает классы и методы, которые не может найти.
То есть в задаче Импорты Part 1 можно построчно комментировать import и смотреть какой класс/метод подсветился красным. Потом нажать «проверку» и увидеть, что String это тоже сторонний класс )))
MineJavaAcc Уровень 41
19 июля 2022
Я уже написал порядка 10-15 комментариев, но когда я редактирую, то привык ходить по словам с помощью CTRL + стрелка. А этот «умный» сайт таким образом листает лекции. Ну то есть 100% сайтов в сети нормально реагируют на эту комбинацию а только JavaRush «умный». Поэтому 10-15 комментариев я не написал. Ну не понимаю я, как это открывать внешний редактор, чтобы написать комментарий на сайт.
Если бы он запоминал мой комментарий, когда я вернулся, я бы слово «умный» в кавычки не ставил. Да и вообще не замечал этой проблемы.
Источник: javarush.ru