coo*_*ird 26
这是一个如何在程序中出现匿名内部类,本地内部类和常规内部类的示例.该示例正在查看类中存在的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() {}
}
}
Run Code Online (Sandbox Code Playgroud)
该匿名内部类可以用来简单地做一个实现的类Runnable
,而不必实际写出来的类,并将其命名,并作为krosenvold在他的文章中提到,它是作为一个在Java中"穷人的关闭".
例如,开始Thread
使用匿名内部类的一种非常简单的方法是:
new Thread(new Runnable() {
public void run()
{
// do stuff
}
}).start();
Run Code Online (Sandbox Code Playgroud)
一个局部内部类可以被用来制造一类是本地范围内-这将无法从以外的其他方法来访问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();
}
Run Code Online (Sandbox Code Playgroud)
一个内部类是内部类位于类的一部分.因此,举例来说,内类InnerClass
可以从其它类通过访问MyClass.InnerClass
.当然,它也意味着另一种方法MyClass
也可以实例化一个内部类.
public void anotherMethod()
{
// InnerClass is part of this MyClass. Perfectly instantiable.
new Thread(new InnerClass()).start();
}
Run Code Online (Sandbox Code Playgroud)
关于匿名内部类和本地内部类的另一个问题是,它将能够访问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
}
}
// ... //
Run Code Online (Sandbox Code Playgroud)
那么,有什么优势呢?使用匿名内部类和本地内部类而不是具有单独的完整内部类或类将允许前者final
在声明它们的方法中访问变量,同时,类是本地的方法本身,因此无法从外部类和同一类中的其他方法访问它.
Tom*_*ine 14
您可以使用匿名内部类无法获得的本地类可以执行许多操作.
另一方面,他们使一些可怕的冗长语法更加混乱.
geo*_*wa4 12
它们允许您从父类中取出逻辑并将其客观化.这将从不属于的地方删除功能并将其放入自己的类中.但是,如果这个新对象仅在短时间内需要,仅在单个代码块的持续时间内怎么办?嗯,这就是本地班级适合的地方.