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 (“Тасмания”);
}
}