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

Доступность полей/методов классов

Тип доступа

public protected package private

Откуда доступ

 

 

 

 

Сам класс

да

да

да

да

Класс в том же

да

да

да

нет

пакете

 

 

 

 

Наследник в другом

да

да

нет

нет

пакете

 

 

 

 

Класс не наследник в

да

нет

нет

нет

другом пакете

 

 

 

 

Абстрактные классы

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

[ accessSpecifier ] retValueDataType methodName ( [ argumentList ] );

Нет тела и в списке спецификаторов доступа должно быть слово abstract.

Любой класс, имеющий абстрактный метод, автоматически становится абстрактным и должен быть объявлен как abstract.

Нельзя создавать ни одного экземпляра абстрактного класса.

Если подкласс абстрактного класса, не реализует всех методов, объявленных как abstract, то этот подкласс сам является абстрактным.

Экземпляры подкласса абстрактного класса, можно создавать только в том случае, если в нем все методы, объявленные в суперклассе как abstract, замещены и реализованы (то есть имеют тело).

Методы, объявленные как static, private и final, не могут быть объявлены как abstract, поскольку такие методы не могут быть замещены подклассами. Точно так же класс, объявленный как final, не может содержать методов, объявленных как abstract.

Класс может быть объявлен как abstract, даже если он не содержит ни одного абстрактного метода. Такое объявление означает, что реализация класса все еще не закончена и класс будет служить родителем для одного или нескольких подклассов.

Пример использования абстрактного класса (1)

Пусть необходимо обрабатывать данные о плоскостных геометрических фигурах, в том числе – получать их площадь и периметр.

Создадим абстрактный класс Figure: public abstract class Figure {

public abstract double getSpace( ); public abstract double getPerimeter( );

}

Теперь реализуем несколько наследников этого класса: Circle, Rectangle, …

Пример использования абстрактного класса (2)

class Circle extends Figure { protected double radius; public Circle( double r ){

radius = r;

}

public double getRadius( ) { return radius;

}

public double getSpace( ) {

return radius * radius * Math.PI ;

}

public double getPerimeter( ) { return 2 * radius * Math.PI ;

}

}

Пример использования абстрактного класса (3)

class Rectangle extends Figure { protected double width; protected double height;

public Rectangle( double w, double h ){ width = w; height = h;

}

public double getWidth( ) { return width;

}

public double getHeight( ) { return Height;

}

public double getSpace( ) { return width * height ;

}

public double getPerimeter( ) { return 2 * ( width + height ) ;

}

}

Интерфейсы

Множественное наследование от классов приводит к очень неприятным проблемам, поэтому в Java не реализовано.

Допускается множественное наследование от интерфейсов.

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

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

В силу того, что назначением интерфейсов в основном является определение поведения объектов, обычно их называют словами, заканчивающимися на «able»: Comparable, Readable, Cloneable, …

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

[ package packageName; ]

[ import packageOrClassNameToImport; … ]

[ accessSpecifier ] interface InterfaceName [ typeParameters ]

[ extendsList ] {

// интерфейс

[ [ accessSpecifier ] dataType variableName = initialValue

[ , …]; // поле

...

 

]

 

[ [ accessSpecifier ] [ typeParameters ] retValueDataType

 

methodName ( [ argumentsList ] ) [ throwsList ];

//метод

 

]

 

}

 

Заголовок интерфейса

[ accessSpecifier ] interface InterfaceName[ typeParameters ] [ extendsList ] {

accessSpecifier – ключевое слово public. Если оно отсутствует, то доступ к реализации интерфейса имеют

только классы данного пакета. Кроме public можно указывать abstract, но это не обязательно и даже нежелательно. Любой

интерфейс всегда рассматривается компилятором как abstract.

typeParameters – указание (в виде списка типов)

компилятору на то, что классы, реализующие этот интерфейс, могут быть generic’ами. Синтаксически

возможно, но фактически излишне.

extendsList – список имен родительских интерфейсов, следующих через запятую после ключевого слова extends.

Поле интерфейса

[ accessSpecifier ] dataType variableName = initialValue [ , …];

accessSpecifier – обязательно public static final, причем этот набор ключевых слов писать не обязательно и более того – нежелательно.

dataType – любой примитивный тип данных. Ссылочные типы (в том числе массивы) не могут быть указаны.

= initialValue – обязательная часть объявления поля интерфейса, поскольку все такие поля обязаны быть константами, а следовательно их начальные значения необходимы. При отсутствии – ошибка компиляции.

Метод интерфейса

[ accessSpecifier ] [ typeParameters ] retValueDataType methodName ( [ argumentsList ] ) [ throwsList ] ;

accessSpecifier – всегда public abstract, указывать эти ключевые слова не обязательно, а точнее – нежелательно.

typeParameters – список имен типов в угловых скобках может присутствовать, информируя программиста о возможной реализации по технологии generics.

retValueDataType – тип возвращаемого значения (как в определении класса).

argumentsList – список типов и имен аргументов (как в определении класса).

throwsList – необязательный список исключений, выбрасываемых методом.

Соседние файлы в папке Презентации по Java