Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lection_6_Java

.pdf
Скачиваний:
5
Добавлен:
23.02.2015
Размер:
506.5 Кб
Скачать

Лекция 6. Язык Java

Типы интерфейс и перечисление Пакеты

Содержание:

Тип интерфейс

Объявление интерфейса Реализация интерфейса

Тип перечисление Пакеты

Создание пакетов Имена пакетов

Права доступа к полям и методам класса

Импорт классов и пакетов Java-файлы

Контрольные вопросы

Тимошенко С.И. Сопроводительный материал к лекции №5. Язык Java. Тип массив. Операторы языка

Тип интерфейс

Интерфейс (interface) является ссылочным типом. В отличие от класса, он содержит только константы и заголовки методов без их реализации. Интерфейс может порождаться от других интерфейсов, образуя независимую от классов иерархию. В ней допускается множественное наследование (в классах Java оно не допускается). Типы наследования приведены ниже:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

а) одиночное наследование

б) множественное наследование

 

 

 

 

 

в) ромбовидное наследование

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

Объявление интерфейса

В интерфейсе все методы абстрактные, но указывать в явном виде (писать слово abstract) не надо. Константы всегда статические, однако слова static и final указывать не нужно. Все константы и методы в интерфейсах всегда открыты, но модификатор public не указывается. Модификаторы указывать не обязательно и даже не желательно, чтобы не загромождать код.

Пример:

interface Matter {...}

interface Fish extends Matter {...} interface Wares extends Matter {...} interface Carp extends Fish, Wares {...}

Абстрактные методы и классы

Метод называется абстрактным, если он не определен полно­ стью: записан заголовок и (после списка параметров) точка с запятой. Это указывается компи­ лятору модификатором abstract:

abstract class Fish {

abstract void move();

}

Если класс содержит хоть один абстрактный метод, то он становится абстрактным (это указывается модификатором abstract). Создать его экземпля­ ры не удастся.

Использовать абстрактные классы можно, порождая от них подклассы и переопределяя в них абстрактные методы.

Абстрактные классы группи­ руются на вершине иерархии классов.

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

Тимошенко С.И. Сопроводительный материал к лекции №5. Язык Java. Тип массив. Операторы языка

Реализация интерфейса

Интерфейс — это только набросок или эскиз. В нем указано, что делать, но не указано, как это делать. Используют не интерфейс, а его реализацию (implementation). Реализация интерфейса — это класс, в котором описывают методы одного или нескольких интерфейсов. В заголовке класса после его имени (или имени суперкласса) пишут слово implements и перечисляют имена интерфейсов.

Пример:

interface Matter {...}

interface Fish extends Matter {...} interface Wares extends Matter {...} class Carp implements Fish, Wares {...}

или:

interface Matter {...}

interface Fish extends Matter {...} class Wares implements Matter {...}

class Carp extends Wares implements Fish {...}

Реализация интерфейса может быть неполной: часть методов описаны, часть — нет. Такая реализация — абстрактный класс (необходимо пометить модификатором abstract).

Если некий метод f() описан и в интерфейсе Fish, и в интерфейсе Wares с одинаковой сигнатурой, то реализовать его в классе Carp невозможно. Нужно иначе спроектировать программу.

Простейшее использование интерфейса — использование констант, определенных в нем: interface Colour {

int RED = 0; int GREEN = 1; int BLUE = 2;

}

Сигнатура метода

Имя метода, типы и число параметров образуют сигнатуру (signature) метода. Тип возвра­ щаемого значения не входит в сигнатуру метода.

Дублирование методов называ­ ется их перегрузкой (overloading).

Тимошенко С.И. Сопроводительный материал к лекции №5. Язык Java. Тип массив. Операторы языка

Пример организации полиморфизма с использованием интерфейсов:

interface Wares { } void price();

class Carp implements Wares{ public void price(){

} } System.out.println("Цена карпа за килограмм = 60 рублей");

class Pike implements Wares{ public void price (){

} } System.out.println("Цена щуки за килограмм = 40 рублей");

public class Shop {

public static void main(String[] args){ Wares[] goods = new Wares[2]; goods[0] = new Carp();

goods[1] = new Pike();

} }

for(int i = 0; i < goods.length; i++) goods[i].price();

В примере метод вывода информации о цене price() интерфейса Wares переопределен в классах Carp и Pike. В классе Shop при печати используется метод price() соответствующего класса.

В данном примере можно было бы использовать вместо интерфейса абстрактный класс. Что лучше? На этот вопрос однозначного ответа нет.

При создании абстрактного класса создается и иерархия классов с одиночным наследованием и единым предком Object. При использовании интерфейсов можно свободно проектировать систему, не задумываясь об этих ограничениях.

