Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Ограничения при создании классов



• В каждом компилируемом модуле может существовать только один от крытый (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; Просмотров: 180; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.027 с.)
Главная | Случайная страница | Обратная связь