bra*_*boy 100 java class local-class
例:
public class TestClass {
public static void main(String[] args) {
TestClass t = new TestClass();
}
private static void testMethod() {
abstract class TestMethod {
int a;
int b;
int c;
abstract void implementMe();
}
class DummyClass extends TestMethod {
void implementMe() {}
}
DummyClass dummy = new DummyClass();
}
}
Run Code Online (Sandbox Code Playgroud)
我发现上面的代码在Java中完全合法.我有以下问题.
DummyClass
Jac*_*son 68
这称为本地类.
2是简单的:是的,将生成一个类文件.
1和3是同一个问题.您将使用本地类,您永远不需要在一个方法中的任何地方实例化或了解实现细节.
一个典型的用途是创建一些接口的一次性实现.例如,你经常会看到这样的东西:
//within some method
taskExecutor.execute( new Runnable() {
public void run() {
classWithMethodToFire.doSomething( parameter );
}
});
Run Code Online (Sandbox Code Playgroud)
如果您需要创建一堆这些并使用它们执行某些操作,则可以将其更改为
//within some method
class myFirstRunnableClass implements Runnable {
public void run() {
classWithMethodToFire.doSomething( parameter );
}
}
class mySecondRunnableClass implements Runnable {
public void run() {
classWithMethodToFire.doSomethingElse( parameter );
}
}
taskExecutor.execute(new myFirstRunnableClass());
taskExecutor.execute(new mySecondRunnableClass());
Run Code Online (Sandbox Code Playgroud)
关于接口:我不确定是否存在使本地定义的接口成为编译器问题的技术问题,但即使没有,也不会添加任何值.如果在方法外部使用了实现本地接口的本地类,则该接口将毫无意义.如果本地类只在该方法中使用,那么接口和类都将在该方法中实现,因此接口定义将是多余的.
从方法外部看不到类(即实例化,其方法在没有反射的情况下访问).此外,它可以访问testMethod()中定义的局部变量,但在类定义之前.
我实际上想:"不会写这样的文件." 直到我试过它:哦,是的,这样的文件被创建了!它将被称为A $ 1B.class,其中A是外部类,B是本地类.
特别是对于回调函数(GUI中的事件处理程序,比如单击Button时的onClick()等),通常使用"匿名类" - 首先是因为你最终会得到很多.但有时候匿名类不够好 - 尤其是你不能在它们上定义构造函数.在这些情况下,这些方法本地类可以是一个很好的选择.