Замечание

Для правильного выполнения примера слева интерфейс и классы должны быть разбро­ саны по отдельным файлам

Переопределение метода

Если записать метод в подклассе с тем же именем, что и в супер­ классе, то он перекроет метод суперкласса. Произойдет пере­ определение (overriding) метода.

При переопределении метода права доступа к нему можно только расширить, но не сузить.

Если уточнить имя метода сло­ вом super, можно обратиться к методу суперкласса.

Тимошенко С.И. Сопроводительный материал к лекции №5. Язык Java. Тип массив. Операторы языка

Тип перечисление

Перечисление (enum) также является ссылочным типом. С одной стороны, перечисление можно рассматривать как хранилище констант (см. пример с интерфейсом на эту же тему). Например:

enum Colour {RED, GREEN, BLUE} // Тип констант RED и т.д. — Colour

С другой стороны, это полноценный класс, в котором можно определить поля и методы. Все перечисления неявно (не надо указывать extends) наследуют абстрактный класс java.lang.Enum. Можно воспользоваться методами класса Enum для получения ряда характеристик перечисления:

enum Colour {RED, GREEN, BLUE} public class EnumMethods{

public static void main (String[] args) { for (Colour i: Colour.values()) {

System.out.println("Тип: " + i.getDeclaringClass()); System.out.println("Числовое значение: " + i.ordinal());

}

}

}

Обратите внимание на следующие моменты:

по-своему задается перебор всех значений переменной цикла i: наследуемый от класса Enum метод values() дает последовательно ссылку на все значения перечисления;

тип значений перечисления можно узнать с помощью метода getDeclaringClass() класса Enum;

порядковый номер константы, входящей в перечисление, можно узнать методом ordinal() класса Enum.

Константы, входящие в перечисление, рассматриваются как константные вложенные классы. В них можно определять константно-зависимые поля и методы. В примере ниже, взятом из документации, реализован простейший калькулятор переопределением в константах абстрактного метода eval().

Замечание

Перечисления введены в Java начиная с версии J2SE 5.0

Замечание

Для правильного выполнения примера слева перечисление и класс должны быть разброса­ ны по отдельным файлам

Тимошенко С.И. Сопроводительный материал к лекции №5. Язык Java. Тип массив. Операторы языка

Пример простейшего калькулятора: public enum Operation {

PLUS

{double eval(double x, double y){return x + y;}},

MINUS

{double eval(double x, double y){return x - y;}},

MULTIPLY {double

eval(double

x, double y){return x *

y;}},

DIVIDE

{double

eval(double

x, double y){return x /

y;}};

abstract double eval(double x, double y); public static void main(String[] args) {

double x = 49.7, y = 0.3;

for (Operation i: Operation.values()) System.out.println(i.eval(x,y));

}

}

Пакеты

Пакеты (packages) в Java — это способ логически сгруппировать классы. Это необходимо, поскольку количество классов в системе может составлять несколько десятков тысяч. Кроме классов и интерфейсов в пакетах могут находиться вложенные пакеты (subpackages) или подпакеты. Пакеты образуют иерархическую структуру. Синонимами этого слова в других языках являются библиотека или

модуль.

Структура пакетов в точности отображается на структуру файловой системы. Все файлы, образующие один пакет, хранятся в одном каталоге файловой системы.

Каждый пакет создает одно пространство имен (namespace). Поэтому все имена классов, интерфейсов и подпакетов в пакете должны быть уникальны. Имена в разных пакетах могут совпадать, но это будут разные программные единицы.

Например, при использовании двух классов с одинаковыми именами из разных пакетов придется

записать полное имя класса (fully qualified name): пакет.Класс.

Замечание

Для правильного выполнения примера слева весь текст поме­ щается в один файл.

Тимошенко С.И. Сопроводительный материал к лекции №5. Язык Java. Тип массив. Операторы языка

Создание пакетов

Пакет создается в первой строке исходного java-файла по следующему шаблону: package имя_пакета;

Повторяя эту строку в начале каждого исходного файла класса, можно включить этот класс в пакет. Аналогично создается подпакет (вложенный пакет), отделив названия пакета и подпакета точкой:

package имя_пакета.имя_подпакета;

Вложения можно продолжить сколько угодно раз.

Строка package имя_пакетадолжна быть только одна в файле. Таким образом, каждый класс попадает только в один пакет или подпакет.

Имена пакетов

Фирма SUN Microsystems рекомендует записывать имена пакетов строчными буквами, тогда они не будут совпадать с именами классов, которые, по соглашению, начинаются с прописной. Кроме того, фирма SUN советует использовать в качестве имени пакета или подпакета доменное имя своего сайта, записанное в обратном порядке, например:

