Рубрики

Пакеты на Java

Пакет в Java — это механизм для инкапсуляции группы классов, подпакетов и интерфейсов. Пакеты используются для:

  • Предотвращение конфликтов имен. Например, может быть два класса с именем Employee в двух пакетах: College.staff.cse.Employee и College.staff.ee.Employee
  • Упрощение поиска / размещения и использования классов, интерфейсов, перечислений и аннотаций
  • Предоставление контролируемого доступа: защищенный и по умолчанию имеет контроль доступа на уровне пакета. Защищенный член доступен классам в том же пакете и его подклассах. Элемент по умолчанию (без какого-либо спецификатора доступа) доступен для классов только в одном пакете.
  • Пакеты могут рассматриваться как инкапсуляция данных (или скрытие данных).

Все, что нам нужно сделать, это поместить связанные классы в пакеты. После этого мы можем просто написать класс импорта из существующих пакетов и использовать его в нашей программе. Пакет — это контейнер группы связанных классов, где некоторые классы доступны, а другие хранятся для внутренних целей.
Мы можем повторно использовать существующие классы из пакетов столько раз, сколько нам нужно в нашей программе.

Как работают пакеты?

Имена пакетов и структура каталогов тесно связаны. Например , если имя пакета college.staff.cse, то есть три каталога, колледж, сотрудники и CSE таким образом, что CSE присутствует в штате и персонал присутствует в колледже. Кроме того, каталог колледжа доступен через переменную CLASSPATH , т. Е. Путь родительского каталога колледжа присутствует в CLASSPATH. Идея состоит в том, чтобы убедиться, что классы легко найти.
Соглашения об именах пакетов : пакеты именуются в обратном порядке доменных имен, то есть org.geeksforgeeks.practice. Например, в колледже рекомендуемое соглашение: College.tech.cse, College.Tech.ee, College.art.history и т. Д.

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

Подпакеты: Пакеты, которые находятся внутри другого пакета, являются подпакетами . Они не импортируются по умолчанию, они должны импортироваться явно. Кроме того, члены подпакета не имеют прав доступа, т. Е. Они рассматриваются как разные пакеты для спецификаторов защищенного доступа и доступа по умолчанию.
Пример :

import java.util.*;

util — это подпакет, созданный внутри пакета java .

Доступ к классам внутри пакета

Рассмотрим следующие два утверждения:

// import the Vector class from util package.
import java.util.vector; 

// import all the classes from util package
import java.util.*; 
  • First Statement используется для импорта класса Vector из пакета util , который содержится внутри java .
  • Второе утверждение импортирует все классы из пакета util .
// All the classes and interfaces of this package
// will be accessible but not subpackages.
import package.*;

// Only mentioned class of this package will be accessible.
import package.classname;

// Class name is generally used when two packages have the same
// class name. For example in below code both packages have
// date class so using a fully qualified name to avoid conflict
import java.util.Date;
import my.packag.Date;

// Java-программа для демонстрации доступа к членам, когда
// соответствующие классы импортируются, а не импортируются.

import java.util.Vector;

   

public class ImportDemo

{

   public ImportDemo()

   {

      // java.util.Vector импортируется, следовательно, мы

      // возможность доступа непосредственно в нашем коде.

      Vector newVector = new Vector();

   

      // java.util.ArrayList не импортируется, следовательно

      // мы ссылались на него, используя полный

      // пакет.

      java.util.ArrayList newList = new java.util.ArrayList();

   }

   

   public static void main(String arg[])

   {

      new ImportDemo();

   }

}

Типы пакетов:

Встроенные пакеты
Эти пакеты состоят из большого количества классов, которые являются частью Java API. Некоторые из наиболее часто используемых встроенных пакетов:
1) java.lang: содержит классы поддержки языка (например, классифицированные, которые определяют примитивные типы данных, математические операции). Этот пакет автоматически импортируется.
2) java.io: содержит классы для поддержки операций ввода / вывода.
3) java.util: содержит служебные классы, которые реализуют структуры данных, такие как Linked List, Dictionary и support; для операций Дата / Время.
4) java.applet: содержит классы для создания апплетов.
5) java.awt: содержит классы для реализации компонентов для графических пользовательских интерфейсов (например, кнопки, меню и т. Д.).
6) java.net: содержит классы для поддержки сетевых операций.

Пользовательские пакеты
Это пакеты, которые определены пользователем. Сначала мы создаем каталог myPackage (имя должно совпадать с именем пакета). Затем создайте MyClass внутри каталога с первым оператором, являющимся именами пакетов .

// Name of the package must be same as the directory
// under which this file is saved
package myPackage;

public class MyClass
{
    public void getNames(String s)
    {        
        System.out.println(s);        
    }
}

Теперь мы можем использовать класс MyClass в нашей программе.

/* import 'MyClass' class from 'names' myPackage */
import myPackage.MyClass;

public class PrintName 
{
   public static void main(String args[]) 
   {       
      // Initializing the String variable 
      // with a value 
      String name = "GeeksforGeeks";
      
      // Creating an instance of class MyClass in 
      // the package.
      MyClass obj = new MyClass();
      
      obj.getNames(name);
   }
}

Примечание: MyClass.java должен быть сохранен в каталоге myPackage, так как он является частью пакета.

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

Статический импорт — это функция, представленная в языке программирования Java (версии 5 и выше), которая позволяет членам (полям и методам), определенным в классе как открытая статическая, использоваться в коде Java без указания класса, в котором определено поле.
Следующая программа демонстрирует статический импорт :

