![]() |
Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Ограничения при создании классов
• В каждом компилируемом модуле может существовать только один от крытый (public) класс. • Имя открытого класса должно в точности совпадать с именем файла, в котором содержится компилируемый модуль, включая регистр символов. • Компилируемый модуль может вообще не содержать открытых классов (хотя это и не типично). При создании класса с доступом в пределах пакета его поля все равно рекомендуется помечать как private ( всегда нужно по максимуму перекрывать доступ к полям класса ), но методам стоит давать тот же уровень доступа, что имеет и сам класс (в пределах пакета). Класс с пакетным доступом обычно используется только в своём пакете, и делать методы такого класса открытыми (public) стоит только при крайней необходимости — а о таких случаях вам сообщит компилятор. Спецификаторы доступа С помощью спецификаторов доступа можно также указать, какие из классов внутри библиотеки будут доступны для её пользователей. public — член класса является открытым, т.е. доступен программисту- клиенту. private — доступ к члену класса не предоставляется никому, кроме методов этого класса. Другие классы того же пакета также не могут обращаться к private-членам. protected — член класса является закрытым (private) для пользователя класса, но для всех, кто наследует от класса, и для соседей по пакету он доступен. (В Java protected автоматически предоставляет доступ в пределах пакета.) Доступ в пределах пакета (по умолчанию) — член класса доступен для всех остальных классов текущего пакета. Любой закрытый (private) метод в классе косвенно является неизменным (final). Добавление к такому методу ключевого слова final ничего не изменит. Повторное использование классов композиция — механизм построения нового класса из объектов существующих классов (объекты уже имеющихся классов создаются внутри нового класса). class A { void func() { System.out.println(" func of class A" ); } } class B { A objA = new A(); public static void main(String[] args) { B objB = new B(); objB.objA.func(); } } наследование — механизм, когда новый класс создаётся как специализация уже существующего класса. Взяв существующий класс за основу, вы добавляете к нему свой код без изменения существующего класса. class A { void func() { System.out.println(" func of class A" ); } } class B extends A { public static void main(String[] args) { B objB = new B(); objB.func(); } } делегирование — механизм, когда экземпляр существующего класса включается в создаваемый класс (как при композиции), но в то же время все методы встроенного объекта становятся доступными в новом классе (как при наследовании). class A { void func() { System.out.println(" func of class A" ); } } class B { A objA = new A(); void func() { objA.func(); } public static void main(String[] args) { B objB = new B(); objB.func(); } } Пакеты Файл с исходным текстом на Java часто называют компилируемым модулем . Имя каждого компилируемого модуля должно завершаться суффиксом.java, а внутри него может находиться только один открытый (public) класс, имеющий то же имя, что и файл (с заглавной буквы, но без расширения.java). В результате компиляции для каждого класса, определенного в файле.java, создается файл с тем же именем, но с расширением.class. Рабочая программа представляет собой набор однородных файлов.class, которые объединяются в пакет и сжимаются в файл JAR (утилитой Java jar). Интерпретатор Java отвечает за поиск, загрузку и интерпретацию этих файлов. Итак, язык Java позволяет объединять классы в наборы, называемые пакетами. Пакеты облегчают организацию работы и позволяют отделить классы, созданные одним разработчиком, от классов, разработанных другими. Стандартная библиотека Java содержит большое количество пакетов; в качестве примеров можно привести java.lang, java.util, java.net и т. д. Стандартные пакеты языка Java представляют собой иерархические структуры. Подобно каталогам на диске компьютера, пакеты могут быть вложены один в другой. Все стандартные пакеты принадлежат иерархиям java и javax. В основном пакеты используются для обеспечения уникальности имен классов. Предположим, два программиста напишут класс с одинаковым именем. Если эти классы будут находиться в разных пакетах, то конфликта имен не возникнет. Для того, чтобы обеспечить уникальность имени пакета, рекомендуется использовать ваше доменное имя в сети Интернет, записанное в обратном порядке (например, для компании google пакет назывался бы com.google). Далее можно создавать различные подпакеты для гарантии уникальности имен. С точки зрения компилятора между вложенными пакетами нет никакой связи, например, для него пакеты java.util и java.util.jar никак не связаны друг с другом. Каждый из них представляет собой независимую коллекцию классов. Предположим, у вас есть набор из нескольких файлов, которые вы хотите логически объединить в один пакет. Чтобы объявить, что все эти файлы (с расширениями.java и.class) связаны друг с другом, воспользуйтесь ключевым словом package. Тем самым вы объединяете все файлы в пакет. Директива package должна находиться в первой незакомментированной строке файла. Так, команда package access; означает, что данный компилируемый модуль входит в пакет с именем access. Иначе говоря, вы указываете, что открытый класс в этом компилируемом модуле принадлежит имени access и, если кто-то захочет использовать его, ему придется полностью записать или имя класса, или директиву import с access. Заметьте, что по правилам Java имена пакетов записываются только строчными буквами. Доступ к классам из других пакетов можно получить двумя путями. Во-первых, можно указывать полное имя пакета перед именем каждого класса. Например: java.util.Date today = new java.util.Date(); Очевидно, что этот способ слишком утомителен. Более простой и распространенный способ предусматривает применение ключевого слова import. В этом случае имя пакета перед именем класса записывать не обязательно. Импортировать можно как один конкретный класс, так и весь пакет. Оператор import следует поместить в начало исходного файла (после всех директив package). Например, все классы из пакета java.util можно импортировать следующим образом: import java.util.*; После этого в коде можно не указывать имя пакета: Date today = new Date(); Можно также импортировать отдельный класс из пакета: import java.util.Date; Импортировать все классы сразу конечно проще, на размер кода это не влияет. Однако если явным образом указать импортируемый класс, программист может сразу увидеть, какие именно классы будут использованы в программе. Заметим, что оператор import со звездочкой можно применять для импортирования классов только одного пакета. Нельзя использовать обозначение import java.* или import java.*.*, чтобы импортировать все пакеты, имена которых содержат префикс java. Возможен вариант, когда в двух импортируемых пакетах содержатся классы с одинаковым именем, тогда возникнет конфликт имен. import java.util.*; /* оба этих пакета import java.sql.*; содержат классы с именем Date */ Чтобы избежать этого, следует добавить еще один конкретный оператор импорт. Тогда будет использоваться именно тот класс, который конкретно определен. import java.util.*; import java.sql.*; import java.util.Date; Но что делать, если вам на самом деле нужно использовать оба класса с одним именем? В этом случае может помочь только использование полного имени пакета для каждого имени класса в коде. java.util.Date now = new java.util.Date(); java.sql.Date today = new java.sql.Date(); Статический импорт Начиная с пятой версии, в Java появилась возможность импортировать не только классы, но также статические методы и поля. Предположим, что в начало файла вы поместили следующую строку кода: import static java.lang.System.*; Это позволит использовать статические методы и поля, определенные в классе System, не указывая имени класса: out.println(“Hi”); exit(0); Вы также можете явным образом импортировать статические методы или поля: import static java.lang.System.out; Однако, полученный в результате код становится более трудным для восприятия, поэтому статический импорт обычно используется только в двух случаях: 1) При использовании математических функций (импорт статических функций класса Math); 2) При использовании констант из других классов. |
Последнее изменение этой страницы: 2019-06-19; Просмотров: 208; Нарушение авторского права страницы