com.sun.developer

Это обеспечит уникальность имени пакета во всем Internet.

Если пакет не создается, то компилятор для откомпилированных классов создает безымянный пакет (unnamed package), которому соответствует текущий каталог (current working directory) файловой системы. Обычно в нем находятся исходные class-файлы.

Библиотека классов J2SE 5.0 API хранится в пакетах java, javax, org. Пакет java содержит только подпакеты applet, awt, beans, io, lang, math, net, nio, rmi, security, sql, text, util и ни одного класса. Эти пакеты имеют свои подпакеты. Например, java.awt содержит подпакеты color, datatransfer, dnd, event, font, geom, im, image, print.

Состав пакетов меняется от версии к версии.

Тимошенко С.И. Сопроводительный материал к лекции №5. Язык Java. Тип массив. Операторы языка

Права доступа к полям и методам класса

Модификаторы видимости

Класс

Пакет

Пакет и подклассы

Все классы

private

+

 

 

 

по умолчанию

+

+

 

 

(без модификатора)

 

 

 

 

 

 

protected

+

+

*

 

public

+

+

+

+

Из независимого класса можно обратиться только к открытым (public) полям класса другого пакета. Из подкласса можно обратиться еще и к защищенным (protected) полям, но только унаследованным непосредственно, а не через экземпляр суперкласса (в таблице помечено звездочкой).

Пример: Имеется пять классов, размещенных в двух пакетах (см. рисунок ниже)

Вфайле Base.java описаны три класса: Inp1, Base и класс Derivedp1 , расширяющий класс Base. Эти классы размещены в пакете p1. В классе Base определены переменные всех четырех типов доступа, а в методах f() классов Inp1 и Derivedp1 сделана попытка доступа ко всем полям класса Base. Неудачные попытки отмечены комментариями. В комментариях помещены сообщения компилятора.

Вфайле Inp2.java описаны два класса: Inp2 и класс Derivedp2, расширяющий класс Base . Эти классы находятся в другом пакете р2 . В них тоже сделана попытка обращения к полям класса Base. Неудачные попытки прокомментированы сообщениями компилятора.

Класс Base должен быть помечен при своем описании в пакете p1 модификатором public , иначе из пакета р2 не будет видно ни одного его члена.

Модификатор private

Может использоваться в качес­ тве модификатора видимости классов, методов или полей данных.

При использовании в описаниях классов применим только к внутренним классам.

Можно использовать в описа­ ниях методов и полей данных, запрещая доступ к ним из подклассов.

Кроме того, они недоступны из любого другого класса.

Тимошенко С.И. Сопроводительный материал к лекции №5. Язык Java. Тип массив. Операторы языка

Файл Base.java с описанием пакета p1: package p1;

public class Base{

 

private

 

int priv = 0;

 

protected

int pack = 0;

 

int prot = 0;

}

public

 

 

int publ = 0;

class Inp1{

 

 

 

public

void f() {

//

Base

b

= new Base();

b.priv

= 1; // "priv has private access in p1.Base"

 

b.pack

= 1;

 

 

b.prot

= 1;

 

}

} b.publ

= 1;

 

 

 

 

 

class Derivedp1 extends Base{

 

public

void f(Base a) {

//a.priv

=

1; // "priv has private access in p1.Base"

 

a.pack

=

1;

 

 

a.prot

=

1;

 

 

a.publ

=

1;

 

//priv =

1; // "priv has private access in p1.Base"

 

pack =

1;

 

 

 

prot =

1;

 

 

 

publ =

1;

 

 

 

}

 

 

 

}

Тимошенко С.И. Сопроводительный материал к лекции №5. Язык Java. Тип массив. Операторы языка

// a.prot = 1; a.publ = 1;
// priv = 1; // pack = 1;

Файл Inp2.java с описанием пакета р2: package p2;

import p1.Base;

class Inp2{

public static void main(String[] args){ Base b = new Base();

// b.priv = 1; // "priv has private access in p1.Base" // b.pack = 1; // "pack is not public in p1.Base;

// cannot be accessed from outside package" // b.prot = 1; // "prot has protected access in p1.Base"

} } b.publ = 1;

class Derivedp2 extends Base{ public void f(Base a){

// a.priv = 1; // "priv has private access in p1.Base" // a.pack = 1; // "pack is not public in p1.Base; cannot

// be accessed from outside package"

// "prot has protected access in p1.Base"

prot = 1; publ = 1;

// "priv has private access in p1.Base" // "pack is not public in pi.Base; cannot // be accessed from outside package"

} } super.prot = 1;

Тимошенко С.И. Сопроводительный материал к лекции №5. Язык Java. Тип массив. Операторы языка 10

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]