English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Для лучшей организации классов, Java предоставляет механизм пакетов, который используется для различения имен пространств классов.
1、Сборка классов или интерфейсов с похожими или связанными функциями в один пакет, что упрощает поиск и использование классов.
2、Как папки, пакеты также используют структуру иерархического каталога для хранения. Имена классов в одном пакете различаются, а имена классов в различных пакетах могут быть одинаковыми. При вызове классов с одинаковыми именами из двух различных пакетов, следует добавить имя пакета для различения. Таким образом, пакеты могут предотвратить конфликты имен.
3. Пакет также ограничивает права доступа, только классы с правами доступа к пакету могут доступа к классам в этом пакете.
Java использует механизм пакета (package) для предотвращения конфликта имен, контроля доступа, предоставления поиска и определения классов (class), интерфейсов, энумераций (enumerations) и комментариев (annotations).
Грамматика объявления пакета:
package pkg1[.pkg2[.pkg3...]];
Например, файл Something.java содержит следующее
package net.java.util; public class Something{ ... }
Следовательно, его путь должен быть net/java/util/Something.java Таким образом сохраняется. Функция пакета (package) заключается в том, чтобы классифицировать и сохранять различные java-программы, чтобы их было удобнее вызывать другими java-программами.
Пакет (package) можно определить как группу связанных типов (классы, интерфейсы, энумерации и комментарии), предоставляющих функции защиты доступа и управления命名空间ми для этих типов.
Ниже приведены некоторые пакеты Java:
java.lang- Пакет для базовых классов
java.io- Функции с функциями ввода-вывода
Разработчики могут打包 группу классов и интерфейсов и определить свой пакет. И в реальном разработке это рекомендуется, когда вы завершаете реализацию класса, группировать связанные классы позволяет другим разработчикам легко определить, какие классы, интерфейсы, энумерации и комментарии являются связанными.
Пакет создает новый命名空间 (namespace), поэтому не будет конфликтовать с любыми именами в других пакетах. Использование механизма пакета упрощает реализацию контроля доступа и упрощает определение связанных классов.
При создании пакета вам нужно выбрать подходящее имя для этого пакета. После этого, если в другом исходном файле содержится класс, интерфейс, энумерация или тип комментария, предоставляемый этим пакетом, то декларация этого пакета должна быть放在 начале этого файла.
Декларация пакета должна быть на первом строке исходного файла, каждый файл может содержать только одну декларацию пакета, и все типы в этом файле применяются к нему.
Если в исходном файле не используется声明 пакета, то классы, функции, энумерации, комментарии и т.д. будут放在 анонимном пакете (unnamed package).
Давайте рассмотрим пример, в котором создается пакет под названием animals. Обычно используется строчная字母 для именования, чтобы избежать конфликта с именами классов и интерфейсов.
В пакете animals добавьте интерфейс (interface):
/* Файл: Animal.java */ package animals; interface Animal { public void eat(); public void travel(); }
Далее, добавьте реализацию интерфейса в том же пакете:
package animals; /* Файл: MammalInt.java */ public class MammalInt implements Animal{ public void eat(){ System.out.println("Mammal eats"); } public void travel(){ System.out.println("Mammal travels"); } public int noOfLegs(){ return 0; } public static void main(String args[]){ MammalInt m = new MammalInt(); m.eat(); m.travel(); } }
Затем скомпилируйте эти два файла и поместите их в подкаталог animals. Используйте следующую команду для запуска:
$ mkdir animals $ cp Animal.class MammalInt.class animals $ java animals/MammalInt Mammal eats Mammal travel
Чтобы использовать членов пакета, нужно явно импортировать этот пакет в Java-программе. Это можно сделать с помощью оператора import.
В java-файле import-определения должны быть расположены после определения пакета и всех классов, их можно не указывать, можно указать несколько, их синтаксис имеет следующий формат:
import package1[.package2…].(classname|*);
Если класс в пакете хочет использовать другой класс из того же пакета, имя пакета можно опустить.
Следующий пакет payroll уже содержит класс Employee,接下来向 payroll пакет добавить класс Boss. При использовании класса Boss, который ссылается на класс Employee, можно не использовать префикс payroll, пример класса Boss приведен ниже.
package payroll; public class Boss { public void payEmployee(Employee e) { e.mailCheck(); } }
Если класс Boss не находится в пакете payroll, что будет? Класс Boss должен использовать один из следующих методов для ссылки на классы из других пакетов.
Использование полного имени класса, например:
payroll.Employee
Использование import Ключевое слово для ввода, использование wildcard "*"
import payroll.*;
Использование import Ключевое слово для ввода класса Employee:
import payroll.Employee;
Внимание:
В файле класса может содержаться любое количество импортных объявлений. Импортные объявления должны быть расположены после объявления пакета и до объявления класса.
Размещение класса в пакете имеет два основных результата:
Имя пакета становится частью имени класса, как мы обсуждали ранее.
Имя пакета должно соответствовать структуре каталогов, в которых находятся соответствующие байт-коды.
Ниже приведен один из способов управления своими файлами java:
Разместите исходный код класса, интерфейса и другого типа в одном текстовом файле, имя файла которого соответствует имени этого типа, и добавляется расширение .java. Например:
// Имя файла : Car.java package vehicle; public class Car { // Реализация класса }
Далее, поместите исходный файл в каталог, который соответствует имени пакета, в котором находится класс.
....\vehicle\Car.java
Теперь, правильное имя класса и путь будут выглядеть следующим образом:
Имя класса -> vehicle.Car
Имя пути -> vehicle\Car.java (в операционной системе Windows)
Обычно, компания использует инверсную форму своего интернет-домена в качестве имени пакета. Например: интернет-домен oldtoolbag.com, все имена пакетов начинаются с com.w3codebox. Каждая часть имени пакета соответствует подкаталогу.
Например: есть com.w3codebox.test пакета, который содержит исходный файл с именем w3codebox.java, то, соответственно, должны быть и такие последовательно расположенные подкаталоги:
....\com\w3codebox\test\w3codebox.java
Во время компиляции компилятор создает для каждого класса, интерфейса и другого типа, определенного в пакете, отдельный выводной файл, имя файла которого соответствует имени этого типа, и добавляется расширение .class. Например:
// Название файла: w3codebox.java package com.w3codebox.test; public class w3codebox { } class Google { }
Теперь мы используем опцию -d для компиляции файла, как показано ниже:
$javac -d . w3codebox.java
Таким образом, файлы, скомпилированные, будут размещены следующим образом:
.\com\w3codebox\test\w3codebox.class .\com\w3codebox\test\Google.class
Вы можете импортировать все, как показано ниже: \com\w3codebox\test\ Определенные в нем классы, интерфейсы и т.д.:
импорт com.w3codebox.test.*;
Файлы .class, созданные после компиляции, должны быть расположены так же, как и исходные файлы .java, и их каталоги должны соответствовать имени пакета. Однако, не требуется, чтобы путь файла .class был таким же, как и путь файла .java. Вы можете отдельно организовать каталоги исходных кодов и классов.
<path-one>\sources\com\w3codebox\test\w3codebox.java <path-two>\classes\com\w3codebox\test\Google.class
Таким образом, вы можете поделиться своим каталогом классов с другими программистами, не раскрывая свой исходный код. Управление исходными кодами и файлами классов с помощью этого метода позволяет компилятору и виртуальной машине Java (JVM) найти все типы, используемые в вашем программном обеспечении.
Абсолютный путь к каталогу классов叫做 классовый путь. Установлено в системе переменных CLASSPATH Компилятор и виртуальная машина Java создают путь файла .class, добавляя имя пакета к классовому пути.
<path- two>\classes является классовым путем, именем пакета является com.w3codebox.test, и компилятор и JVM будут искать файлы .class в <path-two>\classes\com\w3codebox\test.
Вероятно, классовый путь может содержать несколько путей, и многопутевые должны быть разделены разделителем. По умолчанию, компилятор и JVM ищут текущий каталог. Файлы JAR содержат классы, связанные с платформой Java, поэтому их каталоги по умолчанию помещены в классовый путь.
Используйте следующую команду для отображения текущей переменной CLASSPATH:
Платформа Windows (под DOS командной строки): C:\> set CLASSPATH
Платформа UNIX (под Bourne shell): # echo $CLASSPATH
Удалить содержимое текущей переменной CLASSPATH:
Платформа Windows (под DOS командной строки): C:\> set CLASSPATH=
Платформа UNIX (под Bourne shell): # unset CLASSPATH; export CLASSPATH
Установить переменную CLASSPATH:
Платформа Windows (под DOS командной строки): C:\> set CLASSPATH=C:\users\jack\java\classes
Платформа UNIX (под Bourne shell): # CLASSPATH=/home/jack/java/classes; export CLASSPATH