// Обратите внимание на статическое ключевое слово после импорта.

import static java.lang.System.*;

   

class StaticImportDemo

{

   public static void main(String args[])

   {      

        // Нам не нужно использовать 'System.out'

        // как импортировано с использованием static.

        out.println("GeeksforGeeks");

   }

}

Выход:

 GeeksforGeeks

Обработка конфликтов имен

Единственный раз, когда нам нужно обратить внимание на пакеты, это когда у нас конфликт имен. Например, оба пакета, java.util и java.sql, имеют класс с именем Date. Поэтому, если мы импортируем оба пакета в программу следующим образом:

import java.util.*;
import java.sql.*;

//And then use Date class, then we will get a compile-time error :

Date today ; //ERROR-- java.util.Date or java.sql.Date?

Компилятор не сможет выяснить, какой класс Date нам нужен. Эта проблема может быть решена с помощью специального оператора импорта:

import java.util.Date;
import java.sql.*;

Если нам нужны оба класса Date, нам нужно использовать полное имя пакета каждый раз, когда мы объявляем новый объект этого класса.
Например:

java.util.Date deadLine = new java.util.Date();
java.sql.Date today = new java.sql.Date();

Структура каталогов

Имя пакета тесно связано со структурой каталогов, используемой для хранения классов. Классы (и другие объекты), принадлежащие конкретному пакету, хранятся вместе в одном и том же каталоге. Кроме того, они хранятся в структуре подкаталогов, указанной в имени пакета. Например, класс Circle пакета com.zzz.project1.subproject2 хранится как «$ BASE_DIR / com / zzz / project1 / subproject2 / Circle.class», где $ BASE_DIR обозначает базовый каталог пакета. Ясно, что «точка» в имени пакета соответствует подкаталогу файловой системы.

Базовый каталог ($ BASE_DIR) может находиться в любом месте файловой системы. Следовательно, компилятор Java и среда выполнения должны быть проинформированы о расположении $ BASE_DIR, чтобы найти классы. Это достигается с помощью переменной среды с именем CLASSPATH. CLASSPATH аналогична другой переменной среды PATH, которая используется командной оболочкой для поиска исполняемых программ.

Настройка CLASSPATH :
CLASSPATH может быть установлен любым из следующих способов:

  • CLASSPATH можно постоянно устанавливать в среде: в Windows выбрать панель управления? Система? Дополнительно? Переменные среды? выбрать «Системные переменные» (для всех пользователей) или «Пользовательские переменные» (только для текущего пользователя)? выбрать «Изменить» (если CLASSPATH уже существует) или «Новый»? Введите «CLASSPATH» в качестве имени переменной? Введите требуемые каталоги и файлы JAR (разделенные точками с запятой) в качестве значения (например, «.; C: / javaproject / classes; d: /tomcat/lib/servlet-api.jar»). Обратите внимание, что вам нужно включить текущий рабочий каталог (обозначенный «.») В CLASSPATH.
    Чтобы проверить текущий параметр CLASSPATH, введите следующую команду:
    > SET CLASSPATH
    
  • CLASSPATH можно временно установить для этого конкретного сеанса оболочки CMD, введя следующую команду:
    > SET CLASSPATH=.;c:\javaproject\classes;d:\tomcat\lib\servlet-api.jar
    
  • Вместо использования переменной среды CLASSPATH вы также можете использовать параметр командной строки -classpath или -cp команд javac и java, например:
    > java –classpath c:\javaproject\classes com.abc.project1.subproject2.MyClass3
    
  • Иллюстрация пользовательских пакетов:
    Создание нашего первого пакета:
    Имя файла — ClassOne.java

    package package_name;

      

    public class ClassOne {

        public void methodClassOne() {

            System.out.println("Hello there its ClassOne");

        }

    }

    Создание нашего второго пакета:
    Имя файла — ClassTwo.java

    package package_one;

      

    public class ClassTwo {

        public void methodClassTwo(){

            System.out.println("Hello there i am ClassTwo");

        }    

    }

    Используя оба созданных пакета:
    Имя файла — Testing.java

    import package_one.ClassTwo;

    import package_name.ClassOne;

      

    public class Testing {

        public static void main(String[] args){

            ClassTwo a = new ClassTwo();

            ClassOne b = new ClassOne();

            a.methodClassTwo();

            b.methodClassOne();

        }

    }

    Выход:

Hello there i am ClassTwo
Hello there its ClassOne

Теперь рассмотрим структуру каталогов пакетов и файла класса тестирования:

Важные моменты:

  1. Каждый класс является частью какого-то пакета.
  2. Если пакет не указан, классы в файле переходят в специальный безымянный пакет (один и тот же безымянный пакет для всех файлов).
  3. Все классы / интерфейсы в файле являются частью одного пакета. Несколько файлов могут указывать одно и то же имя пакета.
  4. Если указано имя пакета, файл должен находиться в подкаталоге с именем name (т. Е. Имя каталога должно совпадать с именем пакета).
  5. Мы можем получить доступ к публичным классам в другом (именованном) пакете, используя: package-name.class-name

Связанная статья: Тест на пакеты в Java
Ссылка: http://pages.cs.wisc.edu/~hasti/cs368/JavaTutorial/NOTES/Packages.html
Эта статья предоставлена Нихилом Мехервалом и Пратиком Агарвалом . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Пакеты на Java

0.00 (0%) 0 votes