Внутренние (inner) классы

Нестатические вложенные классы принято называть внутренними (inner) классами. Доступ к элементам внутреннего класса возможен из внешнего класса только через объект внутреннего класса, который должен быть создан в коде внешнего класса. Объект внутреннего класса всегда ассоциируется (скрыто хранит ссылку) с создавшим его объектом внешнего класса – так называемым внешним (enclosing) объектом. Внешний и внутренний классы могут выглядеть, например, так:

classOwner{

//поля и методы

[доступ]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 */

class Owner {

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 */

class Owner3 {

static int y = 1, z = 2;

public void method1() {

//вызов нестатического метода статического класса

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








Дата добавления: 2015-04-05; просмотров: 1237;


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

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.006 сек.