Вот пример того, как анонимный внутренний класс, локальный внутренний класс и обычный внутренний класс могут присутствовать в программе. В примере рассматривается метод myMethod
и класс InnerClass
, присутствующий в классе MyClass
. Ради обсуждения все эти классы будут реализовывать интерфейс Runnable
:
public class MyClass
{
public void myMethod()
{
// Anonymous inner class
Runnable r = new Runnable() {
public void run() {}
};
// Local inner class
class LocalClass implements Runnable
{
public void run() {}
}
}
// ... //
// Inner class
class InnerClass implements Runnable
{
public void run() {}
}
}
Анонимный внутренний класс может быть использован для простого создания класса, который реализует Runnable
без необходимости выписывать класс и называть его, и как krosenvold , упомянутый в его пост, он используется как «закрытие бедняка» в Java.
Например, очень очень простой способ запустить Thread
с использованием анонимного внутреннего класса:
new Thread(new Runnable() {
public void run()
{
// do stuff
}
}).start();
Локальный внутренний класс может использоваться для создания класса, который находится в локальной области видимости - к нему нельзя будет получить доступ из других методов за пределами myMethod
.
Если был другой метод и мы попытались создать экземпляр LocalClass
, который находится внутри метода myMethod
, мы не сможем сделать это:
public void anotherMethod()
{
// LocalClass is out of scope, so it won't be found,
// therefore can't instantiate.
new Thread(new LocalClass()).start();
}
внутренний класс является частью класса, в котором находится внутренний класс. Так, например, внутренний класс InnerClass
может быть доступен из других классов с помощью MyClass.InnerClass
. Конечно, это также означает, что другой метод в MyClass
может также создавать экземпляр внутреннего класса.
public void anotherMethod()
{
// InnerClass is part of this MyClass. Perfectly instantiable.
new Thread(new InnerClass()).start();
}
Еще одна вещь, связанная с анонимным внутренним классом и локальным внутренним классом, заключается в том, что он сможет получить доступ к final
переменным, которые объявлены в myMethod
:
public void myMethod()
{
// Variable to access from anonymous and local inner classes.
final int myNumber = 42;
// Anonymous inner class
Runnable r = new Runnable() {
public void run()
{
System.out.println(myNumber); // Works
}
};
// Local inner class
class LocalClass implements Runnable
{
public void run()
{
System.out.println(myNumber); // Works
}
}
// ... //
Итак, каковы преимущества? Использование анонимных внутренних классов и локальных внутренних классов вместо отдельного полноценного внутреннего класса или класса позволит первым иметь доступ к final
переменным в методе, в котором они объявлены, и в то же время классы локально для самого метода, поэтому к нему нельзя получить доступ извне классов и других методов в том же классе.