- •Содержание
- •Введение
- •1. Основные понятия языка Java иUml
- •Простое приложение
- •Простой апплет
- •Классы и объекты
- •Базовые типы данных
- •Операторы
- •If (obj instanceof java.Awt.Font) {/*операторы*/}
- •Операторы управления
- •UmLкак язык описания объектно-ориентированных программ
- •2. Библиотека стандартаJava_se Наследование
- •Использование super и this
- •Абстрактные классы и интерфейсы
- •Переопределение методов
- •Перегрузка методов
- •Полимофизм и расширяемость
- •Статические методы и полиморфизм
- •Внутренние (inner) классы
- •Вложенные классы (nested)
- •Анонимные классы
- •Использование библиотек классов Файлы. Потоки ввода/вывода
- •Обработка исключительных ситуаций
- •Коллекции
- •Графические интерфейсы пользователя
- •События и их обработка
- •Элементы управления
- •2. Библиотека стандартаJava_ee
- •ТехнологииJsp
Внутренние (inner) классы
Нестатические вложенные классы принято называть внутренними (inner) классами. Доступ к элементам внутреннего класса возможен из внешнего класса только через объект внутреннего класса, который должен быть создан в коде внешнего класса. Объект внутреннего класса всегда ассоциируется (скрыто хранит ссылку) с создавшим его объектом внешнего класса – так называемым внешним (enclosing) объектом. Внешний и внутренний классы могут выглядеть, например, так:
class Owner{
//поля и методы
[доступ] class Inner [extends Cl][implements Interf]{
// поля и методы
}
}
Методы внутреннего класса имеют прямой доступ ко всем полям и методам внешнего класса, в то же время внешний класс может получить доступ к допустимому содержимому внутреннего класса только после создания объекта внутреннего класса. Внутренние классы не могут содержать статические атрибуты и методы, кроме констант (final static). Внутренние классы имеют право наследовать другие классы, реализовывать интерфейсы и выступать в роли объектов наследования. Допустимо наследование следующего вида:
class ExtendOwner extends Owner {
class ExtendInner extends Inner {}
Inner ref = new ExtendInner();
}
Если внутренний класс наследуется обычным образом, то он теряет доступ к полям своего внешнего класса, в котором он был объявлен.
class New extends Owner.Inner {
New(Owner ob){
ob.super();
}
}
В данном случае конструктор класса New должен быть объявлен с параметром типа Owner, что позволит получить доступ к ссылке на внутренний класс, наследуемый классом New.
При объявлении внутреннего класса могут использоваться модификаторы final, abstract, private, protected, public.
/* пример # 1 : простой внутренний класс : SimpleDemo.java*/
classOwner {
class Content {
private int count = 220;
public int getCount() {
return count;
}
}
void show() {
Content c = new Content();
System.out.println(c.getCount());
}
}
public class SimpleDemo {
public static void main(String[] args) {
Owner ob = new Owner();
ob.show();
//Content content = new Content();//недоступен
}
}
Вложенные классы (nested)
Если не существует необходимости в связи объекта внутреннего класса с объектом внешнего класса, то есть смысл сделать такой класс статическим.
При объявлении такого внутреннего класса присутствует служебное слово static, и такой класс называется вложенным (nested). Если класс вложен в интерфейс, то он становится статическим по умолчанию. Такой класс способен наследовать другие классы, реализовывать интерфейсы и являться объектом наследования для любого класса, обладающего необходимыми правами доступа. Подкласс вложенного класса не способен унаследовать возможность доступа к членам внешнего класса, которыми наделен его суперкласс. В то же время статический вложенный класс для доступа к нестатическим членам и методам внешнего класса должен создавать его объект, а напрямую доступны только статические поля и методы внешнего класса. Для создания объекта вложенного класса объект внешнего класса создавать нет необходимости.
/* пример # 5 : вложенный класс :
NestedClassDemo.java*/
classOwner3 {
static int y = 1, z = 2;
publicvoidmethod1() {
//вызов нестатического метода статического класса
new Nested().method2();
}
//abstract, final, private, public - допустимы
protected static class Nested {
public static void showN() {
System.out.println("z=" + z
+ " y=" + Owner3.y);
}
public void method2() {
System.out.println("non-static"); }
}
}
public class NestedClassDemo {
public static void main(String[] args) {
Owner3.Nested.showN(); //статический
Owner3 ob = new Owner3();
ob.method1();
}
}
В результате будет выведено:
z=2 y=1
non-static
В результате создан объект внешнего класса, а метод внешнего класса вызвал нестатический метод вложенного класса. Статический метод вложенного класса вызывается при указании полного относительного пути к нему.