Классы, вложенные в методы (локальные внутренние классы)

1. Доступен только внутри метода.

2. Имеет доступ к параметрам и локальным переменным этого метода, но они должны быть final. Т.к. время жизни объекта лок. внутр. класса может превышать время жизни локальных переменных, то он получает их копии и они не должны после этого меняться.

Пример

public class Outer {

int x = 0;

class Inner1 {

public int f() {

return x++; }

}

public void g (final int j) {

final int k = j;

class Inner2 {

public int f (int r) {

return r* k + j; }// j и k должны быть final

}

Inner2 i1 = new Inner2();

int s = i1.f(10);

}

}

class OuterTest {

public void g1 (){

Outer t1 = new Outer ();

Outer.Inner1 i2 = t1.new Inner1 ();

i2.f();

}

}

Анонимные внутренние классы

Если нужно создать один-единственный объект некоторого класса, то этому классу можно не присваивать имени.

Пусть у нас есть класс А. Надо создать класс В порожденный от А.

Обычный способ:

class B extends A {…}

A a = new B();

С анонимным внутренним классом:

A a = new A() {//определ. класса, который наследует класс А опис. поля и

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

}; // обязательно;(точка с запятой)

Пример 1:

A a = new A(10) { //конструктор базового класса с параметрами

int x = 0;

String name

{name = …;}//это блок инициализации-не бывает конструктора!!!

};

Пример 2:

public interface Contens{

int value ();

}

public class Parcel 7 {

public Contens contens () {

return new Contens () {//класс безымянный и локальный-внутри

//метода

//конструктор баз.кл. по умолчанию

private int i=11;

public int value () {return i;}

};// закончили new

public static void main (String [] args) {

Parcel7 p = new Parcel 7();

Contens c = p.contens();

}

}

Мы приступаем к созданию объекта Contens, а потом перед точкой с запятой добавляем определение класса. Означает: создать объект безымянного класса, который унаследован от Contens.

Это эквивалентно:

public class Parcel 7b {

class MyContens implements Contens {

private int i =11;

public int value () {return i;}

}

public Contens contens() { return new MyContens (); }

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

public class Parcel 9 {

public Destination destination (final String dest) {

return new Destination() {

private String label = dest;// инициализация поля

public String readLabel() {return label;}

};

}

public static void main (String [] args) {

Parcel 9 p = new Parcel 9();

Destination d = p.destination (“Тасмания”);

}

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: