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




· В каждом компилируемом модуле может существовать только один от крытый (public) класс.

· Имя открытого класса должно в точности совпадать с именем файла, в котором содержится компилируемый модуль, включая регистр символов.

· Компилируемый модуль может вообще не содержать открытых классов (хотя это и не типично).

 

При создании класса с доступом в пределах пакета его поля все равно рекомендуется помечать как private (всегда нужно по максимуму перекрывать доступ к полям класса), но методам стоит давать тот же уровень доступа, что имеет и сам класс (в пределах пакета). Класс с пакетным доступом обычно используется только в своём пакете, и делать методы такого класса открытыми (public) стоит только при крайней необходимости — а о таких случаях вам сообщит компилятор.

 

Спецификаторы доступа

С помощью спецификаторов доступа можно также указать, какие из классов внутри библиотеки будут доступны для её пользователей.

public — член класса является открытым, т.е. доступен программисту-клиенту.

private — доступ к члену класса не предоставляется никому, кроме методов этого класса. Другие классы того же пакета также не могут обращаться к private-членам.

protected — член класса является закрытым (private) для пользователя класса, но для всех, кто наследует от класса, и для соседей по пакету он доступен. (В Java protected автоматически предоставляет доступ в пределах пакета.)

Доступ в пределах пакета (по умолчанию) — член класса доступен для всех остальных классов текущего пакета.

 

Любой закрытый (private) метод в классе косвенно является неизменным (final). Добавление к такому методу ключевого слова final ничего не изменит.

 

Повторное использование классов

 

композиция — механизм построения нового класса из объектов существующих классов (объекты уже имеющихся классов создаются внутри нового класса).

class A {

void func() {

System.out.print("func of class A");

}

}

class B {

A objA = new A();

objA.func();

}

 

наследование — механизм, когда новый класс создаётся как специализация уже существующего класса. Взяв существующий класс за основу, вы добавляете к нему свой код без изменения существующего класса.

class A {

void func() {

System.out.print("func of class A");

}

}

class B extends A {

public static void main(String[] args) {

A objA = new A();

B objB = new B();

objB.func();

}

}

 

делегирование — механизм, когда экземпляр существующего класса включается в создаваемый класс (как при композиции), но в то же время все методы встроенного объекта становятся доступными в новом классе (как при наследовании).

class A {

void func() {

System.out.print("func of class A");

}

}

 

class B {

void func() {

objA.func();

}

public static void main(String[] args) {

A objA = new A();

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) При использовании констант из других классов.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: